P. 1
apostilaC

apostilaC

|Views: 1.889|Likes:
Publicado porWagner Spigotti

More info:

Published by: Wagner Spigotti on Apr 26, 2011
Direitos Autorais:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/18/2012

pdf

text

original

Sections

  • Introdu¸c˜ao
  • 1.1 Sucessos e Fracassos da Computa¸c˜ao
  • Figura 1.1: Fotografia de um circuito integrado de microprocessador Pentium
  • Tabela 1.1: Transistores por chip nos microprocessadores da Intel
  • 1.2 Um Pouco da Hist´oria da Computa¸c˜ao
  • 1.2.1 O In´ıcio
  • 1.2.2 A Era Moderna
  • Figura 1.5: Fotografia da Difference Engine
  • 1.2.3 O Desenvolvimento durante as Grandes Guerras
  • Tabela 1.2: Tempo de execu¸c˜ao das instru¸c˜oes aritm´eticas no ENIAC
  • 1.2.4 As Gera¸c˜oes
  • 1.3 O Hardware
  • Figura 1.7: Diagrama B´asico de um Computador Digital
  • 1.3.1 Microcomputadores
  • Tabela 1.3: Exemplos de Microprocessadores
  • 1.3.2 Mem´orias
  • Figura 1.8: N´ıveis de hierarquia da mem´oria de um computador
  • 1.3.3 Bits e Bytes
  • Tabela 1.4: Abrevia¸c˜oes usadas em referˆencias `as mem´orias
  • 1.3.4 Perif´ericos
  • 1.4 O Software
  • Figura 1.10: Ciclo de desenvolvimento de um programa
  • 1.5 Um programa em C
  • Algoritmos
  • 2.1 Introdu¸c˜ao
  • 2.2 Primeiros Passos
  • 2.3 Representa¸c˜ao
  • 2.3.1 Linguagem Natural
  • 2.3.2 Fluxogramas
  • Figura 2.1: S´ımbolos mais comumente usados em fluxogramas
  • Figura 2.2: Fluxograma para resolver uma equa¸c˜ao do primeiro grau
  • 2.3.3 Pseudo-Linguagem
  • 2.4 Modelo de von Neumann
  • 2.5 Estruturas B´asicas de Algoritmos
  • 2.5.1 Comandos de leitura
  • 2.5.2 Comandos de escrita
  • 2.5.3 Express˜oes
  • 2.5.4 Comandos de atribui¸c˜ao
  • 2.5.5 Comandos de controle
  • Figura 2.4: Fluxograma do comando se ... ent~ao ... sen~ao
  • 2.5.6 Comandos de repeti¸c˜ao
  • Figura 2.5: Fluxograma para decidir se deve levar um guarda-chuva
  • 2.6 Exemplos de Algoritmos
  • 3.1 Introdu¸c˜ao
  • 3.2 Tipos de Dados
  • 3.2.1 Tipos B´asicos
  • 3.2.2 Modificadores de tipos
  • 3.3 Constantes Num´ericas
  • Tabela 3.1: Tipos de dados definidos pelo Padr˜ao ANSI C
  • 3.3.1 Constantes Inteiras na base 10
  • 3.3.2 Constantes Inteiras Octais
  • 3.3.3 Constantes Inteiras Hexadecimais
  • 3.3.4 Convers˜ao entre Bases
  • 3.3.5 Constantes em Ponto Flutuante
  • 3.4 Constantes Caracteres
  • Tabela 3.6: Exemplos de constantes caractere
  • 3.4.1 Constantes Cadeias de Caracteres
  • Tabela 3.7: Exemplos de caracteres invis´ıveis
  • 3.5 Vari´aveis
  • 3.5.1 Nomes das Vari´aveis
  • 3.5.2 Declara¸c˜ao de vari´aveis
  • 3.5.3 Atribui¸c˜ao de valores
  • 4.1 Introdu¸c˜ao
  • 4.2 Biblioteca Padr˜ao
  • 4.3 Sa´ıda - A Fun¸c˜ao printf
  • 4.3.1 C´odigos de Convers˜ao
  • Tabela 4.1: C´odigos de Convers˜ao para leitura e entrada de dados
  • Listing 4.2: Exemplo de justifica¸c˜ao de resultados
  • Listing 4.3: Exemplo de uso de especificador de precis˜ao
  • 4.4 Entrada - A Fun¸c˜ao scanf
  • 4.5 Lendo e Imprimindo Caracteres
  • 4.5.1 Fun¸c˜oes getchar e putchar
  • 4.5.2 Lendo e Imprimindo Cadeias de Caracteres
  • 4.5.3 Lendo e Imprimindo cadeias com scanf e printf
  • Listing 4.7: Exemplo de uso de printf e scanf na leitura de cadeias
  • 4.5.4 Lendo e Imprimindo cadeias com gets e puts
  • Listing 4.8: Exemplo de uso de puts e gets na leitura de cadeias
  • 4.5.5 A Fun¸c˜ao fgets
  • Operadores e Express˜oes
  • 5.1 Introdu¸c˜ao
  • 5.2 Operador de Atribui¸c˜ao
  • 5.3 Operadores Aritm´eticos
  • 5.4 Operadores Relacionais e L´ogicos
  • 5.4.1 Operadores Relacionais
  • 5.4.2 Operadores L´ogicos
  • Tabela 5.6: Precedˆencia dos operadores l´ogicos e relacionais
  • 5.5 Operadores com Bits
  • 5.6 Operadores de Atribui¸c˜ao Composta
  • 5.7 Operador v´ırgula
  • 5.8 Operador sizeof()
  • 5.9 Convers˜ao de Tipos
  • 5.10 Regras de Precedˆencia
  • 6.1 Introdu¸c˜ao
  • 6.2 Blocos de Comandos
  • 6.3 Comandos de Teste
  • 6.3.1 Comando if
  • 6.3.2 Comando switch
  • Listing 6.1: Programas com if´s em escada e aninhados
  • 6.3.3 Comando Tern´ario
  • 6.4 La¸cos de Repeti¸c˜ao
  • 6.4.1 Comando for
  • Listing 6.5: Exemplo de comando for com testes sobre outras vari´aveis
  • Listing 6.6: Exemplo de comando for sem altera¸c˜ao da vari´avel de controle
  • Listing 6.7: Exemplo de comando for sem teste de fim
  • 6.4.2 Comando while
  • 6.4.3 Comando do-while
  • 6.5 Comandos de Desvio
  • 6.5.1 Comando break
  • 6.5.2 Comando continue
  • 6.5.3 Comando goto
  • 6.5.4 Fun¸c˜ao exit()
  • 6.5.5 Comando return
  • 7.1 Introdu¸c˜ao
  • 7.2 Declara¸c˜ao de Vetores Unidimensionais
  • Tabela 7.1: Passos executados durante o algoritmo da bolha
  • 7.3 Cadeias de Caracteres
  • 7.4 Declara¸c˜ao de Vetores Multidimensionais
  • 7.5 Vetores de Cadeias de Caracteres
  • 7.6 Inicializa¸c˜ao de Vetores e Matrizes
  • Fun¸c˜oes
  • 8.1 Introdu¸c˜ao
  • 8.2 Forma Geral
  • 8.3 Prot´otipos de Fun¸c˜oes
  • 8.4 Escopo de Vari´aveis
  • 8.4.1 Vari´aveis Locais
  • Listing 8.3: Defini¸c˜ao de vari´avel dentro de um bloco
  • 8.5 Vari´aveis Globais
  • 8.6 Parˆametros Formais
  • 8.6.1 Passagem de Parˆametros por Valor
  • 8.6.2 Passagem de Parˆametros por Referˆencia
  • 8.6.3 Passagem de Vetores e Matrizes
  • 8.7 O Comando return
  • 8.8 Recurs˜ao
  • 8.9 Argumentos - argc e argv
  • Ponteiros
  • 9.1 Introdu¸c˜ao
  • 9.2 Opera¸c˜oes com Ponteiros
  • 9.2.1 Declara¸c˜ao de Ponteiros
  • 9.2.2 Os Operadores Especiais para Ponteiros
  • Figura 9.4: Atribui¸c˜ao de endere¸co de uma vari´avel a um ponteiro
  • 9.2.3 Atribui¸c˜ao de Ponteiros
  • Figura 9.5: Uso de um ponteiro para copiar valor de uma vari´avel
  • Listing 9.1: Exemplo de atribui¸c˜ao de ponteiros
  • Figura 9.6: Exemplos de atribui¸c˜oes de ponteiros
  • 9.2.4 Incrementando e Decrementando Ponteiros
  • Listing 9.2: Exemplos de opera¸c˜oes com ponteiros
  • 9.2.5 Compara¸c˜ao de Ponteiros
  • Listing 9.4: Exemplo de compara¸c˜ao de ponteiros
  • 9.3 Ponteiros e Vetores
  • Listing 9.5: Exemplo de altera¸c˜oes inv´alidas sobre ponteiros
  • 9.4 Ponteiros e Cadeias de Caracteres
  • Listing 9.8: Exemplo de ponteiro para cadeia de caracteres
  • 9.5 Aloca¸c˜ao Dinˆamica de Mem´oria
  • 9.6 Ponteiros e Matrizes
  • Listing 9.12: Exemplo de matriz normal sem uso de ponteiros
  • 9.7 Vetores de Ponteiros
  • 9.8 Ponteiros para Ponteiros
  • Listing 9.16: Exemplo de uso de ponteiros para ponteiros usando fun¸c˜oes
  • Listing 9.17: Continua¸c˜ao do exemplo 9.16
  • Estruturas
  • 10.1 Introdu¸c˜ao
  • 10.2 Defini¸c˜oes B´asicas
  • 10.3 Atribui¸c˜ao de Estruturas
  • 10.4 Matrizes de Estruturas
  • 10.5 Estruturas e Fun¸c˜oes
  • Listing 10.3: Passagem de estruturas para fun¸c˜oes
  • 10.6 Ponteiros para Estruturas
  • Listing 10.5: Ordena¸c˜ao de Estruturas (continua¸c˜ao)
  • 11.1 Introdu¸c˜ao
  • 11.2 Fluxos de Dados
  • 11.2.1 Fluxos de Texto
  • 11.2.2 Fluxo Bin´ario
  • 11.2.3 Arquivos
  • 11.3 Fun¸c˜oes de Entrada e Sa´ıda
  • Tabela 11.1: Exemplos de fun¸c˜oes de Entrada e Sa´ıda
  • 11.4 In´ıcio e Fim
  • 11.4.1 Abrindo um Arquivo
  • 11.4.2 Fechando um Arquivo
  • 11.4.3 Fim de Arquivo
  • 11.4.4 Volta ao In´ıcio
  • 11.5 Lendo e Escrevendo Caracteres
  • Listing 11.2: Exemplo de leitura e escrita de caracteres
  • Listing 11.3: Exemplo de leitura e escrita de caracteres
  • 11.6 Testando Erros
  • 11.7 Lendo e Escrevendo Cadeias de Caracteres
  • 11.8 Entrada e Sa´ıda Formatada
  • Listing 11.5: Exemplo de leitura e escrita de cadeias de caracteres
  • Listing 11.6: Exemplo de leitura e escrita de dados formatados
  • 11.9 Lendo e Escrevendo Arquivos Bin´arios
  • Listing 11.7: Exemplo de leitura e escrita na forma bin´aria
  • Tabela ASCII
  • Palavras Reservadas

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

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

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

8 ´ CONTEUDO .

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

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

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

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

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

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

18 LISTINGS .

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

muitas promessas n˜o foram cumprio ca a das e falhas gigantescas aconteceram.000 7. apontam o que n˜o conseguimos ou n˜o queremos ver e mostram que o a a rei est´ nu. H´ uma frase de Picasso que diz: ”Computadores s˜o est´pidos.20 CAP´ ITULO 1.500 5.250 2.”Moore achava que esta lei seria v´lida soa mente at´ 1975.100. os el´trons. a a a u . 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. est˜o diminuido de o o a tamanho. do mundo. pode-se e a e observar a evolu¸˜o dos microprocessadores usados em nossos computadores.1: Fotografia de um circuito integrado de microprocessador Pentium. Se o tamanho diminuir al´m dos el´trons estaremos em e e outro dom´ ınio. na hist´ria da computa¸˜o.000 120.000. artistas geo niais. J´ se houve e a falar em tamanho de transistores medidos em n´meros de el´trons. e estamos nos aproximando da fronteira final. 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. no entanto. ou seja a e uma corrente el´trica.1: Transistores por chip nos microprocessadores da Intel Os transistores.000 3. Os fios conduzem correntes de el´trons e os transistores e e controlam este fluxo. que comp˜em os circuitos eletrˆnicos. Como em diversas quest˜es.500. Devemos nos u e lembrar que toda a tecnologia atual est´ baseada em fluxo de el´trons.000 Tabela 1.000. No entanto. INTRODUCAO ¸˜ Figura 1.500 1. ela continua v´lida at´ hoje.1. Na tabela 1.180.000 24.000 42.000 275.

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

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

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

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

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

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

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

A t´cnica a e mais comum para conseguir este paralelismo ´ conhecida como pipelining. Atualmente esta unidade ´ bastante sofisticada e e diversos m´todos s˜o empregadas para acelerar a execu¸˜o das instru¸˜es. em uma linha de co montagem de uma f´brica de autom´veis. porque ´ exatamente isto que a t´cnica e e faz. por exema e plo. E muito comum. a Unidade Aritm´tica e L´gica (UAL): local onde as transforma¸˜es sobre e o co os dados acontecem. mais de um autom´vel ´ montado a o o e . Por exemplo. Este termo pode ca co ser traduzido por linha de montagem. sendo distribu´ pela Unidade Central de Procesıda samento. o que caracteriza o processamento paralelo. 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. As vezes a UCP conta com mais de uma de cada uma destas unidades. e a ca co Alguns processadores duplicam circuitos para permitir que mais de uma ´ operac˜o aritm´tica seja executada por vez. Atualmente as ca o unidades de controle s˜o capazes de executar mais de uma instru¸˜o por a ca ciclo de m´quina. 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 alguns computadores mais simples esta unidade n˜o existe a independentemente. INTRODUCAO ¸˜ Unidade de Controle (UC): comanda a opera¸˜o do computador. chamada de u u unidade de ponto flutuante. e que ser´ detalhada mais adiante.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. 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. 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. uma linha de montagem de instru¸˜es. 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.

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

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

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

9 mostramos os diversos tamanhos dos dados. Elas s˜o modific´veis e de acesso r´pido tanto na leitura quanto na a a a grava¸˜o. Diferentemente das EEPROMs. o a ent˜o. 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. mem´rias EDO.3. que s˜o os a d´ ıgitos usados na base dois. Um conjunto de 8 bits forma o byte. 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. Considere que este tamanho ´ relae cionado com a quantidade m´xima de algarismos que um n´mero pode ter para a u ser processado.9: Tamanho de Bits. etc. a base usada nos computadores. j´ que o processador est´ se adiantando e a a recebendo o que poder´ ser o pr´ximo dado a ser processado. Lembrea o u se que as duas leituras s˜o atendidas uma de cada vez. ela deve ser apagada em blocos de endere¸os. Da mesma forma o a computador pode processar 32 bits de cada vez e a mem´ria ter largura 64 bits. BIT BYTE 8 BITS PALAVRA 32 BITS 4 BYTES Figura 1. 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. INTRODUCAO ¸˜ ser apagada e reprogramada eletricamente. . 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.32 CAP´ ITULO 1. Na Figura 1. 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. ou seja econoa o mizando uma leitura. 1. a menor unidade de informa¸˜o o e ca que o computador armazena.3 Bits e Bytes A mem´ria do computador ´ composta de bits. ler duas palavras da mem´ria para poder processar um n´mero. Um bit pode conter o valor 0 ou 1. Caso sua mem´ria tenha palavras de 32 bits o processador dever´. Uma palavra de mem´ria ´ um conjunto de bytes. Muitas siglas aparecem e desaparecem quando falamos de mem´rias ca o RAM. o e Atualmente a maioria dos computadores tem palavras de mem´ria com largura o de 32 (4 bytes) ou 64 (8 bytes) bits. SIMM. Existem as DRAM. o Isto pode acelerar o processamento.

3. a e e a a Para que um computador execute alguma tarefa primeiro se desenvolve um algoritmo. ou seja o 1024 bytes.1.4. H´ perif´ricos de entrada. o que n˜o se vˆ nem se toca. Em seguida e . outros de sa´ e alguns a e e a e ıda que servem tanto para entrada como sa´ de dados. 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.5: Exemplos de perif´ricos e 1. a a o h´ tamb´m os perif´ricos. A tabela 1. o que se vˆ e o que se toca. ca Por exemplo 1 Kbyte de mem´ria corresponde a 2 elevado a 10 (210 ). O SOFTWARE 33 Devido a base 2 o fator kilo tem um significado diferente em computa¸˜o.4 O Software Tudo isto que sobre o que acabamos de escrever constitui o hardware do computador. os dados n˜o ficam guardados somente na mem´ria.4: Abrevia¸˜es usadas em referˆncias `s mem´rias. H´ perif´ricos que s˜o usados para permitir a a e a intera¸˜o entre os usu´rios e o computador. Na Tabela 1. Da mesma forma 1 Megabyte corresponde a 1024 x 1024 bytes e 1 Gigabyte ´ igual a 1024 x 1024 x 1024 bytes.4 Perif´ricos e Como j´ mencionamos antes. que ´ a receita de como o problema deve ser resolvido. 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.5 ilustra alguns destes ca a perif´ricos. Perif´ricos n˜o servem ıda e a somente para armazenar dados. A partir de agora falaremos brevemente e no software. mas tamb´m est´ l´.4 est˜o mostradas as e a diversas abrevia¸˜es usadas quando se fazem referˆncias `s mem´rias. co e a o 1.

caso necess´rio. a dificuldade de manuten¸˜o dos programas. INTRODUCAO ¸˜ este algoritmo deve ser traduzido para uma linguagem que possa ser entendida pelo computador ou que possa ser traduzida para esta linguagem. tarefa que normalmente se chama de montar o programa.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. Apple e Motorola Os microprocessadores PowerPC podem ser usados para equipar desde sistemas embutidos at´ computadores de alto deseme penho. 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. 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. 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 .34 CAP´ ITULO 1. Pascal: Usada em ensino de linguagens e desenvolvimento de sistemas. maior tempo de desenvolvimento etc. Alguns exemplos de linguagens de programa¸˜o s˜o: ca a Fortran: Usada em programa¸˜o cient´ ca ıfica e engenharia. e ca o co a Deste modo era ´ mais f´cil escrever os algoritmos. por estarem mais pr´ximas da o lingugagem natural empregada pelos serem humanos.8 * 8 e o segundo numero add r5. Um programa escrito em assembly deve ser traduzido para a representa¸˜o ca bin´ria. a ca O PowerPC ´ um microprocessador criado em 1991 por um cons´rcio fore o mado pela IBM. No in´ da ıcio computa¸˜o eletrˆnica com programas armazenados. Por exemplo. que ´ uma representa¸˜o em mnemˆnicos das instru¸˜es de m´quina. . Este tipo de programa¸˜o pode levar a se escrever programas muito a ca eficientes. Al´m e e deste fato h´ outros problemas tais como: dificuldade de leitura por humanos. ca Para evitar estes problemas foram desenvolvidas as linguagens de programa¸˜o chamadas de linguagens de alto n´ ca ıvel. a Com a evolu¸˜o da computa¸˜o os programas passaram a ser escritos em ca ca assembly. COBOL: Usada em ambientes comerciais.r4.4 * O primeiro numero a ser somado e 4. li r4. 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. A Apple usou este microprocessador para equipar suas m´quinas at´ a e 2006. um fragmento e a de um programa escrito em assembly do processador PowerPC ´: e li r3. 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. co a ca ser executada e. onde como achar os os dados que ser˜o opera a ados.

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

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. Costuma-se chamar esta corre¸˜o de manunten¸˜o do programa. ı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. ca a a Isto significa que o programa n˜o para ser executado n˜o precisa ser traduzido a a . Durante o uso. INTRODUCAO ¸˜ Liga¸˜o: Em inglˆs esta passo ´ conhecido por link edition. Algumas linguagens de programa¸˜o n˜o s˜o compiladas e sim interpretadas. 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. 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.10: Ciclo de desenvolvimento de um programa. Por exemplo. 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. normalmente vˆm com o programa compilador. 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. Uso do Programa: O programa foi entregue aos seus usu´rios para ser usaa do.36 CAP´ ITULO 1. erros que n˜o foram encontrados durante o desenvolvia mento do programa podem ser descobertos e precisam ser corrigidos. os comandos de a entrada e sa´ de dados. em C o os trechos de programa que interagem com os usu´rios.

planilhas eletrˆnicas. a O editor pode ser t˜o simples quanto o Notepad. O Sistema Operacional controla a aloca¸˜o de recursos tais como: comunica¸˜o com os ca ca usu´rios. Outros sistemas muito usados s˜o os da fam´ a ılia Windows. Um usu´rio pode estar oua a vindo m´sica. 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. O. 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). O SOFTWARE 37 para linguagem de m´quina. tempo que cada programa pode roa c o dar etc. bancos de dados. N˜o ser´ necess´rio nenhum ambiente mais complexo. espa¸o em discos. Atualmente a maior parte dos computadores possui somente um processador. Aplicativos t´ ıpicos que rodam nos computadores s˜o: editores de texto. Um programa em Java ´ traduzido para uma linguagem e intermedi´ria e depois interpretado por meio de uma chamada m´quina virtual. 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. Alguns dos sistemas operacionais conhecidos s˜o os baseados no padr˜o a a UNIX. . portanto. digitando um texto e imprimindo um outro documento ao mesmo u tempo. compiladores. considere o problema de gerenciar como os diversos programas que um usu´rio normalmente a utiliza partilhar˜o o processador do computador. Para compilar empregaremos o compilador gcc que ´ gratuito e pode ser obtido na Internet e como veremos adiante. o processo de tradu¸˜o antecipada do programa. etc. 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. o tradutor traduzisse todo o discurso e depois o lesse. Em Java ocorre um processo e um pouco diferente. Um programa compilado funciona como se primeiro. Para gerenciar os recursos do computador existe um programa especial normalmente chamado de Sistema Operacional (S.4. o jogos. N˜o h´. traduz cada uma destas intru¸˜es para linguagem de m´quina e as exco a ecuta. por exemplo o LINUX. A medida que ele pronuncia seu discurso um tradutor repete as frases na linguagem destino. A linguagem Basic ´ uma linguagem interpretada. a a N˜o h´ efetivamente uma compila¸˜o para linguagem de m´quina. uso de mem´ria. Portanto. 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. a a a tal como um Integrated Development Environment (IDE). 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. 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. a processadores de texto. Por exemplo.1. A execu¸˜o a a ca a ca de um programa escrito em uma linguagen interpretada ´ mais lenta.).

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

ıcio a A fun¸˜o termina com o comando return 0.8: Qual a diferen¸a b´sica entre mem´rias ROM e RAM? c a o 1. . outra de perif´ricos de c e e e sa´ e finalmente uma de perif´ricos de entrada e sa´ ıda e ıda. return 0. As chaves ({ e }) marcam o in´ e o ca ıcio fim da fun¸˜o. e 1. 1.5: Qual o n´mero exato de bytes em 64Kbytes? u 1.2: Quais os principais componentes de um computador? 1. Para imprimir o texto Alo Mundo! o programa usa a fun¸˜o ca ca printf. ca que foi quem iniciou a execu¸˜o do programa.3: Quais as diferen¸as entre um microprocessador e o microcomputador? c 1. liste alguns aplicativos que vocˆ normalmente e a e usa. #include < stdio .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. que avisa ao sistema operacional.6: Se vocˆ j´ usa computadores. 1.9: Procure em manuais.1. o 1. a a Listing 1.4: Dˆ exemplos de microprocessadores e de microcomputadores.h > i n t main ( void ) { printf ( " Alo Mundo !\ n " ).1: O que ´ o hardware do computador? e 1. internet e outras fontes quais s˜o os tempos de acesso a das mem´rias RAMs atuais. Este programa simples ilustra alguns das estruturas b´sicas que a ser˜o usadas nos programas C que ser˜o apresentados neste livro.1: Exemplo de Programa em C. O in´ e o fim do texto a ser impresso s˜o marcados pelo caractere ". uma de perif´ricos de entrada.5.7: Defina Sistema Operacional. } Exerc´ ıcios 1. 1. 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). que o programa terminou sem ca problemas.10: Fa¸a trˆs listas.

INTRODUCAO ¸˜ .40 CAP´ ITULO 1.

ou seja um algoritmo. Esta seq¨ˆncia de passos ´ chamada de algoritmo. 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. c ue ca ´ uma receita para preparar um bolo. E preciso que encontremos uma seq¨ˆncia de passos que permitam ue que o problema possa ser resolvido de maneira autom´tica e repetitiva. Al´m a e disto ´ preciso definir como os dados que ser˜o processados ser˜o armazenae a a dos no computador. 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. Uma grande parte destas atividades n˜o est˜o relacionadas com computa¸˜o. Caso isto fosse 41 .Cap´ ıtulo 2 Algoritmos 2. Um a a ca exemplo simples e prosaico. Isto porque n˜o existe um conjunto de reca a gras. que nos permita criar algoritmos. de como um problema pode ser resolvido caso forne¸amos uma seq¨ˆncia de passos que mostrem a maneira de obter a solu¸˜o. ue e Usamos algoritmos em diversas atividades que realizamos diariamente. ca A no¸˜o de algoritmo ´ central para toda a computa¸˜o.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. 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. 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. Portanto. 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.

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

Observar que nesta a representa¸˜o do algoritmo cada linha cont´m uma instru¸˜o. Caso a seja igual a 0.1. Este algoritmo escrito (Algoritmo ca a a e ıvel 2. ir ao trabalho. PRIMEIROS PASSOS 43 2. Um fator importante ´ e que pode haver mais de um algoritmo para resolver um determinado problema. ca e ca Algoritmo 2. decidir qual o melhor a caminho para chegar a um lugar. que para facilitar o manuseio do dado. Ap´s os dois primeiros passos o algoritmo executa uma o . serem digitados em um teclado pelo usu´rio a que est´ usando o algoritmo.2. voltar para casa. Os valores podem. rapidez. Se isto n˜o fosse verdade.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.1: Exemplo de Algoritmo. j´ que n˜o ´ poss´ dividir por 0. o a n˜o conseguir´ a ıamos sair de casa pela manh˜. para ir de casa at´ o trabalho. que hora e a e sair de casa. recebe um nome. 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. Neste exemplo demos os nomes a. Os dois primeiros e passos do algoritmo servem para o algoritmo obter os valores dos coeficientes a e b.2. Como exemplo de um algoritmo matea u m´tico. etc. a equa¸˜o n˜o possui ca a solu¸˜o. qual o melhor meio de transporte etc. b e x as posi¸˜es de mem´ria usadas pelo programa co o para armazenar dados.2 Primeiros Passos ´ E claro que todos n´s sabemos construir algoritmos. Para que tudo isto seja feito ´ necess´rio uma s´rie de entradas do tipo: a que hora acordar. mostrado no Algoritmo 2. 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. A escolha ser´ feita em ca c a fun¸˜o do crit´rio que melhor se adequar as nossas necessidades. conforto. posso escolher diversos meios de e transporte em fun¸˜o do pre¸o. O valor digitado vai para uma posi¸˜o da mem´ria a ca o do computador. Por exemplo. etc. por exemplo. 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.

44 CAP´ ITULO 2. 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. O ultimo passo. o algoritmo executa as instru¸˜es entre a palavra ent~o e sen~o. o algoritmo executa as instru¸˜es entre sen~o e fim se.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. Caso a seja diferente a zero. e portanto. No caso de a ser diferente de zero. Atualmente a maneira mais comum de representarse algoritmos ´ atrav´s de uma pseudo-linguagem ou pseudo-c´digo.2: Algoritmo para resolver uma equa¸˜o do primeiro grau. Isto significa calcular o resultado da equa¸˜o co a ca e atribuir este resultado ` x. como nos exemplos anteriores. 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 ’’. . Esta mensagem normalmente aparece em a um monitor de v´ ıdeo. 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. imprime uma mensagem co a a de aviso para o usu´rio e termina. x ca fim se fim instru¸˜o de teste para verificar se o valor de a ´ diferente de 0. desta op¸˜o ´ a impress˜o do a ´ ca e a resultado da equa¸˜o. ca 2. Neste caso ca e podemos ter duas respostas e o computador ir´ escolher entre dois caminhos a independentes e exclusivos. ALGORITMOS Algoritmo 2. ca N˜o existe consenso entre os especialistas sobre qual seria a melhor maneira a de representar um algoritmo. Pseudo-linguagem: Emprega uma linguagem intermedi´ria entre a linguagem a natural e uma linguagem de programa¸˜o para descrever os algoritmos.

