Você está na página 1de 105

CURSO DE PS-GRADUAO LATO SENSU (ESPECIALIZAO) A DISTNCIA ADMINISTRAO EM REDES LINUX

INTRODUO LINGUAGEM C

Joo Carlos Giacomin

UFLA - Universidade Federal de Lavras FAEPE - Fundao de Apoio ao Ensino, Pesquisa e Extenso Lavras MG

PARCERIA UFLA Universidade Federal de Lavras FAEPE Fundao de Apoio ao Ensino, Pesquisa e Extenso REITOR Fabiano Ribeiro do Vale VICE-REITOR Antnio Nazareno Guimares Mendes DIRETOR DA EDITORA Marco Antnio Rezende Alvarenga PR-REITOR DE PS-GRADUAO Luiz Edson Mota de Oliveira COORDENADOR DE PS-GRADUAO LATO SENSU Antnio Ricardo Evangelista COORDENADOR DO CURSO Joaquim Quinteiro Ucha PRESIDENTE DO CONSELHO DELIBERATIVO DA FAEPE Antnio Eduardo Furtini Neto EDITORAO Grupo Ginux (http://ginux.comp.ufla.br/) IMPRESSO Grca Universitria/UFLA Ficha Catalogrca preparada pela Diviso de Processos Tcnicos da Biblioteca Central da UFLA Lacerda, Wilian Soares Arquitetura de Computadores / Wilian Soares Lacerda. - Lavras: UFLA/FAEPE, 2002. 190 p. : il. - Curso de Ps-Graduao Lato Sensu (Especializao) a Distncia: Administrao em Redes Linux Bibliograa. 1. Processamento de Dados. 2. Computador Digital. 3. Arquitetura de Computadores. 4. Organizao de Computadores. 5. Unidade Central de Processamento (UCP/CPU). I Universidade Federal de Lavras. II. Fundao de Apoio ao Ensino, Pesquisa e Extenso. III. Ttulo. CDD 004.22 Nenhuma parte desta publicao pode ser reproduzida, por qualquer meio, sem a prvia autorizao.

SUMRIO

1 Introduo 1.1 Linguagens de Mquina, Linguagens de Montagem, e Linguagens de Alto-Nvel 1.2 A Histria do C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 A Biblioteca padro C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Caractersticas de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 C e C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 O compilador GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Estrutura de um programa em C 2.1 Viso geral de um programa C . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Um programa utilizando uma funo . . . . . . . . . . . . . . . . . . . . . . . 3 Sintaxe 3.1 Identicadores . . . . . . . . . . . . . . 3.2 Tipos de variveis . . . . . . . . . . . . 3.2.1 Tipos Bsicos . . . . . . . . . . . 3.3 Declarao e Inicializao de Variveis 3.4 Operadores . . . . . . . . . . . . . . . . 3.4.1 Operador de atribuio . . . . . 3.4.2 Operadores Aritmticos . . . . . 3.4.3 Operadores relacionais e lgicos 3.4.4 Precedncia . . . . . . . . . . . 3.4.5 Operador cast (modelador) . . . 3.4.6 Operador sizeof . . . . . . . . . 4 Funes Bsicas da Biblioteca C 4.1 Funo printf( ) . . . . . . . . . 4.2 Funo scanf( ) . . . . . . . . . 4.3 Funo getchar() . . . . . . . . 4.4 Funo putchar() . . . . . . . . 5 Estruturas de Controle de Fluxo 5.1 If . . . . . . . . . . . . . . . . 5.2 if-else-if . . . . . . . . . . . . 5.3 Operador ternrio . . . . . . 5.4 Switch . . . . . . . . . . . . . 5.5 Loop for . . . . . . . . . . . . 5.6 While . . . . . . . . . . . . . 5.7 Do-while . . . . . . . . . . . . 5.8 Break . . . . . . . . . . . . . 5.9 Continue . . . . . . . . . . .

11 11 13 13 14 15 15 17 18 19 21 21 22 23 23 26 26 26 27 29 29 30 33 33 35 36 36 39 39 40 41 42 42 47 48 49 49

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

6 Matrizes 6.1 Matriz unidimensional . 6.2 Matriz Multidimensional 6.3 Matrizes estticas . . . 6.4 Limites das Matrizes . . 7 Manipulao de Strings 7.1 Funo gets() . . . . 7.2 Funo puts() . . . . 7.3 Funo strcpy() . . . 7.4 Funo strcat() . . . 7.5 Funo strcmp() . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

53 53 54 54 54 57 57 58 58 59 59 61 61 62 63 64 65 67 68 69 70 71 71 72 72 73 73 74 75 76 76 78 78 80 81 83 83 83 85

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

8 Ponteiros 8.1 Declarando Ponteiros . . . 8.2 Manipulao de Ponteiros . 8.3 Expresses com Ponteiros 8.4 Ponteiros para ponteiros . . 8.5 Problemas com ponteiros .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

9 Ponteiros e Matrizes 9.1 Manipulando Matrizes atravs de Ponteiros . . . . . . . . . . . . . . . . . . . 9.2 String e Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Matrizes de Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Funes 10.1 Funo sem Retorno . . . . . . . . . . 10.2 Funo com Retorno . . . . . . . . . . 10.3 Parmetros Formais . . . . . . . . . . 10.3.1 Chamada por Valor . . . . . . 10.3.2 Chamada por Referncia . . . 10.4 Classe de Variveis . . . . . . . . . . 10.4.1 Variveis locais . . . . . . . . . 10.4.2 Variveis Globais . . . . . . . . 10.4.3 Variveis Estticas . . . . . . . 10.5 Funes com Matrizes . . . . . . . . . 10.5.1 Passando Parmetros Formais 10.5.2 Alterando os Valores da Matriz 11 Argumentos da Linha de Comando 12 Estruturas, Unies e Enumeraes 12.1 Estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Unies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 Enumeraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

13 Noes de Manipulao de Arquivos 13.1 Abrindo e Fechando um Arquivo . . . . . . . 13.1.1 A funo fopen . . . . . . . . . . . . . 13.1.2 A funo exit . . . . . . . . . . . . . . 13.1.3 A funo fclose . . . . . . . . . . . . . 13.2 Lendo e Escrevendo Caracteres em Arquivos 13.2.1 putc . . . . . . . . . . . . . . . . . . . 13.2.2 getc . . . . . . . . . . . . . . . . . . . 13.2.3 feof . . . . . . . . . . . . . . . . . . . 14 Noes de Alocao Dinmica 15 Exerccios 15.1 Captulo 1 . . . 15.2 Captulo 2 . . . 15.3 Captulo 3 . . . 15.4 Captulo 4 . . . 15.5 Captulo 5 . . . 15.6 Captulo 6 . . . 15.7 Captulo 7 . . . 15.8 Captulos 8 e 9 15.9 Captulo 10 . . 15.10 Captulo 11 . . 15.11 Captulo 12 . . 15.12 Captulo 13 . . 15.13 Captulo 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

89 89 89 90 91 92 92 93 93 95

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

97 97 97 98 98 98 101 101 102 103 104 104 104 104 105

Referncias Bibliogrcas

LISTA DE FIGURAS

1.1 Trecho de programa em linguagem de mquina . . . . . . . . . . . . . . . . . 1.2 Trecho de programa em linguagem de montagem . . . . . . . . . . . . . . . . 1.3 Trecho de programa em linguagem de alto nvel . . . . . . . . . . . . . . . . 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 Estrutura de um programa em C . . Um programa simples em C . . . . . Ambiente de programao do C . . Um programa que utiliza uma funo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11 12 12 17 18 19 20 22 25 25 28 28 29 29 30 34 34 34 34 35 35 36 36 37 39 40 41 42 43 44 44 45 46 46 46 47 48 48

Programa com instrues bsicas . . . . . . . . . . . . Inicializao de variveis . . . . . . . . . . . . . . . . . Programa com diferentes tipos de variveis. . . . . . . . Programa com operadores aritmticos . . . . . . . . . . Programa para converso de ps para metros . . . . . Programa com operadores relacionais e lgicos . . . . Programa Maior_de_dois . . . . . . . . . . . . . . . . . Programa com exemplo de utilizao de operador cast

Exemplo de utilizao da funo printf . . . . . . . . . . . Tamanho de campos na impresso . . . . . . . . . . . . . . . Arredondamento de nmeros em ponto utuante . . . . . . . Alinhamento de campos numricos . . . . . . . . . . . . . . . Complementando com zeros esquerda . . . . . . . . . . . Formas para imprimir caracteres utilizando a funo printf Exemplo de programa que utiliza a funo scanf . . . . . . . Exemplo de programa que utiliza a funo getchar . . . . . Exemplo de programa que utiliza a funo putchar . . . . .

Exemplo de programa que utiliza o comando de deciso if . . . . . . . . . . . O comando de deciso if com um bloco de instrues . . . . . . . . . . . . . Exemplo de um programa que utiliza o comando if-else-if . . . . . . . . . . . Exemplo de programa que utiliza o operador ternrio . . . . . . . . . . . . . . Exemplo de programa que utiliza o comando switch . . . . . . . . . . . . . . Exemplo de for com apenas um comando . . . . . . . . . . . . . . . . . . . . Exemplo de for com um bloco de instrues . . . . . . . . . . . . . . . . . . . Programa para calcular o valor de . . . . . . . . . . . . . . . . . . . . . . . Lao de for com duas variveis de controle . . . . . . . . . . . . . . . . . . . Loop innito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Laos de for aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programa que exibe uma tabela das quatro primeiras potncias dos nmeros de 1 a 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.13 Exemplo simples de while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.14 Gerao de uma tabela de quadrados de inteiros utilizando while . . . . . . .

5.15 5.16 5.17 5.18 6.1 6.2 6.3 6.4 6.5 6.6 7.1 7.2 7.3 7.4 7.5 7.6

Gerao de uma tabela de quadrados de inteiros utilizando do-while Exemplo de utilizao do lao do-while . . . . . . . . . . . . . . . . . Exemplo simples de utilizao do comando break . . . . . . . . . . Exemplo de utilizao do comando continue . . . . . . . . . . . . . . Exemplo simples de utilizao de matriz . . . . . . . . . . . . . . Exemplo de armazenamento de dados em matriz unidimensional Operaes com matriz . . . . . . . . . . . . . . . . . . . . . . . . Exemplo simples de utilizao de matriz multidimensional . . . . Exemplo de utilizao de matriz esttica . . . . . . . . . . . . . . Erro na utilizao de matriz . . . . . . . . . . . . . . . . . . . . . Exemplo simples de operao com strings . . . . Programa simples que utiliza a funo gets . . . Exemplo simples de utilizao da funo puts . . Utilizao da funo strcpy da biblioteca string.h Utilizao da funo strcat da biblioteca string.h Utilizao da funo strcmp da biblioteca string.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

49 50 50 51 54 55 55 56 56 56 57 58 58 59 59 60 63 64 65 68 69 69 70 72 73 74 74 75 75 76 77 77 78 79 79 80 81 82 84 85

8.1 Utilizao de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Operaes com Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Ponteiros para ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1 9.2 9.3 9.4 Cpia de uma string (verso matriz) . . . . . . . . . . . . . . Cpia de uma string (verso ponteiro) . . . . . . . . . . . . . Uso de um ponteiro no lugar de uma string . . . . . . . . . . Utilizao de matrizes de ponteiros para mensagens de erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.1 Inverso de uma string usando uma funo que recebe um ponteiro 10.2 Um codicador simples . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Funo com retorno de inteiro . . . . . . . . . . . . . . . . . . . . . 10.4 Parmetros formais de uma funo . . . . . . . . . . . . . . . . . . . 10.5 Passagem de valor de uma varivel para uma funo . . . . . . . . 10.6 Funo que utiliza passagem por referncia . . . . . . . . . . . . . . 10.7 Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . . 10.8 Variveis globais em um programa . . . . . . . . . . . . . . . . . . . 10.9 Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . . 10.10 Funo que utiliza uma matriz . . . . . . . . . . . . . . . . . . . . . 10.11 Funo que opera sobre uma matriz utilizando um ponteiro . . . . . 10.12 Funo que procura uma substring dentro de uma string . . . . . . . 10.13 Alterando valores de uma matriz . . . . . . . . . . . . . . . . . . . .

11.1 Programa que recebe uma string na linha de comando . . . . . . . . . . . . . 11.2 Programa que recebe argumentos na linha de comando . . . . . . . . . . . . 12.1 Exemplo simples de utilizao de estrutura de dados . . . . . . . . . . . . . . 12.2 Unio de variveis de mesmo tipo . . . . . . . . . . . . . . . . . . . . . . . .

12.3 Unio de variveis de tipos diferentes . . . . . . . . . . . . . . . . . . . . . . 12.4 Programa que utiliza a union nmero . . . . . . . . . . . . . . . . . . . . . . . 12.5 Exemplo de utilizao de enumeraes . . . . . . . . . . . . . . . . . . . . . 13.1 Escrevendo e lendo em arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Uso da funo exit na abertura de arquivos . . . . . . . . . . . . . . . . . . . 14.1 Primeiro exemplo de alocao dinmica de memria . . . . . . . . . . . . . . 14.2 Segundo exemplo de alocao dinmica de memria . . . . . . . . . . . . . 15.1 15.2 15.3 15.4 15.5 15.6 15.7 Captulo 2: Programa para o exerccio 1 . Captulo 3: programa para o exerccio 1 . Captulo 4: Programa para o exerccio 1 . Captulo 5: Programa para o exerccio 1 . Captulo 5: Algoritmo para o exerccio 3 . Captulo 7: programa para o exerccio 1 . Captulo 10: Programa para o exerccio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85 86 87 90 92 95 96 97 98 99 100 101 102 103

LISTA DE TABELAS

3.1 3.2 3.3 3.4 3.5 3.6

Palavras reservadas do C . . . . . . . Tipos de dados do C . . . . . . . . . . Operadores aritmticos . . . . . . . . Comandos de atribuio reduzidos . . Operadores relacionais e lgicos . . . Nvel de precedncia dos operadores

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

22 24 26 27 28 30 33 91

4.1 Caracteres de controle da funo printf . . . . . . . . . . . . . . . . . . . . . 13.1 Modos vlidos de abertura de arquivos . . . . . . . . . . . . . . . . . . . . .

1
INTRODUO
1.1 LINGUAGENS DE MQUINA, LINGUAGENS DE MONTAGEM, E LINGUAGENS DE ALTO-NVEL

Programadores escrevem instrues em vrias linguagens de programao, algumas diretamente inteligveis pelo computador e outras que requerem passos intermedirios de traduo. Centenas de linguagens de computador so usadas atualmente. Estas podem ser divididas em trs grandes grupos: 1. Linguagens de mquina, 2. Linguagens de montagem, 3. Linguagens de alto nvel. Qualquer computador pode entender diretamente apenas sua prpria linguagem de mquina. A linguagem de mquina a linguagem natural de um computador em particular. Ela relacionada diretamente ao projeto do hardware daquele computador. Linguagens de mquina geralmente consistem de cadeias de nmeros (que se reduzem a 1s e 0s) que instruem o computador a realizar suas operaes mais elementares, uma de cada vez. Linguagens de mquina so dependentes da mquina (machine-dependent), isto , uma linguagem de mquina particular pode ser usada apenas em um tipo de computador. Linguagens de mquina so desajeitadas para humanos, como poder ser visto a seguir no trecho de um programa, na Figura 1.1, que soma pagamento de hora-extra ao pagamento bsico e armazena o resultado no pagamento total.
+1300042774 +1400593419 +1200274027 Figura 1.1: Trecho de programa em linguagem de mquina

12

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Quando os computadores se tornaram mais populares, tornou-se claro que a programao em linguagens de mquina era muito lenta e tediosa para a maioria dos programadores. Em vez de usar as cadeias de nmeros que computadores podiam entender diretamente, os programadores comearam a usar abreviaes derivadas da lngua inglesa para representar as operaes elementares do computador. Estas abreviaes do Ingls formaram a base das linguagens de montagem (assembly languages). Tradutores de programas, chamados assemblers, foram desenvolvidos para converter programas em linguagem de montagem (assembly ) para linguagem de mquina na velocidade dos computadores. A Figura 1.2 mostra um trecho de um programa em linguagem de montagem que tambm soma o pagamento de hora-extra ao pagamento bsico e armazena o resultado no pagamento total, mas mais claramente que seu equivalente em linguagem de mquina:

LOAD ADD STORE

BASEPAY OVERPAY GROSSPAY Figura 1.2: Trecho de programa em linguagem de montagem

A utilizao do computador cresceu rapidamente com o advento das linguagens de montagem, mas estas ainda requeriam muitas instrues para realizar mesmo as tarefas mais simples. Para acelerar o processo de programao, linguagens de alto nvel foram desenvolvidas nas quais declaraes simples poderiam ser escritas para realizar tarefas substanciais. Os programas tradutores que convertem programas de linguagens de alto nvel em programas de linguagem de mquina so chamados compiladores. Linguagens de alto nvel permitem aos programadores escreverem instrues que se parecem proximamente com o Ingls dirio e contm notaes matemticas comumente usadas. Um programa de folha de pagamento escrito em linguagem de alto nvel poderia conter uma declarao tal como mostrada na Figura 1.3

grossPay = basePay + overTimePay Figura 1.3: Trecho de programa em linguagem de alto nvel

Obviamente, linguagens de alto nvel so muito mais desejveis do ponto de vista dos programadores que linguagens de mquina ou linguagens de montagem. C e C++ esto entre as mais poderosas e mais largamente usadas linguagens de alto nvel.

Introduo

13

1.2

A HISTRIA DO C

C evoluiu das linguagens anteriores, BCPL e B. BCPL foi desenvolvida em 1967 por Martin Richards como a linguagem para escrever softwares de sistemas operacionais e compiladores. Ken Thompsom modelou muitas caractersticas de sua linguagem B, baseando-se BCPL desenvolvida por outros anteriormente, e usou B para criar as primeiras verses do sistema operacional UNIX no Bell Laboratories em 1970 em um computador DEC PDP-7. Tanto BCPL quanto B eram linguagens no tipadas todos os itens de dados ocupavam uma palavra na memria e o fardo de tratar um dado como um nmero inteiro ou um nmero real, por exemplo, cava a cargo do programador. A linguagem C foi uma evoluo da B feita por Dennis Ritchie no Bell Laboratories e foi originalmente implementada em um computador DEC PDP-11 em 1972. C inicialmente tornou-se largamente conhecida como a linguagem de desenvolvimento do sistema operacional UNIX. Atualmente, a maioria dos novos sistemas operacionais maiores so escritos em C e/ou C++. C est disponvel para a maioria dos computadores atuais. C independente de Hardware. Com um projeto cuidadoso, possvel escrever programas em C que so portveis para a maioria dos computadores. C usa muitos dos importantes conceitos do BCPL e do B enquanto soma a tipagem de dados e outras caractersticas poderosas. No nal da dcada de 70, C havia evoludo para o que agora conhecido como o tradicional C. A publicao, em 1978, do livro de Kernighan e Ritchie, The C Programming Language, trouxe uma grande ateno linguagem. Esta publicao tornou-se um dos livros de cincia da computao de maior sucesso de todos os tempos. A rpida expanso do C sobre vrios tipos de computadores (algumas vezes chamados plataformas de Hardware) conduziu a muitas variaes. Estas eram similares mas sempre incompatveis. Isto era um problema srio para desenvolvedores de programas que precisavam desenvolver cdigo que rodasse sobre vrias plataformas. Tornou-se claro que uma verso padro de C era necessria. Em 1983, o comit tcnico X3J11 foi criado sob a American National Standards Committee on Computers and Information Processing (X3), para fornecer uma denio de linguagem no ambgua e independente de mquina. Em 1989, o padro foi aprovado. O documento conhecido como ANSI/ISO 9899: 1990. Cpias deste documento podem ser requisitadas ao Americam National Institute. A Segunda edio de Kernighan e Ritchie, publicada em 1988, reete esta verso chamada ANSI C, agora usada em todo o mundo.

1.3

A BIBLIOTECA PADRO C

Programas em C consistem de mdulos ou pedaos, chamados funes. Voc pode programar todas as funes que voc precisa para formar um programa em C, mas a maio-

14

EDITORA - UFLA-FAEPE - Introduo Linguagem C

ria dos programadores em C aproveitam uma rica coleo de funes existentes, chamada C Standard Library. Portanto, h realmente duas etapas para aprender o mundo C. A primeira aprender a prpria linguagem C, e a segunda aprender como usar as funes da biblioteca padro C. Neste curso, voc ser levado a usar a abordagem de construo de blocos (Building block approach) para criar programas. Evite reinventar a roda. Use pedaos existentes isto chamado reutilizao de software e a chave para o campo de desenvolvimento de programas orientados ao objeto como veremos. Quando programando em C voc usar tipicamente os seguintes blocos de construo: Funes da biblioteca padro C, Funes que voc mesmo criou, Funes que outras pessoas criaram e disponibilizaram para voc. A vantagem de criar suas prprias funes que voc vai saber exatamente como elas funcionam. Voc poder examinar o cdigo C. A desvantagem o tempo consumido em esforo que leva do projeto ao desenvolvimento de novas funes. Usar funes existentes evita reinventar a roda. No caso de funes padro ANSI, voc sabe que elas so cuidadosamente escritas, e voc sabe que por estar usando funes que so disponveis em virtualmente todas as implementaes ANSI C, seu programa ter uma chance muito maior de ser portvel.

1.4

CARACTERSTICAS DE C

C uma linguagem altamente portvel e bastante eciente em termos de desempenho. uma linguagem de propsito geral, sendo utilizada para desenvolver os mais diversos tipos de software. Entre as principais caractersticas da linguagem C, podem ser citadas: portabilidade modularidade recursos de baixo nvel gerao de cdigo eciente simplicidade facilidade de uso possibilidade de ser usada para os mais variados propsitos indicada para escrever compiladores, editores de textos, bancos de dados, etc.

Introduo

15

Como resultado, tem-se que C e C++ podem ser consideradas padres de indstria pelas empresas de desenvolvimento de software. Vrias dessas empresas adotam estas linguagens na maioria de seus projetos. Para o programador, o conhecimento da linguagem C de grande valor.

1.5

C E C++

Algumas vezes os iniciantes confundem o que C++ e como difere de C. C++ uma verso estendida e melhorada de C que foi projetada para suportar programao orientada a objetos (OOP). C++ contm e suporta toda a linguagem C e mais um conjunto de extenses orientadas a objetos. Por muitos anos ainda os programadores escrevero, mantero e utilizaro programas escritos em C, sem se preocuparem em utilizar os benefcios da orientao a objetos proporcionados por C++, por isso o cdigo escrito em C estar em uso por muitos anos ainda.

1.6

O COMPILADOR GCC

Todos os programas utilizados como exemplo neste curso utilizam apenas funes da linguagem C padro ANSI (ANSI C), portanto recomendamos a utilizao de um compilador de C que funcione bem para programas que seguem este padro. O compilador GCC o compilador de C do projeto GNU (http//:www.gnu.org), gratuito e de cdigo aberto. O projeto GNU (Gnus Not Unix) foi proposto por Richard Stallman em 1983. Richard Stallman pesquisador do MIT e inventor do editor EMACS. O projeto teve incio em 1984, e a proposta era desenvolver um sistema operacional completo e livre, similar ao Unix: o sistema GNU (GNU um acrnimo recursivo que se pronuncia guh-NEW ou guniw). Variaes do sistema GNU, que utilizam o ncleo Linux, so hoje largamente utilizadas; apesar desses sistemas serem normalmente chamados de Linux, eles so mais precisamente chamados Sistemas GNU/Linux. O desenvolvimento do GCC uma parte do Projeto GNU, com o objetivo de melhorar o compilador usado no sistema GNU incluindo a variante GNU/Linux. O trabalho de desenvolvimento do GCC usa um ambiente aberto de desenvolvimento e suporta muitas outras plataformas com o propsito de promover um compilador de primeira linha (world-class) que seja otimizado continuamente, de reunir um grande time de desenvolvedores, de assegurar que o GCC e o sistema GNU trabalhem em mltiplas arquiteturas e diversos ambientes, e de atender a muitos outros testes e mais caractersticas de GCC.

16

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Em Abril de 1999, o egcs steering committee foi indicado pelo FSF como o mantenedor ocial GNU para GCC. Naquele tempo GCC foi renomeado para GNU C Compiler e para GNU Compiler Collection e recebeu uma nova misso. Atualmente GCC contm aplicaes para C, C++, Objective C, Chill, Fortran, e Java bem como bibliotecas para estas linguagens (libstdc++, libgcj,...). Uma verso do compilador GCC pode ser obtida no ftp do curso de Cincia da Computao da UFLA1 . Obtenha uma cpia do compilador e instale em seu computador. De posse do GCC instalado e congurado (independente de sua portagem ou ambiente), para compilar um programa denominado nome.c, execute a seguinte linha de comando: gcc nome.c -o nome.exe onde nome o nome dado ao programa. Com isso, o arquivo nome.c ser compilado gerado um executvel nome.exe (em ambientes Linux, a extenso .exe desnecessria).

ftp://ftp.comp.ufla.br/pub/

2
ESTRUTURA DE UM PROGRAMA EM C
Um programa em C estruturado sobre funes. O programa possui uma ou vrias funes, sendo que a principal, que d incio ao programa e chama todas as outras, sempre chamada main. Alm dessas, existem outras pr-programadas, que so includas nos programas como arquivos de cabealho, ou arquivos de incluso. Todas as funes comeam com { e terminam com } , como indicado na Figura 2.1.

/* Estrutura de um programa em C # include <arquivo_cabecalho.h> int main ( ) { declarao de variveis instruo_1; instruo_2; funo_1(variveis); instruo_3; } int funo_1 (variveis) { declarao de variveis instruo_1; instruo_2; return (INT); }

*/

Figura 2.1: Estrutura de um programa em C

18

EDITORA - UFLA-FAEPE - Introduo Linguagem C

A primeira linha compreende apenas comentrios. Todos os comentrios iniciam com /* e terminam com */. A segunda linha indica a incluso de um arquivo de cabealho. A terceira linha, inicia a funo main. Aps a funo main, foi programada outra funo chamada funo_1. Excetuando a main, todas as outras funes podem ter qualquer nome que o programador desejar. A declarao de funes segue sempre o padro: tipo nome (parmetros). Nesse caso, tipo refere-se ao tipo de valor que a funo pode retornar (inteiro, decimal, letra, etc), nome o nome dado funo, e parmetros so os valores passados pelo programa para a funo. Quando no for especicado, o tipo da funo ser int (inteiro). No obrigatrio o uso de parmetros, como pode ser visto no exemplo, na funo main. A Figura 2.2 apresenta um programa simples escrito em linguagem C.
/* programa exemplo 01 */ # include <stdio.h> main ( ) { printf("Alo, Mundo!"); } Figura 2.2: Um programa simples em C

Edite este programa com o nome exemp_01.c e compile-o utilizando o compilador GCC, ou outro de sua preferncia. Escreva na linha de comando do computador: gcc exemp_01.c -o exemp_01 Isto indica ao computador para utilizar o compilador GCC para compilar o programa exemp_01.c escrito em C e dar ao arquivo executvel gerado o nome de exemp_01. Ao nal, rode o programa. A funo printf j est programada dentro de stdio.h, e utilizada para escrever mensagens na tela do computador. As funes pr-programadas devem ser escritas em letras minsculas. Modique este programa para escrever outra mensagem alm de Alo, Mundo!.

2.1

VISO GERAL DE UM PROGRAMA C

A gerao do programa executvel a partir do programa fonte obedece a uma seqncia de operaes antes de tornar-se um executvel, conforme descrito na Figura 2.3. Depois de escrever o mdulo fonte em um editor de textos, o programador aciona o compilador que

Estrutura de um programa em C

19

no nosso exemplo chamado pelo comando gcc. Essa ao desencadeia uma seqncia de etapas, cada qual traduzindo a codicao do usurio para uma forma de linguagem de nvel inferior, que termina com o executvel criado pelo lincador.

Edio
(mdulo fonte em C)

PrProcessamento
(novo fonte expandido)

Compilao
(arquivo objeto)

Lincagem
(executvel)

Execuo
Figura 2.3: Ambiente de programao do C

2.2

UM PROGRAMA UTILIZANDO UMA FUNO

Para que que entendida a estrutura de um programa em C, faamos um segundo exemplo (Figura 2.4), o qual utiliza uma funo que retorna um valor do tipo inteiro. A funo quadrado chamada pela main na sua quarta linha e retorna para a funo main o quadrado do nmero passado como argumento. Na funo main, o valor retornado atribudo a varivel quad. Ao nal, o nmero lido pela funo scanf e o seu quadrado so escritos na tela, utilizando-se a funo printf. A funo scanf tambm pertence a stdio.h e utilizada para ler valores enviados pelo teclado. Edite este programa com o nome exemp_02.c e compile-o utilizando o compilador GCC. Escreva na linha de comando do computador: gcc exemp_02.c -o exemp_02

20

EDITORA - UFLA-FAEPE - Introduo Linguagem C

/* programa exemplo 02 # include <stdio.h> int quadrado (int num) { return (num*num); }

*/

main ( ) { int num, quad; printf("Envie um numero inteiro: "); scanf("%d",&num); quad = quadrado(num); printf("\n Quadrado de %d : %d", num, quad); } Figura 2.4: Um programa que utiliza uma funo

Modique este programa para que ele calcule o cubo do nmero: crie uma funo cubo.

3
SINTAXE
Sintaxe so regras detalhadas para cada construo vlida na linguagem C. Estas regras esto relacionadas com os tipos, as declaraes, as funes e as expresses. Os tipos denem as propriedades dos dados manipulados em um programa. As declaraes expressam as partes do programa, podendo dar signicado a um identicador, alocar memria, denir contedo inicial, denir funes. As funes especicam as aes que um programa executa quando roda. A determinao e alterao de valores, e a chamada de funes de I/O so denidas nas expresses. As funes so as entidades operacionais bsicas dos programas em C, que por sua vez so a unio de uma ou mais funes executando cada qual o seu trabalho. H funes bsicas que esto denidas na biblioteca C. As funes printf( ) e scanf( ) por exemplo, permitem respectivamente escrever na tela e ler os dados a partir do teclado. O programador tambm pode denir novas funes em seus programas, como rotinas para clculos, impresso, etc. Todo programa C inicia sua execuo chamando a funo main( ), sendo obrigatria a sua declarao no programa principal. Comentrios no programa so colocados entre /* e */ no sendo considerados na compilao. Os comentrios podem tambm ser colocados em uma linha, aps o sinal //. Cada instruo encerra com ; (ponto e vrgula) que faz parte do comando. A Figura 3.1 mostra um exemplo de programa que utiliza estes conceitos bsicos.

3.1

IDENTIFICADORES

So nomes usados para se fazer referncia a variveis, funes, rtulos e vrios outros objetos denidos pelo usurio. O primeiro caracter deve ser uma letra ou um sublinhado. Os 32 primeiros caracteres de um identicador so signicativos. O C Case Sensitive, isto , os compiladores C entendem as letras maisculas e minsculas como sendo diferentes. Portando uma varivel declarada como X1 ser dife-

22

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> main( ) /* funo obrigatria */ { char Nome[20]; printf("\n Al! Qual o seu nome ? "); scanf("%s",Nome); printf("\n Bom dia, %s ! \n",Nome); } Figura 3.1: Programa com instrues bsicas

rente de uma varivel declarada com x1, uma varivel chamada Tempo ser diferente de TEMPO, tempo e TeMPo. Os comandos bsicos do C devem ser escritos sempre com minsculas (if, for, switch, etc.), caso contrrio, o compilador no ir interpret-los como sendo comandos, mas como variveis. O C possui outros comandos e palavras reservada que so todos escritos em letras minsculas. A Tabela 3.1 apresentada uma lista com as palavras reservadas do padro ANSI C.
Tabela 3.1: Palavras reservadas do C

auto break case char const continue default do

double else enum extern oat for goto if

int long register return short signed sizeof static

struct switch typedef union unsigned void volatile while

3.2

TIPOS DE VARIVEIS

Quando voc declara um identicador, d a ele um tipo. Os tipos principais podem ser colocados dentro da classe do tipo de objeto de dado. Um tipo de objeto de dados determina como valores de dados so representados, que valores pode expressar, e que tipo de operaes voc pode executar com estes valores. Os nomes dos identicadores As variveis, identicadores, no C podem ter qualquer nome se duas condies forem satisfeitas: o nome deve comear com uma letra ou sublinhado (_) e os caracteres subsequentes devem

Sintaxe

23

ser letras, nmeros ou sublinhado (_). H apenas mais duas restries: o nome de uma varivel no pode ser igual a uma palavra reservada, nem igual ao nome de uma funo declarada pelo programador, ou pelas bibliotecas do C. Variveis de at 32 caracteres so aceitas. 3.2.1 Tipos Bsicos

H cinco tipos bsicos de dados em C: caractere (char), inteiro (int), ponto utuante (oat), ponto utuante de preciso dupla (double) e vazio (void). Todos os outros tipos de dados em C so baseados nestes 5 tipos bsicos. O tamanho e a faixa de representao de cada um destes tipos de dados depende do processador utilizado e da implementao do compilador C. O padro ANSI determina apenas a faixa mnima de cada tipo, no o seu tamanho em bytes. Exceto void, os tipos bsicos de C podem ter vrios modicadores precedendo-os. Um modicador usado para alterar o signicado de um tipo bsico, modicando o seu tamanho ou sua forma de representao. Os modicadores so: signed, unsigned, long e short. Os tipos bsicos do C juntamente com suas formas modicadas so apresentados na Tabela 3.2. Uma implementao do compilador pode mostrar um faixa maior do que a mostrada na Tabela 3.2, mas no uma faixa menor. As potncias de 2 usadas signicam:

215 = 32.768 216 = 65536 231 = 2.147.483.648 232 = 4.294.967.298

3.3

DECLARAO E INICIALIZAO DE VARIVEIS

As variveis no C devem ser declaradas antes de serem usadas. A forma geral da declarao de variveis : tipo_da_varivel lista_de_variveis; As variveis da lista de variveis tero todas o mesmo tipo e devero ser separadas por vrgula. Como o tipo default do C o int, quando vamos declarar variveis int com algum dos modicadores de tipo, basta colocar o nome do modicador de tipo. Assim um long basta para declarar um long int. H trs lugares nos quais podemos declarar variveis. O primeiro fora de todas as funes do programa. Estas variveis so chamadas variveis globais e podem ser usadas

24

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Tabela 3.2: Tipos de dados do C

Inteiros
char signed char unsigned char short unsigned short int unsigned int long unsigned log [0, 128) [128, 128) [0, 256) (215 , 215 ) [0, 216 ) (215 , 215 ) [0, 216) (231 , 231 ) [0, 232 ) igual a signed char ou unsigned char inteiro de pelo menos 8 bits mesmo que signed char sem negativos inteiro de pelo menos 16 bits; tamanho pelo menos igual a char mesmo tamanho que short sem negativos inteiro de pelo menos 16 bits; tamanho pelo menos igual a short mesmo tamanho que int sem negativos inteiro com sinal de pelo menos 32 bits; tamanho pelo menos igual a int mesmo tamanho que long sem valores negativos

Ponto Flutuante
oat double long double [3.4E 38, 3.4E + 38] (1.7E 308, 1.7E +308) (1.7E 308, 1.7E +308) pelo menos 6 dgitos de preciso decimal pelo menos 10 dgitos decimais e preciso maior que do oat pelo menos 10 dgitos decimais e preciso maior que do double

a partir de qualquer lugar no programa. Pode-se dizer que, como elas esto fora de todas as funes, todas as funes as vem. O segundo lugar no qual se pode declarar variveis no incio de um bloco de cdigo de uma funo. Estas variveis so chamadas locais e s tm validade dentro do bloco no qual so declaradas, isto , s a funo qual ela pertence sabe da existncia desta varivel. O terceiro lugar onde se pode declarar variveis na lista de parmetros de uma funo. Mais uma vez, apesar de estas variveis receberem valores externos, so conhecidas apenas pela funo onde so declaradas. As regras que regem onde uma varivel vlida chamam-se regras de escopo da varivel. H mais dois detalhes que devem ser ressaltados. Duas variveis globais no podem ter o mesmo nome. O mesmo vale para duas variveis locais de uma mesma funo. J duas variveis locais, de funes diferentes, podem ter o mesmo nome sem perigo algum de conito.

Sintaxe

25

Podemos inicializar variveis no momento de sua declarao. Para fazer isto podemos usar a forma geral

tipo_da_varivel nome_da_varivel = constante; Isto importante pois quando o C cria uma varivel ele no a inicializa. Isto signica que at que um primeiro valor seja atribudo nova varivel ela tem um valor indenido e que no pode ser utilizado para nada. Nunca presuma que uma varivel declarada vale zero ou qualquer outro valor. Exemplos de inicializao podem ser vistos na Figura 3.2.

char ch=D; int count=0; float pi=3.1416; Figura 3.2: Inicializao de variveis

A Figura 3.3 apresenta um programa que identica o tamanho de variveis de diferentes tipos.
# include <stdio.h> main() { char c; unsigned char uc; int i; unsigned int ui; float f; double d; printf("char %d",sizeof(c)); printf("unsigned char %d",sizeof(uc)); printf("int %d",sizeof(i)); printf("unsigned int %d",sizeof(ui)); printf("float %d",sizeof(f)); printf("double %d",sizeof(d)); } Figura 3.3: Programa com diferentes tipos de variveis.

26

EDITORA - UFLA-FAEPE - Introduo Linguagem C

3.4 3.4.1

OPERADORES Operador de atribuio

O operador de atribuio em C o sinal de igual =. Ao contrrio de outras linguagens, o operador de atribuio pode ser utilizado em expresses que tambm envolvem outros operadores. O operador de atribuio = atribui varivel sua esquerda o valor calculado direita. O C permite que se faam atribuies encadeadas, como: x = y = z = 2.45; Nesta linha, o valor 2.45 ser atribudo a z, depois a y, depois a x. 3.4.2 Operadores Aritmticos

Os operadores aritmticos so usados para desenvolver operaes matemticas. A Tabela 3.3 apresenta a lista dos operadores aritmticos do C.
Tabela 3.3: Operadores aritmticos

Operador + * / % ++ --

Ao Soma (inteira e ponto utuante) Subtrao ou Troca de sinal (inteira e ponto utuante) Multiplicao (inteira e ponto utuante) Diviso (inteira e ponto utuante) Resto de diviso (de inteiros) Incremento (inteiro e ponto utuante) Decremento (inteiro e ponto utuante)

O C possui operadores unrios e binrios. Os unrios agem sobre uma varivel apenas, modicando ou no o seu valor, e retornam o valor nal da varivel. Os binrios usam duas variveis e retornam um terceiro valor, sem alterar as variveis originais. A soma um operador binrio pois pega duas variveis, soma seus valores, sem alterar as variveis, e retorna esta soma. Outros operadores binrios so os operadores - (subtrao), *, / e %. O operador - como troca de sinal um operador unrio que no altera a varivel sobre a qual aplicado, pois ele retorna o valor da varivel multiplicado por -1. Os operadores de incremento e decremento so unrios que alteram a varivel sobre a qual esto aplicados. O que eles fazem incrementar ou decrementar de um a varivel sobre a qual esto aplicados. Ento
x++; x--;

Sintaxe

27

so operaes equivalentes a
x = x+1; x = x-1;

Estes operadores podem ser pr-xados ou ps-xados. A diferena que quando so pr-xados eles incrementam e retornam o valor da varivel j incrementada. Quando so ps-xados eles retornam o valor da varivel sem o incremento e depois incrementam a varivel. Ento, em
x = 23; y = x++;

teremos, no nal, y = 23 e x = 24. Em


x = 23; y = ++x;

teremos, no nal, y = 24 e x = 24. Uma curiosidade: a linguagem de programao C++ tem este nome pois ela seria um incremento da linguagem C padro. Os operadores *, /, + e - funcionam como na maioria das linguagens, o operador % indica o resto de uma diviso inteira. Quando efetuados sobre um mesmo operando, podem ser utilizados em forma reduzida, como ilustra a Tabela 3.4.
Tabela 3.4: Comandos de atribuio reduzidos

i += 2; x *= y+1; d -= 3;

i = i+2; x = x*(y+1); d = d - 3;

A Figura 3.4 apresenta um programa simples que utiliza operadores aritmticos sobre nmeros inteiros, e a Figura 3.5 apresenta um programa para fazer a converso de medidas em ps para metros, utilizando operaes sobre nmeros em ponto utuante. A funo scanf( ) utilizada para ler um valor numrico do teclado do computador. 3.4.3 Operadores relacionais e lgicos

O termo relacional refere-se s relaes que os valores podem ter um com o outro e o termo lgico se refere s maneiras como essas relaes podem ser conectadas. Em C, entende-se como verdadeiro qualquer valor que no seja 0, enquanto que o valor 0 indica

28

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> main() { int x, y; x =10; y = 3; printf("%d\n", x/y); printf("%d\n", x%y); } Figura 3.4: Programa com operadores aritmticos #include <stdio.h> /* Converso de ps para metros. */ main() { float pes, metros; printf("Informe o nmero de ps: "); scanf("%f", &pes); /* l um float */ metros = pes * 0.3048; /* converso de ps para metros */ printf("%f pes %f metros\n", pes, metros); } Figura 3.5: Programa para converso de ps para metros

condio falsa. As expresses que usam operadores de relao e lgicos retornaro 0 para falso e 1 para verdadeiro. Tanto os operadores de relao como os lgicos tm a precedncia menor que os operadores aritmticos. As operaes de avaliao produzem um resultado 0 ou 1.
Tabela 3.5: Operadores relacionais e lgicos

relacionais > maior que >= maior ou igual < menor <= menor ou igual == igual != no igual

lgicos && and (E) || or (OU) ! not (NO)

Sintaxe

29

As Figuras 3.6 e 3.7 apresentam programas com exemplos de utilizao de operadores relacionais e lgicos.
# include <stdio.h> main() { int i,j; printf("digite dois nmeros: "); scanf("%d%d", &i, &j); printf("%d == %d %d\n", i, j, i==j); printf("%d != %d %d\n", i, j, i!=j); printf("%d <= %d %d\n", i, j, i<=j); printf("%d >= %d %d\n", i, j, i>=j); printf("%d < %d %d\n", i, j, i<j); printf("%d > %d %d\n", i, j, i> j); } Figura 3.6: Programa com operadores relacionais e lgicos

/* Maior de Dois */ # include <stdio.h> main( ) { int x=2, y=3, produto; if ((produto = x*y) > 0) printf(" maior"); } Figura 3.7: Programa Maior_de_dois

3.4.4

Precedncia

O nvel de precedncia dos operadores avaliado da esquerda para a direita. Os parnteses podem ser utilizados para alterar a ordem da avaliao. 3.4.5 Operador cast (modelador) Sintaxe: (tipo)expresso Podemos forar uma expresso a ser de um determinado tipo usando o operador cast. Um exemplo pode ser visto na Figura 3.8. Nesse exemplo, se no fosse utilizado o

30

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Tabela 3.6: Nvel de precedncia dos operadores

Mais alta

Mais baixa

! ++ -- -(unrio) */% +<> <= >= == != && || =

modelador (oat) sobre a varivel i, o programa imprimiria 1/3 = 0, pois, ele faria primeiro a diviso de inteiros (1/3) resultando 0, e depois a converso do resultado para oat.
# include <stdio.h> main( ) { int i=1; printf(" %d/3 : %f ", i, (float) i/3); } Figura 3.8: Programa com exemplo de utilizao de operador cast

3.4.6

Operador sizeof

O operador sizeof retorna o tamanho em bytes da varivel, ou seja, do tipo que est em seu operando. utilizado para assegurar a portabilidade do programa. O operador sizeof usado para se saber o tamanho de variveis ou de tipos. Ele retorna o tamanho do tipo ou varivel em bytes. Mas porque us-lo se sabemos, por exemplo, que um inteiro ocupa 2 bytes? Devemos us-lo para garantir portabilidade. O tamanho de um inteiro pode depender do sistema para o qual se est compilando. O sizeof chamado um operador porque ele substitudo pelo tamanho do tipo ou varivel no momento da compilao. Ele no uma funo. O sizeof admite duas formas: sizeof nome_da_varivel sizeof (nome_do_tipo)

Sintaxe

31

Se quisermos ento saber o tamanho de um oat fazemos sizeof(oat). Se declararmos a varivel f como oat e quisermos saber o seu tamanho faremos sizeof(f). O operador sizeof tambm funciona com estruturas, campos bit, unies e enumeraes.

32

EDITORA - UFLA-FAEPE - Introduo Linguagem C

4
FUNES BSICAS DA BIBLIOTECA C
Existem algumas funes muito usadas em programas feitos em linguagem C. Estas so utilizadas principalmente para estabelecer a comunicao entre o usurio e o computador. Aqui sero citadas apenas algumas mais comuns.

4.1

FUNO PRINTF( ) Sintaxe: printf("expresso de controle",argumentos);

uma funo de I/O1 , que permite escrever no dispositivo padro (tela). A expresso de controle pode conter caracteres que sero exibidos na tela e os cdigos de formatao que indicam o formato em que os argumentos devem ser impressos. Cada argumento deve ser separado por vrgula.

Tabela 4.1: Caracteres de controle da funo printf

\n \t \b \" \\ \f \0

nova linha tab retrocesso aspas Barra invertida salta formulrio nulo

%c %d %e %f %o %s %u %x

caractere simples decimal notao cientca ponto utuante octal cadeia de caracteres decimal sem sinal hexadecimal

As Figuras 4.1, 4.2, 4.3, 4.4, 4.5 e 4.6 apresentam vrios exemplos de utilizao da funo printf em programas simples.
1

Input/Output: entrada/sada

34

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { printf("Este o numero dois: %d", 2); printf("%s est a %d milhes de milhas \n do sol", "Vnus", 67); } Figura 4.1: Exemplo de utilizao da funo printf #include <stdio.h> main( ) { printf("\n%2d",350); printf("\n%4d",350); printf("\n%6d",350); } Figura 4.2: Tamanho de campos na impresso #include <stdio.h> main( ) { printf("\n%4.2f", 3456.78); printf("\n%3.2f", 3456.78); printf("\n%3.1f", 3456.78); printf("\n%10.3f", 3456.78); } Figura 4.3: Arredondamento de nmeros em ponto utuante #include <stdio.h> main( ) { printf("\n%10.2f %10.2f %10.2f", 8.0, 15.3, 584.13); printf("\n%10.2f %10.2f %10.2f", 834.0, 1500.55, 4890.21); } Figura 4.4: Alinhamento de campos numricos

Funes Bsicas da Biblioteca C

35

#include <stdio.h> main( ) { printf("\n%04d", 21); printf("\n%06d", 21); printf("\n%6.4d", 21); printf("\n%6.0d", 21); } Figura 4.5: Complementando com zeros esquerda #include <stdio.h> main( ) { printf("%d %c %x %o\n", A, A, A, A); printf("%c %c %c %c\n", A, 65, 0x41, 0101); } Figura 4.6: Formas para imprimir caracteres utilizando a funo printf

A tabela ASCII possui 256 cdigos de 0 a 255, se imprimirmos em formato caractere um nmero maior que 255, ser impresso o resto da diviso do nmero por 256; se o nmero for 3393 ser impresso A, pois o resto de 3393 por 256 65.

4.2

FUNO SCANF( )

Tambm uma funo de I/O implementada em todos os compiladores C. Ela o complemento de printf() e nos permite ler dados formatados da entrada padro (teclado). Sua sintaxe similar a printf(). scanf("expresso de controle", argumentos); A lista de argumentos deve consistir nos endereos das variveis. C oferece um operador para tipos bsicos chamado operador de endereo e referenciado pelo smbolo & que retorna o endereo do operando. Um exemplo de programa que utiliza a funo scanf visto na Figura 4.7. Operador de endereo &: A memria do computador dividida em bytes, e so numerados de 0 at o limite da memria. Estas posies so chamadas de endereos. Toda varivel ocupa uma certa localizao na memria, e seu endereo o primeiro byte ocupado por ela.

36

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { int num; printf("Digite um nmero: "); scanf("%d",&num); printf("\no nmero %d",num); printf("\no endereo e %u",&num); } Figura 4.7: Exemplo de programa que utiliza a funo scanf

4.3

FUNO GETCHAR()

a funo original de entrada de caractere dos sistemas baseados em UNIX. A funo getchar() armazena a entrada at que a tecla ENTER seja pressionada. Veja um exemplo na Figura 4.8.
#include <stdio.h> main( ) { char ch; ch = getchar(); printf("%c \n",ch); } Figura 4.8: Exemplo de programa que utiliza a funo getchar

4.4

FUNO PUTCHAR()

Essa funo escreve na tela o argumento de seu caractere na posio corrente. Veja um exemplo na Figura 4.9. H inmeras outras funes de manipulao de char complementares s que foram vistas, como isalpha(), isupper(), islower(), isdigit(), isspace(), toupper(), tolower().

Funes Bsicas da Biblioteca C

37

# include <stdio.h> main( ) { char ch; printf("digite uma letra minscula : "); ch = getchar( ); putchar(toupper(ch)); putchar(\n); } Figura 4.9: Exemplo de programa que utiliza a funo putchar

38

EDITORA - UFLA-FAEPE - Introduo Linguagem C

5
ESTRUTURAS DE CONTROLE DE FLUXO
Os comandos de controle de uxo so a essncia de qualquer linguagem, porque governam o uxo da execuo do programa. So poderosos e ajudam a explicar a popularidade da linguagem. Podemos dividir em trs categorias. A primeira consiste em instrues condicionais if e switch. A segunda so os comandos de controle de loop, o while, o for e o do-while. A terceira contm instrues de desvio incondicional goto.

5.1

IF Sintaxe:
if (condio) comando; else comando;

Se a condio avaliar em verdadeiro (qualquer valor diferente de 0), o computador executar o comando ou o bloco, de outro modo, se a clusula else existir, o computador executar o comando ou o bloco que seu objetivo. Veja os exemplos das Figuras 5.1 e 5.2.
#include <stdio.h> main( ) { int a,b; printf("digite dois nmeros:"); scanf("%d%d",&a,&b); if (b) printf("%d\n",a/b); else printf("diviso por zero\n"); } Figura 5.1: Exemplo de programa que utiliza o comando de deciso if

40

EDITORA - UFLA-FAEPE - Introduo Linguagem C

No exemplo da Figura 5.1, so pedidos dois nmeros inteiros, a e b, e depois ser impresso o valor a/b somente se b for diferente de zero. Se b for igual a zero, ser indicada condio falsa para o comando if, e ser executado o comando alternativo (else), sendo impressa a mensagem de erro.
#include <stdio.h> #include <stdlib.h> #include <time.h> main( ) { int num,segredo; srand(time(NULL)); segredo = rand( )/100; printf("Qual e o numero: "); scanf("%d",&num); if (segredo == num) { printf("Acertou!"); printf("\nO numero e %d\n", segredo); } else printf ("Errou, tente outra vez! \n"); } Figura 5.2: O comando de deciso if com um bloco de instrues

Na Figura 5.1, havia apenas uma instruo a ser executada aps a vericao do comando if, portanto, no era necessrio utilizar-se chaves. Na Figura 5.2, havia um bloco de dois comandos a serem executados aps o if, portanto, este conjunto de instrues deve ser escrito dentro de um bloco que inicia com abre-chaves e naliza com fecha-chaves.

5.2

IF-ELSE-IF Sintaxe:
if (condio) comando; else if (condio) comando;

Uma varivel testada sucessivamente contra uma lista de variveis inteiras ou de caracteres. Depois de encontrar uma coincidncia, o comando ou o bloco de comandos executado.

Estruturas de Controle de Fluxo

41

Em uma estrutura if-else-if so colocadas vrias opes que sero testadas uma de cada vez, comeando pela 1 e continuando a testar at que seja encontrada uma expresso cujo resultado seja diferente de zero. Neste caso o programa executa a declarao correspondente. S uma declarao ser executada, ou seja, s ser executada a declarao equivalente primeira condio que for diferente de zero. A ltima declarao (default) a que ser executada no caso de todas as condies serem falsas e opcional.

#include <stdio.h> #include <stdlib.h> #include <time.h> main( ) { int num,segredo; srand(time(NULL)); segredo = rand( )/100; printf("Qual e o numero: "); scanf("%d", &num); if (segredo == num) { printf("Acertou!"); printf("\nO numero e %d\n", segredo); } else if (segredo < num) printf ("Errado, muito alto!\n"); else printf ("Errado, muito baixo!\n"); } Figura 5.3: Exemplo de um programa que utiliza o comando if-else-if

5.3

OPERADOR TERNRIO Sintaxe: condio ? expresso1 : expresso2

uma maneira compacta de expressar if-else. A operao ? funciona da seguinte forma: a condio testada, se for verdadeira ser calculada a expresso1, se for falsa, calcula-se a expresso2. No exemplo apresentado na Figura 5.4, a varivel max ter o valor de x se x for maior que y, caso contrrio, max assumir o valor de y.

42

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { int x, y, max; printf("Entre com dois nmeros: "); scanf("%d, %d", &x, &y); max = (x>y) ? x : y; printf("max = %d\n", max); } Figura 5.4: Exemplo de programa que utiliza o operador ternrio

5.4

SWITCH Sintaxe:
switch(varivel){ case constante1: seqncia de comandos; break; case constante2: seqncia de comandos; break; default: seqncia de comandos; }

Uma varivel testada sucessivamente contra uma lista de variveis inteiras ou de caracteres. Depois de encontrar uma coincidncia, o comando ou o bloco de comandos executado. Se nenhuma coincidncia for encontrada o comando default ser executado. O default opcional. A seqncia de comandos executada at que o comando break seja encontrado. A Figura 5.5 apresenta um exemplo de uso do switch.

5.5

LOOP FOR Sintaxe: for (inicializao; condio; incremento) comando;

O comando for de alguma maneira encontrado em todas linguagens procedurais de programao. Este comando normalmente utilizado para executar repetidamente um

Estruturas de Controle de Fluxo

43

#include <stdio.h> main ( ) { char x; printf("1. Incluso \n"); printf("2. Alterao \n"); printf("3. Excluso \n"); printf(" Digite sua opo: "); x = getchar( ); switch(x) { case 1: printf("escolheu incluso\n"); break; case 2: printf("escolheu alterao\n"); break; case 3: printf("escolheu excluso\n"); break; default: printf("opo invlida\n"); } } Figura 5.5: Exemplo de programa que utiliza o comando switch

conjunto de comandos por um nmero pr determinado de vezes. As Figuras 5.6 e 5.7 apresentam dois exemplos simples de utilizao do comando de repetio for. O for o primeiro de uma srie de trs comandos para se trabalhar com loops (laos de repetio). Os outros so o while e o do-while. Os trs compem a segunda famlia de comandos de controle de uxo. Podemos pensar nesta famlia como sendo a dos comandos de repetio controlada. Em sua forma mais simples, a incializao um comando de atribuio que o compilador usa para estabelecer a varivel de controle do loop. A condio uma expresso de relao que testa a varivel de controle do loop contra algum valor para determinar quando o loop terminar. O incremento dene a maneira como a varivel de controle do loop ser alterada cada vez que o computador repetir a seqncia de comandos. O comando for executa a inicializao incondicionalmente e testa a condio. Se a condio for falsa ele no faz mais nada. Se a condio for verdadeira ele executa a

44

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { int x; for(x=1; x<100; x++) printf("%d\n",x); } Figura 5.6: Exemplo de for com apenas um comando #include <stdio.h> main() { int x, xq; printf ("\n\t Numero for(x=1; x<100; x++) { xq = x*x; printf("\t %d } }

Quadrado \n\n");

%d \n", x, xq);

Figura 5.7: Exemplo de for com um bloco de instrues

instruo (no primeiro exemplo printf) ou um bloco de instrues, faz o incremento e volta a testar a condio. Ele ca repetindo estas operaes at que a condio seja falsa. O primeiro exemplo mostra um loop for que executa apenas um comando, e o segundo exemplo executa um bloco com dois comandos, tendo, portanto, que ser escrito entre chaves. Uma aplicao muito utilizada para laos de repetio para o clculo de sries numricas. Por exemplo, o nmero pode ser calculado utilizando-se a srie abaixo. S =1 1 1 1 + 3 3 + 3 3 5 7

Esta srie calculada para os N primeiros inteiros, sendo N um nmero determinado pelo usurio. Quanto maior N, melhor a preciso obtida. Depois calcular o valor de S, calcula-se : 3 32 S

Estruturas de Controle de Fluxo

45

O programa da Figura 5.8 apresenta uma forma de se calcular o valor de para um nmero N de termos1 .

#include <stdio.h> #include <math.h> main( ) { int N, n, sinal; float S, x; printf(" \n Envie o numero de termos "); scanf(" %d ",&N); S = 1; x = 1; sinal = 1; for (n = 1; n < N; n++) { x +=2; sinal = sinal; S = S + (float)sinal/(x*x*x); } S = exp((1./3)*log(32*S)); printf("\n\n O valor de PI eh %f, para os %d", S, N); printf("primeiros termos \n"); } Figura 5.8: Programa para calcular o valor de

No exemplo apresentado na Figura 5.8, as funes exp() e log() fazem parte da biblioteca math.h e so utilizadas para se calcular uma exponencial be . Neste caso b = 32*S e e = 1./3. Observe que necessrio colocar-se o ponto depois de 1, na frao, para que o resultado seja um nmero em ponto utuante, caso contrrio ser calculado o quociente inteiro de 1/3 que resulta no valor zero. A linguagem C permite que se utilize mais de uma varivel no controle do lao de repetio for. permitido tambm omitir-se qualquer um dos elementos do for, isto , se no quisermos uma inicializao, por exemplo, poderemos omiti-la. Vejamos os exemplos das Figuras 5.9 e 5.10.
Verses recentes do GCC requerem que o parmetro -lm seja passado quando o programa utiliza a biblioteca math.h: gcc -lm pi.c -o pi
1

46

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { int x,y; for (x = 0, y = 0; x+y<100; ++x,++y) printf("%d ", x+y); } Figura 5.9: Lao de for com duas variveis de controle

Um uso interessante para o for o loop innito, como nenhuma das trs denies so obrigatrias, podemos deixar a condio em aberto, como visto na Figura 5.10. Outra forma usual do for o for aninhado, ou seja, um for dentro de outro, como visto nas Figuras 5.11 e 5.12.
#include <stdio.h> main( ) { for ( ; ; ) printf ("loop infinito\n"); } Figura 5.10: Loop innito

#include <stdio.h> main( ) { int linha,coluna; for(linha=1; linha<=24; linha++) { for(coluna=1; coluna<40; coluna++) putchar(\n); } }

printf("-");

Figura 5.11: Laos de for aninhados

Estruturas de Controle de Fluxo

47

#include<stdio.h> main( ) { int i, j, k, temp; printf("\t i i^2 i^3 i^4 \n"); for ( i=1;i<10; i++) /* lao externo: define o numero base */ { for ( j=1; j<5; j++) /* primeiro nvel do aninhamento */ { temp = 1; for ( k=0; k<j; k++) /* lao mais interno: eleva a j */ { temp = temp*i; } printf("%9d",temp); } printf("\n"); } } Figura 5.12: Programa que exibe uma tabela das quatro primeiras potncias dos nmeros de 1 a 9

5.6

WHILE Sintaxe: while(condio) comando;

Uma maneira possvel de executar um lao utilizando o comando while. Ele permite que o cdigo que sendo executado numa mesma parte do programa de acordo com uma determinada condio. o comando pode ser vazio, simples ou bloco ele executado desde que a condio seja verdadeira testa a condio antes de executar o lao

As Figuras 5.13 e 5.14 apresentam exemplos de utilizao do lao de repetio while.

48

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> main( ) { char ch; while (ch != a) ch = getchar( ); } Figura 5.13: Exemplo simples de while #include <stdio.h> main( ) { int x, xq; printf ("\n\t Numero x = 1; while (x < 100) { xq = x*x; printf("\t %d x++; } }

Quadrado \n\n");

%d \n", x, xq);

Figura 5.14: Gerao de uma tabela de quadrados de inteiros utilizando while

5.7

DO-WHILE Sintaxe:
do {comando; } while(condio);

Tambm executa comandos repetitivos, mas neste caso, a condio s ser testada depois que o conjunto de instrues tiver sido executado pelo menos uma vez. As Figuras 5.15 e 5.16 apresentam exemplos de utilizao do lao do-while. A principal diferena entre os comandos while e do-while que no segundo o conjunto de instrues do bloco dever ser executado pelo menos uma vez, obrigatoriamente, enquanto no primeiro (while) pode acontecer do bloco de instrues no ser executado nenhuma vez.

Estruturas de Controle de Fluxo

49

#include <stdio.h> main( ) { int x, xq; printf ("\n\t Numero x = 1; do { xq = x*x; printf("\t %d x++; } while (x <100); }

Quadrado \n\n");

%d \n", x, xq);

Figura 5.15: Gerao de uma tabela de quadrados de inteiros utilizando do-while

5.8

BREAK

Quando o comando break encontrado em qualquer lugar do corpo do for, ele causa seu trmino imediato. O controle do programa passar ento imediatamente para o cdigo que segue o loop. Veja o exemplo da Figura 5.17.

5.9

CONTINUE

Algumas vezes torna-se necessrio saltar uma parte do programa, para isso utilizamos o continue. O comando continue fora a prxima iterao do loop pula o cdigo que estiver em seguida. Um exemplo apresentado na Figura 5.18.

50

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> main( ) { char ch; printf("1. incluso\n"); printf("2. alterao\n"); printf("3. excluso\n"); printf("4. sair\n"); printf(" Digite sua opo:"); do { ch=getchar(); switch(ch) { case 1: printf("escolheu inclusao\n"); break; case 2: printf("escolheu alteracao\n"); break; case 3: printf("escolheu exclusao\n"); break; case 4: printf("sair\n"); } } while(ch != 1 && ch != 2 && ch != 3 && ch != 4); } Figura 5.16: Exemplo de utilizao do lao do-while

main( ) { char ch; for( ; ; ) { ch = getchar( ); if (ch == a) break; } } Figura 5.17: Exemplo simples de utilizao do comando break

Estruturas de Controle de Fluxo

51

# include <stdio.h> main( ) { int x; for(x = 0; x<100; x++) { if (x%2) continue; printf ("%d\n", x); } } Figura 5.18: Exemplo de utilizao do comando continue

52

EDITORA - UFLA-FAEPE - Introduo Linguagem C

6
MATRIZES
A matriz um tipo de dado usado para representar uma certa quantidade de variveis que so referenciadas pelo mesmo nome. Consiste em locaes contguas de memria. O endereo mais baixo corresponde ao primeiro elemento. A matriz um conjunto ordenado de dados que possuem o mesmo tipo.

6.1

MATRIZ UNIDIMENSIONAL Sintaxe: tipo nome[tamanho];

As matrizes tm 0 como ndice do primeiro elemento, portanto sendo declarada uma matriz de inteiros de 10 elementos, o ndice varia de 0 a 9. Quando o compilador C encontra uma declarao de matriz ele reserva um espao na memria do computador sucientemente grande para armazenar o nmero de clulas especicadas em tamanho. Por exemplo, se declararmos: float exemplo[20]; o C ir reservar 4 20 = 80 bytes. Estes bytes so reservados de maneira contgua. Neste exemplo, os dados sero indexados de 0 a 19. Para acess-los escrevemos:
exemplo[0] exemplo[1] . . exemplo[19]

Mas ningum o impede de escrever:


exemplo[30] exemplo[103]

54

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Por qu? Porque o C no verica se o ndice que voc usou est dentro dos limites vlidos. Este um cuidado que o programador deve tomar. Se o programador no tiver ateno com os limites de validade para os ndices ele corre o risco de ter dados sobrescritos ou de ver o computador travar. Vrios erros srios (bugs) terrveis podem surgir. As Figuras 6.1, 6.2 e 6.3 apresentam programas que utilizam matrizes unidimensionais.
#include <stdio.h> main( ) { int x[10]; int t; for(t=0;t<10;t++) { x[t] = t*2; printf ("%d\n", x[t]); } } Figura 6.1: Exemplo simples de utilizao de matriz

6.2

MATRIZ MULTIDIMENSIONAL Sintaxe: tipo nome[tamanho][tamanho] ...;

A matriz multidimensional funciona como a matriz de uma dimenso (vetor), mas tem mais de um ndice. As dimenses so declaradas em seqncia entre colchetes. Veja um exemplo na Figura 6.4.

6.3

MATRIZES ESTTICAS

Os vetores de dados podem ser inicializados como os dados de tipos simples, mas somente como variveis globais. Quando for inicializar uma matriz local sua classe deve ser static. Veja um exemplo na Figura 6.5.

6.4

LIMITES DAS MATRIZES

A vericao de limites no feita pela linguagem, nem mensagem de erros so enviadas, o programa tem que testar os limites das matrizes. Na Figura 6.6 apresentado

Matrizes

55

#include <stdio.h> main ( ) { int num[100]; int count=0; int totalnums; do { printf ("\nEntre com um numero (-999 p/ terminar): "); scanf ("%d",&num[count]); count++; } while (num[count-1] != -999); /* verifica quantos nmeros foram digitados */ totalnums = count -1; /* retira a contagem do nmero 999 */ printf ("\n\n\n\t Os nmeros que voc digitou foram:\n\n"); for (count = 0; count < totalnums; count++) printf (" %d", num[count]); } Figura 6.2: Exemplo de armazenamento de dados em matriz unidimensional #include <stdio.h> main( ) { int notas[5], i, soma; for (i = 0; i<5; i++) { printf("Digite a nota do aluno %d: ", i ); scanf("%d", &notas[i] ); } soma = 0; for( i = 0; i<5; i++) soma = soma + notas[i]; printf("Media das notas: %d.", soma/5); } Figura 6.3: Operaes com matriz

56

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> main ( ) { int x[10][10]; int t, p=0; for( t = 0; t<10; t++,p++) { x[t][p] = t*p; printf("%d\n", x[t][p] ); } } Figura 6.4: Exemplo simples de utilizao de matriz multidimensional #include <stdio.h> main( ) { int i; static int x[10] ={0,1,2,3,4,5,6,7,8,9}; for(i=0; i<10; i++) printf("%d\n", x[i] ); } Figura 6.5: Exemplo de utilizao de matriz esttica

um programa que causar problemas ao computador durante sua execuo porque o ndice da matriz erro, dentro do lao de for, exceder o tamanho da matriz (que 10).
# include <stdio.h> main( ) { int erro[10], i; for( i = 0; i<100; i++) { erro[i]=1; printf (" %d\n ", erro[i] ); } } Figura 6.6: Erro na utilizao de matriz

7
MANIPULAO DE STRINGS
Em C no existe um tipo de dado string, no seu lugar utilizado uma matriz de caracteres. Uma string uma matriz tipo char que termina com \0. Por essa razo uma string deve conter uma posio a mais do que o nmero de caracteres que se deseja. O caractere \0 tem o cdigo numrico 00, portanto pode-se vericar o nal de uma string procurando o valor numrico zero armazenado na matriz de caracteres. Constantes strings so uma lista de caracteres que aparecem entre aspas, no sendo necessrio colocar o \0, que colocado pelo compilador. A Figura 7.1 mostra um programa simples para operao com strings.

#include <stdio.h> #include <string.h> main( ) { static char re[] = "lagarto"; // um vetor de caracteres de 8 posies puts(re); puts(&re[0]); // uma varivel do tipo matriz (ou vetor ) referenciada putchar(\n); // como o endereo de sua primeira posio. } Figura 7.1: Exemplo simples de operao com strings

7.1

FUNO GETS() Sintaxe: gets(nome_matriz);

58

EDITORA - UFLA-FAEPE - Introduo Linguagem C

utilizada para leitura de uma string atravs do dispositivo padro, at que a tecla <ENTER> seja pressionada. A funo gets() no testa limites na matriz em que chamada. A Figura 7.2 apresenta um programa simples que utiliza a funo gets.
# include <stdio.h> main() { char str[80]; gets(str); printf("%s",str); } Figura 7.2: Programa simples que utiliza a funo gets

7.2

FUNO PUTS() Sintaxe: puts(nome_do_vetor_de_caracteres);

Escreve o seu argumento no dispositivo padro de sada (vdeo), coloca um \n no nal. Reconhece os cdigos de barra invertida. A Figura 7.3 apresenta um programa simples que utiliza a funo puts.
# include <stdio.h> # include <string.h> main() { puts("mensagem"); } Figura 7.3: Exemplo simples de utilizao da funo puts

7.3

FUNO STRCPY() Sintaxe: strcpy(destino, origem);

Esta funo faz parte da biblioteca string.h. A funo strcpy() copia o contedo de uma string para uma varivel tipo string (um vetor de char). No programa da Figura 7.4, a string alo ser copiada para a varivel (matriz de caracteres) str.

Manipulao de Strings

59

# include <stdio.h> # include <string.h> main() { char str[20]; strcpy(str,"alo"); puts(str); } Figura 7.4: Utilizao da funo strcpy da biblioteca string.h

7.4

FUNO STRCAT() Sintaxe: strcat(string1, string2); Concatena duas strings. No verica tamanho. Um exemplo visto na Figura 7.5.
#include <string.h> #include <stdio.h> main() { char um[20], dois[10]; strcpy (um, "bom"); strcpy (dois," dia"); strcat (um, dois); printf ("%s\n", um); }

// une a string dois string um

Figura 7.5: Utilizao da funo strcat da biblioteca string.h

7.5

FUNO STRCMP()

Sintaxe: strcmp(s1, s2); Essa funo compara duas strings, se forem iguais devolve 0. A Figura 7.6 mostra um exemplo da funo strcmp().

60

EDITORA - UFLA-FAEPE - Introduo Linguagem C

main( ) { char s[80]; printf("Digite a senha:"); gets(s); if (strcmp(s,"laranja")) printf("senha invlida\n"); else printf("senha ok!\n") ; } Figura 7.6: Utilizao da funo strcmp da biblioteca string.h

8
PONTEIROS
Sintaxe: tipo *nomevar; Para ser um bom programador em linguagem C fundamental que se tenha um bom domnio de ponteiros. Por isto, o leitor deve acompanhar com ateno esta parte do curso que trata deles. Ponteiros so to importantes na linguagem C que voc j os viu e nem percebeu, quando falamos da funo scanf. Em scanf("%d", &num); o operador & indica o endereo de memria onde o compilador alocou a varivel num ao ler a sua declarao no incio do programa. O ponteiro um dos aspectos mais fortes e poderosos e perigosos da linguagem C. comum, o programador utilizar o ponteiro incorretamente, ocasionando erros que so muito difceis de encontrar. Ponteiro uma varivel que contm o endereo de outra varivel. Os ponteiros so utilizados para alocao dinmica, podendo substituir matrizes com mais ecincia. Tambm fornecem a maneira pelas quais funes podem modicar os argumentos chamados, como veremos no captulo de funes.

8.1

DECLARANDO PONTEIROS Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_varivel;

o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um valor mas sim um endereo para aquele tipo especicado. Vamos ver exemplos de declaraes:
int *pt; char *temp, *pt2;

O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros para caracteres. Eles ainda no foram inicializados (como toda varivel do C

62

EDITORA - UFLA-FAEPE - Introduo Linguagem C

que apenas declarada). Isto signica que eles apontam para um lugar indenido. Este lugar pode estar, por exemplo, na poro da memria reservada ao sistema operacional do computador. Usar o ponteiro nestas circunstncias pode levar a um travamento do micro, ou a algo pior. O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto de suma importncia! Para atribuir um valor a um ponteiro recm-criado poderamos igual-lo a um valor de memria. Mas, como saber a posio na memria de uma varivel do nosso programa? Seria muito difcil saber o endereo de cada varivel que usamos, mesmo porque estes endereos so determinados pelo compilador na hora da compilao e relocados na execuo. Podemos ento deixar que o compilador faa este trabalho por ns. Para saber o endereo de uma varivel basta usar o operador &. Veja o exemplo:
int count; int *pt; pt = &count;

Declaramos a varivel count como sendo do tipo inteiro e um declaramos um ponteiro para um inteiro, pt. A expresso &count nos d o endereo de count, o qual armazenamos em pt. O valor de count no alterado quando se inicializa o valor de pt. Como ns colocamos um endereo em pt, ele est agora liberado para ser usado. Podemos, por exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador inverso do operador &. o operador *. No exemplo acima, uma vez que zemos pt=&count a expresso *pt equivalente ao prprio count. Aps a inicializao da varivel ponteiro com o endereo da varivel inteira, esta varivel pode ser referenciada pelo seu nome ou pelo ponteiro que contm seu endereo. Isto signica que, se quisermos atribuir um valor para count podemos fazer de duas formas: count = 5; ou *pt = 5; As duas formas so equivalentes e tm o mesmo resultado. Qualquer modicao feita utilizando-se *pt, causar uma modicao na varivel count.

8.2

MANIPULAO DE PONTEIROS

Desde que os ponteiros so variveis, eles podem ser manipulados tal como as variveis. Se py e px so ponteiros para inteiros, ento podemos fazer a declarao: py = px; A Figura 8.1 apresenta um programa que exemplica a utilizao de ponteiros para acessar um varivel x.

Ponteiros

63

#include <stdio.h> main( ) { int x,*px,*py; x = 9; px = &x; py = px; printf("x= %d\n",x); // imprime o valor de x printf("&x= %d\n",&x); // endereo da varivel x, que printf("px= %d\n",px); // valor de px, que o endereo printf("*px= %d\n",*px); // contedo da varivel apontada printf("*py= %d\n",*py); // imprime valor de x, pois py = }

igual ao contedo de px de x por px, isto , valor de x px

Figura 8.1: Utilizao de ponteiros

8.3

EXPRESSES COM PONTEIROS

Os ponteiros podem aparecer em expresses, se px aponta para um inteiro x, ento *px pode ser utilizado em qualquer lugar que x o seria. O operador * tem maior precedncia que as operaes aritmticas, assim a expresso abaixo pega o contedo do endereo que px aponta e soma 1. y = *px+1; // y uma varivel do tipo de x No prximo caso somente o ponteiro ser incrementado e o contedo da prxima posio da memria ser atribudo a y. y = *(px+1); // y um ponteiro do tipo de px Os incrementos e decrementos dos endereos podem ser realizados com os operadores ++ e --, que possuem precedncia sobre o * e operaes matemticas e so avaliados da direita para a esquerda:
*px++; *(px--); /* sobe uma posio na memria*/ /* mesma coisa de *px-- */

64

EDITORA - UFLA-FAEPE - Introduo Linguagem C

No exemplo da Figura 8.2, os parnteses so necessrios, pois sem eles px seria incrementado em vez do contedo que apontado, porque os operadores * e ++ so avaliados da direita para esquerda. (*px)++ /* equivale a x=x+1; ou *px+=1 */

# include <stdio.h> main() { int x, *px; x = 1; px = &x; printf("x= %d\n", x); printf("px= %u\n", px); printf("*px+1= %d\n", *px+1); printf("px=%u\n", px); printf("*px= %d\n", *px); printf("*px+=1= %d\n", *px+=1); printf("px= %u\n",px); printf("(*px)++=%d\n", (*px)++); printf("px= %u\n",px); printf("*(px++)= %d\n", *(px++)); printf("px= %u\n",px); printf("*px++-=%d\n", *px++); printf("px= %u\n", px); } Figura 8.2: Operaes com Ponteiros

8.4

PONTEIROS PARA PONTEIROS

Um ponteiro para um ponteiro uma forma de indicao mltipla. Num ponteiro normal, seu valor o endereo da varivel desejada. Quando se trata de ponteiros para ponteiros, o primeiro ponteiro contm o endereo do segundo, que aponta para a varivel desejada. A Figura 8.3 apresenta um programa exemplo. float **balano; // balano um ponteiro para um ponteiro float.

Ponteiros

65

# include <stdio.h> main( ) { int x,*p,**q; x=10; p=&x; q=&p; printf("%d",**q); } Figura 8.3: Ponteiros para ponteiros

8.5

PROBLEMAS COM PONTEIROS

O erro chamado de ponteiro perdido um dos mais difceis de se encontrar, pois a cada vez que a operao com o ponteiro utilizada, poder estar sendo lido ou gravado em posies desconhecidas da memria. Isso pode acarretar sobreposies em reas de dados ou mesmo rea do programa na memria.
int *p; x = 10; *p = x;

Neste trecho de programa, o ponteiro p no foi inicializado, no recebeu nenhum endereo, portanto o valor 10 foi colocado em uma posio aleatria e desconhecida de memria. A conseqncia desta atribuio imprevisvel.

66

EDITORA - UFLA-FAEPE - Introduo Linguagem C

9
PONTEIROS E MATRIZES
Em C existe um grande relacionamento entre ponteiros e matrizes, sendo que eles podem ser tratados da mesma maneira. As verses com ponteiros geralmente so mais rpidas. Quando uma matriz declarada da seguinte forma: tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];

o compilador C calcula o tamanho, em bytes, necessrio para armazenar esta matriz. Este tamanho : tam1 x tam2 x tam3 x ... x tamN x tamanho_do_tipo

O compilador ento aloca este nmero de bytes em um espao livre de memria. O nome da varivel que voc declarou na verdade um ponteiro para o tipo da varivel da matriz. Este conceito fundamental. Eis porque: tendo alocado na memria o espao para a matriz, ele toma o nome da varivel (que um ponteiro) e aponta para o primeiro elemento da matriz. Mas a surge a pergunta: ento como que podemos usar a seguinte notao? nome_da_varivel[ndice] Isto pode ser facilmente explicado desde que voc entenda que a notao acima absolutamente equivalente a se fazer: *(nome_da_varivel+ndice) preciso lembrar que a memria de um computador no tem arranjos multidimensionais, isto , ela pode ser descrita como uma extensa lista de posies de memria enleiradas, cada uma com um endereo especco. Portanto, quando for declarada uma matriz de dimenso mltipla, o compilador colocar no programa executvel uma rotina para o clculo da posio de memria correspondente aos elementos da matriz referenciados pelos mltiplos ndices.

68

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Em C, a indexao de uma matriz comea com o valor zero. porque, ao pegarmos o valor do primeiro elemento de uma matriz, queremos, de fato, *nome_da_matriz e ento devemos ter um ndice igual a zero, resultando (*nome_da_matriz+0). Ento sabemos que: *nome_da_matriz equivalente a nome_da_matriz[0]

9.1

MANIPULANDO MATRIZES ATRAVS DE PONTEIROS

Considerando a declarao da matriz int a[10]; Sendo pa um ponteiro para inteiro ento:
pa = &a[0]; /*passa o endereo inicial do vetor a para o ponteiro pa */ pa = a; /* a mesma coisa de pa=&a[0];*/ x = *pa; /*passa o contedo de a[0] para x */

Se pa aponta para um elemento particular de um vetor a, ento por denio pa+1 aponta para o prximo elemento, e em geral pa-i aponta para i elementos antes de pa e pa+i para i elementos depois. Se pa aponta para a[0] ento: *(pa+1) aponta para a[1]; pa+i o endereo de a[i] e *(pa+i) o contedo. possvel fazer cpia de caracteres utilizando matrizes e ponteiros, conforme mostrado no programa da Figura 9.1.
# include <stdio.h> main( ) { int i = 0; char t[10]; static char s[ ] = "abobora"; while (t[i] = s[i]) i++; printf("%s\n",t); } Figura 9.1: Cpia de uma string (verso matriz)

No lao while, feita a cpia de cada elemento de s para cada posio de t e incrementado o ndice i at que o caractere \0 nalizador de string, ou seja o valor 00 (NULL), seja encontrado em s.

Ponteiros e Matrizes

69

O mesmo exemplo pode ser resolvido utilizando-se ponteiros, conforme mostrado na Figura 9.2.
# include <stdio.h> main( ) { char *ps,*pt, t[10], s[10]; strcpy (s,"abobora"); ps = s; pt = &t[0]; while(*ps) *pt++ = *ps++; printf("%s", t ); } Figura 9.2: Cpia de uma string (verso ponteiro)

9.2

STRING E PONTEIROS

Sendo um ponteiro para caractere char *texto, podemos atribuir uma constante string para texto, que no uma cpia de caracteres, somente ponteiros so envolvidos. Neste caso a string armazenada como parte da funo em que aparecem, ou seja, como constante. Um exemplo visto na Figura 9.3.
char *texto = "composto"; /* funciona como static char texto[ ] = "composto"; */

#include <stdio.h> main( ) { char *al = "conjunto"; char re[ ] = "simples"; puts (al); puts (&re[0]); /* ou puts(re); */ for( ; al; al++) putchar(*al); putchar(\n); } Figura 9.3: Uso de um ponteiro no lugar de uma string

70

EDITORA - UFLA-FAEPE - Introduo Linguagem C

9.3

MATRIZES DE PONTEIROS A declarao de matrizes de ponteiros semelhante a qualquer outro tipo de matrizes: int *x[10];

Para atribuir o endereo de uma varivel inteira chamada var ao terceiro elemento da matriz de ponteiros pode-se fazer um comando de atribuio simples: x[2] = &var; Neste caso, a matriz x contm ponteiros para variveis inteiras, e o endereo da varivel var foi armazenado na posio 2 da matriz de ponteiros (x). Para vericar o contedo de var pode-se utilizar o ponteiro armazenado em x: *x[2]; As matrizes de ponteiros so tradicionalmente utilizadas para mensagens de erro, que so constantes :
char *erro[ ] = {"arquivo no encontrado\n","erro de leitura\n"}; printf("%s", erro[0]); printf("%s", erro[1]);

Um exemplo mostrado na Figura 9.4.


#include <stdio.h> main( ) { char *erro[2]; erro[0] = "arquivo nao encontrado\n"; erro[1] = "erro da leitura\n"; for( ;*erro[0]; ) printf("%c", *erro[0]++); } Figura 9.4: Utilizao de matrizes de ponteiros para mensagens de erro

10
FUNES
Uma funo uma unidade autnoma de cdigo do programa e projetada para cumprir uma tarefa particular. Geralmente os programas em C consistem em vrias pequenas funes. A declarao do tipo da funo obrigatria no GCC. Os parmetros de recepo de valores devem ser separados por vrgulas. Sintaxe: tipo nome(parmetros){ comandos} Uma funo pode retornar apenas um valor para o programa que a chamou, e este valor deve ser do tipo especicado no cabealho da funo, o tipo da funo. O nome da funo dever sempre iniciar com uma letra, e normalmente escrito em minsculas. s vezes, os programadores iniciantes usam nomes com letras maisculas para no correrem o risco de usar nome igual ao de alguma funo j denida em alguma biblioteca existente no compilador que est sendo usado. Por exemplo, pode-se denir uma funo com o nome Printf, escrita com P maisculo, para diferenciar da funo printf da biblioteca stdio.h. Os parmetros so valores de variveis que sero passados pelo programa para a funo. Alm da varivel de retorno nenhum outro valor pode ser retornado pela funo para o programa que a chamou.

10.1

FUNO SEM RETORNO

Quando uma funo no retorna um valor para a funo que a chamou ela declarada como void. No exemplo da Figura 10.1 a funo inverso escreve a string vet em ordem reversa (do ltimo para o primeiro caracter). Quando o cdigo da funo escrito aps a linha de comando que a chamar pela primeira vez, deve-se escrever uma linha de anncio da existncia desta funo, antes do incio da funo main. Este anncio de funo chamado de prottipo. Na verdade o prottipo pode ser colocado em outro lugar, desde que seja antes da primeira chamada funo. A Figura 10.2 apresenta um outro exemplo de funo sem retorno.

72

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> void inverso(char *s ); main( ) { char *vet = "abcde"; inverso(vet); }

/* prottipo de funo */

void inverso(char *s) /* o parmetro passado um ponteiro */ { int t = 0; for( ; *s ; s++) t++; /* t conta quantos caracteres tem o vetor s */ s--; for( ; t-- ; ) printf("%c",*s--); putchar(\n); } Figura 10.1: Inverso de uma string usando uma funo que recebe um ponteiro

10.2

FUNO COM RETORNO

Quando o programador quiser que a funo envie um valor para o programa que a chamou, ele dever declarar um tipo diferente de void para a funo. A Figura 10.3 apresenta um exemplo de programa que utiliza uma funo que recebe dois valores inteiros (base, expoente) e retorna um inteiro (i) que igual base elevada ao expoente. Observe que no loop for da funo elevado no foi feita a inicializao da varivel de controle, mas esta varivel o expoente que j foi passado como parmetro. O loop vai parar de ser executado quando a varivel expoente atingir o valor zero, que funciona como o valor lgico falso. A funo elevado da Figura 10.3 modica o valor da varivel expoente que lhe foi passada pela funo main, mas esta modicao no afeta a varivel e da funo main, pois expoente apenas uma cpia de e, e as variveis de uma funo s existem dentro desta, no sendo reconhecidas por outra funo.

10.3

PARMETROS FORMAIS

Quando uma funo utiliza argumentos, ento ela deve declarar as variveis que aceitaram os valores dos argumentos, sendo essas variveis os parmetros formais. Veja um

Funes

73

#include<stdio.h> void code (char *s); main( ) { char letras[26]; printf("\n\n Insira uma frase a ser codificada "); printf("(mximo de 25 caracteres). \n"); scanf("%s", letras); code( letras ); } void code( char *s ) /* Codifica as letras */ { char ch; do { ch = *s++; printf("%c", ch+1); /* desloca o alfabeto uma posio */ } while(ch); } Figura 10.2: Um codicador simples

exemplo na Figura 10.4, onde so declarados os parmetros formais string, um ponteiro que contm o endereo do incio de uma string, e caractere, uma varivel do tipo char. A funo pertence neste exemplo vai procurar um certo caractere dentro de uma string. Se for encontrado, retorna o valor 1, seno, retorna 0. 10.3.1 Chamada por Valor

O valor de um argumento copiado para o parmetro formal da funo, portanto as alteraes no processamento no alteram as variveis. No exemplo da Figura 10.5, a varivel x recebe uma cpia da varivel t, e a modicao de seu valor dentro da funo Sqr no altera o valor da varivel t na funo main. 10.3.2 Chamada por Referncia

Quando se deseja que uma funo modique valores das variveis do programa que a chamou, deve-se passar para a funo no a varivel, mas o seu endereo na memria do computador. Isto feito utilizando-se ponteiros. No exemplo da Figura 10.6 a funo

74

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> int elevado(int base, int expoente ); main( ) { int b,e; printf("Digite a base e expoente x, y : "); scanf("%d,%d", &b, &e); printf("valor = %d\n", elevado(b,e)); } int elevado(int base, int expoente) // so passados dois inteiros como parmetros { int i; if ((expoente<0) || (!base)) return 0; i =1; for( ; expoente; expoente--) i = base*i; return i; // retorna o inteiro i para a funo main } Figura 10.3: Funo com retorno de inteiro int pertence(char *string, char caracter) { while (*string) if (*string == caracter) return 1; else string++; return 0; } Figura 10.4: Parmetros formais de uma funo

troca troca os valores contidos nas variveis x e y de main, utilizando os ponteiros a e b que recebem os endereos de x e y respectivamente.

10.4

CLASSE DE VARIVEIS

Uma funo pode chamar outras funes, mas o cdigo que compreende o corpo de uma funo (bloco entre { }) est escondido do resto do programa, ele no pode afetar nem ser afetado por outras partes do programa, a no ser que o cdigo use variveis globais. Existem trs classes bsicas de variveis: locais, estticas e globais.

Funes

75

#include <stdio.h> int Sqr( int x ); main( ) { int t =10; printf("%d eh o quadrado de %d", Sqr(t),t); } int Sqr(int x) { x = x*x; /* Modificao no valor de x no altera t */ return(x); } Figura 10.5: Passagem de valor de uma varivel para uma funo #include <stdio.h> void troca (int *a, int *b ); main( ) { int x=10, y=20; troca(&x,&y); printf("x=%d y=%d\n", x, y); } void troca (int *a, int *b) // *a e *b so ponteiros que recebem os endereos de x e y { int temp; temp = *a; *a = *b; *b = temp; } Figura 10.6: Funo que utiliza passagem por referncia

10.4.1

Variveis locais

As variveis que so declaradas dentro de uma funo so chamadas de locais. Na realidade todas as variveis declaradas dentro de um bloco { } podem ser referenciadas apenas dentro deste bloco. Elas existem apenas durante a execuo do bloco de cdigo no qual esto declaradas. O armazenamento de variveis locais por default feito na pilha,

76

EDITORA - UFLA-FAEPE - Introduo Linguagem C

assim sendo uma regio dinmica. A Figura 10.7 apresenta um exemplo de funo que utiliza variveis locais.

#include <stdio.h> void linha (int x); main( ) { int tamanho; printf ("Digite o tamanho: "); scanf ("%d", &tamanho); linha (tamanho); } void linha(int x) { int i; for( i = 0; i <= x; i++) putchar(95); /* A varivel i na funo linha no reconhecida pela funo main.*/ } Figura 10.7: Variveis locais em uma funo

10.4.2

Variveis Globais

So conhecidas por todo programa e podem ser usadas em qualquer parte do cdigo. Permanecem com seu valor durante toda execuo do programa. Deve ser declarada fora de qualquer funo e at mesmo antes da declarao da funo main. Fica numa regio xa da memria prpria para esse m. Um exemplo visto na Figura 10.8. Sendo a varivel cont declarada fora de qualquer funo do programa, ela ser uma varivel global, sendo, portanto reconhecida pelos trs blocos de programa (main, func1, func2). A modicao do valor de cont em func2, resulta na modicao do mesmo cont em func1. Logo, func1 ir escrever o valor 109 (e no 100) para cont. 10.4.3 Variveis Estticas

Funcionam de forma parecida com as variveis globais, conservando o valor durante a execuo de diferentes funes do programa. No entanto s so reconhecidas na funo onde esto declaradas. So muito utilizadas para inicializar vetores, conforme pode ser visto no programa da Figura 10.9.

Funes

77

# include <stdio.h> void func1( ), func2( ); int cont; main( ) { cont = 100; func1( ); } void func1( ) { int temp; temp = cont; func2( ); printf ("temp = %d", temp); printf ("cont = %d", cont); } void func2( ) { int cont; for(cont =1; cont<10; cont++) printf(" . "); } Figura 10.8: Variveis globais em um programa

#include <stdio.h> main( ) { int i; static int x[10] = {0,1,2,3,4,5,6,7,8,9}; for(i=0; i<10; i++) printf (" %d \n ", x[i]); } Figura 10.9: Variveis locais em uma funo

78

EDITORA - UFLA-FAEPE - Introduo Linguagem C

10.5 10.5.1

FUNES COM MATRIZES Passando Parmetros Formais

Para passar uma matriz para uma funo necessrio passar somente o endereo e no uma cpia da matriz. Quando vamos passar uma matriz como argumento de uma funo, podemos declarar a funo de trs maneiras equivalentes. Digamos que temos a seguinte matriz: int matrx [50]; e que queiramos pass-la como argumento de uma funo func(). Podemos declarar func() das trs maneiras seguintes:
void func (int matrx[50]); void func (int matrx[]); void func (int *matrx);

Veja que, nos trs casos, teremos dentro de func() um int* chamado matrx. Note que, no caso de estarmos passando uma matriz para uma funo, teremos de pass-la atravs de um ponteiro. Isto faz com que possamos alterar o valor desta matriz dentro da funo. A Figura 10.10 apresenta um exemplo de funo que trabalha com uma matriz.
#include <stdio.h> void mostra (int num[ ] ); main( ) { int t[10], i; for ( i = 0; i < 10; i++) t[i] = i; mostra(t); } void mostra ( int num[ ] ) { int i; for( i = 0; i < 10; i++ ) printf ("%d", num[i]); } Figura 10.10: Funo que utiliza uma matriz

A funo mostra, da Figura 10.10, poderia ter sido escrita utilizando-se um ponteiro na passagem de parmetros, conforme se v na Figura 10.11.

Funes

79

void mostra ( int *num ) { int i; for( i = 0; i < 10; i++) printf ("%d", *(num+i)); } Figura 10.11: Funo que opera sobre uma matriz utilizando um ponteiro

A Figura 10.12 apresenta um exemplo de funo que recebe dois ponteiros como argumentos e retorna um inteiro. Ela retorna o ndice de incio de uma substring dentro de uma string ou -1, se nenhuma correspondncia for encontrada. Verique que existem duas declaraes return, o que perfeitamente possvel em C, visto que a funo terminar quando passar pela primeira linha contendo return. Sem o uso da segunda declarao return, uma varivel temporria e cdigo extra precisariam ser usados.

encontra_substr(char *sub, char *str) { register int t; char *p, *p2; for (t = 0; str[t] ; t++) { p = &str[t]; /* pega o ponto de incio de str */ p2 = sub; while(*p2 && (*p2==*p)) /* enquanto nao for final de sub e for */ { p++; /* verificado igualdade entre os caracteres */ p2++; /* de sub e str, avana. */ } if (!*p2) return t; /* se est no final de sub, foi encontrada a substring */ } return -1; } Figura 10.12: Funo que procura uma substring dentro de uma string

80

EDITORA - UFLA-FAEPE - Introduo Linguagem C

10.5.2

Alterando os Valores da Matriz

Existem vrias formas de se alterar os valores de uma matriz utilizando-se uma funo. A Figura 10.13 mostra um exemplo de como faz-lo utilizando um ponteiro que aponta para o primeiro elemento da matriz s.
#include <stdio.h> void maiusc (char *string ); main( ) { char s[80]; gets(s); maiusc(s); } void maiusc (char *string) { register int t; for( t = 0; string[t]; t++) { string[t] = toupper ( string[t] ); printf ("%c", string[t] ); } } Figura 10.13: Alterando valores de uma matriz

11
ARGUMENTOS DA LINHA DE COMANDO
No ambiente C existe uma maneira de passar argumentos atravs da linha de comandos para um programa quando ele inicia. O primeiro argumento (argc) a quantidade de argumentos que foram passados quando o programa foi chamado; o segundo argumento (argv) um ponteiro de vetores de caracteres que contm os argumentos, um para cada string. Por conveno argv[0] o nome do programa que foi chamado, portanto argc pelo menos igual a 1. Cada argumento da linha de comando deve ser separado por um espao ou tabulao. A Figura 11.1 apresenta um programa simples que utiliza argumentos na linha de comando.
#include <stdio.h> int main( int argc, char *argv[ ] ) { if (argc != 2) { printf("falta digitar o nome\n"); exit(0); } printf("alo %s", argv[1]); } Figura 11.1: Programa que recebe uma string na linha de comando

Este programa, depois de compilado, dever ser chamado na linha de comando como NomePrograma NomeUsurio. Ento ele escrever na tela do computador a mensagem: alo NomeUsurio. O programa da Figura 11.2 deve ser chamado na linha de comando como NomePrograma 3 display, para que seja apresentada na tela a contagem 3, 2, 1, e seja emitido um sinal sonoro (o correspondente ASCII do nmero 7). Se no for digitado o nmero 3 e a palavra display, a contagem no ser apresentada.

82

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> int main( int argc, char *argv[ ] ) { int disp, cont; if (argc<2) { printf("falta digitar o valor para contagem\n"); exit(0); } if (argc==3 && !strcmp(argv[2],"display")) disp = 1; else disp = 0; for(cont = atoi( argv[1] ); cont; --cont) if(disp) printf("%d", cont); printf("%c", 7); } Figura 11.2: Programa que recebe argumentos na linha de comando

12
ESTRUTURAS, UNIES E ENUMERAES
12.1 ESTRUTURAS

Ao manusearmos dados muitas vezes deparamos com informaes que no so fceis de armazenar em variveis escalares como so os tipos inteiros e pontos utuantes, mas na verdade so conjuntos de coisas. Este tipo de dados so compostos com vrios dos tipos bsicos do C. As estruturas permitem uma organizao dos dados dividida em campos e registros. Para se acessar cada elemento de uma estrutura, escreve-se o nome da varivel que tem aquele tipo de estrutura, coloca-se um ponto e o nome do elemento que se deseja, como no exemplo da Figura 12.1, onde se referencia cada elemento da varivel que tem a estrutura do tipo lapis. Como ocorre com as variveis, as estruturas tambm podem ser referenciadas por ponteiros. Assim, denindo-se por exemplo o ponteiro *p para a estrutura acima (lapis), pode-se usar a sintaxe (*p).dureza. Porm, para referenciar o ponteiro h ainda outra sintaxe, atravs do operador -> , como por exemplo, p -> dureza.

12.2

UNIES

Uma declarao union determina uma nica localizao de memria onde podem estar armazenadas vrias variveis diferentes. A declarao de uma unio semelhante declarao de uma estrutura:

union nome_da_union { tipo_1 nome_1; tipo_2 nome_2; ... tipo_n nome_n; } variveis_union;

84

EDITORA - UFLA-FAEPE - Introduo Linguagem C

# include <stdio.h> struct lapis { int dureza; char fabricante; int numero; }; main( ) { int i; struct lapis p[3], C; C.dureza = 1; C.fabricante = H; C.numero = 19; p[0].dureza = 2; p[0].fabricante = F; p[0].numero = 482; p[1].dureza = 0; p[1].fabricante = G; p[1].numero = 33; p[2].dureza = 3; p[2].fabricante = E; p[2].numero = 107; printf("Dureza Fabricante Numero \n\n"); printf("Lapis de Cor \n"); printf("%d \t%c \t%d \n", C.dureza, C.fabricante, C.numero); printf("Lapis de Escrever \n"); for( i = 0; i<3; i++) { printf("%d \t%c", p[i].dureza, p[i].fabricante); printf("\t%d \n", p[i].numero); } } Figura 12.1: Exemplo simples de utilizao de estrutura de dados

As variveis_union no precisam ser declaradas imediatamente aps a declarao da union, elas podem ser declaradas posteriormente com se declaram as variveis inteiras e de ponto utuante. Como exemplo, vamos considerar a unio da Figura 12.2.

Estruturas, Unies e Enumeraes

85

union angulo { float graus; float radianos; }; Figura 12.2: Unio de variveis de mesmo tipo

Nela, temos duas variveis (graus e radianos) que, apesar de terem nomes diferentes, ocupam o mesmo local da memria. Isto quer dizer que s gastamos o espao equivalente a um nico oat. Unies podem ser feitas tambm com variveis de diferentes tipos. Neste caso, a memria alocada corresponde ao tamanho da maior varivel no union. Veja o exemplo da Figura 12.3.
union numero { char Ch; int I; float F; }; Figura 12.3: Unio de variveis de tipos diferentes

Aps a declarao da union, podemos declarar as variveis deste tipo dentro do corpo do programa. Numa declarao como esta, em que variveis de tipos diferentes ocupam o mesmo espao na memria, deve-se ter muito cuidado na sua utilizao. O exemplo da Figura 12.4 mostra como utilizar a union numero em um programa. No programa da Figura 12.4 deve-se tomar cuidado para, quando se escrever um valor inteiro na varivel N, no tentar acess-lo como ponto utuante. Deve-se ter cuidado para no se misturar os tipos de dados escritos e acessados na varivel do tipo union.

12.3

ENUMERAES

Uma enumerao uma extenso da linguagem C acrescentada pelo padro ANSI. Uma enumerao um conjunto de constantes inteiras que especica todos os valores legais que uma varivel desse tipo pode ter. Enumeraes so comuns na vida cotidiana. Por exemplo, uma enumerao dos dias da semana Dom, Seg, Ter, Qua, Qui, Sex, Sab.

86

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> union numero { char Ch; int I; float F; }; main (void) { union numero N; // declara a varivel N que uma union numero N.I=123; printf ("%d",N.I); N.F=123; printf ("%f",N.F); return 0; } Figura 12.4: Programa que utiliza a union nmero

Enumeraes so denidas de forma semelhante a estruturas; a palavra-chave enum assinala o incio de um tipo de enumerao. A forma geral para enumerao enum nome_da_enumerao {lista_de_valores} lista_de_variveis; A lista de variveis opcional na declarao da enumerao. Vamos considerar o seguinte exemplo: enum dias_da_semana { Dom, Seg, Ter, Qua, Qui, Sex, Sab }; O programador diz ao compilador que qualquer varivel do tipo dias_da_semana s pode ter os valores enumerados. Isto quer dizer que poderamos fazer o programa da Figura 12.5, onde duas variveis d1 e d2 sero do tipo enumerao dias_da_semana. Voc deve estar se perguntando como que a enumerao funciona. Simples. O compilador pega a lista que voc fez de valores e associa, a cada um, um nmero inteiro. Ento, ao primeiro da lista, associado o nmero zero, ao segundo o nmero 1 e assim por diante. As variveis declaradas so ento variveis int.

Estruturas, Unies e Enumeraes

87

#include <stdio.h> enum dias_da_semana { Dom, Seg, Ter, Qua, Qui, Sex, Sab }; int main ( ) { enum dias_da_semana d1,d2; d1 = Seg; d2 = Sex; if (d1 == d2) // so comparados os inteiros correspondentes a Seg e Sex { printf ("O dia eh o mesmo."); } else { printf ("So dias diferentes."); } return 0; } Figura 12.5: Exemplo de utilizao de enumeraes

88

EDITORA - UFLA-FAEPE - Introduo Linguagem C

13
NOES DE MANIPULAO DE ARQUIVOS

Para tratar de arquivos a linguagem C fornece um nvel de abstrao entre o programador e o dispositivo que estiver sendo usado. Esta abstrao chamada la de bytes e o dispositivo normalmente o arquivo. Existe um sistema bufferizado de acesso ao arquivo, onde um ponteiro de arquivo dene vrios aspectos do arquivo, como nome, status e posio corrente, alm de ter a la associada a ele. A Figura 13.1 mostra um programa exemplo que escreve uma seqncia de nmeros em um arquivo (teste.dat) e depois l os valores contidos no arquivo.

13.1

ABRINDO E FECHANDO UM ARQUIVO

No sistema de entrada e sada ANSI denido o tipo ponteiro de arquivo. Este no um tipo propriamente dito, mas uma denio usando o comando typedef. Esta denio est no arquivo cabealho stdio.h ou stdlib.h dependendo do seu compilador. Podemos declarar um ponteiro de arquivo da seguinte maneira: FILE *p; p ser ento um ponteiro para um arquivo. usando este tipo de ponteiro que vamos poder manipular arquivos no C. 13.1.1 A funo fopen

Esta a funo de abertura de arquivos. Seu prottipo : FILE *fopen (char *nome_do_arquivo, char *modo); O nome_do_arquivo determina qual arquivo dever ser aberto. Este nome deve ser vlido no sistema operacional que estiver sendo utilizado. O modo de abertura diz funo fopen() que tipo de uso voc vai fazer do arquivo. A Tabela 13.1 mostra os valores de modo vlidos. Poderamos ento, para abrir um arquivo binrio, escrever:

90

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main ( ) { FILE *fp; char ch; int nu, *pn; pn = &nu; fp = fopen("teste.dat", "w"); printf("Entre com os numeros para gravar e 0 para sair: "); scanf("%d", &nu); while(nu) { fprintf (fp,"%d ", nu); scanf("%d", &nu); } fclose(fp); fp = fopen("teste.dat", "r"); while(!feof(fp)) { fscanf( fp,"%d ", &nu); printf( "%d", nu); } } Figura 13.1: Escrevendo e lendo em arquivo FILE *fp; fp = fopen ("exemplo.bin","wb"); if (!fp) printf ("Erro na abertura do arquivo.");

A condio !fp testa se o arquivo foi aberto com sucesso porque no caso de um erro a funo fopen() retorna um ponteiro nulo (NULL). 13.1.2 A funo exit

Aqui abrimos um parntesis para explicar a funo exit() cujo prottipo : void exit (int codigo_de_retorno); Esta funo aborta a execuo do programa. Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne, para o sistema operacional, o

Noes de Manipulao de Arquivos

91

Tabela 13.1: Modos vlidos de abertura de arquivos

Modo "r" "w" "a" "rb" "wb" "ab" "r+" "w+" "a+" "r+b" "w+b" "a+b" "rt" "wt" "at" "r+t" "w+t" "a+t"

Signicado Abre um arquivo para leitura Cria um arquivo para escrita Acrescenta dados no m do arquivo (append) Abre um arquivo binrio para leitura Cria um arquivo binrio para escrita Acrescenta dados binrios no m do arquivo Abre um arquivo para leitura e escrita Cria um arquivo para leitura e escrita Acrescenta dados ou cria uma arquivo para leitura e escrita Abre um arquivo binrio para leitura e escrita Cria um arquivo binrio para leitura e escrita Acrescenta dados ou cria uma arquivo binrio para leitura e escrita Abre um arquivo texto para leitura Cria um arquivo texto para escrita Acrescenta dados no m do arquivo texto Abre um arquivo texto para leitura e escrita Cria um arquivo texto para leitura e escrita Acrescenta dados ou cria uma arquivo texto para leitura e escrita

cdigo_de_retorno. A conveno mais usada que um programa retorne zero no caso de um trmino normal e retorne um nmero no nulo no caso de ter ocorrido um problema. A funo exit() se torna importante em casos como alocao dinmica e abertura de arquivos pois pode ser essencial que uma determinada memria seja alocada ou que um arquivo seja aberto. Poderamos reescrever o exemplo da seo anterior usando agora o exit() para garantir que o programa no deixar de abrir o arquivo, como mostrado na Figura 13.2. 13.1.3 A funo fclose

Quando abrimos um arquivo devemos fech-lo. Para tanto devemos usar a funo fclose(): int fclose (FILE *fp); importante que se perceba que se deve tomar o maior cuidado para no se perder o ponteiro do arquivo. Perder neste caso seria se atribuir um valor de um outro ponteiro

92

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main (void) { FILE *fp; /* Comandos... */ fp = fopen ("exemplo.bin", "wb"); if (!fp) { printf ("Erro na abertura do arquivo. Fim de programa."); exit (1); } /* Comandos ... */ return 0; } Figura 13.2: Uso da funo exit na abertura de arquivos

qualquer ao ponteiro de arquivo (perdendo assim o valor original). utilizando este ponteiro que vamos poder trabalhar com o arquivo. Se perdermos o ponteiro de um determinado arquivo no poderemos nem fech-lo. O ponteiro fp passado funo fclose() determina o arquivo a ser fechado. A funo retorna zero no caso de sucesso.

13.2

LENDO E ESCREVENDO CARACTERES EM ARQUIVOS

Alm das funes fprintf e fscanf vista no exemplo inicial, outras funes existem no padro ANSI para se escrever e se ler em arquivos. Aqui sero citadas brevemente as funes putc, getc, e a funo feof que verica o se o arquivo chegou ao nal. 13.2.1 putc

Toda vez que estamos trabalhando com arquivos, h uma espcie de posio atual no arquivo. Esta posio, gerenciada pelo compilador, a posio de onde ser lido ou escrito o prximo caracter. Normalmente, num acesso seqencial a um arquivo, no temos que mexer nesta posio pois quando lemos um caractere a posio no arquivo automatica-

Noes de Manipulao de Arquivos

93

mente atualizada. Num acesso randmico teremos que mexer nesta posio (ver fseek()). Prottipo: int putc (int ch,FILE *fp); Escreve um caracter no arquivo. 13.2.2 getc

Retorna um caracter lido do arquivo. Prottipo: int getc (FILE *fp); 13.2.3 feof

EOF (End of le) indica o m de um arquivo. s vezes, necessrio vericar se um arquivo chegou ao m. Para isto podemos usar a funo feof(). Ela retorna no-zero se o arquivo chegou ao EOF, caso contrrio retorna zero. Seu prottipo : int feof (FILE *fp);

94

EDITORA - UFLA-FAEPE - Introduo Linguagem C

14
NOES DE ALOCAO DINMICA
H duas maneiras de armazenar variveis na memria do computador. Primeiro por variveis globais e static locais, segundo atravs de alocao dinmica, quando o C armazena a informao em uma rea de memria livre, de acordo com a necessidade. No caso do C standard, a alocao dinmica ca disponvel com a incluso de stdio.h. A alocao dinmica de memria muito til quando se tem que trabalhar com vrias matrizes de grandes dimenses. Para cada matriz a ser utilizada pelo programa destina-se uma rea de memria suciente, e aps o seu uso, esta rea liberada para que possa ser utilizada por outras matrizes. As Figuras 14.1 e 14.2 mostram exemplos de alocao dinmica de memria.
#include <stdio.h> main( ) { int *p, t; p=(int *) malloc(40*sizeof(int)); if (!p) printf("memoria insuficiente\n"); else { for(t=0; t<40; ++t) *(p+t) = t; for(t=0; t<40; ++t) printf("%d ", *(p+t)); free(p); } } Figura 14.1: Primeiro exemplo de alocao dinmica de memria

96

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> main( ) { int i,quant; float max,min,*p; printf ("quantidade de numeros:\n"); scanf("%d", &quant); if ( !( p = (float*) malloc((quant+1)*sizeof(float))) ) { printf ("sem memoria\n"); exit(1); } printf ("digite %d numeros:\n", quant); for ( i = 1; i <= quant; i++) scanf ("%f", (p+i)); max = *(p+1); for ( i = 2; i <= quant; i++) { if (*(p+i) >= max) max = *(p+i); } printf("O maior e :%f \n", max); free(p); } Figura 14.2: Segundo exemplo de alocao dinmica de memria

15
EXERCCIOS
15.1 CAPTULO 1

1. Procurar em livros e/ou guias de referncia da Linguagem C quais so as funes das seguintes bibliotecas: string.h e math.h. Anotar o nome de todas as funes com seus respectivos tipos de retorno e seus argumentos.

2. Dizer o que fazem as seguintes funes da biblioteca stdio.h: getchar, putc, puts.

15.2

CAPTULO 2

1. Editar o programa da Figura 15.1 e fazer sua compilao. Executar o programa e dizer o que ele faz.

/* programa do Exercicio_1 capitulo_2 */ # include <stdio.h> int main ( ) { int x, y; float X, Y; printf (" \n\t Envie dois numeros inteiros \n\t "); scanf (" %d %d ", &x, &y ); X = x; Y = y; printf ( "\n\t Diviso X/Y \n"); printf ( "\n\t %f \n\t %d \n\t %d \n", X/Y, x/y, x%y); } Figura 15.1: Captulo 2: Programa para o exerccio 1

98

EDITORA - UFLA-FAEPE - Introduo Linguagem C

Para escrever os dois nmeros pedidos pelo programa, pode-se digitar o primeiro, um espao, digitar o segundo, e pressionar <ENTER>. Pode-se tambm digitar <ENTER> aps cada nmero.

15.3

CAPTULO 3

1. Editar, compilar e executar o programa da Figura 15.2.


/* programa do Exercicio_1 capitulo_3 */ # include <stdio.h> int main ( ) { int Dias; float Anos; printf ("\n\t Entre com o nmero de dias: "); scanf ("%d", &Dias); Anos = Dias/365.25; printf ("\n\n\t %d dias equivalem a %f anos.\n",Dias,Anos); } Figura 15.2: Captulo 3: programa para o exerccio 1

Dizer o que o programa faz. Explicar (comentar) o que faz cada linha. Explique porque a varivel Dias inteira e Anos oat. 2. Modique o programa anterior para que sejam requisitados o dia, o ms e o ano atuais, o dia, o ms e o ano de nascimento do usurio, e ento seja calculado e anunciado o nmero de dias vivido pelo usurio.

15.4

CAPTULO 4

1. Editar, compilar e executar o programa da Figura 15.2. 2. Modique o programa para que todos os nmeros sejam impressos com quatro algarismos antes do ponto decimal e trs algarismos aps.

15.5

CAPTULO 5

1. Dizer o que faz o programa da Figura 15.4.

Exerccios

99

/* programa do Exercicio_1 capitulo_3 */ # include <stdio.h> int main ( ) { char Ch; float x, y; printf ("\n Envie dois nmeros : "); scanf ("%f %f ", &x, &y ); printf ( "\n O produto de %f e %f eh %f ", x, y, x*y ); Ch = getchar( ); printf ( "\n O quociente de %f e %f eh %f ", x, y, x/y ); printf ( "\n A tecla pressionada foi %c \n\n", Ch ); printf ( "Fim de Programa\n" ); } Figura 15.3: Captulo 4: Programa para o exerccio 1

2. Reescrever o programa do item anterior utilizando o comando switch. Editar, compilar e executar o programa. 3. Fazer um programa em C que identique tringulos, conforme o algoritmo da Figura 15.5 4. Modicar o programa de clculo de PI (Figura 5.8), do Captulo 5, de forma que ele calcule a srie at que encontre um termo cujo valor absoluto seja menor que 0,00001. Para isto, dever ser usado um Loop while ou do-while. 5. O seno de um ngulo qualquer (dado em radianos) pode ser calculado pela srie abaixo. senA = A
A3 6

A5 120

A7 5040

Os nmeros que aparecem no denominador so os fatoriais dos expoentes de cada termo. Fazer um programa em linguagem C que calcule o seno de um ngulo dado utilizando os N primeiros termos da srie. O ngulo A(radianos) e o valor de N devero ser requisitados ao usurio do programa. 6. Reescrever o programa anterior para que o seno do ngulo seja calculado at que o mdulo do ltimo termo da srie seja menor que 0,00001.

100

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include<stdio.h> main( ) { int opcao; int valor; printf("Converter:\n"); printf(" 1: decimal para hexadecimal\n"); printf(" 2: hexadecimal para decimal\n"); printf(" 3: decimal para octal\n"); printf(" 4: octal para decimal\n"); printf("informe a sua opo:"); scanf("%d", &opcao); if(opcao==1) { printf("informe um valor em decimal:"); scanf("%d", &valor); printf("%d em hexadecimal : %x", valor, valor); } if(opcao==2) { printf("informe um valor em hexadecimal:"); scanf("%x", &valor); printf("%x em decimal : %d", valor, valor); } if(opcao==3){ printf("informe um valor em decimal:"); scanf("%d", &valor); printf("%d em octal : %o", valor, valor); } if(opcao==4){ printf("informe um valor em octal:"); scanf("%o", &valor); printf("%o em decimal : %d", valor, valor); } } Figura 15.4: Captulo 5: Programa para o exerccio 1

Exerccios

101

/* Identificao de tringulos */ Incio Ler A, B, C (reais, lados do tringulos) Se A < (B+C) e B < (A+C) e C < (A+B) /* verifica se tringulo */ Ento Se A = B e B = C Ento Imprima (Tringulo Equiltero) Seno Se A = B ou A = C ou B = C Ento Imprima (Tringulo Isceles) Seno Imprima (Tringulo Escaleno) FimSe FimSe FimSe Fim Figura 15.5: Captulo 5: Algoritmo para o exerccio 3

15.6

CAPTULO 6

1. Fazer um programa em Linguagem C que leia uma matriz de dimenses NxM, e calcule a sua transposta. Ao nal o programa apresentar a matriz e sua transposta na tela do computador. 2. Fazer um programa em Linguagem C que leia os nomes de 10 alunos de uma turma, e para cada aluno, 4 notas de 0 a 100%. Os nomes dos alunos sero armazenados em um vetor de strings, as notas sero armazenadas em uma matriz bidimensional. Sero calculadas as mdias dos alunos, (Nota1+Nota2+Nota3+Nota4)/4, e estas sero armazenadas em um vetor. Ao nal, ser apresentado um relatrio contendo 3 colunas: Nome do aluno, Mdia, Aprovao. Na coluna aprovao ser colocada a letra A (aprovado) para alunos com mdia igual ou superior a 60, e R (reprovado) para alunos com mdia inferior a 60.

15.7

CAPTULO 7

1. Editar, compilar, executar e dizer o que faz o programa da Figura 15.6.

102

EDITORA - UFLA-FAEPE - Introduo Linguagem C

#include <stdio.h> #include <string.h> main( ) { char st1[11], st2[11], st3[21], ch ; int i, j; printf ("\n Envie uma string de ate 10 caracteres "); gets(st1); printf ("\n Envie outra string de ate 10 caracteres "); gets(st2); for ( i = 0; st1[i]; i++) st3[i] = st1[i]; for ( j = 0; st2[j]; j++) st3[i+j] = st2[j]; j = j+i; puts (st3); for ( i = j; i ; i-- ) { ch = st3[i-1]; putchar (ch); putchar (\n); } puts ("\n"); } Figura 15.6: Captulo 7: programa para o exerccio 1

Explique porque as strings st1 e st2 devem ter no mximo 10 caracteres se os respectivos vetores foram declarados com 11 posies.

15.8

CAPTULOS 8 E 9

1. Fazer um programa em C que leia uma string de at 30 caracteres e armazene-a em uma varivel Stfonte. Utilizando ponteiros, copie o contedo de Stfonte para uma varivel Stdestino, de forma que a string que escrita de forma inversa. Utilizando ponteiros, apresentar as strings Stfonte e Stdestino em forma de duas colunas.

2. Refazer o programa do clculo das mdias dos alunos, Captulo 6 (Figura 6.3, utilizando ponteiros para o clculo das mdias e para a apresentao dos resultados.

Exerccios

103

15.9

CAPTULO 10

1. Fazer uma funo em C que concatena duas strings. Utilize o nome StrCat para esta funo, para no confundir com como strcat() da biblioteca string.h. 2. Editar, compilar e executar o programa da Figura 15.7
/* clculo da rea de um crculo */ #include <stdio.h> #include <math.h> float area(float raio); /* prottipo*/

main( ) { float r,res; printf("Informe o raio: "); scanf("%f", &r); res=area(r); printf("A rea : %f\n", res); } float area(float raio) { return 3.1415926 * pow(raio,2); } Figura 15.7: Captulo 10: Programa para o exerccio 2

3. Modicar o programa anterior para calcular a rea e o permetro do crculo, e calcular o volume e a rea de uma esfera de mesmo raio. Devero ser feitas 4 funes. 4. Modique o programa anterior para que ele repita os clculo para diferentes raios enviados pelo usurio. Dever ser utilizado um loop do-while onde, ao nal ser perguntado ao usurio se deseja novo clculo. O loop ser repetido at que o usurio responda N (no). 5. Fazer uma funo em C que calcule o fatorial de um nmero passado como parmetro. 6. Fazer uma funo em C que calcule o produto de duas matrizes A e B e retorne o resultado em outra matriz P.

104

EDITORA - UFLA-FAEPE - Introduo Linguagem C

15.10

CAPTULO 11

1. Fazer um programa em C que receba em sua linha de comando o nome do usurio e escreva a mensagem: Bom dia <usurio>. Onde se l <usurio> dever estar escrito o nome completo do usurio. O programa dever identicar quantos nomes foram escritos. 2. Fazer um programa em C que calcule as razes de uma equao de segundo grau. Os valores A, B, C da equao sero passados na linha de comando. Ax2 + Bx + C = 0.

15.11

CAPTULO 12

1. Fazer um programa em C para ler e armazenar em uma estrutura, os dados de uma pessoa. Os campos da estrutura DADOS sero: nome, idade, telefone, sexo (M/F).

15.12

CAPTULO 13

1. Usar a estrutura do exerccio 1 do Captulo 12 para armazenar em um vetor os dados de um conjunto de 20 pessoas, que poderiam ser por exemplo os candidatos a vagas em uma empresa.

15.13

CAPTULO 14

1. Modicar o programa do exerccio 1 do Captulo 13 para armazenar os dados em arquivo. O programa dever ter um menu de opes para trabalhar com os dados (usar o comando switch). No menu ser previsto incluso de dados, excluso de dados, e consulta. Para cada opo dever ser feita uma funo especca. Na opo consulta, dever ter um menu de opes: por nome, idade, sexo. Quando for pedida uma consulta por nome, por exemplo, devero ser apresentados todos os dados das pessoas que possuem aquele nome.

REFERNCIAS BIBLIOGRFICAS

[1] GALIC-UNICAMP, Introduo Linguagem C, UNICAMP, Campinas, 2001. [2] CPDEE-UFMG, Curso de C, UFMG, Belo Horizonte, 2000. [3] KERNIGHAN, Brian W. e RITCH, Dennis M., C: A Linguagem de Programao, Rio de Janeiro, Campus, 1986. [4] PLAUGER, P.J. e BRODIE J. Standart C: guia de referncia bsica, So Paulo, Mcgraw-Hill, 1991. 306p. [5] HANCOCK, Les e KRIEGER, Morris. Manual de Linguagem C, Rio de Janeiro, Campus,1985. 182p. [6] MIZRAHI, Viviane V. Treinamento em Linguagem C mdulo 1 e 2, So Paulo, McGraw-Hill, 1990, 241p. [7] CHILDT, Herbert. Turbo C: Guia do Usurio, So Paulo, McGraw-Hill, 1988, 414p.

Você também pode gostar