ufrj - linguagem c

Upload: michel-soares-de-sousa

Post on 18-Jul-2015

118 views

Category:

Documents


2 download

TRANSCRIPT

Curso de Linguagem C Em Construo ca v0.003.11Adriano Joaquim de Oliveira Cruz Instituto de Matemtica a N cleo de Computao Eletrnica u ca o UFRJ c 2011 Adriano Cruz 15 de Maro de 2011 c

Contedo u1 Introduo ca 1.1 1.2 Sucessos e Fracassos da Computaao . . . . . . . . . . . . . . . . c Um Pouco da Histria da Computaao . . . . . . . . . . . . . . . o c 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 1.6 O In cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Era Moderna . . . . . . . . . . . . . . . . . . . . . . . . O Desenvolvimento durante as Grandes Guerras . . . . . As Geraoes . . . . . . . . . . . . . . . . . . . . . . . . . . c Microcomputadores . . . . . . . . . . . . . . . . . . . . . Memrias . . . . . . . . . . . . . . . . . . . . . . . . . . . o Bits e Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . Perifricos . . . . . . . . . . . . . . . . . . . . . . . . . . . e 13 13 15 15 15 18 20 21 22 23 25 26 26 32 33 34 34 35 37 37 37 38 40 41 42 42 43

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

O Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um programa em C . . . . . . . . . . . . . . . . . . . . . . . . . Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Algoritmos 2.1 2.2 2.3 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Primeiros Passos . . . . . . . . . . . . . . . . . . . . . . . . . . . Representaao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 2.3.1 2.3.2 2.3.3 2.4 2.5 Linguagem Natural . . . . . . . . . . . . . . . . . . . . . . Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . Pseudo-Linguagem . . . . . . . . . . . . . . . . . . . . . .

Modelo de von Neumann . . . . . . . . . . . . . . . . . . . . . . . Estruturas Bsicas de Algoritmos . . . . . . . . . . . . . . . . . . a 2.5.1 2.5.2 2.5.3 Comandos de leitura . . . . . . . . . . . . . . . . . . . . . Comandos de escrita . . . . . . . . . . . . . . . . . . . . . Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . o 1

2.5.4 2.5.5 2.5.6 2.6 2.7

Comandos de atribuiao . . . . . . . . . . . . . . . . . . . c Comandos de controle . . . . . . . . . . . . . . . . . . . . Comandos de repetiao . . . . . . . . . . . . . . . . . . . c

45 46 47 48 53 55 55 55 55 56 56 57 58 59 59 60 61 62 62 63 63 64 65 67 67 67 68 69 71 73 73 74 75 75 76 78

Exemplos de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Tipos de Dados, Constantes e Variveis a 3.1 3.2 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 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 3.6 Tipos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . a Modicadores de tipos . . . . . . . . . . . . . . . . . . . . Constantes Inteiras na base 10 . . . . . . . . . . . . . . . Constantes Inteiras Octais . . . . . . . . . . . . . . . . . . Constantes Inteiras Hexadecimais . . . . . . . . . . . . . . Converso entre Bases . . . . . . . . . . . . . . . . . . . . a Constantes em Ponto Flutuante . . . . . . . . . . . . . . . Constantes Cadeias de Caracteres . . . . . . . . . . . . . Nomes das Variveis . . . . . . . . . . . . . . . . . . . . . a Declaraao de variveis . . . . . . . . . . . . . . . . . . . c a Atribuiao de valores . . . . . . . . . . . . . . . . . . . . . c

Constantes Numricas . . . . . . . . . . . . . . . . . . . . . . . . e

Constantes Caracteres . . . . . . . . . . . . . . . . . . . . . . . . Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a

Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Entrada e Sa pelo Console da 4.1 4.2 4.3 4.4 4.5 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Biblioteca Padro . . . . . . . . . . . . . . . . . . . . . . . . . . . a Sa - A Funao printf . . . . . . . . . . . . . . . . . . . . . . . da c 4.3.1 Cdigos de Converso . . . . . . . . . . . . . . . . . . . . o a Entrada - A Funao scanf . . . . . . . . . . . . . . . . . . . . . . c Lendo e Imprimindo Caracteres . . . . . . . . . . . . . . . . . . . 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6 Funoes getchar e putchar . . . . . . . . . . . . . . . . . c Lendo e Imprimindo Cadeias de Caracteres . . . . . . . . Lendo e Imprimindo cadeias com scanf e printf . . . . . Lendo e Imprimindo cadeias com gets e puts . . . . . . . A Funao fgets . . . . . . . . . . . . . . . . . . . . . . . c

Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

5 Operadores e Expresses o 5.1 5.2 5.3 5.4 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Operador de Atribuiao . . . . . . . . . . . . . . . . . . . . . . . c Operadores Aritmticos . . . . . . . . . . . . . . . . . . . . . . . e Operadores Relacionais e Lgicos . . . . . . . . . . . . . . . . . . o 5.4.1 5.4.2 5.5 5.6 5.7 5.8 5.9 Operadores Relacionais . . . . . . . . . . . . . . . . . . . Operadores Lgicos o . . . . . . . . . . . . . . . . . . . . .

79 79 79 80 81 81 81 83 85 86 86 87 88 89 91 91 91 91 92 93 95 97 97

Operadores com Bits . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de Atribuiao Composta . . . . . . . . . . . . . . . . c Operador v rgula . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador sizeof() . . . . . . . . . . . . . . . . . . . . . . . . . . Converso de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . a

5.10 Regras de Precedncia . . . . . . . . . . . . . . . . . . . . . . . . e 5.11 Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Comandos de Controle 6.1 6.2 6.3 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Blocos de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . Comandos de Teste . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 6.3.2 6.3.3 6.4 6.4.1 6.4.2 6.4.3 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.5.5 6.6 Comando if . . . . . . . . . . . . . . . . . . . . . . . . . . Comando switch . . . . . . . . . . . . . . . . . . . . . . . Comando Ternrio . . . . . . . . . . . . . . . . . . . . . . a Comando for . . . . . . . . . . . . . . . . . . . . . . . . .

Laos de Repetiao . . . . . . . . . . . . . . . . . . . . . . . . . . c c

Comando while . . . . . . . . . . . . . . . . . . . . . . . 100 Comando do-while . . . . . . . . . . . . . . . . . . . . . 101 Comando break . . . . . . . . . . . . . . . . . . . . . . . 102 Comando continue . . . . . . . . . . . . . . . . . . . . . 102 Comando goto . . . . . . . . . . . . . . . . . . . . . . . . 103 Funao exit() . . . . . . . . . . . . . . . . . . . . . . . . 103 c Comando return . . . . . . . . . . . . . . . . . . . . . . . 103

Comandos de Desvio . . . . . . . . . . . . . . . . . . . . . . . . . 102

Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

3

7 Vetores e Cadeias de Caracteres 7.1 7.2 7.3 7.4 7.5 7.6 7.7

107

Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 c Declaraao de Vetores Unidimensionais . . . . . . . . . . . . . . . 107 c Cadeias de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . 108 Declaraao de Vetores Multidimensionais c . . . . . . . . . . . . . 112 Vetores de Cadeias de Caracteres . . . . . . . . . . . . . . . . . . 114 Inicializaao de Vetores e Matrizes . . . . . . . . . . . . . . . . . 116 c Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 122

8 Funoes c 8.1 8.2 8.3 8.4

Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 c Forma Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Prottipos de Funoes . . . . . . . . . . . . . . . . . . . . . . . . 124 o c Escopo de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . 125 a 8.4.1 8.4.2 Variveis Locais . . . . . . . . . . . . . . . . . . . . . . . 125 a Variveis Globais . . . . . . . . . . . . . . . . . . . . . . . 127 a Passagem de Parmetros por Valor . . . . . . . . . . . . . 128 a Passagem de Parmetros por Referncia . . . . . . . . . . 129 a e Passagem de Vetores e Matrizes . . . . . . . . . . . . . . . 129

8.5

Parmetros Formais . . . . . . . . . . . . . . . . . . . . . . . . . 127 a 8.5.1 8.5.2 8.5.3

8.6 8.7 8.8 8.9

O Comando return . . . . . . . . . . . . . . . . . . . . . . . . . 132 Recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 a Argumentos - argc e argv . . . . . . . . . . . . . . . . . . . . . . 133 Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 138

9 Ponteiros 9.1 9.2

Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 c Operaoes com Ponteiros . . . . . . . . . . . . . . . . . . . . . . 139 c 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 Declaraao de Ponteiros . . . . . . . . . . . . . . . . . . . 139 c Os Operadores Especiais para Ponteiros . . . . . . . . . . 140 Atribuiao de Ponteiros . . . . . . . . . . . . . . . . . . . 141 c Incrementando e Decrementando Ponteiros . . . . . . . . 142 Comparaao de Ponteiros . . . . . . . . . . . . . . . . . . 144 c . . . . . . . . . . . . . . . . . 145

9.3 9.4 9.5 9.6 9.7 9.8 9.9

Ponteiros e Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Ponteiros e Cadeias de Caracteres Alocaao Dinmica de Memria . . . . . . . . . . . . . . . . . . . 146 c a o Ponteiros e Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 147 Vetores de Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . 148 Ponteiros para Ponteiros . . . . . . . . . . . . . . . . . . . . . . . 151 Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 4

10 Estruturas

160

10.1 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 c 10.2 Denioes Bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . 160 c a 10.3 Atribuiao de Estruturas . . . . . . . . . . . . . . . . . . . . . . . 163 c 10.4 Matrizes de Estruturas . . . . . . . . . . . . . . . . . . . . . . . . 163 10.5 Estruturas e Funoes . . . . . . . . . . . . . . . . . . . . . . . . . 164 c 10.6 Ponteiros para Estruturas . . . . . . . . . . . . . . . . . . . . . . 166 10.7 Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 11 Entrada e Sa por Arquivos da 171

11.1 Introduao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 c 11.2 Fluxos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 11.2.1 Fluxos de Texto . . . . . . . . . . . . . . . . . . . . . . . 171 11.2.2 Fluxo Binrio . . . . . . . . . . . . . . . . . . . . . . . . . 172 a 11.2.3 Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 11.3 Funoes de Entrada e Sa c da . . . . . . . . . . . . . . . . . . . . . 173 11.4 In e Fim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 cio 11.4.1 Abrindo um Arquivo . . . . . . . . . . . . . . . . . . . . . 174 11.4.2 Fechando um Arquivo . . . . . . . . . . . . . . . . . . . . 175 11.4.3 Fim de Arquivo . . . . . . . . . . . . . . . . . . . . . . . . 176 11.4.4 Volta ao In cio . . . . . . . . . . . . . . . . . . . . . . . . 176 11.5 Lendo e Escrevendo Caracteres . . . . . . . . . . . . . . . . . . . 177 11.6 Testando Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 11.7 Lendo e Escrevendo Cadeias de Caracteres . . . . . . . . . . . . . 180 11.8 Entrada e Sa Formatada . . . . . . . . . . . . . . . . . . . . . 181 da 11.9 Lendo e Escrevendo Arquivos Binrios . . . . . . . . . . . . . . . 182 a 11.10Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 12 Problemas Extras A Tabela ASCII B Palavras Reservadas 188 199 201

5

