Ótima apostila de linguagem c

Ótima apostila de linguagem c

(Parte 1 de 7)

Curso de Linguagem C

Em Construcao v0.001

Adriano Joaquim de Oliveira Cruz

Instituto de Matematica

Nucleo de Computacao Eletronica UFRJ c©2006 Adriano Cruz

28 de Dezembro de 2007

Conteudo

1.1 Sucessos e Fracassos da Computacao19
1.2 Um Pouco da Historia da Computacao21
1.2.1 O Inıcio21
1.2.2 A Era Moderna2
1.2.3 O Desenvolvimento durante as Grandes Guerras24
1.2.4 As Geracoes27
1.3 O Hardware27
1.3.1 Microcomputadores29
1.3.2 Memorias30
1.3.3 Bits e Bytes32
1.3.4 Perifericos3
1.4 O Software3
1.5 Um programa em C38

1 Introducao 19

2.1 Introducao41
2.2 Primeiros Passos43
2.3 Representacao4
2.3.1 Linguagem Natural45
2.3.2 Fluxogramas45
2.3.3 Pseudo-Linguagem46
2.4 Modelo de von Neumann47
2.5 Estruturas Basicas de Algoritmos49
2.5.1 Comandos de leitura49
2.5.2 Comandos de escrita50
2.5.3 Expressoes51
2.5.4 Comandos de atribuicao53
2.5.5 Comandos de controle53
2.5.6 Comandos de repeticao54
2.6 Exemplos de Algoritmos56

4 CONTEUDO

3.1 Introducao63
3.2 Tipos de Dados63
3.2.1 Tipos Basicos63
3.2.2 Modificadores de tipos64
3.3 Constantes Numericas64
3.3.1 Constantes Inteiras na base 106
3.3.2 Constantes Inteiras Octais67
3.3.3 Constantes Inteiras Hexadecimais67
3.3.4 Conversao entre Bases68
3.3.5 Constantes em Ponto Flutuante68
3.4 Constantes Caracteres70
3.4.1 Constantes Cadeias de Caracteres70
3.5 Variaveis71
3.5.1 Nomes das Variaveis71
3.5.2 Declaracao de variaveis72
3.5.3 Atribuicao de valores73

3 Tipos de Dados, Constantes e Variaveis 63

4.1 Introducao75
4.2 Biblioteca Padrao75
4.3 Saıda - A Funcao printf76
4.3.1 Codigos de Conversao7
4.4 Entrada - A Funcao scanf79
4.5 Lendo e Imprimindo Caracteres82
4.5.1 Funcoes getchar e putchar82
4.5.2 Lendo e Imprimindo Cadeias de Caracteres83
4.5.3 Lendo e Imprimindo cadeias com scanf e printf84
4.5.4 Lendo e Imprimindo cadeias com gets e puts84

CONTEUDO 5

5.1 Introducao89
5.2 Operador de Atribuicao89
5.3 Operadores Aritmeticos90
5.4 Operadores Relacionais e Logicos91
5.4.1 Operadores Relacionais91
5.4.2 Operadores Logicos92
5.5 Operadores com Bits94
5.6 Operadores de Atribuicao Composta96
5.7 Operador vırgula96
5.8 Operador sizeof()97
5.9 Conversao de Tipos97
5.10 Regras de Precedencia9

5 Operadores e Expressoes 89

6.1 Introducao101
6.2 Blocos de Comandos101
6.3 Comandos de Teste102
6.3.1 Comando if102
6.3.2 Comando switch103
6.3.3 Comando Ternario106
6.4 Lacos de Repeticao106
6.4.1 Comando for106
6.4.2 Comando while1
6.4.3 Comando do-while113
6.5 Comandos de Desvio113
6.5.1 Comando break113
6.5.2 Comando continue114
6.5.3 Comando goto114
6.5.4 Funcao exit()114

6 CONTEUDO

7.1 Introducao117
7.2 Declaracao de Vetores Unidimensionais117
7.3 Cadeias de Caracteres120
7.4 Declaracao de Vetores Multidimensionais124
7.5 Vetores de Cadeias de Caracteres125
7.6 Inicializacao de Vetores e Matrizes127

