Upcoming SlideShare
×

# Ap curso+de+linguagem+c

942

Published on

0 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

• Be the first to like this

Views
Total Views
942
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
76
0
Likes
0
Embeds 0
No embeds

No notes for slide

### Ap curso+de+linguagem+c

1. 1. APOSTILA DO CURSOLINGUAGEM C Prof. Erico Fagundes Anicet Lisboa, M. Sc. erico@ericolisboa.eng.br Versão digital disponível na internet http://www.ericolisboa.eng.br RIO DE JANEIRO, RJ - BRASIL NOVEMBRO DE 2001
3. 3. iii 4.4 Recursividade ______________________________________________________________________17 4.5 Classes de Armazenamento ___________________________________________________________17 4.5.1 Classe de Armazenamento - auto ____________________________________________________________ 18 4.5.2 Classe de Armazenamento - extern __________________________________________________________ 18 4.5.3 Classe de Armazenamento - static ___________________________________________________________ 18 4.5.4 Classe de Armazenamento - register _________________________________________________________ 19 4.6 O Pré-processador C ________________________________________________________________19 4.6.1 A Diretiva #define _______________________________________________________________________ 19 4.6.2 A Diretiva #undef________________________________________________________________________ 21 4.6.3 A Diretiva #include ______________________________________________________________________ 21 4.6.4 Outras Diretivas _________________________________________________________________________ 215. VETORES E MATRIZES _____________________________________________ 23 5.1 Vetores____________________________________________________________________________23 5.1.1 Inicialização ____________________________________________________________________________ 24 5.1.2 Vetores como argumento de funções _________________________________________________________ 25 5.2 Vetores de Caracteres _______________________________________________________________25 5.2.1 A função strlen() ________________________________________________________________________ 26 5.2.2 A função strcmp() _______________________________________________________________________ 26 5.2.3 A função strcpy() ________________________________________________________________________ 27 5.2.4 A função strcat()_________________________________________________________________________ 27 5.3 Matrizes___________________________________________________________________________27 5.3.1 Inicialização ____________________________________________________________________________ 28 5.3.2 Matrizes como argumento de funções ________________________________________________________ 286. PONTEIROS _______________________________________________________ 29 6.1 Definição __________________________________________________________________________29 6.2 Passagem de Argumentos por Endereço ________________________________________________30 6.3 Operações com Ponteiros_____________________________________________________________31 6.3.1 Atribuição______________________________________________________________________________ 32 6.3.2 Conteúdo ______________________________________________________________________________ 32 6.3.3 Endereço_______________________________________________________________________________ 32 6.3.4 Soma e diferença ________________________________________________________________________ 32 6.3.5 Comparações ___________________________________________________________________________ 32 6.3.6 Ponteiros para void_______________________________________________________________________ 32 6.4 Ponteiros e Vetores__________________________________________________________________33 6.5 Alocação Dinâmica de Memória _______________________________________________________34 6.5.1 Função malloc() _________________________________________________________________________ 34 6.5.2 Função free() ___________________________________________________________________________ 34 6.5.2 Exemplo das funções malloc() e free() _______________________________________________________ 34
4. 4. iv 6.6 Ponteiros para Ponteiros _____________________________________________________________35 6.6.1 Passando matrizes alocadas dinamicamente como argumento de funções_____________________________ 36 6.7 Ponteiros para Funções ______________________________________________________________37 6.7.1 A função qsort() _________________________________________________________________________ 377. DADOS ORGANIZADOS_____________________________________________ 40 7.1 Estruturas _________________________________________________________________________40 7.1.1 Acessando dados membro _________________________________________________________________ 40 7.1.2 Estruturas dentro de estruturas ______________________________________________________________ 41 7.1.3 Atribuição entre estruturas _________________________________________________________________ 42 7.1.4 Passando estruturas para funções ____________________________________________________________ 42 7.1.5 Vetores de estruturas _____________________________________________________________________ 43 7.1.6 Ponteiros para estruturas __________________________________________________________________ 43 7.2 Uniões ____________________________________________________________________________45 7.3 Enumeração _______________________________________________________________________458. ENTRADA E SAÍDA ________________________________________________ 47 8.1 Arquivos Texto _____________________________________________________________________47 8.1.1 As funções fopen() e fclose() _______________________________________________________________ 48 8.1.2 As funções getc () e putc() _________________________________________________________________ 49 8.1.3 As funções fgets () e fputs() ________________________________________________________________ 49 8.1.4 As funções fprintf () e fscanf() ______________________________________________________________ 50 8.2 Arquivos Binários___________________________________________________________________51 8.2.1 As funções fread () e fwrite() _______________________________________________________________ 51ANEXO A - TABELA ASCII ____________________________________________ 53ANEXO B - EXERCÍCIOS ______________________________________________ 58 B.1 Introdução ________________________________________________________________________58 B.2 Operadores ________________________________________________________________________58 B.3 Controle de Fluxo __________________________________________________________________59 B.4 Funções ___________________________________________________________________________60 B.5 Vetores e Matrizes __________________________________________________________________61 B.6 Ponteiros __________________________________________________________________________63 B.7 Dados Organizados _________________________________________________________________63 B.8 Entrada e Saída ____________________________________________________________________64ANEXO C - EXEMPLOS DE FUNÇÕES __________________________________ 65BIBLIOGRAFIA ______________________________________________________ 66
12. 12. 2 - Operadores Linguagem COperador Descrição() chamada de função[] elemento de matriz-> ponteiro para membro de estrutura. membro de estrutura! negação lógica~ negação bit a bit++ incremento-- decremento- menos unário(tipo) conversão (cast)* ponteiro& endereçosizeof tamanho do objeto* multiplicação/ elemento de matriz% resto da divisão+ adição- subtração<< deslocamento à esquerda>> deslocamento à direita< menor que<= menor ou igual a> maior que>= maior ou igual a== igualdade!= desigualdade& e, bit a bit^ ou exclusivo, bit a bit| ou, bit a bit&& e, lógico|| ou, lógico?: condicional= atribuiçãoop= atribuição, vírgulaProf. Erico Lisboa 8 http://www.ericolisboa.eng.br
13. 13. 3 - Controle de fluxo Linguagem C CAPÍTULO 3 CONTROLE DE FLUXO33.1 if3.1.1 Sintaxe if (expr) comandoSe expr for verdadeira (diferente de 0), comando é executado. if (expr) comando1 else comando2Se expr for verdadeira, comando1 é executado; caso contrário, comando2 é executado. if (expr1) comando1 else if (expr2) comando2 else comando3Se expr1 for verdadeira, comando1 é executado. Se for falsa, se expr2 for verdadeira, comando2 éexecutado; caso contrário, comando33.1.2 Exemplos /* Exemplo 1 */ if (a == 3) b = 4; /* Exemplo 2 */ if (a > b) c = a * a; else c = b * b; /* Exemplo 3 */ if (a == b) c = 0; else if (a > b) c = a * a; else c = b * b;Atenção:Exemplo Açãoif (a == 3) b = 4; Testa se o valor de a é 3. Se for, atribui o valor 4 a bif (a = 3) b = 4; Atribui 3 à variável a. Testa o valor 3 (verdadeiro); portanto, independente do valor inicial de a será atribuído 4 a bProf. Erico Lisboa 9 http://www.ericolisboa.eng.br
14. 14. 3 - Controle de fluxo Linguagem C3.2 while3.2.1 Sintaxe while (expr) comando Enquanto expr for verdadeira (diferente de 0), comando é executado. Quando o programa chega na linha que contém o teste do comando while, ele verifica se a expressão de teste é verdadeira. Se for, o programa executa o comando uma vez e torna a testar a expressão, até que a expressão seja falsa. Somente quando isso ocorrer, o controle do programa passa para a linha seguinte ao laço. Se, na primeira vez que o programa testar a expressão, ela for falsa, o controle do programa passa para a linha seguinte ao laço, sem executar o comando nenhuma vez. O corpo de um laço while pode ter um único comando terminado por ponto-e-vírgula, vários comandos entre chaves ou ainda nenhuma instrução, mantendo o ponto-e- vírgula.3.2.2 Exemplo int i; i = 0; while (i < 6) { printf("%dn", i); i++; }3.3 do-while3.3.1 Sintaxe do comando while (expr) comando é executado enquanto expr for verdadeira (diferente de 0). O laço do-while é bastante parecido com o laço while. A diferença é que no laço do- while o teste da condição é executado somente depois do laço ser processado. Isso garante que o laço será executado pelo menos uma vez.3.3.2 Exemplo int i; i = 0; do { printf("%dn", i); i++; } while (i < 6)Prof. Erico Lisboa 10 http://www.ericolisboa.eng.br
15. 15. 3 - Controle de fluxo Linguagem C3.4 for3.4.1 Sintaxe for (inicializacao, condicao, incremento) comando O laço for é equivalente ao seguinte laço while: inicializacao while (condicao) { comando incremento }3.4.2 Exemplos int i; for (i = 0; i < 6; i++) { printf("%dn", i); } Qualquer uma das expressões do laço for pode conter várias instruções separadas por vírgulas. int i, j; for (i = 0, j = 0; i + j < 100; i++, j+=2) { printf("%dn", i + j); } Qualquer uma das três partes de um laço for pode ser omitida, embora os ponto-e-vírgulasdevam permanecer. Se a expressão de teste for omitida, é considerada verdadeira. int i = 0; for (; i < 100;) { printf("%dn", i++); }3.5 breakO comando break pode ser utilizado no corpo de qualquer estrutura de laço C (while, do-while e for).Causa a imediata saída do laço e o controle passa para o próximo estágio do programa.3.5.1 Exemplo int i = 0; while(1) { printf("%dn", i++); if (i >= 6) break; }Prof. Erico Lisboa 11 http://www.ericolisboa.eng.br
16. 16. 3 - Controle de fluxo Linguagem C3.6 switch3.6.1 Sintaxe switch(expr) { case constante1: comando1; /*opcional*/ case constante2: comando2; /*opcional*/ case constante3: comando3; /*opcional*/ default: /*opcional*/ comando4; /*opcional*/ } O comando switch verifica o valor de expr e compara seu valor com os rótulos dos casos. exprdeve ser inteiro ou caractere. Cada caso deve ser rotulado por uma constante do tipo inteiro ou caractere. Esta constante deveser terminada por dois pontos (:) e não por ponto-e-vírgula. Pode haver uma ou mais instruções seguindo cada case. Estas instruções não necessitam estarentre chaves. O corpo de um switch deve estar entre chaves. Se um caso for igual ao valor da expressão, a execução começa nele. Se nenhum caso for satisfeito, o controle do programa sai do bloco switch, a menos que existaum caso default. Se existir, a execução começa nele. Os rótulos dos casos devem ser todos diferentes. O comando break causa uma saída imediata do programa. Se não houver um break seguindoas instruções do caso, o programa segue executando todas as instruções dos casos abaixo, até encontrarum break ou o fim do corpo do switch.3.6.2 Exemplo int mes; ... switch(mes) { case 1: printf("Janeiron"); break; case 2: printf("Fevereiron"); break; case 3: printf("Marcon"); break; case 4: printf("Abriln"); break;Prof. Erico Lisboa 12 http://www.ericolisboa.eng.br
17. 17. 3 - Controle de fluxo Linguagem C case 5: printf("Maion"); break; case 6: printf("Junhon"); break; case 7: printf("Julhon"); break; case 8: printf("Agoston"); break; case 9: printf("Setembron"); break; case 10: printf("Outubron"); break; case 11: printf("Novembron"); break; case 12: printf("Dezembron"); break; default: printf("O numero nao equivale a nenhum mesn"); break; }Prof. Erico Lisboa 13 http://www.ericolisboa.eng.br
22. 22. 4 - Funções Linguagem C4.5.1 Classe de Armazenamento - autoAs variáveis declaradas até agora nos exemplos são acessíveis somente na função a qual ela pertence.Estas variáveis são automáticas caso não seja definida sua classe de armazenamento. Ou seja, o código main() { auto int n; . . . }é equivalente a main() { int n; . . . }4.5.2 Classe de Armazenamento - externTodas as variáveis declaradas fora de qualquer função são externas. Variáveis com este atributo serãoconhecidas por todas as funções declaradas depois delas. /* Testa o uso de variaveis externas */ int i; void incrementa(void) { i++; } main() { printf("%dn", i); incrementa(); printf("%dn", i); }4.5.3 Classe de Armazenamento - staticVariáveis estáticas possuem dois comportamentos bem distintos: variáveis estáticas locais e estáticasexternas.Quando uma variável estática é declarada dentro de uma função, ela é local àquela função. Umavariável estática mantém seu valor ao término da função. O exemplo a seguir apresenta uma funçãocontendo uma variável estática. void soma(void) { static int i = 0; printf("i = %dn", i++); } main() { soma(); soma(); soma(); }Prof. Erico Lisboa 18 http://www.ericolisboa.eng.br
30. 30. 5 - Vetores e Matrizes Linguagem C char Nome[5] = "Pedro";é inválida, por não ter sido reservado espaço suficiente para as 6 variáveis (P, e, d, r, o e 0).Para manipulação de strings, são fornecidas diversas funções na biblioteca C (arquivo string.h).Algumas dessas funções são descritas a seguir. A sintaxe apresentada para cada função não éexatamente a sintaxe fornecida pela biblioteca, mas representa basicamente o que a função executa e jáfoi explicado até o presente momento.5.2.1 A função strlen()A função strlen() retorna o número de caracteres da string, sem contar o caractere nulo.Sintaxe: int strlen(char[] s);Exemplo: main() { char Nome[6] = "Navio"; printf("%dn%dn", strlen("Barco a vela"), strlen(Nome)); } SAÍDA 12 5Note que os espaços fazem parte da string, e são simplesmente caracteres, assim como letras ealgarismos.5.2.2 A função strcmp()A função strcmp() compara duas strings. Retorna - um valor menor que zero se a primeira string for menor que a segunda; - zero se as strings forem iguais; - um valor maior que zero se a primeira string for maior que a segunda.Entende-se pôr comparação entre strings, sua posição em ordem alfabética. A ordem alfabética ébaseada na tabela ASCII (Anexo A). Portanto, cuidado ao comparar maiúsculas com minúsculas, poisna tabela ASCII as letras maiúsculas possuem um valor menor que as letras minúsculas, ou seja, ocaractere Z vem antes do caractere a.Sintaxe: int strcmp(char[] s1, char[] s2);Exemplo: main() { printf("%dn", strcmp("Ariranha", "Zebra")); printf("%dn", strcmp("Zebra", "Ariranha")); printf("%dn", strcmp("Zebra", "Zebra")); }Prof. Erico Lisboa 26 http://www.ericolisboa.eng.br
31. 31. 5 - Vetores e Matrizes Linguagem C SAÍDA (Algum valor menor que 0) (Algum valor maior que 0) 0Espaços e outros caracteres especiais também são considerados na comparação, algumas vezes nãofornecendo o que se espera de uma ordenação alfabética.5.2.3 A função strcpy()A função strcpy() copia o conteúdo de uma string para outra. A string de destino já tem que ter espaçoreservado na memória antes de ser chamada a função.Sintaxe: void strcpy(char[] destino, char[] origem);Exemplo: main() { char Nome[10]; strcpy(Nome, "Teste") printf("%sn", Nome); } SAÍDA Teste5.2.4 A função strcat()A função strcat() concatena duas strings, ou seja, anexa o conteúdo de uma na outra. Similarmente àfunção strcpy(), a string de destino tem que ter espaço reservado na memória.Sintaxe: void strcat(char[] destino, char[] origem);Exemplo: main() { char Nome[12]; strcpy(Nome, "Teste") strcpy(Nome, "geral") printf("%sn", Nome); } SAÍDA Testegeral5.3 MatrizesA linguagem C permite vetores de qualquer tipo, inclusive vetores de vetores. Por exemplo, umamatriz é um vetor em que seus elementos são vetores. Com dois pares de colchetes, obtemos umaProf. Erico Lisboa 27 http://www.ericolisboa.eng.br