Lista de Figuras1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Fotograa de um circuito integrado de microprocessador Pentium. 14 Imagem de um baco. . . . . . . . . . . . . . . . . . . . . . . . . a Blaise Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Charles Babbage . . . . . . . . . . . . . . . . . . . . . . . . . . . Fotograa da Dierence Engine . . . . . . . . . . . . . . . . . . . Computador Eniac . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama Bsico de um Computador Digital . . . . . . . . . . . a N veis de hierarquia da memria de um computador. . . . . . . . o Tamanho de Bits, Bytes e Palavras . . . . . . . . . . . . . . . . . 15 16 17 17 19 22 23 25 30 38 39 42 46 48 50

1.10 Ciclo de desenvolvimento de um programa. . . . . . . . . . . . . 2.1 2.2 2.3 2.4 2.5 2.6 7.1 9.1 9.2 9.3 9.4 9.5 9.6 9.7 S mbolos mais comumente usados em uxogramas. . . . . . . . . Fluxograma para resolver uma equaao do primeiro grau. . . . . c Modelo de memria . . . . . . . . . . . . . . . . . . . . . . . . . o Fluxograma do comando se ... ent~o ... a sen~o. . . . . . . a Fluxograma para decidir se deve levar um guarda-chuva. . . . . . Fluxograma do comando enquanto. . . . . . . . . . . . . . . . .

Mapa de memria de uma matriz. . . . . . . . . . . . . . . . . . 116 o Mapa de memria com duas variveis e ponteiro. . . . . . . . . . 138 o a Ponteiro apontando para rea de memria contendo vetor. . . . . 139 a o Declaraao de ponteiros. . . . . . . . . . . . . . . . . . . . . . . . 140 c Atribuiao de endereo de uma varivel a um ponteiro. . . . . . . 141 c c a Uso de um ponteiro para copiar valor de uma varivel. . . . . . . 141 a Exemplos de atribuioes de ponteiros. . . . . . . . . . . . . . . . 142 c Armazenamento de matrizes com vetores de ponteiros. . . . . . . 152

11.1 Fluxos de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

6

Lista de Tabelas1.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 3.8 4.1 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 7.1 Transistores por circuito integrado nos microprocessadores da Intel 14 Tempo de execuao das instruoes aritmticas no ENIAC . . . . c c e Exemplos de Microprocessadores . . . . . . . . . . . . . . . . . . Abreviaoes usadas em referncias `s memrias. . . . . . . . . . . c e a o Exemplos de perifricos . . . . . . . . . . . . . . . . . . . . . . . e Operadores Aritmticos. . . . . . . . . . . . . . . . . . . . . . . . e Tipos de dados denidos pelo Padro ANSI C. . . . . . . . . . . a Constantes Inteiras na Base 10 . . . . . . . . . . . . . . . . . . . Constantes octais . . . . . . . . . . . . . . . . . . . . . . . . . . . Constantes hexadecimais . . . . . . . . . . . . . . . . . . . . . . . Constantes em ponto utuante . . . . . . . . . . . . . . . . . . . Exemplos de constantes caractere . . . . . . . . . . . . . . . . . . Exemplos de caracteres invis veis. . . . . . . . . . . . . . . . . . . Tabela do exercicio 6 . . . . . . . . . . . . . . . . . . . . . . . . . Cdigos de Converso para escrita de dados. . . . . . . . . . . . . o a Operadores aritmticos. . . . . . . . . . . . . . . . . . . . . . . . e Operadores Relacionais. . . . . . . . . . . . . . . . . . . . . . . . Operador Lgico E. . . . . . . . . . . . . . . . . . . . . . . . . . . o Operador Lgico OU. . . . . . . . . . . . . . . . . . . . . . . . . . o Operador Lgico N~O. . . . . . . . . . . . . . . . . . . . . . . . . o A Precedncia dos operadores lgicos e relacionais. . . . . . . . . . e o Operadores com bits. . . . . . . . . . . . . . . . . . . . . . . . . . Operador Lgico OU. . . . . . . . . . . . . . . . . . . . . . . . . . o Precedncia dos operadores. . . . . . . . . . . . . . . . . . . . . . e 19 22 26 26 45 57 58 59 59 61 62 62 66 69 80 81 82 83 83 83 84 84 88

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

7

11.1 Exemplos de funoes de Entrada e Sa c da. . . . . . . . . . . . . . 174 A.1 Conjunto de caracteres ASCII . . . . . . . . . . . . . . . . . . . . 199 A.2 Conjunto de cdigos especiais ASCII e seus signicados . . . . . 200 o

8

Lista de Algoritmos2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Exemplo de Algoritmo. . . . . . . . . . . . . . . . . . . . . . . . . Algoritmo para resolver uma equaao do primeiro grau. . . . . . . c Algoritmo para calcular a mdia das notas de um aluno. e . . . . . Algoritmo para calcular a maior nota de um grupo de notas. . . . Modelo de memria 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 nmeros e imprimir se so pares ou no. . . u a a 36 36 38 40 41 46 47 47 49 51 51 52 54 54 60

2.10 Algoritmo para ler nmeros e imprimir se so pares ou no. A quantidade de n meros a ser lida de u a a u e 2.11 Algoritmo para calcular a maior nota de uma turma de 25 alunos. 2.12 Algoritmo para calcular a nota mdia de uma turma de 25 alunos. e 2.13 Algoritmo para calcular a maior temperatura do ano. . . . . . . . 2.14 Algoritmo do exerc 11. . . . . . . . . . . . . . . . . . . . . . . cio 2.15 Algoritmo do exerc 11. . . . . . . . . . . . . . . . . . . . . . . cio 3.1 Algoritmo para converter inteiros na base 10 para uma base b. . .

9

Listings1.1 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 5.1 5.2 5.3 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 Exemplo de Programa em C. . . . . . . . . . . . . . . . . . . . . Exemplo de impresso de resultados . . . . . . . . . . . . . . . . a Exemplo de justicaao de resultados. . . . . . . . . . . . . . . . c Exemplo de uso de especicador de preciso. . . . . . . . . . . . a Exemplo de uso de scanf. . . . . . . . . . . . . . . . . . . . . . Exemplo de uso de getchar e putchar. . . . . . . . . . . . . . . Exemplo de uso de getchar e putchar. . . . . . . . . . . . . . . Exemplo de uso de printf e scanf na leitura de cadeias. . . . . Exemplo de uso de puts e gets na leitura de cadeias. Exemplo de operadores de deslocamento. Exemplo do operador sizeof. Variveis da questo 9. a a Exemplo de comandos if. Exemplo de switch. . . . . . . . . . . . . . . . . . . . 32 68 70 71 73 74 74 75 76 85 86 90 92 94 96 97 98 99 99

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Programas com ifs em escada e aninhados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de comando ternrio. . . . . . . . . . . . . . . . . . . . a Exemplo de comando for. . . . . . . . . . . . . . . . . . . . . . . Exemplo de comando for com testes sobre outras variveis. . . . a Exemplo de comando for sem alteraao da varivel de controle. c a Exemplo de comando for sem teste de m. Comando for aninhados.

. . . . . . . . . . . . 100

. . . . . . . . . . . . . . . . . . . . . . 100 . . . . . . . . . . . . . . . . . 101 . . . . . . . . . . . . . . . . . . . . . 106 . . . . . . . . . . . . . . . . . . 110 . . . . . . . . . . . . . . . . . 111

6.10 Comando while com uma funao. c 6.11 Programa do exercicio 17. 7.1 7.2 7.3 7.4 7.5

Exemplo de vetores. . . . . . . . . . . . . . . . . . . . . . . . . . 108 Produto escalar de dois vetores. Ordenaao pelo mtodo da bolha. c e Leitura de uma matriz.

Exemplos de funoes para cadeias. . . . . . . . . . . . . . . . . . 113 c . . . . . . . . . . . . . . . . . . . . . . . 114

10

7.6 7.7 7.8 7.9 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9

Multiplicaao de duas matrizes. c

. . . . . . . . . . . . . . . . . . 115

Leitura de um vetor de nomes. . . . . . . . . . . . . . . . . . . . 117 Exemplos de tratamento de vetores. . . . . . . . . . . . . . . . . 118 Exemplos de tratamento de vetores. . . . . . . . . . . . . . . . . 118 . . . . . . . . . . . . . . . . . . . . . 121 Exemplo de prottipos. . . . . . . . . . . . . . . . . . . . . . . . 124 o Exemplos de variveis locais. . . . . . . . . . . . . . . . . . . . . 126 a Deniao de varivel dentro de um bloco. . . . . . . . . . . . . . 126 c a Deniao de varivel global. c a . . . . . . . . . . . . . . . . . . . . 127 Exemplo de passagem por valor. . . . . . . . . . . . . . . . . . . 128 Uso indevido de variveis locais. . . . . . . . . . . . . . . . . . . 129 a Passagem de vetor com dimenses. o . . . . . . . . . . . . . . . . 130 Passagem de vetores sem dimenses. . . . . . . . . . . . . . . . . 131 o Funao recursiva para calcular xn . . . . . . . . . . . . . . . . . . 133 c . . . . . . . . . . . . . . . . . . . . . . 136

7.10 Programa do exercicio 14.

8.10 Uso de argc e argv. . . . . . . . . . . . . . . . . . . . . . . . . . 134 8.11 Programa do exerc 8. cio 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 8.12 Programa do problema 9. . . . . . . . . . . . . . . . . . . . . . . 136 Exemplo de atribuiao de ponteiros. . . . . . . . . . . . . . . . . 142 c Exemplos de operaoes com ponteiros. c . . . . . . . . . . . . . . 143 Exemplo de subtraao de ponteiros. . . . . . . . . . . . . . . . . 144 c Exemplo de comparaao de ponteiros. . . . . . . . . . . . . . . . 144 c Exemplo de alteraoes invlidas sobre ponteiros. . . . . . . . . . 145 c a Exemplo de notaoes de vetores. . . . . . . . . . . . . . . . . . . 145 c Exemplo de ponteiro varivel. a . . . . . . . . . . . . . . . . . . . 146 . . . . . . . . . 146 Exemplo de ponteiro para cadeia de caracteres.

Exemplo de cpia de cadeias de caracteres. . . . . . . . . . . . . 147 o . . . . . . . . . . . . . . . . . 148 . . . . . . . . 150 . . . . . . . . . . . . . . . . . . . . . 149 . . . . . . . . . . . . 150 . . . . . . . . . . . 153 . . 154

9.10 Exemplo de uso de calloc e free. 9.11 Exemplo de uso de malloc.

9.12 Exemplo de matriz normal sem uso de ponteiros. 9.13 Exemplo de matriz mapeada em um vetor. 9.14 Exemplo de uso de vetor de ponteiros. 9.15 Exemplo de uso de ponteiros para ponteiros. 9.17 Continuaao do exemplo 9.16. c 9.18 Programa do exercicio 11. 9.19 Programa do exercicio 12.

. . . . . . . . . . . . . . 151

9.16 Exemplo de uso de ponteiros para ponteiros usando funoes. c

. . . . . . . . . . . . . . . . . . . 155

. . . . . . . . . . . . . . . . . . . . . 157 . . . . . . . . . . . . . . . . . . . . . 158

9.20 Listagem do exerc 13. . . . . . . . . . . . . . . . . . . . . . . 158 cio 11

9.21 Programa do exerc 14. cio

. . . . . . . . . . . . . . . . . . . . . 159

10.1 Deniao de uma estrutura. . . . . . . . . . . . . . . . . . . . . . 161 c 10.2 Atribuiao de Estruturas. . . . . . . . . . . . . . . . . . . . . . . 163 c 10.3 Ordenaao de Estruturas. . . . . . . . . . . . . . . . . . . . . . . 163 c 10.4 Passando elementos para funoes. c 10.6 Funao que ordena estruturas. c . . . . . . . . . . . . . . . . . 164 . . . . . . . . . . . . . . . 165 10.5 Passagem de estruturas para funoes. c

. . . . . . . . . . . . . . . . . . . 166

10.7 Alocaao de espao para estruturas. . . . . . . . . . . . . . . . . 167 c c 10.8 Alocaao de espao para vetores de estruturas. . . . . . . . . . . 168 c c 10.9 Listagem do exercicio 3. 11.1 Uso da funao feof(). c . . . . . . . . . . . . . . . . . . . . . . 169 . . . . . . . . . . . . . . . . . . . . . . . 176 . . . . . . . . . . . . 178 . . . . . . . . . . . . 179 . . . . . . 180

11.2 Exemplo de leitura e escrita de caracteres. 11.3 Exemplo de leitura e escrita de caracteres.

11.4 Uso da funao ferror(). . . . . . . . . . . . . . . . . . . . . . . 180 c 11.5 Exemplo de leitura e escrita de cadeias de caracteres. 11.7 Exemplo de leitura e escrita na forma binria. a 11.8 Exemplo de leitura e escrita de estruturas. 11.9 (I) Trecho de programa do problema 14. 11.6 Exemplo de leitura e escrita de dados formatados. . . . . . . . . 182 . . . . . . . . . . 183 . . . . . . . . . . . . 184 . . . . . . . . . . . . . 187

11.10(II) Trecho de programa do problema 14. . . . . . . . . . . . . . 187 12.1 Processando o CPF. . . . . . . . . . . . . . . . . . . . . . . . . . 191 12.2 Estrutura do problema 8. . . . . . . . . . . . . . . . . . . . . . . 195

12

Cap tulo 1

Introduo ca1.1 Sucessos e Fracassos da Computao ca

Os objetivos principais deste cap tulo so mostrar para o aluno iniciante alguns a aspectos da histria da computaao e denir, informalmente, termos e palavraso c chave que os prossionais da rea de computaao usam no seu dia a dia. Adriano a c Cruz c . A histria do desenvolvimento dos computadores tem sido impressionante. o O avano da tecnologia e a presena da computaao na nossa vida so inegveis. c c c a a Embora a histria deste fantstico desenvolvimento seja recente e bem documeno a tada, h lacunas e controvrsias impressionantes sobre diversos pontos. Neste a e cap tulo iremos ver histrias de espionagem e brigas na justia por roubo de o c ideias. H oportunidades perdidas e gente que soube aproveitar a sua chance. a H verdades estabelecidas que tiveram de ser revistas. a O avano na tecnologia dos computadores se deu em passos to largos que os c a primeiros computadores parecem to distantes no tempo quanto a Pr-Histria. a e o O aumento de velocidade, desde os anos 40, foi da vrias ordens de grandeza, a enquanto que o custo dos computadores caiu de milhes de dlares para valoo o res em torno de centenas de dlares. As primeiras mquinas tinham milhares o a de vlvulas, ocupavam reas enormes e consumiam quilowatts de energia. O a a microprocessador Pentium, lanado em 1993, tinha em torno de 3,1 milhes c o de transistores, ocupava uma rea de aproximadamente 25 cm2 e consumia a alguns watts de energia, custando aproximadamente 1000 dlares, somente o o microprocessador. A Figura 1.1 mostra a imagem de um circuito integrado de microprocessador Pentium. No entanto, esta histria de reduao de tamanho, aumento de velocidade e o c diminuiao de gasto de potncia, pode, para alguns pesquisadores, j ter uma c e a data xada para terminar. Em 1965, Gordon Moore, um dos fundadores da Intel, fabricante do Pentium e uma dos maiores fabricantes de circuitos integrados do mundo, enunciou o que cou conhecido como a Lei de Moore: Cada novo circuito integrado ter o dobro de transistores do anterior e ser lanado dentro a a c de um intervalo de 18 a 24 meses. Moore achava que esta lei seria vlida soa mente at 1975, no entanto, ela continua vlida at hoje. Na tabela 1.1, pode-se e a e observar a evoluao dos microprocessadores usados em nossos computadores. c 13

Figura 1.1: Fotograa de um circuito integrado de microprocessador Pentium. 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.250 2.500 5.000 120.000 275.500 1.180.000 3.100.000 7.500.000 24.000.000 42.000.000

Tabela 1.1: Transistores por circuito integrado nos microprocessadores da Intel

Os transistores, que compem os circuitos eletrnicos, esto diminuindo de o o a tamanho, e estamos nos aproximando da fronteira nal, os eltrons. J se houve e a falar em tamanho de transistores medidos em nmeros de eltrons. Devemos nos u e lembrar que toda a tecnologia atual est baseada em uxo de eltrons, ou seja a e uma corrente eltrica. Os os conduzem correntes de eltrons e os transistores e e controlam este uxo. Se o tamanho diminuir alm dos eltrons estaremos em e e outro dom nio. No entanto, na histria da computaao, muitas promessas no foram cumo c a pridas e falhas gigantescas aconteceram. Como em diversas questes, artistas o geniais, apontam o que no conseguimos ou no queremos ver e mostram que a a o rei est nu. H uma frase de Picasso que diz: Computadores so est pidos, a a a u eles somente conseguem responder perguntas. Esta frase expe com ironia o um fracasso da comunidade de computaao que havia prometido criar rapidac mente computadores inteligentes, computadores que poderiam questionar-se e nos questionar. Muitos acreditaram nesta promessa e muitos livros de cao cic ent ca foram publicados em que este tipo de computador estaria dispon em vel um futuro muito prximo. Com notvel exemplo podemos citar o lme 2001 o a Uma Odissia no Espao, de Stanley Kubrik que estreou em 1968 e foi baseado e c no conto The Sentinel, escrito em 1950 por Arthur Clark, um dos mestres da cao cient c ca. Neste lme o enlouquecido computador HAL 9000, que era capaz de ver, falar, raciocinar etc, mata quase todos os tripulantes de uma nave

14

espacial. Ora, j passamos por 2001 e no existe a menor possibilidade de se a a ver um computador como o HAL ou to louco de pedra como ele. a Na computaao, um exemplo fantstico de sucesso a Internet. A Internet c a e est se tornando essencial para o funcionamento do mundo moderno. Freq ena u temente ouvimos dizer que ela o meio de comunicaao que mais rapidamente se e c difundiu pelo mundo. Pode parecer verdade, j que conhecemos tantos internaua tas e as empresas esto se atropelando para fazer parte desta onda e aproveitar a as suas possibilidades. Esta corrida provocou alguns acidentes e muitos sonhos de riqueza se esva ram no ar. Hoje, pode-se fazer quase tudo pela Internet, namorar, comprar, pagar contas, fazer amigos, estudar, jogar etc. Quem sabe, em um futuro prximo, voltaremos ` Grcia Antiga e nos reuniremos em uma o a e enorme praa virtual para, democraticamente, discutir nossas leis, dispensando c intermedirios. a