7 Vetores e Cadeias de Caracteres 117

8.1 Introducao133
8.2 Forma Geral134
8.3 Prototipos de Funcoes135
8.4 Escopo de Variaveis136
8.4.1 Variaveis Locais136
8.5 Variaveis Globais138
8.6 Parametros Formais139
8.6.1 Passagem de Parametros por Valor139
8.6.2 Passagem de Parametros por Referencia140
8.6.3 Passagem de Vetores e Matrizes141
8.7 O Comando return144
8.8 Recursao144
8.9 Argumentos - argc e argv145

8 Funcoes 133

9.1 Introducao149
9.2 Operacoes com Ponteiros151
9.2.1 Declaracao de Ponteiros151
9.2.2 Os Operadores Especiais para Ponteiros152
9.2.3 Atribuicao de Ponteiros152
9.2.4 Incrementando e Decrementando Ponteiros154
9.2.5 Comparacao de Ponteiros156
9.3 Ponteiros e Vetores156
9.4 Ponteiros e Cadeias de Caracteres157
9.5 Alocacao Dinamica de Memoria158
9.6 Ponteiros e Matrizes160
9.7 Vetores de Ponteiros163

CONTEUDO 7

10.1 Introducao171
10.2 Definicoes Basicas171
10.3 Atribuicao de Estruturas173
10.4 Matrizes de Estruturas174
10.5 Estruturas e Funcoes174
10.6 Ponteiros para Estruturas176
1.1 Introducao185
1.2 Fluxos de Dados185
1.2.1 Fluxos de Texto185
1.2.2 Fluxo Binario186
1.2.3 Arquivos187
1.3 Funcoes de Entrada e Saıda187
1.4 Inıcio e Fim188
1.4.1 Abrindo um Arquivo188
1.4.2 Fechando um Arquivo189
1.4.3 Fim de Arquivo190
1.4.4 Volta ao Inıcio190
1.5 Lendo e Escrevendo Caracteres191
1.6 Testando Erros194
1.7 Lendo e Escrevendo Cadeias de Caracteres194
1.8 Entrada e Saıda Formatada195
1.9 Lendo e Escrevendo Arquivos Binarios198

1 Entrada e Saıda por Arquivos 185

A Tabela ASCII 205 B Palavras Reservadas 207

8 CONTEUDO 8 CONTEUDO

Lista de Figuras

1.2 Imagem de um abaco2
1.3 Blaise Pascal2
1.4 Charles Babbage23
1.5 Fotografia da Difference Engine23
1.6 Computador Eniac26
1.7 Diagrama Basico de um Computador Digital28
1.8 Nıveis de hierarquia da memoria de um computador30
1.9 Tamanho de Bits, Bytes e Palavras32
1.10 Ciclo de desenvolvimento de um programa36
2.1 Sımbolos mais comumente usados em fluxogramas45
2.2 Fluxograma para resolver uma equacao do primeiro grau46
2.3 Modelo de memoria49
2.4 Fluxograma do comando seent~ao ... sen~ao. . . . . . . 54
2.5 Fluxograma para decidir se deve levar um guarda-chuva56
2.6 Fluxograma do comando enquanto57
7.1 Mapa de memoria de uma matriz125
9.1 Mapa de memoria com duas variaveis e ponteiro149
9.2 Ponteiro apontando para area de memoria contendo vetor150
9.3 Declaracao de ponteiros151
9.4 Atribuicao de endereco de uma variavel a um ponteiro152
9.5 Uso de um ponteiro para copiar valor de uma variavel153
9.6 Exemplos de atribuicoes de ponteiros154

1.1 Fotografia de um circuito integrado de microprocessador Pentium. 20 9