Sa´ ıda: Resultado media do aluno e se ele foi aprovado ou n˜o.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.3. n2 e n3 Calcular m´dia.3.3.2 mostra um fluxograma para resolver este problema.0 para ser aprovado. e Entrada: Notas n1 . para calcular a m´dia de um aluno e que faz trˆs provas e precisa de obter m´dia acima de 5.0 imprimir que o aluno foi aprovado e Caso contr´rio imprimir que o aluno foi reprovado. 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.0).1. REPRESENTACAO ¸˜ 45 2. Como exemplo de um algoritmo escrito em forma de fluxograma. O Algoritmo 2. escrito em linguagem natural. e e Algoritmo 2. vamos ca considerar o algoritmo 2. co ca Existem algumas formas geom´tricas que s˜o empregadas normalmente e que e a est˜o mostradas na Figura 2. no entanto nesta apostila estas ser˜o a suficientes para os exemplos que ser˜o mostrados.2.1: S´ ımbolos mais comumente usados em fluxogramas.2 para resolver uma equa¸˜o do primeiro grau da forma ax + b = 0. . a in´ ıcio Obter as notas n1 .3: Algoritmo para calcular a m´dia das notas de um aluno. n2 e n3 . e fim 2.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. A Figura 2. Cada uma destas formas se aplica a uma detera minada a¸˜o como est´ indicado. Usar a f´rmula ((n1 + n2 + n3 )/3. a Imprimir a m´dia.3 mostra e ca um algoritmo. e o Se a m´dia for maior que 5. Estas formas s˜o alguns exemplos e existem ca a a outras formas que podem ser aplicadas.

4) escrito em pseudo-linguagem. A id´ia ´ usar as vantagens do emprego da linguagem natural.2: Fluxograma para resolver uma equa¸˜o do primeiro grau. 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. Vamos apresentar e agora um outro exemplo (Algoritmo 2. 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.46 Início CAP´ ITULO 2. Este algoritmo serve para descobrir qual ´ a maior nota de um grupo de trˆs notas e e de um aluno. Em seguida h´ um teste para descobrir se o valor de a ´ igual ca a e a zero. A maioria destas linguagens s˜o muito a parecidas e tˆm a vantagem de serem facilmente entendidas.3. mas ree e stringindo o escopo da linguagem. ca Os dois primeiros passos do algoritmo lˆem os valores dos coeficientes a e e b da equa¸˜o. ALGORITMOS Obter a Obter b a =0 x=-b/a Não há raízes reais Imprime x Fim Figura 2. O algoritmo 2.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. O algoritmo inicialmente lˆ a primeira nota e guarda esta nota e . Normalmente estas linguagens s˜o vers˜es a o ultra reduzidas de linguagens de alto n´ do tipo Pascal ou C.2 ıvel foi escrito em uma pseudo-linguagem.

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

ap´s a instru¸˜o do endere¸o 0 ser lida da mem´ria e trazida para a o ca c o UCP. E importante observar que co o computador executa uma instru¸˜o de cada vez.48 CAP´ ITULO 2. Decodifica instru¸˜o. a primeira ´ co e uma leitura de instru¸˜o e as restantes opera¸˜es com dados. O ciclo normal da execu¸˜o o a ca de um programa ´ ent˜o: e a 1. ler o dado a na posi¸˜o 10. as transferˆncias entre a e e e mem´ria e o processador s˜o feitas passo a passo. ALGORITMOS ´ uma ordem para desviar o fluxo das instru¸˜es. ler o dado b na posi¸˜o 11. ca co . o computador faz as seguintes opera¸˜es na mem´ria: ca co o 1. e como veremos adiante.5: Modelo de mem´ria e funcionamento de um algoritmo o -.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. ca c 2. ca tamb´m um dado ´ buscado de cada vez. ela ´ decodificada pela UC. temos 3 leituras e uma escrita. ca 3. ca o Portanto. ca 4. que descobre que a instru¸˜o manda carregar e ca o valor inteiro 2 na posi¸˜o de mem´ria 10. Portanto.Armazena 8 na mem´ria no lugar chamado b o b←8 -. ca 3. ca 2. que ´ a 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. c Portanto. ler a instru¸˜o no endere¸o 2. ca 4. Volta para o passo 1 buscando a instru¸˜o seguinte na mem´ria. que ´ chamada de a para facilitar. Algoritmo 2. Para ca executar esta instru¸˜o. 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). escrever o resultado da soma no endere¸o 12. 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. Busca instru¸˜o.Armazena 2 na mem´ria no lugar chamado a o a←2 -. Executa instru¸˜o. Destas opera¸˜es.

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. Para isto irea mos usar a representa¸˜o que for apropriada no momento. Para a o programador iniciante esta discuss˜o serve como introdu¸˜o. Outros exemplos de lugares de onde a podem ser obtidos dados s˜o os arquivos em discos r´ a ıgidos. Estas estruturas s˜o ima portantes e ser˜o reapresentadas quando formos apresentar a linguagem C.2 representar uma das a .1 Comandos de leitura Estes comandos servem para obter dados do mundo exterior.5. a ca 2. normalmente digitados por um usu´rio em um teclado. ca Por exemplo. N˜o iremos neste ca a livro discutir em detalhes estes t´picos nem apresentar de uma maneira formal o qualquer uma destas formas.5. Apesar de a no algoritmo 2. disquetes e fitas magn´ticas. Costuma-se dizer ent˜o que a ´ a a ca a e uma vari´vel do algoritmo. 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. 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.5 Estruturas B´sicas de Algoritmos a Para ilustrar como criar algoritmos para computadores neste modelo. Estas posi¸˜es ca o a co s˜o conhecidas por vari´veis em computa¸˜o. Estes dados s˜o lidos e guardados na mem´ria para posterior uso. vamos discutir alguns tipos b´sicos de estruturas usados nesta tarefa. 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.3: Modelo de mem´ria o 2.´ 2.

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