1.21.2.1

Um Pouco da Histria da Computao o caO In cio

A primeira tentativa de se criar uma mquina de contar foi o baco. A palavra a a vem do rabe e signica p. Os primeiros bacos eram bandejas de areia sobre a o a as quais se faziam guras para representar as operaoes. Aparentemente, os c chineses foram os inventores do baco de calcular. No entanto, h controvrsias, a a e e os japoneses tambm reivindicam esta invenao, que eles chamam de soroban. e c Alm disso h os russos, que inventaram um tipo mais simples, chamado de e a tschoty. So conhecidos exemplares de baco datados de 2500 A.C. A Figura a a 1.2 ilustra um exemplar com as suas contas e varetas.

Figura 1.2: Imagem de um baco. a Em 1901 mergulhadores, trabalhando perto da ilha grega de Antikythera, encontraram os restos de um mecanismo, parecido com um relgio, com aproxio madamente 2000 anos de idade. O mecanismo, de grande complexidade, parece ser um dispositivo para calcular os movimentos de estrelas e planetas.

1.2.2

A Era Moderna

Em 1614 John Napier, matemtico escocs, inventou um dispositivo feito de a e marm para demonstrar a diviso por meio de subtraoes e a multiplicaao por a c c 15

meio de somas. A semelhana entre marm e ossos, fez com que o dispositivo c fosse conhecido como os ossos de Napier. Um dos primeiros instrumentos modernos de calcular, do tipo mecnico, foi a constru pelo lsofo, matemtico e f do o a sico francs Blaise Pascal (Figura 1.3). e Em 1642 aos 19 anos, na cidade de Rouen, Pascal desenvolveu uma mquina de a calcular, para auxiliar seu trabalho de contabilidade. A engenhoca era baseada em 2 conjuntos de discos interligados por engrenagens: um para a introduao c dos dados e outro para armazenar os resultados. A mquina utilizava o sistema a decimal para calcular, de maneira que quando um disco ultrapassava o valor 9, retornava ao 0 e aumentava uma unidade no disco imediatamente superior.

Figura 1.3: Blaise Pascal Pascal recebeu uma patente do rei da Frana, o que lhe possibilitou o c lanamento de sua mquina no mercado. A comercializaao das calculadoras c a c no foi satisfatria devido a seu funcionamento pouco convel, apesar dele ter a o a constru cerca de 50 verses. As mquinas de calcular, derivadas da Pascado o a lina, como cou conhecida sua mquina, ainda podiam ser encontradas em lojas a at alguns poucos anos atrs. Antes de morrer, aos 39 anos, em 1662, Pascal e a que contribu em vrios campos da Cincia, ainda teve tempo de criar uma ra a e variante de sua mquina, a caixa registradora. a Em 1666, Samuel Morland adaptou a calculadora de Pascal para resolver multiplicaoes por meio de uma srie de somas sucessivas. Independentemente, c e em 1671 Leibniz projetou uma outra calculadora que somava e multiplicava. Esta calculadora s foi conclu em 1694. o da O primeiro computador de uso espec co comeou a ser projetado em 1819 c e terminou em 1822, ou seja, h mais de 180 anos atrs, pelo britnico Chara a a les (1791-1871, Figura 1.4), que o batizou de Dierence Engine (Figura 1.5). A motivaao de Babbage era resolver polinmios pelo mtodo das diferenas. c o e c Naquele tempo as tbuas astronmicas e outras tabelas eram calculadas por a o humanos, em mtodos tediosos e repetitivos. e Em 1823, ele iniciou o projeto de construir uma outra mquina mais avanada a c e capaz de calcular polinmios de at sexta ordem. Ele esperava terminar esta o e mquina em trs anos, mas a construao se arrastou at 1834. Este projeto que a e c e no foi completado, usou dinheiro do governo ingls e possivelmente a maior a e parte da fortuna pessoal de Babbage. A mquina, inteiramente mecnica, teria a a as seguintes caracter sticas: Arredondamento automtico; a 16

Figura 1.4: Charles Babbage

