PROGRAMAÇÃO DE COMPUTADORES

Utilizando Linguagem C-ANSI

Versão 2.1 - 2007

SUMÁRIO
Sumário................................................................................................................................................2 Prefácio................................................................................................................................................6 1. Introdução ...................................................................................................................................7
1.1 Dados, Informações e Conhecimento.................................................................................................7 1.2 Lógica de Programação ......................................................................................................................7 1.3 Algoritmos e Estrutura de Dados.......................................................................................................8 1.4 Representação da Lógica ....................................................................................................................9 1.4.1 1.4.2 1.4.3 Diagrama de Fluxo........................................................................................................................10 Diagrama de Chappin ou Nassi-Schneiderman (NS).................................................................11 Português Estruturado .................................................................................................................12

1.5 Linguagem de Programação.............................................................................................................13 1.6 Compiladores e Interpretadores ......................................................................................................14 1.7 Paradigma de Programação: Programação Estruturada..............................................................14 1.8 Tipos de Dados...................................................................................................................................15 1.8.1 Tipo Inteiro....................................................................................................................................15

1.8.1.1 Sistema de Numeração Binária....................................................................................................16 1.8.1.2 Decimal Codificado em Binário ...................................................................................................17 1.8.2 1.8.3 1.8.4 1.8.5 Tipo Real........................................................................................................................................17 Tipo Caractere ..............................................................................................................................17 Tipo Lógico ....................................................................................................................................18 Observações Finais........................................................................................................................18

1.9 Exercícios ...........................................................................................................................................18

2.

A Linguagem C..........................................................................................................................20
2.1 Introdução..........................................................................................................................................20 2.2 Sintaxe da Linguagem C...................................................................................................................20 2.3 Identificadores ...................................................................................................................................21 2.4 Tipos de Dados...................................................................................................................................22 2.5 Variáveis.............................................................................................................................................22
2

2.5.1

Classe de Variáveis .......................................................................................................................22

2.6 Operadores.........................................................................................................................................23 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.6.7 Atribuição ......................................................................................................................................23 Aritméticos.....................................................................................................................................23 Incremento e Decremento ............................................................................................................23 Relacionais e Lógicos ....................................................................................................................24 Bit a Bit ..........................................................................................................................................24 Outros Operadores .......................................................................................................................25 Precedência....................................................................................................................................25

3.

Fluxo de Controle......................................................................................................................26
3.1 Comando de Seleção: if...else/switch................................................................................................26 3.2 Comando de Iteração: for/while/do...while .....................................................................................26 3.3 Comando de Desvio ...........................................................................................................................27 3.4 Outros Comandos..............................................................................................................................28

4.

Entrada e Saída .........................................................................................................................29
4.1 Exercícios ...........................................................................................................................................29

5.

Vetores e Matrizes .....................................................................................................................34
5.1 Exercícios ...........................................................................................................................................34

6.

Manipulação de “Strings” ........................................................................................................38
6.1 Exercícios ...........................................................................................................................................38

7.

Estruturas, Enumerações e Uniões ..........................................................................................40
7.1 Estruturas ..........................................................................................................................................40 7.2 Enumerações......................................................................................................................................41 7.3 Uniões .................................................................................................................................................41 7.4 Exercícios ...........................................................................................................................................42

8.

Ponteiros ....................................................................................................................................44
8.1 Exercícios ...........................................................................................................................................45

9.

Ponteiros, Vetores e Matrizes....................................................................................................46
9.1 Vetores e Matrizes de Ponteiros.......................................................................................................46
3

9.2 Exercícios ...........................................................................................................................................47

10. Funções......................................................................................................................................48
10.1 Ponteiros para Funções.....................................................................................................................48 10.2 Recursividade ....................................................................................................................................49 10.3 Função main.......................................................................................................................................50 10.4 Funções de String ..............................................................................................................................50 10.5 Funções Matemáticas ........................................................................................................................52 10.6 Funções de Hora e Data ....................................................................................................................55 10.7 Outras Funções..................................................................................................................................56 10.8 Exercícios ...........................................................................................................................................56

11. Alocação Dinâmica ...................................................................................................................59
11.1 Exercícios ...........................................................................................................................................60

12. Manipulação de Arquivos .........................................................................................................62
12.1 “Streams” e Arquivos .......................................................................................................................62 12.2 Tipos de Acesso..................................................................................................................................63 12.3 Funções Manipulação de Arquivos..................................................................................................63 12.4 Exercícios ...........................................................................................................................................66

13. Ordenação..................................................................................................................................68
13.1 Ordenação por Troca........................................................................................................................68 13.2 Ordenação por Seleção .....................................................................................................................69 13.3 Ordenação por Inserção ...................................................................................................................69 13.4 “Shell Sort” ........................................................................................................................................70 13.5 “Quicksort”........................................................................................................................................70

14. Estruturas de Dados ..................................................................................................................72
14.1 Pilhas ..................................................................................................................................................72 14.2 Filas.....................................................................................................................................................73 14.2.1 Filas Circulares .............................................................................................................................73 14.3 Listas Ligadas ....................................................................................................................................74 14.3.1 Listas Singularmente Ligadas......................................................................................................74
4

......83 16...... Bibliografia............85 5 ...................................3 Conversão entre Bases ..............................................................................2 Sistema Numérico.................................................................14....................................................................................................................................................................................................77 14................3..................84 16...............................................1 Tabela ASCII ......................................................................4 Árvores Binárias................................................................................. APÊNDICE .....83 16..................................................2 Listas Duplamente Ligadas ........................5 Exercícios.............................................................................81 15....................................................................................................................................................................................82 16.........79 14............................

Prof. Me.br Atualizado em: 01/02/2007 6 . Quaisquer dúvidas. de forma resumida. Neste texto. Francisco Yastami Nakamoto emaito: yastami@unifieo. encontra-se.PREFÁCIO Esta apostila é destinada aos alunos das disciplinas de Programação de Computadores I e II do curso de Ciência da Computação. críticas e sugestões serão bem vindas. os conceitos básicos da linguagem de programação C. estruturas de dados e técnicas de programação baseado no livro texto e nas referências bibliográficas complementares.

possui uma carga semântica que representa algo para alguém.1 Dados. Todas as idéias e pensamentos entram em nossa consciência através da vivência através dos sentidos tornando-se conhecimento. O conhecimento é individual e único que criamos a partir da interação com outros seres humanos e o meio em que vivemos. Desta forma. • Informações são abstrações que não podem ser formalizadas através de uma teoria matemática ou lógica. compostas por uma seqüência de símbolos quantificados ou quantificáveis e puramente sintática. ou seja. O homem possui a capacidade de analisar as informações fornecidas pelos seus sentidos. a idéia não existe antes da experiência vivida. ou seja.2 Lógica de Programação Todos os dias tomamos decisões das mais variadas possíveis. Além disso. ou seja. De acordo com Aristóteles (384-322 a. programar é a arte de elaborar soluções computacionais eficazes. os dados podem ser descritos através de representações formais. e implementá-lo no mundo real modificando o meio em que vive e. enriquecendo o seu conhecimento através dos resultados obtidos. baseado na teoria das idéias de Platão (427347 a. representadas por dados. Dado um problema computacional.). pode-se definir que: • Dados são entidades matemáticas. eficientes e elegantes. dominar a sintaxe (dados) da linguagem de programação para elaborar a melhor semântica (informação) que represente no mundo computacional o conhecimento aplicado para a solução do problema. possui a capacidade de estudar e aplicar as possíveis soluções a este modelo.). INTRODUÇÃO 1. o conhecimento não é transmissível e sim um conjunto de informações. de acordo com o conhecimento anteriormente adquirido. Informações e Conhecimento.1. É a vivência do objeto do conhecimento e não uma interpretação pessoal. • Conhecimento é uma abstração pessoal de algum fato experimentado ou vivenciado por alguém. consequentemente.C. 1. consequentemente.C. ou seja. que descrevem o conhecimento. Muitas destas decisões são resultado de um conjunto de ações que visam um resultado almejado. não existe nada na consciência que não tenha sido sentido pelos nossos cinco sentidos. o programador deve possuir o conhecimento do assunto em questão. A lógica faz parte de 7 . abstrair os problemas do mundo real e criar um modelo desse problema.

imprevisibilidade ou valor-surpresa da mensagem. b) Definir os objetivos a serem alcançados. Uma estrutura de dados permite apresentar uma forma mais compreensível de se observar as informações. sendo quantificada em bits de informação.a informação é a medida da redução da incerteza sobre um determinado estado de coisas por intermédio de uma mensagem. ou seja. f) Rever os passos anteriores caso o objetivo não seja atingido.. cujo valor compreende um entre duas possibilidades mutuamente exclusivas.. disponibiliza a informação processada.. oferecendo. Um programa processa dados. Segundo a teoria da informação: “.. A lógica de programação em processamento de dados é a forma pela qual se representa em uma linguagem. entra-se com os dados no programa que os processa e. instruções que são executados por um computador. o que é coerente. isso é. o que é óbvio e certo. As estruturas de dados são organizações conceituais de informações. c) Verificar todos os dados disponíveis para resolvê-lo. d) Estabelecer uma seqüência de ações para resolução do problema. Um bit é uma contração das palavras binary digit ou dígitos binários. dado um problema de processamento de dados os passos realizados para a análise podem deve-se realizar uma análise seguindo os seguintes passos: a) Entender o problema proposto. a estrutura de dados recebe as informações e o algoritmo processa-os. um nível de abstração na solução de problemas. isto é.” A unidade básica que representa a informação é o bit.nossas decisões. se necessário. pode comprometer a eficiência do algoritmo que manipula essa informação. e) Dividir o problema em partes menores. Um programa é constituído de algoritmos e estrutura de dados. 1. Um algoritmo é descrito na literatura como: 8 . porém.3 Algoritmos e Estrutura de Dados Um computador é uma máquina que manipula dados. assim. organizam as informações que representam uma situação real. ou símbolos que expressam essa linguagem. de acordo com a forma da organização. A lógica de programação é diretamente influenciada pela forma como raciocinamos. Os dígitos binários 0 e 1 são usados para representar os dois possíveis estados de determinado bit. ou seja. Neste sentido. Entende-se por lógico o que não permite questionamento. a informação não deve ser confundida com o significado e apresenta-se como função direta do grau de originalidade.

” considerando-se que: “ . um algoritmo é um conjunto finito instruções seqüenciais.. ou seja.. é um conjunto seqüencial de ações executáveis ao longo de um tempo finito para obtenção de uma solução para um determinado tipo de problema. Aguardar o processo de coar. observando-se a seqüência proposta. Seguindo os passos apresentados. Encher água na chaleira. As seguintes perguntas devem ser respondidas: a) Qual é o problema? b) Qual é o objetivo? c) Como atingir o objetivo? O problema é servir o café aos convidados. Então. Por exemplo. executados num determinado período de tempo. Entretanto. então o objetivo principal é fazer o café. é possível prever passos essenciais que podem comprometer a resolução do problema.“ .. o casal está preparando café para servir aos convidados.. um encontro de amigos na residência do casal Leila e Francisco. Preparar porta-filtro com filtro sobre o bule. Se a água ferver.4 Representação da Lógica O algoritmo é a representação da resolução lógica de um problema de processamento de dados. 9 .. Colocar a chaleira para ferver. 1. defini-se que os algoritmos são instruções que descrevem um padrão de comportamento expresso em termos de um conjunto finito de ações. Sendo anfitrião do evento. Considerando-se as definições apresentadas anteriormente. ” Desta foram.. Colocar café em pó no filtro. Colocar a chaleira para ferver. mas para isso é preciso do café. 2.é uma seqüência finita de instruções. Por exemplo: 1. acrescentar aos poucos a água no filtro.. certamente o objetivo será alcançado. que atinge um objetivo pré-estabelecido. cada uma das quais possuem um significado claro e pode ser executada com uma quantidade finita de esforço ao longo de um tempo também finito. determina-se os passos seqüenciais para fazer o café: Encher água na chaleira.. Adoçar o café.uma série de passos organizados que descrevem um processo que se deseja seguir para dar solução a um problema específico.

3. determina-se o que é preciso para executar a seqüência. . diagrama de Chapin ou português estruturado. Definido a seqüência de passos.Colocar café em pó no filtro. tem-se: Pó de café. Desta forma. Um algoritmo é escrito utilizando uma linguagem de programação ou por meio de diagrama de fluxo. 4. fogão.4. é realizado um detalhamento dos passos lógicos de um determinado processamento de forma gráfica. ou seja.Do contrário: Desligue o fogo. . açúcar. chaleira. 10 . Aguardar o processo de coar.1 Diagrama de Fluxo Um diagrama de fluxo é uma representação gráfica de um algoritmo. porta-filtro.2 apresenta um exemplo de um programa.Principais formas geométricas usadas em diagrama de fluxo. Se a água ferver. com os dados de entrada e a execução da seqüência. Indica início ou final do diagrama de fluxo Operação de atribuição e chamada ou retorno de subalgoritmo Conectores de páginas Operação de saída de dados em vídeo Operação de entrada de dados Arco de fluxo de dados Conector de fluxo Decisão Figura 1.Preparar porta-filtro com filtro sobre o bule. Os símbolos para a representação gráfica são padronizados pela ANSI (figura 1. Se não houver café em pó: Encerrar o preparo do café. Desta descrição é o algoritmo “fazer café”. Adoçar o café. Enquanto a chaleira está no fogo: . acrescentar aos poucos a água no filtro. o resultado é o café pronto. A figura 1. água..1 .1). 6. 5. Providenciar o café em pó. Do contrário: Voltar para o item 1. 1. filtro e bule Finalmente.Se houver café em pó: .

A figura 1.3 .4. torna-se mais simples mostrá-lo com o diagrama de Chapin. Seqüência Seleção S <Comando> <?> N 1 2 <?> 3 4 Interação <Condição> <Condição> Figura 1.2 Diagrama de Chappin ou Nassi-Schneiderman (NS) O diagrama de Chapin (Nassi-Schneiderman) é um diagrama em que se retiram-se os arcos. bem como codificá-lo futuramente na conversão de código português estruturado ou pseudocódigos.Exemplo de um diagrama de fluxo.Início Leia N1 e N2 M = (N1 + N2)/2 N M>=6 Imprima “Reprovado” S Imprima “Aprovado” Fim Figura 1. apresentando-se uma visão hierárquica e estruturada da lógica do programa. 11 . A grande vantagem de usar este tipo de diagrama é a representação das estruturas que tem um ponto de entrada e um ponto de saída e são compostas pelas estruturas básicas de controle de seqüência. Enquanto é difícil mostrar a recursividade no diagrama de fluxo. seleção e repartição. 1.Os diagramas de Chapin (Nassi-Schneiderman).3 apresenta os diagramas de Chapin.2 .

5 apresenta um exemplo utilizando pseudo-código.4. De fato. N2 Média = (N1+N2)/2 Média >=7? S Escreva “Aprovado” Fim Figura 1. nos subalgoritmos. Início e Fim são respectivamente as palavras que delimitam o início e o término do conjunto de instruções do corpo do algoritmo. <declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e. esta representação é suficientemente geral para permitir que a tradução de um algoritmo nela representado para uma linguagem de programação específica seja praticamente direta. A figura 1. <nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distinguílo dos demais. 12 . encontra muita aceitação. Início Leia N1. eventualmente.3 Português Estruturado Esta forma de representação de algoritmos. Onde: Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo. é bastante rica em detalhes e. também conhecida como “portugol” ou pseudo-código. por assemelhar-se bastante à forma em que os programas são escritos.4 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de cálculo da média de um aluno.4 . <subalgoritmos> consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos. A representação de um algoritmo na forma de pseudo-código é a seguinte: Algoritmo <nome_do_algoritmo> <declaração_de_variáveis> <subalgoritmos> Início <corpo_do_algoritmo> Fim. N Escreva “Aprovado” 1.Exemplo de um diagrama Chapin (Nassi-Schneiderman).A figura 1.