5. 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.5 -8.´ 2. e o o Express˜es manipulam dados dentro dos algoritmos. Nos algoritmos s˜o normalmente representados por uma ca a seq¨ˆncia de caracteres entre aspas. Nesta discuss˜o vamos estabelecer. S˜o exemplos de n´meros inteiros: a a u +3 3 -324 -50 S˜o exemplos de n´meros reais: a u +0. algumas regras que limitam os conjuntos de dados existentes na Matem´tica e estabelecem que dados poder˜o ser manipulados pelos algoritmos. Mais adiante.5.3 Express˜es o Express˜es s˜o usadas para definir os c´lculos requeridos pelo algoritmo. quando formos estudar a linguagem C iremos apresentar mais formalmente as regras desta linguagem para estas representa¸˜es. por exemplo: ue .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. 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.5 0. o Os dados num´ricos que os algoritmos que iremos construir podem manipular e s˜o de dois tipos: inteiros e reais. por o a a exemplo −b/a. 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. ainda que a a informalmente. Como care a acteres podem ser letras. algarismos e caue racteres de pontua¸˜o. Dados Logicos: estes dados podem assumir dois valores verdadeiro e falso. Iremos discutir dois tipos b´sicos de express˜es: express˜es arita o o m´ticas e express˜es l´gicas. ESTRUTURAS BASICAS DE ALGORITMOS 51 2. Estes dados resultam de express˜es do tipo x > 0.175 2. algarismos e sinais diversos estes dados recebem este nome. e a u a Dados alfa-num´ricos: s˜o os dados representados por caracteres.

baseados nestes dois valores. Por exemplo. Nos nossos algoritmos estes valores ser˜o represena tados por verdadeiro e falso. O menor n´mero indica a maior prioridade. devido e e a George Boole.3. Maiores detalhes sobre e express˜es ser˜o apresentados no Cap´ o a ıtulo XXX. A coluna prioridade indica a prioridade relativa dos operandos. durante o o processamento de um algoritmo. Esta express˜o somente pode ter como resultado os e a valores: verdadeiro ou falso. 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 ’’. matem´tico que deu ao nome ` ´lgebra (´lgebra booleana) que a aa a manipula este tipo de dados. 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. No momento estamos apresentando alguns conceitos b´sicos para facilitar a discuss˜o de alguns algoritmos. Computadores tomam decis˜es. Em computa¸˜o as express˜es devem ser escritas em lina ca o has e para alterar a prioridade deve-se usar parˆnteses. Quando temos dois u operandos de mesma prioridade o computador ir´ executar primeiro a opera¸˜o a ca mais ` esquerda. que procura descobrir se o valor ca a de raiz ´ maior que 0. Os exemplos a seguir mostram como converter uma exo press˜o matem´tica para a forma que usaremos em pseudo-linguagem. 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. x ca fim se Nesta instru¸˜o aparece a express˜o a = 0. Os dados deste tipo somente podem assumir dois valores: verdadeiro e falso. Em muitos o e textos este tipo de dados tamb´m ´ chamado de tipo de dados booleanos.5.52 CAP´ ITULO 2. a a . a a Para ilustrar o uso de operadores aritm´ticos vamos considerar alguns exe emplos de express˜es.

Exemplos o de comandos de atribui¸˜o s˜o mostrados a seguir. 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. Normalmente estes valores a co o podem ser constantes ou resultados de express˜es dos diversos tipos. 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. Um exemplo de uso desta contru¸˜o escolhido a partir da vida real pode ser ca o seguinte.4 e em pseudo linguagem tem a forma mostrada no algoritmo 2. .7. Nas linguagens de a ca co programa¸˜o existem diversos tipos de diferentes de comandos de controle. ca a x ← −b/a media ← (n1 + n2)/2 inicio ← 0 nome ← ‘‘Ze Sa’’ 2. 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. nenhum outro teste foi feito.5.6.5. Esta a decis˜o em forma de pseudo-linguagem fica da maneira mostrada no Algoritmo a 2. Tenho que decidir o que fazer em um domingo de folga.´ 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. Se estiver chovendo irei ao cinema.1: Operadores Aritm´ticos. Este comando representado em fluxograma pode ser visto na Figura 2.4 Comandos de atribui¸˜o ca Servem para atribuir valores ` posi¸˜es de mem´ria. caso contr´rio irei ` praia.