Figura 1.5: Fotograa da Dierence Engine

Preciso dupla; a Alarmes para avisar m de clculo; a Impresso automtica de resultados em placas de cobre. a a Em 1834 ele tinha completado os primeiros desenhos da mquina que denoa minou Analytical Engine que tinha as seguintes caracter sticas: 50 d gitos decimais de preciso; a Memria para 1000 destes nmeros (165000 bits); o u Controle por meio de cartes perfurados das operaoes e endereos dos o c c dados; Tempo de soma e subtraao igual a 1 segundo; tempo de multiplicaao e c c diviso igual a 1 minuto; a Sub-rotinas; 17

Arredondamento automtico e detecao de transbordo (overow ); a c Babagge nunca conseguiu terminar este ambicioso projeto. No entanto, os mais importantes conceitos de computaao, que somente vieram a tona nos anos c 40 do sculo vinte, j tinham sido considerados por Charles Babbage em o seu e a projeto. Um fato curioso que entre os auxiliares de Babagge estava Augusta Ada e Byron, Countess of Lovelace. Considera-se, hoje, que ela escreveu para Charles Babbage o primeiro programa para computadores. Ada que mudou seu nome para Augusta Ada King, aps seu casamento, estudava Matemtica com Deo a Morgan que provou um dos teoremas bsicos da Algebra Booleana, que a base a e matemtica sobre a qual foram desenvolvidos os projetos dos modernos compua tadores. No entanto, no havia nenhuma ligaao entre o trabalho do projetista a c dos primeiros computadores e o do matemtico que estudava o que viria a ser a o fundamento terico de todo a computaao que conhecemos hoje. o c

1.2.3

O Desenvolvimento durante as Grandes Guerras

Antes da Segunda Grande Guerra, em vrios pa a ses, cientistas trabalhavam em projetos que visavam construir computadores com rels, que so dispositie a vos eletromecnicos usados para ligar ou desligar circuitos eltricos. Rels so a e e a os dispositivos que antecederam os transistores na construao de computadoc res. Alguns destes computadores eram de uso geral, outros tinha nalidades espec cas. Alguns destes projetos esto listados a seguir. a Na Alemanha Em 1934 na Alemanha Konrad Zuze, engenheiro projetista de avies, concebeu o uma mquina de somar para resolver os clculos que deveria realizar em seus a a projetos. Em 1938, ele concluiu o Z1, um calculador mecnico com uma unidade a aritmtica que usava a base 2 para representar os nmeros, base que hoje os e u computadores modernos empregam. Em 1938 ele melhorou o desempenho do Z1, graas aos rels. c e O governo alemo patrocinou os trabalhos de Zuze e em 1941 estava pronto a o Z2, uma mquina eletromecnica capaz de receber instruoes por meio de uma a a c ta de papel. Em 1941 foi introduzido o Z3, que calculava trs a quatro adioes e c por segundo, uma multiplicaao em 4 ou 5 segundos e era capaz de extrair a c raiz quadrada. Nos Estados Unidos Em 1944 a IBM e H. Haiken da Universidade de Harvard, conclu am a construc ao de um verdadeiro computador: o Harvard Mark I, que operava em base 10. O Mark I efetuava as quatro operaoes fundamentais, mais o clculo de funoes c a c trigonomtricas, exponenciais e logar e tmicas. As instruoes eram fornecidas por c meio de tas de papel e os dados lidos de cartes perfurados. Os resultados eram o fornecidos em forma de cartes perfurados ou impressos por meio de mquinas o a de escrever. 18

Em 1943 na Universidade da Pensilvnia, J. Eckert e J. Mauchly iniciaram a a construao de um computador ` vlvulas, ou seja eletrnico que foi chamado de c a a o ENIAC. O projeto foi conclu em 1946 e usado na segunda guerra mundial. do O ENIAC podia ser reprogramado para executar diversas operaoes diferentes c atravs de ligaoes por meio de os e conectores. e c Durante muitos anos o computador ENIAC foi considerado o primeiro computador eletrnico constru o do. A mquina projetada pelos Drs. Eckert and a Mauchly era gigantesca quando comparada com os computadores pessoais atuais. Quando foi terminado, o ENIAC (Figura 1.6) enchia um laboratrio inteiro, o pesava trinta toneladas, e consumia duzentos quilowatts de potncia. e

Figura 1.6: Computador Eniac Ele gerava tanto calor que teve de ser instalado em um dos poucos espaos c da Universidade que possu sistemas de refrigeraao forada. Mais de 19000 a c c vlvulas, eram os elementos principais dos circuitos do computador. Ele tambm a e tinha quinze mil rels e centenas de milhares de resistores, capacitores e indue tores. Toda esta parafernlia eletrnica foi montada em quarenta e dois painis a o e com mais 2,70 metros de altura, 60 cent metros de largura e 30 cent metros de comprimento, montados na forma da letra U. Uma leitora de cartes perfurados o e uma perfuradora de cartes eram usados para entrada e sa de dados. o da Os tempos de execuao do ENIAC so mostrados na Tabela 1.2. Compare c a estes tempos com os tempos dos computadores atuais que esto na ordem de a nano segundos, ou 109 segundos. Operao ca soma multiplicaao c diviso a Tempo 200 s 2,8 ms 6,0 ms

Tabela 1.2: Tempo de execuao das instruoes aritmticas no ENIAC c c e Em 1939 John Vincent Atanaso e Cliord E. Berry, na Universidade Estadual de Iowa constru ram um prottipo de computador digital eletrnico, que o o usa aritmtica binria. Em 19 de outubro de 1973, o juiz federal Earl R. Larson e a assinou uma deciso, em seguida a uma longa batalha judicial, que declarava a

19

a patente do ENIAC de Mauchly e Eckert invlida e atribu a Atanaso a a a invenao computador eletrnico digital, o ABC ou Atanaso-Berry Computer. c o Na Inglaterra Jnos von Neumann, emigrante hngaro que vivia nos EUA, sugeriu que a a u memria do computador deveria ser usada para armazenar as instruoes do o c computador de maneira codicada, o conceito de programa armazenado. Esta idia foi fundamental para o progresso da computaao. Os primeiros computae c dores, como o ENIAC, eram programados por os que os cientistas usavam para conectar as diversas partes. Quando um programa terminava, estes cientistas trocavam os os de posiao de acordo com a nova tarefa a ser executada. Com o c programa armazenado na memria, juntamente com os dados, no era mais neo a cessrio interromper as atividades. Carregava-se o programa na memria, uma a o tarefa extremamente rpida, junto com os dados e dava-se partida no programa. a Ao trmino da execuao do programa passava-se imediatamente para a prxima e c o tarefa sem interrupoes para troca de os. c Em 1949, na Inglaterra, dois computadores que usavam a memria para o armazenar tanto programas como dados foram lanados. Na Universidade de c Cambridge foi lanado o EDSAC, (Electronic Delay Storage Automatic Calculac tor) e em Manchester o computador chamado de Manchester Mark I. O EDSAC considerado o primeiro computador de programa armazenado a ser lanado. e c Curiosamente, a Universidade de Manchester reivindica que o primeiro computador de programa armazenado foi o chamado Baby, um prottipo do Mark o I, que comeou a operar onze meses antes do EDSAC. c Outro fato curioso em relaao ` Inglaterra e que foi divulgado recentemente c a relata que um computador chamado COLOSSUS entrou em operaao secrec tamente na Inglaterra em 1943. Este computador foi usado para auxiliar na quebra dos cdigos de criptograa alemes durante a segunda grande guerra. o a

1.2.4

As Geraes co

Costumava-se dividir os projetos de computadores em geraoes. Hoje em dia c como a taxa de evoluao muito grande no se usa mais este tipo de terminoc e a logia. No entanto interessante mencionar estas divises. e o Primeira Gerao: Os computadores constru ca dos com rels e vlvulas so os e a a da primeira geraao. Estes computadores consumiam muita energia e c espao. c Segunda Gerao: Os computadores da segunda geraao foram constru ca c dos com transistores, os quais tinham a vantagem de serem mais compactos e consumirem muito menos energia. Por gerarem menos calor eram mquinas mais conveis. a a Terceira Gerao: Com o advento dos circuitos integrados, que so compoca a nentes em que vrios transistores so constru a a dos em uma mesma base de semicondutor, chegamos aos computadores de terceira geraao. Com c a integraao o tamanho dos computadores e seu consumo diminuiu ainda c mais e aumentou a capacidade de processamento. 20

Quarta Gerao: Os computadores de quarta geraao utilizavam circuitos ca c com a tecnologia (Very Large Scale Integration), que permitia uma escala de integraao de transistores muito grande. c

1.3

O Hardware

O hardware corresponde aos circuitos eletrnicos e componentes mecnicos que o a compem o computador. Um t o pico diagrama em blocos de um computador digital monoprocessado esta mostrado na Figura 1.7. A Unidade Central de Processamento (UCP), em ingls Central Processing Unit (CPU), como o e prprio nome diz, a unidade onde os dados so processados, ou seja alterados, o e a no computador. Ou seja, dentro das UCPs os dados so somados, subtra a dos etc. A UCP tambm controla a movimentaao dos dados dentro de todo o e c sistema. Os mdulos que constituem a UCP so os seguintes: o a Unidade de Controle (UC): comanda a operaao do computador. Esta unic dade l da memria tanto as instruoes como os dados e comanda todos e o c os circuitos para executar cada instruao lida da memria. Atualmente as c o unidades de controle so capazes de executar mais de uma instruao por a c ciclo de mquina, o que caracteriza o processamento paralelo. A tcnica a e mais comum para conseguir este paralelismo conhecida como pipelining, e que ser detalhada mais adiante. a Unidade Aritmtica e Lgica (UAL): local onde as transformaoes sobre e o c os dados acontecem. Atualmente esta unidade bastante sosticada e e diversos mtodos so empregadas para acelerar a execuao das instruoes. e a c c Alguns processadores duplicam circuitos para permitir que mais de uma operaao aritmtica seja executada por vez. E muito comum, por exemc e plo, a existncia de uma unidade aritmtica para executar instruoes que e e c operam sobre nmeros inteiros e outra sobre nmeros reais, chamada de u u unidade de ponto utuante. As vezes a UCP conta com mais de uma de cada uma destas unidades. Unidade de Entrada e Sa (UES): controla a comunicaao com os usuda c a rios do computador e os equipamentos perifricos tais como discos e ime pressoras. Em alguns computadores mais simples esta unidade no existe a independentemente, sendo distribu pela Unidade Central de Procesda samento. Em computadores mais poderosos ao contrrio as Unidades de a Entrada e Sa so computadores completos que foram programados para da a controlar a comunicaao com os perifricos. c e O termo pipelining que mencionamos acima se refere a um dos modos de como o processador pode paralelizar a execuao de instruoes. Este termo pode c c ser traduzido por linha de montagem, porque exatamente isto que a tcnica e e faz, uma linha de montagem de instruoes. Por exemplo, em uma linha de c montagem de uma fbrica de automveis, mais de um automvel montado a o o e ao mesmo tempo. No in da linha o carro no existe. Em cada estgio da cio a a linha de montagem os operrios vo adicionando partes e ao m da linha sai a a um carro novo. Se voc olhar a linha poder ver carros em diversos estgios da e a a 21