os programas em Assembly tem pouca portabilidade. São genericamente chamadas de linguagens Assembly. as instruções são bem primitivas. N2. A desvantagem é que em geral. A principal vantagem é que os programas são executados com maior velocidade de processamento ocupando menos espaço na memória.Algoritmo Média Declare N1. um código gerado para um tipo de processador não serve para outro.exe) podem ser executados fora dos ambientes de programação. 1. Este conjunto de códigos possui regras de estruturação lógica e sintática própria. os códigos Assembly não são estruturados. isto é. Linguagens de baixo nível são linguagens voltadas para a máquina. N2 Média ← (N1+N2)/2 Se Média >=7 Então Escreva “Aprovado” Do contrário Escreva “Reprovado” Fim Figura 1. Estes programas executáveis (*. A linguagem de 13 .Exemplo de um programa em pseudo-código. as linguagens de programação em dois grandes grupos: as linguagens de baixo nível e as de alto nível. Além disso. Interpretadores fazem a interpretação de cada instrução do programa fonte executando-a dentro de um ambiente de programação. Estas instruções são escritas através de um conjunto de códigos (símbolos e palavras). Dizemos que este conjunto de símbolos e regras formam uma linguagem de programação. Neste formato executável. Basic e AutoLISP por exemplo. basicamente soma e subtração e funções de leitura e armazenamento.5 . genericamente. isto é. Linguagens de alto nível são linguagens voltadas para o ser humano. Necessitam de compiladores ou interpretadores para gerar instruções do microprocessador.5 Linguagem de Programação Um programa de computador é um conjunto instruções que representam um algoritmo para a resolução de algum problema. Compiladores fazem a tradução de todas as instruções do programa fonte gerando um programa executável. tornando a programação mais difícil. são escritas usando as instruções do microprocessador do computador. Média Real Início Leia N1. Em geral utilizam sintaxe estruturada tornando seu código mais legível. Podemos dividir. Um programa executável contém uma seqüência de instruções que podem ser executados pelo processador.

Um compilador lê o programa inteiro e converte-o em um código objeto (código binário ou código de máquina). Desta forma. acarretando como conseqüência um árduo trabalho na manutenção do código. a programação torna-se mais fácil por causa do maior ou menor grau de estruturação de suas linguagens. LISP (inteligência artificial) ou CLIPPER (banco de dados). 1. possibilita a criação de sub-rotinas que empregam variáveis locais. As linguagens de alto nível podem se distinguir quanto a sua aplicação em genéricas como C.7 Paradigma de Programação: Programação Estruturada Os recursos computacionais são compostos por hardware e software. Compiladores e Interpretadores Os termos compiladores e interpretadores referem-se à maneira como um programa é Um interpretador lê o código fonte do programa linha por vez e executando a instrução específica contida nesta linha. podem ser executados em varias plataformas com pouquíssimas modificações. a execução do programa depende da presença do interpretador na máquina. Softwares sofisticados significam grandes quantidades de linhas de código. As inovações em hardware permitem desenvolver softwares cada vez mais sofisticados. Os módulos ou sub-rotinas se interligam através de três mecanismos básicos: 14 . A desvantagem é que em geral. isto é. A principal vantagem é que os programas podem ser compiladas ou interpretadas tornando-os portáveis. Pascal e Basic ou específicas como Fortran (cálculo matemático). dessa forma usamos uma linguagem de um nível maior para escrever nossos programas. permitindo-se elevar o nível de abstração para o desenvolvimento de soluções mais eficientes. isto é. 1. surgiu-se no início dos anos 70 o conceito de modularização de código que permitiu desenvolver o paradigma de programação estruturada. GPSS (simulação).máquina é complexa para maioria das pessoas. A linguagem estruturada tem como característica principal a modularização do código e dos dados.6 executado. as rotinas geradas (em linguagem de maquina) são mais genéricas e portanto mais complexas e por isso são mais lentas e ocupam mais memória. Em geral. Dentro deste contexto. que é uma tradução do código fonte do programa em uma forma que o computador possa executar diretamente.

que correspondem à porção das informações a serem processadas pelo computador. Seleção: Especifica a possibilidade de selecionar o fluxo de execução do processamento baseado em ocorrências lógicas. 15 . A função tem como objetivo conceitual realizar essas atividades adequadamente sem criar efeitos inesperados em outras partes do programa. Iteração: Permite a execução repetitiva de segmentos do programa. Realizar facilmente manutenções no código. isto é. Outra forma de estruturar e modularizar o código em linguagem C é pelo uso de blocos de código. os dados numéricos positivos ou negativos. Os tipos de dados podem ser classificados em: Tipos Inteiros. tem-se os valores: 35. 1. 0. Um bloco de código é um grupo de comandos que é tratado como uma unidade. que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados. Facilitar a compreensão de programas através do número restrito sub-rotinas. Tipos Caracteres. são sub-rotinas ou blocos de construção em que são realizadas as atividades pré-estabelecidas.8 Tipos de Dados O trabalho realizado por um computador é basicamente manipular os dados contidos em sua memória. Como exemplo deste tipo de dado. Excluindo-se destes qualquer número fracionário. Estes dados podem ser classificados em: Instruções. 1024 entre outros. Em linguagem C.8. -56. 1.1 Tipo Inteiro São caracterizados como tipos inteiros. Tipos Reais. a modularização do código permite que os programas possam: Compartilhar seções de códigos.Seqüência: Implementa os passos de processamento necessários para descrever qualquer programa. Tipos Lógicos. Existe duas formas para representar números inteiros em binário: Sistema de numeração binária e Decimal codificado em binário. Dados propriamente ditos. o principal componente estrutural é a função. Portanto.

se o valor for 0. Notação de complemento de dois: Um número negativo é representado somando-se 1 à representação de complemento de um de um número negativo (figura 1.Exemplo notação de complemento de dois.8 .1 Sistema de Numeração Binária Neste sistema.7 . Se o valor for 1 em determinada posição. 21 + 22 + 25 = 38 A representação de inteiros negativos pode ser realizada baseado em dois métodos: Notação de complemento de um: Um número negativo é representado mudando-se cada bit em seu valor absoluto para a definição do bit oposto (figura 1. A figura 1. Portanto. mas é reservado para o sinal do número.8). 16 . uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1)+1 a 2(n-1)-1. Isto significa que o bit da extrema esquerda de um número não é mais usado para representar uma potência de 2.6 apresenta um exemplo.Exemplo de sistema de numeração binária. a potência de 2 representada por essa posição de bit será incluída na soma porém. Portanto. cada posição de bit representa uma potência de 2. (00100110)2=(38)10 (-38)10=(11011001)2 Figura 1.8. (-38)10=(11011001)2 11011001+1=11011010=(-38)10 Figura 1. 00100110 1ª posição 2ª posição 5ª posição Figura 1.Exemplo de notação de complemento de um.1. uma seqüência de bits de tamanho n pode representar um número inteiro não negativo entre 0 a 2(n-1). uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1) a 2(n-1)-1. essa potência de 2 não será incluída na soma. Portanto.7). O inteiro é representado por uma soma de potências de 2.1.6 .

Mantissa*baseexpoente 387. 52 Apto 1”.8. 26 1. tem-se os valores: ”Programação”. 0. ”04387.9 . Um número real representado por uma seqüência de 32 bits consiste de uma mantissa de 24 bits seguida por um expoente de 8 bits de base 10 (figura 1.Exemplo decimal codificado em binário. tem-se os valores: 35.030”.10 . os dados numéricos positivos e negativos e números fracionários. 1.8. chamada expoente. uma seqüência de bits pode ser usada para representar inteiros da seguinte forma: cada quatro bits representa um dígito decimal entre 0 e 9. Como exemplo deste tipo de dado. -56. 2 00100110 0010 0110 6 Figura 1. string.2 Tipo Real São caracterizados como tipos reais. números e símbolos especiais.10).3 Tipo Caractere São caracterizados como tipos caracteres. ”Fone 574-9988”. Desta forma. literal ou cadeia. uma seqüência representa o número formado por esses dígitos decimais na notação decimal convencional (figura 1. 17 .9).1. ”7” entre outros.2 Decimal Codificado em Binário Neste sistema. Como exemplo deste tipo de dado. Um número real é representado por uma mantissa vezes uma base elevada a uma potência de inteiro.1. as seqüências contendo letras.2. Este tipo de dado também é conhecido como alfanumérico. -45. ” ”.8. ”Rua Alfa.987 entre outros.53=38753*10-2 1111 1111 0110 1000 1001 1111 1111 1110 Figura 1.Representação de ponto flutuante. Um caractere é representado por 8 bits. Uma seqüência de caracteres deve ser indicada entre aspas (” ”). 1. O método usado pelos computadores para representar números reais é a notação de ponto flutuante.

8. Calcular o número de dias existentes entre dois anos digitados pelo usuário. 18 . qualquer significado pode ser atribuído a determinado padrão de bits. pelo contrário. sabendo-se que o preço por m3 é de R$ 3. Construa um algoritmo para fazer o cálculo das suas despesas do mês. elaborar um algoritmo que calcule a estimativa da conta do próximo mês.11 apresenta um exemplo. devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática. 1011001 10000001 1010011 1010100 10000001 1001101 1001001 59 41 53 54 41 4D 49 89 65 83 84 65 77 73 Y A S T A M I Figura 1.50. portanto.4 Tipo Lógico São caracterizados como tipos lógicos os dados com valor verdadeiro e falso.5 Observações Finais A classificação apresentada acima não se aplica a nenhuma linguagem de programação específica. Construa um algoritmo para comer uma barra de chocolate.1. o número 26 hexadecimal ou o caractere ‘&’ no código ASCII. Dados o consumo em m3 de água dos três últimos meses. A figura 1. sendo que este tipo de dado poderá representar apenas um dos dois valores. É a interpretação de um padrão de bits que dá o seu significado. diagrama de blocos e português estruturado para os seguintes exercícios: 1. desde que seja feito com coerência. 4.9 Exercícios Construir algoritmos em português estruturado. Construa um algoritmo para fazer uma ligação telefônica. a seqüência de bits 00100110 pode ser interpretada como o número 38 decimal. Construa um algoritmo detalhado para trocar uma lâmpada. Por exemplo. 5. 1.Representação binária.8. Ele é chamado por alguns de tipo booleano. Outro aspecto a ser considerado é com relação à interpretação da informação. 3. 1. hexadecimal e decimal de caracteres. Um método de interpretar um padrão de bits é freqüentemente chamado tipo de dado. ela sintetiza os padrões utilizados na maioria das linguagens. 6. 2.11 .

Elabore um algoritmo que dado dois número fornecidos pelo usuário. 8. Dado o tipo do vinho e a quantidade comprada. multiplicação e divisão. sabe-se que os vinhos tipo tinto custam R$ 8. emitir mensagem informando o usuário. Construa um algoritmo para o funcionamento de uma máquina de lavar roupa. Um automóvel tem um consumo médio de 1 litro de gasolina para cada 16 km rodados. Dados: sexo e idade dos alunos. v = 10 + 5 * t 12. 21. dias. Se o número for ímpar. elabore um algoritmo que calcule o valor que o cliente vai pagar. 19 . Dados: Distância percorrida. Calcule a quantidade de gasolina consumida. 16. Dado: Peso total do bolo. Faça um algoritmo que calcule a velocidade v (m/s). 20. 11. subtração.7. 18. dado uma entrada t (s).00. verifique qual é o maior. 17. 15. Em uma distribuidora. minutos e segundos de um ano digitado pelo usuário em relação ao ano atual. 14. Construa um algoritmo para verificar em uma classe com 50 alunos quantos são do sexo feminino e masculino e. Elabore um algoritmo que apresente a tabuada de multiplicação de um número fornecido pelo usuário. 10. sabendo-se que o preço por quilo de bolo é R$ 16. Construa um algoritmo para somar e contar os números pares e ímpares de 30 números inteiros inseridos pelo usuário. Calcular e mostrar o tempo em anos. Elabore um algoritmo que calcule a soma de dez números pares fornecidos pelo usuário.00. quantos da classe toda são maiores que 18 anos. fazer uma calculadora que pode realizar as seguintes operações: soma. 19. Endereço e Telefone. o menor e a média. Ao final mostre os resultados. calcule a média aritmética. Emitir o resultado da soma. Elabore um algoritmo que calcule a hipotenusa de um triângulo retângulo dados as medidas dos dois catetos. os de tipo branco R$ 8. 9. Elabore um algoritmo que dados três números. Construa um algoritmo para o funcionamento de uma máquina de refrigerante. Dado: Nome. meses.50. Calcular o custo de um bolo de aniversário. Elabore um algoritmo que dados 10 números reais. 22. A velocidade de um ponto material é regida pela equação apresentada a seguir. horas. Construa um programa para ler e mostrar os dados digitados pelo usuário.00 e o rosê R$ 9. 13.

etc. Em 1983 a ANSI (American National Standards Institute) estabeleceu um padrão C ANSI. Compilar o programa.2 Sintaxe da Linguagem C A sintaxe são regras detalhadas para um construção válida em linguagem C. As funções printf() e scanf() por exemplo. A linguagem C é uma linguagem estruturada. Todo programa C inicia sua execução chamando a função main(). suportam o conceito de tipos de dados. genérica. as declarações.2. impressão. definir conteúdo inicial. A linguagem C é classificada como linguagem de alto nível somando-se as funcionalidades de linguagens de baixo nível. O programador também pode definir novas funções em seus programas. alocar memória. O C foi criada no centro de pesquisas da Bell Laboratories em 1972 por Dennis Ritchie tendo como meta características de flexibilidade e portabilidade. São palavras reservadas que são os comandos que compõem a linguagem C. Os tipos definem as propriedades dos dados manipulados em um programa. Estas regras estão relacionadas com os tipos. As funções são as entidades operacionais básicas dos programas em C. as funções e as expressões. que por sua vez são a união de uma ou mais funções executando cada qual o seu trabalho. A LINGUAGEM C 2. Outro aspecto a ser considerado. As funções especificam as ações que um programa executa quando roda. ao mesmo tempo. As declarações expressam as partes do programa. permitem respectivamente escrever na tela e ler os dados a partir do teclado. Há funções básicas que estão definidas na biblioteca C. é que o padrão C ANSI estabelece 32 palavraschaves. Linkeditar o programa. e a chamada de funções de I/O são definidas nas expressões. isto é. sendo obrigatória a sua declaração no 20 . bytes e endereços e. como rotinas para cálculos. A determinação e alteração de valores. podendo dar significado a um identificador. definir funções. As linguagens de alto nível tipicamente possuem várias vezes esse número de palavras reservadas. 2. C permite a manipulação de bits.1 Introdução A linguagem C é uma linguagem de alto nível. A linguagem C é uma linguagem compilada. A geração do programa executável a partir do programa fonte obedece a uma seqüência de operações: Criar o programa.

count. rótulos. protótipos e variáveis globais. (ponto e vírgula) que faz parte do comando.h> #include <stdio. letras maiúsculas e minúsculas são tratadas diferentemente. } void func(void) { printf(”Fim\n”). declaração de constantes. printf(“Variável global x=%d\n”. dependendo do compilador utilizado. int main(void) { int y=10. } Implementação de Funções: Variáveis locais e definição das funções O padrão C ANSI determina 32 palavras-chave ou palavras reservadas que. x). Logo.3 Identificadores Identificadores são os nomes usados para referenciar objetos definidos pelos usuário. O padrão C ANSI determina que identificadores podem ter qualquer tamanho.h> int x=20. Função main(): Variáveis locais e instruções do programa. #include <stdlib. combinadas com a sintaxe formal de C. Cada instrução encerra com .1). considera-se apenas os 31 primeiros caracteres. Comentários no programa são colocados entre /* e */ não sendo considerados na compilação. A forma geral de um programa em C é: Componentes Iniciais: arquivos de cabeçalho. 21 . isto é. Os identificadores não podem ser igual a uma palavra-chave de C ou nome de funções criadas pelo usuário ou que estão nas bibliotecas C. funções. printf(“Variável y=%d\n”. nomes de variáveis.programa principal. O primeiro caractere deve ser uma letra ou um sublinhado e os caracteres subseqüentes devem ser letras. Tabela 2.1 Lista de palavras-chave em C ANSI 1. porém em geral. 2. Count. func(). números ou sublinhados. 1. Em C. COUNT. Por exemplo: int count. Count e COUNT são três identificadores distintos. entre outros. void func(void). auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Muitos compiladores acrescentam outras palavras-chaves para explorar melhor os recursos dos processadores e otimização da utilização da memória. foram a linguagem de programação C (tabela 2. y). return(0).

