Baixe Apostila de C e outras Notas de estudo em PDF para Informática, somente na Docsity!
Curso de Linguagem C
Em Constru¸c˜ao
v0.
Adriano Joaquim de Oliveira Cruz
Instituto de Matem´atica
N´ucleo de Computa¸c˜ao Eletrˆonica
UFRJ
©c2009 Adriano Cruz
20 de Agosto de 2009
8 CONTE UDO´
10 LISTA DE FIGURAS
Lista de Tabelas
Lista de Algoritmos
14 LISTA DE ALGORITMOS
- 1 Introdu¸c˜ao
- 1.1 Sucessos e Fracassos da Computa¸c˜ao
- 1.2 Um Pouco da Hist´oria da Computa¸c˜ao
- 1.2.1 O In´ıcio
- 1.2.2 A Era Moderna
- 1.2.3 O Desenvolvimento durante as Grandes Guerras
- 1.2.4 As Gera¸c˜oes
- 1.3 O Hardware
- 1.3.1 Microcomputadores
- 1.3.2 Mem´orias
- 1.3.3 Bits e Bytes
- 1.3.4 Perif´ericos
- 1.4 O Software
- 1.5 Um programa em C
- 1.6 Exerc´ıcios
- 2 Algoritmos
- 2.1 Introdu¸c˜ao
- 2.2 Primeiros Passos
- 2.3 Representa¸c˜ao
- 2.3.1 Linguagem Natural
- 2.3.2 Fluxogramas
- 2.3.3 Pseudo-Linguagem
- 2.4 Modelo de von Neumann
- 2.5 Estruturas B´asicas de Algoritmos
- 2.5.1 Comandos de leitura
- 2.5.2 Comandos de escrita
- 2.5.3 Express˜oes
- 2.5.4 Comandos de atribui¸c˜ao 4 CONTE UDO´
- 2.5.5 Comandos de controle
- 2.5.6 Comandos de repeti¸c˜ao
- 2.6 Exemplos de Algoritmos
- 2.7 Exerc´ıcios
- 3 Tipos de Dados, Constantes e Vari´aveis
- 3.1 Introdu¸c˜ao
- 3.2 Tipos de Dados
- 3.2.1 Tipos B´asicos
- 3.2.2 Modificadores de tipos
- 3.3 Constantes Num´ericas
- 3.3.1 Constantes Inteiras na base
- 3.3.2 Constantes Inteiras Octais
- 3.3.3 Constantes Inteiras Hexadecimais
- 3.3.4 Convers˜ao entre Bases
- 3.3.5 Constantes em Ponto Flutuante
- 3.4 Constantes Caracteres
- 3.4.1 Constantes Cadeias de Caracteres
- 3.5 Vari´aveis
- 3.5.1 Nomes das Vari´aveis
- 3.5.2 Declara¸c˜ao de vari´aveis
- 3.5.3 Atribui¸c˜ao de valores
- 3.6 Exerc´ıcios
- 4 Entrada e Sa´ıda pelo Console
- 4.1 Introdu¸c˜ao
- 4.2 Biblioteca Padr˜ao
- 4.3 Sa´ıda - A Fun¸c˜ao printf
- 4.3.1 C´odigos de Convers˜ao
- 4.4 Entrada - A Fun¸c˜ao scanf
- 4.5 Lendo e Imprimindo Caracteres
- 4.5.1 Fun¸c˜oes getchar e putchar
- 4.5.2 Lendo e Imprimindo Cadeias de Caracteres
- 4.5.3 Lendo e Imprimindo cadeias com scanf e printf
- 4.5.4 Lendo e Imprimindo cadeias com gets e puts
- 4.5.5 A Fun¸c˜ao fgets
- 4.6 Exerc´ıcios
- CONTE UDO´
- 5 Operadores e Express˜oes
- 5.1 Introdu¸c˜ao
- 5.2 Operador de Atribui¸c˜ao
- 5.3 Operadores Aritm´eticos
- 5.4 Operadores Relacionais e L´ogicos
- 5.4.1 Operadores Relacionais
- 5.4.2 Operadores L´ogicos
- 5.5 Operadores com Bits
- 5.6 Operadores de Atribui¸c˜ao Composta
- 5.7 Operador v´ırgula
- 5.8 Operador sizeof()
- 5.9 Convers˜ao de Tipos
- 5.10 Regras de Precedˆencia
- 5.11 Exerc´ıcios
- 6 Comandos de Controle
- 6.1 Introdu¸c˜ao
- 6.2 Blocos de Comandos
- 6.3 Comandos de Teste
- 6.3.1 Comando if
- 6.3.2 Comando switch
- 6.3.3 Comando Tern´ario
- 6.4 La¸cos de Repeti¸c˜ao
- 6.4.1 Comando for
- 6.4.2 Comando while
- 6.4.3 Comando do-while
- 6.5 Comandos de Desvio
- 6.5.1 Comando break
- 6.5.2 Comando continue
- 6.5.3 Comando goto
- 6.5.4 Fun¸c˜ao exit()
- 6.5.5 Comando return
- 6.6 Exerc´ıcios
- 7 Vetores e Cadeias de Caracteres 6 CONTE UDO´
- 7.1 Introdu¸c˜ao
- 7.2 Declara¸c˜ao de Vetores Unidimensionais
- 7.3 Cadeias de Caracteres
- 7.4 Declara¸c˜ao de Vetores Multidimensionais
- 7.5 Vetores de Cadeias de Caracteres
- 7.6 Inicializa¸c˜ao de Vetores e Matrizes
- 7.7 Exerc´ıcios
- 8 Fun¸c˜oes
- 8.1 Introdu¸c˜ao
- 8.2 Forma Geral
- 8.3 Prot´otipos de Fun¸c˜oes
- 8.4 Escopo de Vari´aveis
- 8.5 Vari´aveis Globais
- 8.6 Parˆametros Formais
- 8.6.1 Passagem de Parˆametros por Valor
- 8.6.2 Passagem de Parˆametros por Referˆencia
- 8.6.3 Passagem de Vetores e Matrizes
- 8.7 O Comando return
- 8.8 Recurs˜ao
- 8.9 Argumentos - argc e arga
- 8.10 Exerc´ıcios
- 9 Ponteiros
- 9.1 Introdu¸c˜ao
- 9.2 Opera¸c˜oes com Ponteiros
- 9.2.1 Declara¸c˜ao de Ponteiros
- 9.2.2 Os Operadores Especiais para Ponteiros
- 9.2.3 Atribui¸c˜ao de Ponteiros
- 9.2.4 Incrementando e Decrementando Ponteiros
- 9.2.5 Compara¸c˜ao de Ponteiros
- 9.3 Ponteiros e Vetores
- 9.4 Ponteiros e Cadeias de Caracteres
- 9.5 Aloca¸c˜ao Dinˆamica de Mem´oria
- 9.6 Ponteiros e Matrizes
- 9.7 Vetores de Ponteiros
- 9.8 Ponteiros para Ponteiros
- 9.9 Exerc´ıcios
- CONTE UDO´
- 10 Estruturas
- 10.1 Introdu¸c˜ao
- 10.2 Defini¸c˜oes B´asicas
- 10.3 Atribui¸c˜ao de Estruturas
- 10.4 Matrizes de Estruturas
- 10.5 Estruturas e Fun¸c˜oes
- 10.6 Ponteiros para Estruturas
- 10.7 Exerc´ıcios
- 11 Entrada e Sa´ıda por Arquivos
- 11.1 Introdu¸c˜ao
- 11.2 Fluxos de Dados
- 11.2.1 Fluxos de Texto
- 11.2.2 Fluxo Bin´ario
- 11.2.3 Arquivos
- 11.3 Fun¸c˜oes de Entrada e Sa´ıda
- 11.4 In´ıcio e Fim
- 11.4.1 Abrindo um Arquivo
- 11.4.2 Fechando um Arquivo
- 11.4.3 Fim de Arquivo
- 11.4.4 Volta ao In´ıcio
- 11.5 Lendo e Escrevendo Caracteres
- 11.6 Testando Erros
- 11.7 Lendo e Escrevendo Cadeias de Caracteres
- 11.8 Entrada e Sa´ıda Formatada
- 11.9 Lendo e Escrevendo Arquivos Bin´arios
- 11.10Exerc´ıcios
- A Tabela ASCII
- B Palavras Reservadas
- 1.1 Fotografia de um circuito integrado de microprocessador Pentium.
- 1.2 Imagem de um ´abaco.
- 1.3 Blaise Pascal
- 1.4 Charles Babbage
- 1.5 Fotografia da Difference Engine
- 1.6 Computador Eniac
- 1.7 Diagrama B´asico de um Computador Digital
- 1.8 N´ıveis de hierarquia da mem´oria de um computador.
- 1.9 Tamanho de Bits, Bytes e Palavras
- 1.10 Ciclo de desenvolvimento de um programa.
- 2.1 S´ımbolos mais comumente usados em fluxogramas.
- 2.2 Fluxograma para resolver uma equa¸c˜ao do primeiro grau.
- 2.3 Modelo de mem´oria
- 2.4 Fluxograma do comando se ent~ao sen~ao.
- 2.5 Fluxograma para decidir se deve levar um guarda-chuva.
- 2.6 Fluxograma do comando enquanto.
- 7.1 Mapa de mem´oria de uma matriz.
- 9.1 Mapa de mem´oria com duas vari´aveis e ponteiro.
- 9.2 Ponteiro apontando para ´area de mem´oria contendo vetor.
- 9.3 Declara¸c˜ao de ponteiros.
- 9.4 Atribui¸c˜ao de endere¸co de uma vari´avel a um ponteiro.
- 9.5 Uso de um ponteiro para copiar valor de uma vari´avel.
- 9.6 Exemplos de atribui¸c˜oes de ponteiros.
- 9.7 Armazenamento de matrizes com vetores de ponteiros.
- 11.1 Fluxos de dados.
- 1.1 Transistores por circuito integrado nos microprocessadores da Intel
- 1.2 Tempo de execu¸c˜ao das instru¸c˜oes aritm´eticas no ENIAC
- 1.3 Exemplos de Microprocessadores
- 1.4 Abrevia¸c˜oes usadas em referˆencias `as mem´orias.
- 1.5 Exemplos de perif´ericos
- 2.1 Operadores Aritm´eticos.
- 3.1 Tipos de dados definidos pelo Padr˜ao ANSI C.
- 3.2 Constantes Inteiras na Base
- 3.3 Constantes octais
- 3.4 Constantes hexadecimais
- 3.5 Constantes em ponto flutuante
- 3.6 Exemplos de constantes caractere
- 3.7 Exemplos de caracteres invis´ıveis.
- 4.1 C´odigos de Convers˜ao para leitura e entrada de dados.
- 5.1 Operadores aritm´eticos.
- 5.2 Operadores Relacionais.
- 5.3 Operador L´ogico E.
- 5.4 Operador L´ogico OU.
- 5.5 Operador L´ogico N~AO.
- 5.6 Precedˆencia dos operadores l´ogicos e relacionais.
- 5.7 Operadores com bits.
- 5.8 Operador L´ogico OU.
- 5.9 Precedˆencia dos operadores.
- 7.1 Passos executados durante o algoritmo da bolha.
- 2.1 Exemplo de Algoritmo.
- 2.2 Algoritmo para resolver uma equa¸c˜ao do primeiro grau.
- 2.3 Algoritmo para calcular a m´edia das notas de um aluno.
- 2.4 Algoritmo para calcular a maior nota de um grupo de notas.
- 2.5 Modelo de mem´oria e funcionamento de um algoritmo
- 2.6 Comando se em pseudo-linguagem
- 2.7 Algoritmo para decidir o que fazer no domingo.
- 2.8 Algoritmo para decidir se deve levar um guarda-chuva.
- 2.9 Algoritmo para ler 10 n´umeros e imprimir se s˜ao pares ou n˜ao.
- 2.10 Algoritmo para ler n´umeros e imprimir se s˜ao pares ou n˜ao.
- 2.11 Algoritmo para calcular a maior nota de uma turma de 25 alunos.
- 2.12 Algoritmo para calcular a nota m´edia de uma turma de 25 alunos.
- 2.13 Algoritmo para calcular a maior temperatura do ano.
- 3.1 Algoritmo para converter inteiros na base 10 para uma base b.
- 1.1 Exemplo de Programa em C.
- 4.1 Exemplo de impress˜ao de resultados
- 4.2 Exemplo de justifica¸c˜ao de resultados.
- 4.3 Exemplo de uso de especificador de precis˜ao.
- 4.4 Exemplo de uso de scanf.
- 4.5 Exemplo de uso de getchar e putchar.
- 4.6 Exemplo de uso de getchar e putchar.
- 4.7 Exemplo de uso de printf e scanf na leitura de cadeias.
- 4.8 Exemplo de uso de puts e gets na leitura de cadeias.
- 5.1 Exemplo de operadores de deslocamento.
- 5.2 Exemplo do operador sizeof.
- 6.1 Exemplo de comandos if.
- 6.2 Programas com ifs em escada e aninhados.
- 6.3 Exemplo de switch.
- 6.4 Exemplo de comando tern´ario.
- 6.5 Exemplo de comando for.
- 6.6 Exemplo de comando for com testes sobre outras vari´aveis.
- 6.7 Exemplo de comando for sem altera¸c˜ao da vari´avel de controle.
- 6.8 Exemplo de comando for sem teste de fim.
- 6.9 Comando for aninhados.
- 6.10 Comando while com uma fun¸c˜ao.
- 7.1 Exemplo de vetores.
- 7.2 Produto escalar de dois vetores.
- 7.3 Ordena¸c˜ao pelo m´etodo da bolha.
- 7.4 Exemplos de fun¸c˜oes para cadeias.
- 7.5 Leitura de uma matriz.
- 7.6 Multiplica¸c˜ao de duas matrizes.
- 7.7 Leitura de um vetor de nomes.
- 7.8 Exemplos de tratamento de vetores. 16 LISTINGS
- 7.9 Exemplos de tratamento de vetores.
- 8.1 Exemplo de prot´otipos.
- 8.2 Exemplos de vari´aveis locais.
- 8.3 Defini¸c˜ao de vari´avel dentro de um bloco.
- 8.4 Defini¸c˜ao de vari´avel global.
- 8.5 Exemplo de passagem por valor.
- 8.6 Uso indevido de vari´aveis locais.
- 8.7 Passagem de vetor com dimens˜oes.
- 8.8 Passagem de vetores sem dimens˜oes.
- 8.9 Fun¸c˜ao recursiva para calcular xn.
- 8.10 Uso de argc e arga.
- 9.1 Exemplo de atribui¸c˜ao de ponteiros.
- 9.2 Exemplos de opera¸c˜oes com ponteiros.
- 9.3 Exemplo de subtra¸c˜ao de ponteiros.
- 9.4 Exemplo de compara¸c˜ao de ponteiros.
- 9.5 Exemplo de altera¸c˜oes inv´alidas sobre ponteiros.
- 9.6 Exemplo de nota¸c˜oes de vetores.
- 9.7 Exemplo de ponteiro vari´avel.
- 9.8 Exemplo de ponteiro para cadeia de caracteres.
- 9.9 Exemplo de c´opia de cadeias de caracteres.
- 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.16 Exemplo de uso de ponteiros para ponteiros usando fun¸c˜oes.
- 9.17 Continua¸c˜ao do exemplo 9.16.
- 10.1 Defini¸c˜ao de uma estrutura.
- 10.2 Atribui¸c˜ao de Estruturas.
- 10.3 Ordena¸c˜ao de Estruturas.
- 10.4 Passando elementos para fun¸c˜oes.
- 10.5 Passagem de estruturas para fun¸c˜oes.
- 10.6 Fun¸c˜ao que ordena estruturas.
- 10.7 Aloca¸c˜ao de espa¸co para estruturas.
- 10.8 Aloca¸c˜ao de espa¸co para vetores de estruturas.
- LISTINGS
- 10.9 Listagem do exercicio 3.
- 11.1 Uso da fun¸c˜ao feof().
- 11.3 Exemplo de leitura e escrita de caracteres.
- 11.2 Exemplo de leitura e escrita de caracteres.
- 11.4 Uso da fun¸c˜ao ferror().
- 11.5 Exemplo de leitura e escrita de cadeias de caracteres.
- 11.6 Exemplo de leitura e escrita de dados formatados.
- 11.7 Exemplo de leitura e escrita na forma bin´aria.
- 11.8 Exemplo de leitura e escrita de estruturas.
Cap´ıtulo 1
Introdu¸c˜ao
1.1 Sucessos e Fracassos da Computa¸c˜ao
Os objetivos principais deste Cap´ıtulo s˜ao mostrar para o aluno iniciante alguns aspectos da hist´oria da computa¸c˜ao e definir, informalmente, termos e palavras- chave que os profissionais da ´area de computa¸c˜ao usam no seu dia a dia. Adriano Cruz ©c. A hist´oria do desenvolvimento dos computadores tem sido impressionante. O avan¸co da tecnologia e a presen¸ca da computa¸c˜ao na nossa vida s˜ao ineg´aveis. Embora a hist´oria deste fant´astico desenvolvimento seja recente e bem documen- tada, h´a lacunas e controv´ersias impressionantes sobre diversos pontos. Neste cap´ıtulo iremos ver hist´orias de espionagem e brigas na justi¸ca por roubo de id´eias. H´a oportunidades perdidas e gente que soube aproveitar a sua chance. H´a verdades estabelecidas que tiveram de ser revistas. O avan¸co na tecnologia dos computadores se deu em passos t˜ao largos que os primeiros computadores parecem t˜ao distantes no tempo quanto a Pr´e-Hist´oria. O aumento de velocidade, desde os anos 40, foi da ordem de v´arias ordens de grandeza, enquanto que o custo dos computadores caiu de milh˜oes de d´olares para valores em torno de centenas de d´olares. As primeiras m´aquinas tinham mi- lhares de v´alvulas, ocupavam ´areas enormes e consumiam quilowatts de energia. O microprocessador Pentium, lan¸cado em 1993, tinha em torno de 3,1 milh˜oes de transistores, ocupava uma ´area de aproximadamente 25 cm^2 e consumia alguns watts de energia, custando aproximadamente 1000 d´olares, somente o microprocessador. A Figura 1.1 mostra a imagem de um circuito integrado de microprocessador Pentium. No entanto, esta hist´oria de redu¸c˜ao de tamanho, aumento de velocidade e diminui¸c˜ao de gasto de potˆencia, pode, para alguns pesquisadores, j´a ter uma data fixada para terminar. Em 1965, Gordon Moore, um dos fundadores da In- tel, fabricante do Pentium e uma dos maiores fabricantes de circuitos integrados do mundo, enunciou o que ficou conhecido como a Lei de Moore: “Cada novo circuito integrado ter´a o dobro de transistores do anterior e ser´a lan¸cado dentro de um intervalo de 18 a 24 meses.” Moore achava que esta lei seria v´alida so- mente at´e 1975, no entanto, ela continua v´alida at´e hoje. Na tabela 1.1, pode-se observar a evolu¸c˜ao dos microprocessadores usados em nossos computadores.
19
20 CAP´ITULO 1. INTRODUC¸ AO˜
Figura 1.1: Fotografia de um circuito integrado de microprocessador Pentium.
Ano Processador Transistores 1971 4004 2. 1972 8008 2. 1974 8080 5. 1982 80286 120. 1985 80386 275. 1989 80486 DX 1.180. 1993 Pentium 3.100. 1997 Pentium II 7.500. 1999 Pentium III 24.000. 2000 Pentium 4 42.000.
Tabela 1.1: Transistores por circuito integrado nos microprocessadores da Intel
Os transistores, que comp˜oem os circuitos eletrˆonicos, est˜ao diminu´ıdo de tamanho, e estamos nos aproximando da fronteira final, os el´etrons. J´a se houve falar em tamanho de transistores medidos em n´umeros de el´etrons. Devemos nos lembrar que toda a tecnologia atual est´a baseada em fluxo de el´etrons, ou seja uma corrente el´etrica. Os fios conduzem correntes de el´etrons e os transistores controlam este fluxo. Se o tamanho diminuir al´em dos el´etrons estaremos em outro dom´ınio.
No entanto, na hist´oria da computa¸c˜ao, muitas promessas n˜ao foram cum- pridas e falhas gigantescas aconteceram. Como em diversas quest˜oes, artistas geniais, apontam o que n˜ao conseguimos ou n˜ao queremos ver e mostram que o rei est´a nu. H´a uma frase de Picasso que diz: “Computadores s˜ao est´upidos, eles somente conseguem responder perguntas”. Esta frase exp˜oe com ironia um fracasso da comunidade de computa¸c˜ao que havia prometido criar rapida- mente computadores inteligentes, computadores que poderiam questionar-se e nos questionar. Muitos acreditaram nesta promessa e muitos livros de fic¸c˜ao ci- ent´ıfica foram publicados em que este tipo de computador estaria dispon´ıvel em um futuro muito pr´oximo. Com not´avel exemplo podemos citar o filme “2001 - Uma Odiss´eia no Espa¸co”, de Stanley Kubrik que estreou em 1968 e foi baseado no conto “The Sentinel”, escrito em 1950 por Arthur Clark, um dos mestres da fic¸c˜ao 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