.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. No enc tanto.. A Figura 2.. a sen~o. ALGORITMOS Algoritmando Falso Condição Verdadeiro Faça isto Faça aquilo Continuo algoritmando Figura 2.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.5 mostra esta decis˜o em forma de fluxograma. ent~o . vamos a assumir que decidimos ir ao cinema no domingo chova ou fa¸a sol.54 CAP´ ITULO 2. Observe que no caso de n˜o estar chovendo nada a precisa ser feito.. O algoritmo para este caso est´ a mostrado no Algoritmo 2.5. a 2.8. Para u estes exemplos de algoritmos iremos apresentar um comando de repeti¸˜o que ca .4: Fluxograma do comando se . As vezes precisamos somente de decidir se devemos fazer algo ou n˜o Por exemplo. preciso decidir se levo um guarda-chuva. a 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. O Algoritmo 2. Caso seja verdade executar o bloco ca e de comandos situados entre o in´ do comando e o final do comando. Passo 2: Executar o bloco de comandos at´ o fim do enquanto. O comando funciona da seguinte maneira: Passo 1: Testar se a condi¸˜o ´ verdadeira. Para descobrir u u e a se o n´mero ´ par vamos dividi-lo por 2 e testar o resto. u co a e Considere no exemplo anterior que o total de n´meros a ser lido n˜o ´ conhecido.7: Algoritmo para decidir o que fazer no domingo. Vamos mostrar um exemplo onde o n´mero de repeti¸˜es n˜o ´ conhecido. No momento que for u u lido um n´mero negativo o algoritmo p´ra. O algoritmo ir´ se manter ca a lendo n´meros enquanto os n´meros forem positivos.5. 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. ESTRUTURAS BASICAS DE ALGORITMOS Algoritmo 2.9 mostra como seria implementado este a e e problema.10 mostra como fica u e u em pseudo-linguagem o algoritmo modificado. 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. Lembrar que caso o u e resto da divis˜o seja igual a zero o n´mero ´ par. Em e nossa pseudo-linguagem marcaremos o fim pelas palavras fim enquanto.´ 2. O Algoritmo 2. como o algoritmo ir´ terminar de ler n´meros? Usaremos o que a a u costuma-se chamar de sentinela em computa¸˜o. que e chamaremos de comando enquanto tem a forma mostrada na Figura 2. O ıcio final do comando enquanto normalmente ´ marcado de alguma forma. Este comando. A sentinela que indica o final da u a lista de n´meros ´ um n´mero negativo.6. u a e Mas ent˜o.8: Algoritmo para decidir se deve levar um guarda-chuva. Quando chegar e ao fim retornar automaticamente para o in´ ıcio do comando e refazer o passo 1. se est´ chovendo ent˜o a a vou ao cinema sen˜o a vou ` praia a fim se Algoritmo 2. Mais adiante faremos um exemplo onde o n´mero de repeti¸˜es u co n˜o ´ pr´-determinado. Observe que neste algoritmo .

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

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

Modifique o algoritmo anterior .5: Nos exerc´ ıcios anteriores assumimos que os usu´rios sempre digitam uma a nota entre 0 e 10. Escreva um programa que calcule o imposto devido pelo trabalhador. 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 por hora extra. poderemos ter u uma nota menor que zero ou maior que 10. 2. 2.00 por hora normal trabalhada e R$ 15.00. Ou seja. ALGORITMOS Algoritmo 2.3: Escreva um algoritmo que descubra a maior nota de uma turma de alunos. (numero). 2.9: Algoritmo para ler 10 n´meros e imprimir se s˜o pares u a ou n˜o. Exerc´ ıcios 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. O tamanho da turma deve ser o primeiro dado pedido ao usu´rio. Vamos assumir agora que o usu´rio sempre digita um n´mero.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. a u mas este n´mero pode estar fora do intervalo 0 a 10.00. ”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. Caso o sal´rio seja maior a a que este valor o imposto devido ´ igual a 10% sobre R$ 12000. a 2.1: Uma empresa paga R$10.4: Modifique o algoritmo anterior de modo que ele imprima tamb´m quantas e vezes a maior nota aparece.00 mais 25% sobre e o que passar de R$ 12000. ”par” sen˜o a imprimir numero. a Entrada: 10 n´meros.

caso o aluno tenha digitado uma nota inv´lida. uma mensagem avisando o usu´rio seja impressa e uma nova nota seja a a pedida. 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. 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. e. ”impar” ler numero fim enqto fim 59 para que ele verifique a nota digitada e. portanto. ele tem de ser decomposto em trˆs e e n´meros: os algarismos das centenas.8: Escreva um algoritmo que leia uma hora em horas. e a a 2. (numero). O algoritmo deve insistir at´ que o usu´rio digite um valor v´lido.2. u 2. ”par” fim se imprimir numero. dezenas e unidades.6. .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. 2. EXEMPLOS DE ALGORITMOS Algoritmo 2. a Entrada: n´meros.6: Escreva um algoritmo que leia trˆs n´meros e os imprima em ordem crese u cente.9: Escreva um algoritmo que leia duas datas em dia. Observe que o n´mero ıda o u u ´ lido com um valor inteiro. minutos e segundos e some um segundo a hora lida.

(mediaN otas) e in´ ıcio totalAlunos ← 25 somaN otas ← 0. maiorN ota e fim Algoritmo 2.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 ´ ”. mediaN otas e e fim . Entrada: Nota de cada um dos dos 25 alunos da turma. (notaAluno). (maiorN ota) in´ ıcio totalAlunos ← 25 maiorN ota ← 0. Sa´ ıda: Maior das notas dos alunos.60 CAP´ ITULO 2.12: Algoritmo para calcular a nota m´dia de uma turma de e 25 alunos. ALGORITMOS Algoritmo 2. Sa´ ıda: M´dia das notas dos alunos.11: Algoritmo para calcular a maior nota de uma turma de 25 alunos. (notaAluno). Entrada: Nota de cada um dos dos 25 alunos da turma.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 ´ ”.

(maiorT emperatura) in´ ıcio totalT emperaturas ← 365 ler temperatura J´ li uma temperatura a totalT emperaturas ← totalT emperaturas − 1 -. maiorT emperatura e fim . Sa´ ıda: Maior das temperaturas.6.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 ´ ”. (temperatura). EXEMPLOS DE ALGORITMOS 61 Algoritmo 2. Entrada: Temperaturas registrada em ano.13: Algoritmo para calcular a maior temperatura do ano.

ALGORITMOS .62 CAP´ ITULO 2.

Muitas linguagens de programa¸˜o exigem que os programas a ca declarem todas as vari´veis antes que elas possam ser usadas.1 mostra o o este c´digo. 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.2. Caracateres geralmente s˜o are a mazenados em c´digos (usualmente o c´digo ASCII). A Tabela A.1 Introdu¸˜o ca Vari´veis e constantes s˜o os elementos b´sicos que um programa manipula.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. 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. Tipos podem ser por exemplo: inteiros. Atualmente em C os n´meros inteiros a u s˜o armazenados em 32 bits.2 3.Cap´ ıtulo 3 Tipos de Dados. Vari´veis devem receber a nomes para poderem ser mais facilmente referenciadas e modificadas sempre que necess´rio. Constantes e Vari´veis a 3. o a 3. etc. As express˜es combinam vari´veis e constantes para calcular novos valores. Caracteres s˜o armazenados em um byte. 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. caracteres. reais. a 63 .

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

7 d´ ıgito hexa: 0. L O uso destas caracteres ser´ mostrado com exemplos nas se¸˜es seguintes. B.648 a 2. D.854. a co .535 -32.294.372. 1.483. C.073. 9.647 0 a 4.147. 4.147. e.147.223.372. 3. 4.1: Tipos de dados definidos pelo Padr˜o ANSI C. 3.372. 7.551.036.854.808 a 9.147.294. 9 d´ ıgito octal: 0. A.446. F sinal: +. U sufixo longo: l.483.147. 2.223.036. 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.808 a 9.967.036. ponto decimal: .648 a 2. 7. 1. short unsigned short int signed short int long int.775. sufixo: sufixo sem sinal. b. 8. CONSTANTES NUMERICAS Tipo char unsigned char signed char int unsigned int signed int short int.295 -9.648 a 2.854.372. 2. 8.648 a 2. 2. 5.483. E.767 -2.483. 2. 5.709.483.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. F.036. 6. a d´ ıgito: 0.147.223.768 a 32. 6.775.483.295 -2. d.854.647 -32. 1. 4.223. 6.775. sufixo longo sufixo sem sinal: u. 9 d´ ıgito sem zero: 1.647 0 a 4.483.807 -9. 5. 3. l.744.3. f.775.147.768 a 32. a.807 0 a 18.483. 7. 6.147.767 0 a 65. 8. 5. c.647 -2.967.´ 3. 4. L sufixo flutuante: f. 3.

As chaves indicam que o fator entre elas pode ser repetido zero ou mais vezes.0 (N˜o ´ poss´ usar ponto decimal. o sinal do valor num´rico. A seguir temos a palavra d´gito ı entre chaves. isto ´ o sinal ´ opcional.2.3. um algarismo entre 1 e 9. 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. N˜o a e a a ´ poss´ separar.1. em qualquer ordem. CONSTANTES E VARIAVEIS 3. a a a diferen¸a entre estes dois tipos de constantes perdeu a raz˜o de ser.) a e ıvel • . Um par de L´s (l´s) indica que a constante ´ do tipo long long. um n´mero inteiro. a . Por esta raz˜o. Para constantes inteiras o sufixo U (u) representa o modificador unsigned. A tabela 3.345 (N˜o ´ poss´ colocar um espa¸o entre o sinal e o valor num´rico.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.) a e ıvel c e • 23 (N˜o ´ poss´ usar nota¸˜o de expoentes. TIPOS DE DADOS. das duas. precedidos ou n˜o por um sinal. Em seguida temos u a e e um d´gito sem zero que ´ obrigat´rio. Isto ´ dados inteiros devem come¸ar ı e o e c por.) 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). por espa¸os em branco. Como sufixo ue podemos ter opcionalmente as letras u (U) ou l (L) ou uma mistura. Portanto. Colchetes indicam ca op¸˜o.66 ´ CAP´ ITULO 3. Alguns c a exemplos de constantes inteira longas est˜o mostrados na Tabela 3. como est´ mostrado na Tabela 3. o fato de sinal (+ ou -) estar entre colchetes significa que um ca n´mero inteiro pode ou n˜o ter sinal.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. portanto. O sufixo L (l) representa o modificador long.2: Constantes Inteiras na Base 10 Alguns exemplos de erros na escrita de constantes inteiras s˜o: a • 1. ap´s o algarismo inicial obrigat´rio. pelo menos.

E (ou e).4 mostramos exemplos de constantes hexadecimais e o seu valor na base 10.3 Constantes Inteiras Hexadecimais S˜o constantes representadas na base 16. 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. 13.4: Constantes hexadecimais .´ 3.3. Normalmente s˜o representadas sem a a sinal e devem come¸ar com um 0. S˜o iniciadas com um 0x ou 0X.3. que representam respectivamente os seguintes valores 10. 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. D (ou d). Base 16 0xF 0X25 0XAB 0XBEEF Base 10 15 37 171 48879 Tabela 3. 11.3: Constantes octais 3. Base 8 025 077 011 010ul 0175 Base 10 21 63 9 8 125 Tabela 3. N´meros escritos na base 8 somente podem ser escritos com algarismos entre 0 u e 7 inclusive.2 Constantes Inteiras Octais S˜o constantes representadas na base 8. C (ou c). Para escrever constantes na base 16 usamos todos os algarismos e ainda as letras A (ou a). 14 e 15. F (ou f). 12. CONSTANTES NUMERICAS 67 3. B (ou b).3 mostramos exemplos de constantes octais e o seu valor na base 10.3.

O a u nome ponto flutuante ´ devido ao modo como os valores s˜o armazenados pelo e a computador. 10 e 3 nesta ordem.1 mostra como converter e a ´ um n´mero (N )10 para uma base b. A e 3 e.5 Constantes em Ponto Flutuante Constantes em ponto flutuante s˜o usadas para representar n´meros reais. que pode ser estendida para converter n´meros entre qualquer base e u a base 10. aplicando a equa¸˜o 3. Constantes de ponto flutuante podem ser do tipo float. o algoritmo iria imprimir os resultados 15.2 mostra a f´rmula para converter um n´mero em uma ca o u base b qualquer para a base 10. E importante notar que os algarismos na u base b v˜o sendo impressos na ordem inversa. double.68 ´ CAP´ ITULO 3. Nesta base os d´ ıgitos di ficam no intervalo b − 1 ≤ di ≤ 0. Constantes sem nenhum sufixo s˜o consideradas do tipo a .3.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.1) Esta equa¸˜o est´ escrita na base 10.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.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. N10 = dn−1 × bn−1 + dn−2 × bn−2 + · · · + d1 × b1 + d0 × b0 (3. Por exemplo. O Algoritmo 3. TIPOS DE DADOS.3. Vamos considerar que um n´mero (N )8 escrito na base 8 tenha a u seguinte forma (N )8 = dn−1 dn−2 . . CONSTANTES E VARIAVEIS 3. long ou long double. Aplicando a f´rmula 3. do menos significativo para o mais a significativo. A equa¸˜o 3.2) Vamos considerar a contante inteira (3AB)16 . Por exemplo. . a resposta seria (3AF )16 . 3. Considere uma base ca qualquer representada por b. portanto. Isto corresponderia aos seguintes d´ ıgitos da base 16: F. 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.

´ 3. Lembrar c que termos entre chaves podem ser repetidos 0 ou mais vezes e termos entre colchetes s˜o opcionais..15E1).15 × 101 .1: Algoritmo para converter inteiros na base 10 para uma base b. usando a forma hier´rquica. a Portanto.8. . mas nunca os dois grupos.3. mas usando uma hierarca e quia de defini¸˜es para facilitar o entendimento.5 mostra exemplos de constantes em ponto flutuante. E poss´ o a ıvel escrever um n´mero em ponto flutuante sem ponto. 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. Caso seja usado o sufixo F ou o f a constante ser´ considerada como a do tipo float. Entrada: n´mero. desde que um expoente seja u usado. 1E1 s˜o n´meros de ponto flutuante. os n´meros . 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. 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. Uma constante em ponto flutuante pode ser definida de duas maneiras.5) ou na chamada forma e u cient´ ıfica. E poss´ e ıvel omitir ou os d´ ıgitos antes do ponto (a parte ´ inteira) ou ap´s (a parte fracion´ria). Primeiro damos uma defini¸˜o co ca mais geral que vai sendo mais detalhada a medida que avan¸amos. O sufixo L ou o l torna a constante long double. 1234. CONSTANTES NUMERICAS Algoritmo 3. 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. Portanto. em que um expoente ´ usado (0. (numero) e base b (baseb). Na segunda forma o n´mero e u ´ ´ igual a 0. Vocˆ pode escrever um n´mero com ponto decimal (1.

onde ddd ´ uma constante com e entre um e trˆs d´ e ıgitos octais.45E+10 123. caracteres podem participar normalmente de express˜es aritm´ticas. 3. 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!!!". como no exemplo nova linha da Tabela 3. Exemplos s˜o e e a mostrados na Tabela 3. escrevendo-se.5: Constantes em ponto flutuante 3. Este caractere ser´ usado a . como em ’a’.6. posiciona o cursor no ´ ınicio da nova linha. Este caractere ´ tamb´m conhecido como caractere de escape. Tabela 3.6.45F 123. E importante notar que a linguagem C insere automaticamente ao final de uma cadeia de caracteres um caractere null (’\0’).1 Constantes Cadeias de Caracteres Neste livro vamos usar em alguns casos a palavra cadeia para significar cadeia de caracteres (string em inglˆs).7.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).45 123.4. uma constante de tamanho igual a um byte pode ser usada para definir um caracter.4 Constantes Caracteres Uma constante caractere ´ um unico caractere escrito entre ’. Em C. TIPOS DE DADOS.70 ´ CAP´ ITULO 3. Al´m e ´ e disso.45e-10 123. Tabela 3. por exemplo. ’\ddd’. 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. 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. Exemplos de constantes do tipo caractere s˜o a mostrados na Tabela 3. O valor que entra na express˜o ´ o do c´digo usado o e a e o para representar o caractere.

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

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

f l o a t raio .0 -35 (e) (f) (g) (h) . A seguir mostramos um trecho de programa com exemplos de atribui¸˜o de ca valores ap´s a defini¸ao das vari´veis.5. j = 10. j. VARIAVEIS 73 3. Exerc´ ıcios 3.54. 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. Justifique os nomes inv´lidos. Justifique suas respostas. a a a a (a) (b) (c) (d) tempo nota final us$ char (e) (f) (g) (h) 2dias teste 1 raio. 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. i = 0. co i n t i = 0 . char c = ’d ’.54. uma vari´vel pode receber valores. raio = 2. a (a) (b) (c) (d) 100 2 345 123 3. char c . c = ’d ’.circulo DiaHoje 3. double precisao = 0.00001 L .do. j = 10.1: Indique os nomes de v´riaveis que s˜o v´lidos. f l o a t raio = 2. o c˜ a int i.3 Atribui¸˜o de valores ca Ap´s ser declarada.2: Indique quais dos n´meros abaixo s˜o constantes inteiras (longas ou n˜o) u a a v´lidas.´ 3. a A seguir s˜o mostrados exemplos de atribui¸˜es de valores `s vari´veis dua co a a rante as declara¸˜es.5.234 0L 21 0xF1 3.3: Qual o valor na base 10 das constantes abaixo? (a) 025 (b) 0123 .