767 a 32.5 Variáveis Variável é uma posição nomeada de memória utilizada para armazenar um valor que pode ser modificado pelo programa.483.147.147. ponto flutuante. double e void. Exceto o tipo void.647 0 a 4.647 a 2.647 a 2. int.1 Classe de Variáveis As variáveis podem ser declaradas em três lugares básicos: dentro de funções. Por exemplo: 22 .767 a 32.4 Tipos de Dados Em C. todos os demais tipos básicos podem ter vários modificadores precedendo-os. ponto flutuante de precisão dupla e sem valor: char. ou seja.767 a 32.147.767 -2.767 -32. respectivamente. float.483.647 -2. inteiro.767 0 a 65.147. O tamanho e a faixa desses tipos de dados variam de acordo com o tipo de processador e com a implementação do compilador em C.295 Seis dígitos de precisão Dez dígitos de precisão Dez dígitos de precisão 2. na definição dos parâmetros das funções e fora de todas as funções.767 a 32.2. O padrão C ANSI estipula apenas a faixa mínima de cada tipo de dado. Em algumas situações é necessário modificar um tipo básico para atender às necessidades de diversas situações.2). variáveis locais. parâmetros formais e variáveis globais.535 -32.967. Os modificadores podem ser: signed unsigned long short Tabela 2.535 -32.767 0 a 65.483. há cinco tipos básicos de dados: caractere.5. As variáveis devem ser declaradas da seguinte forma: <tipo> <nome_da_variavel>.294. Tipo char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double Tamanho (bits) 8 8 8 16 16 16 16 16 16 32 32 32 32 64 80 Faixa mínima -127 a 127 0 a 255 -127 a 127 -32. int x. Isto é conseguido através do uso de modificadores que alteram o significado de um tipo básico. 2. não o seu tamanho em bytes (tabela 2.483.2 Tipos de dados definidos no padrão C ANSI. O tipo void declara explicitamente uma função que não retorna valor algum ou cria ponteiros genéricos.

A forma geral do operador de atribuição é: nome_da_variavel = expressão. 4. é possível converter os tipos de forma automática. porém deve-se observar que poderá ocorrer uma possível perda de informação. /*g é variável global*/ float soma10(float c). 9. printf(“g=%f”.h> #include <stdio. 2. x = 10. 20.2 Aritméticos + * / % Subtração Adição Multiplicação Divisão Módulo da divisão (resto) Os operadores aritméticos de C são: 2. 15.6. 19. 13. } float soma10(float c) { return(c+10). return(0). 11. 14.6 Operadores 2. /*c é parâmetro formal*/ int main(void) { float x. ou seja.6. } 2. 18. Esta conversão é conhecida como conversão de tipos. 5.g). 16.6. 17. 6. /*x é variável local*/ x=15. 8.1.1 Atribuição O operador de atribuição pode ser utilizado dentro de qualquer expressão válida em C. x = y = z = 0. 2. 7. Em C. 3. g=soma10(x). 12.h> float g.3 Incremento e Decremento -++ Decremento Incremento C inclui dois operadores que geralmente não são encontrados em outras linguagens: 23 . #include <stdlib. é permitido atribuição do mesmo valor para muitas variáveis em uma única expressão: var1 = var2 = var3 = expressão. A atribuição é válida para variáveis de tipos diferentes. 10.

O operador lógico refere-se à maneira como essas relações podem ser conectadas. & | ^ ~ >> << AND OR XOR Complemento de um Deslocamento à esquerda Deslocamento à direita Tabela 2. A tabela 2. verdadeiro é qualquer valor diferente de zero. A tabela 2. testar.6.2. Em C.6 apresenta a tabela verdade dos operadores bit a bit.3).5 Operadores bit a bit. por exemplo: 10>5&&!(10<9)||3<=4 p 0 0 1 1 q 0 1 1 0 p&&q 0 0 1 0 p||q 0 1 1 1 Verdadeiro !p 1 1 0 0 Tabela 2. Operadores relacionais > Maior que >= Maior ou igual < Menor <= Menor ou igual == Igual != Diferente Operadores lógicos && AND || OR ! NOT É permitido combinar diversas operações em uma expressão. Falso é zero. isto é.3 Operadores relacionais e lógicos.4 Relacionais e Lógicos O operador relacional refere-se à relação que os valores podem ter uns com os outros.5 Bit a Bit A linguagem C oferece um completo conjunto de operadores bit a bit.6 Tabela verdade operadores bit a bit. 2.6. atribuir ou deslocar os bits efetivos em um byte (tabela 2. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2.5).4 apresenta a tabela verdade dos operadores lógicos utilizando 1s e 0s. Tabela 2.4 Tabela verdade operadores lógicos. Tabela 2. p 0 0 1 1 q 0 1 1 0 p&q 0 0 1 0 p|q 0 1 1 1 p^q 0 1 0 1 24 . A idéia de verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais.

2.6.6

Outros Operadores
Tabela 2.7 Outros operadores.

?: & * sizeof(f) , . -> () []
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. #include <stdlib.h> #include <stdio.h>

Exp1 ? Exp2 : Exp3 “o endereço de” “o valor do endereço de” Retorna o tamanho em bytes de f Separa seqüência de operações Referência a elementos individuais de estruturas e uniões. Organizar precedência. Indexação de matrizes.

int main(void) { int x, y; printf(“Digite valor de x=”); scanf(&x); printf(“Digite valor de y=”); scanf(&y); print((x>y)? “x>y\n”:((x=y)? “x=y\n”: “x<y\n”) return(0); 13. }

2.6.7

Precedência
Tabela 2.8 Precedência dos operadores em C.

Maior

Menor

() ! * + << < == & ^ | && ?: =

[] -> ~ ++ -/ % >> <= > >= !=

*

&

sizeof

+=

-=

*=

25

3. FLUXO DE CONTROLE 3.1 Comando de Seleção: if...else/switch
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x, y; printf(“Digite valor de x=”); scanf(“%d”,&x); printf(“Digite valor de y=”); scanf(“%d”,&y); if (x>y) printf(“x>y\n”); else { if (x=y) printf(“x=y\n”); else printf(“x<y\n”); } return(0); }

if (<condicao>) <expressão>; else <expressão>;

switch (<expressão>) { case constante1 : <seq. de comandos> break; case constante2 : <seq. de comandos> break; . . . default : <seq. de comandos> }
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; printf(“Digite valor de x=”); scanf(“%d”,&x); switch (x) { case 0: printf(“x=0\n”); break; case 1: printf(“x=1\n”); break; case 2: printf(“x=2\n”); break; case 3: printf(“x=3\n”); break; default: printf(“3<x<0\z”); } /*Fim switch*/ return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char y; printf(“Escolha a, b, c ou d:”); y=getchar(); switch (x) { case ’a’: printf(“Escolhido a\n”); break; case ’b’: printf(“Escolhido b\n”); break; case ’c’: printf(“Escolhido c\n”); break; case ’d’: printf(“Escolhido d\n”); break; default: printf(“Escolha invalida\n”); } /*Fim switch*/ return(0); }

3.2

Comando de Iteração: for/while/do...while

for (<inicialização>, <condição>, <incremento>) <seq. de comando> while (<condição>) do { { <seq. de comando> <seq. de comando> } } while (<condição>);

26

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; for (i=0; i<10; i++) printf(“%d ”,i); return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; while (i<10) { printf(“%d ”,i); } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; do { printf(“%d ”,i); } while (i<10); return(0); }

3.3
• • •

Comando de Desvio
Na linguagem C há quatro comandos que realizam um desvio incondicional:

return: É usado para retorno de uma função. A função será finalizada tão logo encontre o primeiro return; goto: É um comando de desvio que deve ser utilizado com precaução pois pode causar vazamento do fluxo de informação; break: Este comando possui duas formas de uso. A primeira é utilizada para terminar um case em um comando switch. A segunda forma é utilizada para forçar uma terminação imediata de um laço. O comando break provoca uma saída apenas do laço mais interno;

• •

exit: Este comando provoca uma terminação imediata do programa inteiro, forçando um retorno ao sistema operacional; continue: É um comando similar ao break porém em vez de forçar a terminação do laço, continue força que ocorra a próxima iteração do laço, pulando qualquer código intermediário. Para o laço for, continue faz com que o teste condicional e a porção de incremento do laço sejam executados. Para os laços while e do-while, o controle do programa passa para o teste condicional.

return (<expressão>);

goto <rótulo>; ... <rótulo>:

void exit(int codigo_de_retorno);

27

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; x=1; volta1: x++; if (x<50) { printf(”%d\n”,x); goto volta1; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; for (x=0; x<50; x++) { printf(”%d\n”,x); if (x==25) break; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char s[80], *str; int esp; printf("Digite uma string:"); gets(s); str=s; for (espaco=0; *str; str++) { if (*str!=' ') continue; esp++; } printf("%d espacos\n", esp); return (0); }

3.4
por exemplo:

Outros Comandos
Um comando de expressão é uma expressão válida em C seguida por ponto-e-vírgula,

soma(); /* Chamada de função */ a=sqrt(pow(b,2)+pow(c,2)); /* Comando de atribuição */ b+raiz(z); /* Comando válido, que não faz nada */ ; /* Comando vazio */

28

. que permite escrever no dispositivo padrão (tela).1 Comandos de formato para printf() e scanf(). printf(’%c\n’. int x. Código %c %d %i %e %f %o %s %u %x %p 1. calcule e mostre a soma desses números. #include <stdlib. Tabela 4.4. c=’d’.h> #include <stdio. calcule e mostre a média aritmética dessas notas. 29 . Sua sintaxe é similar a printf().). isto é. ENTRADA E SAÍDA As funções printf() e scanf() realizam entrada e saída formatada. .. permite a leitura e a escrita de dados em vários formatos. y). c). 2. float y. x). Cada argumento deve ser separado por vírgula. Ela é o complemento de printf() e nos permite ler dados formatados (tabela 4. y). y). printf(’%. O scanf() também é uma função de I/O implementada em todos compiladores C. printf(’%. As notas deverão estar na faixa entre 0 e 10.).1) da entrada padrão (teclado). . x=c. y=19. printf(’%f\n’.1) que indicam o formato em que os argumentos devem ser impressos.. Faça um programa que receba três notas. O printf() é uma função de I/O.234. } Formato Caractere Inteiros decimais com sinal Inteiros decimais com sinal Notação científica Ponto flutuante decimal Octal sem sinal String de caracteres Inteiros decimais sem sinal Hexadecimal sem sinal Apresenta um ponteiro 4. y).1 Exercícios 1.2f\n’. int scanf(const char *str.3f\n’. A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação (tabela 3.h> int main(void) { char c. return(0). printf(’%. Faça um programa que receba três números inteiros. printf(’%d\n’. 3.1f\n’. int printf(const char *str.. Faça um programa que receba três notas e seus respectivos pesos. calcule e mostre a média ponderada dessas notas.

Pedro comprou um saco de ração com peso em quilos. Faça um programa que receba o peso do saco de ração e a quantidade de ração fornecida para cada gato. 15. Sabe-se que: Área = π * R2.14) 7. Elabore um programa que apresente os lançamentos. Pedro possui dois gatos para os quais fornece a quantidade de ração em gramas. 6. Esse programa não pode permitir a entrada de dados inválidos. 8. ou seja.4. d) O salário a receber eqüivale ao salário bruto menos o imposto. Faça um programa que calcule e mostre a área de um losango. Faça um programa que calcule e mostre a área de um trapézio. Faça um programa que calcule e mostre a tabuada de um número digitado pelo usuário. 10. calcule e mostre: a) O número digitado ao quadrado. Faça um programa que calcule e mostre a área de um círculo. b) O número digitado ao cubo. 9.38% e o saldo inicial da conta está zerado. c) O imposto eqüivale a 3% do salário bruto. 30 . Esse trabalhador emitiu dois cheques e agora deseja saber seu saldo atual. 13. Sabe-se que: Área = (base * altura)/2. (π=3. Sabe-se que cada operação bancária de retirada paga CPMF de 0. Faça um programa para calcular a área de um triângulo. Sabe-se que: Área = (diagonal maior * diagonal menor)/2. o total de impostos descontados e o saldo atual. Calcule e mostre o salário a receber seguindo as regras abaixo: a) A hora trabalhada vale a metade do salário mínimo. Calcule e mostre quanto restará de ração no saco após cinco dias. Faça um programa que receba um número positivo e maior que zero. 12. Faça um programa que calcule e mostre a área de um triângulo. Faça um programa que receba o número de horas trabalhadas e o valor do salário mínimo. Faça um programa que receba o valor de um depósito e o valor da taxa de juros. 5. medidas menores ou iguais a 0. 14. c) a raiz quadrada do número digitado. 11. Um trabalhador recebeu seu salário e o depositou em sua conta corrente bancária. b) O salário bruto equivalente ao número de horas trabalhadas multiplicado pelo valor da hora trabalhada. calcule e mostre o valor do rendimento e o valor total depois do rendimento. Sabe-se que: Área = ((base maior + base menor)*altura)/2. Faça um programa que receba dois números maiores que zero. calcule e mostre um elevado ao outro.

16. 19.0 < media <= 5. calcule e mostre o valor do aumento e o novo salário. calcule e mostre o novo preço sabendo-se que este sofreu um desconto de 10%.0 7. a avaliação semestral e a um exame final.0 < media <= 6.0 <= media < 7. 31 . Faça um programa que receba o preço de um produto. sem se preocupar com a altura do usuário. calcule e mostre a nota que deverá ser tirada no exame para a aprovação. A média das três notas mencionadas anteriormente obedece aos pesos a seguir: NOTA Trabalho de laboratório Avaliação semestral Exame final PESO 2 3 5 22. MÉDIA PONDERADA 10. 21.0 < media CONCEITO A B C D E 23. considerando que a média no exame é 6. calcule e mostre a média ponderada e o conceito que segue a tabela abaixo. Faça um programa que receba três notas de um aluno.0 <= media <= 8. b) O valor (R$) a ser pago por essa residência. c) O valor (R$) a ser pago com desconto de 15%.0 7. 25. Calcule e mostre quantos degraus o usuário deverá subir para atingir seu objetivo.0 6.0< media <= 7. calcule e mostre a médias aritmética e a mensagem que segue a tabela abaixo. MÉDIA ARITMÉTICA 3. Calcule e mostre: a) O valor (R$) de cada quilowatt. 20. A nota final de um estudante é calculada a partir de três notas atribuídas respectivamente a um trabalho de laboratório. Faça um programa que receba o salário-base de um funcionário..0 > media 3. sabendo-se que esse funcionário tem gratificação de 5% sobre o salário-base e paga imposto de 7% sobre o salário-base. Faça um programa que receba dois números e mostre o maior. 17. Sabe-se que um quilowatt de energia custa um quinto do salário mínimo. Faça um programa que receba o salário de um funcionário e o percentual de aumento.0 8.0 <= media MENSAGEM Reprovado Exame Aprovado 24. Para alunos de exame. calcule e mostre o salário a receber. Faça um programa que receba o valor do salário mínimo e a quantidade de quilowatts consumida por uma residência.0 5. Faça um programa que receba três números e mostre-os em ordem crescente. Cada degrau de uma escada tem X de altura. Faça um programa que receba as três notas. 18.0. Faça um programa que receba essa altura e a altura que o usuário deseja alcançar subindo a escada.

Faça um programa que determine a data cronologicamente maior de duas datas fornecidas pelo usuário. 28. em seguida. acrescido de bonificação e de auxílio-escola. um de cada vez.26. o valor do aumento e seu novo salário.00 33. receba a opção do usuário e os dados necessários para executar cada operação.00 Mais que R$ 600. os quatro números em ordem decrescente. Os cargos estão na tabela a seguir: CÓDIGO 1 2 3 4 5 CARGO Escriturário Secretário Caixa Gerente Diretor PERCENTUAL 50% 35% 20% 10% Não tem aumento 32. Mostre.00 AUXÍLIO-ESCOLA R$ 150. Se m for ímpar. Faça um programa que receba o salário de um funcionário. Deve-se verificar se os três primeiros números estão em ordem crescente 27. calcule a soma dos números inteiros de 1 até m (m não deve entrar nos cálculos). Faça um programa que leia um número indeterminado de valores para m. Faça um programa que mostre o menu de opções a seguir. Cada data deve ser fornecida por três valores inteiros. 32 . Se m for par. o segundo o mês e o terceiro o ano.00 R$ 100. 31. calcule e mostre o novo salário desse funcionário. Faça um programa que receba o código correspondente ao cargo de um funcionário e seu salário atual e mostre o cargo. 2 = −b± ∆ 2*a 29.00 BONIFICAÇÃO 5% 12% Sem bonificação SALÁRIO Até R$ 600. Faça um programa que receba um número inteiro e verifique se esse número é par ou ímpar. todos inteiros e positivos.00 e R$ 1200.00 Entre R$ 500. Elabore um programa que calcule as raízes de uma equação a segundo grau. f ( x) = a * x 2 + b * x + c f ( x) = 0 ∆ = b2 − 4 * a * c x1. Faça um programa que receba três números inteiros em ordem crescente e um quarto número também inteiro que não siga esta regra. onde o primeiro representa o dia. Mostre os cálculos realizados. SALÁRIO Até R$ 500. Menu de opções: 1: Somar dois números 2: Raiz quadrada de um número Digite a opção desejada: 30.00 Acima de R$ 1200. verifique quantos divisores possui.

