Curso de Linguagem C Em Constru¸ao c˜ v0.

001
Adriano Joaquim de Oliveira Cruz Instituto de Matem´tica a N´cleo de Computa¸˜o Eletrˆnica u ca o UFRJ c 2006 Adriano Cruz 28 de Dezembro de 2007

2

Conte´ do u
1 Introdu¸˜o ca 1.1 1.2 Sucessos e Fracassos da Computa¸˜o . . . . . . . . . . . . . . . . ca Um Pouco da Hist´ria da Computa¸˜o . . . . . . . . . . . . . . . o ca 1.2.1 1.2.2 1.2.3 1.2.4 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.4 1.5 O In´ ıcio . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Era Moderna . . . . . . . . . . . . . . . . . . . . . . . . O Desenvolvimento durante as Grandes Guerras . . . . . As Gera¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . co Microcomputadores . . . . . . . . . . . . . . . . . . . . . Mem´rias . . . . . . . . . . . . . . . . . . . . . . . . . . . o Bits e Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . Perif´ricos . . . . . . . . . . . . . . . . . . . . . . . . . . . e 19 19 21 21 22 24 27 27 29 30 32 33 33 38 41 41 43 44 45 45 46 47 49 49

O Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

O Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um programa em C . . . . . . . . . . . . . . . . . . . . . . . . .

2 Algoritmos 2.1 2.2 2.3 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Primeiros Passos . . . . . . . . . . . . . . . . . . . . . . . . . . . Representa¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 2.3.1 2.3.2 2.3.3 2.4 2.5 Linguagem Natural . . . . . . . . . . . . . . . . . . . . . . Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . Pseudo-Linguagem . . . . . . . . . . . . . . . . . . . . . .

Modelo de von Neumann . . . . . . . . . . . . . . . . . . . . . . . Estruturas B´sicas de Algoritmos . . . . . . . . . . . . . . . . . . a 2.5.1 Comandos de leitura . . . . . . . . . . . . . . . . . . . . . 3

4 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.6

´ CONTEUDO Comandos de escrita . . . . . . . . . . . . . . . . . . . . . Express˜es . . . . . . . . . . . . . . . . . . . . . . . . . . o Comandos de atribui¸˜o . . . . . . . . . . . . . . . . . . . ca Comandos de controle . . . . . . . . . . . . . . . . . . . . Comandos de repeti¸˜o . . . . . . . . . . . . . . . . . . . ca 50 51 53 53 54 56 63 63 63 63 64 64 66 67 67 68 68 70 70 71 71 72 73 75 75 75 76 77 79 82 82 83 84 84 86

Exemplos de Algoritmos . . . . . . . . . . . . . . . . . . . . . . .

3 Tipos de Dados, Constantes e Vari´veis a 3.1 3.2 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 3.2.2 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.4 3.5 3.4.1 3.5.1 3.5.2 3.5.3 Tipos B´sicos . . . . . . . . . . . . . . . . . . . . . . . . . a Modificadores de tipos . . . . . . . . . . . . . . . . . . . . Constantes Inteiras na base 10 . . . . . . . . . . . . . . . Constantes Inteiras Octais . . . . . . . . . . . . . . . . . . Constantes Inteiras Hexadecimais . . . . . . . . . . . . . . Convers˜o entre Bases . . . . . . . . . . . . . . . . . . . . a Constantes em Ponto Flutuante . . . . . . . . . . . . . . . Constantes Cadeias de Caracteres . . . . . . . . . . . . . Nomes das Vari´veis . . . . . . . . . . . . . . . . . . . . . a Declara¸˜o de vari´veis . . . . . . . . . . . . . . . . . . . ca a Atribui¸˜o de valores . . . . . . . . . . . . . . . . . . . . . ca

Constantes Num´ricas . . . . . . . . . . . . . . . . . . . . . . . . e

Constantes Caracteres . . . . . . . . . . . . . . . . . . . . . . . . Vari´veis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a

4 Entrada e Sa´ pelo Console ıda 4.1 4.2 4.3 4.4 4.5 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Biblioteca Padr˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . a Sa´ - A Fun¸˜o printf . . . . . . . . . . . . . . . . . . . . . . ıda ca 4.3.1 C´digos de Convers˜o . . . . . . . . . . . . . . . . . . . . o a Entrada - A Fun¸˜o scanf . . . . . . . . . . . . . . . . . . . . . . ca Lendo e Imprimindo Caracteres . . . . . . . . . . . . . . . . . . . 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 Fun¸˜es getchar e putchar . . . . . . . . . . . . . . . . . co Lendo e Imprimindo Cadeias de Caracteres . . . . . . . . Lendo e Imprimindo cadeias com scanf e printf . . . . . Lendo e Imprimindo cadeias com gets e puts . . . . . . . A Fun¸˜o fgets . . . . . . . . . . . . . . . . . . . . . . . ca

. . . . . . . . .5. . . . . . . . .3. . . . . . .5 Comandos de Desvio . .9 Operadores Relacionais . . . . . . . . . . . . . . . . . . . 111 Comando do-while .5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6. . . . . . . . . . . . . . . . . . e 6 Comandos de Controle 6. . 5 89 89 89 90 91 91 92 94 96 96 97 97 99 101 Operadores com Bits . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . . . . . .3 Comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 La¸os de Repeti¸˜o . . . . . . . . . . . . 113 Comando continue . . . . . . . . . . . . . . . .2 5. . . . . . . . . . . . . . . . . 106 c ca 6. . . . . . . . . . 106 a 6. . . . .1 6. . . .6 5. . . . . . . . . . . . . . . . . . . . . . . . . .10 Regras de Precedˆncia . . . . . . . . . . .4. . .3 5. . . . . . . . . 101 ca Blocos de Comandos . . . . . . . . . . . . . . . . . .1 6. . Operadores L´gicos o . . . 106 Comando while .5. . . . .5 Comando break . . . . . . a 5.1 5. . . . . . . . . . . ca Operadores Aritm´ticos . 114 Fun¸˜o exit() . . . . . . . . . . . 102 Comando switch . . . . . . .1 5. . . . . . .3 Comando if . . . . . .3. . . . . . . . . . . . . 114 ca Comando return . .3 6. . . . . . . Convers˜o de Tipos . . . . . .2 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . 101 Comandos de Teste . . .5. . . . . . . . . . . . . . . . . . . ca Operador de Atribui¸˜o . . . . . . . . . . . .´ CONTEUDO 5 Operadores e Express˜es o 5.3 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de Atribui¸˜o Composta . . . 103 Comando Tern´rio . .2 5. . . 114 Comando goto . . . . . . . .5. . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . .4. . . . . .4. . . .5 5. . . . . . . .2 6. o 5.1 6. . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 6. . . ca Operador v´ ırgula . . .8 5. . . . . . . . . Operador sizeof() . . . . . . . .4 Introdu¸˜o . . . 113 6. . 102 6. . . . . . .7 5. . . . . . .2 6. . . . . . . . . . . . . . . . . . . . .4 6. .2 6. e Operadores Relacionais e L´gicos . . . . . .

. . . . . . .5 8. . .2 Opera¸˜es com Ponteiros co 9. . .6 9. . 127 ca 133 8 Fun¸˜es co 8. .3 Passagem de Parˆmetros por Valor . . . . . .1 8. . . 160 Vetores de Ponteiros . . . . . . . . . 152 ca Incrementando e Decrementando Ponteiros . . . . . . . . . . . . . . . . . . . . . .6 Introdu¸˜o . . . . .7 8.6 ´ CONTEUDO 117 Introdu¸˜o . . . . . . . .8 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . 140 a e Passagem de Vetores e Matrizes . . . . . . .1 8. . 138 a Parˆmetros Formais . . 139 a 8. . .1 9. . .2. . . . 156 Ponteiros e Cadeias de Caracteres Aloca¸˜o Dinˆmica de Mem´ria . . . . . . . 136 a 8. . . . . . . . . . . . . .2. . .2. . . . . . . . 117 ca Cadeias de Caracteres . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . .4. . .2 8. . . . . . . . . . . . . . . . . . . . . . . 151 9 Ponteiros 9. . . . . . . . . . .4 8. 124 Vetores de Cadeias de Caracteres . . . . . . . 163 Ponteiros para Ponteiros . . . . . . . . . . . . . . . . . . . . 141 8. . . . . . . . . 125 Inicializa¸˜o de Vetores e Matrizes . . . . . . . . .4 9. . . . . . 135 o co Escopo de Vari´veis . . . . . . . . . 144 Recurs˜o . . . . . . . . 154 Compara¸˜o de Ponteiros . . . . . . . . 136 a Vari´veis Globais . . . . 144 a Argumentos . . . . . . 134 Prot´tipos de Fun¸˜es . .7 9. .5 7. . . . .2 8. .2 9. . . . .1 Vari´veis Locais . . . . . . . . . . . 149 ca Declara¸˜o de Ponteiros . . . . . . . . . . . . . . . . . . . . . . . .8 Introdu¸˜o . . . 163 . . . . . . . . . . . . . . . . . . .4 7. . . . . . . . .6. . . . . . 156 ca . . . . . . . 145 149 . . . . . . . . 117 ca Declara¸˜o de Vetores Unidimensionais . .2. . . . 152 Atribui¸˜o de Ponteiros . . . . . . . . . . . . . . . . . . . .3 8. . . . . . . . . . . . . . . . . 133 ca Forma Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 O Comando return . . . . . . . . . .argc e argv . .3 7. . 139 a Passagem de Parˆmetros por Referˆncia . . . . . . . . . . . . . 151 ca Os Operadores Especiais para Ponteiros . . . . . . . . . .5 9. . . . . 158 ca a o Ponteiros e Matrizes . . . . . . . . . . . . .1 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Declara¸˜o de Vetores Multidimensionais ca . . . . .6 7 Vetores e Cadeias de Caracteres 7. . . . . . . . . . . . . . . . . . 157 Ponteiros e Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 7.5 9. . . . . . .3 9. . . . . . . .4 9. . . . . . . . . . . . . . . . . . . . . .3 9. . . . .2 7. . . . . . . .6. .

. . . . 194 11. 188 ıcio 11. . . . . . . . . . . . . 186 a 11. . . . . . . . . . . .2 Fechando um Arquivo . . . . . . . . . . . 174 co 10. . .2 Fluxo Bin´rio . . . . . . . . . . . . . . . . . . . 187 11.1 Abrindo um Arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 ca 10. . .1 Introdu¸˜o . . . . . . . . . . 190 11. . . . 176 11 Entrada e Sa´ por Arquivos ıda 185 11. . . . . . .1 Introdu¸˜o . . . . . . . . . . . . . . . . .3 Arquivos . . .3 Fun¸˜es de Entrada e Sa´ co ıda . . . . . . . . . . . . . . . . . . . .4 Matrizes de Estruturas . . . . . . . . . . . . . . 194 11. . . . . . . . . . .1 Fluxos de Texto .5 Lendo e Escrevendo Caracteres . . . . . . . . . . . . . . . . 187 11. . . . . . . . . . . .2. . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . .8 Entrada e Sa´ Formatada . . . . 190 11. . . . . . . . . . . . . . . . . .6 Testando Erros . . . . . . . . . . 189 11. . . . . 185 ca 11. . . . . . 198 a A Tabela ASCII B Palavras Reservadas 205 207 . . . . . . .7 Lendo e Escrevendo Cadeias de Caracteres . . . . . . . .4. . . . .2 Fluxos de Dados . . . . . . . 171 co a 10. . . .6 Ponteiros para Estruturas . . 188 11. 195 ıda 11. . . . .2 Defini¸˜es B´sicas . . . . . . . . . . . . . . .3 Atribui¸˜o de Estruturas . . . . . . . . 174 10. . . . . . . .5 Estruturas e Fun¸˜es . . 185 11. .4. . . . . . . . . . .´ CONTEUDO 10 Estruturas 7 171 10. . . . . . . . .9 Lendo e Escrevendo Arquivos Bin´rios . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . 185 11. . . . . . . . . . . . . . . . .4 Volta ao In´ ıcio . . . . . . . . . . . . . . . . . . . . . . . .4 In´ e Fim . . . . . 171 ca 10. . . . . . . . . 191 11. . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Fim de Arquivo . . . . . . . . . . . . . . . . . . . .

8 ´ CONTEUDO .

. . . . . . .1 1. .4 1. . . . . 2. . .2 9. . . . . . . 20 Imagem de um ´baco. . Fluxograma para decidir se deve levar um guarda-chuva. . . . . .7 1. 154 co 9 . . . . . . . . . a Fluxograma do comando se .8 1. .6 S´ ımbolos mais comumente usados em fluxogramas. . . . . . . . .3 9. . . a N´ ıveis de hierarquia da mem´ria de um computador. . . . . . . . . . . .2 2. . . . .. . . . . . . . 125 o Mapa de mem´ria com duas vari´veis e ponteiro.9 Fotografia de um circuito integrado de microprocessador Pentium. a sen~o. . . . . . . . . . . . . . Diagrama B´sico de um Computador Digital . . . . . Fluxograma do comando enquanto. . . . . .6 7. . . . a Blaise Pascal . . . . . . . . . . . .10 Ciclo de desenvolvimento de um programa. . .6 1. . . . . . 152 ca c a Uso de um ponteiro para copiar valor de uma vari´vel. . . . . . . . . . Fotografia da Difference Engine . . . . . . . . . . . . . . . . . .1 9. . . . . . . . . . . . . . . . . . . . . . o Tamanho de Bits.5 1. . . . . . . . . . . . . . .5 2. . . . . . Fluxograma para resolver uma equa¸˜o do primeiro grau. . . .. . . . . . . . . . . . . .4 9. . ca Modelo de mem´ria o .4 2. . . ent~o . . . . . . . 151 ca Atribui¸˜o de endere¸o de uma vari´vel a um ponteiro. Charles Babbage . . . . .Lista de Figuras 1. . .3 2. .5 9. . . . 22 22 23 23 26 28 30 32 36 45 46 49 54 56 57 1. . . . . . . . . . . . .2 1. . . . . Bytes e Palavras . . . . . . . . . . . . . . . . . . Mapa de mem´ria de uma matriz. . . . 149 o a Ponteiro apontando para ´rea de mem´ria contendo vetor. . . . . . . . . . . . . . . . . .3 1. .. . . . . 153 a Exemplos de atribui¸˜es de ponteiros. . . . . . 150 a o Declara¸˜o de ponteiros.. . . . .1 2. . . . . . . . . . Computador Eniac .1 9. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . 186 . .10 9. . . . .1 Fluxos de dados. . . . . . . . . . . . 165 11. . . .7 LISTA DE FIGURAS Armazenamento de matrizes com vetores de ponteiros. . . . . .

Lista de Tabelas
1.1 1.2 1.3 1.4 1.5 2.1 3.1 3.2 3.3 3.4 3.5 3.6 3.7 4.1 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 Transistores por chip nos microprocessadores da Intel . . . . . . 20 26 29 33 33 53 65 66 67 67 70 70 71 77 90 91 92 93 94 94 94 95

Tempo de execu¸˜o das instru¸˜es aritm´ticas no ENIAC . . . . ca co e Exemplos de Microprocessadores . . . . . . . . . . . . . . . . . . Abrevia¸˜es usadas em referˆncias `s mem´rias. . . . . . . . . . . co e a o Exemplos de perif´ricos . . . . . . . . . . . . . . . . . . . . . . . e Operadores Aritm´ticos. . . . . . . . . . . . . . . . . . . . . . . . e Tipos de dados definidos pelo Padr˜o ANSI C. . . . . . . . . . . a Constantes Inteiras na Base 10 . . . . . . . . . . . . . . . . . . . Constantes octais . . . . . . . . . . . . . . . . . . . . . . . . . . . Constantes hexadecimais . . . . . . . . . . . . . . . . . . . . . . . Constantes em ponto flutuante . . . . . . . . . . . . . . . . . . . Exemplos de constantes caractere . . . . . . . . . . . . . . . . . . Exemplos de caracteres invis´ ıveis. . . . . . . . . . . . . . . . . . . C´digos de Convers˜o para leitura e entrada de dados. . . . . . . o a Operadores aritm´ticos. . . . . . . . . . . . . . . . . . . . . . . . e Operadores Relacionais. . . . . . . . . . . . . . . . . . . . . . . . Operador L´gico E. . . . . . . . . . . . . . . . . . . . . . . . . . . o Operador L´gico OU. . . . . . . . . . . . . . . . . . . . . . . . . . o ~ Operador L´gico NAO. . . . . . . . . . . . . . . . . . . . . . . . . o Precedˆncia dos operadores l´gicos e relacionais. . . . . . . . . . e o Operadores com bits. . . . . . . . . . . . . . . . . . . . . . . . . . Operador L´gico OU. . . . . . . . . . . . . . . . . . . . . . . . . . o 11

12 5.9 7.1

LISTA DE TABELAS Precedˆncia dos operadores. . . . . . . . . . . . . . . . . . . . . . e 99

Passos executados durante o algoritmo da bolha. . . . . . . . . . 120

11.1 Exemplos de fun¸˜es de Entrada e Sa´ co ıda. . . . . . . . . . . . . . 188 A.1 Conjunto de caracteres ASCII . . . . . . . . . . . . . . . . . . . . 205 A.2 Conjunto de c´digos especiais ASCII e seus significados . . . . . 206 o

Lista de Algoritmos
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Exemplo de Algoritmo. . . . . . . . . . . . . . . . . . . . . . . . . Algoritmo para resolver uma equa¸˜o do primeiro grau. . . . . . . ca Algoritmo para calcular a m´dia das notas de um aluno. e . . . . . Algoritmo para calcular a maior nota de um grupo de notas. . . . Modelo de mem´ria e funcionamento de um algoritmo . . . . . . . o Comando se em pseudo-linguagem . . . . . . . . . . . . . . . . . . Algoritmo para decidir o que fazer no domingo. . . . . . . . . . . Algoritmo para decidir se deve levar um guarda-chuva. . . . . . . Algoritmo para ler 10 n´meros e imprimir se s˜o pares ou n˜o. . . u a a 43 44 45 47 48 54 55 55 58 59 60 60 61 69

2.10 Algoritmo para ler n´meros e imprimir se s˜o pares ou n˜o. . . . . u a a 2.11 Algoritmo para calcular a maior nota de uma turma de 25 alunos. 2.12 Algoritmo para calcular a nota m´dia de uma turma de 25 alunos. e 2.13 Algoritmo para calcular a maior temperatura do ano. . . . . . . . 3.1 Algoritmo para converter inteiros na base 10 para uma base b. . .

13

14

LISTA DE ALGORITMOS

. . . . . . . . . . . . . . . . .5 4. . . . . . 104 . . Exemplo de switch. . . . . . . . . . . 121 Exemplo de vetores. . . . . . . Comando for aninhados. . 123 co . . . . . . . . . 108 a Exemplo de comando for. . . . . . . . . . . . . . . . . . . .2 6. . . . . . . . . . . . . . . . . . . . . . . .8 5. . . . . . 110 a Exemplo de comando for sem altera¸˜o da vari´vel de controle. . . . . . . . . . . . . . . . . ca a Exemplo de comando for sem teste de fim. . . .6 6. Ordena¸˜o pelo m´todo da bolha. . . . . . . 118 Exemplos de fun¸˜es para cadeias. . . . . . . . . . . . . . . . .1 6. . . . . . 111 .1 4. . . . .2 7. . . . . . . . . . . Comando while com uma fun¸˜o. . . . . . . .3 4. . . .2 4. Exemplo de uso de getchar e putchar. . . . 110 . . . .1 7. . ca Produto escalar de dois vetores. . . . . . . . . . . . Exemplo de uso de getchar e putchar. . . . . . . . . . . .7 6. . . . . . Exemplo de uso de printf e scanf na leitura de cadeias. . . . . . . . . . . . . . . . . . . . . . a Exemplo de justifica¸˜o de resultados. ca Exemplo de uso de especificador de precis˜o. . Exemplo do operador sizeof. . .1 4. . . . . . 124 15 . . . . . . . . Exemplo de uso de puts e gets na leitura de cadeias. . . . . Exemplo de operadores de deslocamento. . . . .4 4. . . . . . . . . . . . . . . . . . . . .2 6. . .5 6. 109 Exemplo de comando for com testes sobre outras vari´veis. . . . 111 . . . . . . . . . . . . . . . .Listings 1. . . . . . . . .1 5. . . . . . . . .3 7. . . . . . . . . . . . .6 4. . . . . .4 6. . Exemplo de impress˜o de resultados . . 107 Exemplo de comando tern´rio. . . 112 . . . . . . . . . .9 7. . . . . .7 4. . .5 Exemplo de Programa em C. . .8 6. . . . . . . . . .3 6. . . . . . . . a Exemplo de uso de scanf. . . .4 7. . . 119 . 39 76 79 79 81 82 83 84 85 95 97 Programas com if´s em escada e aninhados. . . ca e Leitura de uma matriz. . . . . . . . . . . . . . . .

.10 Exemplo de uso de calloc e free. . . . . . 9. . . . . . . . . . . . . . . . .9 Multiplica¸˜o de duas matrizes. . . . . . . . . . . .7 8.16 7. . . .1 8. . . . . . . . 158 .1 Atribui¸˜o de Estruturas. . . ca a . . . . . . . . . 157 co a Exemplo de nota¸˜es de vetores.2 8. . . . . . . . . . . . . . . . .13 Exemplo de matriz mapeada em um vetor. . . . 173 ca 10. . . . . .11 Exemplo de uso de malloc. . . 154 . . . . . . . . . . .17 Continua¸˜o do exemplo 9. . . . . . . . .6 8. . . 136 o Exemplos de vari´veis locais. . . . . .7 9. . . . .16 Exemplo de uso de ponteiros para ponteiros usando fun¸˜es. . .3 9. . . . . . 166 . . . . . . . . . . . . . . . . . . . . . . . . . 161 . . . . . . . . Exemplo de c´pia de cadeias de caracteres. . . . . . . 167 9. . . . . . . . . . . 164 9. . . . . . . . . . . . . 160 . . . . . . . . . . . . .4 8. . . 162 . . . . . . 159 o . . . . . . .5 8. . 138 ca a Defini¸˜o de vari´vel global. . . . 9. . . . . . . .2 Ordena¸˜o de Estruturas. .4 9. . . . .8 7. . . 128 Exemplos de tratamento de vetores. . . . 158 Exemplo de ponteiro para cadeia de caracteres. . . . . . .2 9. . . . . 140 Uso indevido de vari´veis locais. . co . . . . . . . . . . . . 137 a Defini¸˜o de vari´vel dentro de um bloco. . . . . . . . . .12 Exemplo de matriz normal sem uso de ponteiros. . . . . ca . . . 176 . . . . . . . . . . . . o . . . 139 Exemplo de passagem por valor. . . . .1 9. . . . . . . . . . . . . . . 143 o Fun¸˜o recursiva para calcular xn . . . . . . . 9. . . 127 Exemplos de tratamento de vetores. . .5 9. . . . . . . . . 9. . .9 8. . 146 ca Exemplo de atribui¸˜o de ponteiros. . . . . . . . . . . . . . . . . . . . . . . . . .7 7. . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Passagem de vetores sem dimens˜es.8 8. . . . . . . . . . . .16. . . . . . . ca LISTINGS . . . . . . . . . . . a .3 Passagem de estruturas para fun¸˜es.8 9. . . .9 9. . . . 157 co Exemplo de ponteiro vari´vel. . . 129 Exemplo de prot´tipos. . . 126 Leitura de um vetor de nomes. 9. 155 8. . . . . . . . . .10 Uso de argc e argv. . . . . . 147 Exemplo de compara¸˜o de ponteiros. . . . . . . . 168 10. . . . . . . . . . . . . . . co . . 153 ca Exemplos de opera¸˜es com ponteiros. . . .6 9. . . . . . . . . . . . . . . ca . . . . . . . . . . . . . . . . . 9. . . . . . . . . . . . . . . . . . . . . 156 ca Exemplo de altera¸˜es inv´lidas sobre ponteiros. . . . . . . . . . . . . . . . . .6 7. . 141 a Passagem de vetor com dimens˜es. . . . . . . . .3 8. . . co Exemplo de subtra¸˜o de ponteiros. . . .15 Exemplo de uso de ponteiros para ponteiros. . . . . . .14 Exemplo de uso de vetor de ponteiros. . . . . 162 . . . . 175 ca 10.

. . . .LISTINGS 17 10. . . . . . . . . 194 ca 11. 183 . . . .4 Uso da fun¸˜o ferror(). . . . . . . . . . . . . . . . . . . 178 10. . . . . . 199 . . . . . . . .2 Exemplo de leitura e escrita de caracteres. 11. .6 Ponteiros para de estruturas. . . . . . . . . . . . . . . . .4 Ordena¸˜o de Estruturas.7 Listagem do exercicio 3. . . . . . . . . . . . . . . . .6 Exemplo de leitura e escrita de dados formatados. . . . . . . . . . . . . . 197 . . ca . 11. .5 Ordena¸˜o de Estruturas (continua¸˜o). . . 11. . . . a 11. . . . . . . . . . 196 11. . . . . .8 Exemplo de leitura e escrita de estruturas. . . . . . . . . . 190 . ca ca 10. .7 Exemplo de leitura e escrita na forma bin´ria. . . . . . . .1 Uso da fun¸˜o feof(). . . 180 . . 11. 193 . . 200 . . . . . . 11. 192 . . . . . . . . . . . .5 Exemplo de leitura e escrita de cadeias de caracteres. . 177 ca 10. . . . . . . . . . . . . . . . . . . . . .3 Exemplo de leitura e escrita de caracteres. . . .

18 LISTINGS .

e a H´ verdades estabelecidas que tiveram de ser revistas. Adriano a ca Cruz c . aumento de velocidade e o ca diminui¸˜o de gasto de potˆncia. As primeiras m´quinas tino a ham milhares de v´lvulas. Em 1965. a O avan¸o na tecnologia dos computadores se deu em passos t˜o largos que os c a primeiros computadores parecem t˜o distantes no tempo quanto a Pr´-Hist´ria. para alguns pesquisadores. enquanto que o custo dos computadores caiu de milh˜es de d´lares o o para valores em torno de centenas de d´lares. ocupava uma ´rea de aproximadamente 25 cm2 o a e consumia alguns watts de energia. lan¸ado em 1993.1 milh˜es de transistores. o O avan¸o da tecnologia e a presen¸a da computa¸˜o na nossa vida s˜o ineg´veis. c c ca a a Embora a hist´ria deste fant´stico desenvolvimento seja recente e bem documeno a tada. foi da ordem de v´rias ordens de a grandeza. A Figura 1. ocupavam ´reas enormes e consumiam quilowatts a a de energia. um dos fundadores da Intel. A hist´ria do desenvolvimento dos computadores tem sido impressionante. Gordon Moore. H´ oportunidades perdidas e gente que soube aproveitar a sua chance. a e o O aumento de velocidade. o somente o microprocessador. Neste a e cap´ ıtulo iremos ver hist´rias de espionagem e brigas na justi¸a por roubo de o c id´ias. pode. O microprocessador Pentium. esta hist´ria de redu¸˜o de tamanho.1 mostra a imagem de um circuito integrado de microprocessador Pentium. No entanto. termos e palavraso ca chave que os profissionais da ´rea de computa¸˜o usam no seu dia a dia.Cap´ ıtulo 1 Introdu¸˜o ca 1. informalmente.1 Sucessos e Fracassos da Computa¸˜o ca Os objetivos principais deste Cap´ ıtulo s˜o mostrar para o aluno iniciante alguns a aspectos da hist´ria da computa¸˜o e definir. j´ ter uma ca e a data fixada para terminar. custando aproximadamente 1000 d´lares. h´ lacunas e controv´rsias impressionantes sobre diversos pontos. desde os anos 40. tinha em torno c de 3. fabricante do Pentium e uma dos maiores fabricantes de circuitos integrados 19 .

000. Se o tamanho diminuir al´m dos el´trons estaremos em e e outro dom´ ınio.100.000 24.000 275. apontam o que n˜o conseguimos ou n˜o queremos ver e mostram que o a a rei est´ nu.250 2. na hist´ria da computa¸˜o. muitas promessas n˜o foram cumprio ca a das e falhas gigantescas aconteceram. Como em diversas quest˜es. Os fios conduzem correntes de el´trons e os transistores e e controlam este fluxo.000 120.000 7. no entanto. ca Ano 1971 1972 1974 1982 1985 1989 1993 1997 1999 2000 Processador 4004 8008 8080 80286 80386 80486 DX Pentium Pentium II Pentium III Pentium 4 Transistores 2. e estamos nos aproximando da fronteira final. J´ se houve e a falar em tamanho de transistores medidos em n´meros de el´trons. H´ uma frase de Picasso que diz: ”Computadores s˜o est´pidos.000. No entanto. Devemos nos u e lembrar que toda a tecnologia atual est´ baseada em fluxo de el´trons.500 1.1: Transistores por chip nos microprocessadores da Intel Os transistores.500 5. INTRODUCAO ¸˜ Figura 1. Na tabela 1. ela continua v´lida at´ hoje. est˜o diminuido de o o a tamanho.500.000 42.000 3. a a a u .1: Fotografia de um circuito integrado de microprocessador Pentium. que comp˜em os circuitos eletrˆnicos.180. enunciou o que ficou conhecido como a Lei de Moore: ”Cada novo circuito integrado ter´ o dobro de transistores do anterior e ser´ lan¸ado dentro a a c de um intervalo de 18 a 24 meses. os el´trons. ou seja a e uma corrente el´trica. do mundo. artistas geo niais.”Moore achava que esta lei seria v´lida soa mente at´ 1975. pode-se e a e observar a evolu¸˜o dos microprocessadores usados em nossos computadores.20 CAP´ ITULO 1.000 Tabela 1.1.

Muitos acreditaram nesta promessa e muitos livros de fic¸˜o ca cient´ ıfica foram publicados em que este tipo de computador estaria dispon´ ıvel em um futuro muito pr´ximo. um exemplo fant´stico de sucesso ´ a Internet. democraticamente. computadores que poderiam questionar-se e nos questionar. Ora.C. Pode parecer verdade. a Na computa¸˜o. No entanto. A Inernet ca a e est´ se tornando essencial para o funcionamento do mundo moderno. falar. O mecanismo parece ser um dispositivo para calcular os movimentos de estrelas e planetas. a 1. parecido com um rel´gio. fazer amigos. Com not´vel exemplo podemos citar o filme o a ”2001 . que era capaz de ver. Aparentemente.2. estudar. Esta corrida provocou alguns acidentes e muitos sonhos de riqueza se esva´ ıram no ar. j´ que conhecemos tantos internaua tas e as empresas est˜o se atropelando para fazer parte desta onda e aproveitar a as suas possibilidades. discutir nossas leis. raciocinar etc. um dos mestres da fic¸˜o cient´ ca ıfica.2. h´ controv´rsias. Freq¨ena u temente ouvimos dizer que ela ´ o meio de comunica¸˜o que mais rapidamente se e ca difundiu pelo mundo. com aproo ximadamente 2000 anos de idade.1 Um Pouco da Hist´ria da Computa¸˜o o ca O In´ ıcio A primeira tentativa de se criar uma m´quina de contar foi o ´baco. A palavra a a vem do ´rabe e significa p´. jogar etc. . e ca Al´m disso h´ os russos. Esta frase exp˜e com ironia o um fracasso da comunidade de computa¸˜o que havia prometido criar rapidaca mente computadores inteligentes. UM POUCO DA HISTORIA DA COMPUTACAO ¸˜ 21 eles somente conseguem responder perguntas”. Os primeiros ´bacos eram bandejas de areia sobre a o a as quais se faziam figuras para representar as opera¸˜es. j´ passamos por 2001 e n˜o existe a menor possibilidade a a de se ver um computador como o HAL ou t˜o louco de pedra como ele. pode-se fazer quase tudo pela Internet. em um futuro pr´ximo. namorar. trabalhando perto da ilha grega de Antikythera. Em 1901 mergulhadores.2 a a ilustra um exemplar com as suas contas e varetas. mata quase todos os tripulantes de uma nave espacial. dispensando c intermedi´rios. a a e e os japoneses tamb´m reivindicam esta inven¸˜o. voltaremos ` Gr´cia Antiga e nos reuniremos em uma o a e enorme pra¸a virtual para. comprar.Uma Odiss´ia no Espa¸o”. que inventaram um tipo mais simples. de Stanley Kubrik que estreou em 1968 e e c foi baseado no conto ”The Sentinel”. pagar contas. escrito em 1950 por Arthur Clark.2 1. encontraram os restos de um mecanismo.´ 1. que eles chamam de soroban. Hoje. A Figura 1. Neste filme o enlouquecido computador HAL 9000. Quem sabe. chamado de e a tschoty S˜o conhecidos exemplares de ´baco datados de 2500 A. os co chineses foram os inventores do ´baco de calcular.

retornava ao 0 e aumentava uma unidade no disco imediatamente superior. e a Pascal que contribu´ em v´rios campos da Ciˆncia. A comercializa¸˜o das calculadoras c a ca n˜o foi satisfat´ria devido a seu funcionamento pouco confi´vel. Figura 1. a caixa registradora. A engenhoca era baseada em 2 conjuntos de discos interligados por engrenagens: um para a introdu¸˜o ca dos dados e outro para armazenar os resultados. como ficou conhecida sua m´quina. de maneira que quando um disco ultrapassava o valor 9. inventou um dispositivo feito de a e marfim para demonstrar a divis˜o por meio de subtra¸˜es e a multiplica¸˜o por a co ca meio de somas. matem´tico escocˆs. na cidade de Rouen. derivadas da Pasıdo o a calina.22 CAP´ ITULO 1. ainda podiam ser encontradas em a lojas at´ alguns poucos anos atr´s. Antes de morrer.3). matem´tico e f´ ıdo o a ısico francˆs Blaise Pascal (Figura 1. a 1. aos 39 anos. em 1662.2.2 A Era Moderna Em 1614 John Napier. apesar dele ter a o a constru´ cerca de 50 vers˜es. A m´quina utilizava o sistema a decimal para calcular. Pascal desenvolveu uma m´quina de a calcular. As m´quinas de calcular. Um dos primeiros instrumentos modernos de calcular. para auxiliar seu trabalho de contabilidade. o que lhe possibilitou o c lan¸amento de sua m´quina no mercado. INTRODUCAO ¸˜ Figura 1.2: Imagem de um ´baco. a . e Em 1642 aos 19 anos. foi a constru´ pelo fil´sofo.3: Blaise Pascal Pascal recebeu uma patente do rei da Fran¸a. fez com que o dispositivo c fosse conhecido como os ossos de Napier. ainda teve tempo de criar ıra a e uma variante de sua m´quina. do tipo mecˆnico. A semelhan¸a entre marfim e ossos.

´ 1. Figura 1. ou seja. ele iniciou o projeto de construir uma outra m´quina mais avan¸ada a c e capaz de calcular polinˆmios de at´ sexta ordem. UM POUCO DA HISTORIA DA COMPUTACAO ¸˜ 23 Em 1666. A motiva¸˜o de Babbage era resolver polinˆmios pelo m´todo das diferen¸as. h´ mais de 180 anos atr´s. pelo britˆnico Charles a a a Babbage (1791-1871.5). Ele esperava terminar esta o e . co e em 1671 Leibniz projetou uma outra calculadora que somava e multiplicava.5: Fotografia da Difference Engine Em 1823. em m´todos tediosos e repetitivos. Samuel Morland adaptou a calculadora de Pascal para resolver multiplica¸˜es por meio de uma s´rie de somas sucessivas. e Figura 1. Esta calculadora s´ foi conclu´ em 1694.2.4).4: Charles Babbage Figura 1. Independentemente. que o batizou de Difference Engine (Figura 1. o ıda O primeiro computador de uso espec´ ıfico come¸ou a ser projetado em 1819 c e terminou em 1822. ca o e c Naquele tempo as t´buas astronˆmicas e outras tabelas eram calculadas por hua o manos.

Alguns destes projetos est˜o listados a seguir. No entanto. inteiramente mecˆnica. Alguns destes computadores eram de uso geral. No entanto. usou dinheiro do governo inglˆs e possivelmente a maior a e parte da fortuna pessoal de Babbage. ou a sejam usavam rel´s. que ela escreveu para Charles Babbage o primeiro programa para computadores.2.3 O Desenvolvimento durante as Grandes Guerras Antes da Segunda Grande Guerra.24 CAP´ ITULO 1. Este projeto que a e ca e n˜o foi completado. que ´ a a e base matem´tica sobre a qual foram desenvolvidos os projetos dos modernos a computadores. A m´quina. a • Mem´ria para 1000 destes n´meros (165000 bits). a • Alarmes para avisar fim de c´lculo. teria a a as seguintes caracter´ ısticas: • Arredondamento autom´tico. cientistas estavam trabalhando em projetos que visavam construir computadores eletro-mecˆnicos. Ada que mudou seu nome para Augusta Ada King. n˜o havia nenhuma liga¸˜o entre o trabalho do proa ca jetista dos primeiros computadores e o do matem´tico que estudava o que viria a a ser o fundamento te´rico de todo a computa¸˜o que conhecemos hoje. o u • Controle por meio de cart˜es perfurados das opera¸˜es e endere¸os dos o co c dados. INTRODUCAO ¸˜ m´quina em trˆs anos. o ca 1. a • Impress˜o autom´tica de resultados em placas de cobre. outros e tinha finalidades espec´ ıficas. j´ tinham sido considerados por Charles Babbage em o seu e a projeto. em v´rios pa´ a ıses. tempo de multiplica¸˜o e ca ca divis˜o igual a 1 minuto. mas a constru¸˜o se arrastou at´ 1834. estudava Matem´tica com Deo a ´ Morgan que provou um dos teoremas b´sicos da Algebra Booleana. a • Precis˜o dupla. ap´s seu casamento. hoje. Um fato curioso ´ que entre os auxiliares de Babagge estava Augusta Ada e Byron. a a Em 1834 ele tinha completado os primeiros desenhos da m´quina que dea nominou Analytical Engine que tinha as seguintes caracter´ ısticas: • 50 d´ ıgitos decimais de precis˜o. Countess of Lovelace. • Tempo de soma e subtra¸˜o igual a 1 segundo. a ca Babagge nunca conseguiu terminar este ambicioso projeto. que somente vieram a tona nos anos ca 40 do s´culo vinte. os mais importantes conceitos de computa¸˜o. Considera-se. a . a • Sub-rotinas. • Arredondamento autom´tico e detec¸˜o de transbordo (overflow ).

Uma leitora de cart˜es perfurados o e uma perfuradora de cart˜es eram usados para entrada e sa´ de dados. O projeto foi ca a a o conclu´ em 1946 e usado na segunda guerra mundial. engenheiro projetista de avi˜es. o ıda Os tempos de execu¸˜o do ENIAC s˜o mostrados na Tabela 1. base que hoje os e u computadores modernos empregam. c e O governo alem˜o patrocinou os trabalhos de Zuze e em 1941 estava pronto a o Z2. 60 cent´ ımetros de largura e 30 cent´ ımetros de comprimento. concluiam a constru¸˜o de um verdadeiro computador: o Harvard Mark I. Em 1943 na Universidade da Pensilvˆnia. Quando foi terminado. e Ele gerava tanto calor que teve de ser instalado em um dos poucos espa¸os c da Universidade que possuia sistemas de refrigera¸˜o for¸ada. o ENIAC (Figura 1. Toda esta parafern´lia eletrˆnica foi montada em quarenta e dois pain´is a o e com mais 2. uma multiplica¸˜o em 4 ou 5 segundos e era capaz de extrair a ca raiz quadrada. mais o c´lculo de fun¸˜es co a co trigonom´tricas. Haiken da Universidade de Harvard. que operava em base 10. eram os elementos principais dos circuitos do computador. concebeu o uma m´quina de somar para resolver os c´lculos que deveria realizar em seus a a projetos. e consumia duzentos quilowatts de potˆncia.2. Eckert and a Mauchly era gigantesca quando comparada com os computadores pessoais atuais. um calculador mecˆnico com uma unidade a aritm´tica que usava a base 2 para representar os n´meros. Em 1941 foi introduzido o Z3. Eckert e J. Durante muitos anos o computador ENIAC foi considerado o primeiro computador eletrˆnico constru´ o ıdo. montados na forma da letra U. Em 1938 ele melhorou o desempenho do Z1. A m´quina projetada pelos Drs. Ele tamb´m a e tinha quinze mil rel´s e centenas de milhares de resistores. o pesava trinta toneladas.´ 1. capacitores e indue tores. exponenciais e logar´ e ıtmicas. ou 10−9 segundos. Mauchly iniciaram a a constru¸˜o de um computador ` v´lvulas. gra¸as aos rel´s. . que calculava trˆs a quatro adi¸˜es e co por segundo. ou seja eletrˆnico. ele concluiu o Z1. Os resultados eram o fornecidos em forma de cart˜es perfurados ou impressos por meio de m´quinas o a de escrever. Mais de 19000 ca c v´lvulas. O ENIAC podia ser ıdo reprogramado para executar diversas opera¸˜es diferentes atrav´s de liga¸˜es co e co por meio de fios e conectores. ca O Mark I efetuava as quatro opera¸˜es fundamentais.70 metros de altura. uma m´quina eletromecˆnica capaz de receber instru¸˜es por meio de uma a a co fita de papel. J. Nos Estados Unidos Em 1944 a IBM e H.2. UM POUCO DA HISTORIA DA COMPUTACAO ¸˜ Na Alemanha 25 Em 1934 na Alemanha Konrad Zuze. Em 1938. Compare ca a estes tempos com os tempos dos computadores atuais que est˜o na ordem de a nano segundos. As instru¸˜es eram fornecidas por co meio de fitas de papel e os dados lidos de cart˜es perfurados.6) enchia um laborat´rio inteiro.

como o ENIAC. que o o usa aritm´tica bin´ria. estes cientistas trocavam os fios de posi¸˜o de acordo com a nova tarefa a ser executada. juntamente com os dados.8 ms 6.2: Tempo de execu¸˜o das instru¸˜es aritm´ticas no ENIAC ca co e Em 1939 John Vincent Atanasoff e Clifford E. Quando um programa terminava. o co Em 1949. junto com os dados e dava-se partida no proa grama. n˜o era mais o a necess´rio interromper as atividades. INTRODUCAO ¸˜ Figura 1. Berry. eram programados por fios que os cientistas usavam para conectar as diversas partes. que declarava a a patente do ENIAC de Mauchly e Eckert inv´lida e atribu´ a Atanasoff a a ıa inven¸˜o computador eletrˆnico digital. o ABC ou Atanasoff-Berry Computer. emigrante h´ngaro que vivia nos EUA. a o uma tarefa extremamente r´pida. Os primeiros computae ca dores. Larson e a assinou uma decis˜o. dois computadores que usavam a mem´ria para o armazenar tanto programas como dados foram lan¸ados. Carregava-se o programa na mem´ria. sugeriu que a a u mem´ria do computador deveria ser usada para armazenar as instru¸˜es do o co computador de maneira codificada. o juiz federal Earl R. na Inglaterra. o conceito de programa armazenado.0 ms Tabela 1. ca o Na Inglaterra J´nos von Neuman. na Universidade Estadual de Iowa constru´ ıram um prot´tipo de computador digital eletrˆnico. Esta id´ia foi fundamental para o progresso da computa¸˜o.26 CAP´ ITULO 1. Ao t´rmino da execu¸˜o do programa passava-se imediatamente para a e ca pr´xima tarefa sem interrup¸˜es para troca de fios. Com ca o programa armazenado na mem´ria. em seguida a uma longa batalha judicial.6: Computador Eniac Opera¸˜o ca soma multiplica¸˜o ca divis˜o a Tempo 200 µs 2. Em 19 de outubro de 1973. Na Universidade de c .

c Segunda Gera¸˜o: Os computadores da segunda gera¸˜o foram constru´ ca ca ıdos com transistores. como o pr´prio nome diz. e c Curiosamente. a dentro das UCPs os dados s˜o somados. Quarta Gera¸˜o: Os computadores de quarta gera¸˜o utilizavam circuitos ca ca com a tecnologia VLSI (Very Large Scale Integration).1. No entanto ´ interessante mencionar estas divis˜es. chegamos aos computadores de terceira gera¸˜o.2. que come¸ou a operar onze meses antes do EDSAC.7. Os modulos que constituem ca a UCP s˜o os seguintes: a . subtra´ a ıdos etc.3. O HARDWARE 27 Cambridge foi lan¸ado o EDSAC. (Electronic Delay Storage Automatic Calculac tor) e em Manchester o computador chamado de Manchester Mark I.3 O Hardware Um t´ ıpico diagrama em blocos de um computador digital monoprocessado esta mostrado na Figura 1. Com ca a integra¸˜o o tamanho dos computadores e seu consumo diminuiu ainda ca mais e aumentou a capacidade de processamento. os quais tinham a vantagem de serem mais compactos e consumirem muito menos energia. A UCP tamb´m controla e a movimenta¸˜o dos dados dentro de todo o sistema. Hoje em dia co como a taxa de evolu¸˜o ´ muito grande n˜o se usa mais este tipo de terminoloca e a gia. um prot´tipo do Mark o I. c Outro fato curioso em rela¸˜o ` Inglaterra e que foi divulgado recentemente ca a relata que um computador chamado COLOSSUS entrou em opera¸˜o secreca tamente na Inglaterra em 1943. Estes computadores consumiam muita energia e ca espa¸o. em inglˆs Central Processing Unit (CPU). e o Primeira Gera¸˜o: Os computadores constru´ ca ıdos com rel´s e v´lvulas s˜o os e a a da primeira gera¸˜o. a Universidade de Manchester reinvindica que o primeiro computador de programa armazenado foi o chamado ”Baby”. O EDSAC ´ considerado o primeiro computador de programa armazenado a ser lan¸ado. que s˜o compoca a nentes em que v´rios transistores s˜o constru´ a a ıdos em uma mesma base de semicondutor. Ou seja. ou seja alterados. A Unidade Central de Processamento (UCP). o a 1. 1. ´ a unidade e o e onde os dados s˜o processados. a Terceira Gera¸˜o: Com o advento dos circuitos integrados.4 As Gera¸˜es co Costumava-se dividir os projetos de computadores em gera¸˜es. Por gerarem menos calor eram m´quinas a mais confi´veis. no computador. Este computador foi usado para auxiliar na quebra dos c´digos de criptografia alem˜es durante a segunda grande guerra.

INTRODUCAO ¸˜ Unidade de Controle (UC): comanda a opera¸˜o do computador. As vezes a UCP conta com mais de uma de cada uma destas unidades.7: Diagrama B´sico de um Computador Digital a O termo pipelining que mencionamos acima se refere a um dos modos de como o processador pode paralelizar a execu¸˜o de instru¸˜es. o que caracteriza o processamento paralelo. a existˆncia de uma unidade aritm´tica para executar instru¸˜es que e e co operam sobre n´meros inteiros e outra sobre n´meros reais. ca e Unidade de Controle Unidade de Entrada e Saída Memória Discos Vídeo Unidade Arimética Unidade Central de Processamento Figura 1.28 CAP´ ITULO 1. por exema e plo. mais de um autom´vel ´ montado a o o e . porque ´ exatamente isto que a t´cnica e e faz. Unidade de Entrada e Sa´ (UES): controla a comunica¸˜o com os usuıda ca ´rios do computador e os equipamentos perif´ricos tais como discos e ima e pressoras. Esta unica dade lˆ da mem´ria tanto as instru¸˜es como os dados e comanda todos e o co os circuitos para executar cada instru¸˜o lida da mem´ria. em uma linha de co montagem de uma f´brica de autom´veis. a Unidade Aritm´tica e L´gica (UAL): local onde as transforma¸˜es sobre e o co os dados acontecem. chamada de u u unidade de ponto flutuante. e que ser´ detalhada mais adiante. Este termo pode ca co ser traduzido por linha de montagem. e a ca co Alguns processadores duplicam circuitos para permitir que mais de uma ´ operac˜o aritm´tica seja executada por vez. Atualmente esta unidade ´ bastante sofisticada e e diversos m´todos s˜o empregadas para acelerar a execu¸˜o das instru¸˜es. uma linha de montagem de instru¸˜es. sendo distribu´ pela Unidade Central de Procesıda samento. Atualmente as ca o unidades de controle s˜o capazes de executar mais de uma instru¸˜o por a ca ciclo de m´quina. E muito comum. Em alguns computadores mais simples esta unidade n˜o existe a independentemente. A t´cnica a e mais comum para conseguir este paralelismo ´ conhecida como pipelining. Por exemplo. Em computadores mais poderosos ao contr´rio as Unidades de a Entrada e Sa´ s˜o computadores completos que foram programados para ıda a controlar a comunica¸˜o com os perif´ricos.

e . quase todo o sistema. co 1. Isto porque no final da linha de montagem sai um carro a cada poucos minutos. Por exemplo. a no conjunto s˜o conhecidos como o chipset. ou seja todo o sistema de procese samento de dados. tais como processadores de ponto flutuante e mem´rias cache. Os microprocessadores atuais incluem outros circuitos que normalmente ficavam fora da UCP. No in´ ıcio da linha o carro n˜o existe. O HARDWARE 29 ao mesmo tempo. O mesmo acontece com a linha de montagem de instru¸˜es. Em cada est´gio da a a linha de montagem os oper´rios v˜o adicionando partes e ao fim da linha sai a a um carro novo. Nas linhas de c montagem muitos carros s˜o montados ao mesmo tempo. Se vocˆ olhar a linha poder´ ver carros em diversos est´gios da e a a montagem. Alguns exemplos de microprocessadores s˜o mostrados na o a Tabela 1. Repare que a linha n˜o p´ra. algu´m que se colocasse no final da linha a e de montagem teria a impress˜o que cada carro leva muito pouco tempo para a ser montado.1. que. AMD Cons´rcio Apple/IBM/Motorola o IBM MIPS Technologies ARM Technologies SUN Tabela 1. e os conectores para os perif´ricos. enfim. e a montagem de um carro n˜o espera a a a que o que come¸ou a ser montado antes dele esteja terminado.3.3 Microprocessador Arquitetura Intel X86 PowerPC Power MIPS ARM SPARC Empresa Intel. mas como v´rios a v˜o sendo montados ao mesmo tempo.1 Microcomputadores Uma UCP integrada em um unico circuito (chip) ´ comumente chamada de ´ e microprocessador. uma placa m˜e pode incluir o microprocessador e seus circuitos de suporte. As assim chamadas placas m˜e dos microprocessadores atuais ina cluem diversos componentes que formam o microcomputador. como a placa e o e de v´ ıdeo. ıda a Os microcomputadores s˜o computadores baseados em microprocesa sadores. O efeito final ´ que a e cada carro continua levando bastante tempo para ser montado.3: Exemplos de Microprocessadores Usualmente se chama de computador. Os perif´ricos s˜o os dispositivos usados para fazer a entrada e a e sa´ dos dados que ser˜o processados. Al´m disso a placa m˜e pode incluir a e a tamb´m a mem´ria principal e as placas de controle de perif´ricos.3. o processador mais os seus perif´ricos e e os sistemas para controlar estes perif´ricos.

quando os computadores s˜o desligados o seu conte´do se mant´m. ao mesmo tempo. Quanto mais r´pida a e a mem´ria. O cache opera o e o de forma invis´ para o processador. A medida que vamos a u nos afastando do processador as mem´rias v˜o. Uma mem´ria ´ como se fosse uma s´rie de cofres numerados capazes de o e e . ele ´ repassado para a e o processador. Para o processador o que aconteceu ´ que a mem´ria entregou o e o dado com uma rapidez maior do que o normal.2 Mem´rias o Os dados no computador podem ser armazenados em diversos n´ ıveis de mem´ria o semicondutoras ou em perif´ricos (discos. Somente os a dados que s˜o necess´rios ao processador com rapidez extraordin´ria devem ser a a a colocados nos registradores. INTRODUCAO ¸˜ 1.8: N´ ıveis de hierarquia da mem´ria de um computador. caso esteja. a mem´ria principal e os registradores s˜o mem´rias semicondutoras a o a o e perdem seus conte´dos quando a energia el´trica ´ desligada. Ao pedir um dado para mem´ria. Os discos s˜o mem´rias de armazenamento permanente. que. por´m de menor capacidade. circuitos ıvel o especiais verificam se este dada est´ no cache.3. a a o isto ´. os e o a dados que o processador ir´ precisar mais freq¨entemente. portanto. Devido a sua velocidade menor que a da mem´ria principal a o e a sua grande capacidade. A id´ia por traz da separa¸˜o em n´ o e e ca ıveis ´ colocar mais perto do processador. o No n´ ıvel mais pr´ximo do processador est˜o os registradores. ´ na mem´ria principal onde o processador e o busca instru¸˜es e dados de um programa para executar. fitas. ficando mais o a baratas. os computadores u disp˜em de mem´rias mais r´pidas. que ficam eno o a e tre os registradores e a mem´ria principal.8 ilustra esta hierarquia. na vero a dade. usualmente mais cara ela ´. ficam internamente ao processador. PROCESSADOR MEMÓRIA CACHE REGISTRADORES DISCO Figura 1.30 CAP´ ITULO 1. Durante o processamento normal. Este tipo de mem´ria ´ conhecido como mem´ria cache. A Figura 1. n˜o podem armazenar grandes quantidades de dados. Al´m da mem´ria princo e o cipal est˜o os discos. u e e Para acelerar o acesso aos dados freq¨entemente usados. S˜o poucos e extremamente r´pidos a a e. etc). aumentando de capacidade e diminuindo de velocidade. Estas funcionam como as bolsas ou o carteiras em que carregamos documentos e outros itens que precisamos freq¨ntee mente. em mem´rias r´pidas e mais caras. Ao e a u e contr´rio. os discos s˜o considerados dispositivos de armazenaa mento secund´rio.

o dado e pedido de escrita. Isto trazia algumas dificuldades. ou seja mem´ria que se pode ler em o o o qualquer endere¸o. Em opera¸˜o normal. O HARDWARE 31 armazenar os dados. A diferen¸a real ´ que nas RAMs se pode ler e c c e escrever com a mesma velocidade em qualquer endere¸o. A sigla b´sica ROM significa Read Only Memory. Para resolver este tipo de problemas surgiram as PROMs.3. Exemplos de a e uso de ROM s˜o as mem´rias que armazenam os programas que s˜o executados a o a quando os computadores s˜o ligados. u a Os dois tipos b´sicos de mem´ria mais comuns s˜o ROM e RAM. Estas siglas indicam os dois tipos b´sicos de mem´ria que s˜o a a o a usadas em computadores. Flash memory ´ uma forma de mem´ria n˜o vol´til que pode e o a a .1. Nas escritas o c o a o processador envia o endere¸o. enquanto que na ROM. u o o O computador ficava literalmente sem a mem´ria dos programas iniciais. Estas siglas a o a tˆm diversas varia¸˜es (PROM. como est´ ilustrado na Figura 2. Em seguida um circuito programador de PROMs era usado para gravar o novo conte´do e somente ap´s tudo isto a mem´ria era recolocada no local. a ou seja mem´ria de somente de leitura e RAM (Random Access Memory) que o significa mem´ria de acesso randˆmico. DRAM. Portanto. Por exemplo. Ou seja. e a e o A ROM normalmente cont´m dados que n˜o podem ser modificados durante o e a funcionamento do computador. EPROM. mas os princ´ e co ıpios b´sicos a s˜o os mesmos. Para isto s˜o escritos programas simples que o a fazem acesso aos perif´ricos em busca do Sistema Operacional da m´quina. que s˜o ROMs program´veis. c o acesso ´ r´pido somente para leituras. para ler 1000 o n´meros o processador ter´ de fazer 1000 acessos sequencialmente. conhecidos como o a u endere¸os. etc). Um computador ao ser ligado deve ter um programa m´ ınimo capaz de iniciar o seu funcionamento normal. quando um programa precisava ser atualizado. que s˜o mem´rias a o que podem ser apagadas eletricamente sem a necessidade de serem retiradas dos circuitos. o endere¸o faz com que o e c carteiro saiba onde ele deve entregar a correspondˆncia. e ca toda vez que o processador precisa de um dado ele envia um pedido de leitura a ` mem´ria junto com o endere¸o da mem´ria onde o dado est´. Ou seja ´ poss´ desgravar a a e ıvel o conte´do antigo e gravar novos programas nesta mem´ria.3. por exemplo. Antigamente este u o era um processo complicado e exigia que a mem´ria fosse retirada fisicamente o do circuito e colocada em dispositivos especiais capazes de apagar o conte´do u antigo. a escrita ´ uma hist´ria mais complicada. caso contr´rio seria como uma pessoa a que perdeu totalmente a mem´ria. Normalmente a c mem´ria somente pode atender um pedido de cada vez. os famosos BIOS (Basic Input Output a System). para ler um dado da mem´ria ´ necess´rio fornecer um c o e a endere¸o para que a mem´ria possa encontrar e devolver o conte´do pedido. c A sigla RAM ´ muito confusa porque em uma mem´ria ROM tamb´m se e o e pode ler em qualquer endere¸o. Outro tipo de dados armazenados em ROMs s˜o a os que n˜o devem ser perdidos quando o computador ´ desligado. Hoje o em dia existm PROMs que podem ser apagadas e regravadas muito facilmente. e a As primeiras mem´rias do tipo ROM eram gravadas nas f´bricas e nunca o a mais eram modificadas. Os dados e instru¸˜es a co na mem´ria s˜o apontados ou referenciados por estes n´meros. Isto c o u ´ similar ao o que ocorre quando enviamos uma carta. as EEPROMs (Eletricaly Erasable PROMs).

Um conjunto de 8 bits forma o byte. Considere que este tamanho ´ relae cionado com a quantidade m´xima de algarismos que um n´mero pode ter para a u ser processado. Da mesma forma o a computador pode processar 32 bits de cada vez e a mem´ria ter largura 64 bits. Elas s˜o modific´veis e de acesso r´pido tanto na leitura quanto na a a a grava¸˜o. a base usada nos computadores. o e Atualmente a maioria dos computadores tem palavras de mem´ria com largura o de 32 (4 bytes) ou 64 (8 bytes) bits. a menor unidade de informa¸˜o o e ca que o computador armazena. Na Figura 1. que s˜o os a d´ ıgitos usados na base dois. o Isto pode acelerar o processamento. BIT BYTE 8 BITS PALAVRA 32 BITS 4 BYTES Figura 1. .3. Tudo isto ou se refere ao o m´todo de acesso dos dados na mem´ria ou a tecnologia de constru¸˜o ou a outra e o ca caracter´ ıtica acess´ria. etc. ela deve ser apagada em blocos de endere¸os. ou seja econoa o mizando uma leitura. 1.3 Bits e Bytes A mem´ria do computador ´ composta de bits. Diferentemente das EEPROMs. O certo ´ que todas elas tem como caracter´ o e ıtica b´sica a o fato dos acessos de leitura e escrita poderem ser feitos na mesma velocidade. Caso sua mem´ria tenha palavras de 32 bits o processador dever´. Um bit pode conter o valor 0 ou 1. Existem as DRAM. mem´rias EDO.9: Tamanho de Bits. ler duas palavras da mem´ria para poder processar um n´mero. Lembrea o u se que as duas leituras s˜o atendidas uma de cada vez. SIMM.9 mostramos os diversos tamanhos dos dados. a a As mem´rias RAMs s˜o as mem´rias onde os nossos programas comuns o a o rodam. Um computador pode ter capacidade de processar 64 bits de cada vez. o a ent˜o. Bytes e Palavras Observar que estamos falando de dados na mem´ria e n˜o do tamanho dos o a dados que o computador pode processar. INTRODUCAO ¸˜ ser apagada e reprogramada eletricamente. Uma palavra de mem´ria ´ um conjunto de bytes. j´ que o processador est´ se adiantando e a a recebendo o que poder´ ser o pr´ximo dado a ser processado.32 CAP´ ITULO 1. Muitas siglas aparecem e desaparecem quando falamos de mem´rias ca o RAM. Este tipo de mem´ria custa menos c o do que EEPROMs e portanto s˜o preferidas quando ´ necess´rio usar mem´ria a e a o n˜o vol´til em forma de circuitos integrados.

1. ca Por exemplo 1 Kbyte de mem´ria corresponde a 2 elevado a 10 (210 ). co e a o Nome Kilobyte Megabyte Gigabyte Terabyte Petabyte Exabyte S´ ımbolo Kb MB GB TB PB PB Multiplicador 210 = 1024 220 230 240 250 260 Tabela 1.4 O Software Tudo isto que sobre o que acabamos de escrever constitui o hardware do computador. Em seguida e . que ´ a receita de como o problema deve ser resolvido. A tabela 1.5 ilustra alguns destes ca a perif´ricos. os dados n˜o ficam guardados somente na mem´ria. a a o h´ tamb´m os perif´ricos.4 est˜o mostradas as e a diversas abrevia¸˜es usadas quando se fazem referˆncias `s mem´rias. outros de sa´ e alguns a e e a e ıda que servem tanto para entrada como sa´ de dados.4 Perif´ricos e Como j´ mencionamos antes. a e e a a Para que um computador execute alguma tarefa primeiro se desenvolve um algoritmo. H´ perif´ricos de entrada. e Entrada Teclados Mouse CD-ROM Scanner Sa´ ıda Impressoras V´ ıdeo Plotter Alto-falantes Ambos Discos R´ ıgidos Fitas Magn´ticas e Disquetes Discos Zip Tabela 1. Da mesma forma 1 Megabyte corresponde a 1024 x 1024 bytes e 1 Gigabyte ´ igual a 1024 x 1024 x 1024 bytes. Perif´ricos n˜o servem ıda e a somente para armazenar dados. o que n˜o se vˆ nem se toca. Na Tabela 1. co e a o 1. ou seja o 1024 bytes.5: Exemplos de perif´ricos e 1. o que se vˆ e o que se toca.4. H´ perif´ricos que s˜o usados para permitir a a e a intera¸˜o entre os usu´rios e o computador. mas tamb´m est´ l´.4: Abrevia¸˜es usadas em referˆncias `s mem´rias. A partir de agora falaremos brevemente e no software. O SOFTWARE 33 Devido a base 2 o fator kilo tem um significado diferente em computa¸˜o.3.

r3 * Some os conte´dos de r3 (4) e r4 (8) u * e armazene o resultado em r5 Este pequeno trecho de programa armazena os numeros 4 e 5 em registradores internos do processador em seguida os soma e armazena o resultado em um terceiro registrador. por estarem mais pr´ximas da o lingugagem natural empregada pelos serem humanos. li r4.34 CAP´ ITULO 1. COBOL: Usada em ambientes comerciais. Al´m e e deste fato h´ outros problemas tais como: dificuldade de leitura por humanos. caso necess´rio. Um programa escrito em assembly deve ser traduzido para a representa¸˜o ca bin´ria.8 * 8 e o segundo numero add r5. onde como achar os os dados que ser˜o opera a ados. devido ao controle quase que total do programador sobre a m´quina. Por esta raz˜o tamb´m costuma-se dizer que s˜o programas escritos em a e a bin´rio. Alguns exemplos de linguagens de programa¸˜o s˜o: ca a Fortran: Usada em programa¸˜o cient´ ca ıfica e engenharia.r4. ca Para evitar estes problemas foram desenvolvidas as linguagens de programa¸˜o chamadas de linguagens de alto n´ ca ıvel. Este tipo de programa¸˜o pode levar a se escrever programas muito a ca eficientes. co a ca ser executada e. estes eram escritos diretaca o mente em linguagem de m´quina que ´ a linguagem que o computador realmente a e ¨ntende¨ Estas instru¸˜es s˜o conjuntos de bits indicando a opera¸˜o que deve e . que ´ uma representa¸˜o em mnemˆnicos das instru¸˜es de m´quina. a No entanto devido ao fato de ser uma linguagem pr´xima do computador e afaso tada da maneira de raciocionar do ser humano ´ mais dificil de ser usada. maior tempo de desenvolvimento etc. tarefa que normalmente se chama de montar o programa. a Com a evolu¸˜o da computa¸˜o os programas passaram a ser escritos em ca ca assembly. No in´ da ıcio computa¸˜o eletrˆnica com programas armazenados. Pascal: Usada em ensino de linguagens e desenvolvimento de sistemas. um fragmento e a de um programa escrito em assembly do processador PowerPC ´: e li r3.4 * O primeiro numero a ser somado e 4. A palavra a assembler frequentemente ´ usada erradamente para significar a linguagem e e n˜o o programa que traduz o programa de assembly para linguagem bin´ria de a a m´quina. e ca o co a Deste modo era ´ mais f´cil escrever os algoritmos. As informa¸˜es ap´s os asteriscos s˜o coment´rios usados co o a a para explicar o que o programa est´ fazendo naquela instru¸˜o. a ca O PowerPC ´ um microprocessador criado em 1991 por um cons´rcio fore o mado pela IBM. INTRODUCAO ¸˜ este algoritmo deve ser traduzido para uma linguagem que possa ser entendida pelo computador ou que possa ser traduzida para esta linguagem. A Apple usou este microprocessador para equipar suas m´quinas at´ a e 2006. Apple e Motorola Os microprocessadores PowerPC podem ser usados para equipar desde sistemas embutidos at´ computadores de alto deseme penho. a dificuldade de manuten¸˜o dos programas. . Por exemplo.

Aplicativos importantes para os programadores s˜o os compiladores. Lisp e Prolog: Linguagens usadas para desenvolver programas de Inteligˆncia e Artificial. Os erros mais coo a a muns nesta etapa s˜o erros de uso correto da linguagem de programa¸˜o. No caso de erros serem ca encontrados o programador deve voltar ao passo de codifica¸˜o para a ca corre¸˜o dos erros. As diversas maneiras de descrever um algoritmo ser˜o apresena tadas no pr´ximo cap´ o ıtulo. caso n˜o hajam era ros. com a ajuda de um editor de textos (n˜o procesa sador de textos).10 ilustra a ordem em que se desenvolvem estes passos. a 35 C: Mesmas caracter´ ısticas do Pascal com facilidades que permitem mais controle do computador. por exemplo C.4. ca a Delphi: Linguagem origin´ria do Pascal com metodologia de orienta¸˜o ` oba ca a jetos. Codifica¸˜o do Algoritmo: O algoritmo preparado no passo anterior ´ esca e crito em uma linguagem de programa¸˜o. Podemos resumir os passos necess´rios para criar um programa em uma a linguagem de programa¸˜o. Estes a programas traduzem programas escritos em linguagens de alto n´ para a linıvel guagem de m´quina.1. inclusive o editor. nos passos descritos a seguir. a ca Estes erros s˜o chamados de erros de compila¸˜o. em um unico a ´ aplicativo. Para esta edi¸˜o qualquer editor pode ser usado. Compila¸˜o do Programa: O arquivo texto contendo o programa passa por ca um programa especial chamado compilador que gera. a ca a Java: Linguagem tamb´m baseada na sintaxe do C e tamb´m seguindo o moe e delo de orienta¸˜o ` objetos. uma sa´ que ´ quase o programa execut´vel. normalmente. de modo que o computador possa execut´-los. Cria¸˜o do Algoritmo: neste passo ´ criado o algoritmo que ir´ resolver o ca e a problema. Neste passo o programador ca conta. ca . ou seja o programa em ıda e a c´digo bin´rio do processador em que ser´ executado. O SOFTWARE Basic: O nome diz tudo. b´sica. As linguagens de proa ca grama¸˜o s˜o baseadas em regras gramaticais muito r´ ca a ıgidas e qualquer viola¸˜o destas regras pode implicar em erro. De maneira a a geral um compilador ´ um programa que traduz um programa de uma linguagem e para outra. Hoje ca em dia muitos ambientes de desenvolvimento integram todas as ferramentas necess´rias para criar um programa. C++: Linguagem origin´ria do C com metodologia de orienta¸˜o ` objetos. A ca Figura 1.

Caso algum o erro seja encontrado o programador deve reelaborar o que estiver errado no algoritmo e em seguida ir para a etapa de codifica¸˜o do algoritmo. erros que n˜o foram encontrados durante o desenvolvia mento do programa podem ser descobertos e precisam ser corrigidos. Costuma-se chamar esta corre¸˜o de manunten¸˜o do programa.10: Ciclo de desenvolvimento de um programa. ca a a Isto significa que o programa n˜o para ser executado n˜o precisa ser traduzido a a . Durante o uso. Algumas linguagens de programa¸˜o n˜o s˜o compiladas e sim interpretadas. ca ca Início Ligação Criação de Algoritmo Depuração e Testes Codificação do Algoritmo Sim Erros de Execução? Não Compilacação do Programa Uso do programa Sim Erros de Compilação? Não Sim Erros de Execução? Figura 1. INTRODUCAO ¸˜ Liga¸˜o: Em inglˆs esta passo ´ conhecido por link edition. Um programa ca e e completo ´ composto por v´rios m´dulos que podem ter sido criados pelo e a o pr´prio programador ou por outras programadores. a Depura¸˜o e Testes: Nesta etapa o programa ser´ testado para a retirada ca a dos poss´ ıveis erros de l´gica que o programador cometeu. em C o os trechos de programa que interagem com os usu´rios. normalmente vˆm com o programa compilador. Uso do Programa: O programa foi entregue aos seus usu´rios para ser usaa do. ca Este ciclo pode repetir-se in´meras vezes at´ que o desenvolvedor acredite u e que os erros foram corrigidos. A corre¸˜o pode ser feita pelos mesmos programadores que desenvolveram o ca programa ou por outro grupo devidamente treinado.36 CAP´ ITULO 1. Por exemplo. ıda e Estes trechos podem estar guardados em bibliotecas de programas e s˜o a ligados ao programa do usu´rio para completar o programa. os comandos de a entrada e sa´ de dados.

O SOFTWARE 37 para linguagem de m´quina. portanto. a a a tal como um Integrated Development Environment (IDE). tempo que cada programa pode roa c o dar etc. O. bancos de dados. por exemplo o LINUX. A a a ca interpreta¸˜o de um programa funciona como o processo de tradu¸˜o simultˆnea ca ca a do discurso de um orador. N˜o h´. O Sistema Operacional controla a aloca¸˜o de recursos tais como: comunica¸˜o com os ca ca usu´rios. os computadores s˜o capazes de executar um n´mero de tarea u fas muito maior do que o n´mero de processadores dispon´ u ıveis.4. A medida que ele pronuncia seu discurso um tradutor repete as frases na linguagem destino. Alguns dos sistemas operacionais conhecidos s˜o os baseados no padr˜o a a UNIX. Um usu´rio pode estar oua a vindo m´sica. o processo de tradu¸˜o antecipada do programa. etc. na verdade recomendamos a fortemente que o editor seja simples para que vocˆ possa ter contacto com e todas as etapas do processo de desenvolvimento de um programa. Por exemplo. j´ que o e a processo de interpreta¸˜o e execu¸˜o ao mesmo tempo ´ mais lento do que a ca ca e simples execu¸˜o de um programa traduzido antecipadamente. o jogos. planilhas eletrˆnicas. uso de mem´ria. . Atualmente a maior parte dos computadores possui somente um processador. N˜o ser´ necess´rio nenhum ambiente mais complexo. Outros sistemas muito usados s˜o os da fam´ a ılia Windows. Para gerenciar os recursos do computador existe um programa especial normalmente chamado de Sistema Operacional (S. digitando um texto e imprimindo um outro documento ao mesmo u tempo. A execu¸˜o a a ca a ca de um programa escrito em uma linguagen interpretada ´ mais lenta. A linguagem Basic ´ uma linguagem interpretada. considere o problema de gerenciar como os diversos programas que um usu´rio normalmente a utiliza partilhar˜o o processador do computador. ca Hoje em dia a maior parte dos usu´rios de computadores n˜o s˜o prograa a a madores e sim pessoas que usam programas para resolver seus problemas do dia a dia. espa¸o em discos. Um programa em Java ´ traduzido para uma linguagem e intermedi´ria e depois interpretado por meio de uma chamada m´quina virtual.1. Aplicativos t´ ıpicos que rodam nos computadores s˜o: editores de texto.). Compilando Programas Simples em C Para resolver os exerc´ ıcios deste livro vocˆ ir´ precisar de um compilador para a e a linguagem C e de um editor de textos simples (n˜o processador do como o Word). compiladores. a O editor pode ser t˜o simples quanto o Notepad. traduz cada uma destas intru¸˜es para linguagem de m´quina e as exco a ecuta. a a N˜o h´ efetivamente uma compila¸˜o para linguagem de m´quina. Portanto. Em Java ocorre um processo e um pouco diferente. o tradutor traduzisse todo o discurso e depois o lesse. a processadores de texto. Para compilar empregaremos o compilador gcc que ´ gratuito e pode ser obtido na Internet e como veremos adiante. Em um programa interpretado um aplicativo lˆ a e o programa instru¸˜o por instru¸˜o diretamente na pr´pria linguagem de alto ca ca o n´ ıvel. Um programa compilado funciona como se primeiro.

Neste caso o comando se torna C:\MinGW\bin\gcc -o teste teste. como exemplo. pois ´ nesta fun¸˜o que e ca e ca o programa obrigatoriamente come¸a sua execu¸˜o. Este comando deve ser digitado e no diret´rio onde est´ o arquivo fonte teste. O sufixo . Uma solu¸˜o ´ digitar o ca e o caminho completo do compilador. A unica coisa que este programa faz ´ imprimir Alo ´ e Mundo! e terminar. Java. ıtio o ca o comando indicado n˜o funcione uma das raz˜es para a falha pode ser que o a o sistema operacional n˜o sabe onde se encontra o compilador gcc. como o LINUX. Suponha que a o programa gcc foi instalado no diret´rio C:\MinGW\bin. A segunda linha ´ o in´ real do programa. e ca A abrevia¸˜o gcc. O MinGW disp˜e de um programa instalador que facilita enormemente o processo. ´ preciso adicionar a a e este caminho ` vari´vel PATH do Windows. Fortran e ADA. Este o programa pode ser obtido no s´ oficial do MinGW. A linha indica que e e ıcio esta ´ a fun¸˜o main que todo programa C deve conter.c -Wall Para que n˜o seja necess´rio digitar o caminho completo. o Nos sistemas Unix normalmente o gcc faz parte da distribui¸˜o padr˜o e ca a nada precisa ser feito.c no nome do programa normalmente ´ usado para e indicar que o arquivo ´ de um programa C. co 1.38 CAP´ ITULO 1.c. Vamos considerar. A primeira linha do programa avisa ao compilador que ir´ usar fun¸˜es de a co entrada e sa´ de dados guardadas na biblioteca stdio. No Windows uma maneira f´cil de obter uma vers˜o a a do gcc ´ instalar o MinGW (Minimalist GNU for Windows). Atualmente o gcc pode compilar C++. um programa chamado teste. a Objective-C. INTRODUCAO ¸˜ A cole¸˜o de compiladores da GNU (GNU Compiler Collection) usualmente ca abreviada por gcc. entre outras linguagens.c -Wall em uma janela de comandos no sistema Windows ou em um terminal nos sistemas Unix.5 Um programa em C Vamos terminar este cap´ ıtulo mostrando um exemplo simples de programa escrito em C(Listagem 1. Consulte o manual para obter ina a forma¸˜es de como fazer este passo no seu sistema Windows. Este aplicativo ca ´ distribu´ gratuitamente pela Free Software Foundation (FSF) sob a licen¸a e ıdo c GNU GPL e GNU LGPL.c. Para compilar e gerar o execut´vel para este programa digitamos o comando a gcc -o teste teste. ´ uma cole¸˜o de compiladores produzidos pelo projeto GNU. MinGW ´ uma e e cole¸˜o de arquivos e bibliotecas distribu´ ca ıdas livremente as quais combinadas com outras ferramentas da GNU permitem que programas para Windows sejam produzidos sem a necessidade de bibliotecas extras e pagas.1). A fun¸˜o vai retornar um c ca ca . originalmente. Neste caso a fun¸˜o ıda ca usada ´ printf. Este ´ o compilador padr˜o para os sistemas operae a cionais livres do tipo Unix. e diversos sistemas operacionais propriet´rios como o Apple Mac OS X. O arquivo execut´vel ser´ aro a a a mazenado no mesmo diret´rio. Caso ap´s a instala¸˜o. significava GNU C Compiler.

liste alguns aplicativos que vocˆ normalmente e a e usa.h > i n t main ( void ) { printf ( " Alo Mundo !\ n " ).3: Quais as diferen¸as entre um microprocessador e o microcomputador? c 1. 1. internet e outras fontes quais s˜o os tempos de acesso a das mem´rias RAMs atuais. O in´ e o fim do texto a ser impresso s˜o marcados pelo caractere ". #include < stdio .6: Se vocˆ j´ usa computadores.1: Exemplo de Programa em C. o 1.1: O que ´ o hardware do computador? e 1. e 1. que o programa terminou sem ca problemas. .8: Qual a diferen¸a b´sica entre mem´rias ROM e RAM? c a o 1.11: Procure nomes de linguagens de programa¸˜o n˜o listadas no texto e diga ca a quais s˜o as suas caracter´ a ısticas principais.4: Dˆ exemplos de microprocessadores e de microcomputadores.7: Defina Sistema Operacional. outra de perif´ricos de c e e e sa´ e finalmente uma de perif´ricos de entrada e sa´ ıda e ıda.5: Qual o n´mero exato de bytes em 64Kbytes? u 1. a a Listing 1. return 0. Este programa simples ilustra alguns das estruturas b´sicas que a ser˜o usadas nos programas C que ser˜o apresentados neste livro.1.5. uma de perif´ricos de entrada. As chaves ({ e }) marcam o in´ e o ca ıcio fim da fun¸˜o. 1. Para imprimir o texto Alo Mundo! o programa usa a fun¸˜o ca ca printf.10: Fa¸a trˆs listas.9: Procure em manuais. ca que foi quem iniciou a execu¸˜o do programa. } Exerc´ ıcios 1. que avisa ao sistema operacional. UM PROGRAMA EM C 39 valor inteiro (int) ao final de sua execu¸˜o e n˜o vai precisar receber nenhum ca a argumento para sua execu¸˜o (void).2: Quais os principais componentes de um computador? 1. ıcio a A fun¸˜o termina com o comando return 0. 1.

INTRODUCAO ¸˜ .40 CAP´ ITULO 1.

ca co Para resolver um problema no computador ´ necess´rio que seja primeirae a mente encontrada uma maneira de descrever este problema de uma forma clara ´ e precisa. ca A no¸˜o de algoritmo ´ central para toda a computa¸˜o. de como um problema pode ser resolvido caso forne¸amos uma seq¨ˆncia de passos que mostrem a maneira de obter a solu¸˜o. Isto porque n˜o existe um conjunto de reca a gras.Cap´ ıtulo 2 Algoritmos 2. Caso isto fosse 41 . A cria¸˜o de algoca e ca ca ritmos para resolver os problemas ´ uma das maiores dificuldades dos iniciantes e em programa¸˜o em computadores. Esta seq¨ˆncia de passos ´ chamada de algoritmo. Um a a ca exemplo simples e prosaico. e Uma vez que foi criado um algoritmo para resolver um determinado problema usando computadores passamos para a pr´xima fase que ´ a escrita deste o e algoritmo em alguma linguagem de programa¸˜o. ue e Usamos algoritmos em diversas atividades que realizamos diariamente. Uma grande parte destas atividades n˜o est˜o relacionadas com computa¸˜o. ou seja um algoritmo. E preciso que encontremos uma seq¨ˆncia de passos que permitam ue que o problema possa ser resolvido de maneira autom´tica e repetitiva. a solu¸˜o de um problema por computador ´ ca e baseada em dois pontos: a seq¨ˆncia de passos e a forma como os dados ser˜o ue a armazenados no computador. Portanto. c ue ca ´ uma receita para preparar um bolo. Iremos apresentar as constru¸˜es mais comuns empregadas no desenvolvimento de algoritmos e apreco sentaremos exemplos b´sicos de algoritmos usando algumas destas formas de a representa¸˜o e constru¸˜es.1 Introdu¸˜o ca O objetivo deste cap´ ıtulo ´ fazer uma breve introdu¸˜o ao conceito de algorite ca mos e apresentar algumas formas mais comuns de representar algoritmos para facilitar o entendimento dos demais cap´ ıtulos deste livro. que nos permita criar algoritmos. Al´m a e disto ´ preciso definir como os dados que ser˜o processados ser˜o armazenae a a dos no computador.

farinha ovos. Claro que existem ca linhas mestras e estruturas b´sicas. filho de Mois´s. O t´ ca ca ıtulo do livro deu origem tamb´m a palavra e ´ Algebra. No seu livro Fundamental Algorithms vol. com generalidade e sem restri¸˜es.42 CAP´ ITULO 2. Aur´lio Buarque de Holanda um algoa e ritmo ´ um: e Processo de c´lculo. Segundo o dicion´rio do prof. fermento. procedimento. executadas com precis˜o em um tempo finito por um humano usando a papel e l´pis. Isto significa que todas as opera¸˜es devem ser suficientemente b´sicas de modo que possam ser. em princ´ co a ıpio. co regras formais para a obten¸˜o de resultado ou de solu¸˜o de probca ca lema. O significado da palavra ´ muito similar ao de uma receita. isto ´ quantidades e que s˜o lhe s˜o fornecidas antes do algoritmo iniciar. ou de resolu¸˜o de um grupo de problemas a ca semelhantes. a . co Entradas: Um algoritmo deve ter zero ou mais entradas. ca Geralmente existem diversos algoritmos para resolver o mesmo problema. Khowˆrizm ´ hoje a cidade de Khiva. mas a solu¸˜o completa depende em grande parte do criador do algoritmo. a a e a e Este autor escreveu um livro chamado Kitab al jabr w´al-muqabala (Regras de Restaura¸˜o e Redu¸˜o). Maom´. cada um segundo o ponto de vista do seu criador. a a Sa´ ıdas: Um algoritmo deve ter uma ou mais sa´ ıdas. etc. Efetividade: Um algoritmo deve ser efetivo. isto ´ quantidades que tem e uma rela¸˜o espec´ ca ıfica com as entradas. a Um algoritmo computacional tem cinco caracter´ ısticas importantes: Finitude: Um algoritmo deve sempre terminar ap´s um n´mero finito de paso u sos. na ex Uni˜o Sovi´tica. Um algoritmo ´ um conjunto finito de regras que e e fornece uma seq¨ˆncia de opera¸˜es para resolver um problema esue co pec´ ıfico.) de modo a gerar uma sa´ que seja util (ou agrad´vel) ıda ´ a para o usu´rio (o bolo pronto). Ela seria derivada do nome de um famoso a matem´tico persa chamado Abu Ja´far Maom´ ibn Mˆsˆ al-Khowˆrism (825) a e ua a que traduzido literalmente quer dizer Pai de Ja´far. em que se estipulam. e t´cnica. rotina. e e de Khowˆrizm. 1 Donald Knuth apresenta uma vers˜o para a origem desta palavra. Um algoritmo opera sobre um conjunto de entradas (no caso do bolo. a partir das quais podemos criar algorita mos. ALGORITMOS poss´ ıvel a fun¸˜o de criador de algoritmos desapareceria. As ca a¸˜es devem ser definidas rigorosamente e sem ambiguidades. Defini¸˜o: Cada passo de um algoritmo deve ser precisamente definido.

Neste exemplo demos os nomes a. O valor digitado vai para uma posi¸˜o da mem´ria a ca o do computador. in´ ıcio enquanto n˜o fez 10 vezes fa¸a a c Levantar e abaixar bra¸o direito c Levantar e abaixar bra¸o esquerdo c Levantar e abaixar perna esquerda Levantar e abaixar perna direita fim enqto fim Computadores s˜o m´quinas muito eficientes na resolu¸˜o de problemas a a ca matem´ticos ou que envolvam n´meros. Um fator importante ´ e que pode haver mais de um algoritmo para resolver um determinado problema. etc. o a n˜o conseguir´ a ıamos sair de casa pela manh˜. mostrado no Algoritmo 2. qual o melhor meio de transporte etc. Se isto n˜o fosse verdade. que hora e a e sair de casa.2. posso escolher diversos meios de e transporte em fun¸˜o do pre¸o. rapidez. ir ao trabalho. a equa¸˜o n˜o possui ca a solu¸˜o. conforto. serem digitados em um teclado pelo usu´rio a que est´ usando o algoritmo. Por exemplo. vamos considerar o problema de resolver uma equa¸˜o do primeiro grau a ca da forma ax + b = 0 A solu¸˜o desta equa¸˜o ´ ca ca e x = −b/a se o valor de a for diferente de 0. voltar para casa. etc. decidir qual o melhor a caminho para chegar a um lugar. Observar que nesta a representa¸˜o do algoritmo cada linha cont´m uma instru¸˜o.1: Exemplo de Algoritmo. Os dois primeiros e passos do algoritmo servem para o algoritmo obter os valores dos coeficientes a e b. para ir de casa at´ o trabalho.2 Primeiros Passos ´ E claro que todos n´s sabemos construir algoritmos. que para facilitar o manuseio do dado.2) em uma pseudo-linguagem de programa¸˜o ficaria da seguinte maneira: ca As instru¸˜es do algoritmo s˜o executadas passo a passo e uma intru¸˜o co a ca somente ´ executada quando a anterior terminou sua tarefa. A escolha ser´ feita em ca c a fun¸˜o do crit´rio que melhor se adequar as nossas necessidades. Os valores podem. Um exemplo ca e de algoritmo pode ser as instru¸˜es que um professor passa aos seus alunos em co uma academia de gin´stica. Ap´s os dois primeiros passos o algoritmo executa uma o . Este algoritmo escrito (Algoritmo ca a a e ıvel 2. PRIMEIROS PASSOS 43 2.1. b e x as posi¸˜es de mem´ria usadas pelo programa co o para armazenar dados. por exemplo. j´ que n˜o ´ poss´ dividir por 0. ca e ca Algoritmo 2. Como exemplo de um algoritmo matea u m´tico. recebe um nome.2. Para que tudo isto seja feito ´ necess´rio uma s´rie de entradas do tipo: a que hora acordar. Caso a seja igual a 0.

e portanto. Isto significa calcular o resultado da equa¸˜o co a ca e atribuir este resultado ` x.2: Algoritmo para resolver uma equa¸˜o do primeiro grau. O ultimo passo. ALGORITMOS Algoritmo 2. como nos exemplos anteriores. Atualmente a maneira mais comum de representarse algoritmos ´ atrav´s de uma pseudo-linguagem ou pseudo-c´digo. ca Entrada: Coeficientes a e b da equa¸˜o ax + b = 0 ca Sa´ ıda: Resultado x da Equa¸˜o ca in´ ıcio ler a ler b se a = 0 ent˜o a imprimir ‘‘A equa¸~o nao tem solu¸~o’’ ca ca sen˜o a x ← −b/a imprimir ‘‘A raiz da equa¸~o vale ’’.3 Representa¸˜o ca As formas mais comuns de representa¸˜o de algoritmos s˜o as seguintes: ca a Linguagem Natural: Os algoritmos s˜o expressos diretamente em linguagem a natural. . Pseudo-linguagem: Emprega uma linguagem intermedi´ria entre a linguagem a natural e uma linguagem de programa¸˜o para descrever os algoritmos. Esta mensagem normalmente aparece em a um monitor de v´ ıdeo. o algoritmo executa as instru¸˜es entre a palavra ent~o e sen~o. x ca fim se fim instru¸˜o de teste para verificar se o valor de a ´ diferente de 0. Neste caso ca e podemos ter duas respostas e o computador ir´ escolher entre dois caminhos a independentes e exclusivos. Caso a seja diferente a zero. ca 2. o algoritmo executa as instru¸˜es entre sen~o e fim se. Esta forma e e o de representa¸˜o tem a vantagem de fazer com que o algoritmo seja escrito de ca uma forma que est´ mais pr´xima de uma linguagem de programa¸˜o de coma o ca putadores. desta op¸˜o ´ a impress˜o do a ´ ca e a resultado da equa¸˜o. imprime uma mensagem co a a de aviso para o usu´rio e termina. ca N˜o existe consenso entre os especialistas sobre qual seria a melhor maneira a de representar um algoritmo. No caso de a ser diferente de zero.44 CAP´ ITULO 2. Fluxograma Convencional: Esta ´ um representa¸˜o gr´fica que emprega e ca a formas geom´tricas padronizadas para indicar as diversas a¸˜es e decis˜es e co o que devem ser executadas para resolver o problema.

A Figura 2. . a in´ ıcio Obter as notas n1 .3 mostra e ca um algoritmo. e o Se a m´dia for maior que 5. O Algoritmo 2. Cada uma destas formas se aplica a uma detera minada a¸˜o como est´ indicado. para calcular a m´dia de um aluno e que faz trˆs provas e precisa de obter m´dia acima de 5. n2 e n3 Calcular m´dia. escrito em linguagem natural. e fim 2. vamos ca considerar o algoritmo 2. REPRESENTACAO ¸˜ 45 2.0).0 para ser aprovado. e e Algoritmo 2. a Início e Fim de Fluxograma Processamento Ponto de Decisão Entrada de Dados Manual Impressão de Resultados Conector para mesma página Figura 2.3. n2 e n3 . Como exemplo de um algoritmo escrito em forma de fluxograma. e Entrada: Notas n1 . no entanto nesta apostila estas ser˜o a suficientes para os exemplos que ser˜o mostrados.2 Fluxogramas Esta forma de representa¸˜o de algoritmos emprega v´rias formas geom´tricas ca a e para descrever cada uma das poss´ ıveis a¸˜es durante a execu¸˜o do algoritmos. Estas formas s˜o alguns exemplos e existem ca a a outras formas que podem ser aplicadas.2. Sa´ ıda: Resultado media do aluno e se ele foi aprovado ou n˜o.2 mostra um fluxograma para resolver este problema.1. co ca Existem algumas formas geom´tricas que s˜o empregadas normalmente e que e a est˜o mostradas na Figura 2. Usar a f´rmula ((n1 + n2 + n3 )/3.3.3: Algoritmo para calcular a m´dia das notas de um aluno.0 imprimir que o aluno foi aprovado e Caso contr´rio imprimir que o aluno foi reprovado.1 Linguagem Natural A representa¸˜o em linguagem natural tem a desvantagem de colocar uma ca grande distˆncia entre a solu¸˜o encontrada e o resultado final do processo a ca que ´ um programa em linguagem de programa¸˜o.2 para resolver uma equa¸˜o do primeiro grau da forma ax + b = 0.1: S´ ımbolos mais comumente usados em fluxogramas. a Imprimir a m´dia.3.

ALGORITMOS Obter a Obter b a =0 x=-b/a Não há raízes reais Imprime x Fim Figura 2.3.46 Início CAP´ ITULO 2.2 ıvel foi escrito em uma pseudo-linguagem. O algoritmo inicialmente lˆ a primeira nota e guarda esta nota e . Caso o valor de ca a ca a seja diferente os pr´ximos passos calculam o valor da solu¸˜o e em seguida o ca imprimem este resultado 2. ca Os dois primeiros passos do algoritmo lˆem os valores dos coeficientes a e e b da equa¸˜o. O algoritmo 2. Se o valor de a for igual a zero o algoritmo manda que seja impressa uma mensagem informando que a equa¸˜o n˜o tem solu¸˜o.3 Pseudo-Linguagem Este modo de representar algoritmos procura empregar uma linguagem que esteja o mais pr´ximo poss´ de uma linguagem de programa¸˜o de computao ıvel ca dores de alto n´ mas evitando de definir regras de constru¸˜o gramatical muito ıvel ca r´ ıgidas. A id´ia ´ usar as vantagens do emprego da linguagem natural.4) escrito em pseudo-linguagem. Em seguida h´ um teste para descobrir se o valor de a ´ igual ca a e a zero.2: Fluxograma para resolver uma equa¸˜o do primeiro grau. A maioria destas linguagens s˜o muito a parecidas e tˆm a vantagem de serem facilmente entendidas. Normalmente estas linguagens s˜o vers˜es a o ultra reduzidas de linguagens de alto n´ do tipo Pascal ou C. Este algoritmo serve para descobrir qual ´ a maior nota de um grupo de trˆs notas e e de um aluno. Vamos apresentar e agora um outro exemplo (Algoritmo 2. mas ree e stringindo o escopo da linguagem.

lˆ cada uma das outras notas e compara com e a nota guardada como a maior nota. O processador busca na mem´ria e executa o o uma instru¸˜o de cada vez.L^ terceira nota e ler notaAluno se notaAluno > maiorN ota ent˜o a maiorN ota ← notaAluno fim se imprimir “A maior nota das notas ´ ”. Caso a nota lida seja maior substitui o valor anterior pelo novo valor.4 Modelo de von Neumann Algoritmos para computadores se baseiam em alguns conceitos b´sicos e em um a modelo de computador e mem´ria que deve ser bem entendido para que se possa o criar algoritmos eficientes. Em seguida. um grupo de instru¸˜es formando parte de um o co algoritmo. MODELO DE VON NEUMANN 47 como a maior nota.L^ primeira nota e ler notaAluno maiorN ota ← notaAluno -. a n˜o ser que haja ca c a . Na Figura 2. A UC ir´ continuar buscando e executando ca a c a uma instru¸˜o de cada vez a partir dos endere¸os seguintes. As instru¸˜es tamb´m podem ser acompanhadas no Algoritmo 2.2.4.4: Algoritmo para calcular a maior nota de um grupo de notas. Entrada: Trˆs notas de um aluno. (maiorN ota) in´ ıcio -.L^ segunda nota e ler notaAluno se notaAluno > maiorN ota ent˜o a maiorN ota ← notaAluno fim se -. e Sa´ ıda: Maior das notas do aluno. a u ılia Assim em portuguˆs o seu nome seria J´nos Lajos Margittai Neumann.5. Algoritmo 2. ca Para ilustrar como este modelo funciona vamos analisar passo a passo a execu¸˜o de um algoritmo simples. de uma mem´ria. co e Vamos assumir que o computador come¸e executando o algoritmo a partir da c instru¸˜o que est´ no endere¸o 0.3 mostramos nos endere¸os ca c 0. maiorN ota e fim 2. (notaAluno). Em h´ngaro o nome de fam´ aparece antes. Este modelo foi proposto pelo matem´tico h´ngaro a u Neumann J´nos Lajos Margittai. 1 e 2. No modelo de computador proposto por von Neumann as instru¸˜es co e os dados ficam juntos na mem´ria. O seu e a pai comprou um t´ ıtulo e ele passou a se chamar J´nos Lajos Margittai von a Neumann.

e como veremos adiante. ler o dado a na posi¸˜o 10. que ´ a posi¸˜o 11. temos 3 leituras e uma escrita. Executa instru¸˜o.5: Modelo de mem´ria e funcionamento de um algoritmo o -. ler a instru¸˜o no endere¸o 2. ca 3. ap´s a instru¸˜o do endere¸o 0 ser lida da mem´ria e trazida para a o ca c o UCP. as transferˆncias entre a e e e mem´ria e o processador s˜o feitas passo a passo. Volta para o passo 1 buscando a instru¸˜o seguinte na mem´ria. co o Considere a ultima instru¸˜o do programa que pede para que os dados da posi¸˜o ´ ca ca 10 (a) e 11 (b) sejam somados e o resultado armazenado na posi¸˜o 12 (c). ca 3. ca 2. E importante observar que co o computador executa uma instru¸˜o de cada vez. Busca instru¸˜o. ca 4. c Portanto. O ciclo normal da execu¸˜o o a ca de um programa ´ ent˜o: e a 1. ca tamb´m um dado ´ buscado de cada vez.Armazena 8 na mem´ria no lugar chamado b o b←8 -. que descobre que a instru¸˜o manda carregar e ca o valor inteiro 2 na posi¸˜o de mem´ria 10.48 CAP´ ITULO 2. que ´ chamada de a para facilitar. ca co . ca o Portanto. ler o dado b na posi¸˜o 11. ca o e A instru¸˜o seguinte ordena a carga do valor inteiro 8 na posi¸˜o de mem´ria ca ca o chamada de b.Soma a com b e armazena no lugar chamado c c←a+b Observe que no modelo de von Neumann instru¸˜es e dados ficam na mem´ria. A ultima instru¸˜o ordena a soma dos valores e ca ´ ca armazenados em a e b e que o resultado seja armazenado na posi¸˜o chamada ca c. ALGORITMOS ´ uma ordem para desviar o fluxo das instru¸˜es. Para ca executar esta instru¸˜o. Decodifica instru¸˜o. ca 4. Portanto.Armazena 2 na mem´ria no lugar chamado a o a←2 -. ca c 2. a primeira ´ co e uma leitura de instru¸˜o e as restantes opera¸˜es com dados. escrever o resultado da soma no endere¸o 12. ela ´ decodificada pela UC. Destas opera¸˜es. o computador faz as seguintes opera¸˜es na mem´ria: ca co o 1. Algoritmo 2.

e a o Normalmente os lugares para onde v˜o estes dados recebem um nome para a facilitar o seu manuseio durante a execu¸˜o do algoritmo. Apesar de a no algoritmo 2.2 representar uma das a .5.3: Modelo de mem´ria o 2. disquetes e fitas magn´ticas. N˜o iremos neste ca a livro discutir em detalhes estes t´picos nem apresentar de uma maneira formal o qualquer uma destas formas.´ 2. a ca 2.5 Estruturas B´sicas de Algoritmos a Para ilustrar como criar algoritmos para computadores neste modelo. Para a o programador iniciante esta discuss˜o serve como introdu¸˜o. ESTRUTURAS BASICAS DE ALGORITMOS 0 1 2 3 4 5 6 7 49 a<-2 8 b<-8 9 c<-a+b 10 11 12 13 14 15 2 16 17 18 8 19 10 20 21 22 23 24 25 26 27 28 29 30 31 Endereço Endereço Endereço Endereço Endereço Endereço 0: Instrução a <--2 1: Instrução b <--8 2: Instrução c <--a+b 10: Dado a 11: Dado b 12: Dado c Figura 2.5. o comando ler a significa que o algoritmo ir´ obter um dado do teclado e ir´ armazen´-lo em uma a a a posi¸˜o de mem´ria que passar´ a ser conhecida pelo nome a. Para isto irea mos usar a representa¸˜o que for apropriada no momento.1 Comandos de leitura Estes comandos servem para obter dados do mundo exterior. ca Por exemplo. Costuma-se dizer ent˜o que a ´ a a ca a e uma vari´vel do algoritmo. vamos discutir alguns tipos b´sicos de estruturas usados nesta tarefa. Estas posi¸˜es ca o a co s˜o conhecidas por vari´veis em computa¸˜o. Estas estruturas s˜o ima portantes e ser˜o reapresentadas quando formos apresentar a linguagem C. Outros exemplos de lugares de onde a podem ser obtidos dados s˜o os arquivos em discos r´ a ıgidos. O interesse ´ apenas apresentar e discutir alguns e algoritmos para ilustrar o pensamento usado pelos programadores quando criam um algoritmo para resolver um problema espec´ ıfico. Estes dados s˜o lidos e guardados na mem´ria para posterior uso. normalmente digitados por um usu´rio em um teclado.

ca O comando pode ser seguido por uma lista de nomes separados por v´ ırgulas. Alguns exemplos de a comandos de impress˜o s˜o os seguintes: a a imprimir “Entre com o valor do coeficiente” imprimir “O valor de x ´ ”. Vamos considerar que as vari´veis e ıda ca a destes exemplos valem x = 10.5. c 2. O valor de x ´ 10 e O valor de x1 ´ 5 e o de x2 ´ 8 e e . O meio de apresenta¸˜o dos resultados. e para isto usamos os comandos de escrita. estes devem ser apresentados ao o ca usu´rio. a ca normalmente. no caso a. Por exemplo. ´ um monitor de v´ e ıdeo. ALGORITMOS constantes da equa¸˜o do primeiro grau no algoritmo ela ´ uma das vari´veis. x2 imprime os valores das vari´veis x1 e x2.2 Comandos de escrita Ap´s a obten¸˜o dos resultados do algoritmo. x e imprimir “O valor de x1 ´ ”. x1. Os valores normalmente s˜o digitados e ıdo a a separados por um ou mais espa¸os em branco ou em linhas diferentes. x1 = 5 e x2 = 8. b lˆ dois valores do teclado e os atribui as vari´veis a e b. O primeiro valor lido ´ atribu´ a primeira vari´vel. o comando a o imprimir x1. O segundo valor e ıdo a lido ´ atribu´ a segunda vari´vel (b). Observe que a ordem em e a que os valores foram digitados determina como os valores ser˜o atribu´ a ıdos. Por exemplo o comando ler a. Por exemplo o comando a imprimir x imprime o valor atual que est´ na mem´ria representada pelo nome x. Os trˆs comandos mostrariam e no perif´rico de sa´ os seguintes resultados: e ıda Entre com o valor do coeficiente. a o Da mesma forma que nos comandos de leitura ´ poss´ colocar uma lista e ıvel de nomes de vari´veis ap´s o comando.50 CAP´ ITULO 2. O comando imprimir pode ser usado para mandar mensagens de texto para o usu´rio do algoritmo das formas mais variadas. ”e o de x2 ´ ”. x2 e e Notar que os textos entre aspas indicam um texto que deve ser impresso no perif´rico de sa´ sem nenhuma modifica¸˜o. portanto varia de acordo com a execu¸˜o do algoritmo. ca e a Observe que cada vez que o algoritmo ´ executado a pode assumir um valor e diferente.

Nos algoritmos s˜o normalmente representados por uma ca a seq¨ˆncia de caracteres entre aspas. algarismos e caue racteres de pontua¸˜o. Estes dados resultam de express˜es do tipo x > 0. e a u a Dados alfa-num´ricos: s˜o os dados representados por caracteres. Dados Logicos: estes dados podem assumir dois valores verdadeiro e falso.5 0.5 -8. ainda que a a informalmente.5.3 Express˜es o Express˜es s˜o usadas para definir os c´lculos requeridos pelo algoritmo. por exemplo: ue . Iremos discutir dois tipos b´sicos de express˜es: express˜es arita o o m´ticas e express˜es l´gicas. por o a a exemplo −b/a.´ 2. Existem trˆs tipos b´sicos de co e a dados que iremos discutir: Dados num´ricos: como o nome indica s˜o os n´meros que ser˜o operados. quando formos estudar a linguagem C iremos apresentar mais formalmente as regras desta linguagem para estas representa¸˜es. Nesta discuss˜o vamos estabelecer.5. S˜o exemplos de n´meros inteiros: a a u +3 3 -324 -50 S˜o exemplos de n´meros reais: a u +0.0 Dados alfa-num´ricos servem para tratamento de textos e normalmente s˜o e a compostos por uma seq¨ˆncia de caracteres contendo letras. Como care a acteres podem ser letras. algumas regras que limitam os conjuntos de dados existentes na Matem´tica e estabelecem que dados poder˜o ser manipulados pelos algoritmos.175 2. a a Isto ocorre porque os computadores possuem limita¸˜es que os impedem de maco nipular todos os tipos de dados que um ser humano pode tratar. ESTRUTURAS BASICAS DE ALGORITMOS 51 2. o Os dados num´ricos que os algoritmos que iremos construir podem manipular e s˜o de dois tipos: inteiros e reais. Mais adiante. algarismos e sinais diversos estes dados recebem este nome. e o o Express˜es manipulam dados dentro dos algoritmos. Uma pergunta imporo tante neste momento ´: que tipo de dados poderemos manipular? As linguagens e de programa¸˜o normalmente estabelecem regras precisas para definir que tipos ca de dados elas ir˜o manipular.

Em muitos o e textos este tipo de dados tamb´m ´ chamado de tipo de dados booleanos. considere a decis˜o abaixo: a se a = 0 ent˜o a imprimir ‘‘A equa¸~o nao tem solu¸~o’’ ca ca sen˜o a x ← −b/a imprimir ‘‘A raiz da equa¸~o vale ’’. Em computa¸˜o as express˜es devem ser escritas em lina ca o has e para alterar a prioridade deve-se usar parˆnteses. a a . Maiores detalhes sobre e express˜es ser˜o apresentados no Cap´ o a ıtulo XXX. Express˜es Aritm´ticas o e Para os nossos exemplos iniciais iremos adotar os operadores aritm´ticos bin´rios e a mostrados na Tabela 2.3. durante o o processamento de um algoritmo. matem´tico que deu ao nome ` ´lgebra (´lgebra booleana) que a aa a manipula este tipo de dados.5. Nos nossos algoritmos estes valores ser˜o represena tados por verdadeiro e falso. baseados nestes dois valores. Os exemplos a seguir mostram como converter uma exo press˜o matem´tica para a forma que usaremos em pseudo-linguagem. A coluna prioridade indica a prioridade relativa dos operandos. Por exemplo. que procura descobrir se o valor ca a de raiz ´ maior que 0. Esta express˜o somente pode ter como resultado os e a valores: verdadeiro ou falso. x ca fim se Nesta instru¸˜o aparece a express˜o a = 0. No momento estamos apresentando alguns conceitos b´sicos para facilitar a discuss˜o de alguns algoritmos. devido e e a George Boole. a a Para ilustrar o uso de operadores aritm´ticos vamos considerar alguns exe emplos de express˜es. Os dados deste tipo somente podem assumir dois valores: verdadeiro e falso. ALGORITMOS ‘‘Linguagem de programa¸~o’’ ca ‘‘Qual ´ o seu nome?’’ e ‘‘12345’’ Dados l´gicos s˜o intensamente aplicados durante o processo de tomada o a de decis˜es que o computador frequentemente ´ obrigado a fazer. Computadores tomam decis˜es. Quando temos dois u operandos de mesma prioridade o computador ir´ executar primeiro a opera¸˜o a ca mais ` esquerda. O menor n´mero indica a maior prioridade.52 CAP´ ITULO 2.

Se estiver chovendo irei ao cinema.4 e em pseudo linguagem tem a forma mostrada no algoritmo 2. Observe que para ir para a a a praia basta apenas que n˜o esteja chovendo.5.5 Comandos de controle S˜o usados para controlar o fluxo de execu¸˜o das instru¸˜es.5. .1: Operadores Aritm´ticos.5. Normalmente estes valores a co o podem ser constantes ou resultados de express˜es dos diversos tipos.6. ca a x ← −b/a media ← (n1 + n2)/2 inicio ← 0 nome ← ‘‘Ze Sa’’ 2. Exemplos o de comandos de atribui¸˜o s˜o mostrados a seguir.´ 2.7. ESTRUTURAS BASICAS DE ALGORITMOS Operador / * % + Descri¸˜o ca Divis˜o a Multiplica¸˜o ca M´dulo (resto da divis˜o de o a operandos inteiros) Soma Subtra¸˜o ca Prioridade 0 0 0 1 1 53 Tabela 2. nenhum outro teste foi feito. Tenho que decidir o que fazer em um domingo de folga. Um exemplo de uso desta contru¸˜o escolhido a partir da vida real pode ser ca o seguinte. caso contr´rio irei ` praia. e Express˜o a Matem´tica a a b+c a+b c+d 2 b − 4ac 1 1 1+ a+b Express˜o em a Pseudo-linguagem a/(b+c) (a+b)/(c+d) b*b-4*a*c 1/(1 + 1/(a+b)) 2.4 Comandos de atribui¸˜o ca Servem para atribuir valores ` posi¸˜es de mem´ria. Para ca estes exemplos iniciais vamos mostrar somente o comando mais b´sico que serve a para o computador escolher entre dois poss´ ıveis caminhos qual o algoritmo deve seguir. Nas linguagens de a ca co programa¸˜o existem diversos tipos de diferentes de comandos de controle. Este comando representado em fluxograma pode ser visto na Figura 2. Esta a decis˜o em forma de pseudo-linguagem fica da maneira mostrada no Algoritmo a 2.

54 CAP´ ITULO 2.. A Figura 2.4: Fluxograma do comando se . Para u estes exemplos de algoritmos iremos apresentar um comando de repeti¸˜o que ca . a Algoritmo 2. a 2. No enc tanto. vamos a assumir que decidimos ir ao cinema no domingo chova ou fa¸a sol.6 Comandos de repeti¸˜o ca As linguagens de programa¸˜o normalmente possuem diversos comandos que ca permitem que um trecho de algoritmo seja repetido um n´mero de vezes.8. Observe que no caso de n˜o estar chovendo nada a precisa ser feito.5. O algoritmo para este caso est´ a mostrado no Algoritmo 2..5 mostra esta decis˜o em forma de fluxograma. preciso decidir se levo um guarda-chuva. As vezes precisamos somente de decidir se devemos fazer algo ou n˜o Por exemplo. ent~o .. a sen~o.6: Comando se em pseudo-linguagem se Condi¸ao sendo testada ent˜o c˜ a Fa¸a isto c sen˜o a Fa¸a aquilo c fim se Nem sempre nos algoritmos precisamos de duas alternativas.. ALGORITMOS Algoritmando Falso Condição Verdadeiro Faça isto Faça aquilo Continuo algoritmando Figura 2.

9 mostra como seria implementado este a e e problema. Vamos mostrar um exemplo onde o n´mero de repeti¸˜es n˜o ´ conhecido. O Algoritmo 2. Neste algoritmo sabemos a a u e quantidade de n´meros a serem lidos e portanto o n´mero de repeti¸˜es ´ pr´u u co e e determinado. Como exemplo consideremos o caso em que precisamos ler um conjunto de 10 n´meros e imprimir se cada um dos n´meros lidos ´ par ou n˜o. O ıcio final do comando enquanto normalmente ´ marcado de alguma forma. u a e Mas ent˜o. u co a e Considere no exemplo anterior que o total de n´meros a ser lido n˜o ´ conhecido.5. No momento que for u u lido um n´mero negativo o algoritmo p´ra. O comando funciona da seguinte maneira: Passo 1: Testar se a condi¸˜o ´ verdadeira.8: Algoritmo para decidir se deve levar um guarda-chuva.6. Mais adiante faremos um exemplo onde o n´mero de repeti¸˜es u co n˜o ´ pr´-determinado. Passo 2: Executar o bloco de comandos at´ o fim do enquanto. Este comando. como o algoritmo ir´ terminar de ler n´meros? Usaremos o que a a u costuma-se chamar de sentinela em computa¸˜o. Para descobrir u u e a se o n´mero ´ par vamos dividi-lo por 2 e testar o resto. Caso seja verdade executar o bloco ca e de comandos situados entre o in´ do comando e o final do comando. ESTRUTURAS BASICAS DE ALGORITMOS Algoritmo 2. O Algoritmo 2. Em e nossa pseudo-linguagem marcaremos o fim pelas palavras fim enquanto. O algoritmo ir´ se manter ca a lendo n´meros enquanto os n´meros forem positivos. Observe que neste algoritmo . se est´ chovendo ent˜o a a vou ao cinema sen˜o a vou ` praia a fim se Algoritmo 2.10 mostra como fica u e u em pseudo-linguagem o algoritmo modificado. que e chamaremos de comando enquanto tem a forma mostrada na Figura 2. A sentinela que indica o final da u a lista de n´meros ´ um n´mero negativo.´ 2. Lembrar que caso o u e resto da divis˜o seja igual a zero o n´mero ´ par. Vestir para ir ao cinena se est´ chovendo ent˜o a a pego guarda-chuva fim se Vou ao cinema 55 ´ suficientemente geral para substituir todos os outros. Quando chegar e ao fim retornar automaticamente para o in´ ıcio do comando e refazer o passo 1.7: Algoritmo para decidir o que fazer no domingo.

0 e que a turma tem 25 alunos. Exemplo 2. No entanto. O algoritmo 2. Isto porque u assumimos que o primeiro n´mero que for digitado pode ser negativo e portanto u a lista de n´meros n˜o tem nenhum n´mero. depois compara cada nota com esta maiorN ota caso ela seja maior substitui o valor anterior pelo novo valor. existe uma solu¸˜o mais geral ainda que permite que ca o algoritmo possa ser usado para qualquer tamanho de turma. . A raz˜o ´ a u a a e simples.6 Exemplos de Algoritmos Nesta se¸˜o iremos apresentar uma s´rie de algoritmos escritos na pseudoca e linguagem que acabamos de apresentar.0 e 10. Neste algoritmo iremos considerar que as notas podem variar entre 0.11 inicialmente inicia a maiorN ota com zero. Vocˆ poderia a e perguntar porque n˜o usar o n´mero 25 toda vez que for necess´rio.1: Este algoritmo serve para descobrir qual ´ a maior nota de uma e turma de alunos. Este problema est´ apresentado na lista de exerc´ a ıcios deste cap´ ıtulo. ALGORITMOS Vestir para ir ao cinema Falso Chovendo? Verdadeiro Pegar guarda-chuva Ir ao cinema Figura 2. Suponha que vocˆ gostaria de usar este algoritmo para calcular a maior e nota de uma turma de 40 alunos. Neste algoritmo bastaria substituir o n´mero u 25 por 40. Observar que criamos uma vari´vel para armazenar a quantidade de alunos.56 CAP´ ITULO 2. u a u 2.5: Fluxograma para decidir se deve levar um guarda-chuva. o primeiro n´mero tem de ser lido antes do comando enquanto.

2: Vamos mostrar outro exemplo de algoritmo muito usado. uma para cada dia do ano. e Vamos assumir que a turma tem 25 alunos e as notas est˜o entre 0 e 10. A tarefa ´ descobrir qual ´ a maior temperatura do ano passado. Precisamos ler as notas de uma turma de alunos e calcular a m´dia destas notas. Como dica.11 usado para descobrir a maior a nota da turma.13.6.3: Neste exemplo considere o seguinte problema. Pega a primeira temperatura e a anota como a menor j´ encontrada. Quando n˜o houver a . Neste caso n˜o podemos aplicar o algoritmo 2. Se a temperatura tirada dos arquivos for menor que a menor atual.2.6: Fluxograma do comando enquanto. a considere que estamos no polo sul e portanto todas as temperaturas lidas s˜o a negativas. o algoritmo joga fora a temperatura anotada e guarda a que foi lida como a nova menor temperatura. EXEMPLOS DE ALGORITMOS 57 Algoritmando Falso Testa Condição Verdadeiro Bloco de comandos do enquanto Continuo algoritmando Figura 2. O a algoritmo est´ mostrado em Algoritmo 2.12. Exemplo 2. Uma solu¸˜o poss´ ca ıvel para este exemplo est´ mostrada no algoritmo 2. Um escrit´rio de o previs˜o do tempo armazena diariamente a temperatura m´dia de uma detera e minada regi˜o. a Este algoritmo faz o seguinte. A partir da´ o algoritmo fica repetidamente lendo tema ı peraturas dos registros do escrit´rio comparando com a temperatura que no o momento consta como a menor de todas. Antes de continuar procure encontrar a raz˜o. a e e Assuma que foram armazenadas 365 temperaturas. a Exemplo 2.

00. Vamos assumir agora que o usu´rio sempre digita um n´mero. Ou seja.00 por hora extra. a u mas este n´mero pode estar fora do intervalo 0 a 10. a Entrada: 10 n´meros. ALGORITMOS Algoritmo 2. 2. poderemos ter u uma nota menor que zero ou maior que 10. (numero).00 mais 25% sobre e o que passar de R$ 12000.5: Nos exerc´ ıcios anteriores assumimos que os usu´rios sempre digitam uma a nota entre 0 e 10. O tamanho da turma deve ser o primeiro dado pedido ao usu´rio.9: Algoritmo para ler 10 n´meros e imprimir se s˜o pares u a ou n˜o.1: Uma empresa paga R$10. Exerc´ ıcios 2. a 2. u Sa´ ıda: Se o n´mero ´ par ou n˜o u e a in´ ıcio totalN umeros ← 10 enquanto totalN umeros > 0 fa¸a c ler numero se numero%2 = 0 ent˜o a imprimir numero. ”impar” fim se totalN umeros ← totalN umeros − 1 fim enqto fim mais temperaturas para ler a que estiver anotada como a menor ´ a menor e verdadeiramente. 2. Escreva um algoritmo que leia o total de horas normais e o total de horas extras trabalhadas por um empregado em um ano e calcule o sal´rio a anual deste trabalhador.58 CAP´ ITULO 2.00. Caso o sal´rio seja maior a a que este valor o imposto devido ´ igual a 10% sobre R$ 12000.4: Modifique o algoritmo anterior de modo que ele imprima tamb´m quantas e vezes a maior nota aparece. ”par” sen˜o a imprimir numero.2: Assuma que o trabalhador do exerc´ anterior deve pagar 10% de imposto ıcio se o seu sal´rio anual for menor ou igual a R$ 12000. Modifique o algoritmo anterior .3: Escreva um algoritmo que descubra a maior nota de uma turma de alunos. Escreva um programa que calcule o imposto devido pelo trabalhador. 2.00 por hora normal trabalhada e R$ 15.

8: Escreva um algoritmo que leia uma hora em horas. a Entrada: n´meros. minutos e segundos e some um segundo a hora lida.2. ele tem de ser decomposto em trˆs e e n´meros: os algarismos das centenas.10: Algoritmo para ler n´meros e imprimir se s˜o pares ou u a n˜o. mes e ano e imprima a data mais recente. O algoritmo p´ra quando um n´mero u a u negativo ´ lido e Sa´ ıda: Se o n´mero ´ par ou n˜o u e a in´ ıcio ler numero enquanto numero > 0 fa¸a c se numero % 2 = 0 ent˜o a imprimir numero. O algoritmo deve insistir at´ que o usu´rio digite um valor v´lido. e a a 2. ”par” fim se imprimir numero.6. 2.7: Escreva um algoritmo que leia um n´mero inteiro entre 100 e 999 e imprima u na sa´ cada um dos algarismos que comp˜em o n´mero. .9: Escreva um algoritmo que leia duas datas em dia. ”impar” ler numero fim enqto fim 59 para que ele verifique a nota digitada e. 2. Observe que o n´mero ıda o u u ´ lido com um valor inteiro. uma mensagem avisando o usu´rio seja impressa e uma nova nota seja a a pedida. (numero). portanto. caso o aluno tenha digitado uma nota inv´lida.6: Escreva um algoritmo que leia trˆs n´meros e os imprima em ordem crese u cente. e. u 2. dezenas e unidades. EXEMPLOS DE ALGORITMOS Algoritmo 2.

mediaN otas e e fim .11: Algoritmo para calcular a maior nota de uma turma de 25 alunos. (notaAluno). (notaAluno). Entrada: Nota de cada um dos dos 25 alunos da turma.12: Algoritmo para calcular a nota m´dia de uma turma de e 25 alunos.60 CAP´ ITULO 2. (maiorN ota) in´ ıcio totalAlunos ← 25 maiorN ota ← 0. maiorN ota e fim Algoritmo 2. (mediaN otas) e in´ ıcio totalAlunos ← 25 somaN otas ← 0.0 enquanto totalAlunos > 0 fa¸a c ler notaAluno somaN otas ← somaN otas + notaAluno totalAlunos ← totalAlunos − 1 fim enqto mediaN otas ← somaN otas/25 imprimir ”A m´dia das notas ´ ”. Sa´ ıda: M´dia das notas dos alunos.0 enquanto totalAlunos > 0 fa¸a c ler notaAluno se notaAluno > maiorN ota ent˜o a maiorN ota ← notaAluno fim se totalAlunos ← totalAlunos − 1 fim enqto imprimir ”A maior nota das notas ´ ”. Entrada: Nota de cada um dos dos 25 alunos da turma. Sa´ ıda: Maior das notas dos alunos. ALGORITMOS Algoritmo 2.

(maiorT emperatura) in´ ıcio totalT emperaturas ← 365 ler temperatura J´ li uma temperatura a totalT emperaturas ← totalT emperaturas − 1 -. maiorT emperatura e fim .2. (temperatura). Sa´ ıda: Maior das temperaturas. EXEMPLOS DE ALGORITMOS 61 Algoritmo 2.A primeira temperatura ´ a maior temperatura e maiorT emperatura ← temperatura enquanto totalT emperaturas > 0 fa¸a c ler temperatura se temperatura > maiorT emperatura ent˜o a maiorT emperatura ← temperatura fim se totalT emperaturas ← totalT emperaturas − 1 fim enqto imprimir ”A maior nota das notas ´ ”.13: Algoritmo para calcular a maior temperatura do ano.6. Entrada: Temperaturas registrada em ano.

62 CAP´ ITULO 2. ALGORITMOS .

2 3. Constantes e Vari´veis a 3. Caracateres geralmente s˜o are a mazenados em c´digos (usualmente o c´digo ASCII). Vari´veis devem receber a nomes para poderem ser mais facilmente referenciadas e modificadas sempre que necess´rio.1 Introdu¸˜o ca Vari´veis e constantes s˜o os elementos b´sicos que um programa manipula. o a int: O valor armazenado ´ um n´mero inteiro e o tamanho do subconjunto que e u pode ser representado pelo computador normalmente depende da m´quina a em que o programa est´ rodando. Atualmente em C os n´meros inteiros a u s˜o armazenados em 32 bits. A Tabela A.1 mostra o o este c´digo. Muitas linguagens de programa¸˜o exigem que os programas a ca declarem todas as vari´veis antes que elas possam ser usadas. reais. As express˜es combinam vari´veis e constantes para calcular novos valores. Tipos podem ser por exemplo: inteiros.2. a a a Uma vari´vel corresponde a um espa¸o reservado na mem´ria do computaa c o dor para armazenar um determinado tipo de dado. Estas declara¸˜es a co especificam de que tipo s˜o as vari´veis usadas pelos programas e as vezes um a a valor inicial. etc. o a 3. caracteres. Caracteres s˜o armazenados em um byte.1 Tipos de Dados Tipos B´sicos a Os dados em C podem assumir cinco tipos b´sicos que s˜o os seguintes: a a char: O valor armazenado ´ um caracter.Cap´ ıtulo 3 Tipos de Dados. a 63 .

CONSTANTES E VARIAVEIS float: N´mero em ponto flutuante de precis˜o simples.3 Constantes Num´ricas e Constantes s˜o valores que o programa n˜o pode modificar durante a execu¸˜o a a ca de um programa. O e uso de signed com int ´ redundante.1 que lista os tipos b´sicos definidos no padr˜o ANSI a a e a sua excurs˜o.64 ´ CAP´ ITULO 3. a 3. Deste modo n˜o ´ a a e necess´rio guardar o bit de sinal do n´mero e somente n´meros positivos s˜o a u u a armazenados. Elas s˜o usadas em express˜es para representar v´rios tipos de a o a valores. Estes modificadores s˜o palaa vras que alteram o tamanho do conjunto de valores que o tipo pode representar.2. a signed: Este modificado tamb´m pode ser aplicado aos tipos int e char. a Uma das aplica¸˜es deste tipo em C ´ criar um tipo vazio que pode posteco e riormente ser modificado para um dos tipos anteriores. com isto a precis˜o e u a a as vezes a excurs˜o dos n´meros aumenta. Para escrever constantes num´ricas vamos usar as seguintes defini¸˜es: e co . Um outro modificador obriga que s´ n´meros u o u inteiros sem sinal possam ser armazenados pela vari´vel. Em C existem regras r´ ıgidas para determinar como devem ser escritos estes valores. u double: N´mero em ponto flutuante de precis˜o dupla. os computadores somente a u podem armazenar e trabalhar com uma pequena parte do conjunto dos n´meros reais. void: Este tipo serve para indicar que um resultado n˜o tem um tipo definido. normalmente 32 bits. ou seja o tipo passa a ter um bit a mais. no entanto. u ´ E poss´ ıvel combinar estes modificadores de diversas maneiras como est´ a mostrado na Tabela 3. A seguir iremos mostrar estas regras. Os modificadores de tipos s˜o os seguintes: a unsigned: Este modificador pode ser aplicado aos tipos int e char e faz com o bit de sinal n˜o seja usado. Por exemplo. um modificador permite que possam ser usados mais bits para armazenar n´meros inteiros.2 Modificadores de tipos Modificadores podem ser aplicados a estes tipos. TIPOS DE DADOS. u a S˜o conhecidos como n´meros reais. Este tipo ´ armazenado em 64 a u e bits. e long: Modificador que pode ser aplicado aos tipos int e double aumentando o n´mero de bytes reservado para armazenamento de dados. 3. O resultado pr´tico ´ que o conjunto praticamente dobra de a e tamanho.

b. sufixo: sufixo sem sinal.483.073.483.294. a co .223. 5. a.647 -2. 6. 3.967.647 0 a 4.648 a 2.854.223. 2.768 a 32.767 -2. 4.768 a 32.775. 7.483. CONSTANTES NUMERICAS Tipo char unsigned char signed char int unsigned int signed int short int.147. l. c. 7 d´ ıgito hexa: 0. sufixo longo sufixo sem sinal: u.483. 6.036.372.808 a 9. L sufixo flutuante: f.854.854. 8.036. 4. 1.483. B. 6.854.223.483.551.147. 3. e.295 -2.1: Tipos de dados definidos pelo Padr˜o ANSI C. 5. C.807 -9.808 a 9. E. 3. 4.147. F.147.648 a 2.´ 3. 9 d´ ıgito sem zero: 1.647 0 a 4.446.775.223. 1. 5. 9.767 0 a 65. 8.483. 2. 6. A. L O uso destas caracteres ser´ mostrado com exemplos nas se¸˜es seguintes.775.615 oito d´ ıgitos de precis˜o a 16 d´ ıgitos de precis˜o a 16 d´ ıgitos de precis˜o a 65 Tabela 3.147. 4. F sinal: +. a d´ ıgito: 0.036. 7. short unsigned short int signed short int long int. U sufixo longo: l. 2. long signed long int unsigned long int long long int long long signed long long int signed long long unsigned long long int unsigned long long float double long double Bytes 1 1 1 4 4 4 2 2 2 4 4 4 8 8 8 4 8 12 Faixa M´ ınima -127 a 127 0 a 255 -127 a 127 -2. f. 1. 7.648 a 2.648 a 2. 3.147.744.294. D. d.483.535 -32.807 0 a 18.967. 8.372.147. ponto decimal: .036. 5.372.372.147. 2.3.775.295 -9.647 -32. 9 d´ ıgito octal: 0.709.

em qualquer ordem. pelo menos. Um par de L´s (l´s) indica que a constante ´ do tipo long long.2 mostra exemplos de e n´meros inteiros: u Tipo int unsigned int long int unsigned long int long long unsigned long long Constantes -3 +5 45u 12345U 1997L -3l 45Lu 23Ul 1997Ll -3ll 45LLu 23Ull 1997 1997U 1234L 1997UL 134LL 1997ULL 7 0U +0L 0LU +0LL 0LLU Tabela 3.1 Constantes Inteiras na base 10 S˜o valores num´ricos sem ponto decimal. u o o pode ser seguido por uma seq¨ˆncia de zero ou mais algarismos. A tabela 3. Colchetes indicam ca op¸˜o. por espa¸os em branco. Para constantes inteiras o sufixo U (u) representa o modificador unsigned. N˜o a e a a ´ poss´ separar. Como sufixo ue podemos ter opcionalmente as letras u (U) ou l (L) ou uma mistura. Alguns c a exemplos de constantes inteira longas est˜o mostrados na Tabela 3. O sufixo L (l) representa o modificador long.) a e ıvel • . portanto.66 ´ CAP´ ITULO 3. o sinal do valor num´rico.) a e ıvel ca Nos compiladores modernos o n´mero de bytes usados para armazenar os u valores inteiros ´ o mesmo tanto para tipos inteiros (int) quanto para tipos e inteiros longos (long int). como est´ mostrado na Tabela 3. TIPOS DE DADOS. o fato de sinal (+ ou -) estar entre colchetes significa que um ca n´mero inteiro pode ou n˜o ter sinal. um algarismo entre 1 e 9. A seguir temos a palavra d´gito ı entre chaves. Por esta raz˜o. CONSTANTES E VARIAVEIS 3. um n´mero inteiro. Isto ´ dados inteiros devem come¸ar ı e o e c por.0 (N˜o ´ poss´ usar ponto decimal. Em seguida temos u a e e um d´gito sem zero que ´ obrigat´rio. Portanto.1.3. ap´s o algarismo inicial obrigat´rio. a . das duas.2: Constantes Inteiras na Base 10 Alguns exemplos de erros na escrita de constantes inteiras s˜o: a • 1.2. Podemos e ıvel c e descrever este formato com uma nota¸˜o simplificada da seguinte maneira: ca [sinal]d´gito sem zero{d´gito}[sufixo sem sinal|sufixo longo] ı ı Esta nota¸˜o deve ser entendida da seguinte maneira. As chaves indicam que o fator entre elas pode ser repetido zero ou mais vezes. a a a diferen¸a entre estes dois tipos de constantes perdeu a raz˜o de ser.) a e ıvel c e • 23 (N˜o ´ poss´ usar nota¸˜o de expoentes. precedidos ou n˜o por um sinal. isto ´ o sinal ´ opcional.345 (N˜o ´ poss´ colocar um espa¸o entre o sinal e o valor num´rico.

CONSTANTES NUMERICAS 67 3. Para escrever constantes na base 16 usamos todos os algarismos e ainda as letras A (ou a).3. S˜o iniciadas com um 0x ou 0X. B (ou b).2 Constantes Inteiras Octais S˜o constantes representadas na base 8.3. N´meros escritos na base 8 somente podem ser escritos com algarismos entre 0 u e 7 inclusive.´ 3. Normalmente s˜o representadas sem a a sinal e devem come¸ar com um 0. 14 e 15. 13.3 Constantes Inteiras Hexadecimais S˜o constantes representadas na base 16.4 mostramos exemplos de constantes hexadecimais e o seu valor na base 10.3 mostramos exemplos de constantes octais e o seu valor na base 10. Base 8 025 077 011 010ul 0175 Base 10 21 63 9 8 125 Tabela 3.3: Constantes octais 3. a a Usando a nota¸˜o podemos definir uma contante hexadecimal como: ca [0x|0X]d´gito hexa{d´gito hexa}[sufixo sem sinal|sufixo longo] ı ı Na Tabela 3.3. 11. E (ou e). D (ou d). Base 16 0xF 0X25 0XAB 0XBEEF Base 10 15 37 171 48879 Tabela 3.4: Constantes hexadecimais . Usando a nota¸˜o apresentada na se¸˜o c ca ca anterior podemos definir a forma que deve ter uma constante octal como: 0 {d´gito octal}[sufixo sem sinal|sufixo longo] ı Na Tabela 3. que representam respectivamente os seguintes valores 10. 12. F (ou f). C (ou c).

10 e 3 nesta ordem. A equa¸˜o 3. Aplicando a f´rmula 3. Constantes de ponto flutuante podem ser do tipo float.2 mostra a f´rmula para converter um n´mero em uma ca o u base b qualquer para a base 10. .1 mostra como converter e a ´ um n´mero (N )10 para uma base b. long ou long double. O a u nome ponto flutuante ´ devido ao modo como os valores s˜o armazenados pelo e a computador. Por exemplo.2 temos o (3AF )16 = 3 × 162 + 10 × 161 + 15 × 160 = (943)10 O algoritmo para converter um n´mero inteiro da base 10 para uma determiu nada base b ´ feito por um conjunto de divis˜es sucessivas do n´mero pela base e o u at´ que o resultado da divis˜o seja 0. E importante notar que os algarismos na u base b v˜o sendo impressos na ordem inversa. 3. do menos significativo para o mais a significativo.1) Esta equa¸˜o est´ escrita na base 10. aplicando a equa¸˜o 3. O Algoritmo 3. caso forne¸amos para o algoritmo o n´mero (943)10 c u e a base 16. d1 d0 onde 7 ≤ di ≤ 0 A f´rmula para converter um n´mero da base 8 para a base 10 ´ a seguinte o u e N10 = dn−1 × 8n−1 + dn−2 × 8n−2 + · · · + d1 × 81 + d0 × 80 (3. Nesta base os d´ ıgitos di ficam no intervalo b − 1 ≤ di ≤ 0.5 Constantes em Ponto Flutuante Constantes em ponto flutuante s˜o usadas para representar n´meros reais. CONSTANTES E VARIAVEIS 3. Considere uma base ca qualquer representada por b. Constantes sem nenhum sufixo s˜o consideradas do tipo a . Vamos considerar que um n´mero (N )8 escrito na base 8 tenha a u seguinte forma (N )8 = dn−1 dn−2 . .3.2) Vamos considerar a contante inteira (3AB)16 . TIPOS DE DADOS. Por exemplo. A e 3 e.68 ´ CAP´ ITULO 3. double. portanto. N10 = dn−1 × bn−1 + dn−2 × bn−2 + · · · + d1 × b1 + d0 × b0 (3.3. o algoritmo iria imprimir os resultados 15.1 ca a ca para converter o n´mero 0175 da base 8 para a base 10 ficamos com u (0175)8 = 1 × 82 + 7 × 81 + 5 × 80 = (125)10 A f´rmula para convers˜o da base 8 para a base 10 pode se estendida para o a uma base qualquer com a substitui¸˜o do algarismo 8. Isto corresponderia aos seguintes d´ ıgitos da base 16: F. que pode ser estendida para converter n´meros entre qualquer base e u a base 10.4 Convers˜o entre Bases a A convers˜o de n´meros inteiros entre a base 8 e a base 10 tem uma f´rmula a u o simples. a resposta seria (3AF )16 .

15E1). desde que um expoente seja u usado. . mas nunca os dois grupos. Uma fra¸~o ´ definida como: ca e fra¸~o = [seq digitos] ponto decimal seq d´gitos ou ca ı ı fra¸~o = seq d´gitos ponto decimal ca O expoente e a sequˆncia de d´ e ıgitos s˜o definidos como: a ı expoente = [e | E][sinal]seq d´gitos seq d´gitos = d´gito{d´gito} ı ı ı A Tabela 3. os n´meros . Caso seja usado o sufixo F ou o f a constante ser´ considerada como a do tipo float. Vocˆ pode escrever um n´mero com ponto decimal (1.3. u a u Para mostrar mais formalmente como se deve escrever as constantes de ponto flutuante vamos usar a mesma nota¸˜o usada at´ aqui. 1E1 s˜o n´meros de ponto flutuante.5) ou na chamada forma e u cient´ ıfica. Primeiro damos uma defini¸˜o co ca mais geral que vai sendo mais detalhada a medida que avan¸amos. usando a forma hier´rquica. CONSTANTES NUMERICAS Algoritmo 3. 1234. mas usando uma hierarca e quia de defini¸˜es para facilitar o entendimento. u Sa´ ıda: D´ ıgitos do n´mero na base b u in´ ıcio ler numero ler base enquanto numero > 0 fa¸a c resto ← numero % base numero ← numero / base imprimir resto fim enqto fim 69 double.´ 3. a Portanto. E poss´ e ıvel omitir ou os d´ ıgitos antes do ponto (a parte ´ inteira) ou ap´s (a parte fracion´ria). em que um expoente ´ usado (0.. Na segunda forma o n´mero e u ´ ´ igual a 0. E poss´ o a ıvel escrever um n´mero em ponto flutuante sem ponto. Lembrar c que termos entre chaves podem ser repetidos 0 ou mais vezes e termos entre colchetes s˜o opcionais.5 mostra exemplos de constantes em ponto flutuante. uma constante de ponto flutuante a (CPF) pode ser definida das seguintes maneiras: CPF = [sinal]fra¸~o[expoente][sufixo flutuante] ca CPF = [sinal]seq d´gitos expoente[sufixo flutuante] ı A seguir definimos cada um dos componentes.8.1: Algoritmo para converter inteiros na base 10 para uma base b. (numero) e base b (baseb).15 × 101 . Entrada: n´mero. Uma constante em ponto flutuante pode ser definida de duas maneiras. Portanto. O sufixo L ou o l torna a constante long double.

4. ’\ddd’. Exemplos s˜o e e a mostrados na Tabela 3. escrevendo-se.45E+10 123.70 ´ CAP´ ITULO 3. Caractere ’a’ ’A’ ’\0141’ ’(’ ’9’ ’\n’ Significado caractere a caractere A Constante octal correspondente ao caractere ’a’ caractere abre parˆnteses e algarismo 9 Nova linha.6: Exemplos de constantes caractere Certos caracteres que n˜o s˜o vis´ a a ıveis podem ser representados antepondo-se o caractere ’\’ (barra invertida). Este caractere ´ tamb´m conhecido como caractere de escape.1 Constantes Cadeias de Caracteres Neste livro vamos usar em alguns casos a palavra cadeia para significar cadeia de caracteres (string em inglˆs).5: Constantes em ponto flutuante 3.7.45 123. posiciona o cursor no ´ ınicio da nova linha. Tabela 3. O valor que entra na express˜o ´ o do c´digo usado o e a e o para representar o caractere. Em C. TIPOS DE DADOS. 3. Tabela 3. Al´m e ´ e disso.6.4 Constantes Caracteres Uma constante caractere ´ um unico caractere escrito entre ’.45e-10 123. Uma constante do tipo cadeia de caracteres e ´ uma seq¨ˆncia de qualquer n´mero de caracteres entre " como no exemplo: e ue u "alo mundo!!!". CONSTANTES E VARIAVEIS Descri¸˜o ca sinal fra¸~o expoente ca fra¸~o ca fra¸~o expoente ca fra¸~o sufixo ca seq d´gitos ponto decimal ı N´ mero u +23. Exemplos de constantes do tipo caractere s˜o a mostrados na Tabela 3. caracteres podem participar normalmente de express˜es aritm´ticas. Este caractere ser´ usado a . uma constante de tamanho igual a um byte pode ser usada para definir um caracter.45F 123.6. por exemplo. E importante notar que a linguagem C insere automaticamente ao final de uma cadeia de caracteres um caractere null (’\0’). onde ddd ´ uma constante com e entre um e trˆs d´ e ıgitos octais. como no exemplo nova linha da Tabela 3. como em ’a’.

faz soar a campainha do sistema. Por exemplo. e . • Todo primeiro caractere deve ser sempre uma letra ou o caractere ’_’. 71 Tabela 3. Os dados podem ser de qualquer ca dos tipos definidos para a linguagem C.´ 3. Salta uma p´gina. move o cursor ca para a pr´xima parada de tabula¸˜o. j´ que elas est˜o precedidas a a a do caractere de escape. posiciona o cursor no ´ ınicio da linha atual. o ca Retorna um caractere. "Estas s~o \" (aspas) dentro de cadeias. Alerta. VARIAVEIS Caractere ’\n’ ’\t’ ’\b’ ’\f’ ’\r’ ’\a’ ’\0’ Significado Passa para uma nova linha.5. a Carriage return. caractere que em C termina uma cadeia de caracteres. Os caracteres ’\’ (caractere escape) e ’"’ (in´ e fim de cadeia) tˆm significados especiais em cadeias de ıcio e caracteres e para serem representados precisam ser antecedidos pelo caractere escape. 3. Null. C diferencia a caixa das letras. • Letras mai´sculas e min´sculas s˜o consideradas caracteres diferentes. d´ a o ıgitos e o caractere ’_’.1 Nomes das Vari´veis a Existem algumas regras b´sicas que regulam o batismo de vari´veis. Estas regras a a s˜o as seguintes: a • Nomes de vari´vel s´ podem conter letras.5.7: Exemplos de caracteres invis´ ıveis. Tabula¸˜o horizontal. Portanto. em diversos algoritmos como sinal de fim de cadeia. \\ e \" devem ser usados dentro de cadeias de caracteres para representar \ e " respectivamente.5 Vari´veis a Vari´veis s˜o nomes dados para posi¸˜es de mem´ria a fim de facilitar o manua a co o seio dos dados durante a cria¸˜o dos programas. isto u u a ´. 3." a As aspas no meio da cadeia n˜o indicam o fim.

unsigned i n t a . usa-se o caractere ’ ’ para separar as palavras que comp˜em o nome. . Alguns programadores usam a conc ven¸˜o de n˜o come¸ar nomes de vari´veis por letras mai´sculas. b . ano . f l o a t raio . Uma vez adotado a um padr˜o ele deve ser seguido para evitar incoerˆncias. CONSTANTES E VARIAVEIS • Palavras reservadas n˜o podem ser usadas como nome de vari´veis. a tipos de dados ou outras fun¸˜es. os programadores usam letras u u mai´sculas para representar constantes. Palavras a a reservadas s˜o palavras usadas para indicar os comandos da linguagem. Normalmente. O Anexo B mostra as palavras reserco vadas da linguagem C. No a entanto. TIPOS DE DADOS. mes . Por exca a emplo: soma mediaNotas total salarioMensal nome taxa imposto raio inicio Em C nomes como raio. Os programadores ao longo do tempo a desenvolveram algumas regras informais para fazer esta combina¸˜o. a onde uma lista de vari´veis ´ uma lista de nomes de vari´veis separadas por a e a v´ ırgulas. para afastar confus˜es. as vari´veis precisam ser declaradas de modo que o compia lador possa reservar espa¸o na mem´ria para o valor a ser armazenado. para ent˜o escolher o que mais lhe agrada e segui-lo. diametro .5. unsigned short i n t dia . ´ E boa pol´ ıtica escolher nomes que indiquem a fun¸˜o da vari´vel. evite diferenciar nomes de vari´veis por leo a tras mai´sculas e min´sculas. A forma c o geral de uma declara¸˜o ´: ca e tipo lista de vari´veis. Raio e RAIO referem-se a diferentes vari´veis. u Observe que em alguns nomes combinamos duas palavras para melhor indicar o dado armazenado na vari´vel. a e 3. c . como o em taxa_imposto. Por exemplo: int i. O melhor ´ analisar e as regras que programadores mais experientes usam ou os padr˜es que empresas o adotam. double salario . Por exemca plo. N˜o existem ca a c a u a regras formais para definir como nomes devem ser criados. Outra maneira ´ usar letras mai´sculas para indicar quando e u come¸a uma palavra. como em mediaNotas. Note tamb´m que o caractere espa¸o n˜o a e c a pode ser usado em nomes de vari´veis.72 ´ CAP´ ITULO 3.2 Declara¸˜o de vari´veis ca a Para serem usadas.

f l o a t raio . char c . f l o a t raio = 2.234 0L 21 0xF1 3. c = ’d ’. o c˜ a int i.5. Nada se pode afirmar sobre o conte´do de uma uma vari´vel que j´ a u a a foi declarada mas ainda n˜o recebeu um valor.0 -35 (e) (f) (g) (h) . i = 0.2: Indique quais dos n´meros abaixo s˜o constantes inteiras (longas ou n˜o) u a a v´lidas.3: Qual o valor na base 10 das constantes abaixo? (a) 025 (b) 0123 .circulo DiaHoje 3. VARIAVEIS 73 3.54.54. Justifique suas respostas. j. raio = 2.5.3 Atribui¸˜o de valores ca Ap´s ser declarada.´ 3. O operador de atribui¸˜o o a ca = indica que o resultado da express˜o ` direita do operador ser´ atribu´ ` a a a ıdo a vari´vel. j = 10. j = 10. co i n t i = 0 . uma vari´vel pode receber valores. Exerc´ ıcios 3. char c = ’d ’.do. a (a) (b) (c) (d) 100 2 345 123 3. A seguir mostramos um trecho de programa com exemplos de atribui¸˜o de ca valores ap´s a defini¸ao das vari´veis. double precisao = 0. Justifique os nomes inv´lidos. a A seguir s˜o mostrados exemplos de atribui¸˜es de valores `s vari´veis dua co a a rante as declara¸˜es.1: Indique os nomes de v´riaveis que s˜o v´lidos. a a a a (a) (b) (c) (d) tempo nota final us$ char (e) (f) (g) (h) 2dias teste 1 raio.00001 L .

qual ´ o maior n´mero positivo? u e u . CONSTANTES E VARIAVEIS (c) 0xD (d) 0x1D 3.74 ´ CAP´ ITULO 3. TIPOS DE DADOS.4: Considere um computador que armazene n´meros inteiros em 32 bits. u (a) Caso um bit seja reservado para o sinal diga qual ´ o menor n´mero e u inteiro negativo que este computador pode armazenar? (b) Para os n´meros sem sinal.

Cap´ ıtulo 4

Entrada e Sa´ pelo ıda Console
4.1 Introdu¸˜o ca

Neste cap´ ıtulo vamos apresentar conceitos b´sicos de entrada e sa´ de dados a ıda para que os exemplos e exerc´ ıcios iniciais possam ser constru´ ıdos. Um programa que n˜o fornece resultados nem pede valores para operar n˜o deve ter grande a a utilidade. A entrada de dados ser´ feita pelo teclado e a sa´ poder´ ser vista a ıda a na tela do computador. Em C, quando um programa se inicia, normalmente trˆs fluxos (arquivos) de dados s˜o abertos para opera¸˜es de entrada e sa´ e a co ıda: um para entrada, um para sa´ e um para imprimir mensagens de erro ou diıda agn´stico. Normalmente o fluxo de entrada est´ conectado ao teclado, enquanto o a que o fluxo de sa´ e o de mensagens de erro, para serem visualizados, est˜o ıda a conectados ao monitor. Estas configura¸˜es podem ser alteradas de acordo com co as necessidades dos usu´rios e estas opera¸˜es s˜o chamadas de redirecionaa co a mento. O fluxo de entrada ´ chamado de entrada padr˜o (standard input); o e a fluxo de sa´ ´ chamado de sa´ padr˜o (standard output) e o fluxo de erros ıda e ıda a ´ chamado de sa´ padr˜o de erros (standard error output). Estes termos s˜o e ıda a a substitu´ ıdos pelas suas formas abreviadas: stdin, stdout e stderr.

4.2

Biblioteca Padr˜o a

Na linguagem C n˜o existem comandos de entrada e sa´ a ıda. As opera¸˜es de co entrada e sa´ s˜o executadas com aux´ de vari´veis, macros e fun¸˜es espeıda a ılio a co ciais. Para termos acesso ` biblioteca que cont´m estas ferramentas o programa a e deve conter a declara¸˜o ca
#include <stdio.h>

75

76

CAP´ ITULO 4. ENTRADA E SA´ IDA PELO CONSOLE no in´ do programa. ıcio

A diretiva #include instrui o compilador a ler o arquivo indicado entre ’<’ e ’>’, e process´-lo como se ele fosse parte do arquivo original e seu conte´do a u estivesse no ponto onde a diretiva foi escrita. Se o nome do arquivo estiver entre os sinais de maior e menor, como no exemplo, ele ser´ procurado em a um diret´rio espec´ o ıfico de localiza¸˜o pr´-definida, onde est˜o os arquivos de ca e a inclus˜o. Quando se usa aspas o arquivo ´ procurado de maneira definida pela a e implementa¸˜o, isso pode significar procurar no diret´rio de trabalho atual, ca o ou em um diret´rio indicado no comando usado para compilar o programa. o Normalmente os programadores usam maior e menor para incluir os arquivos de cabe¸alho padr˜o e aspas para a inclus˜o de arquivos do pr´prio projeto. c a a o

4.3

Sa´ - A Fun¸˜o printf ıda ca

A fun¸˜o printf faz com que dados sejam escritos na sa´ padr˜o, que norca ıda a malmente ´ a tela do computador. O prot´tipo da fun¸˜o ´: e o ca e
int printf(controle, arg1, arg2, ...);

onde os argumentos arg1, arg2, ... s˜o impressos de acordo com o formato a indicado pela cadeia de caracteres que comp˜e controle. O formato ´ ao mesmo o e tempo de uso simples e bastante flex´ ıvel, permitindo que os resultados possam ser apresentados de diversas maneiras. A fun¸˜o retorna o n´mero de caracteres ca u impressos, n˜o incluindo o nulo em vetores de caracteres. No caso de um erro a de sa´ um valor negativo ´ retornado. ıda e Um exemplo simples pode tornar a explica¸˜o mais clara. O programa 4.1 ca imprime o valor da vari´vel ano. a Listing 4.1: Exemplo de impress˜o de resultados a
#include < stdio .h > i n t main ( void ) { i n t ano = 1997; /* Imprime o valor do ano */ printf ( " Estamos no ano % d " , ano ); return 0; }

Este programa ir´ imprimir na tela do computador: a Estamos no ano 1997 Como controle ´ uma cadeia ele aparece entre " ". Ele define como ser˜o e a impressos os valores representados pelos argumentos. No controle podem existir dois tipos de informa¸˜es: caracteres comuns e c´digos de formata¸˜o. Os co o ca

4.3. SA´ IDA - A FUNCAO PRINTF ¸˜

77

caracteres comuns, como no exemplo o texto Estamos no ano, s˜o escritos na a tela sem nenhuma modifica¸˜o. Os c´digos de formata¸˜o, aparecem precedidos ca o ca por um caractere’%’ e s˜o aplicados aos argumentos na ordem em que aparea cem. Deve haver um c´digo de formata¸˜o para cada argumento. O c´digo o ca o %d indica que o valor armazenado em ano deve ser impresso na nota¸˜o inteiro ca ´ decimal. E importante notar que o campo de controle aparece somente uma vez na fun¸˜o printf e sempre no in´ ca ıcio.

4.3.1

C´digos de Convers˜o o a

Os c´digos de convers˜o est˜o mostrados na tabela 4.3.1. o a a C´digo o %c %d %i %E %e %f %G %g %o %s %u %x %X %p %% Coment´rio a Caracter simples Inteiro decimal com sinal Inteiro decimal com sinal Real em nota¸˜o cient´ ca ıfica com E Real em nota¸˜o cient´ ca ıfica com e Real em ponto flutuante %E ou %f, o que for mais curto %g ou %f, o que for mais curto Inteiro em base octal Cadeia Caracteres Inteiro decimal sem sinal Inteiro em base hexadecimal (letras min´sculas) u Inteiro em base hexadecimal (letras mai´sculas) u Endere¸o de mem´ria c o Imprime o caractere %

Tabela 4.1: C´digos de Convers˜o para leitura e entrada de dados. o a Entre o caractere % e o c´digo de convers~o podem ser inseridos caracteres o a que alteram o formato. A seguir s˜o mostrados a ordem de inser¸˜o destes a ca caracteres e o seu significado: %[modificadores][largura][.precis~o][comprimento]c´digo a o modificadores: Usados logo ap´s o caractere %. o ’-’ Um sinal de menos serve para especificar que o argumento deve ser justificado ` esquerda no seu campo de impress˜o. Caso nenhum a a sinal seja usado o argumento ser´ ajustado ` direita. O programa a a 4.2 ilustra os dois tipos de justifica¸˜o. ca

78

CAP´ ITULO 4. ENTRADA E SA´ IDA PELO CONSOLE ’+’ For¸a que o resultado seja precedido por sinal de menos ou de mais, c mesmo para n´meros positivos. O padr˜o ´ que somente negativos u a e sejam precedidos por sinal de menos. espa¸o Caso nenhum sinal v´ ser escrito, um espa¸o ´ inserido antes do c a c e valor. ’#’ Usado com o, x ou X precede o valor com 0, 0x ou 0X respectivamente para valores diferentes de zero. Usado com e, E e f, for¸a c que a sa´ contenha um ponto decimal mesmo que n˜o haja parte ıda a fracion´ria. Por padr˜o, se n˜o h´ parte fracion´ria o ponto decimal a a a a a n˜o ´ escrito. Usado com g ou G o resultado ´ o mesmo que com e a e e ou E, mas os zeros finais n˜o s˜o retirados. a a ’0’ Completa o campo, pela esquerda, com zeros (0) ao inv´s de espa¸os, e c sempre que a op¸˜o para completar seja especificada (ver especifica cador de largura do campo).

largura: Caso seja usado um n´mero inteiro, este especifica o tamanho m´ u ınimo do campo onde o argumento ser´ impresso. Na listagem 4.2 o n´mero a u especifica que 8 espa¸os s˜o reservados para imprimir o resultado. Os c a espa¸os livres ser˜o completados com espa¸os em branco. Se o argumento c a c precisar de mais espa¸o que o especificado ele ser´ escrito normalmente e c a o tamanho m´ ınimo ´ ignorado. e u o .precis~o Este n´mero tem diferentes significados dependendo do c´digo usa ado. caracteres: No caso de impress˜o de cadeia de caracteres (s), este a n´mero especifica o n´mero m´ximo de caracteres de uma cadeia u u a de caracteres a serem impressos. ponto flutuante: No caso de formato (e, E, f) ´ o n´mero de d´ e u ıgitos a serem impressos a direita do ponto, ou seja o n´mero de casas u decimais. Para o formato g ou G ´ o n´mero m´ximo d´ e u a ıgitos significativos. inteiros: No formatos inteiros (d, i, o, u, x, X) a precis˜o especifia cou o n´mero m´ximo de d´ u a ıgitos a serem impressos. Se o n´mero de u caracteres a serem impressos ´ menor que este o resultado ´ complee e tado com brancos. O valor n˜o ´ truncado a e comprimento: Modifica os formatos da seguinte maneira: l Aplicado aos formatos de tipo d, i, o, u, x e X indicando que o dado ´ e do tipo long int e n˜o int. a h Modifica o dado, nos formatos d, i, o, u, x e X para tipo short int. L Nos formatos e, E, f, g e G o argumento ´ modificado para long double. e

ca #include < stdio . s ). ENTRADA . A barra inclinada a e ´ chamada de sequˆncia de escape. Alo Nos exemplos anteriores verifique que ’\n’ n˜o ´ impresso. indicando que o pr´ximo caractere n˜o ´ para e e o a e ser impresso mas representa caracteres invis´ ıveis ou caracteres que n˜o est˜o a a representados no teclado.2 ir´ imprimir o seguinte resultado: Justificado para direita Ano = 1997 Justificado para esquerda Ano = 1997 O programa exemplo 4.A FUNCAO SCANF ¸˜ Listing 4. } 79 Listing 4.0/3.4.3: Exemplo de uso de especificador de precis˜o. return 0. char s [] = " Alo Mundo " .h > i n t main ( void ) { i n t ano = 1997.h > i n t main () { f l o a t r = 1. printf ( " Justificado para esquerda Ano = % -8 d \ n " . printf ( " Justificado para direita Ano = %8 d \ n " . r ).0. a #include < stdio .A Fun¸˜o scanf ca A fun¸˜o scanf pode ser utilizada para entrada de dados a partir do teclado e ca seu prot´tipo ´: o e . Esta seq¨ˆncia de escape indica que o programa deve ue passar a imprimir na pr´xima linha. printf ( " O resultado e = %9.4 Entrada .333 .3 f \ n " . ano ). printf ( " %9. o 4.2: Exemplo de justifica¸˜o de resultados.4. } a O programa 4.3 s \ n " . return 0. ano ).3 imprimir´ o seguinte resultado: a O resultado e = 0.

o comando c a a scanf(%d %d.). & x ). Uma diferen¸a fundamental que existe entre esta fun¸˜o e a fun¸˜o printf c ca ca est´ nos argumentos que vˆm depois do controle.43 em x. A largura especifica o n´mero m´ximo de caracteres a u a serem lidos.. outros caracteres podem aparecer. O asterisco indica que o dado ser´ lido a a de stdin mas ignorado. scanf ( " % d % f " .1. No caso de scanf os argua e mentos s˜o os endere¸os das vari´veis que ir˜o receber os valores lidos e n˜o. O primeiro ´ are mazenado na vari´vel a e o segundo em b. como o e co a os listados na Tabela 4. Caracteres comuns: (n˜o %) que devem casar com o pr´ximo caractere difea o rente de branco da entrada. Isto significa que qualquer caractere que n˜o a for igual a branco e/ou <enter> e/ou tab ou parte de um especificador de formato faz com que a fun¸˜o leia o pr´ximo caractere da entrada (stdin) ca o e se for igual a este ele ´ descartado. espera que dois valores inteiros sejam digitados no teclado. Caso os caracteres sejam diferentes e a fun¸˜o falha e retorna deixando os caracteres seguintes n˜o lidos. &a. as pr´prias vari´veis. Assumindo que a linha de entrada no teclado fosse 34 56. ca O modelo ´ o seguinte: e %{*}{largura}{modificadores}tipo O caracteres entre chaves s˜o opcionais.43 a execu¸˜o do exemplo iria terminar com o valor inteiro 34 sendo armazenado ca na vari´vel i e o valor real 56. f l o a t x. arg2. ENTRADA E SA´ IDA PELO CONSOLE int scanf(controle. no entanto. arg1. que s˜o utilizadas para interpretar os dados que ser˜o a a lidos. como em printf. Os valores ser˜o armazenados direa a tamente nos endere¸os indicados por &a e &b respectivamente. Por exemplo. O campo de controle pode conter: Caracteres branco: A fun¸˜o lˆ e ignora todos os caracteres branco e/ou ca e <enter> e/ou tab que aparecerem antes de qualquer caractere diferente destes. &i .80 CAP´ ITULO 4. . A indica¸˜o que estamos referenciando o a ca um endere¸o e n˜o a vari´vel se faz pelo operador &.. &b). a c a a a como em printf. .3. a Usualmente o campo de controle s´ cont´m especifica¸˜es de convers˜o. c Um outro exemplo incluindo vari´veis reais ´: a e int i. ca a Especifica¸˜es de convers˜o: Um especificador de convers˜o de formato seco a a guindo um modelo similar ao da fun¸˜o printf.

\ n " ).3 O programa 4. i e n. No caso de ocorrer uma falha antes da leitura se iniciar a constante EOF ´ retornada. printf ( " A soma destes numeros vale % d . } O resultado da execu¸˜o deste programa ´: ca e Entre com um caractere qualquer. num1 + num2 ). printf ( " Codigo ASCII do caractere % c vale % d . Este n´mero ca u u pode ser usado para verificar se todos os valores pedidos foram lidos. o comando deveria ser escrito da seguinte maneira: scanf("%d. u e x passam a unsigned long int. A fun¸˜o scanf retorna o n´mero de itens lidos com sucesso. L: Os tipos e.4: Exemplo de uso de scanf.4. d Codigo ASCII do caractere d vale 100. e . Existem os seguintes modificadores: h: Os tipos d. num2 . Agora dois inteiros separados por espaco. %f".\ n " . c ). return 0. ca Listing 4. i n t num1 . 2 4 A soma destes numeros vale 6.A FUNCAO SCANF ¸˜ 81 Os modificadores alteram o tamanho do especificadores de tipo que vˆm logo e a seguir. & num1 . printf ( " Agora dois inteiros separados por espaco . &x).4. para que os valores digitados sejam separados por v´ ırgulas. ENTRADA . e l: Os tipos d.4 mostra exemplos de uso da fun¸˜o scanf. scanf ( " % c " .\ n " ). f e g passam de float para double. i e n passam a ser long int e os tipos o. u e x.h > i n t main () { char c . scanf ( " % d % d " . Observar que deve haver uma correspondˆncia exata entre os caracteres n˜o e a brancos do controle e os caracteres digitados. que s˜o int passam a ser short int e os tipos o. f e g passam de float para long double. c .\ n " . #include < stdio . Neste caso a entrada deveria ser: 35. &i. & c ). 46. printf ( " Entre com um caractere qualquer . Por exemplo. Os tipos e. a tamb´m int passam a ser unsigned short int. & num2 ).

por exemplo.82 CAP´ ITULO 4.h e cujos prot´tipos a a o s˜o os seguintes: a i n t getchar ( void ). c = getchar (). Apesar da fun¸˜o getchar retornar um parˆmetro inteiro ´ poss´ atribuir ca a e ıvel este valor a uma vari´vel do tipo char porque o c´digo do caractere est´ ara o a mazenado no byte ordem mais baixa. Deste modo. No entanto. printf ( " O caractere lido foi o " ). ENTRADA E SA´ IDA PELO CONSOLE 4. putchar ( c ). e isto pode causar problemas. se lˆ um dado do tipo inteiro.5 4. e o seu resultado ´: co e Entre com um algarismo entre 0 e 9. i n t putchar ( i n t c ).h > i n t main ( void ) { char c . quando algum dado ´ fornecido pelo teclado e termina-se a digita¸˜o com a tecla <enter>. printf ( " Entre com um algarismo entre 0 e 9. return 0. } Observar que. O programa da listagem 4. 7 O caractere lido foi o 7 Listing 4. O mesmo acontece com a fun¸˜o putchar ca que recebe um inteiro. Considere que o usu´rio digitou 35<enter> a como resposta ao comando scanf. que est˜o na biblioteca stdio. e u a quando logo em seguida o programa executar a fun¸˜o getchar. normalmente. A fun¸˜o putchar retorna o caractere que foi escrito e ca EOF em caso de erro.5 mostra exemplos de uso destas fun¸˜es. mas somente o byte de ordem mais baixa ´ passado para e a tela do computador. o <enter> ´ um ca e caractere tamb´m.5: Exemplo de uso de getchar e putchar.\ n " ). #include < stdio . o que ser´ lido ca a e ´ o <enter> digitado ao final do n´mero. Vamos analisar o que acontece e quando antes do comando getchar.5.6 ´ um exemplo de e u programa onde isto pode ocorrer.1 Lendo e Imprimindo Caracteres Fun¸oes getchar e putchar c˜ Para ler e escrever caracteres do teclado as fun¸˜es de entrada e sa´ mais simco ıda ples s˜o getchar e putchar. e O comando scanf lˆ o n´mero inteiro mas n˜o o <enter> digitado. O comando getchar ir´ ler o <enter> e em a . A listagem 4.

Para a usar cadeias ´ preciso primeiro definir um espa¸o para armazen´-las. scanf ( " % d " . int i. & i ). Portanto o vetor nome deve ser definido com um espa¸o a c .6: Exemplo de uso de getchar e putchar. printf ( " Agora um caractere .\ n " ).h > i n t main ( void ) { char c . A defini¸˜o desta cadeia ficaria da seguinte maneira: ca char nome [41]. c ). return 0.4. observar que toda cadeia em C termina com o caractere NULL (’\0’). c = getchar (). Numero lido 35 Caractere lido Listing 4.\ n " ). Quando definir o tamanho do vetor de caracteres. que ´ automaticamente inserido e pelo compilador. e apenas uma a u linha em branco correspondente ao caractere <enter>. a Entre com um numero inteiro. lido no scanf. 35 Agora um caractere.5. como est´ indicado a seguir. Vetores. LENDO E IMPRIMINDO CARACTERES 83 seguida o programa ir´ imprimir o n´mero 35. printf ( " Numero lido % d \ n " . Mais adiante mostraremos como resolver este problema. printf ( " Entre com um numero inteiro . o tamanho e o tipo do vetor. Considere que pree cisamos armazenar uma cadeia de caracteres chamada nome com 40 caracteres.5. que e ser˜o vistos mais adiante no Cap´ a ıtulo 7. i ).2 Lendo e Imprimindo Cadeias de Caracteres Uma cadeia de caracteres (string) em C ´ um vetor de caracteres. #include < stdio . } 4. s˜o conjuntos de caracteres em que a cada um deles pode ser acessado independentemente dos outros por meio de um endere¸o. printf ( " Caractere lido % c \ n " . Nesta etapa iremos apresentar rapidamente alguns conceitos que c nos permitir˜o criar alguns exemplos simples com cadeias de caracteres. lido pelo getchar. Para isto e c a ´ preciso declarar o nome.

que n˜o ´ armazenado sendo substitu´ a e ıdo . nome ). nome ). qual o seu nome ?\ n " ).7: Exemplo de uso de printf e scanf na leitura de cadeias. scanf ( " % s " .4 Lendo e Imprimindo cadeias com gets e puts Diferentemente do comando scanf a fun¸˜o gets lˆ toda a cadeia at´ que a tecla ca e e <enter> seja digitada. } Considere que este programa se chama util. o vetor nome pode ser usado durante a execu¸˜o do o ca programa. o 4. Ap´s este passo. Listing 4. Uma poss´ intera¸˜o entre ıvel ca este programa e um usu´rio poderia ser da seguinte maneira.5.5. No vetor s˜o colocados todos os c´digos dos caracteres a o lidos excetuando-se o da tecla <enter>. Aparentemente o computador se tornou ´ ıntimo do usu´rio Ze Sa e o tratou apenas pelo primeiro nome. Quando se usa scanf ca a para ler uma cadeia deve-se empregar o c´digo de convers˜o %s. Este comando o a n˜o lˆ o nome todo. ENTRADA E SA´ IDA PELO CONSOLE mais.h > i n t main ( void ) { char nome [ DIM ]. mas encerra a leitura dos caracteres quando encontra um a e caractere espa¸o (ou branco). A a explica¸˜o para esta intimidade est´ no modo de leitura.3 Lendo e Imprimindo cadeias com scanf e printf O programa 4. return 0. #define DIM 40 #include < stdio . Mas como ler para um vetor um nome inteiro. Posso ajuda-lo Ze? O s´ ımbolo $ ´ o prompt t´ e ıpico dos sistemas Unix.84 CAP´ ITULO 4. qual o seu nome? Ze Sa Sou um computador. ou seja o separador de cadeias no comando scanf c ´ o caractere espa¸o.7 mostra como ler e imprimir um cadeia usando os comandos scanf e printf respectivamente.lo % s ?\ n " . printf ( " Sou um computador . a $ util Por favor. Posso ajuda . ou um e c cadeia que contenha brancos? Para isto deve-se usar a fun¸˜o gets que ser´ ca a nosso pr´ximo assunto. 4. /* linha de caracteres lidos */ /* Entrada de dados do vetor */ printf ( " Por favor .

LENDO E IMPRIMINDO CARACTERES 85 pelo c´digo NULL.8 ´ semelhante ao e exemplo anterior com as fun¸˜es printf substitu´ co ıdas por puts. A fun¸˜o gets retorna str caso nenhum erro ocorra. o vetor permanece inalterado e um ponteiro nulo ´ retornado. " ). Ze Sa Alo Ze Sa Eu sou um computador. Caso o final do arca quivo seja encontrado antes de qualquer caractere ser lido. por favor. return 0. #define DIM 41 #include < stdio . em que posso ajuda . Caso a fun¸˜o scanf do exemplo anterior fosse substitu´ o ca ıda pela gets o programa imprimiria Posso ajuda-lo Ze Sa? O comando que substitui o scanf ´ gets(nome). por favor . O prot´tipo da fun¸˜o gets e o ca ´ o seguinte: e #include < stdio . em que posso ajuda-lo? Listing 4.8: Exemplo de uso de puts e gets na leitura de cadeias.5. e A fun¸˜o puts tem o seguinte prot´tipo: ca o #include < stdio . A fun¸˜o puts retorna a o ca um valor positivo caso nenhum erro ocorra. Ela imprime a cadeia apontado por str. Em caso de erro ´ retornado um e valor negativo.h > i n t puts ( const char * str ).h > char * gets ( char * str ).lo ? " ). puts ( nome ). Entre com o seu nome. Caso um erro ocorra durante a e leitura. Observe que a impress˜o sempre termina e passa para a pr´xima linha. o conte´do do array fica indeterminado e novamente um ponteiro nulo u ´ retornado. /* linha de caracteres lidos */ /* Entrada de dados do vetor */ puts ( " Entre com o seu nome . puts ( " Eu sou um computador .4.h > i n t main ( void ) { char nome [ DIM ]. } . puts ( " Alo " ). gets ( nome ). O programa 4.

inicialize-as. A leitura ´ interrompida quando um caractere <enter> ´ ene e contrado ou o final do arquivo foi atingido.1: Escreva um programa que declare variaveis do tipo int. 4. FILE * fluxo ). Para evitar este problema recomenda-se o emprego da fun¸˜o fgets cujo ca prot´tipo ´ o e #include < stdio . fluxo ´ e igual a stdin.2: Escreva um programa que defina vari´veis do tipo int e armazene nelas a constantes octais e hexadecimais e imprima o seu conte´do no formato original u e em formato decimal. c na tela. este mesmo valor nas bases hexadecimal e octal. e Exerc´ ıcios 4. ENTRADA E SA´ IDA PELO CONSOLE 4. 4. Caso ocorra um erro de leitura o conte´do do e u vetor fica indeterminado e um ponteiro nulo ´ retornado. Apesar do usu´rio definir a u a um tamanho m´ximo para o vetor que ir´ armazenar os caracteres a fun¸˜o a a ca ignora o limite e continua lendo valores at´ que o usu´rio digite o caractere e a <enter>. i n t tam . Se o final do arquivo for ca atingido e nenhum caractere tiver sido lido. O caractere nulo ´ adicionado ap´s o ultimo a e o ´ caractere lido. e imprima os seus valores.5 A Fun¸˜o fgets ca A fun¸˜o gets pode abrir porta para invas˜es de computadores pelo fato dela ca o n˜o controlar o n´mero de caracteres lido de stdin. Diferentemente do que ocorre na fun¸˜o gets. o vetor str permanece inalterado e um ponteiro nulo ´ retornado.3: Fa¸a um programa que leia um valor inteiro no formato decimal e escreva. como temos feito.86 CAP´ ITULO 4.5. aqui o caractere <enter> ´ armazenado no vetor onde os demais ca e caracteres est˜o sendo guardados. char e float. Exemplo de Entrada e Sa´da: ı Entre com o valor: 10 Hexadecimal: A Octal: 12 . A fun¸˜o fgets lˆ no m´ximo um caractere a menos que o n´mero de carca e a u acteres especificado no parˆmetro tam a partir do fluxo de entrada de dados a definido por fluxo. A fun¸˜o retorna str caso seja bem sucedida.h > i n t * fgets ( const char * str . No caso de leitura do teclado.

a*b. dado o per´ ımetro de um c´ ırculo. 4.7: Escreva um programa que leia 3 n´meros reais e imprima a m´dia aru e itm´tica destes n´meros..10: Escreva um programa que converta uma temperatura de Farenheit para Celsius. considerando que o restaurante cobra 10% de taxa para os atendentes. seu quadrado. fa¸a um programa capaz de ler a c um valor inteiro e escrever seu triplo. e a sua metade. . LENDO E IMPRIMINDO CARACTERES 87 4. calcule sua a ´rea. e u 4.12: Fa¸a um programa que utilize a fun¸˜o gets para ler duas cadeias de c ca tamanho at´ 20 e em seguia `s reescreva na linha de baixo. uma ao lado da e a outra e separadas por ”/-/ ”. 4. a quilomec c a tragem anterior.9: Fa¸a um programa que pe¸a ao usu´rio a quilometragem atual.11: Escreva um programa que.5: Fa¸a um programa que leia trˆs palavras de at´ 10 letras e reescreva estas c e e palavras alinhadas ` direita da tela.6: Sabendo que os argumentos da fun¸˜o printf podem ser express˜es (a+b.5.). 3*a..4: Fa¸a um programa capaz de ler um valor real e escrevˆ-lo com apenas uma c e casa decimal. 4. e n˜o somente argumentos. a 4. ca o a/b.8: Escreva um programa que pegue o valor de uma conta de restaurante e imprima o valor total a ser pago. Exemplo de Entrada e Sa´da: ı Valor: 6 Triplo: 18 Quadrado: 36 Meio: 3 4. 4.4. o 4. os litros consumidos e informe a taxa de consumo (quilˆmetros o por litro) de um autom´vel.

ENTRADA E SA´ IDA PELO CONSOLE .88 CAP´ ITULO 4.

Observe que o e ca comando de atribui¸ao termina em ponto e v´ c˜ ırgula. que determina que comandos terminam com este caractere. como no exemplo ıvel a co ´ a seguir: a = b = c = 1. 2.0. pi = 3. a 5. 89 . as trˆs v´riaveis recebem o mesmo valor. Isto porque ca este sinal n˜o est´ representando que o resultado da express˜o do lado direito a a a ´ igual ao resultado do lado esquerdo e sim uma atribui¸˜o.1 Introdu¸˜o ca O objetivo deste cap´ ıtulo ´ apresentar os operadores existentes na linguagem e C e a forma correta de construir express˜es que envolvam estes operadores. que ´ o valor atribu´ ` a a e ıdo a c. Em C este operador ´ o sinal de igual (=).0. c recebe o valor 1.Cap´ ıtulo 5 Operadores e Express˜es o 5.2 Operador de Atribui¸˜o ca Este ´ o operador usado para transferir o resultado de uma express˜o para uma e a vari´vel. Esta escolha do sinal de a e igual para servir de operador de atribui¸˜o pode causar problemas.0. Isto faz parte das regras da linguagem C.0. Por exemplo: soma = a + b. As atribui¸˜es s˜o feitas na seguinte e a co a ordem: 1. b recebe o resultado da express˜o ` sua direita. ´ E poss´ fazer-se v´rias atribui¸˜es em uma unica linha. o constantes e vari´veis.1415. ou seja 1. c = 1.

e Os s´ ımbolos mostrados na Tabela 5. Podemos ter pares de parˆnteses envolvendo outros pares. e a Outro ponto importante s˜o as regras de precedˆncia que determinam que a e opera¸˜o deve ser executada primeiro.1: Operadores aritm´ticos. Parˆnteses tˆm um papel importante nas express˜es e permitem que a ordem e e o das opera¸˜es seja alterada.com a mesma e e a prioridade. Para os operadores aritm´ticos a opera¸˜o e ca de mais alta precedˆncia ´ o . a divis˜o entre operandos o a . Na tabela os operadores est˜o listados ca a em ordem decrescente de prioridade. Quando a duas opera¸˜es de mesmo n´ de prioridade tˆm de ser avaliadas.3 Operadores Aritm´ticos e A Tabela 5. Express˜es entre parˆnteses s˜o calculadas em co o e a primeiro lugar. vindo em seguida ++. porque eles alteram radia a a calmente os resultados das express˜es. Express˜es aritm´ticas em C deco o e vem ser escritas no formato linear para facilitar a digita¸˜o dos programas e ca tamb´m porque alguns s´ e ımbolos usados em Matem´tica n˜o existem nos teclaa a dos. -.un´rio. ou seja 1. Por exemplo. a recebe o resultado da express˜o ` sua direita. a a Um ponto importante que deve ser sempre levado em considera¸˜o quando ca uma express˜o for calculada s˜o os tipos das vari´veis. OPERADORES E EXPRESSOES 3. O exemplo mais comum deste formato ´ a opera¸˜o de divis˜o que deve e ca a ser escrita a/b. 5. Os operadores de multiplica¸˜o. portanto eles conferem o maior grau de prioridade as express˜es o que eles envolvem. divis˜o e m´dulo tem a mesma ca a o prioridade. e Dizemos que os parˆnteses est˜o aninhados.90 ˜ CAP´ ITULO 5. Neste caso as express˜es dentro dos e a o parˆnteses mais internos s˜o avaliadas primeiro. e e Operador + ++ -* / % + Descri¸~o ca Mais un´rio a Menos un´rio a Incremento Decremento Multiplica¸˜o ca Divis˜o a Resto da divis˜o a Soma Subtra¸˜o ca Prioridade 0 0 1 1 2 2 2 3 3 Tabela 5.3 mostra os operadores aritm´ticos e as suas ordens de precedˆncia. que ´ o valor atribu´ ` a a e ıdo a b. a opera¸˜o co ıvel e ca mais ` esquerda ser´ avaliada primeiro.3 s˜o os unicos que podem ser usados a ´ para representar as opera¸˜es acima listadas. O operador menos un´rio multiplica seu operador por -1.0.

1) e i < (limite -1) tˆm o mesmo signifio e cado. >=. a Exemplo 5. < e <= tˆm a mesma precedˆncia e est˜o acima de == e e a e !=.10. A ordem de precedˆncia que e e inclui todos os operadores est´ mostrada na Tabela 5.4.´ 5.4. Os operadores >. Algumas regras ca o de convers˜o simples existem e ser˜o discutidas em detalhes mais adiante. e A seguir mostramos alguns exemplos de express˜es aritm´ticas escritas na o e nota¸˜o da linguagem C. a + b b+c =⇒ a + b/(b+c) 2. Nesta tabela mostramos a somente a ordem de precedˆncia destes operadores. Observe o uso de parˆnteses para evitar ambiguidades ca e que poderiam fazer com que a express˜o fosse calculada erradamente. b2 + c2 =⇒ b*b + c*c 3. portanto e e e express˜es como ( i < limite . OPERADORES RELACIONAIS E LOGICOS 91 do tipo inteiro tem como resultado um valor inteiro. x b a+ c =⇒ x/(a+b/c) 5. Por a a exemplo a opera¸˜o 1/3 em C fornece como resultado o valor 0. . a Operador >= > <= < == != Descri¸˜o ca Maior ou igual a Maior que Menor ou igual a Menor que Igual a Diferente de Prioridade 0 0 0 0 1 1 Tabela 5.4 5.1 Operadores Relacionais e L´gicos o Operadores Relacionais Os operadores relacionais est˜o mostrados na Tabela 5. Portanto. N˜o ´ poss´ a a a e ıvel aplicar a opera¸˜o de m´dulo a operandos do tipo float e double. Estes operadores tˆm precedˆncia menor que os aritm´ticos. se o resultado possuir uma parte fracion´ria ela ser´ truncada.2: Operadores Relacionais. enquanto que 1 ca % 3 ´ igual a 3.4: 1.2.

Neste caso a express˜o acima seria representada como p co a e q.4.0 e q taxa de prea sen¸a maior que 75%. o E l´gico o O s´ ımbolo usado para representar o operador E l´gico ´ &&. e p 0 0 1 1 q 0 1 0 1 p && q 0 0 0 1 Tabela 5. onde p est´ representando nota maior ou igual a 5. " .3 o e mostra a tabela verdade do operador. Nas linguagens de programa¸˜o os valores verdadeiro e ca falso podem ser representados de diversas maneiras. podemos ter co e combina¸˜es de mais de duas rela¸˜es em uma unica express˜o. resultado ). Em C o valor e falso ´ representado por 0 e verdadeiro por qualquer valor diferente de 0. Uma das maneiras mais comum ´ representar verdadeiro por true e falso por false. Por exemplo. o . e c e Para simplificar a apresenta¸˜o destes operadores ser˜o usadas vari´veis para ca a a substituir as rela¸˜es. printf ( " O resultado e vale % d . co co ´ a podemos ter a seguinte combina¸˜o: ano maior que 2000 e mˆs menor que 6 ca e e dia maior que 15.0 e a taxa de presen¸a ´ maior que 75%. ou seja o e a valor correspondente a verdadeiro. Estas express˜es podem ter dois resultados verdadeiro c o e falso. Por exemplo.2 Operadores L´gicos o Os operadores l´gicos definem as maneiras como as rela¸˜es acima podem ser o co conectadas.3: Operador L´gico E. Observar que. f l o a t z = 3.0. O resultado deste trecho ´ a impress˜o de um valor diferente de 0. Por exemplo podemos querer testar se ao mesmo tempo uma nota ´ maior ou igual a 5. OPERADORES E EXPRESSOES 5. assim como em opera¸˜es aritm´ticas. A Tabela 5. O resultado da express˜o ´ verdadeiro a e se e somente se todas as vari´veis forem iguais a verdadeiro. resultado = (10 > 5) && ( i > -5) && ( z != 0). Isto porque 10 ´ maior que 5 E i ´ maior e e que -5 E z ´ diferente de 0. j = -5. A e seguir iremos mostrar os operadores l´gicos existentes na linguagem C. i n t resultado . a considere o seguinte trecho de programa: i n t i = 3 .92 ˜ CAP´ ITULO 5.

em ordem decrescente. O resultado deste trecho ´ a impress˜o do valor 1. considere o a seguinte trecho de programa: f l o a t x = 3.0. A Tabela 5. porque dia ´ menor que 30 E e ano ´ maior que 1950. ano = 1959. resultado ). p 0 0 1 1 q 0 1 0 1 p || q 0 1 1 1 Tabela 5. o resultado do parˆnteses vale 1 (verdadeiro). a precedˆncia dos operadores e l´gicos e relacionais. considere o seguinte trecho de a programa: i n t dia = 25 . i n t n = 55 . e e No entanto.4 o e mostra a tabela verdade do operador. Este operador ´ un´rio e quando aplicado ` e a a uma vari´vel ele troca seu valor.´ 5. Por exemplo. resultado = ! ( ( dia < 30) && ( ano > 1950) ) printf ( " O resultado vale \% d . Isto porque. Por exemplo. Este trecho de programa imprime 0 (falso). apesar de i e a n˜o ser diferente de 0 e x n˜o ser diferente de zero. i n t resultado . Portanto. o . A tabela 5. Como basta um dos testes ser verdade para o resultado ser verdade ser´ a impresso um valor diferente de 0. printf ( " O resultado e \% d " . " .5 mostra o e a tabela verdade do operador. i = 0. Para que o resultado da express˜o seja a verdade basta que uma das vari´veis seja verdade. OPERADORES RELACIONAIS E LOGICOS OU l´gico o 93 O s´ ımbolo usado para representar o operador OU l´gico ´ ||. o N˜o l´gico a o O s´ ımbolo usado para representar o operador E l´gico ´ !. resultado = ( i != 0) || ( x == 0) || ( n < 100).6 mostra. resultado ). A Tabela 5. o operador ! nega este valor que vira 0. i n t resultado .4. temos que n ´ menor que a a e 100.4: Operador L´gico OU.

8. a Operador & | ^ ~ >> << Descri¸˜o ca E OU Ou exclusivo N˜o a Desloca para direita Desloca para esquerda Prioridade Tabela 5. || e e ! respectivamente. A diferen¸a entre estes operadores c e os l´gicos ´ que estes operam em pares de bits enquanto que os operadores o e l´gicos anteriores consideram a palavra toda. e .5 Operadores com Bits Para opera¸˜es com bits. | e ~ tˆm a mesma tabela verdade que os operadores &&. O resultado da opera¸˜o ´ verdadeiro se e somente se os dois operandos ca e s˜o diferentes. <= ==.7. para um valor int o ser falso ´ necess´rio que todos os 32 bits sejam iguais a zero. a Os operandos de deslocamento tˆm os seguintes modos de opera¸˜o: e ca operando >> vezes: o operando ´ deslocado vezes bits para a direita.6: Precedˆncia dos operadores l´gicos e relacionais. long double e void. double. e o 5. OPERADORES E EXPRESSOES p 0 1 !p 1 0 ~ Tabela 5. Os operadores &. long e long long mas n˜o podem ser usados a em float. a linguagem C disp˜e de alguns operadores que podem co o ser usados nos tipos char. Os operadores e a em bits est˜o mostrados na Tabela 5.7: Operadores com bits.5: Operador L´gico NAO. Por exemplo. <. int. >=. != && || Prioridade 0 1 2 3 4 Tabela 5. o Operador ! >. O operador ^ (OU Exclusivo) est´ descrito pela Tabela a 5.94 ˜ CAP´ ITULO 5.

printf ( " %3 d = %08 X \ n " . d ). } Este programa teria como resposta os seguintes resultados. printf ( " %3 d = %08 X \ n " . a O exemplo 5. d = d < <1. c ). e a = a << 1. e Observa¸˜es: co • Nos deslocamentos ` direita em vari´veis unsigned e nos deslocamentos a a a ` esquerda. d .8: Operador L´gico OU. c = c > >1.5.5. d = d > >1. printf ( " %3 d = %08 X \ n " . OPERADORES COM BITS p 0 0 1 1 q 0 1 0 1 p ^ q 0 1 1 0 95 Tabela 5. return 0. c .1: Exemplo de operadores de deslocamento.h > i n t main ( void ) { unsigned i n t c = 7. #include < stdio . c . i n t d = -7. os bits que entram s˜o zeros. s˜o equivalentes. u • Um deslocamento para a direita ´ equivalente a uma divis˜o por 2. Assim e ca a = a * 2. 14 7 -14 -7 = = = = 0000000E 00000007 FFFFFFF2 FFFFFFF9 . o operando << vezes: o operando ´ deslocado vezes bits para a esquerda.1 ilustra o uso dos operandos de deslocamento: Listing 5. Desloe a camento para a esquerda ´ equivalente a uma multiplica¸˜o por 2. d . 0 = sinal positivo). c ). printf ( " %3 d = %08 X \ n " . a • Nos deslocamentos ` direita em vari´veis signed. d ). os bits que entram cora a respondem ao sinal do n´mero (1= sinal negativo. c = c < <1.

soma = soma / ( a + b). Portanto. Observe u que quando o n´mero -14 foi deslocado para a direita entrou um bit 1. 5. a a e . que ´ u e igual ao sinal negativo. raiz *= 4. Ao final a vari´vel x cont´m o valor 5 e y o valor 7. Outros exemplos s˜o: a raiz = raiz * 4.6 Operadores de Atribui¸˜o Composta ca Em C qualquer express˜o da forma: a variavel = variavel operador expressao pode ser escrita como: variavel operador= expressao Por exemplo: ano = ano + 10. i %= 2. somente a express˜o mais ` direita ´ cona a e siderada. ele retornou ao valor original. Quando o conjunto de express˜es tem e o de ser reduzido a somente um valor. a >>= 1.7 Operador v´ ırgula O operador v´ ırgula (. 5. a c primeiro seria atribu´ o valor 5 a vari´vel x. Por exemplo. i = i % 2. Em seguida atribui x+2 para a ıdo a vari´vel y. Quando u o n´mero foi deslocado para direita 1 bit. considere o seguinte trecho de c´digo: o y = ( x =5 . ´ equivalente a e ano += 10. a = a >> 1. A express˜o come¸a a ser avaliada da esquerda para a direita. OPERADORES E EXPRESSOES Os resultados mostram que o n´mero 7 ap´s o primeiro deslocamento de 1 u o bit para a esquerda ficou igual a 14. x +2).96 ˜ CAP´ ITULO 5. portanto um 0 entrou no n´mero. soma /= (a + b).) ´ usado para separar duas ou mais express˜es que s˜o e o a escritas onde somente uma ´ esperada.

Listing 5. o valor int ca ´ convertido para float. DIM . s i z e o f f ). e . uma opera¸˜o que envolva um tipo int e um float.h > i n t main () { i n t i =0.8. #define DIM 10 #include < stdio . return 0. s i z e o f i ).8 Operador sizeof() O operador sizeof() ´ um operador un´rio que retorna o tamanho em bytes e a da express˜o ou tipo fornecido entre parˆnteses.0.2: Exemplo do operador sizeof. Para se calcular o tamanho de bytes de uma express˜o n˜o ´ necess´rio o uso a a e a de parˆnteses.h > #include < conio . s i z e o f ( v )). char c = ’a ’. f l o a t f =3. suponha que o a e tipo float tenha quatro bytes ent˜o o operador sizeof(float) retorna o valor a 4. printf ( " Tamanho do char % d \ n " . printf ( " Tamanho de int % d \ n " .9 Convers˜o de Tipos a Quando operandos de tipos diferentes aparecem em express˜es s˜o convertidos o a para um tipo comum. Por exemplo. a a Por exemplo. i n t v [ DIM ]. printf ( " Tamanho do float % d \ n " . OPERADOR SIZEOF() 97 5. No exemplo 5. printf ( " Tamanho do double % d \ n " . } Este programa imprime os seguintes resultados: Tamanho Tamanho Tamanho Tamanho Tamanho Tamanho em de do do do do bytes de alguns tipos int 4 float 4 double 8 char 1 vetor de 10 inteiros 40 5. printf ( " Tamanho do vetor de % d inteiros \% d \ n " . s i z e o f c ). s i z e o f ( double )).2 ilustramos alguns exemplos de uso do operador e sizeof(). que permita o c´lculo da express˜o da forma mais eficiente.5. printf ( " Tamanho em bytes de alguns tipos \ n " ).

o a em uma divis˜o de inteiros o resultado ´ do tipo inteiro. A express˜o 1/3*3 tem a a como resultado o valor inteiro 0. Isto porque algumas arquiteturas podem extender a este bit e outras n˜o. Por exemplo. Isto pode causar a e surpresas desagrad´veis para programadores iniciantes. se algum dos operandos ´ double o outro ´ convertido para double a e e e o resultado ´ double. Por exemplo. Os tipos char s˜o convertidos para int. Em seguida este u ca valor ´ somado ao c´digo da letra min´scula ’a’. a A convers˜o de inteiro para caractere ´ bem comportada. Caso contr´rio. Caso contr´rio. Note que a a e todos os floats em uma express˜o s˜o convertidos para double e a express˜o a a a ´ avaliada em double. e Ent˜o. Quando um caractere ´ armazenado em uma e a e vari´vel do tipo inteiro podem ocorrer problemas com caracteres que tˆm o bit a e mais ` esquerda igual a 1. fornecendo a posi¸˜o desta letra no alfabeto. e O resultado de uma express˜o ´ convertido para o tipo da vari´vel onde o rea e a sultado ser´ armazenado. Caso o conjunto o e a de caracteres esteja codificado segundo a tabela ASCII. Operandos do tipo char e int podem ser livremente misturados em express˜es aritm´ticas. a convers˜o ca co a de uma letra mai´scula para min´scula pode ser facilmente implementada com u u o comando: l = l . se algum dos operandos ´ long. o outro ´ convertido para unsigned e o resultado ´ e e e deste tipo. OPERADORES E EXPRESSOES Observar que convers˜es ocorrem somente quando necess´rio. esta facilidade permite a realiza¸˜o de algumas transforma¸˜es interessantes. u Portanto. A letra mai´scula armazenada na vari´vel l ´ subtra´ do c´digo da letra u a e ıda o mai´scula ’A’. Caso contr´rio os operandos s˜o int e o resultado ´ int.’A’ + ’a’. J´ que a primeira express˜o executada 1/3 a a tem como resultado 0. o e a e outro ´ convertido para long e o resultado ´ long. mas o contr´rio a e a nem sempre ocorre convenientemente. convers˜es aritm´ticas ocorrem de maneira quase que natural. e • float ´ convertido para double. Em o e opera¸˜es bin´rias as seguintes convers˜es ocorrem quando diferentes tipos est˜o co a o a envolvidos: • char ´ convertido para int.98 ˜ CAP´ ITULO 5. Um resultado float ao ser carregado em uma vari´vel a a do tipo int causa o truncamento da parte fracion´ria. a . A linguagem n˜o especifica se o tipo a char ´ um tipo com sinal ou n˜o. se algum e e a dos operandos ´ unsigned. porventura existente. resultando da convers˜o para e o u a min´scula.

5.10.

ˆ REGRAS DE PRECEDENCIA

99

5.10

Regras de Precedˆncia e

A Tabela 5.10 mostra, em ordem decrescente de prioridade, as regras de precedˆncia e dos operadores em C. Os operadores que est˜o na mesma linha da tabela e com a a mesma ordem tˆm a mesma prioridade. Alguns dos operadores listados na e Tabela somente ser˜o mostrados nos cap´ a ıtulos seguintes. Pri 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 Operador () [] -> . ! ~ ++ -- * & (tipo) sizeof() * / % + >> << < <= >= > == != & ^ | && || ? () : () = += -= *= /= %= >>= <<= &= |= , Descri¸˜o ca Agrupamento; acesso vetor; acesso membro Un´rias l´gicas, aritm´ticas e com ponteiros; a o e Conforma¸˜o de tipo; tamanho ca Multiplica¸˜o, divis˜o e m´dulo ca a o soma e subtra¸˜o ca Deslocamento de bits ` direita e esquerda a Operadores relacionais Igualdade e diferen¸a c E bit a bit Ou exclusivo bit a bit Ou bit a bit E Ou Tern´rio a Atribui¸˜es co Atribui¸˜es co Separador de express˜es o

Tabela 5.9: Precedˆncia dos operadores. e

100

˜ CAP´ ITULO 5. OPERADORES E EXPRESSOES

Exerc´ ıcios
5.1: Escreva as express˜es C abaixo na sua forma matem´tica usual: o a 1. (a/b)*(c/d) 2. (a/b*c/d) 3. (a/(b*c)/d) 4. a*x*x+b*x+c 5.2: Escreva as express˜es matem´ticas na linguagem C. o a 1. b2 − 4 · b · c 2. 3.
1 1+
1+ 1 1 1+x

a+b c+d x c+d

4. a ×

5.3: Diga a ordem de c´lculo e o resultado das express˜es abaixo: a o 1. x = 5 * 4 / 6 + 7; 2. x = 5 * 4.0 / 6 + 7; 3. x = 5 * 4 % 6 + 7; 4. x = ((4 / 2) + (3.0 * 5)); 5.4: Escreva um programa que imprima a tabela verdade da fun¸˜o ou excluca sivo. 5.5: Escreva um programa que calcule o produto entre um valor x e 2n , onde n e x s˜o inteiros. Utilize operadores bin´rios. a a 5.6: Escreva um programa que leia um ˆngulo em segundos e imprima quantos a graus, minutos e segundos h´ neste ˆngulo. a a 5.7: Escreva um programa que leia um tempo em segundos e imprima quantas horas, minutos e segundos h´ neste tempo. a 5.8: Escreva um programa que leia um comprimento em cent´ ımetros e imprima quantos metros, dec´ ımetros e cent´ ımetros h´ neste comprimento. a

Cap´ ıtulo 6

Comandos de Controle
6.1 Introdu¸˜o ca

Este cap´ ıtulo tem por objetivo apresentar os comandos de controle da linguagem C. Estes comandos servem para controlar o fluxo de execu¸˜o das instru¸˜es ca co de um programa. Estes comandos permitem que o computador tome decis˜es o independentemente do usu´rio que est´ rodando o programa. a a

6.2

Blocos de Comandos

Blocos de comando s˜o grupos de comandos que devem ser tratados como uma a unidade l´gica. O in´ de um bloco em C ´ marcado por uma chave de abertura o ıcio e ({) e o t´rmino por uma chave de fechamento (}). O bloco de comandos serve e para agrupar comandos que devem ser executados juntos. Por exemplo, usase bloco de comandos quando em comandos de teste deve-se escolher entre executar dois blocos de comandos. Um bloco de comandos pode ser utilizado em ´ qualquer trecho de programa onde se pode usar um comando C. E interessante observar que um bloco de comandos pode ter zero comandos C. Um bloco de comandos com 0 ou 1 comando pode dispensar as chaves. Um bloco de comandos ´ mostrado a seguir. e
/* bloco_de_coma ndos */ { i = 0; j = j + 1; printf ( " % d % d \ n " , i , j ); }

101

102

CAP´ ITULO 6. COMANDOS DE CONTROLE

6.3

Comandos de Teste

Os comandos de teste permitem ao computador decidir o caminho a seguir, durante a execu¸˜o do programa, indepentemente do usu´rio. Estes testes s˜o ca a a baseados em estados internos dispon´ ıveis ao processador. Estes estados podem ser resultantes de uma opera¸˜o aritm´tica anterior, de uma opera¸˜o anterior ca e ca etc.

6.3.1

Comando if

O comando if ´ utilizado quando for necess´rio escolher entre dois caminhos. e a A forma geral do comando if ´ a seguinte: e
i f ( express~ o ) a blo co_de_comandos1 ; else blo co_de_comandos2 ;

Neste comando a express˜o ´ avaliada, e caso o resultado seja verdadeiro a e (qualquer resultado diferente de zero) o bloco de comandos1 ´ executado, caso e contr´rio o bloco de comandos2 ´ executado. Pela defini¸˜o do comando a exa e ca press˜o deve ter como resultado um valor diferente de zero para ser considerada a verdade. Observar que somente um dos dois blocos ser´ executado. Como a a cl´usula else ´ opcional a forma abaixo do comando if ´ perfeitamente v´lida. a e e a
i f ( express~ o ) a bloco_de_comandos ;

Lembrar que os blocos de comandos devem ser delimitados pelas chaves, a n˜o ser quando o bloco ´ composto por 0 ou 1 comando. A seguir mostramos a e alguns exemplos de uso de comando if:
scanf ( " % d " , & dia ); i f ( dia > 31 && dia < 1 ) printf ( " Dia invalido \ n " ); scanf ( " % d " , & numero ); i f ( numero >= 0 ) printf ( " Numero positivo \ n " ); else printf ( " Numero negativo \ n " ); scanf ( " % f " , & salario ); i f ( salario < 800.00) { printf ( " Aliquota de imposto = 0.1\ n " ); imposto = salario * 0.1; } else

Por favor entre com os dois operandos. 6.25... e l s e i f ( express~ o ) a bloc o_de_comandos . Um exemplo de uso deste programa ´ o seguinte: e Este programa simula uma calculadora simples. e l s e blo co_de_comandosn O programa 6. Por´m em alguns casos.1 mostra um exemplo com if’s em escada e aninhados.2 Comando switch O comando if.6. imposto = salario * 0.. ´ suficiente resolver problemas de sele¸ao e c de comandos. COMANDOS DE TESTE { printf ( " Aliquota de imposto = 0. 3 5 Qual a operacao + O resultado da + vale 8. e l s e blo co_de_comandos . e l s e i f ( express~ o ) a bloc o_de_comandos .25\ n " ).3.3.000000. A forma geral do comando switch ´ a seguinte: e . cuja ca a forma geral ´ a seguinte: e i f ( express~ o ) a blo co_de_comandos else i f ( express~ o1 ) a bloco_de _c om andos1 else i f ( express~ o2 ) a blo co_de_comandos2 . O comando switch facilita a escrita de trechos de programa em que a sele¸˜o deve ser feita entre v´rias ca a alternativas. como no exemplo 6. Para evitar que o recuo da escada seja muito profundo o comando if em escada foi escrito da seguinte maneira: i f ( express~ o ) a bloc o_de_comandos ..1 o programa se e torna mais trabalhoso para ser escrito e entendido. } 103 Uma constru¸˜o que pode aparecer s˜o os comandos if’s em escada. em todas suas formas. .

} e l s e res = num1 / num2 .0) { printf ( " Operacao de divisao por 0 invalida !\ n " ). /* segundo operando */ res . #include < stdio . e l s e i f ( oper == ’ . return 1. oper = getchar (). e l s e i f ( oper == ’* ’) res = num1 * num2 . return 1.\ n " . /* resultado da operacao */ char oper . /* caracter que define a operacao */ printf ( " \ nEste programa simula uma calculadora simples . & num2 ). return 0. res ). /* primeiro operando */ num2 . } . /* tirar o cr */ printf ( " Qual a operacao ? \ n " ).\ n " ). printf ( " Por favor entre com os dois operandos .h > i n t main ( void ) { float num1 . scanf ( " % f % f " . getchar (). oper . e l s e i f ( oper == ’/ ’) { i f ( num2 == 0.\ n " ).’) res = num1 . } else { printf ( " Operacao invalida !\ n " ).1: Programas com if´s em escada e aninhados. } printf ( " O resultado da % c vale % f . COMANDOS DE CONTROLE Listing 6. & num1 .104 CAP´ ITULO 6. i f ( oper == ’+ ’) res = num1 + num2 .num2 .

a a O comando break ´ um dos comandos de desvio da linguagem C. case constante2 : s eq ¨ ^ n cia _d e_ co ma n do s . ue break. e express˜es com resultados tipo char podem ser usadas. • O resultado da express˜o deve ser um tipo enumer´vel. Um ue e bloco de comandos inicia com uma chave e termina com uma chave. isto ´. a e 2. ue break. O comando default ´ opcional. enquanto que uma seq¨ˆncia ´ apenas uma s´rie de comandos. ue break. COMANDOS DE TESTE switch ( express~ o ) a { case constante1 : s eq ¨ ^ n cia _d e_ co ma n do s . A execu¸˜o e a o ca do comando switch segue os seguintes passos: 1. A express˜o ´ avaliada. por exemplo o a a tipo int. case constante3 : s eq ¨ ^ n cia _d e_ co ma n do s . Por exemplo. ue } 105 Uma seq¨ˆncia de comandos ´ diferente de um bloco de comandos. O resultado da express˜o ´ comparado com os valores das constantes que a e aparecem nos comandos case. uma vez que ue e e um bloco de comandos foi selecionado por um comando if ele ser´ executado a at´ a ultima instru¸˜o do bloco.3. Tamb´m podem ser usados tipos compat´ e ıveis com int. a menos que haja um comando de desvio. O break e ´ usado dentro do comando switch para interromper a execu¸˜o da seq¨ˆncia e ca ue de comandos e pular para o comando seguinte ao comando switch. 4. . Caso n˜o ocorra nenhuma coincidˆncia os comandos associados ao coa e mando default s˜o executados.. e se ele a e n˜o aparecer nenhum comando ser´ executado. Quando o resultado da express˜o for igual a uma das constantes. ou at´ que um comando ca e e break seja encontrado. default : se q ¨ ^ nc ia_ d e_co m and o s .. Uma e ´ ca s´rie de comandos s˜o apenas comandos colocados um ap´s outro.6. o . a ea xecu¸˜o se inicia a partir do comando associado com esta constante. H´ alguns pontos importantes que devem ser mencionados sobre o comando a switch. A ca execu¸˜o continua at´ o fim do comando switch. 3.

O trecho de programa que pertence ao la¸o ´ executado e ao final a c e vari´vel de controle ´ incrementada ou decrementada e comparada com o valor a e final que ela deve alcan¸ar. O comando tern´rio tem a seguinte forma: a express~o1 ? a express~o2 : a express~o3 a Para avaliar o resultado total da express˜o.1 Comando for Este comando aparece em v´rias linguagens de programa¸˜o. Caso este resultado seja correspondente ao valor verdadeiro ent˜o o a resultado da express˜o ser´ igual ao resultado da express~o2.106 CAP´ ITULO 6. ca c 6. a O programa 6. mesmo as que a estejam relacionadas com outros testes case. express~ o2 . A express~o1 ´ utilizada para inicializar a vari´vel de controle do la¸o. Uma vari´vel de controle. primeiro avexpress~o1 ´ avalia a e ada. • O comando switch s´ pode testar igualdade. geralmente um contador. 6. Caso a condi¸˜o de t´rmino tenha sido atingida o c ca e la¸o ´ interrompido.2 mostra um exemplo de uso de comandos switch. o • N˜o podem aparecer duas constantes iguais em um case. a 6. todas as instru¸˜es a c co seguintes ao teste case que teve sucesso ser˜o executadas. Caso contr´rio a a a a a express~o3 ´ avaliada e se torna o resultado. a e a c . O programa 6.3 mostra um a e exemplo de uso de comando tern´rio.3. O n´mero de vezes que um la¸o u u c ser´ executado pode ser fixo ou depender de condi¸˜es que mudam durante a a co execu¸˜o do la¸o. A id´ia b´sica do comando e a for ´ a seguinte. A forma geral do comando for ´ a seguinte: c e e f o r ( express~ o1 . recebe um e a valor inicial.4.3 Comando Tern´rio a O comando tern´rio tem este nome porque necessita de trˆs operandos para ser a e avaliado. COMANDOS DE CONTROLE • Notar que caso n˜o apare¸a um comando de desvio. express~ o3 ) a a a blocodecomandos .4 La¸os de Repeti¸˜o c ca Estes comandos permitem que trechos de programa sejam repetidos um certo n´mero de vezes controlado pelo programa. mas na linguagem a ca C ele apresenta uma grau maior de flexibilidade. As trˆs express˜es geralmente tˆm os seguintes significados: e o e 1.

6.4. LACOS DE REPETICAO ¸ ¸˜

107

Listing 6.2: Exemplo de switch.
#include < stdio .h > i n t main ( void ) { float num1 , /* primeiro operando */ num2 , /* segundo operando */ res ; /* resultado da operacao */ char oper ; /* caracter que define a operacao */ printf ( " \ nEste programa simula uma calculadora simples .\ n " ); printf ( " Por favor entre com os dois operandos .\ n " ); scanf ( " % f % f " , & num1 , & num2 ); getchar (); printf ( " Qual a operacao \ n " ); oper = getchar (); printf ( " A operacao e % c \ n " , oper ); switch ( oper ) { case ’+ ’: res = num1 + num2 ; break; case ’ - ’: res = num1 - num2 ; break; case ’* ’: res = num1 * num2 ; break; case ’/ ’: i f ( num2 == 0.0){ printf ( " Divisao por zero e uma opcao invalida .\ n " ); return 1; } else { res = num1 / num2 ; break; } default : printf ( " Operacao invalida !\ n " ); return 2; } printf ( " O resultado da % c vale % f .\ n " , oper , res ); return 0; }

108

CAP´ ITULO 6. COMANDOS DE CONTROLE Listing 6.3: Exemplo de comando tern´rio. a

#include < stdio .h > i n t main ( void ) { float num1 , /* primeiro operando */ num2 , /* segundo operando */ max ; /* resultado da operacao */ printf ( " Imprime o maior valor de dois numeros .\ n " ); printf ( " Por favor entre com os dois mumeros .\ n " ); scanf ( " % f % f " , & num1 , & num2 ); max = ( num1 > num2 )? num1 : num2 ; printf ( " O maior dos numeros lidos e % f .\ n " , max ); return 0; }

2. A express~o2 ´ um teste que controla o fim do la¸o; a e c 3. A express~o3 normalmente faz um incremento ou decremento da vari´vel a a de controle. A execu¸˜o do comando for segue os seguintes passos: ca 1. A express~o1 ´ avaliada; a e 2. A express~o2 ´ avaliada para determinar se o comando deve ser execua e tado; 3. Se o resultado da express~o2 for verdadeiro o bloco de comandos ´ a e executado, caso contr´rio o la¸o ´ terminado; a c e 4. A express˜o3 ´ avaliada; a e 5. Voltar para o passo 2. O trecho a seguir imprime todos os n´meros entre 1 e 100. u
f o r ( i = 1; i <= 100; i ++) { printf ( " Numero % d \ n " , i ); }

O programa 6.4 mostra como se pode calcular o fatorial de um n´mero u usando-se o comando for.

6.4. LACOS DE REPETICAO ¸ ¸˜ Listing 6.4: Exemplo de comando for.
#include < stdio .h > #include < stdlib .h > i n t main () { i n t numero , fat =1 , i ; printf ( " \ nEntre com um numero positivo . " ); scanf ( " % d " , & numero ); f o r ( i = numero ; i >1; i - -) fat = fat * i ; printf ( " O fatorial de % u vale % u . " , numero , fat ); return 0; }

109

La¸os for com mais de um comando por express˜o c a Outra possibilidade que o comando for em C permite ´ a inclus˜o de v´rios e a a comandos, separados por v´ ırgulas, nas express˜es. O trecho de programa a o seguir mostra um exemplo de uso de comando for com v´rios comandos nas a express˜es. o
int i,j; f o r ( i =1 , j = 10; i <= 10; i ++ , j += 10) { printf ( " i = %d , j = % d \ n " , i , j ); }

La¸os for com testes usando outras vari´veis c a A express˜o de controle n˜o precisa necess´riamente envolver somente um teste a a a com a vari´vel que controla o la¸o. O teste de final do la¸o pode ser qualquer a c c express˜o relacional ou l´gica. No programa 6.5 o la¸o pode terminar porque a o c a vari´vel de controle j´ chegou ao seu valor limite ou foi batida a tecla ’*’, e a a neste caso o la¸o termina antecipadamente. c La¸os for com express˜es faltando c o Um outro ponto importante do for ´ que nem todas as express˜es precisam estar e o a a e ´ presentes. No exemplo 6.6 a vari´vel de controle n˜o ´ incrementada. A unica maneira do programa terminar ´ o usu´rio bater o n´mero -1. e a u ´ E poss´ omitir qualquer uma das express˜es. Por exemplo, se a express~o2 ıvel o a for omitida o programa assume que ela ´ sempre verdade de modo que o la¸o e c s´ termina com um comando de desvio como o break. O programa do exemplo o

110

CAP´ ITULO 6. COMANDOS DE CONTROLE

Listing 6.5: Exemplo de comando for com testes sobre outras vari´veis. a
#include < stdio .h > i n t main () { char c = ’ ’; int i; f o r ( i =0 ; (i <5) && ( c != ’* ’ ); i ++ ) { printf ( " % c \ n " , c ); c = getchar (); } return 0; }

Listing 6.6: Exemplo de comando for sem altera¸˜o da vari´vel de controle. ca a
#include < stdio .h > i n t main () { int i; f o r ( i =0 ; i != -1 ; ) { printf ( " % d \ n " ,i ); scanf ( " % d " , & i ); } return 0; }

6.7 para quando o valor da vari´vel de controle for igual a 5. Neste caso o teste a ser´ verdade o la¸o termina por meio do break. a c

La¸o infinito c Uma constru¸˜o muito utilizada ´ o la¸o infinito. No la¸o infinito o programa ca e c c p´ra quando se executa o comando break. O trecho de programa a seguir a somente p´ra quando for digitada a tecla ’s’ ou ’S ’. a
for ( ; ; ) { printf ( " \ nVoce quer parar ?\ n " ); c = getchar (); i f ( c == ’S ’ || c == ’s ’) break; }

h > i n t main ( void ) { int i. i f ( i == 5) break. LACOS DE REPETICAO ¸ ¸˜ Listing 6. j <10. #include < stdio . f o r ( i = 0.6. i ++) { printf ( " Tabuada de % d \ n " . } 6. printf ( " Imprime tabuada de multiplicacao . i ++) { printf ( " numero % d \ n " . Esta constru¸˜o pode aparecer quando esca tamos trabalhando com matrizes.4. Listing 6. i . f o r ( j =1.7: Exemplo de comando for sem teste de fim. j. O exemplo 6.4.8 mostra um programa que imprime uma tabuada.\ n " ). } } return 0. #include < stdio . j ++) { printf ( " % d x % d = % d \ n " . f o r ( i =1 . j . i <10 . i ). i * j ).h > i n t main () { int i. } 111 La¸os for aninhados c Uma importante constru¸˜o aparece quando colocamos como comando a ser ca repetido um outro comando for.2 Comando while O comando while tem a seguinte forma geral: while ( express~ o ) a bloco_de_comandos . } return 0. .8: Comando for aninhados. i ).

´ que o bloco de comandos pode n˜o ser executado caso a condi¸˜o seja igual a e a ca falso logo no primeiro teste.9: Comando while com uma fun¸˜o. i = 1. while ( i <= 100) { printf ( " Numero % d \ n " . a ca e 3. } . while (( c = getchar ()) == ’c ’) { puts ( " Nao Acabou . e Listing 6. return 0.\ n " ). Voltar para o passo 1.9 repete um bloco de comandos enquanto o usu´rio usar a tecla ’c’ para a continuar. como pode ser visto dos passos acima. a e caso contr´rio a execu¸˜o do bloco ´ terminada. } A express˜o do comando pode incluir chamadas de fun¸˜o. qualquer outra tecla o bloco ´ interrompido. puts ( " Tecle c para continuar . Uma caracter´ ıstica do comando while. COMANDOS DE CONTROLE A express˜o pode assumir o valor falso (igual a 0) ou verdade (diferente a de 0). a e 2. Por exemplo. Se o resultado for verdadeiro ent˜o o bloco de comandos ´ executado.\ n " ). Os passos para execu¸˜o do comando s˜o os seguintes: ca a 1. O trecho de abaixo imprime os 100 primeiros n´meros usando um comando u while. i ++.112 CAP´ ITULO 6.h > i n t main ( void ) { int c. getchar (). i ).\ n " ). /* tira o enter */ } puts ( " Acabou . Lembrar que a ca qualquer atribui¸˜o entre parˆnteses ´ considerada como uma express˜o que ca e e a tem como resultado o valor da atribui¸˜o sendo feita. o programa ca 6. ca #include < stdio . A express˜o ´ avaliada.

1 Comandos de Desvio Comando break O comando break pode ser tanto usado para terminar um teste case dentro de um comando switch quanto interromper a execu¸˜o de um la¸o. a a caso contr´rio interrompe o do-while a O exemplo de comando for para imprimir os 100 primeiros n´meros escrito u com comando do-while fica da seguinte maneira: i = 1. i ++) { scanf ( " % d " .4.5 6. num ).5. portanto o bloco de comandos ´ executado pelo menos uma vez. Executa o comando. Se o resultado da express˜o for verdadeiro ent˜o volta para o passo 1. i ). se for digitado um n´mero negativo o comando for ´ u e interrompido imediatamente sem que o n´mero seja impresso. a Observar que neste comando a express˜o de teste est´ ap´s a execu¸˜o do a a o ca comando.5. COMANDOS DE DESVIO 113 6. } while ( i <= 100). & num ). No entanto.3 Comando do-while A forma gen´rica do comando ´ a seguinte: e e do bloco_de_comandos while ( express~ o ).6. printf ( " % d \ n " . do { printf ( " Numero % d \ n " . a 3. Quando o ca c comando ´ utilizado dentro de um comando for o la¸o ´ imediatamente intere c e rompido e o programa continua a execu¸˜o no comando seguinte ao comando ca for. i f ( num < 0) break. i ++. A e execu¸˜o do comando segue os seguintes passos: ca 1. i < 100. 2. u f o r ( i = 0. Avalia a express˜o. 6. No trecho de programa abaixo o comando for deve ler 100 n´meros inteiros u positivos. } .

3 Comando goto O comando goto causa um desvio incondicional para um outro ponto da fun¸˜o ca em que o comando est´ sendo usado. u e f o r ( i = 0. i < 100. No comando for o o ca c controle passa a execu¸˜o da express~o3. se houver uma.5. printf ( " % d \ n " . } 6. num ).5. i f ( num < 0) continue .5. Usuale ca ca mente o valor 0 indica que o programa terminou sem problemas. que ´ um identificador v´lido em C seguido por e o e a ´ dois pontos.4 Fun¸˜o exit() ca A fun¸˜o exit provoca a termina¸˜o de um programa. um novo n´mero ´ lido. O c´digo ca o ´ usado para indicar qual condi¸˜o causou a interrup¸˜o do programa. A forma ca geral deste comando ´: e goto r´tulo.2 Comando continue O comando continue ´ parecido com o comando break. E importante notar que o comando goto e o ponto para onde ser´ a feito o desvio pode estar em qualquer ponto dentro da mesma fun¸˜o. r´tulo: o Este comando durante muito tempo foi associado a programas ileg´ ıveis. retornando o controle ao ca ca sistema operacional. No trecho de programa abaixo o la¸o lˆ 100 n´meros inteiros. A diferen¸a ´ que o e c e comando continue simplesmente interrompe a execu¸˜o da itera¸˜o corrente ca ca passando para a pr´xima itera¸˜o do la¸o. ıdo 6. i ++) { scanf ( " % d " . Atualmente as restri¸˜es co ao uso do comando tem diminu´ e seu uso pode ser admitido em alguns casos. o .. O argumento para esta afirma¸˜o se baseia no fato de que programas com comanca dos goto perdem a organiza¸˜o e estrutura porque o fluxo de execu¸˜o pode ca ca ficar saltando erraticamente de um ponto para outro.. caso o n´mero c e u u seja negativo. Observar que esta fun¸˜o interrompe o programa como um todo. COMANDOS DE CONTROLE 6.114 CAP´ ITULO 6. . O comando para onde deve ser feito o a desvio ´ indicado por um r´tulo. Um valor diferente de 0 indica um erro. Nos comandos while e do-while o ca a controle passa para a fase de testes. O prot´tipo da fun¸˜o ´ a seguinte: o ca e void exit (int codigo). & num ).

6. O primeiro que for enca contrado durante a execu¸˜o causar´ o fim da execu¸˜o. escreva um programa que exiba c as tabuadas de multiplica¸˜o dos n´meros de 1 ` 9. leia dois valores. ap´s digitado o n´mero 10. 6. j´ que fun¸˜es deste tipo n˜o podem retornar valores. Uma fun¸˜o declarada ca a ca ca como do tipo void n˜o pode ter um comando return que retorne um valor. co 6.6: Escreva um programa com menu de 5 op¸˜es que utilize o comando de co desvio goto para executar a op¸˜o desejada e s´ saia do programa caso a op¸˜o ca o ca ‘‘5-Sair’’ seja selecionada. Por a ıda exemplo.5. A forma geral do comando ´: e e return express~o. Caso haja algum valor ca associado ao comando return este ´ devolvido para a fun¸˜o. 6. o u .7:Escreva um programa que tenha um n´mero (inteiro) como entrada do u usu´rio e escreva como sa´ a sequencia de bits que forma esse numero. ca u a 6. E poss´ haver a ıvel mais de um comando return dentro de uma fun¸˜o.6.2: Escreva um programa que exiba as op¸˜es co ‘‘1-multiplicar’’ e ‘‘2-somar’’ de um menu. execute a opera¸˜o (utica ca lizando o comando if) e exiba o resultado.5.4: Simplifique os programas anteriores da seguinte forma: • Reescreva o programa do exerc´ 1 substituindo o comando if pelo coıcio mando tern´rio. A chave que termina uma fun¸˜o ´ equiva e ca e ´ alente a um comando return sem a express˜o correspondente. a saida deve ser 0000000000001010. leia a op¸˜o desejada. caso contr´rio um e ca a valor qualquer ´ retornado. a • Reescreva o programa do exerc´ 2 substituindo os if’s em escada pelo ıcio comando switch.5: Utilizando um la¸o for dentro de outro. inclua.3: Utilizando if’s em escada. a a co a Exerc´ ıcios 6. 6.5 Comando return O comando return ´ usado para interromper a execu¸˜o de uma fun¸˜o e ree ca ca tornar um valor ao programa que chamou esta fun¸˜o. a Notar que a express˜o ´ opcional. Assuma que n ´ um valor e inteiro. COMANDOS DE DESVIO 115 6. no programa do exerc´ anterior. a Isto n˜o faz sentido.1: Escreva um programa que calcule x elevado a n. as ıcio op¸˜es ‘‘3-Subtrair’’ e ‘‘4-Dividir’’.

11: Escreva um programa que exibe a tabela ascii.. Em outra linha imprima a a as letras mai´sculas de A at´ Z (ABCD. 6. um por linha. o maior e o menor deles. u e 6. o maior e o menor deles. Obs: Considere agora que os n´meros podem ser quaisquer.10: Escreva um programa que leia 10 numeros. o produto dos trˆs digitos dos numeros.) 0 (1*1*0) 1 (1*1*1) 2 (1*1*2) ··· 9*9*9=729 Fa¸a seu programa dar uma pausa a cada 20 linhas para que seja poss´ c ıvel ver todos os n´meros pouco a pouco. O programa deve imprimir a media.9: Escreva um programa que leia 10 numeros.8:Escreva um programa que imprima todos os numeros pares entre 0 e 50 e em seguida imprima todos os impares. Solicite que seja pressionada alguma tecla u para ver a pr´xima sequencia de n´meros..12: Crie um programa para verificar se um n´mero dado ´ primo. use apenas vari´veis. Obs: Os numeros devem ser entre 0 e 10. COMANDOS DE CONTROLE 6.14: Escreva um programa que imprima a seq¨ˆncia ue ‘‘987654321876543217654321654321543214321321211’’ N˜o use nenhuma constante. u e 6. 6.). Deixar um espaco entre os numeros.13: Escreva um programa que leia um numero do teclado e ache todos os seus divisores.. 6. inicialmente o e programa ir´ exibir: a 0 (1*0*0) 0 (1*0*1) 0 (1*0*2) (. Por exemplo. 6.116 CAP´ ITULO 6. u 6. O programa deve imprimir a media.15: Escreva um programa que conte de 100 a 999 (inclusive) e exiba.. o u .

f l o a t notas [65]. Somente ap´s apresentarmos o ponteiros iremos abordar aloca¸˜o de mem´ria para vetores.2 Declara¸˜o de Vetores Unidimensionais ca A forma geral da declara¸˜o de vetores de uma dimens˜o ´: ca a e tipo nome [tamanho].1 Introdu¸˜o ca Vetores s˜o usados para tratamento de conjuntos de dados que possuem as a mesmas caracter´ ısticas. Uma das vantagens de usar vetores ´ que o conjunto e recebe um nome comum e elementos deste conjunto s˜o referenciados atrav´s de a e ´ ındices. e u Observar que em C o primeiro elemento tem ´ ındice 0 e o ultimo tamanho . Neste cap´ a o ıtulo estaremos mostrando vetores de tamanhos fixos. /* vetor de 1000 inteiros */ /* conjunto de 65 numeros reais */ /* conjunto de 40 caracteres */ O espa¸o de mem´ria. em bytes. como por exemplo matrizes de duas dimens˜es. char nome [40]. ´ Exemplos de declara¸˜es de vetores s˜o: co a i n t numeros [1000]. onde tipo ´ um tipo qualquer de dados.1. nome ´ o nome pelo qual o vetor vai e e ser referenciado e tamanho ´ o n´mero de elementos que o vetor vai conter.Cap´ ıtulo 7 Vetores e Cadeias de Caracteres 7. ca o 7. ocupado por um vetor de tipo qualquer ´ c o e igual a: 117 . Pelo nome vetor estaremos referenciando estruturas que podem ter mais de uma dimens˜o.

1 ilustra como se declara um vetor.118 CAP´ ITULO 7. i ++) printf ( " Elemento % d = % d \ n " . que posteriormente foi usada para estabelecer o tamanho do vetor. /* Geracao do conjunto */ f o r ( i = 0 .3 ilustra o m´todo da bolha para ordena¸˜o em ordem crescente de um vetor de inteiros.2 calcula o produto escalar de dois vetores inteiros.h > i n t main ( void ) { i n t vetor [ DIM ]. Portanto. Neste m´todo a cada etapa o maior elemento ´ e e movido para a sua posi¸˜o. Observar como na leitura dos elementos do vetor usa-se o operador de endere¸o & antes c do nome de cada elemento. ca O programa 7. VETORES E CADEIAS DE CARACTERES espa¸o = tamanho * sizeof(tipo) c ´ E importante notar que em C n˜o h´ verifica¸˜o de limites em vetores. Caso ca seja necess´rio trocar o tamanho do vetor basta alterar o valor da constante e a recompilar o programa. puts ( " Entre com o numero inicial do conjunto . Isto a a ca significa que ´ poss´ e ıvel ultrapassar o fim de um vetor e escrever em outras ´ vari´veis. sendo trocados caso seja necess´rio. E tarefa do programador fazer com a o que os ´ ındices dos vetores estejam sempre dentro dos limites estabelecidos pela declara¸˜o do vetor. #define DIM 5 #include < stdio . inicializa seus valores e imprime o conte´do. unsigned i n t i . vetor [ i ]). i < DIM . i ++) vetor [ i ] = num ++. " ). Notar o uso da diretiva #define DIM 5 para definir u uma constante. A cada itera¸˜o os elementos do vetor s˜o comparaca ca a dos dois a dois. por exeme plo no comando de gera¸˜o do conjunto de dados armazenado no vetor. scanf ( " % d " . i < DIM . Esta constante passa a ser usada nas referˆncias ao vetor.\ n " ). Listing 7. ele n˜o precisa ser mais considerado. e ca O programa 7. & num ). Ao t´rmino da primeira a e passada pelo vetor.1: Exemplo de vetores. } O programa 7. /* Impressao do conjunto */ f o r ( i = 0. ou mesmo em trechos de c´digo. return 0. i . puts ( " Este programa gera um vetor de inteiros . no final do e ca vetor. da´ o valor da vari´vel a ı a . o maior elemento ´ levado para a sua posi¸˜o. num .

scanf ( " % d " . f o r ( i = 0. } printf ( " Entre com outro vetor de % d elementos \ n " . f o r ( i = 0. } . i . printf ( " O produto vale % d " . DECLARACAO DE VETORES UNIDIMENSIONAIS ¸˜ 119 Listing 7. i ++) prod += vetor1 [ i ] * vetor2 [ i ]. i ). vetor2 [ DIM ] . i < DIM . scanf ( " % d " . prod =0.7. DIM ).2: Produto escalar de dois vetores. prod ). i < DIM . #define DIM 5 #include < stdio . return 0. & vetor2 [ i ]). & vetor1 [ i ]).h > i n t main ( void ) { i n t vetor1 [ DIM ] . } f o r ( i = 0. i < DIM . i ++) { printf ( " Elemento % d " . i ++) { printf ( " Elemento % d " . DIM ).2. i ). printf ( " Entre com um vetor de % d elementos \ n " .

e 7. O processo ´ repetido e ıda e at´ que todos os elementos sejam levados para as suas posi¸˜es ou que nenhuma e co troca seja realizada. e a A Tabela 7.120 CAP´ ITULO 7.3 Cadeias de Caracteres Um cadeia de caracteres (string) ´ um conjunto de caracteres terminado por um e caractere nulo. que aponta para o final do vetor (fim) ´ diminu´ de 1. Por exemplo. VETORES E CADEIAS DE CARACTERES Opera¸˜o ca Passo 1 v[0] > v[1]? Trocar v[0] e v[1] > v[2]? Trocar v[1] e v[2] > v[3]? Trocar v[2] e v[3] > v[4]? Trocar v[3] e Passo 2 v[0] > v[1]? Trocar v[0] e v[1] > v[2]? Trocar v[1] e v[2] > v[3]? Trocar v[2] e Passo 3 v[0] > v[1]? v[1] > v[2]? Trocar v[1] e Passo 4 v[0] > v[1]? Trocar v[0] e v[0] 20 15 15 15 15 15 15 15 15 8 8 8 8 8 8 8 8 8 5 v[1] 15 20 20 8 8 8 8 8 8 15 15 12 12 12 12 12 5 5 8 v[2] 8 8 8 20 20 12 12 12 12 12 12 15 15 5 5 5 12 12 12 v[3] 12 12 12 12 12 20 20 5 5 5 5 5 5 15 15 15 15 15 15 v[4] 5 5 5 5 5 5 5 20 20 20 20 20 20 20 20 20 20 20 20 v[1] v[2] v[3] v[4] v[1] v[2] v[3] v[2] v[1]? Tabela 7.1 mostra os passos executados pelo algoritmo at´ ordenar o vetor. que s˜o definidas e ıvel a como uma lista de caracteres entre aspas. Por c exemplo. . que ´ representado como ’\0’.1: Passos executados durante o algoritmo da bolha. Para especificar um vetor para e armazenar um cadeia deve-se sempre reservar um espa¸o para este caracter. para armazenar um cadeia de 40 caracteres deve-se reservar um vetor de 41 de caracteres. Em C ´ poss´ haver constantes cadeia. Quando nenhuma troca ´ realizada o vetor est´ ordenado.

} . f o r ( i =0. i . ca e #define DIM 5 #define FALSO 0 #define VERDADE 1 #include < stdio . i < DIM . i ++) printf ( " % d \ n " . } do { trocou = FALSO . scanf ( " % d " . f o r ( i =0. i ++) { i f ( vetor [ i ] > vetor [ i +1]) { temp = vetor [ i ]. temp . vetor [ i ]).7. f o r ( i = 0. fim = DIM . i ++) { printf ( " Elemento % d " . } } fim . return 0. trocou = VERDADE .3: Ordena¸˜o pelo m´todo da bolha. printf ( " Entre com um vetor de % d elementos \ n " . CADEIAS DE CARACTERES 121 Listing 7. vetor [ i ] = vetor [ i +1]. vetor [ i +1] = temp .h > i n t main ( void ) { i n t vetor [ DIM ] . i < fim -1. } while ( trocou ). DIM ). i < DIM . & vetor [ i ]). i n t trocou = FALSO .3.-. i ).

N˜o confundir o tamanho da cadeia com o tamanho do a vetor que armazena a cadeia. A fun¸˜o ca retorna o valor de dest. size_t ´ o tipo inteiro sem sinal que volta como co e resultado do operador sizeof. O a primeiro caracter de orig substitui o caracter nulo de dest. Retorna zero se as cadeias s˜o iguais. O primeiro caracter de orig substitui o caracter nulo de dest. menor que 0 se cad1 < cad2.4. ca . • char *strcpy(char *dest. por exemplo. Em C n˜o h´ a e a ca a a o tipo cadeia (string) e. A fun¸˜o retorna o valor de dest. ca • char *strncat (char *dest. const char *orig): Concatena cadeia orig ao final de dest. Algumas das fun¸˜es co co mais comuns est˜o resumidamente descritas a seguir: a Nas defini¸˜es a seguir. const char *orig): Copia cadeia orig para dest. O comprimento da cadeia ´ determinado pelo e caractere nulo. Retorna zero e se as cadeias s˜o iguais. menor a que 0 se cad1 < cad2. Para facilitar a programa¸˜o u ca foram criadas algumas fun¸˜es para manipular cadeias. uma cadeia de um caractere apenas. const char *cad2): Compara lexicograficamente as duas cadeias.h. VETORES E CADEIAS DE CARACTERES "programando em C" N˜o ´ necess´rio a coloca¸˜o do caracter nulo ao final da cadeia. usando no m´ximo n caracteres de orig. Observe que sempre ´ colocado um branco ao final e do nome para separ´-lo do sobrenome. conjuntos de caracteres teriam de ser tratados como conjuntos de n´meros inteiros. c O valor de dest ´ retornado. Neste exemplo. O programa ir´ ent˜o cone a a catenar as duas cadeias. • char *strcat(char *dest. e esta ´ raz˜o das aspas.122 CAP´ ITULO 7. • size_t strlen(const char *cad): Calcula o comprimento da cadeia sem contar o caracater nulo. const char *orig. O programa 7. ou seja. const char *cad2.4 mostra exemco a plos de uso de algumas das fun¸˜es de cadeia. Este branco ´ inserido usando a fun¸˜o a e ca strcat. portanto. size_t n): Compara lexicograficamente at´ n caracteres das duas cadeias. • char *strcmp (const char *cad1. A cadeia destino deve ter espa¸o suficiente para armazenar orig. maior que 0 se cad1 > cad2. e Estas fun¸˜es est˜o na biblioteca string. e a A seguir mostramos um resultado da execu¸˜o do programa 7. o programa co primeiro lˆ um nome e em seguida um sobrenome. • char *strncmp (const char *cad1. size_t n): Concatena cadeia orig ao final de dest. maior que 0 se a cad1 > cad2.

/* tira cr do fim */ puts ( nome ). i < strlen ( nome ). sobrenome ). co #include < string . } . } } return 0. sobrenome [41]. printf ( " Qual caracter ? " ). c = getchar (). i ). stdin ).7.4: Exemplos de fun¸˜es para cadeias. printf ( " Entre com um sobrenome " ).3.h > #include < stdio . puts ( sobrenome ). nome [ strlen ( nome ) -1] = ’ \0 ’. 41 . nome [81] . strcat ( nome . strcat ( nome .h > i n t main ( void ) { char c . f o r ( i =0. puts ( nome ). i ++) { i f ( c == nome [ i ]) { printf ( " O caractere aparece na posicao % d \ n " . sobrenome [ strlen ( sobrenome ) -1] = ’ \0 ’. 41 . fgets ( sobrenome . " " ). printf ( " Entre com um nome " ). int i. CADEIAS DE CARACTERES Entre com um nome Ze Ze Entre com um sobrenome Sa Sa Ze Sa Qual caracter? a O caractere aparece na posicao 4 123 Listing 7. stdin ). fgets ( nome .

& matriz [ i ][ j ]). o endere¸o aponta um byte e a u c matriz est´ armazenada a partir do endere¸o 1000. } return 0. printf ( " \ n " ).. e Listing 7. } A matriz ´ armazenada na mem´ria linha a linha e a Figura 7. i < DIML . i n t matriz [ DIML ][ DIMC ]. j..4 ilustra esta e o id´ia com uma matriz de n´meros inteiros de trˆs por trˆs. matriz [ i ][ j ]). a c . Deve-se tomar cuidado com armazenae a mento de matrizes multidimensionais. a A forma geral da declara¸˜o ´ a seguinte: ca e tipo nome [dim1][dim2][dim3]. O programa 7. por que a mem´ria necess´ria para guardar o a estes dados ´ igual a e sizeof(tipo)*dim1*dim2*dim3*.5: Leitura de uma matriz.124 CAP´ ITULO 7. j < DIMC . j ++) printf ( " %4 d " . Estamos assumindo e u e e que cada n´mero inteiro ocupa quatro bytes. j < DIMC . f o r ( i =0. i ++) f o r ( j =0. armazena o dobro do elemento que est´ na quarta linha e nona coluna na vari´vel a a c. Observar que o primeiro ´ ındice indica a linha e o segundo a coluna. Lembrar que o n´mero da primeira linha (coluna) ´ igual a 0. define uma matriz quadrada de 10 linhas por 20 colunas. #define DIML 3 #define DIMC 5 #include < stdio . f o r ( i =0..*dimN Por exemplo a declara¸˜o ca int matriz[10][20]. j ++) scanf ( " % d " . i < DIML . enquanto o comando c = 2 * matriz[3][8]. onde dimI ´ o tamanho da dimens˜o I.5 lˆ uma u e e matriz de trˆs linhas e cinco colunas e imprime os valores lidos.4 Declara¸˜o de Vetores Multidimensionais ca Em C existe a possibilidade de declararmos vetores de mais de uma dimens˜o. VETORES E CADEIAS DE CARACTERES 7. i ++) { f o r ( j =0.[dimN].h > i n t main ( void ) { int i..

7. . o C1 M Rij = k=1 M 1ik × M 2kj (7.1: Mapa de mem´ria de uma matriz.1. char nome turma[30][80]. ca a e ca Considere a matriz M 1 com L1 linhas e C1 colunas e a matriz M 2 com L2 linhas e C2 colunas. o Uma opera¸˜o muito comum em matem´tica ´ a multiplica¸˜o de matrizes. VETORES DE CADEIAS DE CARACTERES 125 1000 m[0][0] 1004 m[0][1] 1008 m[0][2] 1012 m[1][0] 1016 m[1][1] 1020 m[1][2] 1024 m[2][0] 1028 m[2][1] 1032 m[2][2] Figura 7. O elemento M Rij da matriz resultado M R do produto destas matrizes ´ definido pela equa¸˜o 7. O programa 7.1) 7. O n´mero de colunas C1 de M 1 deve ser igual ao n´mero u u de linhas L2 de M 2.5.6 multiplica duas e ca matrizes de acordo com a f´rmula.5 Vetores de Cadeias de Caracteres A declara¸˜o abaixo mostra uma matriz de cadeias de caracteres com 30 linhas ca de 80 caracteres.

} } f o r ( i =0. j. i ++ ) { f o r ( j =0. i ++) { f o r ( j =0.3 f " . mr [ i ][ j ]). scanf ( " % f " . j < C1 . } } f o r ( i =0. } return 0. i < L1 . f o r ( i =0. ca #include < stdio . % d " . j < C2 . m . j ++) { printf ( " %d . } mr [ i ][ j ] = m . j < C2 . } printf ( " \ n " ). } . i . f o r ( k =0. j ). i .6: Multiplica¸˜o de duas matrizes. m2 [ L2 ][ C2 ]. k ++) { m += m1 [ i ][ k ]* m2 [ k ][ j ]. i < L2 . j ++) { printf ( " %. i ++) { f o r ( j =0.h > #define #define #define #define L1 L2 C1 C2 3 3 3 3 i n t main ( void ) { f l o a t m1 [ L1 ][ C1 ] . % d " . k. VETORES E CADEIAS DE CARACTERES Listing 7. scanf ( " % f " . } } f o r ( i =0. i < L1 . j ++) { printf ( " %d . j < C2 . k < C1 . & m2 [ i ][ j ]). & m1 [ i ][ j ]). f l o a t mr [ L1 ][ C2 ] . j ). j ++) { m = 0. int i. i < L1 .126 CAP´ ITULO 7. i ++) { f o r ( j =0.

onde lista de valores ´ um conjunto de valores separados por v´ e ırgulas. nomes [ i ][ strlen ( nomes [ i ]) -1] = ’ \0 ’. i ++) { printf ( " Entre com a linha % d " . 15. A forma de fazer isto ´ a seguinte: a e tipo nome[dim] = {lista de valores}. } f o r ( i =0. 30 }.6 Inicializa¸˜o de Vetores e Matrizes ca Em C ´ poss´ e ıvel inicializar vetores da mesma forma que vari´veis. f o r ( i =0. no a e momento em que s˜o declarados.6. ca co int vetor[5] = { 10. Por exemplo. DIMC -1 . 20. #define DIML 5 #define DIMC 41 #include < stdio .7. Observe que nesta declara¸˜o ´ necess´rio que o tamanho do conjunto seja ca e a conhecido antecipadamente. E importante notar que para ler um nome o programa n˜o a lˆ um caracter de cada vez mas usa a fun¸˜o fgets. } 7. a declara¸˜o abaixo inicializa um vetor inteiro de cinco posi¸˜es. i ).h > i n t main ( void ) { int i. INICIALIZACAO DE VETORES E MATRIZES ¸˜ 127 O Programa 7. char nomes [ DIML ][ DIMC ]. i ).7 mostra um programa que lˆ uma matriz de nomes e imprime e ´ os seus conteudos.7: Leitura de um vetor de nomes. fgets ( nomes [ i ] . tamb´m ´ poss´ inicializar vetores e e ıvel . puts ( nomes [ i ]). No entanto. Como cada linha da matriz e ca ´ uma cadeia de caracteres. stdin). o programa lˆ o nome que est´ na linha i como e e a fgets(nomes[i]. 25. i < DIML . stdin ).h > #include < string . i < DIML . i ++) { printf ( " O nome % d e " . } return 0. DIMC-1. Listing 7. isto ´.

} / s i z e o f ( i n t ). 18 . O Programa 7. ´ importante que o a a e programador preveja um modo de indicar o fim do vetor. i . 25 . -1}. i < DIM . 20 .h > i n t main () { i n t vetor [ DIM ] = {10 . printf ( " \ nVetor terminando por -1\ n " ).\ n " ). VETORES E CADEIAS DE CARACTERES em que n˜o se conhece o seu tamanho. vetor2 [ i ]). Neste caso uma posi¸˜o do vetor ´ perdida para e u ca e armazenar esta condi¸˜o. 50 . Neste caso. 24}. printf ( " a sua declaracao .definido \ n " ). i . 12 . Listing 7. No primeiro exemplo o tamanho do vetor ´ conhecido e foi definido pela constante DIM. tam . Para descoe brir o como parar de processar o vetor. i ++) printf ( " Elemento % d = % d \ n " . printf ( " que foram inicializados durante " ). Observe que sizeof calcula o tamanho do vetor em bytes e por esta raz˜o ´ necess´rio uma divis˜o pelo tamanho em bytes do a e a a tipo de cada elemento. i n t vetor2 [] = {3 . vetor [ i ]). f o r ( i =0. f o r ( i =0. 6 . No primeiro caso a condi¸˜o de fim do ca vetor ´ o n´mero negativo -1. vetor1 [ i ]). i . 15 . unsigned i n t i . apresentamos duas solu¸˜es poss´ co ıveis.8: Exemplos de tratamento de vetores. 30}. quando desconhecemos seu tamanho. No segundo caso ´ usado o operador sizeof para ca e descobir o tamanho do vetor. 40 . #define DIM 5 #include < stdio .128 CAP´ ITULO 7. i n t vetor1 [] = {10 . i ++) % d = % d \ n " . ´ E poss´ ıvel inicializar matrizes multidimensionais e neste caso ´ necess´rio e a especificar todas as dimens˜es menos a primeira. 20 . /* Impressao dos conjuntos */ printf ( " \ nVetor com tamanho pre . para que o compilador possa o . i < tam . 60 . printf ( " contendo numeros inteiros e \ n " ). ent˜o. 9 . i ++) printf ( " Elemento % d = % d \ n " . printf ( " Elemento return 0.8 mostra os casos ilustrados acima. tam = s i z e o f ( vetor2 ) printf ( " \ nDescobrindo f o r ( i =0. printf ( " Este programa imprime vetores " ). vetor1 [ i ] >0. o tamanho do Vetor \ n " ). 21 . 30 . 15 .

5 . 7. puts ( disciplinas [ i ]).0 . " disc 1: Banco de Dados I " . scanf ( " % d " . // linha 2 O Programa 7.0 . que ca nada mais ´ do que uma matriz de caracteres. 3.0} . return 0.5 . int i. 0. & i ). 4.9 ilustra a defini¸˜o de um vetor de cadeia de caracteres. 9.1 . Listing 7. INICIALIZACAO DE VETORES E MATRIZES ¸˜ 129 reservar mem´ria de maneira adequada. " disc 2: Banco de Dados II " .0 . #define DIM 5 #include < stdio .0 .7. Note que as cadeias s˜o separadas e a uma das outras por v´ ırgulas.0 . // linha 1 {0. A declara¸˜o a seguir ilustra como declarar e inicializar uma matriz de trˆs ca e linhas por quatro colunas de n´meros reais. A primeira dimens˜o somente especifica o a quantos elementos o vetor ir´ armazenar e isto lendo a inicializa¸˜o o compilador a ca pode descobrir. printf ( " Qual a disciplina ? " ). 2. 6. " disc 3: Arquitetura de Computadores I " }. } .0 . 0. u f l o a t mat [][4] = { {1.9: Exemplos de tratamento de vetores.0} .4} }. 0.h > i n t main ( void ) { char disciplinas [][40] = { " disc 0: Computacao para Informatica " . // linha 0 {8.6.

A sua miss˜o ´ mais simples ainda. escrever e a a e um programa que converta cada letra. e co 7. 7. Dentro de cada bloco o seu programa deve trocar a primeira letra pela letra seguinte no alfabeto. Divida a linha em blocos de 5 e letras.130 CAP´ ITULO 7. Os espa¸os em branco e e c devem ser retirados da frase. e O programa tamb´m deve imprimir em que posi¸˜es o caracter foi encontrado.4: Escreva um programa que leia uma linha do teclado e imprima todas as vogais encontradas no texto e o total de vezes que elas aparecem.6: Escreva um programa que leia uma frase de 80 caracteres e a imprime retirando os espa¸os em branco. 7. Criptografia: FYDANVCYAF .7: Escreva um programa que leia uma linha de caracteresdo teclado de tamanho 80. c 7. 1. Neste sistema cada letra era substitu´ ıda por trˆs letras ` frente no alfabeto. Frase lida: EVA VIU A UVA 2. a terceira por trˆs letras adiante e assim at´ a quinta. e somente as letras. Divis˜o em blocos de 5 (blocos indicados por tipos diferentes): a EVAVIUAUVA 4.3: Escreva um programa que leia uma linha do teclado e em seguida um par de caracteres. Obs: Tamanho maximo da linha deve ser 40 caracteres. N˜o use fun¸˜es da biblioteca de strings co a co do C 7. e a letra ’Z’ para ’A’. A linha somente cont´m letras. tamb´m fornecido pelo teclado. Note que a letra ’z’ e deve ser convertida para a letra ’a’. de uma mensagem de at´ 80 caracteres para a letra imediatamente posterior.1: Escreva um programa que leia uma linha de at´ 80 caracteres do teclado e e imprima quantos caracteres foram lidos. Considere o seguinte exemplo. VETORES E CADEIAS DE CARACTERES Exerc´ ıcios 7.5: Oimperador romano Cesar usava um sistema simples para codificar as mensagens que enviava aos seus generais. Obs.2: Escreva um programa que leia uma linha de caracteres do teclado e imprima quantas vezes um caracter. O programa deve procurar este par na linha e imprimir em que posi¸˜es o par foi encontrado. aparece nesta linha. 7. a segunda letra por duas letras adiante no alfabeto. Retirada dos espa¸os em branco: c EVAVIUAUVA 3.

10: Escreva um programa que leia para um vetor um conjunto de n´meros u inteiros.11: Fa¸a um programa que inverta uma cadeia de caracteres. Assuma que os nomes ser˜o lidos e a somente em letras mai´sculas. Assuma tamb´m que os nomes tˆm no m´ximo u e e a 40 caracteres e ser˜o lidos 10 nomes ao todo. O programa deve inserir no vetor.6. Assuma que a posi¸˜o especificada pelo a u ca usu´rio corresponde ao ´ a ındice do vetor. e 7.12: Escreva um programa que leia um conjunto de nomes para uma matriz e imprima estes nomes em ordem alfab´tica. a . um n´mero lido do teclado. em uma posi¸˜o especificada pelo ca usu´rio.8: Escreva um programa que leia uma matriz de 3x3 que cont´m somente e caracteres 0 e X e procure linhas que contenham somente um dos dois caracteres. O caracter a ser procurado deve ser lido do teclado. o que ser´ impresso pelo programa ´: a e FYDANVCYAF 131 7. INICIALIZACAO DE VETORES E MATRIZES ¸˜ Portanto. 7. 7. Use o a comando for para varrer a cadeia at´ o seu final. Assuma que as palavras u s˜o sempre separadas por um branco. a 7. Assuma que o conjunto de n´meros lidos ´ menor que o tamanho do u e vetor.7.9: Escreva um programa que leia uma linha de caracteres do teclado e converta o primeiro caracter de cada palavra para mai´sculas. O programa c deve ler a cadeia com gets e armazen´-la invertida em outra cadeia.

VETORES E CADEIAS DE CARACTERES .132 CAP´ ITULO 7.

a quanco a tidade de erros ´ bastante reduzida.1 Introdu¸˜o ca Em C. como estas fun¸˜es foram testadas por diversos usu´rios. No entanto o uso de fun¸˜es pode co facilitar o desenvolvimento de programas de diversas maneiras. que resultados ir´ fornecer e que opera¸˜es ela deve realizar c˜ a a co sobre estes parˆmetros para obter os resultados necess´rios. Primeiro.Cap´ ıtulo 8 Fun¸oes c˜ 8. As fun¸˜es de entrada e sa´ s˜o o exemplo mais direto co ıda a deste reuso. Este reuso de c´digo apresenta v´rias o a vantagens. diminui o tempo de desenvolvimento do programas. Em segundo lugar. Em C n˜o existem estes tipos de comandos como na maioria das a linguagens. Para isto basta que alguns acordos sejam feitos entre os programadores que ir˜o programar a a fun¸ao e os que ir˜o us´-las. Na linguagem C n˜o h´ conceito de um programa principal. todas as a¸˜es ocorrem co dentro de fun¸˜es. Programas escritos em C usam fun¸˜es de entrada e sa´ escritas co ıda e testadas por outros programadores. Fun¸˜es podem ser desena co volvidas por programadores trabalhando independentemente. e ca e Um programa pode ser escrito apenas com a fun¸˜o main e mais as fun¸˜es ca co existentes nas bibliotecas da linguagem C. Estes acordos precisam definir que parˆmetros a c˜ a a a fun¸ao ir´ receber. Em primeiro lugar temos as vantagens do reuso de c´digo desenvolvido por o outros programadores. Esta divis˜o do a a a trabalho concorre para acelerar o desenvolvimento dos programas e na redu¸˜o ca dos custos deste desenvolvimento. A divis˜o de um programa em fun¸˜es tamb´m permite que os testes do a co e sistema completo sejam feitos mais facilmente e com mais garantia de corre¸˜o. diferentemente de outras linguagens como Pascal. Uma outra vantagem do uso de fun¸˜es e a maior facilidade na divis˜o do co a trabalho necess´rio para construir um aplicativo. ca 133 . o co a a que existe ´ uma fun¸˜o chamada main que ´ sempre a primeira a ser executada. Estes fatores contribuem para a redu¸˜o e ca dos custos de desenvolvimento dos projetos.

co a H´ basicamente duas maneiras de terminar a execu¸˜o de uma fun¸˜o. Normalmente testar um programa complexo requer testes complexos. deve declarar como parˆmetro uma vari´vel deste u a a tipo para receber o valor.. Isto permite que muitos erros do sistema completo possam ser retirados antes que ele esteja completo.. 8. ca a O tipo que aparece antes do nome da fun¸˜o especifica o tipo do resultado que ca ser´ devolvido ao final da execu¸˜o da fun¸˜o. ca executa comandos com estes argumentos e pode retornar ou n˜o um resultado a para a fun¸˜o que chamou esta fun¸˜o. o valor da express~o ´ devolvido para a fun¸˜o que chamou. Mesmo quando um programa ´ desenvolvido por um unico programador a e ´ sua divis˜o em fun¸˜es traz vantagens. O tipo void pode e ser usado para declarar fun¸˜es que n˜o retornam valor algum. Caso nenhum tipo seja especifia ca ca cado o compilador assume que um tipo inteiro ´ retornado. Nora ca ca malmente usa-se o comando return para retornar o resultado da fun¸˜o. nome2. . de vari´veis com seus a tipos associados. .2 Forma Geral A forma geral de uma fun¸˜o em C ´ a seguinte: ca e tipo nome ( tipo nome1 . a for executado. .134 CAP´ ITULO 8. tipo nomeN ) { declara¸ ~ o das vari´ veis ca a corpo da fun¸ ~ o ca } Uma fun¸˜o recebe uma lista de argumentos (nome1. a e ca Quando n˜o h´ valor para retornar o comando return n˜o precisa ser usado e a a a a fun¸˜o termina quando a chave que indica o t´rmino do corpo da fun¸˜o ´ ca e ca e atingido. ´ uma lista.. Porca tanto. por dividir um trabalho complexo em a co diversas fatias menores permitindo ao programador se concentrar a cada vez em problemas mais simples. quando o comando return express~o. A lista de argumentos pode ser vazia. . Os parˆmetros s˜o valores que a fun¸˜o recebe para realizar as tarefas para a a ca as quais foi programada. O nome da fun¸˜o pode ser qualquer identificador v´lido. tamb´m chamaca ca e dos de parˆmetros.. uma fun¸˜o que calcule a raiz quadrada ca de um n´mero do tipo float . tipo nome2 . separada por v´ a e ırgulas.. j´ que as fun¸˜es normalmente s˜o simples e tˆm requisitos menos a co a e complicados de serem avaliados. A lista de argumentos. N˜o ´ poss´ usar uma unica defini¸˜o de tipo para v´rias a e ıvel ´ ca a vari´veis. a fun¸˜o n˜o recebe a ca a nenhum argumento. FUNCOES ¸˜ Os programadores podem testar suas fun¸˜es separadamente em testes menos co complexos. Por exemplo. nomeN). ou seja.

. nota2. Por ca exemplo. Outro ponto importante a ser notado e que ser´ detalhado mais adiante ´ a e que os nomes das vari´veis nos programas que usam a fun¸˜o media podem ser a ca diferentes dos nomes usados na defini¸˜o da fun¸˜o. ca ca 8. nota1. na lista de parˆmetros ´ necess´rio associar um tipo a cada vari´vel como a e a a no exemplo a seguir: float media (float n1. ca ca o Tamb´m ´ poss´ e e ıvel declarar um prot´tipo sem dar os nomes das vari´veis o a o ca somente os tipos das fun¸˜es. e a e ´ E importante notar que o nome da fun¸˜o pode aparecer em qualquer lugar ca onde o nome de uma vari´vel apareceria. No exemplo 8. Se os tipos s˜o incompat´ a ıveis. tipo nome2. uma fun¸˜o chamada media que ´ do tipo float . Suponha que uma determinada e ca fun¸ao. n3) tamb´m do tipo float . tipo nomeN). B. float n2. i. e e Um ponto importante ´ como usar a fun¸˜o. deseje usar uma outra fun¸˜o. A.´ 8. Prot´tipos de fun¸˜es ajudam a a a o co detectar erros antes que eles ocorram.3. . um programador que deseje usar a fun¸˜o media em seu programa ca para calcular a m´dia de trˆs valores. A forma geral de defini¸˜o de um prot´tipo ´ ca o e a seguinte: tipo nome (tipo nome1. float n3).3 Prot´tipos de Fun¸˜es o co O padr˜o ANSI estendeu a declara¸˜o da fun¸˜o para permitir que o compilador a ca ca fa¸a uma verifica¸˜o mais r´ c ca ıgida da compatibilidade entre os tipos que a fun¸˜o ca espera receber e `queles que s˜o fornecidos. deve escrever no e e local onde quer que a m´dia seja calculada o seguinte comando: e resultado = media(nota1. mes. onde resultado ´ a vari´vel que vai receber a m´dia calculada. nota3). A fun¸˜o A deve colocar no local c˜ ca ca desejado o nome da fun¸˜o (B) e a lista de valores que deseja passar.. nota2 e nota3.1 mostra a declara¸˜o de uma fun¸˜o e seu prot´tipo. isto ´ retorna ca e e um resultado float . int) . O exemplo 8. Al´m disso os tipos e o n´mero de a e u parˆmetros que aparecem na declara¸˜o da fun¸˜o e na sua chamada devem a ca ca estar na mesma ordem e ser tipos equivalentes. mas podem ser gerados avisos na compila¸˜o e a ca resultados estranhos..1 o prot´tipo da fun¸˜o soma pode co ser declarada da seguinte maneira int soma (int. recebe trˆs argumentos (n1. o compilador n˜o gera um erro. Neste exemplo. n2. PROTOTIPOS DE FUNCOES ¸˜ 135 ´ E importante notar que diferentemente de declara¸˜es de vari´veis onde co a podemos associar v´rios nomes de vari´veis a uma declara¸˜o como em a a ca int a. impedindo que fun¸˜es sejam chamadas co com argumentos inconsistentes. dia.

4. Elas passam a existir quando do in´ da execu¸˜o do bloco de ıcio ca . co • fora de todas as fun¸˜es. por esta raz˜o n˜o ´ poss´ definir uma fun¸˜o dentro de outra fun¸˜o. b =9. b )). co • na lista de parˆmetros das fun¸˜es. a co As vari´veis definidas dentros das fun¸˜es s˜o chamadas de vari´veis loa co a a cais. i n t b ) { return a + b . /* Funcao Principal */ i n t main () { i n t a =5 . } 8. o #include < stdio .1 Vari´veis Locais a As vari´veis locais s˜o aquelas declaradas dentro de uma fun¸˜o ou um bloco a a ca de comandos.1: Exemplo de prot´tipos. return 0. ou pode ocorrer que vari´veis precisem ser acess´ a ıveis ` diversas a fun¸˜es diferentes. As vari´veis podem ser declaradas a basicamente em trˆs lugares: e • dentro de fun¸˜es. a a e ıvel ca ca 8. Por esta raz˜o. FUNCOES ¸˜ Listing 8. i n t b ).4 Escopo de Vari´veis a Vari´veis podem ser definidas para serem usadas somente dentro de uma fun¸˜o a ca particular.136 CAP´ ITULO 8. soma (a . as que aparecem fora de todas as fun¸˜es chamamos de vari´veis globais co a ´ e aquelas que aparecem na lista de parˆmetros s˜o os parˆmetros formais. } /* Definicao da funcao */ i n t soma ( i n t a . printf ( " % d \ n " .h > /* Prototipo da funcao */ i n t soma ( i n t a . temos que apresentar os locais onde as co a vari´veis de um programa podem ser definidas e a partir destes locais podera mos inferir onde elas estar˜o dispon´ a ıveis. E a a a importante notar que em C todas as fun¸˜es est˜o no mesmo n´ co a ıvel.

impares (). Os valores co da vari´vel n˜o podem ser acessados a partir de nenhuma outra fun¸˜o e as a a ca modifica¸˜es feitas dentro da fun¸˜o somente valem enquanto a fun¸˜o est´ co ca ca a sendo executada. ou seja usada.2 podemos ver o uso de vari´veis locais. ESCOPO DE VARIAVEIS 137 comandos ou fun¸˜o onde foram definidas e s˜o destru´ ca a ıdas ao final da execu¸˜o ca do bloco. i += 2) { printf ( " % d : " . elas s˜o invis´ a ıveis para outras fun¸˜es do mesmo programa. } } i n t main ( i n t argc .4. i <= 11. dentro a o da fun¸˜o (ou bloco) onde foi declarada. Listing 8. No entanto. A vari´vel i ´ definida em cada uma das fun¸˜es do programa (pares.h > void pares ( void ) { int i. Outro ponto muito importante ´ que ca e como as vari´veis locais deixam de existir ao final da execu¸˜o da fun¸˜o (ou a ca ca bloco).´ 8. O c´digo co o que define uma fun¸˜o e os seus dados s˜o particulares da fun¸˜o (do bloco). return 0. } Alguns autores usam o termo vari´veis autom´ticas para se referir as vari´veis a a a locais. f o r ( i = 2. como todas a a a as vari´veis locais s˜o por defini¸˜o autom´ticas raramente se usa esta palavra a a ca a chave. a #include < stdio . Em C existe a palavra chave auto que pode ser usada para declarar que vari´veis pertencem ` classe de armazenamento padr˜o.2: Exemplos de vari´veis locais. char * argv []) { pares (). impares). ca a ca a a e No programa 8. i ). f o r ( i = 3. i <= 10. } } void impares ( void ) { int i. i += 2) { printf ( " % d : " . i ). Uma vari´vel local s´ pode ser referenciada. Observe que um bloco de comandos se inicia em um ‘‘{’’ e termina em . printf ( " \ n " ).

o programa pode a ca ocupar menos espa¸o de mem´ria. evitando erros de uso indevido da vari´vel. portanto. Outra vantagem ´ que como a a e vari´vel somente existe dentro do bloco.h > i n t main () { int i. i <10. pode-se controlar melhor o uso da a vari´vel. i * t ).5 Vari´veis Globais a As vari´veis globais s˜o definidas fora de qualquer fun¸˜o e s˜o portanto dispoa a ca a n´ ıveis para qualquer fun¸˜o. dentro do qual mais comumente se define uma vari´vel ´ a fun¸˜o.4 ilustra este tipo de declara¸˜o. i ++) { i n t t = 2.138 CAP´ ITULO 8. se a execu¸˜o do bloco for c o ca condicional a vari´vel pode nem ser alocada. podem vir logo ap´s o abre co a ca o chaves que in´ um bloco de comandos. Como a as vari´veis somente existem durante a execu¸˜o do bloco. a altera¸˜o feita por esta a e ca . ıcia a c ca O programa 8. FUNCOES ¸˜ um ‘‘}’’. ca Listing 8. co a uma vari´vel global tem de ser usada. A a ıcio ca fun¸˜o soma1 ao executar um comando que aumenta o valor de i em uma unidade ca est´ aumentando a vari´vel global.3: Defini¸˜o de vari´vel dentro de um bloco. O resultado da execu¸˜o ca ca deste programa ´ o seguinte: e Funcao soma1: i = 1 Funcao sub1: i = 9 Funcao main: i = 1 Observe que a vari´vel global i recebe o valor 0 no in´ da fun¸˜o main. uma maneira de transferir valores entre elas. } return 0. } Existem algumas vantagens em se declarar vari´veis dentro de blocos. printf ( " % d \ n " . se duas fun¸˜es tem de partilhar dados. mais uma n˜o chama a outra. a O programa 8. O bloco de comandos. Declara¸˜es de vari´veis. ca a #include < stdio . Em seguida vemos que a fun¸˜o sub1 define a a ca uma vari´vel local tamb´m chamada i e. Por ca co exemplo. Por exemplo. n˜o somente o que come¸a uma fun¸˜o. Este tipo de vari´vel pode servir como uma canal ca a de comunica¸˜o entre fun¸˜es.3 ilustra este tipo de declara¸˜o. Todas as vari´veis que ser˜o usadas dentro de um a e ca a a bloco de comandos precisam ser declaradas antes do primeiro comando do bloco. incluindo sua inicializa¸˜o. f o r ( i =0. a a 8.

No entanto. etc. i ). operadas. printf ( " Funcao sub1 : i = % d \ n " . sub1 (). void soma1 ( void ) { i += 1. printf ( " Funcao soma1 : i = % d \ n " .6 Parˆmetros Formais a As vari´veis que aparecem na lista de parˆmetros da fun¸˜o s˜o chamadas de a a ca a parˆmetros formais da fun¸˜o. } 8. soma1 (). Parˆmetros s˜o valores que as fun¸˜es recebem da fun¸˜o a a co ca que a chamou.6. a Listing 8.ˆ 8. i -= 1. a fun¸˜o main imprime o c˜ a ca valor final da vari´vel global. printf ( " Funcao main : i = % d \ n " . PARAMETROS FORMAIS 139 fun¸ao somente modifica esta vari´vel. Parˆmetros podem ser passados para fun¸˜es de duas ca a co maneiras: passagem por valor ou passagem por referˆncia. } i n t main ( i n t argc . e 8. Portanto. ca a #include < stdio . Finalmente. char * argv []) { i = 0. i ). a a sem nenhuma restri¸˜o. pois para isto foram criados. return 0.4: Defini¸˜o de vari´vel global. Eles s˜o criados no in´ da execu¸˜o da fun¸˜o a ca a ıcio ca ca e destru´ ıdos no final. Normalmente os parˆmetros s˜o inicializados durante a chamada da a a fun¸˜o.h > int i. Neste caso a fun¸˜o que recebe este valor. i ). os parˆmetros permitem que uma fun¸˜o passe valores a ca para outra.6. } void sub1 ( void ) { i n t i = 10. ao fazer modifica¸˜es no ca ca co . as vari´veis que atuam como ca a parˆmetros s˜o iguais a todas as outras e podem ser modificadas.1 Passagem de Parˆmetros por Valor a Na passagem por valor uma c´pia do valor do argumento ´ passado para a o e fun¸˜o.

2 Passagem de Parˆmetros por Referˆncia a e Na passagem por referˆncia o que ´ passado para a fun¸˜o ´ o endere¸o do e e ca e c parˆmetro e. i n t potencia .h > #include < stdlib . numero = atof ( linha ). char linha [80]. o ca a j´ que estes n˜o sofreram nenhuma altera¸˜o. b . puts ( " Entre com um numero " ).5: Exemplo de passagem por valor. a fun¸˜o que recebe pode.6. i n t b ) { f l o a t res = 1. numero . f o r ( . O exemplo 8. return res . printf ( " \ n % f Elevado a % d e igual a % f \ n " . O resultado da execu¸˜o deste a a ca ca programa ´ o seguinte: e a = 10.0.b) e opera usando os valores ca a recebidos.h > f l o a t Eleva ( f l o a t a . Neste programa as vari´veis a e b recebem os valores 10 e 20 respectivaa mente. b >0.5 mostra o uso de passagem de parˆmetros por valor. modificar a ca e c . } i n t main () { f l o a t numero . potencia = atoi ( linha ). puts ( " Entre com a potencia " ). gets ( linha ). portanto. Eleva ( numero . potencia )).6. ca e a Listing 8. potencia . Na fun¸˜o trocar estes valores s˜o recebidos e s˜o trocados localmente. FUNCOES ¸˜ parˆmetro. atrav´s do endere¸o. O resultado da fun¸˜o ´ retornado por meio da vari´vel local res. Observe a que as fun¸˜o Eleva recebe dois parˆmetros (a. b = 20 8. return 0.-) res *= a .140 CAP´ ITULO 8. n˜o estar´ alterando o valor original que somente existe na fun¸˜o a a a ca que chamou. o programa imprime os valores originais das vari´veis. gets ( linha ). } Para ilustrar o fato de que somente o valor ´ passado vamos usar o exemplo e 8. ca a a Ap´s o retorno da fun¸˜o. #include < stdio .

} 141 o valor do argumento diretamente na fun¸˜o que chamou.7 mostra um programa que usa uma fun¸˜o e ca para descobrir quantas vezes um caracter ocorre em um vetor. return 0. Este assunto ser´ a e e a a discutido no pr´ximo cap´ o ıtulo e portanto. uma constante.3 Passagem de Vetores e Matrizes Matrizes s˜o um caso especial e excess˜o a regra que parˆmetros s˜o passados a a a a sempre por valor. b ). a o que somente iremos ver no pr´ximo cap´ o ıtulo. O exemplo 8. por exemplo. O exemplo 8. Al´m disso C n˜o confere limites de vetores e portanto a e a fun¸ao precisa do endere¸o inicial do vetor e uma maneira de descobrir o final c˜ c do vetor. trocar (a . Quando um vetor ´ passado como c e parˆmetro. a c e Existem basicamente trˆs maneiras de declarar um vetor como um parˆmetro e a de uma fun¸˜o. por agora.6.h > void trocar ( i n t a . ca ca a Uma outra maneira. b = 20. } i n t main ( i n t argc . c e Neste modo o parˆmetro ´ declarado como um vetor sem dimens˜o. Na primeira ele ´ declarado como tem sido apresentado em todos ca e os exemplos at´ agora. b ). temp = a . usaremos somente fun¸˜es co com passagem por valor. printf ( " a = %d . Para a passagem de ca parˆmetros por referˆncia ´ necess´rio o uso de ponteiros. a #include < stdio . a . ou o caracter ’\0’ em um vetor de caracteres. Como veremos mais adiante. i n t b ) { i n t temp .ˆ 8. . PARAMETROS FORMAIS Listing 8. o nome de um vetor corresponde ao endere¸o do primeiro elemento do array. char * argv []) { i n t a = 10 . b = temp .6. 8. a = b . Esta maneira pode ser. Isto ´ a e a e perfeitamente poss´ porque a fun¸˜o somente precisa receber o endere¸o onde ıvel ca c se encontra o vetor.8 mostra este modo de passar vetores com um programa que inverte o conte´do de um vetor. u A terceira maneira de passagem de parˆmetros implica no uso de ponteiros.6: Uso indevido de vari´veis locais. Observe que na defini¸˜o da fun¸˜o a dimens˜o do vetor foi declarada explicitamente. b = % d \ n " . apenas o endere¸o do primeiro elemento ´ passado. leva em conta que apenas o endere¸o do vetor ´ passado.

’a ’ ]). c ++) i f ( minusculas [c . c <= ’z ’.’a ’ ]) printf ( " % c apareceu % d vezes \ n " . char c ) { i n t i =0 . i n t maiusculas [26] . puts ( " Entre com uma linha " ).’a ’] = conta ( linha . return 0.142 CAP´ ITULO 8. f o r ( c = ’a ’. c . char c ). c ++) i f ( maiusculas [c . c <= ’z ’. } char conta ( char v [ DIM ] . c <= ’Z ’. f o r ( c = ’a ’. minusculas [26].’A ’ ]) printf ( " % c apareceu % d vezes \ n " . c ). c ++) minusculas [c . vezes =0.h > #include < conio .7: Passagem de vetor com dimens˜es. minusculas [c . linha [ DIM ]. i n t main () { char c . c . f o r ( c = ’A ’. c ++) maiusculas [c . FUNCOES ¸˜ Listing 8. c ).’A ’ ]). return vezes . maiusculas [c . o #include < stdio . f o r ( c = ’A ’. } . gets ( linha ). c <= ’Z ’.’A ’] = conta ( linha .h > #define DIM 80 char conta ( char v [] . while ( v [ i ] != ’ \0 ’) i f ( v [ i ++] == c ) vezes ++.

Imprime_vetor (v . i n t tam ). f o r ( i = 0. } } . } } void Imprime_vetor ( i n t v [] . i ++){ temp = v [ i ]. DIM ). return 0. DIM ). i < tam . i n t tam ){ i n t i . i ). temp . i n t tam ). i n t tam ) { int i. i n t tam ).6. & v [ i ]). Imprime_vetor (v . i ++) printf ( " % d = % d \ n " . i ++) { printf ( " % d = ? " . PARAMETROS FORMAIS 143 Listing 8. i n t tam ) { int i.h > #define DIM 6 void Le_vetor ( i n t v [] . } void Le_vetor ( i n t v [] . Inverte_vetor (v .ˆ 8.h > #include < conio . v [ i ]). scanf ( " % d " . v [ tam -i -1] = temp .8: Passagem de vetores sem dimens˜es. i n t main () { i n t v [ DIM ]. void Inverte_vetor ( i n t v [] . i . void Imprime_vetor ( i n t v [] . } void Inverte_vetor ( i n t v [] . DIM ). f o r ( i = 0. o #include < stdio . v [ i ] = v [ tam -i -1]. f o r ( i = 0. DIM ). i < tam /2. Le_vetor (v . i < tam .

8 Recurs˜o a Fun¸˜es em C podem ser usadas recursivamente. Al´m disso a ca e e fun¸˜o pode n˜o conter o comando e portanto nenhum valor ´ retornado e neste ca a e caso a fun¸˜o termina quando o ultimo comando da fun¸˜o ´ executado. que tem a a seguinte a forma geral: return express~o a A fun¸˜o que chamou ´ livre para ignorar o valor retornado. i >1. ca o ca mostrado a seguir. isto ´ uma fun¸˜o pode chamar co e ca ´ a si mesmo.144 CAP´ ITULO 8.f. Veja a defini¸˜o em recurs˜o a ca a Um exemplo simples de fun¸˜o que pode ser escrita com chamadas recursivas ca ´ o fatorial de um n´mero inteiro. Quando ca ´ ca e o comando return n˜o existe o valor de retorno ´ considerado indefinido. E co a importante observar que fun¸˜es que s˜o declaradas com um tipo v´lido podem co a a ser inclu´ ıdas em qualquer express˜o v´lida em C. return fato . o fatorial pode ser defindo como o produto deste n´mero u pelo fatorial de seu predecessor. ou seja n! = n ∗ (n − 1)! Deste modo podemos escrever uma fun¸˜o recursiva em que cada chamada ca da fun¸˜o que calcula o fatorial chama a pr´pria fun¸˜o fatorial. As a e ´ fun¸˜es que n˜o retornam valores devem ser declaradas como do tipo void. } Alternativamente. ca . i . FUNCOES ¸˜ 8.-) fato = fato * i . mostra como a fun¸˜o pode ser escrita recursivamente. Qualquer express˜o pode aparecer no comando. E como se procur´ssemos no dicion´rio a defini¸˜o da palavra a a ca recurs˜o e encontr´ssemos o seguinte texto: a a recurs˜o: s. ´ e u u a e definido como n! = n ∗ (n − 1) ∗ (n − 2) ∗ · · · ∗ 2 ∗ 1 A partir desta defini¸˜o podemos escrever a fun¸˜o fatorial como ca ca unsigned long i n t fat ( unsigned long i n t num ) { unsigned long i n t fato =1 . i . a a 8. O exemplo.7 O Comando return O comando return ´ usado para retornar o valor calculado para a fun¸˜o que e ca chamou. O fatorial de um n´mero. f o r ( i = num . sem recurs˜o.

As principais vantagens da recurs˜o s˜o c´digos mais co a a o compactos e provalvemente mais f´ceis de serem lidos. Este processo continua se repetindo at´ que o valor u e passado ´ igual a 0. c Um ponto importante ´ que toda fun¸˜o recursiva deve prever cuidadosae ca mente como o processo de recurs˜o deve ser interrompido.argc e argv A fun¸ao main como todas as fun¸˜es podem ter parˆmetros. E importante notar que recurs˜o n˜o traz obrigatoriamente economia c˜ a a de mem´ria porque os valores sendo processados tem de ser mantidos em pilhas.8. ou seja o a a produto do n´mero pelo valor do fatorial do n´mero predecessor. Na ca fun¸ao consideramos que x ´ do tipo float . o que indica o final da recurs˜o.9. ´ uma vari´vel inteira que indica quantos are a gumentos foram fornecidos para a fun¸˜o. e as vezes pode ser at´ mais lento porque temos o custo a a e de chamada as fun¸˜es. No caso da fun¸˜o fat a ca o processo ´ interrompido quando o valor do n´mero passado como parˆmetro e u a vale 0. a Um outro exemplo simples de fun¸˜o que pode ser resolvida por recurs˜o ca a ´ xn .9. Neste ponto o processo se e a reverte e as chamadas come¸am a ser respondidas. argc. assumindo que n ≥ 0. Observar que argc vale sempre pelo ca . else return num * fat ( num -1). ca a O primeiro argumento. a Quando uma fun¸˜o chama a si mesmo recursivamente ela recebe um conca junto novo de vari´veis na pilha que ´ usada para transferˆncia de valores entre a e e ´ fun¸oes. u a ca No caso contr´rio ela devolve o valor da express˜o num * fat(num-1). Se este teste n˜o tivesse sido inclu´ na fun¸˜o as chamadas contina ıdo ca uariam indefinidamente com valores negativos cada vez menores sendo passados como parˆmetro. Como a fun¸˜o main c˜ co a ca ´ sempre a primeira a ser executada. o Nem ser´ mais r´pido. ARGUMENTOS . No caso ca da fun¸˜o main s˜o usados dois argumentos especiais int argc e char **argv.ARGC E ARGV unsigned long i n t fat ( unsigned long i n t num ) { i f ( num == 0) return 1. primeiro ´ verificado se o ca e e n´mero recebido como parˆmetro vale 0 e neste caso a fun¸˜o retorna o valor 1. c˜ e 8. os parˆmetros que ela recebe s˜o fornecidos e a a pela linha de comando ou pelo programa que iniciou a sua execu¸˜o. Esta fun¸˜o pode escrita na sua forma recursiva e ca como xn = x ∗ x(n−1) que nos leva a escrever a fun¸˜o da maneira mostrada no exemplo 8.9 Argumentos . } 145 Quando a fun¸˜o fatorial recursiva ´ chamada. Ou seja para u u retornar um valor a fun¸˜o precisa chamar ela mesma passando como parˆmetro ca a o valor do n´mero menos 1.

O vetor deve ser inicializado com as letras min´sculas u u do alfabeto.9: Fun¸˜o recursiva para calcular xn . inicialize e imprima um vetor de 10 inteiros. u Cada um dos argumentos do programa ´ um elemento deste vetor.1: Escrever um programa que declare. b -1). Neste programa a leitura dos nomes dever ser feita por uma fun¸˜o ca e a impress˜o dos nomes por outra. e portanto. Os nomes argc e argv s˜o comumente usados mas o programador ´ livre para a e escolher os nomes mais apropriados. a co 8. caso a e sejam fornecidos n´meros. FUNCOES ¸˜ Listing 8. Exerc´ ıcios 8.146 CAP´ ITULO 8. co 8. A inicializa¸˜o do vetor e a sua impress˜o devem ser feitas por ca a fun¸˜es. a . Assuma que o tamanho m´ximo de cada nome ´ 40 a e caracteres.10 calcula o fatorial dos n´meros fornecidos como u argumentos. ca f l o a t Elevar ( f l o a t x .2: Escreva um programa para declarar um vetor de caracteres de tamanho 26 e imprimir o seu conte´do. } } menos 1. O outro parˆmetro ´ um vetor de cadeias de caracteres. estes devem ser convertidos para o formato requerido.3: Escreva um programa que armazene em uma matriz trˆs nomes de pessoas e e em seguida os imprima. A primeira e linha da fun¸˜o main pode ter a seguinte forma ca void main (int argc. i n t n ) { i f ( n <= 1) { return x . porque o nome do programa ´ sempre o primeiro argumento fornecido e ao programa. } else { return x * Elevar (x . O vetor deve conter os 10 primeiros m´ltiplos de 5. A inicializa¸˜o do u ca vetor e a sua impress˜o devem ser feitas por fun¸˜es. A partir do segundo argumento em diante ´ que aparecem os e outros argumentos. char *argv[]) O programa exemplo 8.

} f o r ( i =1. i < argc .9. numero . i f ( argc < 2) { printf ( " Para rodar : % s num1 num2 . i ++) { numero = ( unsigned long i n t ) ( atoi ( argv [ i ])). else return num * fat ( num -1). fatorial ). char * argv []) { unsigned long i n t numero . fatorial .ARGC E ARGV 147 Listing 8.8. argv [0]). } return 0.h > unsigned long i n t fat ( unsigned long i n t num ) { i f ( num == 0) return 1. i . fatorial = fat ( numero ). #include < stdio . } i n t main ( i n t argc . .\ n " .\ n " . } . printf ( " O fatorial de % lu vale % lu .h > #include < stdlib . ARGUMENTOS . return 1...10: Uso de argc e argv.

ıcio ca 8.5: Escreva um programa que crie uma tabela de temperaturas Celsius Fahrenheit. a tabela inteira. FUNCOES ¸˜ 8. ıda a Entre com um numero inteiro: 0 Fibonacci (0) = 0 Entre com um numero inteiro: 1 Fibonacci (1) = 1 Entre com um numero inteiro: 2 Fibonacci (2) = 1 Entre com um numero inteiro: 3 Fibonacci (3) = 2 Entre com um numero inteiro: 6 Fibonacci (6) = 8 . a escolha do usuario. caractere a caractere.4: Escreva um programa que imprima o codigo ASCII de todos os caracteres. A tabela deve iniciar na temperatura 0 graus Celsius e terminar na temperatura 100 graus Celsius. Cada elemento do vetor ´ igual a soma dos elementos de uma das linhas e da matriz. 8.6: Escreva um programa. a partir de um determinado valor decimal.148 CAP´ ITULO 8. A seq¨ˆncia de Fibonacci ´ definida como: ue e f (0) = f (1) = f (n) = 0 1 f (n − 1) + f (n − 2) O programa deve ler um numero e exibir o valor dele na sequencia de Fibonacci. O programa deve usar uma fun¸˜o que converta de Celsius para ca Fahrenheit. Cada item deste exerc´ deve corresponder a uma fun¸˜o. Considere que a matriz tenha tamanho 10 por 10. 2. usando fun¸˜es.7: Escreva um programa usando recursividade para gerar a seq¨ˆncia do ue Fibonacci. Exemplos de entrada e sa´ do programa s˜o mostrados abaixo. que gere um vetor a partir de uma co matriz. 8. das seguintes maneiras: 1.

A mem´ria de um computador pode ser vista como uma sequˆncia ca o e de bytes cada um com seu pr´prio e unico endere¸o.1 mostra o mapa de um trecho de mem´ria que cont´m duas vari´veis inteiras (num. Por exemplo um computador com mem´ria igual a 512 e o Mbytes tem 512x1024x1024 bytes.1: Mapa de mem´ria com duas vari´veis e ponteiro. O primeiro endere¸o ´ sempre 0 e o ultimo geralmente ´ c c e ´ e uma potˆncia de 2.Cap´ ıtulo 9 Ponteiros 9. Um ponteiro ´ uma a a a u e vari´vel que cont´m um endere¸o de uma posi¸˜o de mem´ria e n˜o o conte´do a e c ca o a u da posi¸˜o. Observar que e os endere¸os est˜o pulando de quatro em quatro bytes devido ao espa¸o que c a c cada um destas vari´veis ocupa. res) ocupando 4 bytes o e a cada uma e mais um ponteiro (pint). N˜o h´ dois bytes com o ´ c a a o mesmo endere¸o. que tamb´m ocupa 4 bytes. a 0 4 8 12 16 10 120 num res *pint N Figura 9. A Figura 9. o a 149 .1 Introdu¸˜o ca Ponteiros s˜o usados em situa¸˜es em que ´ necess´rio conhecer o endere¸o a co e a c onde est´ armazenada a vari´vel e n˜o o seu conte´do.

2: Ponteiro apontando para ´rea de mem´ria contendo vetor. Neste esquema o programador pode reservar o n´mero exato a u de posi¸˜es que o programa requer.150 CAP´ ITULO 9.2 ilustra como um ponteiro faz co referˆncia para uma ´rea de mem´ria. que ap´s o fim da fun¸˜o estar˜o dispon´ a o ca a ıveis para a fun¸˜o que ca chamou. no in´ ıcio. ca Uma outra aplica¸˜o importante de ponteiros ´ apontar para ´reas de meca e a m´ria que devem ser gerenciadas durante a execu¸˜o do programa. Observe a diferen¸a do que ocorre quando a c se usa vetores de tamanho fixo. Com ponteiros. Com pono ca teiros. ca e e ca 0 4 8 1000 pi ponteiro para vetor 1000 120 Vetor de 10 inteiros 1036 97 N Figura 9. Neste caso os argumentos podem funcionar como entrada e sa´ de ıda dados da fun¸˜o. ´ poss´ e ıvel reservar as posi¸˜es de mem´ria necess´rias para armazenaco o a mento destas ´reas somente quando for necess´rio e n˜o quando as vari´veis a a a a s˜o declaradas. Neste caso uma solu¸˜o ´ a fun¸˜o receber como ca e ca argumentos n˜o os valores dos parˆmetros mas sim ponteiros que apontem para a a seus endere¸os. definir a vari´vel ponteiro e seu tipo. Assim esta fun¸˜o pode modificar diretamente os conte´dos c ca u destas vari´veis. Neste caso a defini¸˜o do tamanho do vetor ´ ca e dada na declara¸˜o do vetor e ´ mantida at´ o final da execu¸˜o do programa. Na figura a vari´vel ponteiro pi aponta e a o a para a ´rea de mem´ria que cont´m um vetor de 10 inteiros. quando se deseja que uma fun¸˜o a ca retorne mais de um valor. reserva a ´rea ca o a necess´ria para guardar os dados. Durante a a execu¸˜o do programa. PONTEIROS Ponteiros s˜o importantes. A Figura 9. o a o e programador precisa. por exemplo. ap´s descobrir o tamanho do vetor. a o .

que ´ equivc e alente a 0. OPERACOES COM PONTEIROS ¸˜ 151 9. /* ponteiro para ponto flutuante */ Como as vari´veis.h> e significa que o e ponteiro n˜o aponta para lugar nenhum. ´ uma constante definida no arquivo <stdio. Um ponteiro pode ser a ca inicializado com um endere¸o ou com o valor NULL. ca . ca ca e ca Ap´s a declara¸˜o o que temos ´ um espa¸o na mem´ria reservado para aro ca e c o mazenamento de endere¸os. Onde tipo ´ qualquer tipo v´lido em C e nome ´ o nome da vari´vel ponteiro. Esta tipo de atribui¸˜o n˜o faz sentido e ca a porque na maioria das aplica¸˜es ´ o sistema operacional que aloca e gerencia co e a posi¸˜o dos programas na mem´ria e. a A forma geral da declara¸˜o de um ponteiro ´ a seguinte: ca e tipo *nome. O valor inicial da mem´ria ´ indefinido como aconc o e tece com vari´veis.2. /* ponteiro para inteiro */ f l o a t * div .2 9. A atribui¸˜o de inteiros a ponteiros a ca n˜o faz sentido a n˜o ser em aplica¸˜es muito especiais e o unico valor inteiro a a co ´ que se pode atribuir a um ponteiro ´ o 0. c 996 1000 endereço indefinido *res 1004 endereço indefinido *div N Figura 9. como as vari´veis.9. e a e a Por exemplo: i n t * res .2.1 Opera¸oes com Ponteiros c˜ Declara¸˜o de Ponteiros ca Antes de serem usados os ponteiros. precisam ser declarados.3: Declara¸˜o de ponteiros. O valor NULL. A Figura 9. o usu´rio n˜o tem controle ca o a a sobre estes endere¸os. Esta inicializa¸˜o pode ser feita na declara¸˜o ou atrav´s de uma atribui¸˜o. os ponteiros devem ser inicializados antes de serem usaa dos. portanto.3 ilustra esta situa¸˜o.

Observar que em C ´ poss´ atribuir qualquer e ıvel endere¸o a uma vari´vel ponteiro.2. Por exemplo..4: Atribui¸˜o de endere¸o de uma vari´vel a um ponteiro.2 Os Operadores Especiais para Ponteiros Existem dois operadores especiais para ponteiros: * e &. o programa a n˜o ir´ funcionar da maneira correta.5. Isto significa que o a vari´vel res recebe o valor apontado por pint.2.4. tem ca e a precedˆncia maior que do que todos os operadores aritm´ticos. como est´ mostrado na Figura 9. a a co O fato importante ´ que o ponteiro pint passou a apontar para a vari´vel num e a 0 4 8 12 16 10 120 4 num res *pint N Figura 9.3 Atribui¸˜o de Ponteiros ca Da mesma maneira que ocorre com uma vari´vel comum. Deste modo ´ poss´ atribuir o endere¸o de c a e ıvel c uma vari´vel do tipo float a um ponteiro do tipo int. e e 9.1. O operador & devolve o a a e o ca endere¸o de mem´ria do seu operando. No entanto. ou seja a vari´vel res recebe o a a valor 10. considere que o c comando res = *pint. ca c a O operador * ´ o complemento de &. a Estes operadores n˜o devem ser confundidos com os j´ estudados em cap´ a a ıtulos anteriores. Por exemplo. Os dois operadores s˜o un´rios.152 CAP´ ITULO 9. uma vari´vel ponteiro declarada como apontador de dados inteiros deve sempre a apontar para dados deste tipo. O operador ponteiro * ´ un´rio e. Considere a Figura 9. isto ´ requerem somente um operando. PONTEIROS 9. O operador * devolve o valor da vari´vel e a localizada no endere¸o apontado pelo ponteiro. O programa 9. foi executado logo ap´s pint = &num. como o operador &. o conte´do de um a u ponteiro pode ser passado para outro ponteiro do mesmo tipo. /*o endereco de num e carregado em pint */ a vari´vel ponteiro pint termina com o valor 4. O operador * para ponteiros n˜o tem nada a ver com o operador a multiplica¸˜o *.1 mostra exemplos de a a . Lembre-se que o valor 4 n˜o tem sentido pr´tico na maioria das aplica¸˜es. como est´ mostrado na Figura a a 9. Ap´s a execu¸˜o c o da instru¸˜o ca pint = &num.

30 . 40 .6 a situa¸˜o da mem´ria ap´s estas opera¸˜es. p2 = & i . * p2 ). OPERACOES COM PONTEIROS ¸˜ 0 4 8 12 16 10 120 10 4 num res = *pint *pint 153 N Figura 9.5: Uso de um ponteiro para copiar valor de uma vari´vel. Neste exemplo o endere¸o do terceiro elemento do co c vetor v ´ carregado em p1 e o endere¸o da vari´vel i ´ carregado em p2. A e c a e Figura 9. * p2 ). mostrando os seguintes valores: 30 100 30 Listing 9. p1 = & vetor [2]. * p1 ). printf ( " % d \ n " .2. i n t * p1 . ca #include < stdio . * p2 .1: Exemplo de atribui¸˜o de ponteiros. 50 }. i n t i = 100.9. a atribui¸˜es de ponteiros. } .h > i n t main ( void ) { i n t vetor [] = { 10 . printf ( " % d \ n " . p2 = p1 . printf ( " % d \ n " . Al´m disso no final o ca o o co e endere¸o apontado por p1 ´ carregado em p2. 20 . Os comandos printf imprimem os c e valores apontados pelos ponteiros respectivos. return 0.

2 mostra que opera¸˜es de incremento e decremento podem ser co aplicadas em operandos.6: Exemplos de atribui¸˜es de ponteiros. seria necess´rio aumentar o endere¸o em quatro. co i n t main ( void ) { i n t vetor [] = { 10 . * p1 ). 40 . co 9. seja incrementado por um e passe para apontar para o pr´ximo n´mero inteiro. que ´ o elemento de e ´ ındice igual a 2 no vetor vetor. Ap´s o incremento do ponteiro o segundo printf o imprime 40 e o mesmo acontece com o terceiro printf que imprime 50. que ´ aru e mazenado em quatro bytes. } Pode parecer estranho que um ponteiro para um n´mero inteiro. o c a c . Listing 9. Ou seja. 30 . p1 ++.154 0 4 8 12 16 20 24 28 32 10 20 30 40 50 12 32 100 v[0] v[1] v[2] v[3] v[4] *p1 *p2 CAP´ ITULO 9. p1 = & vetor [2].2. para que passasse a apontar para o u o pr´ximo endere¸o. * p1 ). O primeiro printf imprime 30. PONTEIROS p1 = &v[2]. printf ( " % d \ n " . printf ( " % d \ n " . p2 = &i.2: Exemplos de opera¸˜es com ponteiros. p1 = p1 + 1. return 0. 20 . i n t * p1 . 50 }. i N Figura 9. A primeira vista.4 Incrementando e Decrementando Ponteiros O exemplo 9. printf ( " % d \ n " . * p1 ).

O compilador interpreta o coca mando p1++ como: passe a apontar para o pr´ximo n´mero inteiro e.3: Exemplo de subtra¸˜o de ponteiros.0 }. um incremento em um ponteiro que aponta para um valor que ´ armazenado em n bytes faz que n seja somado ao endere¸o. ca #include < stdio . Este comando armazena o valor 10 na posi¸˜o seguinte `quela apontada por ca a p.h > i n t main ( void ) { f l o a t vetor [] = { 1. Do mesmo modo. * p2 . No exemplo 9. OPERACOES COM PONTEIROS ¸˜ 155 sempre que um ponteiro ´ incrementado (decrementado) ele passa a apontar e para a posi¸˜o do elemento seguinte (anterior). p1 = & vetor [2]. 2. A opera¸˜o ´ realizada nos seguintes passos: ca e 1. Este resultado ´ atribu´ ao endere¸o calculado no primeiro passo.0 . A express˜o do lado direito do sinal de atribui¸˜o. f l o a t * p1 . 5. somar a trˆs a um ponteiro faz com que ele passe apontar para o terceiro elemento ap´s o e o atual. 4. 3. c 2. /* endereco do primeiro elemento */ printf ( " Diferenca entre ponteiros % d \ n " . 3.0 . . e Listing 9. o p = p + 3.0 . A express˜o p+1 ´ calculada e o seu resultado aponta para o pr´ximo a e o endere¸o de dado inteiro. portanto. E ent˜o poss´ e c ´ a ıvel somar-se e subtrair-se inteiros de ponteiros. /* endereco do terceiro elemento */ p2 = vetor . e n˜o se pode adicionar ou a e ıvel a subtrair o tipo float ou o tipo double a ponteiros. Portanto. return 0. ´ calculada e fornece a ca e como resultado o valor 10.2. p1 .3 ´ impresso o valor 2. } N˜o ´ poss´ multiplicar ou dividir ponteiros.0 . o u aumenta o endere¸o do n´mero de bytes correto.p2 ). Este ajuste ´ feito de acordo c u e com o tipo do operando que o ponteiro est´ apontando. Tamb´m ´ poss´ usar-se o seguinte comando e e ıvel *(p+1)=10. A opera¸˜o abaixo faz com que o ca ponteiro p passe a apontar para o terceiro elemento ap´s o atual. e ıdo c A diferen¸a entre ponteiros fornece quantos elementos do tipo do ponteiro c existem entre os dois ponteiros.9.

5. Na declara¸˜o de vetor. a else printf ( " As variaveis nao estao na mesma posicao .4: Exemplo de compara¸˜o de ponteiros. n˜o s˜o v´lidos: O conte´do de vetores pode ser acessado usando-se o operador * para obter u o conte´do do vetor. No entanto. v = &b. ou a o seja. No entanto. mostrados no a a a a exemplo 9. O nome de um ponteiro cona stante n˜o pode aparecer em express˜es no lado esquerdo do sinal de igual. n˜o pode receber valores diferentes do valor inicial atribu´ na declara¸˜o a ıdo ca da vari´vel. } 9.5 Compara¸˜o de Ponteiros ca ´ E poss´ comparar ponteiros em uma express˜o relacional.4 ilustra um exemplo ıvel deste tipo de opera¸˜o. Assim.2. portanto. return 0. PONTEIROS 9. O Programa 9. & b ).h > i n t main ( void ) { char *c . sem que e o espa¸o seja reservado. b . ca #include < stdio . a . existe uma diferen¸a fundamental entre declarar um conjunto c de dados como um vetor ou atrav´s de um ponteiro. O Programa 9. os comandos que alteram o ponteiro list. *v . scanf ( " % c % c " . Quando apenas um ponteiro ´ declarado a unica coisa que e ´ o compilador faz ´ alocar um ponteiro para apontar para a mem´ria. O nome a de um vetor ´ um ponteiro que aponta para a primeira posi¸˜o do vetor. O nome de um vetor ´ chamado de ponteiro constante c e e. s´ ´ ıvel a oe poss´ comparar ponteiros de mesmo tipo. ca Listing 9.6 mostra a nota¸˜o que usa ´ u ca ındices para . n˜o pode ter o seu valor alterado. A e ca declara¸ao int vetor[100] cria um vetor de inteiros de 100 posi¸˜es e permite c˜ co que algumas opera¸˜es com ponteiros possam ser realizadas com a vari´vel co a vetor.156 CAP´ ITULO 9. &a . " ). i f ( c == v ) printf ( " As vari´ veis estao na mesma posicao . c = &a. " ). e ca o compilador automaticamente reserva um bloco de mem´ria para que o vetor o seja armazenado.3 Ponteiros e Vetores Ponteiros e Vetores est˜o fortemente relacionados na linguagem C.

0 . f o r ( i = 0. e 9.5: Exemplo de altera¸˜es inv´lidas sobre ponteiros.7. i ++) printf ( " %. int i.0}. i ++) printf ( " %. /* O ponteiro list nao pode ser modificado recebendo o endereco de i */ list = & i /* O ponteiro list nao pode ser incrementado */ list ++. co a i n t list [5] . i < 7. Quando uma cadeia de caracteres como esta ´ enviada para a fun¸˜o. printf ( " \ n " ). v [ i ]). 5.8. return 0. u e co Listing 9. f o r ( i = 0.1 f " . o que e ca ´ ´ passado ´ o ponteiro para a cadeia. 4. i < 7.0 .4. PONTEIROS E CADEIAS DE CARACTERES Listing 9. 2.6: Exemplo de nota¸˜es de vetores. Observe o ponteiro *(s+tam++) u apontando caracter a caracter. co #include < stdio .0 .0 . . 6. E poss´ ent˜o carregar o endere¸o da e e ıvel a c e cadeia em um ponteiro do tipo char. 157 buscar o elemento de um vetor e o uso do operador * de ponteiros.9. 3. como no exemplo abaixo ca printf("Acabou o programa.0 . Neste programa ´ contado o n´mero de caracteres de uma cadeia." At´ agora um dos usos mais comuns de cadeias de caracteres constantes tem e sido na fun¸˜o printf.1 f " .4 Ponteiros e Cadeias de Caracteres Uma cadeia de caracteres constante ´ escrita como no exemplo: e "Esta e uma cadeia de caracteres. i .0 .\n"). } Para percorrer um vetor al´m da maneira mostrada no programa 9.h > i n t main ( void ) { f l o a t v [] = {1. Neste programa o conte´do do vetor ´ impresso usando-se estas duas nota¸˜es.6 ´ e e poss´ ıvel usar um ponteiro vari´vel como ilustrado no Programa 9. Observe a como o ponteiro p recebe seu valor inicial e a maneira como ele ´ incrementado. *( v + i )). como no exemplo 9. 7.

1 f " . PONTEIROS Listing 9. * lista = " 1234567890 " . i < 7. p = v . tam ).0 . As fun¸˜es c co b´sicas de aloca¸˜o de mem´ria que iremos discutir s˜o: a ca o a void *malloc(size_t size).1 f " . 7.0}. * p ). printf ( " \ n " ).-. } ca Um outro exemplo (Programa 9.7: Exemplo de ponteiro vari´vel.0 . 3. Reserva espa¸o na mem´ria para algum item c o . return 0.5 Aloca¸˜o Dinˆmica de Mem´ria ca a o O uso de ponteiros e vetores exige que ap´s a defini¸˜o da vari´vel ponteiro uma o ca a ´rea de mem´ria deve ser reservada para armazenar os dados do vetor. i ++ . lista .0 .1 f " . p ++) printf ( " %.9) mostra uma fun¸˜o que copia um cadeia de caracteres para outra.158 CAP´ ITULO 9. a #include < stdio . return 0.0 . f o r ( i = 0.h > i n t main ( void ) { f l o a t v [] = {1. s = lista . } Listing 9. printf ( " O tamanho do string \"% s \" e % d caracteres .0 . i ++) printf ( " %. f o r ( i = 0 .8: Exemplo de ponteiro para cadeia de caracteres. i < 7.h > i n t main ( void ) { char *s . #include < stdio . 4. tam . f l o a t *p. 2.\ n " . 9. i n t tam =0. i ++) printf ( " %. int i. printf ( " \ n " ). while (*( s + tam ++) != ’ \0 ’ ). a co Estas fun¸˜es pedem ao sistema operacional para separar peda¸os da mem´ria co c o e devolvem ao programa que pediu o endere¸o inicial deste local.0 . f o r ( i = 0. *( v + i )). i < 7. v [ i ]). Para a o obter esta ´rea o programa deve usar fun¸˜es existentes na biblioteca stdlib. 6. 5.

9: Exemplo de c´pia de cadeias de caracteres. Caso o novo tamanho for maior. printf ( " % s \ n " . o #include < stdio . agora empregando a fun¸˜o malloc() est´ mostrado no ca a Programa 9. O espa¸o apontado por pont ´ devolvido ao sistema c e para uso. i n t main ( void ) { char destino [20]. char * o ) { while ((* d ++ = * o ++) != ’ \0 ’ ). o conte´do e u da por¸˜o de mem´ria reservada a mais ficar´ com um valor sem especifica¸˜o. c void free(void *pont). Observe que neste programa tamb´m mostramos exemplos onde e um endere¸o de vari´vel foi passado para uma fun¸˜o de modo que a fun¸˜o main c a ca ca possa receber um valor (vezes). Cada item tem tamanho size e todos os bits do espa¸o s˜o inicializados com 0. origem ).10 ilustra o uso das fun¸˜o calloc e free.11. c void *calloc(size_t num. e a O valor armazenado no espa¸o ´ indefinido. O tamanho em bytes reservado ´ definido pela vari´vel size. ALOCACAO DINAMICA DE MEMORIA ¸˜ Listing 9. Reserva espa¸o na mem´ria para c o um vetor de num itens do programa. co e void realloc(void *pont. char * o ). printf ( " % s \ n " . A fun¸˜o retorna um ponteiro de c e ca tipo void para o espa¸o reservado ou NULL no caso de algum erro ocorrer. char * origem = " cadeia de caractere de origem " . No caso ca e do ponteiro n˜o ter sido resultado de uma reserva feita por meio de uma das a fun¸˜es calloc. A fun¸˜o retorna um ponteiro de tipo c a ca void para o espa¸o reservado ou NULL no caso de algum erro ocorrer. . destino ). Caso pont seja um ponteiro nulo nenhuma a¸˜o ´ executada. strcop ( destino . return 0.5. O o conte´do do objeto ser´ mantido at´ um tamanho igual ao menor dos dois u a e tamanhos. Se o novo tamanho requerer movimento. return 0. O Programa co 9. e Estas fun¸˜es podem ser encontradas na biblioteca stdlib. origem ). A fun¸˜o altera o tamanho do obca jeto na mem´ria apontado por pont para o tamanho especificado por size. ca Um outro exemplo. } i n t strcop ( char *d . size_t size).h. } 159 de um programa. size_t size). o espa¸o c reservado anteriormente ´ liberado. realloc ou malloc o resultado ´ indefinido. novo e antigo.h > i n t strcop ( char *d .ˆ ´ 9. ca o a ca Se o tamanho size for igual a 0 e pont n˜o ´ um ponteiro nulo o objeto previaa e mente reservado ´ liberado.

} 9. v + i ). i ). A express˜o matriz+(i*COL+j) calcula a posi¸˜o do elemento matriz[i][j] a ca a partir do primeiro elemento da matriz que est´ no endere¸o inicial matriz. PONTEIROS Listing 9. #include < stdio . e a c que ´ definido por um par (linha. como matrizes. ´ necess´rio a e a mapear o espa¸o bidimensional (ou de maior ordem) para uma dimens˜o.13. return 1.10: Exemplo de uso de calloc e free. No c a caso das matrizes ´ necess´rio mapear o endere¸o de cada elemento na matriz. v = calloc ( tam . scanf ( " % f " .COL que poderia ser declarada e ter um de seus elementos lidos da maneira mostrada no trecho de programa listado em 9.12.h > i n t main ( void ) { f l o a t *v. i < tam . que s˜o arranjos bidimensionais de dados. vetores podem ser f´cilmente manipulados com ponteiros. tam . i ++) { printf ( " Elemento % d ? " . scanf ( " % d " . return 0.h > #include < stdlib . poder´ ca ıamos usar uma solu¸˜o que mapeasse a matriz que ca ´ um objeto de duas dimens˜es em um vetor que tem apenas uma. i n t i . } free ( v ). Neste caso e o o programa deve fazer a transla¸˜o de endere¸os toda vez que precisar ler ou ca c escrever na matriz. O trecho de programa ficaria como mostrado no exemplo 9. por exemplo. printf ( " Li valor % f \ n " . quando usamos estruturas de dados com maior dimensionalidade.160 CAP´ ITULO 9. s i z e o f ( f l o a t )).6 Ponteiros e Matrizes Um ponteiro aponta para uma ´rea de mem´ria que ´ endere¸ada de maneira a o e c linear. i f (! v ) { printf ( " Nao consegui alocar memoria . printf ( " Qual o tamanho do vetor ? " ). & tam ). Caso o programa utilizasse ponteiros ao inv´s de e nota¸˜o de matrizes. e c Considere uma matriz chamada matriz de tamanho LIN. a c No entanto. No a entanto. Portanto. coluna) em um endere¸o linear. } f o r ( i =0. esta solu¸˜o ainda n˜o ´ a melhor j´ que o usu´rio necessita ca a e a a escrever diretamente uma express˜o para mapear o endere¸o bidimensional da a c . " ). *( v + i )).

i n t tam . " ). i ++) { printf ( " Elemento % d ? " . i n t i . } 161 . i < tam .11: Exemplo de uso de malloc. int * vezes ) { int i . printf ( " Qual o tamanho do vetor ? " ). scanf ( " % d " . " . i n t tam ).6. tam ). i n t * vezes ). vezes ). scanf ( " % f " . PONTEIROS E MATRIZES Listing 9. } } float ProcuraMaior ( float *v . int tam ) { int i . i n t main ( void ) { f l o a t *v . maior . & vezes ). free ( v ). return 1. tam . vezes . maior = v [0]. for ( i =0. float maior . i ). i ++) { if ( v [ i ] & gt . v + i ). maior = ProcuraMaior (v . i < tam . *( v + i )). #include < stdio . v = ( f l o a t *) malloc ( tam * s i z e o f ( f l o a t )). } return maior . int tam . maior ) { maior = v [ i ]. } else { printf ( " Nao consegui alocar memoria . } else if ( maior == v [ i ]) * vezes =* vezes +1. i f (v) { LeVetor (v . } void LeVetor ( float *v .h > void LeVetor ( f l o a t *v . * vezes = 1. printf ( " Li valor % f \ n " . printf ( Maior = % f e aparece % d vezes . & tam ). } return 0. for ( i =1. tam . f l o a t ProcuraMaior ( f l o a t *v .\ n .9.h > #include < stdlib . maior . * vezes = 1.

j ++) { printf ( " Elemento % d % d = " . i f (! matriz ) { printf ( " Erro . i < LIN . scanf ( " % d " .13: Exemplo de matriz mapeada em um vetor. } } .\ n " ). } f o r ( i = 0. j. int i. PONTEIROS Listing 9. j ). & matriz [ i ][ j ]). j < COL . i ++) { f o r ( j =0. scanf ( " % d " .12: Exemplo de matriz normal sem uso de ponteiros. #define LIN 3 #define COL 4 i n t matriz [ LIN ][ COL ]. j ++) { printf ( " Elemento % d % d = " .162 CAP´ ITULO 9. } } Listing 9. i . j < COL . i . j ). return 1. matriz = malloc ( LIN * COL * s i z e o f ( i n t )). i ++) { f o r ( j = 0. matriz +( i * COL + j )). #define LIN 3 #define COL 4 i n t * matriz . i < LIN . f o r ( i =0.

A leitura das linhas de caracteres ´ feita pela e fun¸ao gets(linha[i]) que passa o elemento do vetor onde os caracteres ser˜o c˜ a armazenados. Portanto. Como cada elemento do vetor linha ´ um ponteiro e temos que o endere¸o retornado pela fun¸˜o malloc ´ armazenado em cada c ca e um dos elementos deste vetor. Esta n˜o ´ e a e a nota¸˜o ideal. Observe que o comando sizeof(int *) calcula o espa¸o c para armazenar um ponteiro na mem´ria. ca ca que define um vetor de tamanho LINHAS. A aloca¸˜o de espa¸o e a inicializa¸˜o dos ponteiros ´ feito ca c ca e no primeiro comando for. para obter um elemento da c matriz primeiro devemos descobrir onde est´ a linha no vetor que armazena os a endere¸os das linhas. listado a seguir. A Figura 9. em seguida procuramos na linha o elemento. Em seguida ler´ todos os elementos da matriz e a por ultimo ir´ trocar duas linhas da matriz de posi¸˜o.7 Vetores de Ponteiros Uma possibilidade mais interessante ´ utilizar vetores de ponteiros. VETORES DE PONTEIROS 163 matriz matriz[i][j] em um endere¸o linear. Observe na fun¸˜o main a declara¸˜o char *linha[LINHAS]. a O Programa 9. e portanto. Vaa ca mos considerar um exemplo onde tanto o n´mero de linhas como o de colunas u ´ desconhecido. Como ponteiros tamb´m s˜o vari´veis ´ e a a e poss´ ent˜o criar vetores de ponteiros e utiliz´-los. Esta nota¸˜o ser´ discutida nas se¸˜es seguintes.9. h´ uma mistura de nota¸˜o de ponteiros com matrizes. ir´ pedir ao usu´rio que digite o n´mero a a u de linhas e colunas da matriz. foi usado pelo programa para reservar espa¸o para armazenar lin linhas de c ponteiros para ponteiros. O ideal ´ usar uma nota¸˜o que c e ca use somente ponteiros. O comando matriz = (int **) malloc (lin * sizeof(int *)).7.14 mostra um programa onde ´ utilizado um vetor de ponteiros para v´rias e a linhas de caracteres. mas ´ um passo na dire¸˜o da nota¸˜o mais efetiva. O programa primeiro pergunta o n´mero de linhas da matriz para poder alocar espa¸o para armazenar u c os ponteiros para cada uma das linhas. O exemplo mostrado em ıvel a a 9.8 Ponteiros para Ponteiros No exemplo anterior podemos observar que o n´mero de linhas da matriz ´ u e fixa. Neste caso ca e ca ca cada linha da matriz corresponde a um vetor que ´ apontado por um ponteiro e armazenado no vetor de ponteiros. At´ este momento do programa temos apenas posi¸˜es reservadas para e co armazenar ponteiros.7 c ilustra como ser´ feito o armazenamento desta matriz. Neste exemplo iremos criar um vetor de ponteiros que ir´ are a mazenar o endere¸o inicial de cada linha. Note tamb´m que o valor retornado o e . 9. Em seguida ´ alocado espa¸o para e c armazenar cada uma das linhas. ca a co 9. Observe que agora foi ´ a ca criado um ponteiro para ponteiro chamado de **matriz.15. Este vetor contem ponteiros e n˜o a valores.

i . i ++) { printf ( " Linha % d % s . o return i .\ n " . #include < stdio .\ n " . linha [ i ]). i < LINHAS .164 CAP´ ITULO 9.h > #define LINHAS 10 #define COLUNAS 60 i n t main ( void ) { char * linha [ LINHAS ]. f o r ( i = 0. } return 0. i < LINHAS . } f o r ( i = 0. gets ( linha [ i ]). i < LINHAS . i ). } } f o r ( i = 0. i ++) { i f (!( linha [ i ] = malloc ( COLUNAS * s i z e o f ( char )))) { printf ( " Sem mem´ ria para vetor % d . } .14: Exemplo de uso de vetor de ponteiros. PONTEIROS Listing 9. i ++) { printf ( " Entre com a linha % d .\ n " . int i. i ).h > #include < stdlib .

A seguir mostramos o programa nas listagens 9.8.17 que ´ o exemplo e anterior modificado para utilizar fun¸˜es. O interessante do programa ´ que a troca de linhas da matriz involve e simplesmente a troca de dois ponteiros e n˜o a troca de todos os elementos das a linhas. PONTEIROS PARA PONTEIROS Vetor de ponteiros **matriz *(matriz+0) *(matriz+1) *(matriz+2) linha 2 linha 1 linha 0 165 *(matriz+n) linha n Figura 9.7: Armazenamento de matrizes com vetores de ponteiros. Esta solu¸˜o ´ muito mais r´pida do que trocar elemento a elemento. O prop´sito ´ mostrar como ficam as co o e chamadas e as defini¸˜es das fun¸˜es que utilizam ponteiros para ponteiros. co co .16 e 9. ca e a especialmente para matrizes grandes.9. pela fun¸˜o malloc foi conformado ao tipo ponteiro para ponteiro pela opera¸˜o ca ca (int **).

gets ( linha ). linha2 .166 CAP´ ITULO 9. c return 1. i ++) { *( matriz + i ) = ( i n t *) malloc ( col * s i z e o f ( i n t )). *( matriz + linha2 ) = temp . a c o return 1. gets ( linha ). matriz = ( i n t **) malloc ( lin * s i z e o f ( i n t *)). puts ( " Qual o numero de linhas ? " ). gets ( linha ). col . " ). f o r ( j =0. j ).h > i n t main ( void ) { i n t ** matriz . } puts ( " Qual o numero de colunas ? " ). *( matriz + linha1 ) = *( matriz + linha2 ). } printf ( " \ n " ). gets ( linha ). j. } } puts ( " Entre com os dados " ). i < lin . temp = *( matriz + linha1 ). lin = atoi ( linha ). i ). /* ponteiro para os ponteiros */ i n t lin . i < lin . i ++) { f o r ( j =0. i < lin . j ++) { printf ( " %7 d " . /* linhas que serao trocadas */ char linha [80]. #include < stdio . /* n´ mero de linhas e colunas */ u int i. i f (! *( matriz + i ) ) { printf ( " Sem espa¸ o para alocar a linha % d " .15: Exemplo de uso de ponteiros para ponteiros. puts ( " Dados trocados . linha2 = atoi ( linha ). puts ( " Qual a segunda linha a ser trocada ? " ). j < col . j < col . f o r ( i =0. i ). f o r ( i =0. } . i f (! matriz ) { puts ( " Nao h´ espa¸ o para alocar mem´ ria " ). j ++) { printf ( " Elemento % d % d \ n " . *(*( matriz + i ) + j )). i . linha1 = atoi ( linha ). /* linha de caracteres com os dados */ i n t * temp . col = atoi ( linha ).h > #include < stdlib . } } puts ( " Qual a primeira linha a ser trocada ? " ). i n t linha1 . scanf ( " % d " . PONTEIROS Listing 9. *( matriz + i ) + j ). } return 0.} f o r ( i =0. i ++) { printf ( " Entre com a linha % d \ n " .

col = atoi ( linha ). lin .} m = ( i n t **) malloc ( lin * s i z e o f ( i n t *)). i n t lin . gets ( linha ). linha1 . col ). col ). printf ( " Alocando espa¸ o para linhas . } i n t ** aloca_linhas ( i n t lin ) { i n t ** m . int . void imprime_matriz ( i n t ** . lin . return 0.h > #include < stdlib . } } } . int . c o return 1. gets ( linha ). PONTEIROS PARA PONTEIROS 167 Listing 9. linha2 . gets ( linha ). col ).9. co #include < stdio . lin = atoi ( linha ).8. puts ( " Qual o numero de linhas ? " ). void aloca_colunas ( i n t ** . } void aloca_colunas ( i n t ** matriz . puts ( " Qual a segunda linha a ser trocada ? " ). void le_dados ( i n t ** . linha2 = atoi ( linha ). char linha [80]. i < lin . i n t lin . linha2 ). int .\ n " ). troca_linhas ( matriz . gets ( linha ). i n t ).16: Exemplo de uso de ponteiros para ponteiros usando fun¸˜es. imprime_matriz ( matriz . c return 1. i ).h >} i n t ** aloca_linhas ( i n t ). i n t ). col . lin . i f (! *( matriz + i ) ) { printf ( " Sem espa¸ o para linha % d " . linha1 = atoi ( linha ). le_dados ( matriz . int . puts ( " Qual o numero de colunas ? " ). i n t main ( void ) { i n t ** matriz . i n t ). i f (! m ) { puts ( " Sem espa¸ o para alocar mem´ ria " ). } return m .& nbsp . matriz = aloca_linhas ( lin ). i ++) { *( matriz + i ) = ( i n t *) malloc ( col * s i z e o f ( i n t )). c aloca_colunas ( matriz . imprime_matriz ( matriz . i n t col ) { int i. i n t ). col ). puts ( " Qual a primeira linha a ser trocada ? " ).& nbsp . i n t linha1 . void troca_linhas ( i n t ** . f o r ( i =0. lin .

puts ( " Entre com os dados " ). j ). } } } void imprime_matriz ( i n t ** matriz .17: Continua¸˜o do exemplo 9. i ++) { printf ( " Entre com a linha % d \ n " . f o r ( i =0.168 CAP´ ITULO 9. } printf ( " \ n " ). } .16. i n t linha2 ) { i n t * temp . j < col . ca void le_dados ( i n t ** matriz . scanf ( " % d " . i ++) { f o r ( j =0. *( matriz + i ) + j ). *( matriz + linha2 ) = temp . *(*( matriz + i ) + j )). i ). f o r ( j =0. j ++) { printf ( " %7 d " . j < col . i n t lin . i n t col ) { int i. i . j. f o r ( i =0. } } void troca_linhas ( i n t ** matriz . j ++) { printf ( " Elemento % d % d \ n " . i n t col ) { int i. j. i n t lin . PONTEIROS Listing 9. *( matriz + linha1 ) = *( matriz + linha2 ). i < lin . temp = *( matriz + linha1 ). i < lin . i n t linha1 .

o u 9. A fun¸˜o possui o prot´tipo a ca o abaixo:¡br¿ int posicao(char *substr.10: Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira.8: Escreva um programa que leia seu nome completo e pergunte quantas letras tem o seu primeiro nome. 9. Os n´meros das linhas a serem trocadas devem ser ca u lidos do teclado.9: Escreva um programa que procure em uma matriz elementos que sejam ao mesmo tempo o maior da linha e o menor coluna. 9.6: Escreva uma fun¸˜o que receba um ponteiro para uma cadeia de caractere ca e troque todo o caracter ap´s um branco pelo seu equivalente mai´sculo.9. O programa deve imprimir quantas letras iguais a letra cujo ´ ındice ´ o n´mero de letras do seu primeiro nome existem no seu e u nome completo. Y e Z) em e o que cada posi¸˜o guarda a soma de suas coordenadas. u u 9. a 9. char *str). 9. O programa deve ler o numero de colunas e linhas do teclado. 9. As dimens˜es da matriz ca o dever˜o ser determinadas em tempo de execu¸˜o e o programa dever´ informar a ca a os valores gerados.8. Fa¸a uma fun¸˜o que verifique se a express˜o apontada c ca a por substr est´ presente na cadeia apontada por str.1: Escreva um programa que gere um vetor de trˆs dimens˜es (X. PONTEIROS PARA PONTEIROS 169 Exerc´ ıcios 9. 9.4: Escreva um programa que leia uma matriz e a imprima. e retorna a posi¸˜o em que ca a sub-cadeia aparece em cadeia.5: Escreva um programa que simule uma pilha usando vetores. . O programa deve ainda trocar duas linhas da matriz de posi¸˜o. As dimens˜es da matriz o devem ser pedidas ao usu´rio. Assuma que a letra ’a’ tem ´ ındice 0.2: Escreva um programa que leia uma frase de at´ 80 caracteres do teclado e e imprima a frequˆncia com que aparece cada uma das letras do alfabeto na e frase.3: Escreva um programa que leia uma frase de at´ 80 caracteres e a imprima e em ordem reversa convertendo todos os caracteres min´sculos para mai´sculos. O programa deve implementar as seguintes opera¸˜es na pilha: co • Inserir • Remover • Listar 9. a letra ’b’ ´ ındice 1 e assim por diante.7: Escreva um programa que leia seu nome completo e pergunte quantas letras tem o seu primeiro nome.

PONTEIROS .170 CAP´ ITULO 9.

data de nascimento. sob o mesmo nome. Nesta estrutura estariam armazenadas. considere o problema de ordenar as informa¸˜es sobre os alunos da co Universidade exemplo. Por exemplo.Cap´ ıtulo 10 Estruturas 10. o ´ 10. 171 . agrupadas sob um unico nome. co etc. Um exemplo poderia ser ca uma estrutura que armazenasse as diversas informa¸˜es sobre os alunos de uma co Universidade. A ordena¸˜o pode ser efetuada como se todos os dados ca que comp˜em a estrutura fossem uma entidade unica. ent˜o. informa¸˜es do tipo: nome. O fato de vari´veis agrupadas ´ a em uma estrutura poderem ser referenciadas por um unico nome facilita a ma´ nipula¸˜o dos dados armazenados nestas estruturas. Por exemplo: alunos de uma universidade. Uma estrutura pode incluir outras estruturas al´m de vari´veis simples. etc. Normalmente os elementos da estrutura tem alguma rela¸˜o semˆntica.1 Introdu¸˜o ca Uma estrutura ´ um conjunto de uma ou mais vari´veis. que podem ser de e a tipos diferentes. As vari´veis que comp˜em a estrutura s˜o os ´ a o a seus membros. Vamos considerar o ca e exemplo do aluno e assumir que estaremos armazenando o seu nome. ano de entrada e curso. de tipos diversos ou n˜o. a e ca a a agrupadas sob um unico nome. registro. Para este fim podemos criar uma estrutura como a descrita abaixo: s t r u c t aluno { char nome [40]. data de ingresso. ´ uma cole¸˜o de vari´veis. e a As estruturas facilitam manipular estes agrupamentos complexos de dados. elementos de uma figura geom´trica. CPF.2 Defini¸˜es B´sicas co a Uma estrutura. registro. elementos ou campos. discos ca a de uma cole¸˜o.

ana . A declara¸˜o acima ´ c e ca e idˆntica. Por exemplo.172 i n t registro . i n t ano_entrada . Esta declara¸˜o ´ apenas um modelo de como a ca e estruturas do tipo aluno devem ser constru´ ıdas. Para definir estruturas do tipo aluno podemos usar a seguinte declara¸˜o. } paulo . Para ler o nome do curso que paulo cursa pode-se usar o comando gets(paulo. Nesta declara¸˜o trˆs estruturas do tipo aluno foram criadas. i n t ano_entrada . em seguida pode ca aparecer um identificador (aluno). CAP´ ITULO 10. Esta declara¸˜o ca e ca alocou espa¸o para armazenar os dados dos trˆs alunos. A declara¸˜o continua com a lista de ca ca ca declara¸˜es entre chaves e termina com um . Para referenciar um elemento da estrutura usa-se o nome da vari´vel do tipo a da estrutura seguida de um ponto e do nome do elemento. ana. }. carlos . Um membro da estrutura e uma co v´riavel n˜o membro da estrutura podem ter o mesmo nome. carlos. j´ que ´ poss´ a a a e ıvel distingui-las por contexto. vamos definir uma estrutura para armazenar uma data com a seguinte defini¸˜o: ca s t r u c t data { i n t dia . como por e ca a e exemplo: int a. paulo. b. ESTRUTURAS A palavra chave struct inicia a declara¸˜o da estrutura. na forma.ano_entrada = 1999. armazena o ano em que aluno paulo entrou na universidade.. char curso [20]. ´ E poss´ declarar ao mesmo tempo o modelo da estrutura e as vari´veis do ıvel a programa. i n t registro . c. Por exemplo. } . ano .curso). Estruturas podem conter outras estruturas como membros. mes . Por exemplo. ca struct aluno paulo. que subsequentemente pode ser usado como abrevia¸˜o da defini¸˜o da estrutura. char curso [20]. A declara¸˜o acima ainda n˜o alocou espa¸o de mem´ria j´ que nenhuma ca a c o a vari´vel foi realmente definida. s t r u c t aluno { char nome [40]. a declara¸˜o de vari´veis de um tipo pr´-definido.

} . printf ( " O salario de % s e %. Para se referir ao mˆs de nascimento de uma vari´vel paulo do tipo estrutura e a aluno usamos a declara¸˜o ca paulo. i n t ano_entrada .mes o operador . nome ). 10. A estrutura fica com a seguinte defini¸˜o: ca s t r u c t aluno { char nome [40]. temp . puts ( " Entre com nome . f l o a t salario .h > i n t main () { s t r u c t empregado { char nome [40].data_nascimento. char curso [20]. salario ). nome . }. O a a programa 10. " ). temp . return 0. gets ( emp1 .3. associa da esquerda para a direita.1: Atribui¸˜o de Estruturas. } temp . & emp1 . scanf ( " % f " .10. n˜o sendo necess´rio atribuir elemento por elemento da estrutura. ca #include < stdio .3 Atribui¸˜o de Estruturas ca ´ E poss´ ıvel atribuir o conte´do de uma estrutura a outra estrutura do mesmo u tipo. s t r u c t data data_nascimento . ATRIBUICAO DE ESTRUTURAS ¸˜ 173 Agora vamos modificar a estrutura aluno de modo que ela inclua a data de nascimento do aluno. Listing 10. i n t registro . emp1 . puts ( " Qual o salario ? " ). salario ).1 ilustra como podemos atribuir uma estrutura a outra. temp = emp1 .2 f \ n " .

p2 . Por exemplo. O programa coloca um vetor de estruturas em ordem crescente usando como chave de ordena¸˜o um dos membros da esca trutura (nota). Para se imprimir ao nome do terceiro aluno (in´ em 0) usamos o comando ıcio printf("%s\n". co co e O exemplo 10. a a a passagem ´ efetuada da maneira normal. Caso seja necess´rio passar o endere¸o de um dos a c membros ou elementos da estrutura basta colocar o operador & antes do nome da estrutura. x ) == 0 ) puts ( " Eixo y ). turma[2]. troca_x (& p1 .5 Estruturas e Fun¸oes c˜ Primeiro vamos considerar o caso de passar elementos da estrutura para fun¸˜es. x ). else puts ( " Eixo negativo dos x " ). A fun¸˜o que recebe este parˆmetro est´ preparada para receber uma vari´vel ca a a a de ponto flutuante simples. p1 . considere a estrutura e s t r u c t ponto { f l o a t x. struct aluno turma[100]. para trocar os valores das coordenadas x dos pontos p1 e p2 usar´ ıamos chamadas da seguinte forma. ESTRUTURAS 10. } Para passar a coordenda x do ponto p1 para uma fun¸˜o chamada positivo ca poder´ ıamos a seguinte declara¸˜o: ca i f ( positivo ( p1 .4 Matrizes de Estruturas Estruturas aparecem freq¨entemente na forma de matrizes. Por exemplo. & p2 .nome). y. Para trabalhar com endere¸os ´ necess´rio usar ponteiros dentro da fun¸˜o c e a ca Antes vamos verificar como ´ e poss´ passar uma estrutura inteira para uma fun¸˜o. mas isto veremos no pr´ximo item.174 CAP´ ITULO 10. 10. A declara¸˜o abaixo u ca define uma matriz de 100 estruturas do tipo aluno. ıvel ca troca_x. co Caso os elementos da estrutura sejam vari´veis de um dos tipos j´ vistos. x ) >0 ) puts ( " Eixo positivo dos x " ). else if ( positivo ( p1 .x .2 mostra atribui¸˜es entre estruturas e opera¸˜es aritm´ticas envolvendo membros de estruturas. o .

i < MAX . " ). getchar (). turma [ i ]. } turma [ MAX ] . turma [ i ].h > #include < string . i < MAX . f o r ( i =0. & turma [ i ]. i ). f o r ( i =0. } puts ( " Imprimindo dados lidos da turma . n1 ). media ). n2 )/2. j < MAX . printf ( " Segunda nota : %. pos .0. f o r ( i =0. puts ( " Segunda nota ? " ). f o r ( j =0. f l o a t n1 . i ). & turma [ i ]. i < MAX . puts ( " Digite qualquer coisa para continuar .5. i ++) { printf ( " \ nDados do aluno % d \ n " .1 f \ n " . printf ( " Primeira nota : %. n1 ). } f o r ( i =0.10. media > turma [ j ].1 f \ n " . i n t i . getchar (). " ). turma [ i ]. i ). media . media =( turma [ i ]. printf ( " Segunda nota : %. n1 ). n1 + turma [ i ]. turma [ i ]. turma2 [ pos ] = turma [ i ]. puts ( " Imprimindo dados ordenados da turma . turma [ i ]. nome ). i < MAX . puts ( " Digite qualquer coisa para continuar . gets ( turma [ i ]. } . turma [ i ]. } return 0. i ++) { printf ( " Dados do aluno % d \ n " . printf ( " Nome : % s \ n " . i ++) turma [ i ]= turma2 [ i ]. n2 ).1 f \ n " . media ) pos ++. j . puts ( " Nome ? " ). printf ( " Primeira nota : %. turma2 [ MAX ].h > i n t main () { s t r u c t aluno { char nome [40]. nome ). i ++) { printf ( " \ nDados do aluno % d \ n " . printf ( " Nome : % s \ n " .1 f \ n " . i ++) { pos = 0.1 f \ n " . puts ( " Primeira nota ? " ). turma [ i ]. n2 ). scanf ( " % f " . getchar (). ca #define MAX 4 #include < stdio . " ). n2 .2: Ordena¸˜o de Estruturas. ESTRUTURAS E FUNCOES ¸˜ Listing 10. " ). printf ( " Media : %. media ).1 f \ n " . 175 puts ( " Lendo dados da turma " ). turma [ i ]. i < MAX . scanf ( " % f " . printf ( " Media : %. n2 ). nome ). } f o r ( i =0. j ++) i f ( turma [ i ]. turma [ i ].

altera¸˜es nos membros da estrue co tura n˜o modificam os valores da estrutura na fun¸˜o que chamou. scanf ( " % f " . } O exemplo mostrado nas listagens 10. } P1 . y ). puts ( " Coordenadas do ponto 2 " ). P2 . printf ( " x1 = ? " ).x . printf ( " y1 = ? " ). s t r u c t ponto p2 ) { return sqrt ( pow ( p2 .5 apresenta um programa que implementa um banco de dados simples sobre uma turma de alunos.x .6 Ponteiros para Estruturas Para definir ponteiros para estruturas a declara¸˜o ´ similar a declara¸˜o de um ca e ca ponteiro normal. ESTRUTURAS Estruturas. & P1 . P2 )). scanf ( " % f " .2 f " .3 onde o comprimento da co e reta que liga dois pontos P1 e P2 ´ calculado e impresso. scanf ( " % f " . s t r u c t ponto ). ca Como este tipo de passagem ´ feito por valor. & P1 .4 e 10.h > #include < math . y. x ). f l o a t comp ( s t r u c t ponto . return 0. Neste exemplo mostramos a passagem de matrizes de estruturas para fun¸˜es.y .p1 . A passagem a ca de estruturas para fun¸˜es ´ ilustrada no exemplo 10. x ).h > s t r u c t ponto { f l o a t x.3: Passagem de estruturas para fun¸˜es. i n t main () { puts ( " Coordenadas do ponto 1 " ). printf ( " x1 = ? " ).p1 .2)).y . y ). Ao passar uma estrutura para uma a a fun¸˜o estaremos passando os valores armazenados nos membros da estrutura. co #include < stdio . printf ( " y1 = ? " ). quando passadas para fun¸˜es. } f l o a t comp ( s t r u c t ponto p1 . co 10. scanf ( " % f " .176 CAP´ ITULO 10. comp ( P1 .2)+ pow ( p2 . se comportam da mesma maneira co que as vari´veis dos tipos que j´ estudamos. & P2 . e Listing 10. s t r u c t aluno { . O exemplo abaixo mostra a defini¸˜o de um ponteiro chamado ca maria para uma estrutura chamada aluno. printf ( " \ nComprimento da reta = %. & P2 .

i n t main ( void ) { s t r u c t RegAluno turma [ MAXALUNOS ]. m1 . case ’r ’: remover ( turma ). c = tolower ( getch ()).\ n " ). printf ( " Acabou . printf ( " Qualquer outra tecla para terminar . case ’l ’: lista ( turma ).\ n " ). n2 . char c . printf ( " [ I ] nserir um aluno . char escolhe (). f l o a t n1 . void insere ( s t r u c t RegAluno turma []).\ n " ). printf ( " [ R ] emover um aluno . break.10. printf ( " \ nEscolha uma operacao .h > #include < string . void inicia ( s t r u c t RegAluno turma []). break. } char escolhe () { char c .4: Ordena¸˜o de Estruturas. }. default : continua = ! continua . return c .h > #include < ctype . inicia ( turma ). PONTEIROS PARA ESTRUTURAS Listing 10. switch ( c ) { case ’i ’: insere ( turma ). do { continua = VERDADE . void remover ( s t r u c t RegAluno turma []). printf ( " [ L ] istar a turma . }. continua . ca #include < stdio .\ n " ). break. } while ( continua ). } 177 .6.\ n " ).\ n " ). void lista ( s t r u c t RegAluno turma []). c = escolhe ().h > #define MAXNOME 40 #define MAXALUNOS 4 #define VERDADE 1 #define FALSO 0 s t r u c t RegAluno { char nome [ MAXNOME ].

mas nao ha este aluno . gets ( nome ). " ). " ). scanf ( " % f " . printf ( " Nota 2. nome ). } void lista ( s t r u c t RegAluno turma []) { i n t i . " ). } i ++. fflush ( stdin ).0. ca ca void insere ( s t r u c t RegAluno turma []) { i n t i =0. f o r ( i =0. m1 ).1 f \ n " . n2 )/2. char nome [ MAXNOME ].1 f \ n " . &( turma [ i ]. i ++) { i f (* turma [ i ]. } void remover ( s t r u c t RegAluno turma []) { i n t i =0. printf ( " Nota 2. printf ( " Nome . char achou = FALSO .\ n " . " ). turma [ i ].\ n " ). printf ( " Nome . turma [ i ]. } . while (i < MAXALUNOS && ! achou ) { i f (* turma [ i ]. " ). nome )) { achou = ! achou .\ n " ). turma [ i ].178 CAP´ ITULO 10. n1 ). aluno ++). turma [ i ]. nome != ’ ’) { printf ( " \ nDados sobre o aluno % d . printf ( " Nota 1. printf ( " Nota 1.\ n " ). nome . gets ( turma [ i ]. printf ( " % s \ n " . n2 ). " ). n1 ).5: Ordena¸˜o de Estruturas (continua¸˜o). scanf ( " % f " . " ). n1 + turma [ i ]. fflush ( stdin ). char achou = FALSO . n2 )). printf ( " %. printf ( " \ nAluno % s removido . } i f (! achou ) printf ( " \ nDesculpe . i < MAXALUNOS . printf ( " Media . & turma [ i ]. printf ( " %. printf ( " Qual o nome a remover ? " ). nome ).1 f \ n " . nome == ’ ’) { achou = ! achou . nao ha espaco para inserir um novo aluno . ESTRUTURAS Listing 10. * turma [ i ]. nome ). turma [ i ].\ n " . printf ( " \ nForneca os dados sobre o aluno . m1 = ( turma [ i ]. while (i < MAXALUNOS && ! achou ) { i f (! strcmp ( turma [ i ]. printf ( " %. } i f (! achou ) printf ( " \ nDesculpe . } i ++. aluno =0. nome = ’ ’.

n2 . como est´ c c a mostrado na figura abaixo. ´ economizado por que se evita passar os dados que comp˜em a o e o estrutura um por um. Empilhar e desempilhar se referem a pilha de dados ca usada para transferir os dados entre fun¸˜es. estas are c o quiteturas lˆem sempre uma palavra inteira da mem´ria. palavras e o podem ser compostas de dois bytes e come¸am em endere¸os pares. f l o a t n1 . Para ler o n´mero inteiro o programa deveria ler duas palavras. Por exemplo para imprimir a m´dia da aluna e maria usar´ ıamos o comando printf ( " A media vale %. maria . ca Vimos ent˜o que embora o total de bytes dos elementos da estrutura fosse a trˆs o compilador pode armazenar a estrutura em quatro bytes. Caso a mem´ria do computador seja organizada em palavras o de 16 bits ou 2 bytes a estrutura acima ocuparia 3 bytes ou uma palavra e meia. a Imagine ent˜o uma estrutura composta de um caracter (1 byte) e um n´mero a u de inteiro (2 bytes). No entanto. Para explicar esta fato devemos considerar como os dados s˜o armazenados na mem´ria dos a o computadores. Sabemos que existem vari´veis que ocupam mais de a um byte. Ao passar a co apenas o ponteiro para estrutura economizamos tempo e mem´ria. isto ´ cada endere¸o de mem´ria se refere a um byte. i n t ano_entrada . 179 Ponteiros s˜o uteis quando passamos estruturas para fun¸˜es. Lembrar que se u os dados fossem sempre armazenados sequencialmente. Algumas arquiteturas de computadores endere¸am os dados na m´moria por c e bytes. Este ´ uma troca constante o e em computa¸˜o. O espa¸o o c de mem´ria. isto porque o tamanho de uma estrutura ´ sempre a e igual ou maior que a soma dos tamanhos dos seu componentes. como est´ indicado a na figura abaixo (parte a). Usualmente. Observar que agora a estrutura ocupa quatro bytes.> media ).1 f " . Neste caso o acesso ao n´mero inteiro ser´ sempre feito em um passo e portanto ganhou-se u a em tempo de acesso ao custo de gasto de mem´ria. co Para acessar elementos da estrutura apontada por um ponteiro usa-se o chamado operador seta (->).6.6 mostra como utilizar ponteiros para estruturas e a forma mais segura de alocar espa¸o para os dados. metade do n´mero inu teiro estaria em uma palavra e a metade restante na outra. c . media . alguns compia a ladores armazenam as vari´veis de acordo com o que est´ indicado na figura a a (parte b). PONTEIROS PARA ESTRUTURAS char nome [40]. da´ a necessidade e ı de sempre usar o operador sizeof quando alocar espa¸o. } * maria . por exemplo inteiros que s˜o compostos de dois bytes. O tempo ´ economizado porque n˜o ´ necess´rio gastar o e a e a tempo de empilhar e desempilhar todos os elementos da estrutura no processo de passagem para a fun¸˜o. Para facilitar o acesso `s vari´veis. Para alocar espa¸o para estruturas apontadas por ponteiros ´ necess´rio usar c e a o operador un´rio sizeof.10. c O programa 10.

puts ( " Salario ? " ). i ). scanf ( " % d " . puts ( " Imprimindo dados dos funcionarios . exit (0). scanf ( " % f " . i ++) { printf ( " Dados dos funcionario % d \ n " . f l o a t imposto . puts ( " Nome ? " ). } } void imprime ( Tfunc * cadastro . " ). funcionarios ). printf ( " O imposto total a ser recolhido vale %. i n t ).180 CAP´ ITULO 10. & funcionarios ). puts ( " Quantos funcionarios tem a empresa ? " ). f l o a t imposto ( Tfunc * . stdin ). void le ( Tfunc * . f o r ( i =0. getchar ().h > #define TAMNOME 40 typedef s t r u c t _func { char nome [ TAMNOME ]. funcionarios )). funcionarios ). i n t funcionarios ) { int i. puts ( " Lendo dados dos funcionarios . fgets (( cadastro + i ) .h > #include < stdlib . } le ( cadastro . void imprime ( Tfunc * . i n t funcionarios ) { int i. TAMNOME . " ). &(( cadastro + i ) . exit (1).> salario )). i n t ). i n t ). " ). i n t funcionarios . f l o a t salario . imposto ( cadastro . } void le ( Tfunc * cadastro .6: Ponteiros para de estruturas. ESTRUTURAS Listing 10. imprime ( cadastro . } Tfunc . i f (! cadastro ) { puts ( " Nao ha espaco para alocar memoria . cadastro =( Tfunc *) malloc ( funcionarios * s i z e o f ( Tfunc )). . i n t main () { Tfunc * cadastro . #include < stdio . i < funcionarios .> nome .2 f \ n " .

( cadastro + i ) . Fun¸˜o imprime (nota¸˜o ponteiros) ca ca printf ( " Nome = % s \ n " . printf ( " Salario = %.10. else func += cadastro [ i ].> salario )). &(( cadastro + i ) . salario * 0. scanf ( " % f " . salario > 1000.25.6. Fun¸˜o le (nota¸˜o ponteiros) ca ca gets (( cadastro + i ) . salario * 0. Reproduzimos ca abaixo as fun¸˜es com as duas nota¸˜es para ficar mais claro o que estamos co co procurando destacar.00) func += cadastro [ i ]. PONTEIROS PARA ESTRUTURAS 181 Observar que neste exemplo usamos as duas nota¸˜es poss´ co ıveis para representar elementos de uma estrutura. Fun¸˜o imposto (nota¸˜o vetorial) ca ca i f ( cadastro [ i ].10.> salario ). ( cadastro + i ) .> nome ). Nas fun¸˜es le e imprime usamos a nota¸˜o co ca de ponteiros e na fun¸˜o imposto usamos o fato de que ap´s a aloca¸˜o de espa¸o ca o ca c para o vetor de estruturas podemos usar a nota¸˜o de vetores. .> nome ).2 f \ n " .

Depois imprime os valores das variaveis enumeradas.1: Considere que uma empresa precisa armazenar os seguintes dados de um cliente: • Nome completo com no m´ximo 50 caracteres.6: Escrever um programa que utilize union. ESTRUTURAS Exerc´ ıcios 10.3: Reescreva o programa 10. A fun¸˜o main deve ficar da maneira indicada na ca Listagem 10.5: Escrever um programa que utilize enumeradores com as materias do seu periodo. 10. 10. 10. • possui ou n˜o carro. 10. Um exemplo de entrada poderia ser o seguinte: empilha C empilha B empilha A desempilha A desempilha B . e e • quantos clientes tˆm carro. • ano de nascimento. 10.182 CAP´ ITULO 10.7. Inicialize as variaveis com valores diferentes e imprima o conteudo delas. escreva um proıcio grama que leia os dados de 100 clientes e imprima: • quantos clientes tˆm renda mensal acima da m´dia. a • renda mensal do do cliente.4: Escrever um programa que utilize structs e ponteiro para struct e imprima o conteudo das variaveis da struct. 10.7: Fazer um programa que simule uma pilha push pop. usando structs.2 empregando fun¸˜es para implementar as co diversas tarefas do programa. Inicialize cada materia com um numero.2: Considerando a mesma estrutura do exerc´ anterior. e • quantos clientes nasceram entre 1960 (inclusive) e 1980 (exclusive). a Defina um tipo e uma estrutura para armazenarem estes dados e escreva um programa que leia estes dados armazene-os em uma vari´vel e em seguida os a imprima.

" ).12: Escreva um programa que use as mesmas estruturas do exerc´ anterior ıcio para descobrir se um ponto est´ dentro de um retˆngulo. o comprimento da diagonal e o comprimento de cada a aresta 10. contendo apenas a posi¸˜o x e y (inteiros) do ca ponto. Fa¸a um programa c que receba as informa¸˜es acerca de um retˆngulo (as coordenadas dos dois co a pontos). que possua duas estruturas ponto (o ponto superior esquerdo e o ponto inferior direito). o 10. puts ( " Imprimindo dados ordenados da turma . getchar (). " ). PONTEIROS PARA ESTRUTURAS Listing 10. puts ( " Digite qualquer coisa para continuar . Declare 2 pontos. ordena_medias ( turma ). getchar ().11: Crie uma estrutura chamada retangulo.7: Listagem do exercicio 3. puts ( " Imprimindo dados lidos da turma .8: Escreva um programa que solicite o nome e telefone de uma pessoa e grave essas informa¸˜es num vetor de uma estrutura que contem esses dados (nome e co telefone). O programa deve ter trˆs opcoes apenas: uma que adiciona um novo e dado.9: Escreva uma estrutura similar as strings do Delphi (possuem um campo armazenando o tamanho da string e um ponteiro para o primeiro caracter da string) e crie as func˜es strcpy e strcat para strings nesse formato. " ). Esse vetor de estrutura deve ter apenas 10 elementos e fornecer uma mensagem de erro caso o usu´rio tente adicionar mais pessoas a que este m´ximo permitido. e informe a ´rea. getchar ().6. outra que lista todos os dados atualmente armazenados na mem´ria e o outra que sai do programa. leia a posi¸˜o (coordenadas x e y) de cada um e calcule ca a distˆncia entre eles. imprime ( turma ).10: Escreva um programa fazendo o uso de estruturas. Apresente no final a distˆncia entre os dois pontos. a a 10. imprime ( turma ). a a . } 183 desempilha C 10. " ).10. i n t main ( void ) { s t r u c t aluno turma [ MAX ]. a 10. puts ( " Digite qualquer coisa para continuar . Vocˆ dever´ criar e a uma estrutura chamada Ponto. le ( turma ).

} FRACAO . O programa deve ler duas fra¸˜es e co imprimir o resultado de cada uma das quatro opera¸˜es. ESTRUTURAS 10. Escreva um programa em C que calcule as quatro opera¸˜es usando fra¸˜es co co definidas com estruturas do tipo FRACAO. co .13: Considere que foi definida a seguinte estrutura: typedef s t r u c t _frac { i n t numerador .184 CAP´ ITULO 10. denominador .

2.Cap´ ıtulo 11 Entrada e Sa´ por ıda Arquivos 11. Por exemplo. Nem sempre a tradu¸˜o entre a representa¸˜o do caracter no fluxo de texto e ca ca no sistema de arquivos do computador hospedeiro ´ um para um. a 11.1 Fluxos de Texto Um fluxo de texto ´ composto por uma seq¨ˆncia de caracteres. sendo estas tarefas executadas por fun¸˜es especa co cialmente criadas para esta finalidade e armazenadas em bibliotecas espec´ ıficas. Dados podem ser manipulados em dois diferentes tipos de fluxos: fluxos de texto e fluxos bin´rios. Todos os diferentes sistemas de arquivos se comportam da mesma maneira quando manipulados como um fluxo cont´ ınuo de dados.2 Fluxos de Dados Para isolar os programadores dos problemas de manipular os v´rios tipos de a dispositivos de armazenamento e seus diferentes formatos a linguagem C utiliza o conceito de fluxo (stream) de dados. Um a detalhe que deve ser considerado ´ que na ultima linha n˜o ´ obrigat´rio o e ´ a e o caracter de fim de linha.1 Introdu¸˜o ca Em C n˜o existem comandos de Entrada e Sa´ especiais como em outras a ıda linguagens de programa¸˜o. e entre UNIX e DOS h´ uma diferen¸a na representa¸˜o de final de linha que a c ca causa problemas na impress˜o de arquivos. 11. Em UNIX um final de linha ´ a e 185 . que pode ou e ue n˜o ser dividida em linhas terminadas por um caractere de final de linha.

01110001 01100001 01100010 32 bits 12 32 bits 113 8 bits 8 bits ‘a‘ ‘b‘ Figura 11.. .. e ca Deste modo quando um arquivo gerado em UNIX vai para uma impressora que espera final de linha no modo DOS surge o que ´ comumente chamado de efeito e escada. Um caractere em branco foi inserido entre cada um dos n´meros u para separ´-los.. Observe que n˜o h´ necessidade de separar os n´meros j´ que a a u a eles sempre ocupam 32 bits. a a A Figura 11. O numero 12 ocupa dois bytes e o n´mero u 113 ocupa 3. Cada a ca a um dos caracteres ocupa um byte. ca 11. No fluxo de texto os dados s˜o armazenados como caracteres sem convers˜o para representa¸˜o bin´ria.2 Fluxo Bin´rio a Um fluxo bin´rio ´ composto por uma seq¨ˆncia de bytes lidos. Em DOS um final de ca linha ´ representado pelo par retorno de carro/alimenta¸˜o de linha (CR/LF).1: Fluxos de dados.186 CAP´ ITULO 11.1 ilustra estes dois tipos de fluxos. A impress˜o continua na linha seguinte mas sem voltar para o in´ da a ıcio linha porque em UNIX o caracter de retorno de carro n˜o ´ inserido no fluxo de a e texto. Existe uma correspondˆncia um para um e entre os dados do dispositivo e os que est˜o no fluxo que o programa manipula. para e a entrada de dados e stdout para sa´ de dados.2. sem tradu¸˜o. de modo que a fun¸˜o de entrada e sa´ possa descobrir que a ca ıda s˜o dois n´meros inteiros (12 e 113) e n˜o o n´mero 12113.01100 000. a u a u No fluxo bin´rio cada n´mero inteiro ocupa 32 bits e ´ armazenado na forma a u e bin´ria. Todo programa em C ao iniciar ıda ´ automaticamente associado a estes dois fluxos sem necessitar de nenhuma e interven¸˜o do programador. At´ agora temos trabalhado com os fluxos de dados padr˜o: stdin. a e ue ca diretamente do dispositivo externo. Os caracteres do exemplo est˜o armazenados em bin´rio seguindo a a a a tabela ASCII. ENTRADA E SA´ IDA POR ARQUIVOS representado pelo caracter de alimenta¸˜o de linha (LF). fluxo de texto ‘1‘ ‘2‘ ‘b‘ ‘1‘ ‘1‘ ‘3‘ ‘b‘ ‘a‘ ‘b‘ fluxo binário 000..

h. Este tipo tamb´m est´ definido na biblioteca e a stdio. para uma impressora n˜o ´ poss´ usar a fun¸˜o que a e ıvel ca reposiciona o arquivo no ´ ınicio. a Ao final das opera¸˜es necess´rias o programa deve fechar o arquivo. u e 11. disquete. As fun¸˜es mais comuns est˜o mostradas a co a na tabela 11. Para definir co uma vari´vel deste tipo o programa deve conter a seguinte declara¸˜o a ca FILE *arq. FUNCOES DE ENTRADA E SA´ ¸˜ IDA 187 11. Um ponteiro deste tipo permite que o programa tenha acesso a uma estrutura que armazena informa¸˜es importantes sobre o arquivo.3 Arquivos Arquivo pode ser qualquer dispositivo de Entrada e Sa´ como por exemplo: ıda impressora. Obviamente algumas dessas fun¸˜es n˜o se aplicam a todos os tipos de disco a positivos. Para que um determinado arquivo seja associado a um detere minado fluxo ´ necess´rio que o arquivo seja “aberto”. Programas vˆem os arquivos e atrav´s de fluxos. Ap´s esta opera¸˜o.1. disco r´ ıgido etc.2. Para ter acesso aos dados em um arquivo ´ necess´rio a defini¸˜o de um e a ca ponteiro do tipo especial FILE. e a co . Ao co a final da execu¸˜o de um programa todos os arquivos associados s˜o fechados ca a automaticamente e os conte´dos dos buffers s˜o descarregados para o dispositivo u a externo. Caso o arquivo seja de entrada o conte´do do buffer ´ esvaziado. onde arq ´ o ponteiro que ser´ usado para executar as opera¸˜es no arquivo. teclado. • posicionar o arquivo em um ponto determinado.h.11.3. • procurar saber se o fim do arquivo foi atingido. Opera¸˜es comuns em arquivos s˜o: co a • abertura e fechamento de arquivos.3 Fun¸oes de Entrada e Sa´ c˜ ıda As fun¸˜es de Entrada e Sa´ normalmente utilizadas pelos programadores co ıda est˜o armazenadas na biblioteca stdio. o e a o ca programa pode utilizar os dados armazenados no arquivo. • leitura e escrita de um caracter. • apagar um arquivo. Um arquivo em disco permite acesso aleat´rio o enquanto um teclado n˜o. Por exemplo.

Lˆ de uma cadeia de caracteres e Equivalente a scanf() Posiciona o arquivo em um ponto espec´ ıfico Posiona o arquivo no in´ ıcio Retorna verdade se chegou ao fim do arquivo Verifica a ocorrˆncia de um erro e Descarrega o buffer associado ao arquivo Leitura de dados no modo bin´rio a Escrita de dados no modo bin´rio a Tabela 11. 11. “r”: Abre um arquivo para leitura. A seguir listamos os a diversos modos que podem ser usados para abrir um arquivo. const char *modo) onde parq ´ um ponteiro de arquivo para o arquivo a ser manipulado e modo ´ e e um ponteiro para uma cadeia de caracteres que define a maneira como o arquivo vai ser aberto.1 Abrindo um Arquivo Antes de qualquer opera¸˜o ser executada com o arquivo.188 Fun¸˜o ca fopen() fputc() getc(). ca Esta opera¸˜o associa um fluxo de dados a um arquivo.4 In´ ıcio e Fim As opera¸˜es mostradas a seguir mostram opera¸˜es que devem ser realizadas co co antes e depois de usar um arquivo (fopen() e fclose()). fgetc() fprintf() sscanf() fscanf() fseek() rewind() feof() ferror() fflush() fread() fwrite() CAP´ ITULO 11. adic˜o de texto etc. As outras duas fun¸˜es co servem para que o usu´rio possa detectar o fim de um arquivo ou voltar para a seu in´ ıcio. escrita. leitura/escrita. A fun¸˜o utilizada a ca para abrir o arquivo ´ chamada fopen() e tem o seguinte prot´tipo: e o FILE *fopen (const char *parq. o arquivo deve existir ou um erro ocorre. “w”: Cria um arquivo vazio para escrita. ENTRADA E SA´ IDA POR ARQUIVOS Descri¸˜o ca Abre um arquivo Escreve um caracter em um arquivo Lˆ um caracter de um arquivo e Equivalente a printf() Equivalente a scanf(). Um arquivo pode ser ca aberto de diversas maneiras de acordo com as opera¸˜es que dever˜o ser execuco a tadas: leitura.1: Exemplos de fun¸˜es de Entrada e Sa´ co ıda. u e . caso um arquivo com o mesmo nome exista o seu conte´do ´ apagado. Este ponteiro n˜o deve ser modificado e a fun¸˜o retorna um a ca ponteiro nulo (NULL) se o arquivo n˜o puder ser aberto. 11.4. ele deve ser “aberto”.

4. FILE * pa . Todas as opera¸˜es de escrita ca co ´ s˜o feitas no final do arquivo. } Lembrar que abrir.txt) no modo escrita ao ponteiro pa. O arquivo ´ criado caso ele n˜o exista. Se um arquivo com o mesmo nome existe o conte´do ´ apagado. Todos e os buffers internos associados com o fluxo de dados do arquivo s˜o descarregaa dos. IN´ ICIO E FIM 189 “a”: Adiciona ao final de um arquivo. /* declaracao do ponteiro para arquivo */ /* nome externo associado ao interno */ pa = fopen ( " arquivo . Um teste para ponteiro nulo ´ feito para verificar se ocorreu algum problema com a opera¸˜o de abertura do e ca arquivo. onde parq ´ um ponteiro de arquivo para o arquivo que deve ser fechado.2 Fechando um Arquivo Um arquivo aberto por meio da fun¸˜o fopen() deve ser fechado com a fun¸˜o ca ca fclose() cujo prot´tipo ´ o e int fclose (FILE *parq).11. u e “a+”: Abre um arquivo para leitura e adi¸˜o. para escrita. u a a a O trecho de programa abaixo ilustra os passos necess´rios para abrir um a arquivo para escrita. E poss´ reposionar o ponteiro do arquivo a ıvel para qualquer lugar em leituras. e a Observar que se um arquivo for aberto com permiss˜o de escrita todo o seu a conte´do anterior ser´ apagado. O arquivo deve existir ou um erro ocorre. " w " ). O conte´do de qualquer buffer n˜o escrito ´ escrito e dados n˜o lidos de u a e a . return 1. i f ( pa == NULL ) /* verifica erro na abertura */ { printf ( " Arquivo nao pode ser aberto . " ). um arquivo que j´ existe. e a “r+”: Abre um arquivo para leitura e escrita. a 11. Em e seguida a fun¸˜o fopen ´ chamada para associar o nome externo do programa ca e (arquivo. implica em apagar a todo o conte´do anterior e a prepara¸˜o do arquivo para receber dados a partir u ca de seu ponto inicial.4. mas as escritas mover˜o o ponteiro para a o final do arquivo. Primeiro ´ declarado o ponteiro pa para o arquivo. Caso o arquivo n˜o exista ele ser´ criado. O arquivo ´ criado caso n˜o exista. “w+”: Cria um arquivo vazio para leitura e escrita. txt " . Se o programador deseja acrescentar dados ao final de um arquivo j´ existente o modo de abertura deve ser a.

Uma opera¸˜o semelhante ao que fazemos em uma fita cassete de m´sica ca u .3 Fim de Arquivo A fun¸˜o feof() indica que um arquivo chegou ao seu final. que indica final de arquivo pelo teclado em Unix (no outro sistema ´ <ctl>+Z). Neste exemplo a leitura termina quando o usu´rio digita o a caracter <ctl>+D. } 11. while (! feof ( stdin )) { putchar ( c ). qualquer outro valor ca e implica em erro. Este ponto ´ importante de ser considerado porque em a e muitos sistemas operacionais uma opera¸˜o de escrita em um arquivo n˜o ocorre ca a imediatamente a emiss˜o da ordem de escrita. a O exemplo 11. A fun¸˜o feof() serve para indicar a ca que o final de um arquivo bin´rio foi encontrado.1 mostra um programa que lˆ um caractere do teclado e o e mostra na tela. Naturalmente esta fun¸˜o a ca pode ser aplicada tamb´m a arquivos texto. O valor zero indica que ainda n˜o se chegou ao final do arquivo. O prot´tipo da fun¸˜o ´ o seguinte: e o ca e int feof(FILE *parq) Um valor diferente de zero ´ retornado no caso de ter sido atingido o final e do arquivo.1: Uso da fun¸˜o feof(). ca #include < stdio . } return 0. A pergunta que ca pode surgir ´ a seguinte . c = getchar ().h > i n t main ( void ) { char c .4 Volta ao In´ ıcio A fun¸˜o rewind() recoloca o indicador de posi¸˜o de arquivo no inicio do arca ca quivo. e a por que precisamos de uma fun¸˜o extra do tipo feof()? O problema ´ que EOF ca e ´ um valor inteiro e ao ler arquivos bin´rios este valor pode ser lido como parte e a do arquivo e n˜o por ser o final do arquivo. O sistema operacional pode exa ecutar a ordem no momento que achar mais conveniente.4. Um valor zero de retorno significa que a opera¸˜o foi executada com ˆxito. e Listing 11.190 CAP´ ITULO 11. 11. ENTRADA E SA´ IDA POR ARQUIVOS buffers s˜o perdidos.Se j´ existe o valor EOF para indicar o final de arquivo.4. c = getchar ().

As fun¸˜es getc() e fgetc() s˜o equivalentes e muitos compiladores impleco a mentam getc() como uma macro do seguinte modo: #define getc(parq) fgetc(parq) A fun¸˜o lˆ o caracter como um unsigned char mas retorna o valor como ca e um inteiro.5. O valor EOF tamb´m ´ um inteiro v´lido e portanto ao usar arquivos e e a bin´rios ´ necess´rio que a fun¸˜o feof() seja utilizada para verificar o final do a e a ca arquivo. n˜o ir´ permitir outra a a opera¸˜o que n˜o seja “escrita”. Por exemplo. FILE *parq) onde parq ´ um ponteiro de arquivo para o arquivo que foi previamente aberto e por meio da fun¸˜o fopen() e ch e o caracter a ser escrito. fazendo com que o indicador de posi¸˜o do arquivo volte a ca ca apontar para seu in´ ıcio. LENDO E ESCREVENDO CARACTERES ou v´ ıdeo. Em seguida um conjunto de caracteres lido do teclado ´ escrito no are quivo. A fun¸˜o ferror() pode ser usada para determinar se um erro ocorreu. ca O programa 11. ca a 11.3 mostra um exemplo onde o arquivo ´ criado para escrita em seguida ´ fechado e reaberto para leitura ficando e e automaticamente posicionado no in´ para a leitura.11. O apontador do arquivo avan¸a um caractere e passa a apontar para o pr´ximo caractere a ser lido. O pr´ximo passo ´ a leitura do arquivo que ´ iniciada ap´s uma chamada o e e o a fun¸˜o rewind(). O a co prot´tipo da fun¸˜o fputc ´ o seguinte: o ca e int fputc(int ch. onde o byte mais significativo vale zero. O prot´tipo da fun¸˜o ´ o seguinte: o ca e void rewind(FILE *parq) 191 ´ importante observar que o arquivo deve estar aberto em um modo que permita e a execu¸˜o das opera¸˜es desejadas.5 Lendo e Escrevendo Caracteres As opera¸˜es mais simples em arquivos s˜o a leitura e escrita de caracteres. O prot´tipo de fgetc ´: co a o e int fgetc (FILE *parq). ıcio . co a Para ler um caracter de um arquivo. um arquivo aberto somente ca co para “escrita” e em seguida reposicionado para o in´ ıcio. c o A fun¸˜o devolve o c´digo EOF ao chegar ao final do arquivo ou caso um erro ca o ocorra.2 mostra como um arquivo pode ser criado para leitura e escrita. pode-se usar as fun¸˜es getc() e fgetc(). que s˜o equivalentes. que foi previamente aberto. Uma outra alternativa mostrada em 11. ca Para escrever caracteres h´ duas fun¸˜es definidas putc() e fputc().

txt " . exit (1). c = fgetc ( pa ). " w + " )) == NULL ) { printf ( " \ n \ nNao foi possivel abrir o arquivo . FILE * pa . ENTRADA E SA´ IDA POR ARQUIVOS Listing 11. while (! feof ( stdin )) { fputc (c . } rewind ( pa ). } fclose ( pa ). /* Abre o arquivo para leitura e escrita */ i f (( pa = fopen ( nome . agora vou ler .\ n " ). c = fgetc ( pa ). #include < stdio .192 CAP´ ITULO 11.\ n " ). pa ).2: Exemplo de leitura e escrita de caracteres. } /* Cada caracter digitado ser gravado no arquivo */ c = getchar (). char * nome = " texto . /* volta ao inicio do arquivo */ printf ( " \ nTerminei de escrever .h > i n t main ( void ) { int c. while (! feof ( pa )) { putchar ( c ). } . c = getchar ().h > #include < stdlib . return 0.

\ n " ). } c = fgetc ( pa ). exit (1). i f (( pa = fopen ( nome . printf ( " \ nTerminei de escrever . pa ). while (! feof ( stdin )) { fputc (c . agora vou ler . txt " . c = getchar ().\ n " ). char * nome = " texto .\ n " ).leitura .h > int { main ( void ) int c.h > #include < stdlib . c = fgetc ( pa ).3: Exemplo de leitura e escrita de caracteres. } . return 0. } fclose ( pa ). while (! feof ( pa )) { putchar ( c ). FILE * pa .escrita . i f (( pa = fopen ( nome .11.5. #include < stdio . } fclose ( pa ). } /* Cada caracter digitado ser gravado no arquivo */ c = getchar (). " r " )) == NULL ) { printf ( " \ n \ nErro ao abrir o arquivo . exit (1). " w + " )) == NULL ) { printf ( " \ n \ nErro ao abrir o arquivo . LENDO E ESCREVENDO CARACTERES 193 Listing 11.

194 CAP´ ITULO 11. txt " ." r " ). A fun¸˜o fputs() escreve a cadeia de caracteres apontada por str no fluxo ca apontado por parq. } } return 0.6 Testando Erros A fun¸˜o ferror(FILE *parq) serve para verificar se ocorreu um erro associado ca ao fluxo de dados sendo usado. return 1. } else { fputc ( ’x ’ . FILE *parq). pArq ). FILE *parq). int fgets(char *str. int comp. e ca Listing 11. que ocorre geralmente quando a opera¸˜o previamante executada no fluxo ca falhou. return 1. O programa a e 11. pArq = fopen ( " MeusDados . mas tenta escrever um caractere o que provoca um erro que ´ testado pela fun¸˜o ferror. o a e . O c´digo nulo ao final da cadeia n˜o ´ copiado para o fluxo. " ). fclose ( pArq ). Os prot´tipos das fun¸˜es s˜o: o co a int fputs(char *str. Um valor diferente de zero ´ a indica¸˜o do e ca erro. i f ( ferror ( pArq )) { printf ( " Erro escrevendo arquivo \ n " ). O parˆmetro parq ´ um ponteiro para o fluxo a ser testado.4: Uso da fun¸˜o ferror(). } 11. ENTRADA E SA´ IDA POR ARQUIVOS 11.4 abre um arquivo para leitura. ca #include < stdio .7 Lendo e Escrevendo Cadeias de Caracteres As fun¸˜es fgets() e fputs() servem para ler e escrever cadeias de caracteres co em arquivos.h > i n t main () { FILE * pArq . i f ( pArq == NULL ) { printf ( " Erro abrindo arquivo .

). ENTRADA E SA´ IDA FORMATADA 195 O c´digo correspondente ` EOF ser´ retornado se ocorrer um erro e um valor n˜o o a a a negativo em caso de sucesso. sendo a unica modifica¸˜o o fato de que elas trabalham com e ´ ca fluxos de dados (arquivos).. elas tˆm a e desvantagem de serem mais lentas do que uso de arquivos bin´rios. const char *formatacao. Caso ocorra uma falha antes de que uma leitura possa ser feita com sucesso. o n´mero total de ca u caracteres escrito ´ retornado. onde parq ´ um ponteiro de arquivo recebido ap´s uma chamada a fopen(). o conte´ do u de str ´ mantido e um NULL ´ retornado. O exemplo 11. por sua semelhan¸a com printf() e scanf(). O caractere de nova linha interrompe a leitura. O ponteiro str ´ retornado e caso a leitura ocorra sem erro. a fun¸˜o retorna o n´mero de itens lidos com sucesso.. o que n˜o acontece com dados a a em bin´rio. A fun¸˜o fgets() lˆ uma cadeia de caracteres do fluxo especificado por parq ca e at´ que um caracter de nova linha seja encontrado ou comp-1 caracteres sejam e lidos. . Observar que diferentemente de gets() o caracter de nova linha encontrado passa a fazer parte da cadeia que recebe um caracter nulo ao seu final. Esta ca u contagem pode igualar o n´mero esperado de leituras ou ser menor no caso u de falha. a O exemplo 11.. int fscanf(FILE *parq. caso a opera¸˜o de escrita tenha sucesso. co c sejam maneiras convenientes de escrecer e ler dados de arquivos. Embora estas duas fun¸˜es.5 mostra um exemplo e e de uso destas fun¸˜es para ler e escrever cadeias de caracteres em um arquivo. e Em escritas.8. Os prot´tipos das duas fun¸˜es s˜o os seguintes: o co a int fprintf(FILE *parq.. Um n´mero negativo ´ retornado em caso de e u e falha.6 mostra o uso destas fun¸˜es para ler e escrever v´rios tipos co a de dados em um arquivo. o que obriga e a uma convers˜o dos dados a cada opera¸˜o realizada.11. . Em alguns casos o fato a ca dos dados serem gravados em ASCII pode ser considerado um vantagem que se sobrep˜e a desvantagem da redu¸˜o de velocidade.). e o Em leituras. const char *formatacao. EOF ´ retornado. No caso de erro o ponteiro str recebe o valor NULL. Se o fim do arquivo for encontrado e nenhum caractere foi lido. A perda a de tempo ´ devido ao fato dos dados serem gravados em ASCII. co 11. . Dados gravados em ASCII o ca podem ser facilmente verificados pelos usu´rios.8 Entrada e Sa´ Formatada ıda As fun¸˜es fprintf() e fscanf() s˜o equivalentes as fun¸˜es printf() e scanf() co a co usadas at´ agora.

pa ). fgets ( linha . while (! feof ( stdin )) { fputs ( linha . " w + " )) == NULL ) { printf ( " \ n \ nNao foi possivel abrir o arquivo . } fgets ( linha . fgets ( linha . i f (( pa = fopen ( nome . MAX .\ n " ). pa ). while (! feof ( pa )) { puts ( linha ). stdin ). FILE * pa . char * nome = " texto . return 0. #include < stdio .\ n \ n " ). stdin ). txt " . } rewind ( pa ). /* volta ao inicio do arquivo */ printf ( " \ nTerminei de escrever . } fclose ( pa ).196 CAP´ ITULO 11.5: Exemplo de leitura e escrita de cadeias de caracteres. pa ).h > #include < stdlib . } . agora vou ler . exit (1). MAX .h > #define MAX 80 i n t main ( void ) { char linha [ MAX ]. MAX . ENTRADA E SA´ IDA POR ARQUIVOS Listing 11. MAX . fgets ( linha .

6: Exemplo de leitura e escrita de dados formatados. palavra ). " ). printf ( " Inteiro lido : % d \ n " . scanf ( " % s " . #include < stdio . /* Escreve os dados no arquivo */ fprintf ( pa . palavra . FILE * pa . f l o a t f. /* Abre o arquivo para leitura e escrita */ i f (( pa = fopen ( nome .\ n " ). ENTRADA E SA´ IDA FORMATADA 197 Listing 11. fscanf ( pa . txt " . printf ( " Float lido : % f \ n " . fclose ( pa ). return 0. & f ). & i ). palavra ). palavra . scanf ( " % d " . " ). " % s % d % f " . & f ). } puts ( " Entre com uma palavra . char * nome = " format . f ). puts ( " Entre com um numero inteiro .h > #include < stdlib . scanf ( " % f " . f ).11. " % s % d % f " . i .h > #define MAX 20 i n t main ( void ) { char palavra [ MAX ]. &i .8. puts ( " Entre com um numero flutuante . agora vou ler .\ n " ). " w + " )) == NULL ) { printf ( " \ n \ nNao foi possivel abrir o arquivo . } . exit (1). /* volta ao inicio do arquivo */ printf ( " \ nTerminei de escrever . int i. " ). i ). printf ( " Palavra lida : % s \ n " . rewind ( pa ).

´ recomendado o uso de sizeof. A ca fun¸˜o retorna o n´mero de itens que foram lidos com sucesso. O programa 11. A fun¸˜o fread lˆ nmemb objetos. Caso ela tenha ca retornado um valor diferente de MAX ocorreu um erro. Esta fun¸˜o n˜o distingue entre um fim de arquivo e erro. size_t nmemb. sizeof (struct pessoa).9 Lendo e Escrevendo Arquivos Bin´rios a As fun¸˜es fread e fwrite s˜o empregadas para leitura e escrita de dados em co a modo bin´rio. cada um com size bytes de comprimento. Caso ocorra um ca u erro. size_t size. Imprima o n´mero de caracteres na tela. u 11. No entanto. fwrite retorna o n´mero de itens que foram lidos com sucesso. size_t fwrite(const void *ptr. ou o fim do arquivo foi atingido o valor de retorno ´ menor do que nmemb e ou zero. e Uma das principais aplica¸˜es destas fun¸˜es ´ a leitura e escrita de estruco co e turas criadas pelos usu´rios. size_t size. ou o fim do arquivo foi atingido o valor de retorno ´ menor e do que nmemb ou zero. Como um dos parˆmetros da fun¸˜o ´ o n´mero de bytes do a ca e u dado a ser lido.198 CAP´ ITULO 11. a Os prot´tipos das fun¸˜es s˜o: o co a size_t fread (void *ptr. pa). A grava¸˜o em bin´rio da estrutura permite que a ca a o programador ao escrever ou ler do arquivo se preocupe somente com a estrutura como um todo e n˜o com cada elemento que a compo˜e. FILE *parq). portanto ´ ca a e aconselhavel o uso de feof() ou ferror() para determinar que erro ocorreu.7 ilustra como podemos escrever e ler dados de diferentes tipos em arquivos. size_t nmemb. para o fluxo apontado por stream obtendo-os da localiza¸˜o ca apontada por ptr.8 a o mostra um exemplo onde estruturas s˜o gravadas e lidas de um arquivo. Para testar erro basta verificar o valor retornado pela fun¸˜o. A fun¸˜o fwrite escreve nmemb elementos de dados. ENTRADA E SA´ IDA POR ARQUIVOS 11. cada um com size bytes ca de comprimento. MAX. u Caso ocorra um erro. e c tamb´m ´ poss´ gravar todas as estruturas de uma vez mudando o terceiro e e ıvel parˆmetro da fun¸˜o fwrite().2: Considere um arquivo de dados do tipo texto com o seguinte conte´do: u . O la¸o seria substitu´ por a ca c ıdo fwrite( &turma[i]. FILE *parq). ca e do fluxo apontado por stream e os coloca na localiza¸˜o apontada por ptr. Exerc´ ıcios 11. Neste a exemplo ´ usado um la¸o para gravar uma estrutura de cada vez.1: Escreva um programa que abra um arquivo texto e conte o n´mero de u caracteres presentes nele. O programa 11.

´ 11. 1 . % c \ n " . char * nome = " texto .9.h > #include < stdlib . fwrite (& c . c ).\ n " ). s i z e o f ( double ) . fread (& c . pa ). pa ). fread (& fnum . s i z e o f ( i n t ) . pi . 1 . fread (& inum . bin " . 1 . rewind ( pa ). 1 . pa ). fwrite (& pi . exit (1). LENDO E ESCREVENDO ARQUIVOS BINARIOS 199 Listing 11.h > i n t main ( void ) { i n t inum =10. %f . pa ). s i z e o f ( i n t ) . return 0. " w + " )) == NULL ) { printf ( " \ n \ nErro ao abrir o arquivo para escrita . s i z e o f ( f l o a t ) . } . fnum . perror ( " fopen " ). a #include < stdio . s i z e o f ( f l o a t ) . inum . pa ). fread (& pi . s i z e o f ( double ) .7: Exemplo de leitura e escrita na forma bin´ria. char c = ’Z ’.5. double pi =3. 1 . 1 .141516. pa ). s i z e o f ( char ) . } fwrite (& inum . 1 . pa ). s i z e o f ( char ) . FILE * pa . %f . i f (( pa = fopen ( nome . fwrite (& fnum . fclose ( pa ). printf ( " %d . pa ). f l o a t fnum =2. 1 .

sscanf ( linha . back [ MAX ]. printf ( " Ano = % d \ n \ n " . stdin ). #include < stdio .1 . } f o r ( i =0. nome ) -1]= ’ \0 ’. ano ).8: Exemplo de leitura e escrita de estruturas.1 . i < MAX . " ). fgets ( turma [ i ]. i ++) { printf ( " Nome = % s \ n " . puts ( " Erro na leitura . " ). " ). i ++) { i f ( fread (& back [ i ] . i ++) { puts ( " Nome ? " ). i f (( pa = fopen ( nome . i < MAX . nome ).h > #define MAX 4 i n t main () { FILE * pa . " % d " . pa ) != 1) { puts ( " Erro na escrita . } rewind ( pa ).h > #include < stdlib . 80 . stdin ). char nome [40] . nome [ strlen ( nome ) -1]= ’ \0 ’. f o r ( i =0. 40 . i n t ano . i < MAX . i < MAX . f o r ( i =0. fgets ( linha . } turma [ MAX ] . nome [ strlen ( turma [ i ].h > #include < string . i ++) { i f ( fwrite (& turma [ i ] . stdin ). } puts ( " \ nGravando \ n " ). puts ( " Ano ? " ). ENTRADA E SA´ IDA POR ARQUIVOS Listing 11. pa ) != 1) puts ( " Erro na escrita . turma [ i ]. exit (1). linha [80]. turma [ i ]. i f ( feof ( pa )) break. int i. } } . turma [ i ].200 CAP´ ITULO 11. puts ( " Qual o nome do arquivo ? " ). s i z e o f ( s t r u c t pessoa ) . & turma [ i ]. " w + " )) == NULL ) { puts ( " Arquivo nao pode ser aberto " ). ano ). 40 . s t r u c t pessoa { char nome [40]. } f o r ( i =0. fgets ( nome . nome . s i z e o f ( s t r u c t pessoa ) .

0 ANTONIO SANTOS 7.5 10.5 SEBASTIAO OLIVEIRA 5. Escreva um programa que imprima os nomes de todos os alunos que tˆm a m´dia e e das duas notas menor que 7. f l o a t n1 . e adicione o texto no fim c do arquivo. LENDO E ESCREVENDO ARQUIVOS BINARIOS 3 ZE SA 8. cujo nome sera fornecido pelo usuario.9. n2 . 11.5: Fa¸a um programa que leia 10 caracteres e armazene em um arquivo 10 c c´pias de cada um. } ALUNO .´ 11. O n´mero que indica quantos a o u alunos devem ser lidos (primeira linha do arquivo) n˜o deve ser gravado no a arquivo bin´rio. O programa ao final calcula a media dos numeros lidos.4: Escreva um programa que leia de um arquivo. 11. um conjunto de numeros reais e armazena em um vetor. O tamanho m´ximo do vetor e dado pela constante TAM_MAX. Exiba o conte´do o u 11.0 11. uma com um ca a endere¸o de arquivo e outra com um texto qualquer. As linhas seguintes e u cont´m os seguintes dados: e • nome do aluno com no m´ximo 50 caracteres. A quantidade de a numeros no arquivo varia entre 0 e TAM_MAX. Nesta quest˜o o programa deve obrigatoriamente usar um a a vetor de estruturas do seguinte tipo: typedef struc _ALUNO { char nome [81].0 6. . a • nota da primeira prova.3: Escreva um programa que grave os dados lidos no exerc´ anterior em ıcio um arquivo do tipo bin´rio de acesso aleat´rio. • nota da segunda prova.6: Crie uma fun¸˜o que receba duas strings como parˆmetros.0 201 O arquivo acima ´ um exemplo.5 8. Considere ent˜o que nestes arquivos a e a primeira linha cont´m o n´mero de alunos no arquivo.

} PESSOA . a 11. f l o a t altura . O programa deve ler estes dados e imprimir os valores lidos. a ser preenchida pelo usu´rio antes do armazenamento de cada registro.202 CAP´ ITULO 11. como vai? Neste caso. 9. O formato de saida ´: a e ze sa 10. 7. A sa´ do seu programa deve ser algo como: ıda . Estes a dados est˜o separados por ponto e v´ a ırgula.0.0 aprovado antonio silva 9. a m´dia das e duas notas e se o aluno foi aprovado ou n˜o (media ≥ 5).9: Fa¸a um programa que leia os dados do arquivo gerado no exerc´ c ıcio anterior e salve-os num novo arquivo utilizando uma sa´ formatada como ıda indicado abaixo.0. . Em cada linha do arquivo h´ o nome de um aluno e duas notas.. c o 11..10: Escreva um programa que leia um arquivo texto contendo linhas de dados. O formato dos dados e o seguinte: ze sa. ”10”. char telefone [10]. ENTRADA E SA´ IDA POR ARQUIVOS 11. FORMATO: [nome] tem [idade] anos e [altura] de altura Tel.8: Escreva um programa para armazenar o telefone de 5 amigos. pessoal! a arquivo2. antonio silva: 9. Cada um contendo o o ´ texto ”Texto do arquivo [NUMERO DO ARQUIVO]”. os caracteres na primeira e d´cima primeira posi¸˜o s˜o iguais e ca a nos dois arquivos.11: Fa¸a um programa que receba o nome de um arquivo e gere uma c´pia..: [telefone] 11. O programa deve obrigatoriamente usar a estrutura typedef s t r u c t _PESSOA { char nome [50]. Existe um ponto e v´ ırgula ao final de cada linha.0 8. Por a exemplo: arquivo1. i n t idade . 10.c Oi.0 aprovado 11.c Ol´.12: Escreva um programa que compare dois arquivos especificados pelo usu´rio e imprima sempre que os caracteres dos dois arquivos coincidirem. 11.0 9.7: Utilizando a fun¸˜o do exerc´ anterior fa¸a um programa que gere 10 ca ıcio c arquivos com o nome ”Teste”e extens˜es ”01”.0.0.0 7.0 8.

9.a 203 indicando que os primeiros caracteres dos arquivos s˜o iguais (O) bem como o a d´cimo primeiro (a) e .´ 11.O 11 . LENDO E ESCREVENDO ARQUIVOS BINARIOS 1 .

ENTRADA E SA´ IDA POR ARQUIVOS .204 CAP´ ITULO 11.

E O Y c m w 0 1 2 3 4 5 6 7 8 9 10 11 12 Tabela A. 8 B L V ’ j t ~ 7 bel dc1 esc % / 9 C M W a k u del 8 bs dc2 fs & 0 : D N X b l v 9 ht dc3 gs ‘ 1 . Para saber qual ´ o c´digo de um caracter na base 10 junte o d´ e o ıgito da primeira coluna da tabela com o d´ ıgito da primeira linha da tabela. Cada caracter ´ representado por um c´digo de 8 e o bits.2. Eles tˆm o sige e nificado mostrado na Tabela A.Apˆndice A e Tabela ASCII A tabela ASCII (American Standard for Information Interchange) ´ usada por e grande parte da ind´stria de computadores para a troca de informa¸˜es e aru co mazenamento de caracteres. A Tabela A. 205 .1: Conjunto de caracteres ASCII Os caracteres de controle listados acima.1 mostra os c´digos para a tabela ASCII de 7 bits. Por exemplo. Existe o uma table extendida para 8 bits que inclue os caracteres acentuados. o c´digo da letra a min´scula ´ 97 na base 10. o u e 0 nul nl dc4 rs ( 2 ¡ F P Z d n x 1 soh vt nak us ) 3 = G Q [ e o y 2 stx ff syn sp * 4 ¿ H R \ f p z 3 etx cr etb ! + 5 ? I S ] g q { 4 eot so can ” . 6 @ J T ^ h r — 5 enq si em # 7 A K U _ i s } 6 ack dle sub $ . servem para comunica¸˜o com ca perif´ricos e controlar a troca de dados entre computadores.

206 ˆ APENDICE A.2: Conjunto de c´digos especiais ASCII e seus significados o . TABELA ASCII Carac nul stx eot ack bs lf ff so dle dc2 dc4 syn can sub fs rs sp Descri¸˜o ca Caractere nulo Come¸o de texto c Fim de transmiss˜o a Confirma¸˜o ca Volta um caractere Passa para pr´xima linha o Passa para pr´xima p´gina o a Shift-out Data line escape Controle de dispositivo Controle de dispositivo Synchronous idle Cancela Substitui Separador de arquivo Separador de registro Espa¸o em branco c Carac soh etx enq bel ht vt cr si dc1 dc3 nak etb em esc gs us Descri¸˜o ca Come¸o de cabe¸alho de transmiss˜o c c a Fim de texto Interroga Sinal sonoro Tabula¸˜o horizontal ca Tabula¸˜o vertical ca Passa para in´ da linha ıcio Shift-in Controle de dispositivo Controle de dispositivo Negativa de confirma¸˜o ca Fim de transmiss˜o de um bloco a Fim de meio de transmiss˜o a Escape Separador de grupo Separador de unidade Tabela A.

a co asm: Indica que c´digo escrito em assembly ser´ inserido junto comandos C. char: O tipo de dados mais simples em C. indicar um comando al´m e de v´rias outras fun¸˜es.Apˆndice B e Palavras Reservadas Palavras reservadas. Palavras reservadas n˜o podem ser usadas como nomes a co a de vari´veis ou fun¸˜es. switch..while e faz que eles passem para a pr´xima itera¸˜o. Servem para declarar tipos o ca de dados ou propriedades de um objeto da linguagem.. a 207 . do: Comando de repeti¸˜o usado em conjunto com o comando while . and do. o ca ´ default: E usado dentro do comando switch para aceitar qualquer valor n˜o a definido previamente com um comando case. normalmente usado para armazenar caracteres. Veja volatile. case: Comando usado dentro do comando switch. a break: Comando usado para sair incondicionalmente dos comandos for. e continue: Comando que interrompe os comandos de repeti¸˜o for . tamb´m as vezes chamadas de palavra chave. o a auto: Modificador que define a classe de armazenamento padr˜o. const: Modificados de dados que impede que uma vari´vels seja modificada. ca ou do. while . Pela ca defini¸˜o do comando o la¸o ´ sempre executado pelo menos uma vez. ca c e double: Tipo de dados usado para armazenar valores de ponto flutuante em precis˜o dupla... servem para e prop´sitos especiais nas linguagens de programa¸˜o. while. a Esta palavra n˜o existia nas primeiras vers˜es da linguagem C e foi introa o duzida pelo comitˆ ANSI C.while.

sizeof: Operador que retorna o tamanho em bytes do item fornecido. Em C o comando for ´ um comando de repeti¸˜o co e ca extremamente flex´ ıvel. incremento e ca e ca a se¸˜es condicionais. for: Comando de repeti¸˜o que cont´m inicializa¸˜o de vari´veis. . a a register: Especificador de classe de armazenamento que pede que. static: Modificador usado para significar que o compilador deve preparar o c´digo de forma a reter o valor da vari´vel. extern: Modificador de dados que indica que uma vari´vel ir´ ser declarada a a em outra ´rea do programa. caso seja poss´ ıvel. Tamb´m pode ca ca ca e ser usado para retornar um unico valor. Neste tipo 2 bytes s˜o usados para armazenar os dados. Nos computadores modernos o tipo long tem a mesma precis˜o que o tipo int e s˜o usados 4 bytes. u goto: Comando que causa um pulo para uma posi¸˜o do programa marcada ca com um r´tulo. PALAVRAS RESERVADAS else: Comando que indica um bloco de comandos alternativo que deve ser executado quando a condi¸˜o testada pelo comando if foi avaliada como ca FALSA. a float: Tipo usado para armazenar valores de ponto flutuante. a signed: Modificador usado para indicar que uma vari´vel pode armazenar tanto a valores positivos como negativos. o a struct: Usado para combinar C vari´veis de tipos diferentes na mesma estrua tura. long: Tipo de dados usado para armazenar valores inteiros com precis˜o maior a do que o tipo int. o if: Comando de testes usado para mudar o fluxo do programa baseada em uma decis˜o VERDADE/FALSO.208 ˆ APENDICE B. enum: Tipo definido pelo usu´rio que permite a defini¸˜o de vari´veis que ir˜o a ca a a aceitar somente certos valores. a int: Tipo de dados usado para armazenar valores inteiros. ´ short: Tipo de dados usado para armazenar valores inteiros em precis˜o menor a do que o tipo int. permitindo in´meras possibilidades. uma vari´vel deve ser armazenada nos registradores do procesa sador. return: Comando que causa o fluxo de instru¸˜es do programa abandonar a co fun¸˜o em execu¸˜o e retornar para a fun¸˜o que chamou.

protected.209 switch: Comando de desvio usado para permitir que o fluxo do programa possa ser mudado para v´rias dire¸˜es diferentes. private. except. ca Em adi¸˜o a estas as seguintes palavras s˜o reservadas em C++: ca a catch. c o unsigned: Modificador usado para significar que uma vari´vel conter´ somente a a valores positivos. public. volatile: Modificador que significa que uma vari´vel pode ser alterada. try. this. template. new. a union: Palavra chave usada para permitir m´ltiplas vari´veis partilharem o u a mesmo espa¸o na mem´ria. friend. a while: Comando de teste que executa uma se¸˜o de c´digo enquanto uma ca o condi¸˜o retorna VERDADE. virtual. class. Usado em conjunto com o a co comando case. Caso queira escrever programas que possam ser convertidas para a linguagem C++ ´ aconselh´vel n˜o us´-las. throw. operator. e a a a . finally. inline. void: Palavra usada para significar que ou a fun¸˜o n˜o retorna nada ou que ca a um ponteiro deve ser considerado gen´rico ou ser capaz de apontar para e qualquer tipo de dados. delete. typedef: Modificador usado para criar novos nomes para tipos j´ existentes.

PALAVRAS RESERVADAS .210 ˆ APENDICE B.

Bibliografia 211 .