Unidade de Controle

Unidade de Entrada e Sada Memria Discos Vdeo

Unidade Arimtica

Unidade Central de Processamento

Figura 1.7: Diagrama Bsico de um Computador Digital a

montagem. Repare que a linha no pra, e a montagem de um carro no espera a a a que o que comeou a ser montado antes dele esteja terminado. Nas linhas de c montagem muitos carros so montados ao mesmo tempo. O efeito nal que a e cada carro continua levando bastante tempo para ser montado, mas como vrios a vo sendo montados ao mesmo tempo, algum que se colocasse no nal da linha a e de montagem teria a impresso que cada carro leva muito pouco tempo para a ser montado. Isto porque no nal da linha de montagem sai um carro a cada poucos minutos. O mesmo acontece com a linha de montagem de instruoes. c

1.3.1

Microcomputadores

Uma UCP integrada em um unico circuito (chip) comumente chamada de e microprocessador . Os microprocessadores atuais incluem outros circuitos que normalmente cavam fora da UCP, tais como processadores de ponto utuante e memrias cache. Alguns exemplos de microprocessadores so mostrados na o a Tabela 1.3 Microprocessador Arquitetura Intel X86 PowerPC Power MIPS ARM SPARC Empresa Intel, AMD Consrcio Apple/IBM/Motorola o IBM MIPS Technologies ARM Technologies SUN

Tabela 1.3: Exemplos de Microprocessadores

Usualmente se chama de computador, o processador mais os seus perifricos e e os sistemas para controlar estes perifricos, ou seja todo o sistema de procese samento de dados. Os perifricos so os dispositivos usados para fazer a entrada e a e sa dos dados que sero processados. da a Os microcomputadores so computadores baseados em microprocessaa dores. As assim chamadas placas me dos microprocessadores atuais incluem a 22

diversos componentes que formam o microcomputador. Por exemplo, uma placa me pode incluir o microprocessador e seus circuitos de suporte, que, no cona junto so conhecidos como o chipset. Alm disso a placa me pode incluir a e a tambm a memria principal e as placas de controle de perifricos, como a e o e placa de v deo, e os conectores para os perifricos, enm, quase todo o sistema. e

1.3.2

Memrias o

Os dados no computador podem ser armazenados em diversos n veis de memria o semicondutoras ou em perifricos (discos, tas, etc). Quanto mais rpida a e a memria, usualmente mais cara ela . A idia por traz da separaao em n o e e c veis colocar mais perto do processador, em memrias rpidas e mais caras, os e o a dados que o processador ir precisar mais freqentemente. A medida que vamos a u nos afastando do processador as memrias vo, ao mesmo tempo, cando mais o a baratas, aumentando de capacidade e diminuindo de velocidade. A Figura 1.8 ilustra esta hierarquia.

PROCESSADOR

MEMRIACACHEREGISTRADORES

DISCO

Figura 1.8: N veis de hierarquia da memria de um computador. o No n mais prximo do processador esto os registradores , que, na vervel o a dade, cam internamente ao processador. So poucos e extremamente rpidos a a e, portanto, no podem armazenar grandes quantidades de dados. Somente os a dados que so necessrios ao processador com rapidez extraordinria devem ser a a a colocados nos registradores. Durante o processamento normal, na memria principal onde o processae o dor busca instruoes e dados de um programa para executar. Alm da memria c e o principal esto os discos. Devido a sua velocidade menor que a da memria a o principal e a sua grande capacidade, os discos so considerados dispositivos de a armazenamento secundrio. Os discos tambm so memrias de armazenamento a e a o permanente, isto , quando os computadores so desligados o seu conte do se e a u mantm. Ao contrrio, a memria principal e os registradores so memrias e a o a o semicondutoras e perdem seus contedos quando a energia eltrica desligada. u e e Em alguns computadores os discos esto sendo substitu a dos por memrias seo micondutoras. Para acelerar o acesso aos dados freqentemente usados, os computadores u dispem de memrias mais rpidas, porm de menor capacidade, que cam eno o a e tre os registradores e a memria principal. Estas funcionam como as bolsas ou o carteiras em que carregamos documentos e outros itens que precisamos freq enu temente. Este tipo de memria conhecido como memria cache. O cache o e o opera de forma invis para o processador. Ao pedir um dado para memria, vel o 23

circuitos especiais vericam se este dado est no cache, caso esteja, ele repasa e sado para o processador. Para o processador o que aconteceu que a memria e o entregou o dado com uma rapidez maior do que o normal. Uma memria como se fosse uma srie de cofres numerados capazes de o e e armazenar os dados, como est ilustrado na Figura 2.3. Os dados e instruoes a c na memria so apontados ou referenciados por estes nmeros, conhecidos como o a u endereos. Ou seja, para ler um dado da memria necessrio fornecer um c o e a endereo para que a memria possa encontrar e devolver o contedo pedido. Isto c o u similar ao o que ocorre quando enviamos uma carta, o endereo faz com que o e c carteiro saiba onde ele deve entregar a correspondncia. Em operaao normal, e c toda vez que o processador precisa de um dado ele envia um pedido de leitura a ` memria junto com o endereo da memria onde o dado est. Nas escritas o c o a o processador envia o endereo, o dado e pedido de escrita. Normalmente a c memria somente pode atender um pedido de cada vez. Portanto, para ler 1000 o nmeros o processador ter de fazer 1000 acessos seqencialmente. u a u Os dois tipos bsicos de memria mais comuns so ROM e RAM. Estas a o a siglas tm diversas variaoes (PROM, EPROM, DRAM, etc), mas os princ e c pios bsicos so os mesmos. Estas siglas indicam os dois tipos bsicos de memria a a a o que so usadas em computadores. A sigla bsica ROM signica Read Only a a Memory, ou seja, memria de somente de leitura. A outra sigla RAM (Random o Access Memory) signica memria de acesso randmico, portanto, memria que o o o se pode ler em qualquer endereo. c A sigla RAM muito confusa porque em uma memria ROM tambm se e o e pode ler em qualquer endereo. A diferena real que nas RAMs se pode ler e c c e escrever com a mesma velocidade em qualquer endereo, enquanto que na ROM, c o acesso rpido somente para leituras, a escrita uma histria mais complicada. e a e o A ROM normalmente contm dados que no podem ser modicados durante o e a funcionamento do computador. Outro tipo de dados armazenados em ROMs so a os que no devem ser perdidos quando o computador desligado. Exemplos de a e uso de ROM so as memrias que armazenam os programas que so executados a o a quando os computadores so ligados, os famosos BIOS (Basic Input Output a System). Um computador ao ser ligado deve ter um programa m nimo capaz de iniciar o seu funcionamento normal, caso contrrio seria como uma pessoa a que perdeu totalmente a memria. Para isto so escritos programas simples que o a fazem acesso aos perifricos em busca do Sistema Operacional da mquina. e a As primeiras memrias do tipo ROM eram gravadas nas fbricas e nunca o a mais eram modicadas. Isto trazia algumas diculdades, por exemplo, quando um programa precisava ser atualizado. Para resolver este tipo de problemas surgiram as PROMs, que so ROMs programveis. Ou seja poss desgravar a a e vel o contedo antigo e gravar novos programas nesta memria. Antigamente este u o era um processo complicado e exigia que a memria fosse retirada sicamente o do circuito e colocada em dispositivos especiais capazes de apagar o conte do u antigo. Em seguida um circuito programador de PROMs era usado para gravar o novo contedo e somente aps tudo isto a memria era recolocada no local. u o o O computador cava literalmente sem a memria dos programas iniciais. Hoje o em dia existem PROMs que podem ser apagadas e regravadas muito facilmente. Por exemplo, as EEPROMs (Eletricaly Erasable PROMs), que so memrias a o que podem ser apagadas eletricamente sem a necessidade de serem retiradas

24

dos circuitos. Flash memory uma forma de memria no voltil que pode e o a a ser apagada e reprogramada eletricamente. Diferentemente das EEPROMs, ela deve ser apagada em blocos de endereos. Este tipo de memria custa menos c o do que EEPROMs e portanto so preferidas quando necessrio usar memria a e a o no voltil em forma de circuitos integrados. a a As memrias RAMs so as memrias onde os nossos programas comuns o a o rodam. Elas so modicveis e de acesso rpido tanto na leitura quanto na a a a gravaao. Muitas siglas aparecem e desaparecem quando falamos de memrias c o RAM. Existem as DRAM, memrias EDO, SIMM, etc. Tudo isto ou se refere ao o mtodo de acesso dos dados na memria ou a tecnologia de construao ou a outra e o c caracter stica acessria. O certo que todas elas tem como caracter o e stica bsica a o fato dos acessos de leitura e escrita poderem ser feitos na mesma velocidade.

1.3.3

Bits e Bytes

A memria do computador composta de bits, a menor unidade de informaao o e c que o computador armazena. Um bit pode conter o valor 0 ou 1, que so os a d gitos usados na base dois, a base usada nos computadores. Um conjunto de 8 bits forma o byte. Uma palavra de memria um conjunto de bytes. o e Atualmente a maioria dos computadores tem palavras de memria com largura o de 32 (4 bytes) ou 64 (8 bytes) bits. Na Figura 1.9 mostramos os diversos tamanhos dos dados.BIT

BYTE 8 BITS

PALAVRA 32 BITS 4 BYTES

Figura 1.9: Tamanho de Bits, Bytes e Palavras

Observar que estamos falando de dados na memria e no do tamanho dos o a dados que o computador pode processar. Considere que este tamanho relacioe nado com a quantidade mxima de algarismos que um nmero pode ter para ser a u processado. Um computador pode ter capacidade de processar 64 bits de cada vez. Caso sua memria tenha palavras de 32 bits o processador dever, ento, o a a ler duas palavras da memria para poder processar um nmero. Lembre-se que o u as duas leituras so atendidas uma de cada vez. Da mesma forma o computador a pode processar 32 bits de cada vez e a memria ter largura 64 bits. Isto pode o acelerar o processamento, j que o processador est se adiantando e recebendo a a o que poder ser o prximo dado a ser processado, ou seja economizando uma a o leitura. Devido a base 2 o fator kilo tem um signicado diferente em computaao. c Por exemplo 1 Kbyte de memria corresponde a 2 elevado a 10 (210 ), ou seja o

25

1024 bytes. Da mesma forma 1 Megabyte corresponde a 1024 x 1024 bytes e 1 Gigabyte igual a 1024 x 1024 x 1024 bytes. Na Tabela 1.4 esto mostradas as e a diversas abreviaoes usadas quando se fazem referncias `s memrias. c e a o Nome Kilobyte Megabyte Gigabyte Terabyte Petabyte Exabyte S mbolo Kb MB GB TB PB EB Multiplicador 210 = 1024 220 230 240 250 260