. + 3! 4! 5! 6! 7! 8! 9! n! 38. * 3 * 2 *1 se n = 1 : n! = 1!= 1 se n = 0 : n! = 0!= 1 35. Faça um programa que receba o ângulo de incidência dos raios solares. 33 . Faça um programa que calcule a soma dos primeiros 50 números pares iniciando de 2.. Faça um programa que calcule o fatorial de um número inteiro fornecido pelo usuário. Faça um programa que mostre os primeiros 50 números múltiplos de 3 iniciando de 3. Faça um programa que calcule a soma dos primeiros 50 números ímpares iniciando de 3. Faça um programa que leia o número de termos e um valor positivo para X. Faça um programa que monte os n primeiros termos da seqüência de Fibonacci. 43. a altura de uma pessoa em metros e retorne o comprimento da sombra dessa pessoa conforme a figura abaixo...34. Faça um programa que mostre os primeiros 50 números múltiplos de 2 iniciando de 2. calcule e mostre o valor da série a seguir: S= x1 x 2 x 3 x 4 x 5 x 6 x 7 xn + + + + + + + . utilizando uma estrutura de repetição.. 41. 42.. calcule e mostre a potência xy. + 1! 2! 3! 4! 5! 6! 7! n! 36. Faça um programa que leia dois valores inteiros e positivos: x e y. 39.. Faça um programa que leia o número de termos n e um valor positivo para x. 37. se n > 1 : n! = n * (n − 1) * (n − 2) * . 40. calcule e mostre o valor da série a seguir: S = 1+ x 2 x3 x 4 x5 x 6 x 7 x8 x n−1 + + + + + + + . 0 − 1 − 1 − 2 − 3 − 5 − 8 − 13 − 21 − 34 − 55 − ..

scanf("%d". j<3. 17.5. que são armazenadas em posições contíguas da memória em uma ordem de índice. calcule e mostre uma matriz resultante que será a matriz digitada multiplicada pelo maior elemento da matriz. 16. 15. ou vetores. i. } 5.h> int main(void) { int v[10]. 10. 3. 5.&v[i]). 9. 5. 12. Matrizes unidimensionais. 13. #include <stdlib. 21. O endereço mais baixo ou índice (0) corresponde ao primeiro elemento e o mais alto. } return(0). essencialmente. i++) { printf("\n"). i<3.i . 8. 7. return(0). 6.&v[i][j]). A forma mais simples é a matriz bidimensional ou matriz linha-coluna. 14. } 2. Os vetores são. 7. Considerando-se que cada bloco armazena um único caractere. 9. Faça um programa que carregue uma matriz 2x2. 4. 22.h> #include <stdio. j<3.v[i][j]). a matriz no exemplo pode armazenar nove caracteres seqüenciais. j++) printf("%d ". são matrizes que possuem apenas uma dimensão. i. 17. for (i=0.i). 10. scanf("%d". i++) for (j=0. for (j=0. #include <stdlib. j++) { printf("Digite [%d.j). 4. } for (i=0. 20. j. printf("v[%d]=%d\n".1 apresenta um exemplo de matriz unidimensional.1 Exercícios 1. VETORES E MATRIZES Matriz é uma coleção de variáveis do mesmo tipo referenciada por um nome comum.v[i]).Exemplo notação de complemento de dois.%d]=".i. for (i=0. 18.h> int main(void) { int v[3][3]. 16. 2. Matrizes multidimensionais são matrizes que possuem duas ou mais dimensões.h> #include <stdio. listas de informações do mesmo tipo. 18. 11. 13. i++) { printf("Endereco: %p. i<10. i++) { printf("Digite v[%d]=". 6. A figura 5. 1. 19. } printf("\n"). i<3. Figura 5. 15. ao último elemento. a coluna. O acesso aos elementos é realizado mediante um índice ou pelo endereço. 3. i<10. } for (i=0. 34 . 14. 11. As matrizes podem possuir várias dimensões.1 . 8.v[i]). ". onde o primeiro índice indica a linha e o segundo. 12.

A coluna 4 com a coluna 10. Mostre um relatório com o número do aluno (número da linha) e a prova em que cada aluno obteve menor nota. Faça um programa que carregue uma primeira matriz de ordem 4x5 e uma segunda matriz 5x2. 5. mostre quantos alunos tiveram menor nota na prova 1. calcule e mostre quantos elementos dessa matriz são maiores que 30 e. 3. armazenando-o em uma terceira matriz de ordem 4x2. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre a quantidade de números pares e ímpares. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre o maior e menor número com as respectivas posições (linha. Faça um programa que carregue uma matriz 8x8 com números reais. A seguir. A diagonal principal com a diagonal secundária. Faça um programa que carregue uma matriz 10x20 com números inteiros e some cada uma das linhas. Ao final do relatório. Faça um programa que carregue uma matriz 10x3 com as notas de dez alunos em três provas. calcule e mostre quais os elementos da matriz que se repetem e quantas vezes cada um está repetido. A linha 5 com a coluna 10. 7. Faça um programa que carregue uma matriz 6x4 com números inteiros. 11. No lugar do número 30 da segunda matriz coloque o número zero. multiplique cada elemento da matriz pela soma da linha e mostre a matriz resultante. em seguida. Faça um programa que carregue uma matriz 15x5 com números inteiros. calcule a média de todos os elementos e mostre a quantidade de números que são maiores ou iguais a média e sua respectiva posição. 4. 9.2. • • • • A linha 2 com a linha 8. 10. mostre uma segunda matriz com os elementos diferentes de 30. calcule e mostre seu MINMAX e sua posição (linha e coluna). execute as trocas especificadas a seguir e mostre a matriz resultante. 35 . coluna). Faça um programa que carregue uma matriz 10x10 com números inteiros. 8. armazenando o resultado das somas em um vetor. 6. quantos alunos tiveram menor nota na prova 2 e quantos alunos tiveram menor nota na prova 3. Na teoria dos sistemas define-se o elemento MINMAX de uma matriz como sendo o maior elemento da linha onde se encontra o menor elemento da matriz. Faça um programa que carregue uma matriz 4x7 com números reais. calcule e mostre a matriz resultante do produto matricial das duas matrizes anteriores.

13. quantos números e em qual posição. Elabore um programa que calcule o produto de duas matrizes de ordem 3. Considere o triângulo de vértices A(2. B e C. onde D é a determinante da matriz de ordem 3. A área do triângulo ABC é calculada de acordo com a fórmula abaixo. B(5. calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na matriz. Emitir mensagem de erro se o código for inválido. x y D = a b  m n  z c  = x *b * p + y *c * m + z * a * n − z *b * m − x *c * n − y * a * p  p  19. exiba o mês do ano correspondente de acordo com a tabela. Elabore um 36 . Faça um programa que construa a tabela apresentada a seguir em uma matriz. Código 1 2 3 4 5 6 Mês Janeiro Fevereiro Março Abril Maio Junho Código 7 8 9 10 11 12 Mês Julho Agosto Setembro Outubro Novembro Dezembro 14. Elabore um programa que calcule a determinante de uma matriz de ordem 2. Elabore um programa que calcule a determinante de uma matriz de ordem 3.12. Dado um número digitado pelo usuário. a segunda coluna é formada pelas respectivas ordenadas e a terceira coluna é unitária. Faça um programa que leia um vetor de 20 números inteiros. verifique se há esse número no vetor. onde a primeira coluna é formada pelas abscissas dos pontos A. 2) e C(3. 15. Dado uma entrada do usuário. 16. a b  D=  = a *d − b*c c d  18. Faça um programa que carregue uma matriz 5x5 de números reais.1). 3 2  1 9 3 + 2 2 + 9  5 11  5 − 9 + 3 1 = 5 + 3 − 9 + 1 = 8 − 8         17. 4) apresentado na figura a seguir. Elabore um programa que calcule a soma e a subtração de duas matrizes A e B.

os elementos aij tais que i=j formam o que chamamos de diagonal principal da matriz. Elabore um programa que imprima os elementos da diagonal principal de qualquer matriz mxm. Dada uma matriz A(mxn). ATENÇÃO: Se a determinante D=0 então os três pontos não formam um triângulo. Elabore um programa que receba uma matriz A(3x2) e crie a matriz At.programa que receba as coordenadas dos vértices A. portanto. Numa matriz quadrada. 37 . B e C e calcule a área do triângulo. a matriz que se obtém trocando ordenadamente as linhas pelas colunas chama-se transposta de A. 21. e é indicada por At (ou por At). são pontos de uma mesma reta!!! a x  D = bx  cx  a y 1  by 1 c y 1  1 S ABC = * D 2 20.