9.7 Armazenamento de matrizes com vetores de ponteiros165
1.1 Transistores por chip nos microprocessadores da Intel20
1.2 Tempo de execucao das instrucoes aritmeticas no ENIAC26
1.3 Exemplos de Microprocessadores29
1.4 Abreviacoes usadas em referencias as memorias3
1.5 Exemplos de perifericos3
2.1 Operadores Aritmeticos53
3.1 Tipos de dados definidos pelo Padrao ANSI C65
3.2 Constantes Inteiras na Base 106
3.3 Constantes octais67
3.4 Constantes hexadecimais67
3.5 Constantes em ponto flutuante70
3.6 Exemplos de constantes caractere70
3.7 Exemplos de caracteres invisıveis71
4.1 Codigos de Conversao para leitura e entrada de dados7
5.1 Operadores aritmeticos90
5.2 Operadores Relacionais91
5.3 Operador Logico E92
5.4 Operador Logico OU93
5.5 Operador Logico N~AO94
5.6 Precedencia dos operadores logicos e relacionais94
5.7 Operadores com bits94
5.8 Operador Logico OU95

Lista de Tabelas 1

5.9 Precedencia dos operadores9
7.1 Passos executados durante o algoritmo da bolha120
1.1 Exemplos de funcoes de Entrada e Saıda188
A.1 Conjunto de caracteres ASCII205

12 LISTA DE TABELAS A.2 Conjunto de codigos especiais ASCII e seus significados . . . . . 206

2.1 Exemplo de Algoritmo43
2.2 Algoritmo para resolver uma equacao do primeiro grau4
2.3 Algoritmo para calcular a media das notas de um aluno45
2.4 Algoritmo para calcular a maior nota de um grupo de notas47
2.5 Modelo de memoria e funcionamento de um algoritmo48
2.6 Comando se em pseudo-linguagem54
2.7 Algoritmo para decidir o que fazer no domingo5
2.8 Algoritmo para decidir se deve levar um guarda-chuva5
2.9 Algoritmo para ler 10 numeros e imprimir se sao pares ou nao58
2.10 Algoritmo para ler numeros e imprimir se sao pares ou nao59
2.13 Algoritmo para calcular a maior temperatura do ano61
3.1 Algoritmo para converter inteiros na base 10 para uma base b69

Lista de Algoritmos 2.1 Algoritmo para calcular a maior nota de uma turma de 25 alunos. 60 2.12 Algoritmo para calcular a nota media de uma turma de 25 alunos. 60 13

14 LISTA DE ALGORITMOS 14 LISTA DE ALGORITMOS

1.1 Exemplo de Programa em C39
4.1 Exemplo de impressao de resultados76
4.2 Exemplo de justificacao de resultados79
4.3 Exemplo de uso de especificador de precisao79
4.4 Exemplo de uso de scanf81
4.5 Exemplo de uso de getchar e putchar82
4.6 Exemplo de uso de getchar e putchar83
4.7 Exemplo de uso de printf e scanf na leitura de cadeias84
4.8 Exemplo de uso de puts e gets na leitura de cadeias85
5.1 Exemplo de operadores de deslocamento95
5.2 Exemplo do operador sizeof97
6.1 Programas com ifs em escada e aninhados104
6.2 Exemplo de switch107
6.3 Exemplo de comando ternario108
6.4 Exemplo de comando for109
6.5 Exemplo de comando for com testes sobre outras variaveis110
6.7 Exemplo de comando for sem teste de fim1
6.8 Comando for aninhados1
6.9 Comando while com uma funcao112
7.1 Exemplo de vetores118
7.2 Produto escalar de dois vetores119
7.3 Ordenacao pelo metodo da bolha121
7.4 Exemplos de funcoes para cadeias123
7.5 Leitura de uma matriz124

Listings 6.6 Exemplo de comando for sem alteracao da variavel de controle. 110 15