Tabela 1.4: Abreviaoes usadas em referncias `s memrias. c e a o

1.3.4

Perifricos e

Como j mencionamos antes, os dados no cam guardados somente na memria, a a o h tambm os perifricos . H perifricos de entrada, outros de sa e alguns a e e a e da que servem tanto para entrada como sa de dados. Perifricos no servem da e a somente para armazenar dados. H perifricos que so usados para permitir a a e a interaao entre os usurios e o computador. A tabela 1.5 ilustra alguns destes c a perifricos. e Entrada Teclados Mouse CD-ROM Scanner Sa da Impressoras V deo Plotter Alto-falantes Ambos Discos R gidos Fitas Magnticas e Disquetes Discos Zip

Tabela 1.5: Exemplos de perifricos e

1.4

O Software

Tudo isto que sobre o que acabamos de escrever constitui o hardware do computador, o que se v e o que se toca. A partir de agora falaremos brevemente e no software, o que no se v nem se toca, mas tambm est l. a e e a a Para que um computador execute alguma tarefa primeiro se desenvolve um algoritmo , que uma espcie de receita que diz precisamente, ao computae e dor, como o problema deve ser resolvido. Esta deniao informal de algoritmo c enganosamente simples, e a chave para entender o engano est nas palavras e a dizer precisamente ao computador. Por exemplo, uma receita em gastronomia normalmente no um algoritmo. Receitas so entendidas pela comunidade a e a de cozinheiros, que as seguem facilmente durante o preparo do prato. No entanto, receitas esto cheias de expresses como, por exemplo, mexer at car a o e 26

no ponto e colocar sal a gosto. Fora da comunidade de cozinheiros estas expresses so pass o a veis de vrias interpretaoes. Para escrever algoritmos prea c cisamos de uma linguagem matematicamente precisa e sem ambig idades. u A escrita de um algoritmo consta de uma deniao do estado inicial do c problema a ser resolvido e de regras precisas que estabelecem a cada instante os passos a serem seguidos. Como em um jogo, alm de denir os passos, so e a necessrias regras que denam se aps a execuao de um passo do algoritmo o a o c novo estado do problema vlido. As regras do xadrez denem o estado inicial e a do tabuleiro, os movimentos poss veis de cada pea e se aps um movimento c o de uma pea a conguraao atingida vlida. Ou seja precisamos vericar em c c e a cada instante qual dos movimentos (instruoes) pode ser usado. c Algoritmos podem ser chamados de procedimentos efetivos e devem obedecer aos seguintes limites: sempre dar alguma resposta; sempre dar a resposta correta e nunca uma resposta incorreta; terminar em um nmero nito de passos; u trabalhar em todos os exemplos da classe de problemas que o algoritmo se prope a resolver. o Em seguida este algoritmo deve ser traduzido para uma linguagem que possa ser entendida pelo computador ou que possa ser traduzida para esta linguagem. No in cio da computaao eletrnica com programas armazenados, estes eram c o escritos diretamente em linguagem de mquina que a linguagem que o coma e putador realmente entende. Estas instruoes so conjuntos de bits indicando c a a operaao que deve ser executada e, caso necessrio, onde como achar os dados c a que sero operados. Por esta razo tambm costuma-se dizer que so programas a a e a escritos em binrio. a Com a evoluao da computaao os programas passaram a ser escritos em c c assembly , que uma representaao em mnemnicos das instruoes de mquina. e c o c a Deste modo era mais fcil escrever os algoritmos. Por exemplo, um fragmento e a de um programa escrito em assembly do processador PowerPC : e li r3,4 * O primeiro numero a ser somado e 4. li r4,8 * 8 e o segundo numero add r5,r4,r3 * Some os contedos de r3 (4) e r4 (8) u * e armazene o resultado em r5 Este pequeno trecho de programa armazena os nmeros 4 e 5 em registradou res internos do processador em seguida os soma e armazena o resultado em um terceiro registrador. As informaoes aps os asteriscos so comentrios usados c o a a para explicar o que o programa est fazendo naquela instruao. a c O PowerPC um microprocessador criado em 1991 por um consrcio fore o mado pela IBM, Apple e Motorola Os microprocessadores PowerPC podem ser usados para equipar desde sistemas embutidos at computadores de alto deseme penho. A Apple usou este microprocessador para equipar suas mquinas at a e 2006.

27

Um programa escrito em assembly deve ser traduzido para a representaao c binria, tarefa que normalmente se chama de montar o programa. A palavra a assembler frequentemente usada erradamente para signicar a linguagem e e no o programa que traduz o programa de assembly para linguagem binria de a a mquina. Este tipo de programaao pode levar a se escrever programas muito a c ecientes, devido ao controle quase que total do programador sobre a mquina. a No entanto devido ao fato de ser uma linguagem prxima do computador e afaso tada da maneira de raciocinar do ser humano mais dif de ser usada. Alm e cil e deste fato h outros problemas tais como: diculdade de leitura por humanos, a diculdade de manutenao dos programas, maior tempo de desenvolvimento etc. c Para evitar estes problemas foram desenvolvidas as linguagens de programaao chamadas de linguagens de alto n c vel, por estarem mais prximas da o linguagem natural empregada pelos serem humanos. Alguns exemplos de linguagens de programaao so: c a Fortran: Usada em programaao cient c ca e engenharia; Pascal: Usada em ensino de linguagens e desenvolvimento de sistemas; COBOL: Usada em ambientes comerciais; Basic: O nome diz tudo, bsica; a C: Mesmas caracter sticas do Pascal com facilidades que permitem mais controle do computador; C++: Linguagem originria do C com metodologia de orientaao ` objetos; a c a Java: Linguagem tambm baseada na sintaxe do C e tambm seguindo o moe e delo de orientaao ` objetos. c a Delphi: Linguagem originria do Pascal com metodologia de orientaao ` oba c a jetos; Lisp e Prolog: Linguagens usadas para desenvolver programas de Inteligncia e Articial. Aplicativos importantes para os programadores so os compiladores. Esa tes programas traduzem programas escritos em linguagens de alto n vel para a linguagem de mquina, de modo que o computador possa execut-los. De a a maneira geral um compilador um programa que traduz um programa de uma e linguagem para outra. Podemos resumir os passos necessrios para criar um programa em uma a linguagem de programaao, por exemplo C, nos passos descritos a seguir. A c Figura 1.10 ilustra a ordem em que se desenvolvem estes passos. Criao do Algoritmo: neste passo criado o algoritmo que ir resolver o ca e a problema. As diversas maneiras de descrever um algoritmo sero apresena tadas no prximo cap o tulo.

28

Codicao do Algoritmo: O algoritmo preparado no passo anterior esca e crito em uma linguagem de programaao. Neste passo o programador c conta, normalmente, com a ajuda de um editor de textos (no processaa dor de textos). Para esta ediao qualquer editor pode ser usado. Hoje c em dia muitos ambientes de desenvolvimento integram todas as ferramentas necessrias para criar um programa, inclusive o editor, em um unico a aplicativo. Compilao do Programa: O arquivo texto contendo o programa passa por ca um programa especial chamado compilador que gera, caso no hajam era ros, uma sa que quase o programa executvel, ou seja o programa em da e a cdigo binrio do processador em que ser executado. Os erros mais coo a a muns nesta etapa so erros de uso correto da linguagem de programaao. a c Estes erros so chamados de erros de compilaao. As linguagens de proa c gramaao so baseadas em regras gramaticais muito r c a gidas e qualquer violaao destas regras pode implicar em erro. No caso de erros serem c encontrados o programador deve voltar ao passo de codicaao para a c correao dos erros. c Ligao: Em ingls este passo conhecido por link edition. Um programa ca e e completo composto por vrios mdulos que podem ter sido criados pelo e a o prprio programador ou por outras programadores. Por exemplo, em C o os trechos de programa que interagem com os usurios, os comandos de a entrada e sa de dados, normalmente vm com o programa compilador. da e Estes trechos podem estar guardados em bibliotecas de programas e so a ligados ao programa do usurio para completar o programa. a Depurao e Testes: Nesta etapa o programa ser testado para a retirada ca a dos poss veis erros de lgica que o programador cometeu. Caso algum o erro de execuao seja encontrado o programador deve reelaborar o que c estiver errado no algoritmo e em seguida ir para a etapa de codicaao do c algoritmo. Este ciclo pode repetir-se inmeras vezes at que o desenvolu e vedor acredite que os erros foram corrigidos. Uso do Programa: O programa foi entregue aos seus usurios para ser usaa do. Durante o uso, erros que no foram encontrados durante o desenvola vimento do programa podem ser descobertos e precisam ser corrigidos. A correao pode ser feita pelos mesmos programadores que desenvolveram o c programa ou por outro grupo devidamente treinado. Costuma-se chamar esta correao de manutenao do programa. c c Algumas linguagens de programaao no so compiladas e sim interpretac a a das. Isto signica que o programa para ser executado no precisa ser tradua zido diretamente para linguagem de mquina, gerando um arquivo executvel. a a Este arquivo nal, se torna independente do programa fonte. Para executar o programa podemos usar somente o arquivo executvel. Em um programa intera pretado um aplicativo l o programa instruao por instruao, diretamente na e c c prpria linguagem de alto n o vel, traduz cada uma destas instrues para linco guagem de mquina e as executa. No h, portanto, o processo de traduao a a a c antecipada do programa. A interpretaao de um programa funciona como o c processo de traduao simultnea do discurso de um orador. A medida que ele c a 29

Incio Ligao

Criao de Algoritmo

Depurao e Testes

Codificao do Algoritmo

Sim

Erros de Execuo? No

Compilacao do Programa

Uso do programa

Sim Erros de Compilao? No

Sim Erros de Execuo?

Figura 1.10: Ciclo de desenvolvimento de um programa.

pronuncia seu discurso um tradutor repete as frases na linguagem destino. Um programa compilado funciona como se primeiro, o tradutor traduzisse todo o discurso e depois o lesse. A linguagem Basic uma linguagem interpretada. e Em Java ocorre um processo um pouco diferente. Um programa em Java e traduzido para uma linguagem intermediria e depois interpretado por meio a de uma chamada mquina virtual. No h efetivamente uma compilaao para a a a c linguagem de mquina. A execuao de um programa escrito em uma linguaa c gem interpretada mais lenta, j que o processo de interpretaao e execuao ao e a c c mesmo tempo mais lento do que a simples execuao de um programa traduzido e c antecipadamente. Hoje em dia a maior parte dos usurios de computadores no so programaa a a dores e sim pessoas que usam programas para resolver seus problemas do dia a dia. Aplicativos t picos que rodam nos computadores so: editores de texto, a processadores de texto, planilhas eletrnicas, compiladores, bancos de dados, o jogos, etc. Para gerenciar os recursos do computador existe um programa especial normalmente chamado de Sistema Operacional (S. O.). Por exemplo, considere o problema de gerenciar como os diversos programas que um usurio normalmente a utiliza partilharo o processador do computador. Um usurio pode estar oua a vindo msica, digitando um texto e imprimindo um outro documento ao mesmo u tempo. Portanto, os computadores so capazes de executar um n mero de taa u refas muito maior do que o nmero de processadores dispon u veis. Atualmente a maior parte dos computadores possui somente um processador. O Sistema Operacional controla a alocaao de recursos tais como: comunicaao com os c c usurios, espao em discos, uso de memria, tempo que cada programa pode roa c o dar etc. Alguns dos sistemas operacionais conhecidos so os baseados no padro a a

30