6. ou seja. 17. Faça um programa que receba uma frase. 16. 13.6. Faça um programa que receba uma palavra. 8. 19. return(0). Faça um programa que receba uma palavra. utiliza-se uma matriz bidimensional de caracteres. 3. Faça um programa eu receba uma frase. é comum o uso de matrizes de string. lista[i]). 2. scanf(”%s”. 38 . 11. troque todas as vogais por * e apresente o resultado 4. 5. 14. for (i=0.h> #include <stdio. calcule e mostre a quantidade de vogais da frase digitada. i++) { printf(”Digite um nome:”). calcule e mostre a quantidade de caracteres. 2. Faça um programa que receba uma palavra e inverta a ordem dos caracteres. #include <stdlib. int main(void) { int i. MANIPULAÇÃO DE “STRINGS” String é uma cadeia de caracteres armazenadas uma matriz unidimensional (vetor) de caracteres finalizada pelo caractere nulo. 5. 6. i+1. 18. O seguinte exemplo apresenta o uso de uma matriz de string. deve-se declarar sempre o vetor com uma posição a mais para armazenar o caractere nulo. } 6. por meio de ‘\0’. i<MAX. Em programação. 3. 1. 12. Para criar uma matriz de strings. 20.lista[i]). 9.%s\n”. i<MAX. Faça um programa que receba uma frase. calcule e mostre a quantidade de vezes que o caractere a aparece.h> #define MAX 10 #define LEN 31 char lista[MAX][LEN]. 9. Faça um programa que receba uma palavra.1 Exercícios 1. Faça um programa que receba duas palavras e gere uma terceira que represente a combinação das duas anteriores. Faça um programa que receba uma palavra e coloque os caracteres em ordem crescente. } for (i=0. Desta forma. 7. 8. a seguinte instrução declara um vetor nome que guarda uma string de 10 caracteres: char nome[11]. 10. 4. calcule e mostre a quantidade de consoantes da frase digitada. indica o fim da string. calcule e mostre a quantidade de vogais. isto é. 15. 7. i++) printf(”%d . Por exemplo.

13. Elabore um programa que receba uma frase e mostre a quantidade de palavras. 11. 14. 15. Faça um programa que receba uma frase. 14 de setembro de 2001”. Faça um programa que mostre a data do sistema nos seguintes formatos: “dia/mês/ano” e “São Paulo. quais os caracteres existentes e a quantidade de cada caractere. Caso a frase possua meses por extenso substitua-os pelo seu número correspondente. Faça um programa que armazene 10 nomes. Dado uma entrada do usuário. pesquise e apresente se encontrado o nome (em que posição do vetor).10. Faça um programa que receba uma frase e mostre a quantidade total de cada caractere na frase. calcule e mostre a quantidade de palavras da frase digitada. Faça um programa que armazene 10 nomes. 12. Faça um programa que receba uma frase. 39 . 16.

scanf("%s". As variáveis são denominadas membros da estrutura. } Exemplo: 1. 3. cliente *x. 15. . 11. }*x..7. #include <stdlib. &z[0].. scanf("%s". Enumerações. }. z[0]. 13. A palavra struct define uma declaração.1 Estruturas Estrutura (structure) é um tipo de dado formado por um conjunto de variáveis referenciadas por um nome. scanf("%s". }.nome). x->nome). 10. ENUMERAÇÕES E UNIÕES A linguagem C permite criar tipos de dados utilizando: • • • Estruturas. seguida do nome da estrutura e das respectivas variáveis delimitadas pelas chaves. struct cliente nome[41]. printf("Ola %s!\n". &y. char sobrenome[41].<membro> <nome_da_estrutura>-><membro> 14. 9. 2. y. 18. 23. 12. &x->nome). <tipo> <variável_n>. Em C é declarada uma estrutura da seguinte maneira: struct <nome_da_struct> { <tipo> <variável_1>. A declaração de variáveis do tipo estrutura pode ser realizada da seguinte maneira: struct cliente { char nome[41]. 21. 4.h> #include <stdio. 17. 5. printf("Digite seu nome: "). printf("Digite seu nome: "). y.nome). Uniões. }*x.h> struct cliente { char nome[41]. z[5]. 7. struct { char char }. 16. char sobrenome[41]. z[5]. int main(void) { x=&y. return(0). 40 . 7. sobrenome[41]. printf("Ola %s!\n". As estruturas permitem organizar os dados na memória e estabelecer um inter-relacionamento entre os mesmo de modo que facilite a manipulação dos dados e ofereça maior clareza aos programas. . char sobrenome[41].. 20. ESTRUTURAS. printf("Ola %s!\n".. y. printf("Digite seu nome: "). <tipo> <variável_2>. z[5]. y.nome).nome). 22. struct cliente { char nome[41]. 19. 6. A referência ou o acesso a um determinado membro da estrutura é dado por uma construção do tipo para variáveis e ponteiros: <nome_da_estrutura>. 8.

case quinta: printf("quinta"). 4. case sabado: printf("sabado"). break. 25. 26. No exemplo acima. . sabado. break. } return(0). tanto o inteiro i como o caractere c compartilham a mesma porção de memória. case domingo: printf("domingo"). sexta. 33.. char c. geralmente de tipos diferentes. break. 23. 32. domingo}. 10. o compilador cria automaticamente uma variável grande o bastante para conter o maior 41 .h> enum dia_da_semana {Segunda. o mesmo endereço. 34. 22. break. 27. 37. break. #include <stdio. Considere o seguinte exemplo: 1. 9. case sexta: printf("sexta"). 20. 13. case terca: printf("terca"). 29. 38. 3. scanf("%d". 16. }<variáveis union>. &dia).3 Uniões Uniões (union) é uma posição de memória que é compartilhada por duas ou mais variáveis diferentes. 21. 18. break. union cliente { int i. 7. 31.h> #include <stdlib. 15. 35.2 Enumerações Enumeração é um conjunto de constantes inteiras que especifica todos os valores legais que uma variável desse tipo pode ter. quinta. quarta. 28. case quarta: printf("quarta"). switch(dia) { case Segunda: printf("Segunda"). 2. 19. } O valor do primeiro elemento do conjunto enum é 0. 14. 17. Quando uma union é declarada. 7. default: printf("Fora da faixa!\n").. 30. 12. 6. <tipo> <nome_da_variável_n>. 5. break. 36. int main(void) { enum dia_da_semana dia. <tipo> <nome_da_vairável_02>. }. A definição e um exemplo é apresentada a seguir: union <identificador> { <tipo> <nome_da_vairável_01>. 24.7. Porém i ocupa 2 bytes e c apenas 1 byte. printf("Digite um numero de 0 a 6:"). 11. 8. terca.

tipo de variável da union. 5. complemento. sobrenome. printf("O endereco da variavel y e: %p\n". Elabore um programa que imprima as seguintes informações de 10 alunos de uma turma: nome. return(0). 20.x). }W. printf("Digite um ponto flutuante:"). float y. imprimir informações de um determinado cliente. estado. Faça um programa de cadastro de clientes. Considerando os exercícios 1 e 2. int main(void) { printf("Digite um inteiro:"). printf("O endereco da variavel x e: %p\n". nome do cliente e saldo. W. scanf("%d". 3. telefone. numero. cidade. pesquisar clientes e relatorio. 2.y). excluir um cliente do cadastro. 10. &W. bairro. data de nascimento. Este valor pode ser inteiro. turma e data de nascimento. editar dados de clientes cadastrados. &W. printf("Voce digiou ponto flutuante %f\n". São necessários as seguintes informações do cliente: nome. 19.x). 3. sexo. 6. &W. Elabore um programa que armazene as seguintes informações de 10 alunos de uma turma: nome. 16.h> #include <stdlib. rg. 2. 15. endereço. 11. prontuário. W. 12. scanf("%f". 8. 14. 1. 4. A utilização de union pode ajudar na produção de código portáveis e na utilização de conversões de tipos.y). sobrenome. Faça um programa que realize o cadastro de contas bancárias com as seguintes informações: número da conta. #include <stdio. 17. 21. 7. fax e celular.x). printf("Voce digiou inteiro %d\n".y). 9. cep. Crie o menu de opções a seguir: Menu de opcoes: Cadastrar Visualizar todas as contas de um determinado cliente Excluir a conta com o menor saldo Sair Opcao?: 6. 18. 5. 4.4 Exercícios 1. prontuário.h> union tipoespecial { int x. sobrenome. elabore um programa que edite as informações de um determinado aluno escolhido pelo usuário. turma e data de nascimento. 13. Este programa deve permitir a inserção de novos clientes. O relatorio deve 42 . estado civil. &W. O banco permitirá o cadastramento de apenas 15 contas e não pode haver mais de uma conta com o mesmo número. Elabore um programa que leia um valor. ponto flutuante ou caractere. } 7.

quantos são casados(as) . documentário ou infantil). ano. São necessários as seguintes informações das fitas de vídeo: título. editar informações de fitas. pesquisar e imprimir informações de uma determinada fita. quantos divorciados(as). quantos são solteiros(as). 43 . quantos são do sexo masculino e feminino. diretor. drama. com legenda ou sem legenda. descrição e quantidade disponível. listar as cidades e a respectiva quantidade de clientes por cidade. Este programa deve permitir a inserção de novas fitas. categoria (comédia. ação. 7.calcular a média de idade. idioma. Faça um programa que gerencie uma locadora de vídeo.

13. o novo valor é o antigo mais 4 bytes (0063FDE4 + 4 = 0063FDE8). int i. 10. Um ponteiro pode armazenar a posição de uma variável de dado. 14. É importante declarar o ponteiro corretamente pois de acordo com o tipo base pode ser realizado a aritmética de ponteiros. Após um ponteiro ser declarado o ponteiro possui um valor desconhecido. 15. A forma geral para declarar uma variável ponteiro é: <tipo> *<nome_do_ponteiro>. O mesmo ocorre com as demais iterações.. } return 0. 16. Considerando-se o seguinte exemplo: 1. 7. printf("p armazenou endereco %p\n".h> #include <stdlib. No primeira iteração do primeiro loop (for). p++. 3. i++) { printf("O endereco armazenado e %p\n". i<5. PONTEIROS Ponteiros são variáveis que contém um endereço de memória.” Em geral.h> int main(void) { float *p. armazenam a posição de uma outra variável na memória. 9.8. um trecho de código executável ou ainda outro ponteiro... 5. Existem apenas duas operações aritméticas que podem ser usadas com ponteiros: adição e subtração. o ponteiro p é incrementado. 8. logo. O segundo loop (for) o ponteiro q é do tipo é double (8 bytes). for (i=0. v[5]. float *p O tipo base do ponteiro define que tipo de variáveis o ponteiro pode apontar. ao ser incrementado.. } O ponteiro p armazena inicialmente o primeiro byte do vetor v (Hexa 0063FDE4). soma-se 8 bytes. Existem dois operadores especiais para ponteiros: * = ”No endereço de. as expressões envolvendo ponteiros concordam com as mesmas regras de qualquer outra expressão de C. 44 . 6. Sendo p um ponteiro para ponto flutuante (float). isto é.p). 4. #include <stdio. p=&v[0].p). 11. Portanto é necessário atribuir um valor antes de utilizá-lo. 2. 12.” & = ”O endereço de.

Considere o trecho de código a seguir e responda se as seguintes expressões são construções válidas ou inválida. *r=&j. *s=k.8. 6. *s=k[5]. 45 . s=k.. Utilize um ponteiro. 2. 3. r=j. 2. . 1. k[10]. apresente o conteúdo e o endereço de cada posição do vetor. int j. *s. 4. . 9. r=&j.. calcule e mostre o maior e o menor número. 10. Justifique cada uma delas. s=&k[0]. *r=j. Elabore um programa que um vetor de 10 números reais.. 7.1 Exercícios 1. s=k[0].. 8. 3. Utilize um ponteiro. *s=*r. 5. Elabore um programa que leia três números. *r.

As duas expressões retornam o valor do décimo primeiro elemento do vetor str. } 9.h> void mostra_erro(int num). A linguagem C permite o acesso aos elementos de uma matriz de duas formas: aritmética de ponteiros e indexação de matrizes. i. printf("%s". i<10. PONTEIROS. "Erro quatro\n". 13. Por exemplo. 6. VETORES E MATRIZES Ponteiros e matrizes possuem uma estreita relação. A declaração de uma matriz de ponteiros int. 23.1 Vetores e Matrizes de Ponteiros Ponteiros podem ser organizados em matrizes como qualquer outro tipo de dado. "Erro um\n". i. i<5. for (i=0. 2.9. 22. #include <stdlib. 14. as seguintes expressões são válidas: x=str[10]. 8. 6. for(i=0. 2. int main(void) { int i. 4. v[10]. 15. 19. i<10. i++) printf("O endereco de p[%d] e: %p\n". 17. 7.h> #include <stdio. } void mostra_erro(int num) { /*Inicia um vetor de ponteiros*/ char *erro[]= { "Erro zero\n". 21.h> #include <stdlib. for (i=0. printf("p armazenou endereco %p\n". 10. 16. 24. 26. 11. 12. &p[i]). p=&v[0]. erro[num]). #include <stdio. 9. é: int *x[10]. 25. "Erro tres\n". x=*(p+10). de tamanho 10. Considere o seguinte exemplo: 1. Em seguida é atribuído ao ponteiro p a posição 0 da variável vetor str. 13. i. }. 11. i++) printf("O endereco de p+%d e: %p\n". 10. p+i). } 46 . 15. 9. 3. é criado um vetor tipo char e um ponteiro para char. 12. printf("\n\n"). 5.h> int main(void) { int *p. i++) mostra_erro(i). Para x receber o conteúdo do vetor str posição 10. 14. 5. 7. return 0. 8. return(0). 18. "Erro dois\n". 20. Exemplo: 1.p). 3. 4.

calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na vetor. Utilize ponteiro. 47 . Use ponteiros. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres. Faça um programa que carregue um vetor 10 de números reais. 2.9.2 Exercícios 1.

portanto. 1.. float valor(float x) { x=x*x. 16. a menos que utilize variáveis ou dados globais. return(x). Os argumentos podem ser passados de duas maneiras: • Chamada por Valor: Este método faz uma cópia do valor de um argumento no parâmetro formal. return(0). return(x). Quando uma função é compilada. Isto implica que quaisquer alterações no parâmetro afetam a variável usada para chamar a rotina.z. 8. quaisquer alterações feitas no parâmetro não têm nenhum efeito nas variáveis usadas para chamá-la. portanto. o código fonte é transformado em código objeto e um ponto de entrada é estabelecido. z). 24. z). 6.. Os argumentos são chamados de parâmetros formais da função. float referencia(float *x). printf(”y=%f. #include <stdio. 22. 20. 11. z=%f\n”. 10. 25. } float referencia(float *x) { x=x*x. 3. São variáveis locais que pertencem à função e são criadas na entrada e destruídas na saída. 5. 2.. } 10. 12. 7. <tipo> <Varn> Cada função é um bloco discreto de código. exceto por meio de uma chamada de função. z=valor(y). y. z=valor(y). • Chamada por Referência: Este método o endereço do argumento é copiado para o parâmetro formal. . 9. Desta forma. printf(”Chamada por Referencia:\n”). printf(”Chamada por valor:\n”).h> float valor(float x).h> #include <stdlib. O endereço de uma função é o ponto de entrada da função.10.1 Ponteiros para Funções As variáveis possuem uma posição física na memória assim como o próprio código executável do programa. <tipo> <Var2>. 17. 28. int main(void) { float y=10. } 18. z=%f\n”. 14. 21. 26. O escopo da função é a porção de código e dados (variáveis locais) que constitui o corpo da função que é oculto do resto do programa. um ponteiro de função pode ser usado para chamar uma função. Quando é feita 48 . 23. 19. A forma geral de uma função é: <Tipo_de_retorno> <nome_da_função>(<lista de parâmetros>) { <Corpo da Função> } OBS: <lista de parâmetros> = <tipo> <Var1>. y. 4. 15. não pode afetar ou ser afetado por outras partes do programa. 27. printf(”y=%f. FUNÇÕES Funções são blocos de construção em C. 13. sendo que é privativo à função e não pode ser acessado por nenhum comando em uma outra função.

39. return(answer). for (t=1. for(i=0. }. é efetuada uma chamada em linguagem de máquina para o endereço desse ponto de entrada. 27. "Primeiro Erro quatro\n". 2. da funcao: %p\n". 36.. 43. i<5.2 Recursividade Em C. i<5. A recursividade talvez seja a mais importante vantagem das funções em C. 1. "Primeiro Erro um\n". 35. A recursão é o processo é o processo de definir algo em termos de si mesmo.. Este recurso é muito útil em alguns tipos de algoritmos chamados de algoritmos recursivos. Um exemplo não recursivo: int fact(int n) { int t. void mostra_erro1(int num) { char *erro[]= { "Primeiro Erro zero\n". printf("End. answer=1. void (*p)(int). 14. p). 41. 45. 4. erro[num]). erro[num]). } 21. 6. "Segundo Erro quatro\n". 28. 16. #include <stdlib. 20.h> void mostra_erro1(int num). printf("End. 30. } 10. 22. 42. void mostra_erro2(int num). "Segundo Erro tres\n". A função é recursiva se um comando no corpo da função a chama. return 0. } void mostra_erro2(int num) { char *erro[]= { "Segundo Erro zero\n". for(i=0. "Segundo Erro dois\n". i++) p(i). isto é. 8. 11. p). 7.uma chamada de função. Não existe ganho de velocidade ou espaço de memória significativo com o uso de funções recursivas. 44. 5.h> #include <stdio. * 3 * 2 * 1 5! = 4 * 3 * 2 * 1 = 4 * 3! onde n é o número inteiro positivo. enquanto o programa está sendo executado. 17. t++) answer=answer*(t). Uma propriedade dos fatoriais é: n! = n * ( n − 1)! Uma função recursiva cria a cada chamada um novo conjunto de variáveis locais. p=mostra_erro2. t<=n. answer. 31. 33. 29. 38. printf("%s". 37. "Primeiro Erro tres\n". i++) p(i). 25. 19. }. 40. 9. 15. 32. Por exemplo: O cálculo do fatorial de um número é definido pela seguinte expressão: n! = n * ( n − 1) * ( n − 2) * . 34. 23. 24. p=mostra_erro1. 12. 10. A principal vantagem das funções recursivas é que pode ser utilizadas para criar versões mais claras e simples de vários algoritmos. "Segundo Erro um\n". } /*Declaração das variáveis t e answer*/ /*retorna answer*/ Um exemplo recursivo: 49 . "Primeiro Erro dois\n". 18. da funcao: %p\n". 26. int main(void) { int i. printf("%s". funções podem chamar a si mesmas. 13. uma função que chama a si mesma repetidamente um número finito de vezes. 3.

argc). return(answer).3 Função main A função main pode aceitar parâmetros via argumentos da linha de comando. 11. O parâmetro argv é um ponteiro para uma matriz de ponteiros para caractere.h> #include <stdio. 5. printf("Input a string:"). 50 . Há dois argumentos internos especiais: argc e argv.h> int main(int argc. int main(int argc. argv[i]). argv[1]). 2. char * argv[]) { if (argc!=2) prinf(”Voce esqueceu de digitar seu nome\n”). 13. if (n==1) return(1). answer. } 1. Cada elemento nessa matriz aponta para o argumento da linha de comando. } /*Declaração das variáveis t e answer*/ /*retorna answer*/ 10.4 Funções de String Função gets(): É utilizada para leitura de uma string através do dispositivo padrão. 5. i. 3. até que o ENTER seja pressionado. 8. 8. 1. 7. printf("The value of argc is %d \n\n". 4. printf("\nThe environment string(s) on this system are:\n\n"). i++) printf(" argv[%d]: %s\n". 3. } 10.h): char *gets(char *str).h> #include <stdlib.h> int main(void) { char string[80]. Ele é sempre pelo menos 1 porque o nome do programa é qualificado como primeiro argumento.h> int main(int argc. argc). 5. printf("These are the %d command-line arguments passed to main:\n\n". A função gets() não testa limites na matriz em que é chamada. 2. 11. 3. return(0). Sintaxe (conio. 12. gets(string). i < argc. 10.int fact_r(int n) { int t. 9.h> #include <stdlib. 4. #include <stdio. Um argumento da linha de comando é a informação que segue o nome do programa na linha de comando do sistema operacional. 7. 10. char* argv[]) O parâmetro argc contém o número de argumentos da linha de comando. 4. 6. answer=fact_r(n-1)*n. 9. 6. 2. 1. return(0). 6. 7. else printf(”Ola %s!\n”. char * argv[]) { int i. for (i = 0. 8. #include <stdio. #include <stdlib.

str1). 5.h> int main(void) { char *buf1 = "aaa". 9. string).h): int puts(const char *str).h> #include <stdio. 51 . #include <stdlib. 3. Sintaxe (string. s1). gets(s2). return(0). 10. 7. } Função strcmp(): Compara duas strings. 3. 4. *buf3 = "ccc". 9. 5. *buf2 = "bbb". 12. devolve < 0.h> int main(void) { char s1[80]. 4. 6. puts(string). 2.h> #include <stdio. 5. const char *origem).h> #include <stdio. 10. printf("%s\n". 11. 2. char *str1 = "abcdefghi".h> int main(void) { char string[10]. devolve > 0.h> #include <stdio. 7.h): char *strcpy(char *destino. Não verifica tamanho. 9. printf("The string input was: %s\n". 6. const char *str2). s2[80]. 4. s2).9. 1. string). Sintaxe (stdio. 1. Sintaxe (string. 11. coloca um '\n' no final. 7. 2. } Função puts(): Escreve o seu argumento no dispositivo padrão de saída (vídeo). return(0). #include <stdlib. 4. Se str1 > str2. 1.h> int main(void) { char string[] = "This is an example output string\n". Sintaxe (string. 8. } Função strcpy(): Copia o conteúdo de uma string. 8. 8. } Função strcat(): Concatena duas strings. printf("%s\n". se forem iguais devolve 0. 10. 5. return(0). 2. const char *str2). 6. 3. 1. Reconhece os códigos de barra invertida. 6.h): char *strcat(char *str1. #include <stdlib. gets(s1). 11. 3. return(0). strcat(s2. 13. strcpy(string.h): int strcmp(const char *str1. Do contrário se str1 < str2. #include <stdlib.