CONSTANTES E VARIAVEIS (c) 0xD (d) 0x1D 3.74 ´ CAP´ ITULO 3.4: Considere um computador que armazene n´meros inteiros em 32 bits. qual ´ o maior n´mero positivo? u e u . TIPOS DE DADOS. 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

} 79 Listing 4. printf ( " Justificado para direita Ano = %8 d \ n " . Esta seq¨ˆncia de escape indica que o programa deve ue passar a imprimir na pr´xima linha. A barra inclinada a e ´ chamada de sequˆncia de escape. o 4.h > i n t main ( void ) { i n t ano = 1997. } a O programa 4.4.3 s \ n " .333 . char s [] = " Alo Mundo " . ano ).h > i n t main () { f l o a t r = 1. return 0.A FUNCAO SCANF ¸˜ Listing 4. ano ).4 Entrada . ENTRADA . printf ( " O resultado e = %9.3: Exemplo de uso de especificador de precis˜o.2 ir´ imprimir o seguinte resultado: Justificado para direita Ano = 1997 Justificado para esquerda Ano = 1997 O programa exemplo 4.4. printf ( " Justificado para esquerda Ano = % -8 d \ n " .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 .3 f \ n " . r ).0/3. 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. Alo Nos exemplos anteriores verifique que ’\n’ n˜o ´ impresso. ca #include < stdio . s ). a #include < stdio .3 imprimir´ o seguinte resultado: a O resultado e = 0.2: Exemplo de justifica¸˜o de resultados.0. printf ( " %9. return 0.

& x ).. 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. 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. Os valores ser˜o armazenados direa a tamente nos endere¸os indicados por &a e &b respectivamente. a c a a a como em printf.43 em x.80 CAP´ ITULO 4. Por exemplo. &b).3. espera que dois valores inteiros sejam digitados no teclado. Caracteres comuns: (n˜o %) que devem casar com o pr´ximo caractere difea o rente de branco da entrada.1. Caso os caracteres sejam diferentes e a fun¸˜o falha e retorna deixando os caracteres seguintes n˜o lidos.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. as pr´prias vari´veis. c Um outro exemplo incluindo vari´veis reais ´: a e int i.). &i . como o e co a os listados na Tabela 4. o comando c a a scanf(%d %d. arg1. O primeiro ´ are mazenado na vari´vel a e o segundo em b. 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. arg2. scanf ( " % d % f " . 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. A largura especifica o n´mero m´ximo de caracteres a u a serem lidos. no entanto. . f l o a t x. ENTRADA E SA´ IDA PELO CONSOLE int scanf(controle. 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. que s˜o utilizadas para interpretar os dados que ser˜o a a lidos. A indica¸˜o que estamos referenciando o a ca um endere¸o e n˜o a vari´vel se faz pelo operador &. ca O modelo ´ o seguinte: e %{*}{largura}{modificadores}tipo O caracteres entre chaves s˜o opcionais. Assumindo que a linha de entrada no teclado fosse 34 56. como em printf. . outros caracteres podem aparecer. O asterisco indica que o dado ser´ lido a a de stdin mas ignorado.. a Usualmente o campo de controle s´ cont´m especifica¸˜es de convers˜o. &a.

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

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

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

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

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

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. No caso de leitura do teclado. O caractere nulo ´ adicionado ap´s o ultimo a e o ´ caractere lido. este mesmo valor nas bases hexadecimal e octal. fluxo ´ e igual a stdin. Exemplo de Entrada e Sa´da: ı Entre com o valor: 10 Hexadecimal: A Octal: 12 . i n t tam . inicialize-as. 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>.3: Fa¸a um programa que leia um valor inteiro no formato decimal e escreva.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. Caso ocorra um erro de leitura o conte´do do e u vetor fica indeterminado e um ponteiro nulo ´ retornado. e imprima os seus valores. ENTRADA E SA´ IDA PELO CONSOLE 4. Se o final do arquivo for ca atingido e nenhum caractere tiver sido lido. como temos feito. 4. char e float. e Exerc´ ıcios 4. A leitura ´ interrompida quando um caractere <enter> ´ ene e contrado ou o final do arquivo foi atingido. A fun¸˜o retorna str caso seja bem sucedida.5.h > i n t * fgets ( const char * str . Para evitar este problema recomenda-se o emprego da fun¸˜o fgets cujo ca prot´tipo ´ o e #include < stdio . aqui o caractere <enter> ´ armazenado no vetor onde os demais ca e caracteres est˜o sendo guardados. 4. o vetor str permanece inalterado e um ponteiro nulo ´ retornado. c na tela.1: Escreva um programa que declare variaveis do tipo int. FILE * fluxo ).86 CAP´ ITULO 4.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.

4: Fa¸a um programa capaz de ler um valor real e escrevˆ-lo com apenas uma c e casa decimal.6: Sabendo que os argumentos da fun¸˜o printf podem ser express˜es (a+b. 4.8: Escreva um programa que pegue o valor de uma conta de restaurante e imprima o valor total a ser pago. seu quadrado.7: Escreva um programa que leia 3 n´meros reais e imprima a m´dia aru e itm´tica destes n´meros. a 4. a quilomec c a tragem anterior. considerando que o restaurante cobra 10% de taxa para os atendentes.. a*b. os litros consumidos e informe a taxa de consumo (quilˆmetros o por litro) de um autom´vel. e u 4.. 4.11: Escreva um programa que. dado o per´ ımetro de um c´ ırculo. uma ao lado da e a outra e separadas por ”/-/ ”. o 4. 4. calcule sua a ´rea.4.).9: Fa¸a um programa que pe¸a ao usu´rio a quilometragem atual.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.5. LENDO E IMPRIMINDO CARACTERES 87 4. .10: Escreva um programa que converta uma temperatura de Farenheit para Celsius.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. e a sua metade. 3*a. 4. Exemplo de Entrada e Sa´da: ı Valor: 6 Triplo: 18 Quadrado: 36 Meio: 3 4. fa¸a um programa capaz de ler a c um valor inteiro e escrever seu triplo. ca o a/b. e n˜o somente argumentos.

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

0. que determina que comandos terminam com este caractere.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. a 5. 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. Por exemplo: soma = a + b.0. As atribui¸˜es s˜o feitas na seguinte e a co a ordem: 1.1415. ou seja 1.2 Operador de Atribui¸˜o ca Este ´ o operador usado para transferir o resultado de uma express˜o para uma e a vari´vel. ´ E poss´ fazer-se v´rias atribui¸˜es em uma unica linha. que ´ o valor atribu´ ` a a e ıdo a c. o constantes e vari´veis. c = 1. 2. Em C este operador ´ o sinal de igual (=). Isto faz parte das regras da linguagem C.0. como no exemplo ıvel a co ´ a seguir: a = b = c = 1. Esta escolha do sinal de a e igual para servir de operador de atribui¸˜o pode causar problemas. c recebe o valor 1. 89 .0.Cap´ ıtulo 5 Operadores e Express˜es o 5. Observe que o e ca comando de atribui¸ao termina em ponto e v´ c˜ ırgula. b recebe o resultado da express˜o ` sua direita. pi = 3.

OPERADORES E EXPRESSOES 3. Express˜es entre parˆnteses s˜o calculadas em co o e a primeiro lugar. Neste caso as express˜es dentro dos e a o parˆnteses mais internos s˜o avaliadas primeiro. portanto eles conferem o maior grau de prioridade as express˜es o que eles envolvem. O operador menos un´rio multiplica seu operador por -1. e a Outro ponto importante s˜o as regras de precedˆncia que determinam que a e opera¸˜o deve ser executada primeiro. a recebe o resultado da express˜o ` sua direita.com a mesma e e a prioridade. 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. Parˆnteses tˆm um papel importante nas express˜es e permitem que a ordem e e o das opera¸˜es seja alterada. porque eles alteram radia a a calmente os resultados das express˜es. e Dizemos que os parˆnteses est˜o aninhados. Na tabela os operadores est˜o listados ca a em ordem decrescente de prioridade. a opera¸˜o co ıvel e ca mais ` esquerda ser´ avaliada primeiro. que ´ o valor atribu´ ` a a e ıdo a b.3 mostra os operadores aritm´ticos e as suas ordens de precedˆncia. ou seja 1. e Os s´ ımbolos mostrados na Tabela 5. vindo em seguida ++.1: Operadores aritm´ticos.un´rio. Para os operadores aritm´ticos a opera¸˜o e ca de mais alta precedˆncia ´ o . Podemos ter pares de parˆnteses envolvendo outros pares.90 ˜ CAP´ ITULO 5. 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. 5.0. Quando a duas opera¸˜es de mesmo n´ de prioridade tˆm de ser avaliadas. -. 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. divis˜o e m´dulo tem a mesma ca a o prioridade. Os operadores de multiplica¸˜o. Por exemplo. a divis˜o entre operandos o a .3 s˜o os unicos que podem ser usados a ´ para representar as opera¸˜es acima listadas. O exemplo mais comum deste formato ´ a opera¸˜o de divis˜o que deve e ca a ser escrita a/b.3 Operadores Aritm´ticos e A Tabela 5.

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

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

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

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

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

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

OPERADOR SIZEOF() 97 5.2: Exemplo do operador sizeof. s i z e o f f ). printf ( " Tamanho do double % d \ n " . printf ( " Tamanho do char % d \ n " . uma opera¸˜o que envolva um tipo int e um float. suponha que o a e tipo float tenha quatro bytes ent˜o o operador sizeof(float) retorna o valor a 4. o valor int ca ´ convertido para float.h > #include < conio . s i z e o f i ).h > i n t main () { i n t i =0.0. e . s i z e o f c ). s i z e o f ( v )).9 Convers˜o de Tipos a Quando operandos de tipos diferentes aparecem em express˜es s˜o convertidos o a para um tipo comum. char c = ’a ’. f l o a t f =3.2 ilustramos alguns exemplos de uso do operador e 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.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. Listing 5. } 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. a a Por exemplo. printf ( " Tamanho em bytes de alguns tipos \ n " ). printf ( " Tamanho de int % d \ n " . i n t v [ DIM ]. Por exemplo. que permita o c´lculo da express˜o da forma mais eficiente.5. return 0. printf ( " Tamanho do vetor de % d inteiros \% d \ n " . printf ( " Tamanho do float % d \ n " . No exemplo 5.8. DIM . s i z e o f ( double )). #define DIM 10 #include < stdio .

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

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

.25\ n " ). e l s e i f ( express~ o ) a bloc o_de_comandos .25.6. 6.2 Comando switch O comando if. e l s e blo co_de_comandosn O programa 6. imposto = salario * 0.3.000000.1 o programa se e torna mais trabalhoso para ser escrito e entendido. O comando switch facilita a escrita de trechos de programa em que a sele¸˜o deve ser feita entre v´rias ca a alternativas.. COMANDOS DE TESTE { printf ( " Aliquota de imposto = 0. 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 . Um exemplo de uso deste programa ´ o seguinte: e Este programa simula uma calculadora simples. A forma geral do comando switch ´ a seguinte: e . como no exemplo 6. } 103 Uma constru¸˜o que pode aparecer s˜o os comandos if’s em escada. 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 .. 3 5 Qual a operacao + O resultado da + vale 8. Por favor entre com os dois operandos. . Por´m em alguns casos.3. e l s e i f ( express~ o ) a bloc o_de_comandos .. em todas suas formas. ´ suficiente resolver problemas de sele¸ao e c de comandos.1 mostra um exemplo com if’s em escada e aninhados. e l s e blo co_de_comandos .

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

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

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. geralmente um contador. express~ o3 ) a a a blocodecomandos . Caso a condi¸˜o de t´rmino tenha sido atingida o c ca e la¸o ´ interrompido. COMANDOS DE CONTROLE • Notar que caso n˜o apare¸a um comando de desvio. recebe um e a valor inicial.3 Comando Tern´rio a O comando tern´rio tem este nome porque necessita de trˆs operandos para ser a e avaliado.4. As trˆs express˜es geralmente tˆm os seguintes significados: e o e 1. 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. 6. express~ o2 .2 mostra um exemplo de uso de comandos switch. 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.106 CAP´ ITULO 6. mas na linguagem a ca C ele apresenta uma grau maior de flexibilidade. A id´ia b´sica do comando e a for ´ a seguinte. primeiro avexpress~o1 ´ avalia a e ada. Caso este resultado seja correspondente ao valor verdadeiro ent˜o o a resultado da express˜o ser´ igual ao resultado da express~o2. 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.3 mostra um a e exemplo de uso de comando tern´rio. o • N˜o podem aparecer duas constantes iguais em um case. A forma geral do comando for ´ a seguinte: c e e f o r ( express~ o1 . 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 e a c . ca c 6. Uma vari´vel de controle. • O comando switch s´ pode testar igualdade. a 6. O programa 6. a O programa 6.3. A express~o1 ´ utilizada para inicializar a vari´vel de controle do la¸o. mesmo as que a estejam relacionadas com outros testes case.1 Comando for Este comando aparece em v´rias linguagens de programa¸˜o.

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; }

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

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

} . Se o resultado da express˜o for verdadeiro ent˜o volta para o passo 1.6. i ++) { scanf ( " % d " .4. do { printf ( " Numero % d \ n " . num ). A e execu¸˜o do comando segue os seguintes passos: ca 1.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. i < 100. i ). No entanto. portanto o bloco de comandos ´ executado pelo menos uma vez.5. 2. printf ( " % d \ n " .5 6. u f o r ( i = 0. 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.5. } while ( i <= 100). COMANDOS DE DESVIO 113 6. Executa o comando. i ++. 6. se for digitado um n´mero negativo o comando for ´ u e interrompido imediatamente sem que o n´mero seja impresso. Avalia a express˜o.3 Comando do-while A forma gen´rica do comando ´ a seguinte: e e do bloco_de_comandos while ( express~ o ). No trecho de programa abaixo o comando for deve ler 100 n´meros inteiros u positivos. 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. & num ). i f ( num < 0) break. a 3. a Observar que neste comando a express˜o de teste est´ ap´s a execu¸˜o do a a o ca comando.

r´tulo: o Este comando durante muito tempo foi associado a programas ileg´ ıveis. O prot´tipo da fun¸˜o ´ a seguinte: o ca e void exit (int codigo). O comando para onde deve ser feito o a desvio ´ indicado por um r´tulo. i f ( num < 0) continue . printf ( " % d \ n " . Nos comandos while e do-while o ca a controle passa para a fase de testes. Um valor diferente de 0 indica um erro. A forma ca geral deste comando ´: e goto r´tulo. COMANDOS DE CONTROLE 6. 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. Atualmente as restri¸˜es co ao uso do comando tem diminu´ e seu uso pode ser admitido em alguns casos.. . um novo n´mero ´ lido.5.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. i < 100. ıdo 6.5.4 Fun¸˜o exit() ca A fun¸˜o exit provoca a termina¸˜o de um programa.2 Comando continue O comando continue ´ parecido com o comando break. que ´ um identificador v´lido em C seguido por e o e a ´ dois pontos. No comando for o o ca c controle passa a execu¸˜o da express~o3. } 6. O c´digo ca o ´ usado para indicar qual condi¸˜o causou a interrup¸˜o do programa. u e f o r ( i = 0. No trecho de programa abaixo o la¸o lˆ 100 n´meros inteiros. & num ). o . i ++) { scanf ( " % d " . se houver uma.114 CAP´ ITULO 6. Usuale ca ca mente o valor 0 indica que o programa terminou sem problemas. 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. caso o n´mero c e u u seja negativo.5. num ). 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. Observar que esta fun¸˜o interrompe o programa como um todo. retornando o controle ao ca ca sistema operacional..

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

15: Escreva um programa que conte de 100 a 999 (inclusive) e exiba. 6. Obs: Os numeros devem ser entre 0 e 10.. o u .9: Escreva um programa que leia 10 numeros..10: Escreva um programa que leia 10 numeros.11: Escreva um programa que exibe a tabela ascii. 6. o maior e o menor deles. O programa deve imprimir a media. inicialmente o e programa ir´ exibir: a 0 (1*0*0) 0 (1*0*1) 0 (1*0*2) (. COMANDOS DE CONTROLE 6.) 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.).8:Escreva um programa que imprima todos os numeros pares entre 0 e 50 e em seguida imprima todos os impares. O programa deve imprimir a media. use apenas vari´veis. Por exemplo..13: Escreva um programa que leia um numero do teclado e ache todos os seus divisores.116 CAP´ ITULO 6. o produto dos trˆs digitos dos numeros. 6.. um por linha. u e 6. 6. 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. Obs: Considere agora que os n´meros podem ser quaisquer. u e 6.14: Escreva um programa que imprima a seq¨ˆncia ue ‘‘987654321876543217654321654321543214321321211’’ N˜o use nenhuma constante. o maior e o menor deles. Em outra linha imprima a a as letras mai´sculas de A at´ Z (ABCD. Deixar um espaco entre os numeros. u 6.

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. onde tipo ´ um tipo qualquer de dados. char nome [40]. nome ´ o nome pelo qual o vetor vai e e ser referenciado e tamanho ´ o n´mero de elementos que o vetor vai conter. f l o a t notas [65]. e u Observar que em C o primeiro elemento tem ´ ındice 0 e o ultimo tamanho .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. Neste cap´ a o ıtulo estaremos mostrando vetores de tamanhos fixos.Cap´ ıtulo 7 Vetores e Cadeias de Caracteres 7. ´ Exemplos de declara¸˜es de vetores s˜o: co a i n t numeros [1000]. ocupado por um vetor de tipo qualquer ´ c o e igual a: 117 . ca o 7. /* vetor de 1000 inteiros */ /* conjunto de 65 numeros reais */ /* conjunto de 40 caracteres */ O espa¸o de mem´ria.1. Somente ap´s apresentarmos o ponteiros iremos abordar aloca¸˜o de mem´ria para vetores. Pelo nome vetor estaremos referenciando estruturas que podem ter mais de uma dimens˜o. como por exemplo matrizes de duas dimens˜es. em bytes.

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

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

1: Passos executados durante o algoritmo da bolha. que ´ representado como ’\0’. . e 7. que aponta para o final do vetor (fim) ´ diminu´ de 1. Por c exemplo. que s˜o definidas e ıvel a como uma lista de caracteres entre aspas.120 CAP´ ITULO 7. Para especificar um vetor para e armazenar um cadeia deve-se sempre reservar um espa¸o para este caracter. e a A Tabela 7.3 Cadeias de Caracteres Um cadeia de caracteres (string) ´ um conjunto de caracteres terminado por um e caractere nulo. 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. para armazenar um cadeia de 40 caracteres deve-se reservar um vetor de 41 de caracteres. Em C ´ poss´ haver constantes cadeia.1 mostra os passos executados pelo algoritmo at´ ordenar o vetor. 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. Quando nenhuma troca ´ realizada o vetor est´ ordenado. Por exemplo.

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

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

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

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

1. O n´mero de colunas C1 de M 1 deve ser igual ao n´mero u u de linhas L2 de M 2.1: Mapa de mem´ria de uma matriz. o C1 M Rij = k=1 M 1ik × M 2kj (7. 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.5 Vetores de Cadeias de Caracteres A declara¸˜o abaixo mostra uma matriz de cadeias de caracteres com 30 linhas ca de 80 caracteres. o Uma opera¸˜o muito comum em matem´tica ´ a multiplica¸˜o de matrizes. O programa 7. 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 elemento M Rij da matriz resultado M R do produto destas matrizes ´ definido pela equa¸˜o 7.7.6 multiplica duas e ca matrizes de acordo com a f´rmula. .1) 7.5.

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

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

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

7. " disc 1: Banco de Dados I " . 0. return 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. que ca nada mais ´ do que uma matriz de caracteres. 7. Listing 7. // linha 2 O Programa 7.6. 4.0} . // linha 1 {0. u f l o a t mat [][4] = { {1.0 . 9. & i ). INICIALIZACAO DE VETORES E MATRIZES ¸˜ 129 reservar mem´ria de maneira adequada. int i. " disc 3: Arquitetura de Computadores I " }. 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. 3.9 ilustra a defini¸˜o de um vetor de cadeia de caracteres.1 .4} }. scanf ( " % d " .0 . } . puts ( disciplinas [ i ]).5 .0 .0} . Note que as cadeias s˜o separadas e a uma das outras por v´ ırgulas. printf ( " Qual a disciplina ? " ). #define DIM 5 #include < stdio .5 .9: Exemplos de tratamento de vetores.h > i n t main ( void ) { char disciplinas [][40] = { " disc 0: Computacao para Informatica " . // linha 0 {8.0 . 2. 0.0 . 0.0 . 6. " disc 2: Banco de Dados II " .

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

um n´mero lido do teclado. 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.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.10: Escreva um programa que leia para um vetor um conjunto de n´meros u inteiros.9: Escreva um programa que leia uma linha de caracteres do teclado e converta o primeiro caracter de cada palavra para mai´sculas. 7. Assuma que as palavras u s˜o sempre separadas por um branco. a .6. e 7. o que ser´ impresso pelo programa ´: a e FYDANVCYAF 131 7.11: Fa¸a um programa que inverta uma cadeia de caracteres. Assuma que a posi¸˜o especificada pelo a u ca usu´rio corresponde ao ´ a ındice do vetor. Assuma que o conjunto de n´meros lidos ´ menor que o tamanho do u e vetor. em uma posi¸˜o especificada pelo ca usu´rio.12: Escreva um programa que leia um conjunto de nomes para uma matriz e imprima estes nomes em ordem alfab´tica. Use o a comando for para varrer a cadeia at´ o seu final. 7.7. a 7. O programa deve inserir no vetor. INICIALIZACAO DE VETORES E MATRIZES ¸˜ Portanto. O programa c deve ler a cadeia com gets e armazen´-la invertida em outra cadeia. Assuma que os nomes ser˜o lidos e a somente em letras mai´sculas. O caracter a ser procurado deve ser lido do teclado.

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

Primeiro. Em C n˜o existem estes tipos de comandos como na maioria das a linguagens. diminui o tempo de desenvolvimento do programas.1 Introdu¸˜o ca Em C. No entanto o uso de fun¸˜es pode co facilitar o desenvolvimento de programas de diversas maneiras. Fun¸˜es podem ser desena co volvidas por programadores trabalhando independentemente. Estes fatores contribuem para a redu¸˜o e ca dos custos de desenvolvimento dos projetos. Programas escritos em C usam fun¸˜es de entrada e sa´ escritas co ıda e testadas por outros programadores. ca 133 . As fun¸˜es de entrada e sa´ s˜o o exemplo mais direto co ıda a deste reuso. Na linguagem C n˜o h´ conceito de um programa principal. Em primeiro lugar temos as vantagens do reuso de c´digo desenvolvido por o outros programadores.Cap´ ıtulo 8 Fun¸oes c˜ 8. 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. Esta divis˜o do a a a trabalho concorre para acelerar o desenvolvimento dos programas e na redu¸˜o ca dos custos deste desenvolvimento. o co a a que existe ´ uma fun¸˜o chamada main que ´ sempre a primeira a ser executada. Em segundo lugar. como estas fun¸˜es foram testadas por diversos usu´rios. Este reuso de c´digo apresenta v´rias o a vantagens. a quanco a tidade de erros ´ bastante reduzida. 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. todas as a¸˜es ocorrem co dentro de fun¸˜es. 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. 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. 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.

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

Suponha que uma determinada e ca fun¸ao. dia. A. tipo nome2. i.. recebe trˆs argumentos (n1. No exemplo 8. nota3). n2. Neste exemplo. Por ca exemplo. 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. 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. B. . float n3). float n2. nota2. deve escrever no e e local onde quer que a m´dia seja calculada o seguinte comando: e resultado = media(nota1.. nota1. deseje usar uma outra fun¸˜o. tipo nomeN). A forma geral de defini¸˜o de um prot´tipo ´ ca o e a seguinte: tipo nome (tipo nome1.3. Prot´tipos de fun¸˜es ajudam a a a o co detectar erros antes que eles ocorram.1 o prot´tipo da fun¸˜o soma pode co ser declarada da seguinte maneira int soma (int.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. nota2 e nota3. mes. ca ca 8. 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. Se os tipos s˜o incompat´ a ıveis. 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.. 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. O exemplo 8. 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.1 mostra a declara¸˜o de uma fun¸˜o e seu prot´tipo. n3) tamb´m do tipo float . impedindo que fun¸˜es sejam chamadas co com argumentos inconsistentes. int) .´ 8. isto ´ retorna ca e e um resultado float . uma fun¸˜o chamada media que ´ do tipo float . onde resultado ´ a vari´vel que vai receber a m´dia calculada. mas podem ser gerados avisos na compila¸˜o e a ca resultados estranhos. 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. o compilador n˜o gera um erro. e e Um ponto importante ´ como usar a fun¸˜o. um programador que deseje usar a fun¸˜o media em seu programa ca para calcular a m´dia de trˆs valores.

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

f o r ( i = 2. i ). impares (). i <= 10. return 0. i += 2) { printf ( " % d : " . i ). i += 2) { printf ( " % d : " . i <= 11. } } i n t main ( i n t argc . O c´digo co o que define uma fun¸˜o e os seus dados s˜o particulares da fun¸˜o (do bloco).4. Observe que um bloco de comandos se inicia em um ‘‘{’’ e termina em .2 podemos ver o uso de vari´veis locais.h > void pares ( void ) { int i.2: Exemplos de vari´veis locais. A vari´vel i ´ definida em cada uma das fun¸˜es do programa (pares. f o r ( i = 3. 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). } Alguns autores usam o termo vari´veis autom´ticas para se referir as vari´veis a a a locais. elas s˜o invis´ a ıveis para outras fun¸˜es do mesmo programa. No entanto. ou seja usada. char * argv []) { pares (). ca a ca a a e No programa 8. a #include < stdio . 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. 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. } } void impares ( void ) { int i. dentro a o da fun¸˜o (ou bloco) onde foi declarada. Em C existe a palavra chave auto que pode ser usada para declarar que vari´veis pertencem ` classe de armazenamento padr˜o. 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.´ 8. Uma vari´vel local s´ pode ser referenciada. impares). Listing 8. printf ( " \ n " ).

ıcia a c ca O programa 8. 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. Outra vantagem ´ que como a a e vari´vel somente existe dentro do bloco. printf ( " % d \ n " .3 ilustra este tipo de declara¸˜o. mais uma n˜o chama a outra. podem vir logo ap´s o abre co a ca o chaves que in´ um bloco de comandos. se duas fun¸˜es tem de partilhar dados. i * t ). Este tipo de vari´vel pode servir como uma canal ca a de comunica¸˜o entre fun¸˜es.h > i n t main () { int i. o programa pode a ca ocupar menos espa¸o de mem´ria. incluindo sua inicializa¸˜o.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.4 ilustra este tipo de declara¸˜o. FUNCOES ¸˜ um ‘‘}’’. } Existem algumas vantagens em se declarar vari´veis dentro de blocos. dentro do qual mais comumente se define uma vari´vel ´ a fun¸˜o. 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. portanto. f o r ( i =0. i ++) { i n t t = 2. n˜o somente o que come¸a uma fun¸˜o. uma maneira de transferir valores entre elas. se a execu¸˜o do bloco for c o ca condicional a vari´vel pode nem ser alocada. Por exemplo. ca a #include < stdio . ca Listing 8. Como a as vari´veis somente existem durante a execu¸˜o do bloco. O bloco de comandos. Em seguida vemos que a fun¸˜o sub1 define a a ca uma vari´vel local tamb´m chamada i e. 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. Por ca co exemplo. pode-se controlar melhor o uso da a vari´vel.138 CAP´ ITULO 8. a altera¸˜o feita por esta a e ca .3: Defini¸˜o de vari´vel dentro de um bloco. a O programa 8. a a 8. co a uma vari´vel global tem de ser usada. } return 0. Declara¸˜es de vari´veis. evitando erros de uso indevido da vari´vel. i <10.

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

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

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

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

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

mostra como a fun¸˜o pode ser escrita recursivamente. ´ 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 . ca . sem recurs˜o. Quando ca ´ ca e o comando return n˜o existe o valor de retorno ´ considerado indefinido. } Alternativamente. ca o ca mostrado a seguir.-) fato = fato * i . 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. i >1. FUNCOES ¸˜ 8. return fato . Qualquer express˜o pode aparecer no comando.f. f o r ( i = num .7 O Comando return O comando return ´ usado para retornar o valor calculado para a fun¸˜o que e ca chamou. 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. i . que tem a a seguinte a forma geral: return express~o a A fun¸˜o que chamou ´ livre para ignorar o valor retornado. 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. O exemplo. O fatorial de um n´mero. i . o fatorial pode ser defindo como o produto deste n´mero u pelo fatorial de seu predecessor. a a 8. 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. As a e ´ fun¸˜es que n˜o retornam valores devem ser declaradas como do tipo void. isto ´ uma fun¸˜o pode chamar co e ca ´ a si mesmo.144 CAP´ ITULO 8.8 Recurs˜o a Fun¸˜es em C podem ser usadas recursivamente. 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.

9. 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.ARGC E ARGV unsigned long i n t fat ( unsigned long i n t num ) { i f ( num == 0) return 1. argc. o que indica o final da recurs˜o. 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. u a ca No caso contr´rio ela devolve o valor da express˜o num * fat(num-1). e as vezes pode ser at´ mais lento porque temos o custo a a e de chamada as fun¸˜es. 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. c˜ e 8. Na ca fun¸ao consideramos que x ´ do tipo float . c Um ponto importante ´ que toda fun¸˜o recursiva deve prever cuidadosae ca mente como o processo de recurs˜o deve ser interrompido. assumindo que n ≥ 0. Este processo continua se repetindo at´ que o valor u e passado ´ igual a 0. Observar que argc vale sempre pelo ca .argc e argv A fun¸ao main como todas as fun¸˜es podem ter parˆmetros. a Um outro exemplo simples de fun¸˜o que pode ser resolvida por recurs˜o ca a ´ xn . ou seja o a a produto do n´mero pelo valor do fatorial do n´mero predecessor. 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. Como a fun¸˜o main c˜ co a ca ´ sempre a primeira a ser executada. o Nem ser´ mais r´pido. 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. ´ uma vari´vel inteira que indica quantos are a gumentos foram fornecidos para a fun¸˜o. } 145 Quando a fun¸˜o fatorial recursiva ´ chamada.9.9 Argumentos . 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. else return num * fat ( num -1). No caso ca da fun¸˜o main s˜o usados dois argumentos especiais int argc e char **argv. 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. As principais vantagens da recurs˜o s˜o c´digos mais co a a o compactos e provalvemente mais f´ceis de serem lidos. ARGUMENTOS . 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.8. Neste ponto o processo se e a reverte e as chamadas come¸am a ser respondidas.

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

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

das seguintes maneiras: 1. que gere um vetor a partir de uma co matriz. Considere que a matriz tenha tamanho 10 por 10.7: Escreva um programa usando recursividade para gerar a seq¨ˆncia do ue Fibonacci.5: Escreva um programa que crie uma tabela de temperaturas Celsius Fahrenheit. O programa deve usar uma fun¸˜o que converta de Celsius para ca Fahrenheit. 8.4: Escreva um programa que imprima o codigo ASCII de todos os caracteres.6: Escreva um programa. ıcio ca 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.148 CAP´ ITULO 8. 8. caractere a caractere. FUNCOES ¸˜ 8. Cada item deste exerc´ deve corresponder a uma fun¸˜o. Exemplos de entrada e sa´ do programa s˜o mostrados abaixo. A tabela deve iniciar na temperatura 0 graus Celsius e terminar na temperatura 100 graus Celsius. a partir de um determinado valor decimal. ı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 . usando fun¸˜es. Cada elemento do vetor ´ igual a soma dos elementos de uma das linhas e da matriz. a tabela inteira. a escolha do usuario. 2.

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. que tamb´m ocupa 4 bytes. 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. A Figura 9. a 0 4 8 12 16 10 120 num res *pint N Figura 9. O primeiro endere¸o ´ sempre 0 e o ultimo geralmente ´ c c e ´ e uma potˆncia de 2. res) ocupando 4 bytes o e a cada uma e mais um ponteiro (pint).Cap´ ıtulo 9 Ponteiros 9.1 mostra o mapa de um trecho de mem´ria que cont´m duas vari´veis inteiras (num. 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. o a 149 . N˜o h´ dois bytes com o ´ c a a o mesmo endere¸o. Por exemplo um computador com mem´ria igual a 512 e o Mbytes tem 512x1024x1024 bytes.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.1: Mapa de mem´ria com duas vari´veis e ponteiro.

2 ilustra como um ponteiro faz co referˆncia para uma ´rea de mem´ria.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. Observe a diferen¸a do que ocorre quando a c se usa vetores de tamanho fixo. ca e e ca 0 4 8 1000 pi ponteiro para vetor 1000 120 Vetor de 10 inteiros 1036 97 N Figura 9. 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. A Figura 9. Durante a a execu¸˜o do programa. ´ 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. Com pono ca teiros. 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. Com ponteiros. por exemplo. quando se deseja que uma fun¸˜o a ca retorne mais de um valor. definir a vari´vel ponteiro e seu tipo. Assim esta fun¸˜o pode modificar diretamente os conte´dos c ca u destas vari´veis.150 CAP´ ITULO 9. no in´ ıcio. PONTEIROS Ponteiros s˜o importantes. ap´s descobrir o tamanho do vetor. reserva a ´rea ca o a necess´ria para guardar os dados. a o . o a o e programador precisa. que ap´s o fim da fun¸˜o estar˜o dispon´ a o ca a ıveis para a fun¸˜o que ca chamou. Neste caso os argumentos podem funcionar como entrada e sa´ de ıda dados da fun¸˜o. 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.

que ´ equivc e alente a 0. a A forma geral da declara¸˜o de um ponteiro ´ a seguinte: ca e tipo *nome.9.2 9. 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.3: Declara¸˜o de ponteiros. 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.h> e significa que o e ponteiro n˜o aponta para lugar nenhum. Onde tipo ´ qualquer tipo v´lido em C e nome ´ o nome da vari´vel ponteiro. e a e a Por exemplo: i n t * res . o usu´rio n˜o tem controle ca o a a sobre estes endere¸os.1 Opera¸oes com Ponteiros c˜ Declara¸˜o de Ponteiros ca Antes de serem usados os ponteiros. Um ponteiro pode ser a ca inicializado com um endere¸o ou com o valor NULL. portanto. /* ponteiro para ponto flutuante */ Como as vari´veis. OPERACOES COM PONTEIROS ¸˜ 151 9. como as vari´veis. O valor inicial da mem´ria ´ indefinido como aconc o e tece com vari´veis. A Figura 9.2. ca .2. 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. 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. /* ponteiro para inteiro */ f l o a t * div . precisam ser declarados.3 ilustra esta situa¸˜o. O valor NULL. ´ uma constante definida no arquivo <stdio. c 996 1000 endereço indefinido *res 1004 endereço indefinido *div N Figura 9.

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

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

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

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

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

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

} Listing 9. f l o a t *p. p = v .-. int i. *( v + i )).h > i n t main ( void ) { char *s .9) mostra uma fun¸˜o que copia um cadeia de caracteres para outra.h > i n t main ( void ) { f l o a t v [] = {1. 3. PONTEIROS Listing 9.0}. f o r ( i = 0 . Para a o obter esta ´rea o programa deve usar fun¸˜es existentes na biblioteca stdlib. i n t tam =0. i < 7. printf ( " \ n " ). a #include < stdio . i ++) printf ( " %.7: Exemplo de ponteiro vari´vel. return 0.158 CAP´ ITULO 9. f o r ( i = 0. 2.1 f " . * lista = " 1234567890 " . 4. v [ i ]). s = lista . f o r ( i = 0.0 .1 f " . return 0. 7.8: Exemplo de ponteiro para cadeia de caracteres. * p ). } ca Um outro exemplo (Programa 9. i ++) printf ( " %. 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. i < 7. tam . tam ).0 . 5.\ n " . 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).0 . #include < stdio . Reserva espa¸o na mem´ria para algum item c o . i < 7. printf ( " \ n " ). lista . 9.0 .0 . p ++) printf ( " %. 6. i ++ .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. while (*( s + tam ++) != ’ \0 ’ ). printf ( " O tamanho do string \"% s \" e % d caracteres .0 .1 f " .

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

13. quando usamos estruturas de dados com maior dimensionalidade. return 1. #include < stdio . tam . 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. v = calloc ( tam . i n t i . scanf ( " % f " . PONTEIROS Listing 9. 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. O trecho de programa ficaria como mostrado no exemplo 9. s i z e o f ( f l o a t )). como matrizes. } f o r ( i =0. i ). } free ( v ). i ++) { printf ( " Elemento % d ? " . 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 . coluna) em um endere¸o linear.160 CAP´ ITULO 9. " ).10: Exemplo de uso de calloc e free. e c Considere uma matriz chamada matriz de tamanho LIN. 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. printf ( " Li valor % f \ n " . por exemplo. e a c que ´ definido por um par (linha. que s˜o arranjos bidimensionais de dados. Portanto. ´ necess´rio a e a mapear o espa¸o bidimensional (ou de maior ordem) para uma dimens˜o. a c No entanto.6 Ponteiros e Matrizes Um ponteiro aponta para uma ´rea de mem´ria que ´ endere¸ada de maneira a o e c linear. printf ( " Qual o tamanho do vetor ? " ). i f (! v ) { printf ( " Nao consegui alocar memoria .12. i < tam . *( v + i )). v + i ). No a entanto. vetores podem ser f´cilmente manipulados com ponteiros.h > i n t main ( void ) { f l o a t *v. } 9. return 0. scanf ( " % d " .h > #include < stdlib . No c a caso das matrizes ´ necess´rio mapear o endere¸o de cada elemento na matriz. Caso o programa utilizasse ponteiros ao inv´s de e nota¸˜o de matrizes. & tam ).COL que poderia ser declarada e ter um de seus elementos lidos da maneira mostrada no trecho de programa listado em 9.

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

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

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

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

pela fun¸˜o malloc foi conformado ao tipo ponteiro para ponteiro pela opera¸˜o ca ca (int **). A seguir mostramos o programa nas listagens 9. ca e a especialmente para matrizes grandes.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.16 e 9. O prop´sito ´ mostrar como ficam as co o e chamadas e as defini¸˜es das fun¸˜es que utilizam ponteiros para ponteiros.9. Esta solu¸˜o ´ muito mais r´pida do que trocar elemento a elemento.7: Armazenamento de matrizes com vetores de ponteiros. co co .8.

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

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

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

10: Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira. Assuma que a letra ’a’ tem ´ ındice 0.4: Escreva um programa que leia uma matriz e a imprima. 9. A fun¸˜o possui o prot´tipo a ca o abaixo:¡br¿ int posicao(char *substr. 9. 9.9: Escreva um programa que procure em uma matriz elementos que sejam ao mesmo tempo o maior da linha e o menor coluna.1: Escreva um programa que gere um vetor de trˆs dimens˜es (X. .9. char *str).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 u 9. a letra ’b’ ´ ındice 1 e assim por diante. a 9.8: Escreva um programa que leia seu nome completo e pergunte quantas letras tem o seu primeiro nome. 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. 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.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. O programa deve implementar as seguintes opera¸˜es na pilha: co • Inserir • Remover • Listar 9. O programa deve ler o numero de colunas e linhas do teclado.8. u u 9. e retorna a posi¸˜o em que ca a sub-cadeia aparece em cadeia. Os n´meros das linhas a serem trocadas devem ser ca u lidos do teclado. Fa¸a uma fun¸˜o que verifique se a express˜o apontada c ca a por substr est´ presente na cadeia apontada por str.7: Escreva um programa que leia seu nome completo e pergunte quantas letras tem o seu primeiro nome. Y e Z) em e o que cada posi¸˜o guarda a soma de suas coordenadas. As dimens˜es da matriz o devem ser pedidas ao usu´rio. O programa deve ainda trocar duas linhas da matriz de posi¸˜o. 9. 9.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.5: Escreva um programa que simule uma pilha usando vetores. PONTEIROS PARA PONTEIROS 169 Exerc´ ıcios 9.

PONTEIROS .170 CAP´ ITULO 9.

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

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

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

nome). p1 . } 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 . co Caso os elementos da estrutura sejam vari´veis de um dos tipos j´ vistos. x ). ıvel ca troca_x. Para se imprimir ao nome do terceiro aluno (in´ em 0) usamos o comando ıcio printf("%s\n". o . troca_x (& p1 . para trocar os valores das coordenadas x dos pontos p1 e p2 usar´ ıamos chamadas da seguinte forma. turma[2]. co co e O exemplo 10. A fun¸˜o que recebe este parˆmetro est´ preparada para receber uma vari´vel ca a a a de ponto flutuante simples. considere a estrutura e s t r u c t ponto { f l o a t x.5 Estruturas e Fun¸oes c˜ Primeiro vamos considerar o caso de passar elementos da estrutura para fun¸˜es. A declara¸˜o abaixo u ca define uma matriz de 100 estruturas do tipo aluno. 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. struct aluno turma[100]. 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. y.x . ESTRUTURAS 10. Por exemplo. p2 . x ) == 0 ) puts ( " Eixo y ). & p2 . else puts ( " Eixo negativo dos x " ). else if ( positivo ( p1 . 10. mas isto veremos no pr´ximo item. x ) >0 ) puts ( " Eixo positivo dos x " ).174 CAP´ ITULO 10.4 Matrizes de Estruturas Estruturas aparecem freq¨entemente na forma de matrizes.2 mostra atribui¸˜es entre estruturas e opera¸˜es aritm´ticas envolvendo membros de estruturas. 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).

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

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

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

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

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

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

> nome ).6.10. ( cadastro + i ) . Fun¸˜o imprime (nota¸˜o ponteiros) ca ca printf ( " Nome = % s \ n " . salario > 1000. 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 ].2 f \ n " . scanf ( " % f " . printf ( " Salario = %.> salario ). salario * 0.> nome ). PONTEIROS PARA ESTRUTURAS 181 Observar que neste exemplo usamos as duas nota¸˜es poss´ co ıveis para representar elementos de uma estrutura. &(( cadastro + i ) . Fun¸˜o imposto (nota¸˜o vetorial) ca ca i f ( cadastro [ i ].10.25.> salario )). ( cadastro + i ) . Fun¸˜o le (nota¸˜o ponteiros) ca ca gets (( cadastro + i ) . . 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. else func += cadastro [ i ].

Inicialize cada materia com um numero. a • renda mensal do do cliente.1: Considere que uma empresa precisa armazenar os seguintes dados de um cliente: • Nome completo com no m´ximo 50 caracteres. 10. 10.2 empregando fun¸˜es para implementar as co diversas tarefas do programa. 10. ESTRUTURAS Exerc´ ıcios 10.6: Escrever um programa que utilize union. • possui ou n˜o carro.4: Escrever um programa que utilize structs e ponteiro para struct e imprima o conteudo das variaveis da struct. 10. e • quantos clientes nasceram entre 1960 (inclusive) e 1980 (exclusive). 10. Inicialize as variaveis com valores diferentes e imprima o conteudo delas.5: Escrever um programa que utilize enumeradores com as materias do seu periodo.2: Considerando a mesma estrutura do exerc´ anterior. e e • quantos clientes tˆm carro.3: Reescreva o programa 10. Depois imprime os valores das variaveis enumeradas. Um exemplo de entrada poderia ser o seguinte: empilha C empilha B empilha A desempilha A desempilha B . • ano de nascimento.7.7: Fazer um programa que simule uma pilha push pop. 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.182 CAP´ ITULO 10. usando structs. 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 fun¸˜o main deve ficar da maneira indicada na ca Listagem 10. 10.

O programa deve ter trˆs opcoes apenas: uma que adiciona um novo e dado. Apresente no final a distˆncia entre os dois pontos. ordena_medias ( turma ). o 10. " ). getchar (). PONTEIROS PARA ESTRUTURAS Listing 10.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). imprime ( turma ). 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.11: Crie uma estrutura chamada retangulo.7: Listagem do exercicio 3. getchar ().6. } 183 desempilha C 10. getchar (). outra que lista todos os dados atualmente armazenados na mem´ria e o outra que sai do programa. puts ( " Imprimindo dados lidos da turma . puts ( " Digite qualquer coisa para continuar . contendo apenas a posi¸˜o x e y (inteiros) do ca ponto. e informe a ´rea.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. imprime ( turma ). puts ( " Digite qualquer coisa para continuar . a a 10.12: Escreva um programa que use as mesmas estruturas do exerc´ anterior ıcio para descobrir se um ponto est´ dentro de um retˆngulo. Fa¸a um programa c que receba as informa¸˜es acerca de um retˆngulo (as coordenadas dos dois co a pontos). " ). puts ( " Imprimindo dados ordenados da turma . a a . que possua duas estruturas ponto (o ponto superior esquerdo e o ponto inferior direito). o comprimento da diagonal e o comprimento de cada a aresta 10. " ). Vocˆ dever´ criar e a uma estrutura chamada Ponto.10.10: Escreva um programa fazendo o uso de estruturas. le ( turma ). a 10. i n t main ( void ) { s t r u c t aluno turma [ MAX ]. " ). leia a posi¸˜o (coordenadas x e y) de cada um e calcule ca a distˆncia entre eles. Declare 2 pontos.

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

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.1 Fluxos de Texto Um fluxo de texto ´ composto por uma seq¨ˆncia de caracteres. Por exemplo. a 11.2.1 Introdu¸˜o ca Em C n˜o existem comandos de Entrada e Sa´ especiais como em outras a ıda linguagens de programa¸˜o. 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.Cap´ ıtulo 11 Entrada e Sa´ por ıda Arquivos 11. Todos os diferentes sistemas de arquivos se comportam da mesma maneira quando manipulados como um fluxo cont´ ınuo de dados. que pode ou e ue n˜o ser dividida em linhas terminadas por um caractere de final de linha. Dados podem ser manipulados em dois diferentes tipos de fluxos: fluxos de texto e fluxos bin´rios. 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. Em UNIX um final de linha ´ a e 185 . 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. 11. sendo estas tarefas executadas por fun¸˜es especa co cialmente criadas para esta finalidade e armazenadas em bibliotecas espec´ ıficas.

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

h. 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. Para definir co uma vari´vel deste tipo o programa deve conter a seguinte declara¸˜o a ca FILE *arq. a Ao final das opera¸˜es necess´rias o programa deve fechar o arquivo. o e a o ca programa pode utilizar os dados armazenados no arquivo. • procurar saber se o fim do arquivo foi atingido.h. e a co . Opera¸˜es comuns em arquivos s˜o: co a • abertura e fechamento de arquivos. FUNCOES DE ENTRADA E SA´ ¸˜ IDA 187 11. onde arq ´ o ponteiro que ser´ usado para executar as opera¸˜es no arquivo.2. para uma impressora n˜o ´ poss´ usar a fun¸˜o que a e ıvel ca reposiciona o arquivo no ´ ınicio. Para que um determinado arquivo seja associado a um detere minado fluxo ´ necess´rio que o arquivo seja “aberto”. 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. Para ter acesso aos dados em um arquivo ´ necess´rio a defini¸˜o de um e a ca ponteiro do tipo especial FILE.3. Um arquivo em disco permite acesso aleat´rio o enquanto um teclado n˜o. Este tipo tamb´m est´ definido na biblioteca e a stdio. Caso o arquivo seja de entrada o conte´do do buffer ´ esvaziado. disquete. • apagar um arquivo.11. disco r´ ıgido etc. • leitura e escrita de um caracter. Obviamente algumas dessas fun¸˜es n˜o se aplicam a todos os tipos de disco a positivos.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. u e 11. teclado. As fun¸˜es mais comuns est˜o mostradas a co a na tabela 11. Ap´s esta opera¸˜o.1. Por exemplo. • posicionar o arquivo em um ponto determinado. Programas vˆem os arquivos e atrav´s de fluxos.

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. 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.188 Fun¸˜o ca fopen() fputc() getc(). o arquivo deve existir ou um erro ocorre. leitura/escrita.4. 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(). u e .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()). 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. “w”: Cria um arquivo vazio para escrita. 11. caso um arquivo com o mesmo nome exista o seu conte´do ´ apagado. A seguir listamos os a diversos modos que podem ser usados para abrir um arquivo. adic˜o de texto etc. 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. ca Esta opera¸˜o associa um fluxo de dados a um arquivo. ele deve ser “aberto”. escrita.1 Abrindo um Arquivo Antes de qualquer opera¸˜o ser executada com o arquivo. 11. “r”: Abre um arquivo para leitura. 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. fgetc() fprintf() sscanf() fscanf() fseek() rewind() feof() ferror() fflush() fread() fwrite() CAP´ ITULO 11. 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.

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