7.6 Multiplicacao de duas matrizes126
7.7 Leitura de um vetor de nomes127
7.8 Exemplos de tratamento de vetores128
7.9 Exemplos de tratamento de vetores129
8.1 Exemplo de prototipos136
8.2 Exemplos de variaveis locais137
8.3 Definicao de variavel dentro de um bloco138
8.4 Definicao de variavel global139
8.5 Exemplo de passagem por valor140
8.6 Uso indevido de variaveis locais141
8.7 Passagem de vetor com dimensoes142
8.8 Passagem de vetores sem dimensoes143
8.9 Funcao recursiva para calcular xn146
8.10 Uso de argc e argv147
9.1 Exemplo de atribuicao de ponteiros153
9.2 Exemplos de operacoes com ponteiros154
9.3 Exemplo de subtracao de ponteiros155
9.4 Exemplo de comparacao de ponteiros156
9.5 Exemplo de alteracoes invalidas sobre ponteiros157
9.6 Exemplo de notacoes de vetores157
9.7 Exemplo de ponteiro variavel158
9.8 Exemplo de ponteiro para cadeia de caracteres158
9.9 Exemplo de copia de cadeias de caracteres159
9.10 Exemplo de uso de calloc e free160
9.1 Exemplo de uso de malloc161
9.12 Exemplo de matriz normal sem uso de ponteiros162
9.13 Exemplo de matriz mapeada em um vetor162
9.14 Exemplo de uso de vetor de ponteiros164
9.15 Exemplo de uso de ponteiros para ponteiros166
9.16 Exemplo de uso de ponteiros para ponteiros usando funcoes167
9.17 Continuacao do exemplo 9.16168
10.1 Atribuicao de Estruturas173
10.2 Ordenacao de Estruturas175
10.4 Ordenacao de Estruturas177
10.5 Ordenacao de Estruturas (continuacao)178
10.6 Ponteiros para de estruturas180
10.7 Listagem do exercicio 3183
1.1 Uso da funcao feof()190
1.2 Exemplo de leitura e escrita de caracteres192
1.3 Exemplo de leitura e escrita de caracteres193
1.4 Uso da funcao ferror()194
1.5 Exemplo de leitura e escrita de cadeias de caracteres196
1.6 Exemplo de leitura e escrita de dados formatados197
1.7 Exemplo de leitura e escrita na forma binaria199

18 LISTINGS 18 LISTINGS

Capıtulo 1 Introducao

1.1 Sucessos e Fracassos da Computacao

Os objetivos principais deste Capıtulo sao mostrar para o aluno iniciante alguns aspectos da historia da computacao e definir, informalmente, termos e palavraschave que os profissionais da area de computacao usam no seu dia a dia. Adriano Cruz c©.

A historia do desenvolvimento dos computadores tem sido impressionante.

O avanco da tecnologia e a presenca da computacao na nossa vida sao inegaveis. Embora a historia deste fantastico desenvolvimento seja recente e bem documentada, ha lacunas e controversias impressionantes sobre diversos pontos. Neste capıtulo iremos ver historias de espionagem e brigas na justica por roubo de ideias. Ha oportunidades perdidas e gente que soube aproveitar a sua chance. Ha verdades estabelecidas que tiveram de ser revistas.

O avanco na tecnologia dos computadores se deu em passos tao largos que os primeiros computadores parecem tao distantes no tempo quanto a Pre-Historia. O aumento de velocidade, desde os anos 40, foi da ordem de varias ordens de grandeza, enquanto que o custo dos computadores caiu de milhoes de dolares para valores em torno de centenas de dolares. As primeiras maquinas tinham milhares de valvulas, ocupavam areas enormes e consumiam quilowatts de energia. O microprocessador Pentium, lancado em 1993, tinha em torno de 3,1 milhoes de transistores, ocupava uma area de aproximadamente 25 cm2 e consumia alguns watts de energia, custando aproximadamente 1000 dolares, somente o microprocessador. A Figura 1.1 mostra a imagem de um circuito integrado de microprocessador Pentium.

No entanto, esta historia de reducao de tamanho, aumento de velocidade e diminuicao de gasto de potencia, pode, para alguns pesquisadores, ja ter uma data fixada para terminar. Em 1965, Gordon Moore, um dos fundadores da Intel, fabricante do Pentium e uma dos maiores fabricantes de circuitos integrados

20 CAPITULO 1. INTRODUC AO

Figura 1.1: Fotografia de um circuito integrado de microprocessador Pentium.

do mundo, enunciou o que ficou conhecido como a Lei de Moore: ”Cada novo circuito integrado tera o dobro de transistores do anterior e sera lancado dentro de um intervalo de 18 a 24 meses.”Moore achava que esta lei seria valida somente ate 1975, no entanto, ela continua valida ate hoje. Na tabela 1.1, pode-se observar a evolucao dos microprocessadores usados em nossos computadores.

Tabela 1.1: Transistores por chip nos microprocessadores da Intel