result = asin(x). 3. 13. is less than buffer 1\n"). x. 1. 10. 12. 6. buf1). } int ptr. return(0). return(0).h): double asin(double arg). Sintaxe (math. 10. 8. 14. } Função asin(): Devolve o arco seno do argumento. 2. double x = 0.h> #include <stdio.h> int main(void) { double result. result = atan(x).5. 12. #include <stdlib. 17. 15. } 52 .h> int main(void) { double result. 8. 7. 9. result).h): double acos(double arg). 9. 3. 4. 2. result). 10. #include <stdlib.7. if (ptr > 0) printf("buffer 2 else printf("buffer 2 ptr = strcmp(buf2. 20. printf("The arc sin of %lf is %lf\n". 10. 11.h> #include <math.5. 9. Sintaxe (math.h> int main(void) { double result. 8. 2. double x = 0. buf3). 8. 5. result). 7. 9.h> #include <stdio.h): double atan(double arg). printf("The arc tangent of %lf is %lf\n". 11. 5. 19. 4. double x = 0. 5. 16.h> #include <stdio.h> #include <math. } Função atan(): Devolve o arco tangente do argumento. 10. 4.5 Funções Matemáticas Função acos(): Devolve o arco co-seno do argumento. Sintaxe (math. x. 12. 1. 6. x. 1. is greater than buffer 3\n"). 3. 11. ptr = strcmp(buf2.h> #include <math. return(0). #include <stdlib. 7. 6. is less than buffer 3\n"). is greater than buffer 1\n"). result = acos(x). 12. 18.5. printf("The arc cosine of %lf is %lf\n". 11. if (ptr > 0) printf("buffer 2 else printf("buffer 2 return(0).

return(0). 3.h): double exp(double arg).h> #include <stdio.0. 10. 9.h> int main(void) { double result. 7. result). printf("The tan of %lf is %lf\n". x. #include <stdlib. 1. x. 2. } Função tan(): Devolve a tangente do argumento. return(0). 10. result = tan(x). x = 0. 11. x. 5.h> int main(void) { double result.h> #include <math. 8.5. double x = 4. 4.h> #include <math. printf("The cosine of %lf is %lf\n". 7. 2. x. printf("'e' raised to the power of %lf (e ^ %lf) = %lf\n". 3. 8. result = sin(x). 4. 5. 6. result = exp(x). x = 0. 7. 8. 6. 11. #include <stdlib. 9.h): double tan(double arg). 7. return(0). printf("The sin of %lf is %lf\n". 9. 8. 6. double x = 0. 3. 11. 5. 3. return(0). } 53 . 2. } Função sin(): Devolve o seno do argumento. 12.h> #include <stdio.5. #include <stdlib. 1.h> #include <math. Sintaxe (math.h> #include <stdio. 1. result).h> int main(void) { double result. Sintaxe (math. #include <stdlib.h): double sin(double arg). 4.Função cos(): Devolve o co-seno do argumento. 1. 4.5. result). 9. 11.h> #include <stdio.h> int main(void) { double result. result = cos(x). result). } Função exp(): Devolve o logaritmo natural e elevado à potência arg. x. 10. Sintaxe (math. 12. 10. Sintaxe (math. 2.h): double cos(double arg). 6.h> #include <math. 5.

h> int main(void) 54 .h> #include <math.h): double fabs(double arg). result).h): double fmod(double x.h> int main(void) { double x = 5.h> #include <math. printf("The remainder of (%lf / %lf) is %lf\n". return(0).h> #include <stdio. } Função log(): Devolve o logaritmo natural do argumento. y = 3. 6. 10.h> int main(void) { double x = 2. 3.h> #include <math. 10. pow(x. 11.0. 5. 5.h> #include <stdio. y)). printf("%lf raised to %lf is %lf\n". y. 5. double x = 8. y = 2. 9. 2. 7. 2.h> #include <math. result = log(x). #include <stdlib.0. 11.0. 4. double y). 8.h> #include <stdio. 4. 2. 1. 6. 10.y).h> int main(void) { float number = -1234. x. Sintaxe (math. } Função pow(): Devolve base elevada à potência. 8.h> #include <math. } #include <stdlib. 8.h): double log(double arg). #include <stdlib. Sintaxe (math.h> int main(void) { double result. fabs(number)). 12. 3. 6. 3. printf("number: %f absolute value: %f\n". 9. result = fmod(x. Sintaxe (math. 7. 1. return(0).h> #include <stdio. result). 3. 12. return(0).6872. 7.0.h): double pow(double base. 1. 7. 5. x. printf("The natural log of %lf is %lf\n". 5. #include <stdlib. 9. double result. } Função fmod(): Devolve o resto de x/y. 6. 1. 2.Função fabs(): Devolve o valor absoluto do argumento. 10.0. 8. return(0). x. 2. 4. y. double expoente). 1. number. #include <stdlib. 4. 4. Sintaxe (math. 9.h> #include <stdio. 3.