UNIX, por exemplo o LINUX. Outros sistemas muito usados so os da fam a lia Windows. 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 (no processador como o Word). a O editor pode ser to simples quanto o Notepad, na verdade recomendamos a fortemente que o editor seja simples para que voc possa ter contato com todas e as etapas do processo de desenvolvimento de um programa. Para compilar empregaremos o compilador gcc que gratuito e pode ser obtido na Internet e como veremos adiante. No ser necessrio nenhum ambiente mais complexo, a a a tal como um Integrated Development Environment (IDE). A coleao de compiladores da GNU (GNU Compiler Collection) usualmente c abreviada por gcc, uma coleao de compiladores produzidos pelo projeto GNU. e c A abreviaao gcc, originalmente, signicava GNU C Compiler. Este aplicativo c distribu gratuitamente pela Free Software Foundation (FSF) sob a licena e do c GNU GPL e GNU LGPL. Este o compilador padro para os sistemas opee a racionais livres do tipo Unix, como o LINUX, e diversos sistemas operacionais proprietrios como o Apple Mac OS X. Atualmente o gcc pode compilar C++, a Objective-C, Java, Fortran e ADA, entre outras linguagens. Vamos considerar, como exemplo, um programa chamado teste.c. Para compilar e gerar o executvel para este programa digitamos o comando a gcc -o teste teste.c -Wall em uma janela de comandos no sistema Windows ou em um terminal nos sistemas Unix. O suxo .c no nome do programa normalmente usado para indicar e que o arquivo de um programa C. Este comando deve ser digitado no diretrio e o onde est o arquivo fonte teste.c. O arquivo executvel ser armazenado no a a a mesmo diretrio. o Nos sistemas Unix normalmente o gcc faz parte da distribuiao padro e c a nada precisa ser feito. No Windows uma maneira fcil de obter uma verso a a do gcc instalar o MinGW (Minimalist GNU for Windows). MinGW uma e e coleao de arquivos e bibliotecas distribu c 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. O MinGW dispe o de um programa instalador que facilita enormemente o processo. Este programa pode ser obtido no s ocial do MinGW. Caso aps a instalaao, o comando tio o c indicado no funcione uma das razes para a falha pode ser que o sistema opea o racional no sabe onde se encontra o compilador gcc. Suponha que o programa a gcc foi instalado no diretrio C:\MinGW\bin. Uma soluao digitar o caminho o c e completo do compilador. Neste caso o comando se torna C:\MinGW\bin\gcc -o teste teste.c -Wall Para que no seja necessrio digitar o caminho completo, preciso adicioa a e nar este caminho ` varivel PATH do Windows. Consulte o manual para obter a a informaoes de como fazer este passo no seu sistema Windows. c

31

1.5

Um programa em C

Vamos terminar este cap tulo mostrando um exemplo simples de programa escrito em C(Listagem 1.1). A unica coisa que este programa faz imprimir Alo e Mundo! e terminar [1, 2, 3]. A primeira linha do programa avisa ao compilador que ir usar funoes de a c entrada e sa de dados guardadas na biblioteca stdio. Neste caso a funao da c usada printf. A segunda linha o in real do programa. A linha indica que e e cio esta a funao main que todo programa C deve conter, pois nesta funao que e c e c o programa obrigatoriamente comea sua execuao. A funo vai retornar um c c ca valor inteiro (int) ao nal de sua execuao e no vai precisar receber nenhum c a argumento para sua execuao (void). As chaves ({ e }) marcam o in e o c cio m da funao. Para imprimir o texto Alo Mundo! o programa usa a funao c c printf. O in e o m do texto a ser impresso so marcados pelo caractere ". cio a A funao termina com o comando return 0, que avisa ao sistema operacional, c que foi quem iniciou a execuao do programa, que o programa terminou sem c problemas. Este programa simples ilustra alguns das estruturas bsicas que a sero usadas nos programas C que sero apresentados neste livro. a a Listing 1.1: Exemplo de Programa em C.#i ncl ude < stdio .h > i n t main ( void ) { printf ( " Alo Mundo !\ n " ); return 0; }

32

1.6

Exerc cios

1.1: O que o hardware do computador? e 1.2: Quais os principais componentes de um computador? 1.3: Quais as diferenas entre um microprocessador e o microcomputador? c 1.4: D exemplos de microprocessadores e de microcomputadores. e 1.5: Qual o nmero exato de bytes em 64 Kbytes? u 1.6: Se voc j usa computadores, liste alguns aplicativos que voc normalmente e a e usa. 1.7: Dena Sistema Operacional. 1.8: Qual a diferena bsica entre memrias ROM e RAM? c a o 1.9: Procure em manuais, internet e outras fontes quais so os tempos de acesso a das memrias RAMs atuais. o 1.10: Faa trs listas, uma de perifricos de entrada, outra de perifricos de c e e e sa e nalmente uma de perifricos de entrada e sa da e da. 1.11: Explique o que faz um compilador. 1.12: Discuta as vantagens e desvantagens das linguagens interpretadas e as compiladas. 1.13: O que so erros de compilaao e de execuao. a c c 1.14: Procure nomes de linguagens de programaao no listadas no texto e diga c a quais so as suas caracter a sticas principais.

33

Cap tulo 2

Algoritmos2.1 Introduo ca

O objetivo deste cap tulo fazer uma breve introduao ao conceito de algorite c mos e apresentar algumas formas mais comuns de representar algoritmos para facilitar o entendimento dos demais cap tulos deste livro. Iremos apresentar as construoes mais comuns empregadas no desenvolvimento de algoritmos e aprec sentaremos exemplos bsicos de algoritmos usando algumas destas formas de a representaao e construoes. c c Para resolver um problema no computador necessrio que seja primeirae a mente encontrada uma maneira de descrever este problema de uma forma clara e precisa. E preciso que encontremos uma seqncia de passos que permitam ue que o problema possa ser resolvido de maneira automtica e repetitiva. Alm a e disto preciso denir como os dados que sero processados sero armazenae a a dos no computador. Portanto, a soluao de um problema por computador c e baseada em dois pontos: a seqncia de passos e a forma como os dados sero ue a armazenados no computador. Esta seqncia de passos chamada de algoritmo. ue e Usamos algoritmos em diversas atividades que realizamos diariamente. Uma grande parte destas atividades no esto relacionadas com computaao. Um a a c exemplo simples e prosaico, de como um problema pode ser resolvido caso forneamos uma seqncia de passos que mostrem a maneira de obter a soluao, c ue c uma receita para preparar um bolo. e Uma vez que foi criado um algoritmo para resolver um determinado problema usando computadores passamos para a prxima fase que a escrita deste o e algoritmo em alguma linguagem de programaao. c A noao de algoritmo central para toda a computaao. A criaao de algoc e c c ritmos para resolver os problemas uma das maiores diculdades dos iniciantes e em programaao em computadores. Isto porque no existe um conjunto de rec a gras, ou seja um algoritmo, que nos permita criar algoritmos. Caso isto fosse poss vel a funao de criador de algoritmos desapareceria. Claro que existem c linhas mestras e estruturas bsicas, a partir das quais podemos criar algorita mos, mas a soluao completa depende em grande parte do criador do algoritmo. c

34

Geralmente existem diversos algoritmos para resolver o mesmo problema, cada um segundo o ponto de vista do seu criador. No seu livro Fundamental Algorithms vol. 1 Donald Knuth [4] apresenta uma verso para a origem desta palavra. Ela seria derivada do nome de um a famoso matemtico persa chamado Abu Jafar Maom ibn Ms al-Khowrism a e ua a (825) que traduzido literalmente quer dizer Pai de Jafar, Maom, lho de e Moiss, de Khowrizm. Khowrizm hoje a cidade de Khiva, na ex Unio e a a e a Sovitica. Este autor escreveu um livro chamado Kitab al jabr wal-muqabala e (Regras de Restauraao e Reduao). O t c c tulo do livro deu origem tambm a e palavra Algebra. O signicado da palavra muito similar ao de uma receita, procedimento, e tcnica, rotina. Um algoritmo um conjunto nito de regras que e e fornece uma seqncia de operaoes para resolver um problema esue c pec co. Segundo o dicionrio do prof. Aurlio Buarque de Holanda um algoa e ritmo um: e Processo de clculo, ou de resoluao de um grupo de problemas sea c melhantes, em que se estipulam, com generalidade e sem restrioes, c regras formais para a obtenao de resultado ou de soluao de proc c blema. Um algoritmo opera sobre um conjunto de entradas (no caso do bolo, farinha ovos, fermento, etc.) de modo a gerar uma sa que seja util (ou agradvel) da a para o usurio (o bolo pronto). a Um algoritmo computacional tem cinco caracter sticas importantes: Finitude: Um algoritmo deve sempre terminar aps um nmero nito de paso u sos. Denio: Cada passo de um algoritmo deve ser precisamente denido. As ca aoes devem ser denidas rigorosamente e sem ambiguidades. c Entradas: Um algoritmo deve ter zero ou mais entradas. Entradas so as a quantidades que so lhe so fornecidas para processamento. a a Sa das: Um algoritmo deve ter uma ou mais sa das, isto quantidades que tem e uma relaao espec c ca com as entradas. Efetividade: Um algoritmo deve ser efetivo. Isto signica que todas as operac oes devem ser sucientemente bsicas de modo que possam ser, em princ a pio, executadas com preciso em um tempo nito por um humano usando a papel e lpis. a

2.2

Primeiros Passos

E claro que todos ns sabemos construir algoritmos. Se isto no fosse verdade, o a no conseguir a amos sair de casa pela manh, ir ao trabalho, decidir qual o melhor a caminho para chegar a um lugar, voltar para casa, etc. Para que tudo isto seja feito necessrio uma srie de entradas do tipo: a que hora acordar, que hora e a e 35

sair de casa, qual o melhor meio de transporte etc. Um fator importante e que pode haver mais de um algoritmo para resolver um determinado problema. Por exemplo, para ir de casa at o trabalho, posso escolher diversos meios de e transporte em funao do preo, conforto, rapidez, etc. A escolha ser feita em c c a funao do critrio que melhor se adequar as nossas necessidades. Um exemplo c e de algoritmo pode ser as instruoes que um professor passa aos seus alunos em c uma academia de ginstica, mostrado no Algoritmo 2.1. Observar que nesta a representaao do algoritmo cada linha contm uma instruao. c e c Algoritmo 2.1: Exemplo de Algoritmo. in cio enquanto no fez 10 vezes faa a c Levantar e abaixar brao direito c Levantar e abaixar brao esquerdo c Levantar e abaixar perna esquerda Levantar e abaixar perna direita m enqto m Computadores so mquinas muito ecientes na resoluao de problemas maa a c temticos ou que envolvam nmeros. Como exemplo de um algoritmo matema u a tico, vamos considerar o problema de resolver uma equaao do primeiro grau da c forma ax + b = 0 A soluao desta equaao c c e x = b/a se o valor de a for diferente de 0. Caso a seja igual a 0, a equaao no possui c a soluao, j que no poss dividir por 0. Este algoritmo escrito (Algoritmo c a a e vel 2.2) em uma pseudo-linguagem de programaao caria da seguinte maneira: c Algoritmo 2.2: Algoritmo para resolver uma equaao do primeiro grau. c Entrada: Coecientes a e b da equaao ax + b = 0 c Sa da: Resultado x da Equaao c in cio ler a ler b se a = 0 ento a imprimir A equa~o nao tem solu~o ca ca seno a x b/a imprimir A raiz da equa~o vale , x ca m se m As instruoes do algoritmo so executadas passo a passo e uma instruao c a c somente executada quando a anterior terminou sua tarefa. Os dois primeiros e passos do algoritmo servem para o algoritmo obter os valores dos coecientes a e

36

b. Os valores podem, por exemplo, serem digitados em um teclado pelo usurio a que est usando o algoritmo. O valor digitado vai para uma posiao da memria a c o do computador, que para facilitar o manuseio do dado, recebe um nome. Neste exemplo demos os nomes a, b e x as posioes de memria usadas pelo programa c o para armazenar dados. Aps os dois primeiros passos o algoritmo executa uma o instruao de teste para vericar se o valor de a diferente de 0. Neste caso c e podemos ter duas respostas e o computador ir escolher entre dois caminhos a independentes e exclusivos. Caso a seja igual a zero, o algoritmo executa as instruoes entre a palavra ent~o e sen~o, e portanto, imprime uma mensagem c a a de aviso para o usurio e termina. Esta mensagem normalmente aparece em a um monitor de v deo. No caso de a ser diferente de zero, o algoritmo executa as instruoes entre sen~o e fim se. Isto signica calcular o resultado da equaao c a c e atribuir este resultado ` x. O ultimo passo, desta opao a impresso do a c e a resultado da equaao. c