while (! feof ( stdin )) { putchar ( c ). 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. 11. qualquer outro valor ca e implica em erro.4. } return 0. Uma opera¸˜o semelhante ao que fazemos em uma fita cassete de m´sica ca u . Neste exemplo a leitura termina quando o usu´rio digita o a caracter <ctl>+D. A pergunta que ca pode surgir ´ a seguinte . c = getchar ().1: Uso da fun¸˜o feof().190 CAP´ ITULO 11.4 Volta ao In´ ıcio A fun¸˜o rewind() recoloca o indicador de posi¸˜o de arquivo no inicio do arca ca quivo.3 Fim de Arquivo A fun¸˜o feof() indica que um arquivo chegou ao seu final. A fun¸˜o feof() serve para indicar a ca que o final de um arquivo bin´rio foi encontrado. O sistema operacional pode exa ecutar a ordem no momento que achar mais conveniente. 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.h > i n t main ( void ) { char c . ENTRADA E SA´ IDA POR ARQUIVOS buffers s˜o perdidos. ca #include < stdio . a O exemplo 11. e Listing 11. O valor zero indica que ainda n˜o se chegou ao final do arquivo.1 mostra um programa que lˆ um caractere do teclado e o e mostra na tela. que indica final de arquivo pelo teclado em Unix (no outro sistema ´ <ctl>+Z).Se j´ existe o valor EOF para indicar o final de arquivo. } 11.4. Naturalmente esta fun¸˜o a ca pode ser aplicada tamb´m a arquivos texto. Um valor zero de retorno significa que a opera¸˜o foi executada com ˆxito. c = getchar (). 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.

pode-se usar as fun¸˜es getc() e fgetc().11. ca a 11.2 mostra como um arquivo pode ser criado para leitura e escrita. Uma outra alternativa mostrada em 11. 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 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. O pr´ximo passo ´ a leitura do arquivo que ´ iniciada ap´s uma chamada o e e o a fun¸˜o rewind(). ıcio . que foi previamente aberto. co a Para ler um caracter de um arquivo. 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. ca O programa 11. ca Para escrever caracteres h´ duas fun¸˜es definidas putc() e fputc(). n˜o ir´ permitir outra a a opera¸˜o que n˜o seja “escrita”. que s˜o equivalentes. 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. Por exemplo. O apontador do arquivo avan¸a um caractere e passa a apontar para o pr´ximo caractere a ser lido.5 Lendo e Escrevendo Caracteres As opera¸˜es mais simples em arquivos s˜o a leitura e escrita de caracteres.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. LENDO E ESCREVENDO CARACTERES ou v´ ıdeo. um arquivo aberto somente ca co para “escrita” e em seguida reposicionado para o in´ ıcio. fazendo com que o indicador de posi¸˜o do arquivo volte a ca ca apontar para seu in´ ıcio. A fun¸˜o ferror() pode ser usada para determinar se um erro ocorreu. onde o byte mais significativo vale zero. c o A fun¸˜o devolve o c´digo EOF ao chegar ao final do arquivo ou caso um erro ca o ocorra. O prot´tipo de fgetc ´: co a o e int fgetc (FILE *parq). O a co prot´tipo da fun¸˜o fputc ´ o seguinte: o ca e int fputc(int ch. Em seguida um conjunto de caracteres lido do teclado ´ escrito no are quivo.

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

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

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

e Em escritas. 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. Um n´mero negativo ´ retornado em caso de e u e falha. o que n˜o acontece com dados a a em bin´rio. . onde parq ´ um ponteiro de arquivo recebido ap´s uma chamada a fopen(). .6 mostra o uso destas fun¸˜es para ler e escrever v´rios tipos co a de dados em um arquivo. No caso de erro o ponteiro str recebe o valor NULL. Esta ca u contagem pode igualar o n´mero esperado de leituras ou ser menor no caso u de falha. o n´mero total de ca u caracteres escrito ´ retornado. . Caso ocorra uma falha antes de que uma leitura possa ser feita com sucesso. Dados gravados em ASCII o ca podem ser facilmente verificados pelos usu´rios.). caso a opera¸˜o de escrita tenha sucesso.5 mostra um exemplo e e de uso destas fun¸˜es para ler e escrever cadeias de caracteres em um arquivo. Os prot´tipos das duas fun¸˜es s˜o os seguintes: o co a int fprintf(FILE *parq. EOF ´ retornado. a O exemplo 11. O caractere de nova linha interrompe a leitura. Se o fim do arquivo for encontrado e nenhum caractere foi lido.). const char *formatacao. e o Em leituras. O exemplo 11. O ponteiro str ´ retornado e caso a leitura ocorra sem erro. int fscanf(FILE *parq. co c sejam maneiras convenientes de escrecer e ler dados de arquivos.. o que obriga e a uma convers˜o dos dados a cada opera¸˜o realizada. co 11. sendo a unica modifica¸˜o o fato de que elas trabalham com e ´ ca fluxos de dados (arquivos). Embora estas duas fun¸˜es.. 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.8. por sua semelhan¸a com printf() e scanf(). 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.. A perda a de tempo ´ devido ao fato dos dados serem gravados em ASCII. elas tˆm a e desvantagem de serem mais lentas do que uso de arquivos bin´rios..11.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. const char *formatacao. o conte´ do u de str ´ mantido e um NULL ´ retornado. 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. a fun¸˜o retorna o n´mero de itens lidos com sucesso.

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

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

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

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

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

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

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

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

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

205 . Por exemplo.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. Existe o uma table extendida para 8 bits que inclue os caracteres acentuados.1 mostra os c´digos para a tabela ASCII de 7 bits. Eles tˆm o sige e nificado mostrado na Tabela A. A Tabela A. 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 ” . servem para comunica¸˜o com ca perif´ricos e controlar a troca de dados entre computadores. 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 . o c´digo da letra a min´scula ´ 97 na base 10.2. 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. E O Y c m w 0 1 2 3 4 5 6 7 8 9 10 11 12 Tabela A. 6 @ J T ^ h r — 5 enq si em # 7 A K U _ i s } 6 ack dle sub $ . Cada caracter ´ representado por um c´digo de 8 e o bits.1: Conjunto de caracteres ASCII Os caracteres de controle listados acima.

2: Conjunto de c´digos especiais ASCII e seus significados o .206 ˆ APENDICE A. 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.

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

uma vari´vel deve ser armazenada nos registradores do procesa sador. for: Comando de repeti¸˜o que cont´m inicializa¸˜o de vari´veis. . caso seja poss´ ıvel.208 ˆ APENDICE B. static: Modificador usado para significar que o compilador deve preparar o c´digo de forma a reter o valor da vari´vel. sizeof: Operador que retorna o tamanho em bytes do item fornecido. long: Tipo de dados usado para armazenar valores inteiros com precis˜o maior a do que o tipo int. Tamb´m pode ca ca ca e ser usado para retornar um unico valor. incremento e ca e ca a se¸˜es condicionais. permitindo in´meras possibilidades. a a register: Especificador de classe de armazenamento que pede que. 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. a int: Tipo de dados usado para armazenar valores inteiros. extern: Modificador de dados que indica que uma vari´vel ir´ ser declarada a a em outra ´rea do programa. 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. o if: Comando de testes usado para mudar o fluxo do programa baseada em uma decis˜o VERDADE/FALSO. a float: Tipo usado para armazenar valores de ponto flutuante. Em C o comando for ´ um comando de repeti¸˜o co e ca extremamente flex´ ıvel. Nos computadores modernos o tipo long tem a mesma precis˜o que o tipo int e s˜o usados 4 bytes. 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. u goto: Comando que causa um pulo para uma posi¸˜o do programa marcada ca com um r´tulo. a signed: Modificador usado para indicar que uma vari´vel pode armazenar tanto a valores positivos como negativos. Neste tipo 2 bytes s˜o usados para armazenar os dados. ´ short: Tipo de dados usado para armazenar valores inteiros em precis˜o menor a do que o tipo int. o a struct: Usado para combinar C vari´veis de tipos diferentes na mesma estrua tura.

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

PALAVRAS RESERVADAS .210 ˆ APENDICE B.

Bibliografia 211 .

You're Reading a Free Preview

Descarregar
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->