x. ctime(&t)). 3. y. 7. } Função ctime(): Devolve um ponteiro para o horário de calendário na forma: dia mês ano horas:minutos:segundos ano \n\0 Sintaxe (time. printf("The square root of %lf is %lf\n". 3. 9. 1.h> #include <stdio. 8. #include <stdlib. 6.h> #include <time. Sintaxe (math.h> int main(void) { double x = 4. double x = 2. exp(y*log(x))). 5. 9. 10. 3. 1. t = time(NULL). 2. x. 8. printf("The number of seconds since January 1.h> #include <stdio. printf("Hoje é: %s\n". result. result = sqrt(x). 11.h): double sqrt(double arg). Sintaxe (time.h): time_t time(time_t *time). 5. return(0). return(0).0. } 55 . #include <stdlib. 9. 1970 is %ld". 11. return(0).h> int main(void) { time_t t. } 10.t). 7. y = 3.6 Funções de Hora e Data Função time(): Devolve o horário atual de calendário do sistema. 11. { 7. 9.h): char *ctime(const time_t *time).h> int main(void) { time_t t. 8.h> #include <stdio. result). 4. 4. 6. 10. time(&t). #include <stdlib. 7. 8.h> #include <math. return(0). } Função sqrt(): Devolve a raiz quadrada do argumento.0. 5. 4.6. printf("%lf raised to %lf is %lf\n". 2.0. 6. 2.h> #include <time. 10. 1. 10.

6.8 Exercícios 1. µ= ∑X i =1 n i n 8. 9. 12. return(0). 6. ABC.h e stdlib. 2. 13.h> #include <time. 3. Elabore uma função que receba 10 números reais e a média. 4. 7. 8. retornando o valor do desvio padrão. rand() % 100).h> #include <stdio. for(i=0. Sintaxe (time.h> int main(void) { int i.h): void randomize(void).10. 5.GHI − JK S1 = A *10 + B * 9 + C * 8 + D * 7 + E * 6 + F * 5 + G * 4 + H * 3 + I * 2 d1 = 11 − ( S1 MOD 11) IF d1 >= 10 THEN Dígito _ 01 = 0 ELSE Dígito _ 01 = d1 S 2 = A *11 + B *10 + C * 9 + D * 8 + E * 7 + F * 6 + G * 5 + H * 4 + I * 3 + Dígito _ 01 * 2 d 2 = 11 − ( S 2 MOD 11) IF d 2 >= 10 THEN Dígito _ 02 = 0 ELSE Dígito _ 02 = d 2 IF J = Dígito _ 01 AND K = Dígito _ 02 THEN Válido ELSE Inválido 5. 10. printf("Dez números randômicos de 0 a 99\n\n"). 4. A constante RAND_MAX é definida na biblioteca <stdlib. Elabore uma função que aceita como parâmetro dois números reais e retorna a média aritmética. 2. 7.7 Outras Funções Função randomize() e rand(): A função rand() devolve um número aleatório entre 0 e RAND_MAX. int rand(void). } 10. randomize(). 1. Elabore uma função que receba uma string e troque todos os caracteres ‘a’ por ‘@’. Elabore uma função que aceita como parâmetro dois catetos e retorna o valor da hipotenusa. 3. Elabore uma função que aceita como parâmetro 5 números reais e retorna o maior número. Elabore uma função que receba 10 números reais e retorna a média aritmética. Elabore uma função que aceita como parâmetro o número do CPF e retorna 1 para válido e 0 para inválido. i<10. #include <stdlib.h>. A função randomize() inicia a geração de números aleatórios. Elabore uma função que receba uma palavra (string) e retorna a quantidade de caracteres. i++) printf("%d\n".DEF . 11. 56 .

Elabore uma função que receba como parâmetro um número inteiro e imprima o valor em extenso na tela. V = 4 * π * R3 3 10. Elabore uma função que receba como parâmetro um número real e retorne a raiz quadrada. 12. 11.σ= ∑ (X i =1 n i − µ) 2 n 9. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 3. sen α cos α cos α cotgα = sen α tgα = sec α = 1 cos α 1 sen α cos sec α = 17. secante e cossecante de um ângulo α. 16. São apresentados as seguintes fórmulas da trigonometria. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 5. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 2. Elabore uma função que receba como parâmetro um raio de uma esfera e retorne o volume de acordo com a fórmula abaixo. São apresentados as seguintes fórmulas da trigonometria. 15. 13. Elabore um programa e implemente as funções para o cálculo da tangente. Elabore um programa e implemente as funções para o cálculo de: sen (a + b ) = sen (a )* cos(b ) + sen (a )* cos(b ) cos(a + b ) = cos(a )* cos(b ) − sen (a )* sen (b ) tg (a ) + tg (b ) tg (a + b ) = 1 − tg (a )* tg (b ) sen (2 * a ) = 2 * sen (a )* cos(a ) cos(2 * a ) = cos 2 (a ) − sen 2 (a ) sen (a − b ) = sen (a )* cos(b ) − sen (a )* cos(b ) cos(a − b ) = cos(a )* cos(b ) + sen (a )* sen (b ) tg (a ) − tg (b ) tg (a − b ) = 1 + tg (a )* tg (b ) cos(2 * a ) = 2 * cos 2 (a ) − 1 cos(2 * a ) = 1 − 2 * sen 2 (a ) 2 * tg (a ) tg (2 * a ) = 1 − tg 2 (a ) 57 . cotangente. Elabore uma função que receba como parâmetro um número real e retorne 10% do valor. 14.

Dado um ponto C e uma distância r. 58 . apresentem a equação da circunferência. e verificar se a circunferência passa pela origem. Elabore funções que. dado o centro C e a distância r. Se P(x.18. o conjunto de pontos formado num plano cuja distância a C é igual a r é denominado circunferência de centro C. y) é um ponto qualquer da circunferência. a relação entre x e y é dada pela equação abaixo (equação da circunferência). os pontos em que a circunferência corta o eixo Ox e Oy.

ALOCAÇÃO DINÂMICA Um programa necessita de memória para armazenar informações. ou seja. sempre que necessário e houver a disponibilidade de espaço em memória. Para este tipo de alocação necessita-se definir de antemão a quantidade de armazenamento necessária. um programa em execução pode. Pilha Heap Variáveis Globais Código do Programa Figura 11. cada variável recebe um endereçamento de memória e o respectivo tamanho. As variáveis globais são alocadas em uma região pré-definida e as variáveis locais são alocadas em uma parte da memória definida como pilha. solicitar a alocação do espaço e utilizar convenientemente os dados. void *calloc(size_t num. size_t size). Existem duas maneiras fundamentais de um programa alocar memória do computador. Em C ANSI são definidos quatro funções: Função malloc() :Aceita como parâmetro size bytes de memória e retorna um ponteiro para o bloco alocado ou nulo (NULL) se indisponível. A segunda forma é através da alocação dinâmica. void *malloc(size_t size). que é fixo durante todo o tempo de execução do programa. 59 . isto é. ou heap. A alocação dinâmica é o processo de alocar espaço de memória do computador em tempo de execução.1 Utilização da memória de um programa. A figura 11. A primeira forma é através de variáveis locais e globais (alocação estática).11. para o armazenamento da informação. Função calloc() :Aceita como parâmetro num números de elementos de size bytes de memória e retorna um ponteiro para o bloco alocado (num*size) ou nulo (NULL) se indisponível.1 mostra conceitualmente como um programa utiliza a memória (a posição e o tamanho variam de acordo com o tipo de processador). O armazenamento é realizado em uma região de memória livre.

calcule e mostre o maior e o menor número. 17. void *realloc(void *p. telefone.Função realloc() :Aceita como parâmetro o ponteiro do bloco de memória já alocada e um novo tamanho size bytes. carregue. São necessários as seguintes informações do cliente: nome. if (!y) { printf(”Memória indisponível!\n”). 6. carregue. cidade. Elabore um programa que aloque dinamicamente um vetor de n números reais. 13. return(0). cep.h> int main(void) { float *y. imprimir informações de um determinado cliente. Se isso ocorrer. excluir um cliente do cadastro. Elabore um programa que aloque dinamicamente três números reais. estado civil. numero.*y). printf(”O conteúdo para que y aponta é %f\n”. 15. 9. 4. 10. Elabore um programa que aloque dinamicamente um vetor 10 de números reais. 3. Se size é zero.y). a memória apontada por p é liberada. 5. 2. } 11.h> #include <stdlib. Se p é nulo. 1. Elabore um programa que aloque dinamicamente um vetor de 10 números reais. Este programa deve permitir a inserção de novos clientes. data de nascimento. Um ponteiro para o bloco de memória é devolvido porque realloc() pode precisar mover o bloco para aumentar seu tamanho. estado. 18. Por exemplo: void free(void *p). } *y=10. apresente o conteúdo e o endereço de cada posição do vetor. rg. y=(float*)malloc(sizeof(float)).&y). 2. 14. 12. 11. calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na vetor. pesquisar clientes e relatório. 4. 3. endereço. o conteúdo do bloco antigo é copiado para o novo bloco. sobrenome. 19. sexo. 16. realloc() aloca size bytes de memória e devolve um ponteiro para a memória alocada. size_t size). free(y). complemento. Faça um programa de cadastro de clientes. #include <stdio. fax e celular. bairro. printf(”O endereço do bloco alocado é %p\n”. 60 . printf(”O endereço de y é %p\n”.1 Exercícios 1. Função free() :Aceita como parâmetro o ponteiro do bloco de memória alocada e devolve ao heap. calcule e apresente a média aritmética e o desvio padrão. 5. editar dados de clientes cadastrados. 7. leia. 8. exit(0).

Criar também uma função para ordenar os clientes. data. Cada novo cliente. listar as cidades e a respectiva quantidade de clientes por cidade. utilize um vetor de ponteiros (deve-se iniciar todos ponteiros com nulo). o nome do cliente que realizou o serviço mais caro. valor. • • • Para armazenar as informações dos clientes. 61 . 6. quantos divorciados(as). a média dos valores.• relatório deve calcular a média de idade. cliente). juntamente com a descrição desse serviço e a data de sua realização. quantos são do sexo masculino e feminino. Faça um programa contendo os serviços que uma oficina mecânica pode realizar: • • Ordem de serviço (número da OS. ao final. Leia as informações sobre várias ordens de serviço e determine. aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma posição do vetor. quantos são casados(as) . serviço realizado. quantos são solteiros(as).

a mesma função pode escrever dados em um arquivo em disco ou em algum outro dispositivo. O tipo size_t é essencialmente o mesmo que um unsigned. Uma vez aberto o arquivo.H é definida também a macro EOF (geralmente definida como –1). sendo tal valor devolvido quando uma função de entrada tenta ler além do final de um arquivo. Em C um arquivo pode ser qualquer coisa. mas não todos os arquivos. devemos desassociar o stream do arquivo através de uma operação de fechamento. Pelo fato dos streams serem independentes dos dispositivos reais. geralmente no final do processamento. incluindo terminais. acionadores de discos e acionadores de fita. 62 . Quando não for mais necessário trocar informações com o arquivo. Todos os streams se comportam de maneira semelhante.H seja incluído nos programas que as utilizem. FILE *arq. algumas das quais serão vistas no decorrer deste capítulo. MANIPULAÇÃO DE ARQUIVOS 12. O sistema de arquivos ANSI é composto de diversas funções para a manipulação de arquivos. Por exemplo. enquanto o tipo FILE será discutido na próxima seção. O arquivo STDIO.H fornece protótipos para as funções de E/S e define também os tipos size_t e FILE. Essa abstração é chamada de stream e o dispositivo real é chamado de arquivo. desde um arquivo em disco até um terminal ou uma impressora. informações podem ser trocadas entre ele e o programa. Essas funções exigem que o cabeçalho STDIO. o sistema de arquivos com buffer transforma-os em um dispositivo lógico chamado stream. um arquivo em disco pode suportar acesso aleatório enquanto um teclado não pode. O sistema de arquivos do C ANSI foi projetado para trabalhar com uma grande variedade de dispositivos de E/S. Isto é.1 “Streams” e Arquivos O sistema de E/S do C fornece ao programador uma interface consistente.12. como o console. Nem todos os arquivos apresentam os mesmos recursos. Um stream é associado com um arquivo específico através de uma operação de abertura. Isso revela um ponto importante sobre o sistema de E/S do C: todos os streams são iguais. Embora cada um dos dispositivos seja muito diferente. independente do dispositivo real sendo acessado. Em STDIO. o sistema de E/S do C fornece um nível de abstração entre o programador e o dispositivo utilizado.

"w"))== NULL) { printf("Cannot open output file. 22. 5. 14.1. "r"))== NULL) { printf("Cannot open input file. 17. 12. 20.12. 12.\n"). return 1. Isto pode ser feito através de funções que alteram indicador de posição corrente para determinada localização no arquivo.2 Tipos de Acesso Os tipos de acesso aos arquivos podem ser seqüencial ou aleatório.3 Funções Manipulação de Arquivos Função fclose() : Fecha um arquivo. 4. 18. posição corrente ou fim. que indica a localização de início de leitura ou gravação. 13. Tabela 12.1 Os valores para o modo de abertura de arquivo. Função fopen() : Abre um arquivo. Modo r w rb wb 1. 19. return 1.BAK". 9.\n"). 3. 7. int fclose(FILE *arq). O modo de abertura de arquivo pode ser conforme apresentada na tabela 12.h> Abre Cria Abre Cria um um um um arquivo arquivo arquivo arquivo Significado texto para leitura texto para escrita binário para leitura binário para escrita int main(void) { FILE *in. 23. return(0). fclose(out).DAT". 21. 10. 8. *out. if ((in = fopen("TESTFILE. 6. out). a leitura e a transferência de dados devem ser feitas percorrendo seqüencialmente os bytes no arquivo. 11. 15.h> #include <stdlib. } 63 . 2. fclose(in). } if ((out = fopen("TESTFILE. No acesso seqüencial. FILE *fopen(const char nome_arquivo. Este posicionamento aleatório é feito em relação a três possíveis origens que são passados como argumento de funções: Início. O acesso aos dados é feito através de um ponteiro indicador da posição corrente no arquivo. } while (!feof(in)) fputc(fgetc(in). #include <stdio. const char* modo). Enquanto que no acesso aleatório é feito em qualquer posição do arquivo sem que informações anteriores precisem ser acessadas. 16.

int i = 100.h> int main(void) { FILE *stream. 12. 13.. long numbytes. 2. 16. length = ftell(stream). int ferror(FILE *arq). if (!stream) exit(1). 4.h: Tabela 12. stream = fopen("MYFILE. 0L.. Função remove() : Apaga um arquivo. 5. "%d %c %f".). int remove(const char *nome_arquivo).h> long filesize(FILE *stream). void rewind(FILE *arq). 17. curpos. SEEK_END). 9. 5. 14.TXT is %ld bytes\n". } Função fseek() : Posiciona o arquivo em um byte específico. return 0. fclose(stream). fclose(stream). O parâmetro origin é uma das seguintes macros definidas em stdio. 9. 22. char c = 'C'. curpos = ftell(stream). fseek(stream. 12. 64 . printf("Tamanho de MYFILE. } long filesize(FILE *stream) { long curpos. 14. 3. fprintf(stream. #include <stdio.TXT". 15. float f = 1.Função fprintf() : Escreve argumento em um arquivo. int fprintf(FILE *arq. 13. 15. int origin). 24. 10. stream = fopen("DUMMY. 6. Origin Início do arquivo Posição atual Final de arquivo int main(void) { FILE *stream. return 0. 4. const char *control_string. 18. 1.234. return length. 2. 20. . int fseek(FILE *arq. fseek(stream. "w"). 11. 23. "This is a test"). 3. SEEK_SET). i. c.h> #include <stdlib.2 Os valores para o modo de abertura de arquivo. f). 6. "w+"). length. 21. 16. Função rewind() : Recoloca o indicador de posição de arquivo no início do arquivo. 11.FIL". 10. 7. 19. 8. 7. #include <stdio. } Função ferror() : Devolve verdadeiro se ocorreu um erro durante a última operação no arquivo.h> #include <stdlib. filesize(stream)). Macro SEEK_SET SEEK_CUR SEEK_END 1. 8. fprintf(stream.

10. stream = fopen("DUMMY. 12. 13. } fclose(stream). 8. printf("%d %c %f". return 0. Se não ocorrer erro retorna count. if (!stream) exit(1). &c. "%d %c %f". return 0..i. sizeof(int). 16. Função fscanf() : Lê argumento de um arquivo. 6.h> #include <stdlib. float f. c. 15. s[i]). char c.FIL". 12. if ((stream = fopen("DUMMY. 10.FIL". int fflush(FILE *arq)..h> int main(void) { FILE *stream.). 5. 2. i<10. 19.h> int main(void) { FILE *stream. 10. #include <stdio.$$$". const char *control_string. i. 4. int i. 7. 1. i++) { fread (&s[i]. size_t num_bytes. int fscanf(FILE *arq. fclose(stream). f). "r")==NULL) exit(1). 11.\n"). 3. #include <stdio. fgetc(stream). . 3. 8.Função fflush() : Esvazia um stream. int feof(FILE *arq). 14. 5. } for (i=0. int s[10]. 9. i. 5. 2. 11. 7. 15. if (feof(stream)) printf("We have reached end-of-file\n"). 4. 16. 9. stream). size_t fread(void *buffer. 4. 1. &i. 1. 8. 6. 13. } Função fread() : Lê count blocos de num_bytes de arq para buffer. 7. 2. 14.h> #include <stdlib. 14. 12. FILE *arq). size_t count. } 65 . 17. fscanf(stream.h> #include <stdlib. "r"). } Função feof() : Devolve verdadeiro se fim de arquivo for atingido. return 0. 3. 13. return 1. 9. 18. 17. "Cannot open output file. 1. if ((stream = fopen("TEST.h> int main(void) { FILE *stream. #include <stdio. 20. fclose(stream). 11. "rb")) == NULL) { fprintf(stderr. 6. printf("x[%d]=%d\n". &f).

char ch. 14. 8. 13. 10. 3. 31. 0.\n"). 13. "w+"). sizeof(int). imprimir informações de um determinado cliente.h> int main(void) { FILE *stream.$$$".h> #include <stdio. } while (ch != EOF). size_t fwrite(void *buffer. 27. 14. "Cannot open output file. 2. stream). 6. int fgetc(FILE *arq). Faça um programa de cadastro de clientes. 4. 2. return 0. size_t count. 4. return 1. Se não ocorrer erro retorna count. 16. 11. "wb")) == NULL) { fprintf(stderr. 17. } 12. #include <stdio. i<10. 1. } for (i=0. editar dados de clientes cadastrados. /* write a string into the file */ fwrite(string.h> int main(void) { FILE *stream. } Função fgetc() : Devolve o próximo caractere da stream de entrada na posição atual e incrementa o indicador de posição do arquivo. 5. 7. 18. i. FILE *arq). fclose(stream). 9. char string[] = "This is a test". #include <string.&s[i]). return 0. 3. São necessários as seguintes 66 . 29.i). stream).FIL". /* seek to the beginning of the file */ fseek(stream. 1. 23. 8. 16. 1. 19. 28. } fclose(stream). 1. 15. int s[10]. do { /* read a char from the file */ ch = fgetc(stream). 12.h> #include <stdlib. 19. i++) { printf("x[%d]=". 6. if ((stream = fopen("TEST. 20. 25. 17. size_t num_bytes. 15. 7.Função fwrite() : Escreve count blocos de num_bytes de buffer para arq. 21. 22. SEEK_SET). strlen(string). 20. 30.4 Exercícios 1. 11. 21. /* open a file for update */ stream = fopen("DUMMY. 10. /* display the character */ putchar(ch). 12. 5. 9. Este programa deve permitir a inserção de novos clientes. pesquisar clientes e relatório. excluir um cliente do cadastro. 24. 26. fwrite(&s[i]. 18. scanf("%d".

ler informações de um arquivo). Faça um programa que gerencie a venda de produtos de uma farmácia. Criar também uma função para ordenar os clientes. serviço realizado. fax e celular. 67 . a média dos valores. listar as cidades e a respectiva quantidade de clientes por cidade. • relatório deve calcular a média de idade. telefone. bairro. data. sobrenome. juntamente com a descrição desse serviço e a data de sua realização. valor. cliente . sexo. o nome do cliente que realizou o serviço mais caro. Leia as informações sobre várias ordens de serviço e determine. • • • • Para armazenar as informações dos clientes. Cada novo cliente. O programa consulta um arquivo (exercício 3) que contém a disponibilidade dos produtos. ao final. utilize um vetor de ponteiros (deve-se iniciar todos ponteiros com nulo). Faça um programa que gerencia os produtos armazenados em uma farmácia. endereço. cep. rg. numero. 2. A cada venda deve-se atualizar a quantidade no arquivo. estado. Implementar operações para manipular arquivos. quantos são solteiros(as). 3.informações do cliente: nome. quantos divorciados(as). cidade. quantos são do sexo masculino e feminino. aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma posição do vetor. estado civil. 4. complemento. quantos são casados(as) . Faça um programa contendo os serviços que uma oficina mecânica pode realizar: • • Ordem de serviço (número da OS. data de nascimento. Deve-se criar um arquivo que armazene as informações dos produtos e a quantidade disponível.

void troca(int *p. temp. for (i=0. do { exchange=0. scanf("%d". 30. if (!q) exit(1). free(q). printf("Quantos números deseja:"). b--) { if (p[b-1]>p[b]) { temp=p[b-1]. 5. int count). printf("\n"). Seleção. #include <stdio. &n). n. um dentro do outro (i e j).. apenas uma porção dessa informação é usada como chave da ordenação. 31. 33. Inserção. Essa operação é repetida tantas vezes quantas sejam o número de registros da tabela. 18. quando a informação é ordenada. int count) { int a. 2.. Troca. 29. printf("\n").h> void void void void void void void void selecao(int *p.. a>0. int count). Após j ter passado por toda a tabela. insercao((int *p. 32. 13. for (a=count-1. int left. } void print(int *p.n). Consiste em dois loops.n). shakesort(q. 13. 37. ORDENAÇÃO Ordenação é o processo de arranjar um conjunto de informações semelhantes numa ordem crescente ou decrescente. int count). e ele passa por cada item da tabela (do fim para o início). a<count. q=(int*)malloc(n*sizeof(int)). temp. int count). 20. } print(q. int count) { int i. 10. quando uma troca se torna necessária. i. 12. i++) { printf("x[%d]=". void shakesort(int *p. shell(int *p. a--) { if (p[a-1]>p[a]) { 68 . 15. print(p. 21. 11.i). qs(int *p. 3. printf("\nOrdenando. mas. Considerando-se o seguinte exemplo são apresentados os algoritmos de ordenação a int main(void) { int *q. b>=a. for (i=0. estes dois são trocados. 9. 36. 14. count). Caso seja maior que o próximo. 35. int count). i++) printf("%d ".13. 27. 34. p[i]). O loop j é o loop interno. quicksort((int *p. 28. se necessário. 42. 41. 6. int count). 25. e compara a si próprio (j) com o anterior (j+1). 24. 39.\n"). i<count. a++) for (b=count-1. 16.n). int count) { int a. } . troca(int *p. exchange. Geralmente. print(int *p. 38. Existem três método básicos para ordenar matrizes: • • • seguir: 1. 23. print(q. 19. Essa chave é utilizada nas comparações. 17. scanf("%d". 22. 8. 26. for (a=1. int count). a troca de dois elementos adjacentes. ele volta ao final e i é incrementado.1 Ordenação por Troca A ordenação por troca envolve repetidas comparações e. int right). 4. b. toda a estrutura de dados é transferida. 40.. 7. shakesort(int *p. return 0.h> #include <stdlib. i<n. &q[i]).

p[a]=temp. c. } } if (exchange) { p[c]=p[a].p[b-1]=p[b]. a<count-1. } 13. No início a sub lista ordenada é vazia e a outra contém todos os demais. quando todas as "cartas" foram inseridas. exchange=1. b. b<count. b++) { if (p[b]<temp) { c=b. for(b=(a+1). p[b]=temp. exchange=1. elas já 69 . p[a-1]=p[a]. p[a]=temp. uma contendo os itens já ordenados e a outra com os restantes ainda não ordenados. temp. a<count.No final do processo a sub lista ordenada apresentará (n-1) itens e a outra apenas 1. temp=p[b]. As etapas(ou varreduras) como já descrito acima consiste em buscar o maior elemento da lista não ordenada e colocá-lo na lista ordenada. Durante a aplicação do método de seleção a lista com n registros fica decomposta em duas sub listas. A idéia de funcionamento é semelhante ao ordenamento de cartas de baralho na mão de um jogador. A mão esquerda começa "vazia" e a mão direita insere uma "carta" de cada vez na posição correta.3 Ordenação por Inserção O algoritmo de ordenação por inserção é bastante simples e eficiente para uma quantidade pequena de números. em cada etapa. em selecionar o maior (ou o menor)elemento e alocá-lo em sua posição correta dentro da futura lista ordenada. p[a]=temp. exchange. void selecao(int *p. exchange=1. a++) { exchange=0. } } for (a=1. } } } temp=p[a-1].2 Ordenação por Seleção A ordenação por seleção consiste. } } } while (exchange). int count) { int a. for (a=0. temp=p[a]. p[a-1]=p[a]. c=a. Ao final. a++) { if (p[a-1]>p[a]) { temp=p[a-1]. } } } 13.

Durante o processo de ordenação por inserção a lista fica dividida em duas sub listas. o i-ésimo elemento é inserido em seu lugar apropriado entre os(i-1) elementos já ordenados. Ao terminar de passar por todos os elementos da lista. Neste algoritmo. 2o. p[j+gap] = x. for (a=1. k. gap. i<count. Isso é repetido até que o gap seja igual a 0. int count) { int i. começamos a procurar um elemento maior do que x. temp. ao invés dos dados serem comparados com os seus vizinhos. São então comparados os elementos 1o. x. for (i=gap. a cada etapa i.5 “Quicksort” O algoritmo de ordenação quicksort é um algoritmo de ordenação por troca. e assim por diante. count). Nos métodos de ordenação por inserção. j. x<p[j] && j>=0. b. p[b+1]=temp. O gap. b>=0 && temp<p[b]. } } } 13..1}. j=j-gap) p[j+gap] = p[j]. i++) { x=p[i]. No início.3. for (b=(a-1). o gap inicial é igual a 7. é igual à parte inteira da divisão do número de elementos da lista por 2. print(p.estão ordenadas. k<5. void shell(int *p. a sub lista ordenada é formada trivialmente apenas pelo primeiro elemento da lista. Por exemplo. até encontrarmos. A partir da posição 0. int count) { int a. } } 13. procurando um elemento menor do que x. b--) p[b+1] = p[b]. Baseia-se na escolha de um elemento central.. void insercao(int *p.2. se a nossa lista tem 15 elementos. 70 . a[5]={9.5. for (j=i-gap.4 “Shell Sort” O algoritmo de ordenação shell é um algoritmo de ordenação por inserção. uma com os elementos já ordenados e a outra com elementos ainda por ordenar. k++) { gap = a[k]. Shell em 1959. e 9o. o gap é diminuído em 1 e é feita uma nova passagem. a<count. O algoritmo foi criado por Donald L. é criado um gap. for (k=0. a++) { temp=p[a]. A maior parte dos elementos já vão para suas posições aproximadas. O mesmo processo ocorre a partir da posição n-1. e 8o. no início.

j=right. if (i<right) qs(p. } void qs(int *p. left. int right) { int i. int left. if (left<j) qs(p. while ((x<p[j]) && (j>left)) j--. } 71 . até que i>=j. j. i++. do { while ((p[i]<x) && (i<right)) i++. j). i. até termos um subconjunto com um único elemento. p[i]=p[j]. if (i<=j) { y=p[i]. O processo se repete de forma recursiva para cada subconjunto (esquerda e direita do elemento x). y. x=p[(left+right)/2]. void quicksort(int *p. count-1). right). j--. x. 0.Quando o índice da esquerda (i) for menor do que o índice da direita (j). i=left. } }while (i<=j). int count) { qs(p. trocamos estes valores. p[j]=y.

72 .1 Ilustração exemplo da função push. ESTRUTURAS DE DADOS Um programa consiste de duas coisas: algoritmos e estruturas de dados.14. o último item colocado na pilha será o primeiro a ser removido. 14. Árvores Binárias. existem basicamente quatro tipos de estruturas: • • • • Pilha. A P G U W W U G P A A P A G P A U G P A Figura 14. respectivamente. Listas. A estrutura de dados é importante para armazenar os dados e recuperá-los.2 Ilustração exemplo da função pop. isto é. Filas. quando necessário. As duas operações básicas (armazenar e recuperar) são tradicionalmente chamadas de push e pop. First-out). W U G P A U G P A G P A P A A Figura 14. de forma automática em uma ordem predeterminada.1 Pilhas Pilhas são estruturas de armazenagem e recuperação de dador em ordem LIFO (Last-in. De acordo com a forma de acesso (armazenamento e recuperação) aos dados.

73 . distribuição de eventos.1 Filas Circulares Quando uma Fila atinge o limite do vetor de armazenamento.2. X X Y Z X Y Y Z X X Y Z Z Y X Y Z Z Figura 14.2 Filas Filas são estruturas de armazenagem e recuperação de dados em ordem FIFO (First In. não é mais possível colocar nenhum item na fila. As filas podem ser utilizadas em simulações. First Out).3 Ilustração função entra e função sai de uma fila. Desta forma. entre outros. o primeiro item colocado na fila será o primeiro a ser removido. Um melhoramento das Filas simples seria a Fila Circular. A fila opera utilizando duas funções: entra e sai.14. 14. isto é.

uma lista encadeada.4). A adição de um nó pode ser realizada no início ou ao longo de uma lista ligada. c) Devido ao nó ser incluído no início da lista. 14. desde que itens também estejam sendo retirados (Fig.qualquer número de itens poderia ser colocado na fila. A adição de um nó no início de uma lista ligada é realizada em quatro etapas: a) Um nó vazio é criado. Ele está vazio no sentido de que o programa que realiza a inserção não atribui quaisquer valores aos campos de dados do nó. A B Figura 14. As listas encadeadas podem ser singularmente (simples) ou duplamente encadeadas. 14.3.4 Ilustração de uma fila circular. Cada porção de informação é armazenada em um item de informação e que carrega consigo um elo ao próximo item de informação. o elo proximo se torna um ponteiro para o primeiro nó da lista. Cada item de informação consiste em uma estrutura que inclui campos de informação e ponteiro de enlace. o valor corrente de topo.1 Listas Singularmente Ligadas Uma lista singularmente encadeada requer que cada item de informação contenha um elo com o próximo item da lista. b) O campo info do nó é inicializado com um valor em particular.3 Listas Ligadas São estruturas de armazenagem e recuperação de dados de forma randômica. 14. isto é. ou seja. 74 .

A operação de remoção consiste em remover um nó do início ou ao longo da lista e retornar o valor armazenado nela. o elo proximo do anterior do nó corrente aponta para o novo nó e. Consequentemente. d) A remoção de um nó no meio de uma lista deve ser realizada somente após efetuar as ligações necessárias afim de manter a consistência da lista.d) O novo nó precede todos os nós da lista. mas esse fato tem que ser refletido no valor do Primeiro. o ponteiro Primeiro deve ser atualizado. 1 2 5 8 4 Primeiro Figura 14. Deve-se observar que: a) Não se pode remover um nó de uma lista vazia. b) A remoção de um único nó de uma lista ligada de apenas um nó.5 Ilustração de uma lista singularmente ligada. A A A Primeiro (1) Tmp Primeiro (2) Tmp Primeiro (3) 75 . d) Ao determinar a posição de inserção. b) O campo info do nó é inicializado com um valor em particular. c) Percorre a lista comparando o campo info do novo nó com cada nó da lista. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro. o elo proximo do novo nó aponta para o elo proximo do nó corrente. Ele está vazio no sentido de que o programa que realiza a inserção não atribui quaisquer valores aos campos de dados do nó. o ponteiro Primeiro é atualizado para se tornar o ponteiro para o novo nó. O processo de adicionar um novo nó ao longo da lista de forma ordenada é realizada em quatro etapas: a) Um nó vazio é criado.

C S R A A Primeiro (1) Tmp C S R A A Primeiro (2) Tmp C S R A A Primeiro (3) 76 .Figura 14.7 Ilustração de inserção em uma lista singularmente ligada.6 Ilustração de inserção em uma lista singularmente ligada. C A C A C A Tmp (1) Primeiro Tmp (2) Primeiro Primeiro (3) Figura 14.

8 Ilustração de inserção em uma lista singularmente ligada.2 Listas Duplamente Ligadas Uma lista duplamente ligada (ou lista linear duplamente ligada) consiste em dados e elos para o próximo item e para o item precedente. d) ponteiro Ultimo recebe novo nó.Figura 14. no fim da lista. O processo para a inserção no fim da lista é realizado em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). A vantagem de possuir dois elos são: • • A lista pode ser lida em ambas as direções. O processo para a inserção no início da lista é realizado em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). a lista pode ser reconstruída utilizando-se o outro elo. b) O elo proximo do novo nó recebe Primeiro. O processo de adicionar um novo nó ao longo da lista duplamente ligada de forma ordenada é realizada em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). 77 .3. no meio da lista. c) O elo proximo apontado por Ultimo recebe novo nó. 14. Se um dos elos tornar-se inválido. A inserção de um nó de forma ordenada em uma lista duplamente ligada pode ser realizada basicamente de três formas: • • • no início da lista. b) O elo anterior do novo nó recebe Ultimo.8 Ilustração de uma lista linear duplamente ligada. 1 9 3 5 Primeiro Último Figura 14. d) O ponteiro Primeiro recebe novo nó. c) O elo anterior apontado por Primeiro recebe novo nó.