2.3

Representao ca

As formas mais comuns de representaao de algoritmos so as seguintes: c a Linguagem Natural: Os algoritmos so expressos diretamente em linguagem a natural, como nos exemplos anteriores. Fluxograma Convencional: Esta um representaao grca que emprega e c a formas geomtricas padronizadas para indicar as diversas aoes e decises e c o que devem ser executadas para resolver o problema. Pseudo-linguagem: Emprega uma linguagem intermediria entre a linguagem a natural e uma linguagem de programaao para descrever os algoritmos. c No existe consenso entre os especialistas sobre qual seria a melhor maa neira de representar um algoritmo. Atualmente a maneira mais comum de representar-se algoritmos atravs de uma pseudo-linguagem ou pseudo-cdigo. e e o Esta forma de representaao tem a vantagem de fazer com que o algoritmo seja c escrito de uma forma que est mais prxima de uma linguagem de programaao a o c de computadores.

2.3.1

Linguagem Natural

A representaao em linguagem natural tem a desvantagem de colocar uma c grande distncia entre a soluao encontrada e o resultado nal do processo a c que um programa em linguagem de programaao. O Algoritmo 2.3 mostra e c um algoritmo, escrito em linguagem natural, para calcular a mdia de um aluno e que faz trs provas e precisa de obter mdia acima de 5.0 para ser aprovado. e e

2.3.2

Fluxogramas

Esta forma de representaao de algoritmos emprega vrias formas geomtricas c a e para descrever cada uma das poss veis aoes durante a execuao do algoritc c mos. Existem algumas formas geomtricas que usualmente so empregadas e a 37

Algoritmo 2.3: Algoritmo para calcular a mdia das notas de um aluno. e Entrada: Notas n1 , n2 e n3 . Sa da: Resultado media do aluno e se ele foi aprovado ou no. a in cio Obter as notas n1 , n2 e n3 Calcular mdia. Usar a frmula ((n1 + n2 + n3 )/3.0). e o Se a mdia for maior que 5.0 imprimir que o aluno foi aprovado e Caso contrrio imprimir que o aluno foi reprovado. a Imprimir a mdia. e m neste mtodo. Estas formas esto mostradas na Figura 2.1. Cada uma destas e a formas se aplica a uma determinada aao como est indicado na gura. Estas c a formas so apenas alguns exemplos, existindo outras, no entanto, nesta apostila a estas sero sucientes para os exemplos que sero mostrados. a aIncio e Fim de Fluxograma Processamento

Ponto de Deciso

Entrada de Dados Manual

Impresso de Resultados

Conector para mesma pgina

Figura 2.1: S mbolos mais comumente usados em uxogramas. Como exemplo de um algoritmo escrito em forma de uxograma, vamos considerar o algoritmo 2.2 para resolver uma equaao do primeiro grau da forma c ax + b = 0. A Figura 2.2 mostra um uxograma para resolver este problema. Os dois primeiros passos do algoritmo lem os valores dos coecientes a e e b da equaao. Em seguida h um teste para descobrir se o valor de a igual c a e a zero. Se o valor de a for igual a zero o algoritmo manda que seja impressa uma mensagem informando que a equaao no tem soluao. Caso o valor de c a c a seja diferente os prximos passos calculam o valor da soluao e em seguida o c imprimem este resultado

2.3.3

Pseudo-Linguagem

Este modo de representar algoritmos procura empregar uma linguagem que esteja o mais prximo poss de uma linguagem de programaao de computadoo vel c res de alto n vel, mas evitando de denir regras de construao gramatical muito c r gidas. A idia usar as vantagens do emprego da linguagem natural, mas e e restringindo o escopo da linguagem. Normalmente estas linguagens so verses a o ultra reduzidas de linguagens de alto n do tipo Pascal ou C. O algoritmo 2.2 vel foi escrito em uma pseudo-linguagem. A maioria destas linguagens so muito a parecidas e tm a vantagem de serem facilmente entendidas. Vamos apresentar e agora um outro exemplo (Algoritmo 2.4) escrito em pseudo-linguagem. Este 38

Incio

Obter a

Obter b

Sim a =0 No x=-b/a No h razes reais

Imprime x

Fim

Figura 2.2: Fluxograma para resolver uma equaao do primeiro grau. c

algoritmo serve para descobrir qual a maior nota de um grupo de trs notas e e de um aluno. O algoritmo inicialmente l a primeira nota e guarda esta nota e como a maior nota. Em seguida, l cada uma das outras notas e compara com e a nota guardada como a maior nota. Caso a nota lida seja maior substitui o valor anterior pelo novo valor. Apesar destas pseudo-linguagens terem poucas regras existem algumas que normalmente so usadas para facilitar o entendimento entre os programadores. a Vamos detalhar algumas delas. As palavras in cio e m indicam onde comea c e termina o algoritmo. As palavras em negrito indicam instruoes que devem c ser executadas pelo computador onde o algoritmo ser rodado. Por exemplo, a ler notaAluno uma instruao do algoritmo que ordena ao computador para e c obter a nota de um aluno para ser processada. Em algoritmos esta nota normalmente ser obtida de um perifrico de entrada de dados, sendo mais comum a e o teclado. As palavras em itlico so normalmente chamadas de variveis e a a a representam locais na memria do computador onde os valores a serem usados o durante o processamento esto armazenados. Os programadores podem incluir a nos algoritmos explicaoes que facilitem o entendimento do seu funcionamento. c Estes comentrios no so executados pelos computadores e somente so lidos a a a a pelos programadores. Existem diversas maneiras de indicar que o texto no algoritmo apenas um comentrio. Neste exemplo usamos dois caracteres -- para e a indicar que o restante da linha apenas um comentrio. Mais adiante outras e a explicaoes sero apresentadas. c a

39

Algoritmo 2.4: Algoritmo para calcular a maior nota de um grupo de notas. Entrada: Trs notas de um aluno, (notaAluno). e Sa da: Maior das notas do aluno, (maiorN ota) in cio -- L^ primeira nota e ler notaAluno maiorN ota notaAluno -- L^ segunda nota e ler notaAluno se notaAluno > maiorN ota ento a maiorN ota notaAluno m se -- L^ terceira nota e ler notaAluno se notaAluno > maiorN ota ento a maiorN ota notaAluno m se imprimir A maior nota das notas , maiorN ota e m

2.4

Modelo de von Neumann

Algoritmos para computadores se baseiam em alguns conceitos bsicos e em um a modelo de computador, os quais devem ser bem entendidos para que se possa criar algoritmos ecientes. Este modelo foi proposto pelo matemtico h ngaro a u Neumann Jnos Lajos Margittai. Em hngaro o nome de fam aparece antes. a u lia Assim em portugus o seu nome seria Jnos Lajos Margittai Neumann. O seu e a pai, que era rico, comprou um t tulo de nobreza e ele passou a se chamar Jnos a Lajos Margittai von Neumann. No modelo de computador proposto por von Neumann as instruoes e os dados cam juntos na memria. O processador c o busca na memria e executa uma instruao de cada vez. o c Para ilustrar como este modelo funciona vamos analisar passo a passo a execuao de um algoritmo simples. Na Figura 2.3 mostramos nos endereos c c 0, 1 e 2, de uma memria, um grupo de instruoes formando parte de um o c algoritmo. As instruoes tambm podem ser acompanhadas no Algoritmo 2.5. c e Vamos assumir que o computador inicie executando o algoritmo a partir da instruao que est no endereo 0. O procedimento normal a Unidade de c a c e Controle (UC) do computador continuar buscando e executando uma instruao c de cada vez nos endereos seguintes, a no ser que haja uma ordem para desviar c a o uxo das instruoes. E importante observar que o computador executa uma c instruao de cada vez, e como veremos adiante, tambm um dado buscado de c e e cada vez. Portanto, as transferncias entre a memria e o processador so feitas e o a passo a passo. O ciclo normal da execuao de um programa ento: c e a 1. Busca instruao; c 2. Decodica instruao; c

40

3. Executa instruao; c 4. Volta para o passo 1 buscando a instruao seguinte na memria. c o Portanto, aps a instruao do endereo 0 ser lida da memria e trazida para o c c o a UCP, ela decodicada pela UC, que descobre que a instruao manda carregar e c o valor inteiro 2 na posiao de memria 10, que chamada de a para facilitar. c o e A instruao seguinte ordena a carga do valor inteiro 8 na posiao de memria c c o chamada de b, que a posiao 11. A ultima instruao ordena a soma dos valores e c c armazenados em a e b e que o resultado seja armazenado na posiao 12, que c e chamada c. Algoritmo 2.5: Modelo de memria e funcionamento de um algoritmo o -- Armazena 2 na memria no lugar chamado a o a2 -- Armazena 8 na memria no lugar chamado b o b8 -- Soma a com b e armazena no lugar chamado c ca+b Observe que no modelo de von Neumann instruoes e dados cam na memria. c o Considere a ultima instruao do programa que pede para que os dados da posiao c c 10 (a) e 11 (b) sejam somados e o resultado armazenado na posiao 12 (c). Para c executar esta instruao, o computador faz as seguintes operaoes na memria: c c o 1. ler a instruao no endereo 2; c c 2. ler o dado a na posiao 10; c 3. ler o dado b na posiao 11; c 4. escrever o resultado da soma no endereo 12. c Portanto, temos 3 leituras e uma escrita. Destas operaoes, a primeira c e uma leitura de instruao e as restantes operaoes com dados. c c

2.5

Estruturas Bsicas de Algoritmos a

Com a nalidade de ilustrar como criar algoritmos para computadores usando este modelo, vamos discutir alguns tipos bsicos de estruturas usados nesta taa refa. Para isto, iremos usar a representaao que for apropriada no momento. c No iremos neste livro discutir em detalhes estes tpicos, nem apresentar de uma a o maneira formal qualquer uma destas formas. O interesse apenas apresentar e e discutir algumas estruturas bsicas para ilustrar o pensamento usado pelos proa gramadores quando criam um algoritmo para resolver um problema espec co. Estas estruturas so importantes e sero reapresentadas quando formos aprea a sentar a linguagem C.