Os transistores, que compoem os circuitos eletronicos, estao diminuido de tamanho, e estamos nos aproximando da fronteira final, os eletrons. Ja se houve falar em tamanho de transistores medidos em numeros de eletrons. Devemos nos lembrar que toda a tecnologia atual esta baseada em fluxo de eletrons, ou seja uma corrente eletrica. Os fios conduzem correntes de eletrons e os transistores controlam este fluxo. Se o tamanho diminuir alem dos eletrons estaremos em outro domınio.

No entanto, na historia da computacao, muitas promessas nao foram cumpridas e falhas gigantescas aconteceram. Como em diversas questoes, artistas geniais, apontam o que nao conseguimos ou nao queremos ver e mostram que o rei esta nu. Ha uma frase de Picasso que diz: ”Computadores sao estupidos, eles somente conseguem responder perguntas”. Esta frase expoe com ironia um fracasso da comunidade de computacao que havia prometido criar rapidamente computadores inteligentes, computadores que poderiam questionar-se e nos questionar. Muitos acreditaram nesta promessa e muitos livros de ficcao cientıfica foram publicados em que este tipo de computador estaria disponıvel em um futuro muito proximo. Com notavel exemplo podemos citar o filme ”2001 - Uma Odisseia no Espaco”, de Stanley Kubrik que estreou em 1968 e foi baseado no conto ”The Sentinel”, escrito em 1950 por Arthur Clark, um dos mestres da ficcao cientıfica. Neste filme o enlouquecido computador HAL 9000, que era capaz de ver, falar, raciocinar etc, mata quase todos os tripulantes de uma nave espacial. Ora, ja passamos por 2001 e nao existe a menor possibilidade de se ver um computador como o HAL ou tao louco de pedra como ele.

Na computacao, um exemplo fantastico de sucesso e a Internet. A Inernet esta se tornando essencial para o funcionamento do mundo moderno. Frequentemente ouvimos dizer que ela e o meio de comunicacao que mais rapidamente se difundiu pelo mundo. Pode parecer verdade, ja que conhecemos tantos internautas e as empresas estao se atropelando para fazer parte desta onda e aproveitar 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 proximo, voltaremos a Grecia Antiga e nos reuniremos em uma enorme praca virtual para, democraticamente, discutir nossas leis, dispensando intermediarios.

1.2 Um Pouco da Historia da Computacao

A primeira tentativa de se criar uma maquina de contar foi o abaco. A palavra vem do arabe e significa po. Os primeiros abacos eram bandejas de areia sobre as quais se faziam figuras para representar as operacoes. Aparentemente, os chineses foram os inventores do abaco de calcular. No entanto, ha controversias, e os japoneses tambem reivindicam esta invencao, que eles chamam de soroban. Alem disso ha os russos, que inventaram um tipo mais simples, chamado de tschoty Sao conhecidos exemplares de abaco datados de 2500 A.C. A Figura 1.2 ilustra um exemplar com as suas contas e varetas.

Em 1901 mergulhadores, trabalhando perto da ilha grega de Antikythera, encontraram os restos de um mecanismo, parecido com um relogio, com aproximadamente 2000 anos de idade. O mecanismo parece ser um dispositivo para calcular os movimentos de estrelas e planetas.

2 CAPITULO 1. INTRODUC AO

Figura 1.2: Imagem de um abaco.

1.2.2 A Era Moderna

Em 1614 John Napier, matematico escoces, inventou um dispositivo feito de marfim para demonstrar a divisao por meio de subtracoes e a multiplicacao por meio de somas. A semelhanca entre marfim e ossos, fez com que o dispositivo fosse conhecido como os ossos de Napier.

Um dos primeiros instrumentos modernos de calcular, do tipo mecanico, foi construıdo pelo filosofo, matematico e fısico frances Blaise Pascal (Figura 1.3). Em 1642 aos 19 anos, na cidade de Rouen. Pascal desenvolveu uma maquina de calcular, para auxiliar seu trabalho de contabilidade. A engenhoca era baseada em 2 conjuntos de discos interligados por engrenagens: um para a introducao dos dados e outro para armazenar os resultados. A maquina utilizava o sistema 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

(Parte 1 de 7)

Comentários