c) Percorre a lista comparando o campo info do novo nó com cada nó da lista. o elo anterior do nó corrente aponta para o novo nó. O elo proximo do novo nó aponta para o nó corrente e. A operação de remoção consiste em remover um nó do início.b) O campo info do nó é inicializado com um valor em particular.9 Ilustração de inserção em uma lista duplamente ligada. O elo anterior do novo nó aponta para o anterior do nó corrente. d) Ao determinar a posição de inserção. 78 . o elo proximo do anterior do nó corrente aponta para o novo nó. S S Primeiro (1) Ultimo Primeiro (2) Ultimo E S tmp Primeiro (3) Ultimo S S S S tmp Primeiro (4) Ultimo Primeiro (5) Ultimo Figura 14. do fim ou ao longo da lista e retornar o valor armazenado nela. Deve-se observar que: a) Não se pode remover um nó de uma lista vazia.

subárvore esquerda e subárvore direita. Em cada nó contém um registro. Se um nó está no nível i então a raiz de suas subárvores estão no nível i+1. 79 . Árvore binária são árvores de grau 2. Cada elemento de uma árvore binária é chamado nó da árvore.4 Árvores Binárias Árvore binária é um conjunto finito de elementos que está vazio ou é particionado basicamente em três subconjuntos disjuntos: raiz. 14. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro. O nível do nó raiz é 0. O número de subárvores de um nó é chamado grau daquele nó. d) A remoção do ultimo nó da lista com pelo menos dois nós exige a atualização do ponteiro Ultimo. e) A remoção de um nó no meio de uma lista deve ser realizada somente após efetuar as ligações necessárias afim de manter a consistência da lista. para cada nó. a seguinte propriedade é verdadeira: • • • • • • Todos os registros com chaves menores estão na subárvore esquerda e todos os registros com chaves maiores estão na subárvore direita. Uma outra construção possível é a lista circular ligada que pode conter ou não a indicação para o início da lista 1 9 3 5 Início Figura 14. Os outros nós são chamados de nó interno. Grau de uma árvore é o mais alto dentre os graus de seus nós.b) A remoção de um único nó de uma lista ligada de apenas um nó. o ponteiro Primeiro e Ultimo deve ser atualizado.9 Ilustração de uma lista circular duplamente ligada com cabeçalho. e. Um nó de grau zero é chamado de nó externo ou folha.

a raiz e. Isto é. cada nó é visitado da subárvore da esquerda. cada nó é visitado da raiz. Considerando-se o exemplo da figura 14. podem representar processos decisórios. a subárvore da direita. a subárvore da direita. cada subárvore é ela própria uma árvore.10 Ilustração de uma árvore binária. a subárvore da direita e. A maioria das funções que usam árvore é recursiva porque a própria árvore é uma estrutura de dados recursiva. O procedimento de acesso a cada nó na árvore é chamado de transversalização da árvore.11. A profundidade é o número de arestas da raiz até um determinado nó. a subárvore da esquerda e. permitem o uso de listas ligadas e a divisão de um conjunto de dados em subconjuntos. em seguida. 18 e 23 Nível 4: 6 Nível 5: 7 Altura da árvore: 7 Figura 14. a raiz. depois. Raiz: 15 Grau da árvore: 2 Nível 0: 15 Nível 1: 5 e 16 Nível 2: 2. Usando a forma ordenada. pré-ordenada e pósordenada. 13. Com a pós-ordenada. Embora árvores sejam fáceis de visualizar.• • • A altura de um nó é o comprimento do caminho mais longo deste nó até um nó folha. A altura de uma árvore é a altura do nó raiz. elas apresentam alguns problemas difíceis de programação. As árvores podem ser utilizadas para administrar grandes quantidades de dados em uma ordem qualquer. As subárvores (sucessores diretos) da raiz possuem profundidade 1. cada nó é visitado da subárvore da esquerda. a ordem de acesso à árvore usando cada método é: d Ordenada a b c d e f g Pré-ordenada d b a c f e g Pós-ordenada a c b e g f d a b f c e g 80 . Existem três maneiras de percorrer uma árvore: de forma ordenada. administrando-as de forma hierárquica. A raiz possui profundidade 0. Um nó no nível n possui a profundidade n. 12 e 20 Nível 3: 10. Além disso. em seguida. Na maneira pré-ordenada.

Figura 14. 81 . Elaborar as funções para armazenar e recuperar dados em uma fila. 4. Elaborar um programa que simule o armazenamento e recuperação de uma pilha. Elaborar as funções pop() e push() de uma pilha. Elaborar um programa que simule uma fila de atendimento.11 Exemplo de árvore binária. 3. 14. Uma árvore binária ordenada é aquela em que a subárvore da esquerda contém nós que são menores ou iguais à raiz e os da direita são maiores que a raiz. 2.5 EXERCÍCIOS 1.

Lourenço. Tenenbaum.E. Editora Bookman.V.Edição Americana.V. “C Completo e Total” 3ªEdição Makron Books Ltda. São Paulo/SP. Campos.. 2002. D.. “Fundamentos da Programação de Computadores . E. Angerami. D. 2000.. Stroustrup. 1984. São Paulo/SP. São Paulo/SP.Edição.L.15. BIBLIOGRAFIA Arakaki. R.. MacGraw-Hill International. São Paulo.M. R. H.. 82 . Choueri Júnior. Alves Cruz.M. E. Editora Érica. Langsam.H.A. C. Ferreira. Aoki. O. Editora Campus.Módulo 2”.C. Porto Alegre/RS. Salles.J. Mizrahi. Rio de Janeiro/RJ.. Arakaki.R.. 2002. Pressman. Stein. “Estrutura de Dados e Algoritmos em C++”.S. A. “A Linguagem de Programação C++”. 1992. Leiserson. “Treinamento em Linguagem C++ . 1996. “Matemática Básica”. Rio de Janeiro/RJ.. Ince. P.. B. 2000. A. São Paulo/SP. Berkshire/UK.. 1994. Livros Técnicos e Científicos Editora... 1997.C. 1999.S. Editora Pioneira Informática. “Software Engineering: A Practitioner’s Approach (European Adaptation)” 5thEdition. Rio de Janeiro/RJ. “Estruturas de Dados Usando C” Makron Books Ltda.L. Augenstein. Y. Ascencio. 2002... R. Editora Pioneira Thomson. 1995. A. T. “Circuitos Digitais” 3ªEdição. Editora Prentice Hall.F. São Paulo/SP. Loudon.Teoria e Prática”. J. “Projeto de Algoritmos com Implementações em Pascal e C” 4ªEdição. Tradução da 2ª.. A. C. Neto. Drozdek. K. V.G. S. Ziviani. Schildt. “Fundamentos de Programação C: Técnicas e Aplicações” 2ªEdição. 3ª. São Paulo/SP. “Dominando Algoritmos com C” Editora Ciência Moderna. S. Editora Atual. A. “Algoritmos . N. Cormen. M. Editora Makron Books.Algoritmos. Rivest. Pascal e C/C++”. 2000.

1 Tabela ASCII 83 .16. APÊNDICE 16.

4 centenas. Para a compreensão de um circuito digital até um computador são importantes três sistemas numéricos: Sistema Decimal (base 10): O sistema decimal ou base 10 é o sistema mais utilizado no diaa-dia. Por exemplo. Para a representação de quantidades maiores que a base adota-se pesos para cada posição do algarismo. n = quantidade de algarismos –1. 84 .16. É um sistema muito utilizado em circuitos lógicos e aritméticos. ou de acordo com a lei de formação: 3452 = 3 * 10 3 + 4 * 10 2 + 5 * 101 + 2 * 10 0 Sistema Binário (base 2): O sistema binário ou base 2 utiliza apenas dois símbolos para representar qualquer quantidade: 0 1. Em um determinado momento ao longo desse processo. por 3 milhares. Para medir essas grandezas o homem criou os sistemas numéricos. Os números de todos os sistemas numéricos podem ser decompostos de acordo com a lei de formação: Número = an * bn + an −1 * b n −1 + an − 2 * bn − 2 + K + a0 * b0 onde: an = algarismo. o tempo é medido utilizando um sistema de 24 unidades para as horas. um sistema de 12 unidades para os meses e um sistema de 10 unidades para os anos.2 Sistema Numérico O homem é resultado contínuo da sua própria evolução. surgiu a necessidade de medir grandezas. b = base do número. Utiliza 10 símbolos (algarismos) para representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9. isto é. o número 3452 é composto 4 algarismos. 5 dezenas e 2 unidades. Sistema Hexadecimal (base 16): O sistema hexadecimal ou base 16 possui 16 símbolos para representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9 A B C D E F. Por exemplo. um sistema de 60 unidades para minutos e segundos. É um sistema muito utilizado na área de microprocessadores. Cada algarismo ou dígito de um número binário é chamado de bit (binary digit).

. Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .1 . correspondem ao número na base b. Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 .. (58)10 = (?) 2 58 / 2 = 29 resto = 0 29 / 2 = 14 resto = 1 14 / 2 = 7 resto = 0 7 / 2 = 3 resto = 1 3 / 2 = 1 resto = 1 (58)10 = (111010) 2 (58)10 = (?)16 58 / 16 = 3 resto = 10 (58)10 = (3A)16 85 . tomados na ordem inversa..3 Conversão entre Bases Para converter um número de um sistema numérico qualquer para a base decimal. divide-se o número por b sucessivamente até que o quociente da divisão seja menor que b. 16. basta aplicar a lei de formação: (1001) 2 = 1 * 2 3 + 0 * 2 2 + 0 * 21 + 1 * 2 0 = (9)10 (3A )16 = 3 * 161 + A * 160 = 3 * 16 + 10 * 1 = (58)10 Dado um número inteiro na base 10. O último quociente da divisão e os restos das divisões sucessivas.Equivalência entre os sistemas numéricos.. para obter o equivalente em uma base b qualquer. Binário 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 ..A equivalência entre os números dos três sistemas numéricos é apresentado na seguinte tabela: Tabela 16..

a parte inteira é convertida separadamente pelo processo das divisões sucessivas. m = quantidade de algarismos da parte fracionária.000 → Fim (37.500 * 2 = 1. Esta relação vem do fato que o número 16 pode ser escrito como 24. A parte inteira resultante dos produtos formará os dígitos da parte fracionária do número convertido.750 * 2 = 1. (8. b = base do número.375)10 = (1000.0625 *16 = 1 → 1 0. A parte fracionária é utilizado o processo das multiplicações sucessivas pela base desejada.750 0.0625)10 = (?)16 (37)10 = ( 25)16 0.0625)10 = (25. A lei de Formação para números fracionários é: Número = an * b n + an −1 * b n −1 + an−2 * b n−2 + K + a0 * b0 + a−1 * b −1 + a−2 * b −2 + K + a−m * b − m onde: an = algarismo. (3A )16 = (?) 2 3 → 0011 A → 1010 (3A )16 = (00111010) 2 (111010) 2 = (?)16 0011 → 3 1010 → A (111010) 2 = (3A )16 A conversão de números fracionários é realizada por partes: a parte inteira e a parte fracionária.375 * 2 = 0. Para a conversão de base 10 para base 2 ou base 16.1)16 0.000 → Fim (8.Existem uma relação estreita entre o sistema binário e o hexadecimal.000 →0 →1 →1 (37. n = quantidade de algarismos da parte inteira –1.500 0.375)10 = (?) 2 (8)10 = (1000) 2 0.011) 2 86 .

Sign up to vote on this title
UsefulNot useful