You are on page 1of 133

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

INTRODUO LINGUAGEM C

2 Edio

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 PR-REITOR ADJUNTO 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 Giacomin, Joo Carlos Introduo Linguagem C / Joo Carlos Giacomin. 2. ed. Lavras: UFLA/FAEPE, 2002. 105 p.: il. - Curso de Ps-Graduao Lato Sensu (Especializao) a Distncia: Administrao em Redes Linux Bibliograa. 1. Programa de Computador. 2. Linguagem de Programao. 3. Linguagem C. 4. Informtica. I. Giacomin, J.C. II Universidade Federal de Lavras. III. Fundao de Apoio ao Ensino, Pesquisa e Extenso. IV. Ttulo. CDD 005.133 Nenhuma parte desta publicao pode ser reproduzida, por qualquer meio ou forma , sem a prvia autorizao.

SUMRIO

1 Introduo 1.1 Linguagens de Mquina, 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 . . .

11 Linguagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de . . . . . . . . . . . . Montagem, e Linguagens de Alto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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

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 . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

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 63 63 64 64 67 68 69 70 71 71 72 72 73 73 74 75 76 76 78 78 80 81 83 83 85 89 90

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

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 Classes 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 Tipos de Dados Denidos Pelo Usurio 12.1 Estruturas . . . . . . . . . . . . . . 12.1.1 Trabalhando com Estruturas . . 12.2 Unies . . . . . . . . . . . . . . . . 12.3 Enumeraes . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

12.4 12.5

Typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Campos-de-Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91 92 97 97 97 98 99 100 100 101 101 103 105 105 105 106 106 106 109 109 110 111 112 112 112 112 113 115 115 115 116 117 117 118 120 120 121 121 124 125 126

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 . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Referncias Bibliogrcas A Bibliotecas do C A.1 assert.h . . . . . . . . . . . . . . A.2 conio.h . . . . . . . . . . . . . . . A.3 ctype.h . . . . . . . . . . . . . . . A.4 errno.h . . . . . . . . . . . . . . . A.5 limits.h . . . . . . . . . . . . . . . A.6 locale.h . . . . . . . . . . . . . . A.7 math.h . . . . . . . . . . . . . . . A.8 signal.h . . . . . . . . . . . . . . A.9 stdarg.h . . . . . . . . . . . . . . A.10 stdio.h . . . . . . . . . . . . . . . A.10.1 Algumas funes em detalhe A.10.2 Entradas e sadas formatadas A.10.3 Funes (x)scanf . . . . . . .

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

. . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

A.10.4 Funes de entrada e sada de caracteres . . . . . . . . A.11 stdlib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.11.1 Funes de manipuo de Strings . . . . . . . . . . . . A.11.2 Funes de manipulao de Memria . . . . . . . . . . A.11.3 Funes de Ambiente (Environment) . . . . . . . . . . . A.11.4 Funes de busca e ordenao (Searching and Sorting) A.11.5 Funes matemticas . . . . . . . . . . . . . . . . . . . A.11.6 Funes Multibyte . . . . . . . . . . . . . . . . . . . . . A.12 string.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.13 time.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

127 127 129 129 130 130 130 130 131 132

LISTA DE FIGURAS

1.1 1.2 1.3 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 5.13 5.14

Trecho de programa em linguagem de mquina . . . . . . . . . . . . . . . . Trecho de programa em linguagem de montagem . . . . . . . . . . . . . . . Trecho de programa em linguagem de alto nvel . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo simples de while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 8.1 8.2 8.3 8.4 8.5 8.6 9.1 9.2 9.3 9.4 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 11.1 11.2

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 Exemplos de declaraes de ponteiros Atribuio de valor a um ponteiro . . . Utilizao de ponteiros . . . . . . . . . Operaes com Ponteiros . . . . . . . Ponteiros para ponteiros . . . . . . . . Exemplo do erro de ponteiro perdido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

Inverso de uma string usando uma funo que recebe um ponteiro Um codicador simples . . . . . . . . . . . . . . . . . . . . . . . . . Funo com retorno de inteiro . . . . . . . . . . . . . . . . . . . . . . Parmetros formais de uma funo . . . . . . . . . . . . . . . . . . . Passagem de valor de uma varivel para uma funo . . . . . . . . Funo que utiliza passagem por referncia . . . . . . . . . . . . . . Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . . Variveis globais em um programa . . . . . . . . . . . . . . . . . . . Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . . Funo que utiliza uma matriz . . . . . . . . . . . . . . . . . . . . . . Funo que opera sobre uma matriz utilizando um ponteiro . . . . . Funo que procura uma substring dentro de uma string . . . . . . . Alterando valores de uma matriz . . . . . . . . . . . . . . . . . . . .

Programa que recebe uma string na linha de comando . . . . . . . . . . . . Programa que recebe argumentos na linha de comando . . . . . . . . . . .

12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.11 12.12 12.13 12.14 13.1 13.2 14.1 14.2 15.1 15.2 15.3 15.4 15.5 15.6 15.7

Forma geral de declarao de uma estrutura . . . . . . . . . . . . Declarao de uma estrutura para clientes de um banco . . . . . . Exemplos de acesso a membros de variveis do tipo estrutura . . Exemplos de passagens de elementos de estruturas para funes Exemplo de passagem de uma estrutura inteira para uma funo . Exemplo de ponteiro para estrutura . . . . . . . . . . . . . . . . . . Exemplo de passagem de uma estrutura inteira para uma funo . Forma geral de declarao de uma unio . . . . . . . . . . . . . . Declaraes de unies e formas de utilizao . . . . . . . . . . . . Exemplo de enumerao . . . . . . . . . . . . . . . . . . . . . . . Exemplo de utilizao de uma enumerao . . . . . . . . . . . . . Utilizando typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . Forma geral de campos-de-bits . . . . . . . . . . . . . . . . . . . . Exemplo de estrutura de campos-de-bits . . . . . . . . . . . . . . .

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

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

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

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

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

84 84 86 87 88 89 89 90 93 94 94 95 95 96

Escrevendo e lendo em arquivo . . . . . . . . . . . . . . . . . . . . . . . . . 98 Uso da funo exit na abertura de arquivos . . . . . . . . . . . . . . . . . . 100 Primeiro exemplo de alocao dinmica de memria . . . . . . . . . . . . . 103 Segundo exemplo de alocao dinmica de memria . . . . . . . . . . . . 104 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 106 107 108 109 110 111

LISTA DE TABELAS

3.1 3.2 3.3 3.4 3.5 3.6 4.1 13.1

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 99

Caracteres de controle da funo printf . . . . . . . . . . . . . . . . . . . . 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: Linguagens de mquina,

Linguagens de montagem, 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, 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 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 reservadas 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. 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 ser letras, nmeros ou

Sintaxe

23

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:

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

 %   %  % # 10)('&$"  5   5 % 5 1"0)04%

       

!   2 3

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 long
  

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.

2 3

" #!

long double

 2 0# 3

 

" ! #

 

 #

oat double

  

 # #

 

% )

  1   1 #   #   #
 

 

  

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

 # &" 2 3
 

# % ()

 

Ponto Flutuante
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

# #

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

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

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

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

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 tabulao 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.

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




 

Estruturas de Controle de Fluxo

45

#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 . 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

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

para um

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 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. A Figura 8.1 mostra exemplos de declaraes.
int *pt; char *temp, *pt2; Figura 8.1: Exemplos de declaraes de ponteiros

62

EDITORA - UFLA/FAEPE - Introduo Linguagem C

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 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 da Figura 8.2.

int count; int *pt; pt = &count; Figura 8.2: Atribuio de valor a um ponteiro

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.

Ponteiros

63

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.3 apresenta um programa que exemplica a utilizao de ponteiros para acessar um varivel x.
#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.3: 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

64

EDITORA - UFLA/FAEPE - Introduo Linguagem C

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-- */

No exemplo da Figura 8.4, 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 */

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.5 apresenta um programa exemplo. float **balano; // balano um ponteiro para um ponteiro float.

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. No trecho de programa da Figura 8.6, 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.

Ponteiros

65

# 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.4: Operaes com Ponteiros # include <stdio.h> main( ) { int x,*p,**q; x=10; p=&x; q=&p; printf("%d",**q); } Figura 8.5: Ponteiros para ponteiros int *p; x = 10; *p = x; Figura 8.6: Exemplo do erro de ponteiro perdido

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

CLASSES 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
TIPOS DE DADOS DEFINIDOS PELO USURIO

A linguagem C permite ao programador criar seus prprios tipos de dados de cinco formas diferentes: Estruturas, Campo-bit, Unio, Enumerao e Tipo-denido. A Estrutura (structure) um agrupamento de variveis sob um mesmo nome, o Campo-bit um tipo de Estrutura que permite acesso individualizado aos bits de uma varivel, a Unio (union) permite que duas ou mais variveis de tipos diferentes utilizem a mesma posio de memria alternadamente, a Enumerao (enum) uma lista de smbolos, e o Tipo-denido seria melhor chamado como Tipo-redenido, porque utiliza o comando typedef para dar um outro nome a um tipo de dado j existente.

12.1

ESTRUTURAS

Ao manusearmos dados, muitas vezes nos deparamos com informaes que no so fceis de armazenar em variveis escalares como so os tipos inteiro e ponto utuante, mas na verdade so conjuntos de coisas. Estes tipos de dados so compostos por vrios tipos bsicos do C. Uma estrutura uma coleo de variveis referenciadas por um nico nome, provendo um meio conveniente de manter informaes relacionadas agrupadas. Uma declarao de estrutura forma um modelo que pode ser usado para criar variveis de estruturas. As variveis que compreendem a estrutura so chamadas de membros da estrutura ou campos da estrutura. A palavra reservada struct usada para denir uma estrutura, como indicado na formulao geral da Figura refg:estrutura.txt. O identificador d nome ao novo tipo de varivel estrutura criado, no exemplo, variveis_estrutura uma lista de variveis do tipo identificador, este item opcional na declarao da estrutura. A gura 2 apresenta um exemplo simples de uma estrutura que poderia ser usada para o banco de dados de clientes de uma agncia bancria. As variveis estrutura so declaradas de duas formas diferentes, primeiro imediatamente aps a declarao da estrutura, depois, de forma separada.

84

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct identificador { tipo nome_de_elemento_1; tipo nome_de_elemento_2; ... tipo nome_de_elemento_N; } variveis_estrutura; Figura 12.1: Forma geral de declarao de uma estrutura

struct Conta_Banco { int Num_conta; unsigned long int CPF; int Digitos_CPF; char nome[30]; char Sexo; float Saldo; int Data_Abertura [8]; } Gerente, Cliente_padrao[1000], Cliente_especial[100]; struct Conta_Banco { int Num_conta; unsigned long int CPF; int Digitos_CPF; char nome[30]; char Sexo; float Saldo; int Data_Abertura [8]; }; struct Conta_Banco Gerente, Cliente_padrao[1000], Cliente_especial[100]; Figura 12.2: Declarao de uma estrutura para clientes de um banco

No exemplo da Figura 12.2, a estrutura Conta_Banco possue 7 campos, sendo o primeiro, um inteiro que armazena o nmero da conta, que podemos dizer que deve ter no mximo 4 dgitos. O segundo e o terceiro campos so um nmero inteiro que dever comportar os 9 algarismos do CPF e um inteiro para guardar o par de digitos vericadores do CPF. Depois utilizada uma string para armazenar o nome e sobrenome do cliente, e

Tipos de Dados Denidos Pelo Usurio

85

um char para idienticar o sexo (M ou F). Um float armazena o saldo do cliente e um vetor de inteiros indica a data da abertura da conta. Os membros de uma estrutura podem ser qualquer tipo de dados conhecidos da linguagem C, inclusive ponteiros, ou podem ser outros tipos de dados criados pelo programador, inclusive outras estruturas. 12.1.1 Trabalhando com Estruturas

Aps criar o novo tipo de varivel, no caso uma estrutura, temos que criar algumas variveis deste tipo, e depois utiliz-las no programa. como criar uma varivel de qualquer outro tipo, int, char, etc. Na Figura 12.2 foram mostradas duas formas de criar variveis do tipo estrutura, uma forma declarar a varivel logo aps a declarao da estrutura e a outra forma declarar a varivel como outra qualquer na lista declarao de variveis. Vamos utilizar o exemplo da segunda forma. Foram criadas trs variveis. A primeira uma varivel simples, Gerente. A segunda e a terceira so vetores (matrizes unidimensionais) que armazenam vrias variveis do tipo Conta_Banco. Matrizes de estruturas so muito usadas, para declar-la primeiro dene-se a estrutura e ento declara uma varivel matriz daquele tipo. Para acessar uma estrutura especca, o nome da estrutura indexado. Como acessar os campos individuais dentro de cada varivel estrutura ? Membros individuais da estrutura so referenciados pelo uso do operador de seleo de membro: o ponto. A Figura 12.3 apresenta um trecho de cdigo com vrias referncias aos membros das variveis declaradas na Figura 12.2. A primeira atribui um saldo conta do gerente (varivel Gerente). Se duas variveis so do mesmo tipo, pode-se atribuir uma a outra. Neste caso todos os elementos do lado esquerdo da atribuio recebero os valores dos elementos correspondentes da estrutura do lado direito.

Passando elementos da estrutura para funes A passagem de elementos de estruturas para funes no tem segredos, feita como a passagem de qualquer parmetro, podendo ser por valor ou por referncia. A nica coisa que o programador deve observar que o tipo da varivel que receber o valor na funo tem que ser o mesmo tipo do parmetro da estrutura que est sendo passado. A Figura 12.4 mostra alguns exemplos de passagens, e um exemplo incorreto.

86

EDITORA - UFLA/FAEPE - Introduo Linguagem C

int main (void) { int i, j; float recebe; char Nome[30] struct Conta_Banco Gerente, Cliente_padrao[1000], Cliente_especial[100]; ... Gerente.Saldo = 12947.51; ... i = 12; Nome = Cliente_especial[i].Nome; ... Cliente_especial[10].Sexo = F; ... for (j = 500; j <510; j++) printf("\n\n Nome do cliente %d = %s ", j, Cliente_padro[j].Nome); ... /* Fim do Programa */ Figura 12.3: Exemplos de acesso a membros de variveis do tipo estrutura

Passsando estruturas inteiras para funes Quando uma estrutura usada como argumento para uma funo, a estrutura inteira passada usando o mtodo padro de chamada por valor. Qualquer modicao feita na varivel estrutura dentro da funo no afetar a varivel usada para chamar a funo. Quando usar uma estrutura como um parmetro, lembre-se de que o tipo de argumento deve coincidir com o tipo de parmetro. No exemplo da Figura 12.5, tanto a varivel de chamada, arg, quanto o parmetro que a recebe na funo, param, so do tipo struct exemplo.

Tipos de Dados Denidos Pelo Usurio

87

struct Conta_Banco { int Num_conta; unsigned long int CPF; int Digtos_CPF; char nome[30]; char Sexo; float Saldo; int Data_Abertura [8]; }; /* funo para atualizar saldo de uma conta cujo nmero est sendo passado int Atualiza_Saldo( int Numero, float Saldo_Novo) { procedimentos da funo; return 0; /* se a funo teve sucesso, retorna zero */ } /* funo para atualizar Nome de cliente, por exemplo, de Joao Giacomin para: Joao C. Giacomin */ int Atualiza_Nome( char Velho[30], Novo[30]) { strcpy(Velho,Novo]; return 0; } main( ) { int float char struct */

Numero; Saldo; Nome[30], Nome_Novo[30]; Conta_Banco Gerente, Cliente_padrao[1000], Cliente_especial[100];

/* Inicializar programa e variveis */ ... Atualiza_Saldo(Numero, 1893.20); /* passagem por valor */ ... Saldo = 34587.9; Atualiza_Saldo(Gerente.Num_conta, Saldo); /* passagem por valor */ ... Saldo = 187.09; Atualiza_Saldo(Cliente_padrao[273].Num_conta, Saldo); /* passagem por valor ... scanf("%s",Nome_Novo); Atualiza_Nome(Cliente_especial[12].nome, &Nome_Novo[0]); /* passagem por referncia */ ... Atualiza_Saldo(Gerente.Sexo, 1893.20) ; /* Erro - atribuio de um char a um int */ ... }

*/

Figura 12.4: Exemplos de passagens de elementos de estruturas para funes

Ponteiros para estruturas A linguagem C permite ponteiros para estruturas da mesma maneira que aceita ponteiros para qualquer outro tipo de varivel.

88

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct exemplo { int a,b; char ch; };

void func_1(struct exemplo); /* prottipo */ int main( ) { struct exemplo arg; arg.a=arg.b=1000; ch=a; func_1(arg); return 0; } void func_1(struct exemplo parm) { printf("%d\n%d\n%c",parm.a,parm.b,parm.ch); } Figura 12.5: Exemplo de passagem de uma estrutura inteira para uma funo

Para declarar um ponteiro para estrutura coloca-se o operador * na frente do nome da varivel. Exemplo: struct Conta_Banco *inf_cliente; Pode-se passar toda a estrutura para uma funo, mas isto se torna invivel enquanto as estruturas se tornam cada vez maiores. O grande problema quando se trabalha com estrutruras grandes o tempo gasto para passar todos os parmetros pela pilha, isto passa a demandar muito tempo de execuo. A soluo para esse problema passar somente um ponteiro para a funo (Figura 12.6). Para encontrar o endereo de uma varivel estrutura, o operador & colocado antes do nome da varivel estrutura. O operador * raramente utilizado quando trabalhamos com ponteiros para estruturas. Para o acesso a um membro de uma estrutura, existe um operador especial denido pela linguagem C, o operador seta, que composto pelo sinal negativo seguido pelo sinal de maior: ->. A Figura 12.7 apresenta a utilizao deste operador no exemplo da Figura 12.6

Tipos de Dados Denidos Pelo Usurio

89

struct Conta_Banco { /* a mesma estrutura da figura 12.4 };

*/

int main( ) { struct Conta_Banco Gerente, *p_Conta; /* declara um ponteiro para uma estrutura Conta_Banco */ p_Conta = &Gerente; /* coloca o endereo de Gerente no ponteiro

*/

printf(" \n Saldo do Gerente = %f ", (*p_Conta).saldo); return 0; } Figura 12.6: Exemplo de ponteiro para estrutura

int main( ) { struct Conta_Banco p_Conta = &Gerente;

Gerente, *p_Conta;

printf(" \n Saldo do Gerente = %f ", p_Conta->saldo); return 0; } Figura 12.7: Exemplo de passagem de uma estrutura inteira para uma funo

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, como mostrado na Figura 12.8. As variveis_union no precisam ser declaradas imediatamente aps a declarao da union, elas podem ser declaradas posteriormente como se declaram as variveis inteiras e de ponto utuante.

90

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Quando uma varivel union declarada, o compilador cria automaticamente uma varivel grande o bastante para armazenar o tipo da varivel de maior tamanho na union.
union nome_da_union { tipo_1 nome_1; tipo_2 nome_2; ... tipo_n nome_n; } variveis_union; Figura 12.8: Forma geral de declarao de uma unio

A Figura 12.9 apresenta dois exemplos de unies, a primeira possui elementos do mesmo tipo, float, e a segunda de tipos diferentes. So mostradas tambm formas diferentes de se acessar os elementos das unies. Unies podem ser feitas com variveis de diferentes tipos. Neste caso, a memria alocada corresponde ao tamanho da maior varivel na union. No exemplo da Figura 12.9, ao se colocar o valor 54.14 na varivel Temp_1.Faren, este valor foi atribuido tambm a Temp_1.Celcius, porque Faren e Celcius ocupam a mesma posio de memria da varivel Temp_1. Por isso no foi mais possvel recuperar o valor 12.3. A unio Identificador abriga trs tipos de variveis diferentes, portanto, muito cuidado deve ser tomado na sua utilizao. Edite e execute o programa da Figura 12.9 e verique alguns possveis erros que podero ocorrer na execuo da funo printf. Evite armazenar uma varivel de um tipo em uma union e acess-la como varivel de outro tipo. Finalmente, verique no exemplo da Figura 12.9 que o acesso a um elemento union utiliza a mesma sintaxe das estruturas: os operadores ponto e seta. Quando se opera diretamente na union, usa-se o operador ponto. Se a varivel union acessada por meio de um ponteiro, usa-se o operador seta. As formas de passar variveis tipo union para funes so as mesmas da passagem de variveis struct.

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 de um tipo especco pode ter. So denidas de modo semelhante s estruturas com a palavra reservada enum usada para indicar o incio de um tipo enumerado. As enumeraes so denidas como as estruturas, coloca-se a palavra chave enum, depois uma lista de palavras entre chaves e em seguida os nomes das variveis que tero

Tipos de Dados Denidos Pelo Usurio

91

este tipo de enumerao. Tal como nas estruturas e unies, os nomes das variveis no precisam vir imediatamente aps a declarao da enumerao. A Figura 12.10 apresenta um exemplo de enumerao que um aluno utiliza para organizar seu horrio de aulas semanais. A varivel semana uma enumerao dos dias da semana. O ponto-chave para o entendimento das enumeraes que cada smbolo representa um valor inteiro. Dessa forma, eles podem ser usados em qualquer lugar em que um inteiro possa ser usado. Se no for atribuido nenhum valor aos smbolos, como no exemplo, seus valores estaro em seqncia iniciando de zero. Portanto, neste exemplo, Dom = 0, Seg = 1, e Sab = 6. Se quisssemos mudar esta seqncia, poderamos atribuir alguns valores, por exemplo, se atribussemos o valor 5 ao smbolo Seg, na declarao da enumerao (Seg = 5), ento teramos: Dom = 0, Seg = 5, Ter = 6, . . . , Sab = 10. Se o usurio tivesse a inteno de utilizar esta enumerao em uma chave, comando switch, e gostaria que cada dia da semana correspondesse ao seu nmero de ordem. Portanto, atribuiria apenas o primeiro smbolo, Dom=1, e os outros viriam na seqncia, como pode ser visto na Figura 12.11. Verique, neste exemplo, que poderiam ser colocados os valores inteiros de 1 a 7 no lugar dos smbolos de Seg a Dom, mas da forma como foi feito o programa cou bem mais legvel. Para nalizar, eu vou chamar a ateno para um fato curioso. Se cada smbolo corresponde a um inteiro, ento pode-se atribuir os smbolos a variveis inteiras. Por exemplo, se o programador quisesse saber as aulas de amanh, poderia ter somado 1 ao valor da varivel Dia, ou poderia ter feito no programa a seguinte atribuio: Dia = Qui. Assim poderia pesquisar o horrio de quinta-feira, que o dia correspondente ao nmero inteiro 5.

12.4

TYPEDEF

A linguagem C permite denir explicitamente novos nomes de tipos de dados conhecidos, usando-se a palavra reservada typedef. No se cria um novo tipo de dado, mas, ao contrrio, dene-se um novo nome para um tipo existente. Forma geral: typedef tipo nome; Onde tipo qualquer tipo de dado permitido e nome o novo nome para esse tipo. O typedef poderia se utilizado para chamar de Real qualquer varivel do tipo float. A vantagem de se fazer isto que a palavra Real nos traduz melhor o sentido dos nmeros em ponto utuante que a palavra float.

92

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Mas no h problema em se fazer isto? No, o compilador vai ler todas as declaraes de variveis tipo Real, vai traduzir a palavra Real para float e depois compilar normalmente. O typedef torna-se especialmente til quando deseja-se utilizar um identicador nico para um tipo novo de varivel que foi criada, como uma struct, ou uma union, ou uma enum. Dois exemplos de utilizao de typedef podem ser vistos na Figura 12.12, que uma forma diferente do exemplo da Figura 12.9 Verique que a nica diferena agora que preciso escrever apenas um identicador, u_graus, para declarar uma varivel deste tipo de unio, e no escrever dois identicadores, union graus. Isto traz mais legibilidade ao programa.

12.5

CAMPOS-DE-BITS

Campos bit so uma extenso da estrutura simples que permite que os bits individuais de uma determinada estrutura sejam acessados. A linguagem C tem um modo prprio de acessar um ou mais bits dentro de um byte ou palavra. Isso pode ser til por diversas razes: primeiro, se o espao limitado, pode-se armazenar muitas variveis booleanas (true/false) em um byte; segundo, certas interfaces de dispositivos transmitem informaes codicadas em bits dentro de um byte; e terceiro, certas rotinas de codicao de dados necessitam acessar os bits dentro de um byte. Um mtodo que a linguagem C utiliza para acessar os bits baseia-se na estrutura chamada campos-bit. Um campo-bit somente um tipo de membro de estrutura que dene o quo grande, em bits, cada elemento deve ser. A Figura 12.13 apresenta a forma geral de uma estrutura tipo campos-de-bits. Verique que se trata de uma estrutura, mas o tamanho de cada elemento, ou campo, denido em bits. Os tamanhos indicados acima so dados em nmeros de bits. Vamos, por exemplo, declarar uma estrutura de campos bit que nos permite acesso a um byte pedao por pedao. A Figura 12.14 apresenta um exemplo de estrutura de campos-de-bits. As variveis campos-de-bits possuem certas restries: no se pode obter seu endereo; no podem ser colocadas em matrizes; no se pode sobrepor o limite dos inteiros. No entanto vlido misturar membros normais de estrutura com elementos compos-bit. Os membros, ou campos, das variveis deste tipo podem ser acessados tal como so acessados os membros de uma estrutura comum.

Tipos de Dados Denidos Pelo Usurio

93

union graus { float Celcius; float Faren; }; union Identificador { char Letra; int Inteiro; float Real; } int main ( ) { union graus Temp_1, Temp_2, *p_T; / * p_T um ponteiro tipo union graus union Ientificador Id_1, Id_2; Temp_1.Celcius = 12.3; Temp_2.Faren = (Temp_1.Celcius + 40) * 9 / 5 p_T = &Temp_1; p_T->Faren = Temp_2.Faren; /* /* Aqui o nmero 12.3 de Temp_1 foi substitudo por 54.14 calculado acima */ Se for feita uma tentativa de ler o valor 12.3, s se conseguir 54.14 */

*/

- 40;

printf ("\n Temperatura = %f ", Temp_1.Celcius); /* Ser impresso o valor 54.14 */ Identificador.Letra = A ; printf ("\n Letra = %c \n Inteiro = %d \n Real = %f ", Identificador.Letra, Identificador.Inteiro, Identificador.Real); return 0; } Figura 12.9: Declaraes de unies e formas de utilizao

94

EDITORA - UFLA/FAEPE - Introduo Linguagem C

enum Semana {Dom, Seg, Ter, Qua, Qui, Sex, Sab} Escola; Figura 12.10: Exemplo de enumerao

enum Semana {Dom = 1, Seg, Ter, Qua, Qui, Sex, Sab}; int main ( ) { int Dia ; enum Semana Escola; scanf("%d", Dia); switch(Dia) { case Seg: printf break; case Ter: printf break; case Qua: printf break; case Qui: printf break; case Sex: printf break; case Sab: case Dom: printf break; default: printf } return 0; } Figura 12.11: Exemplo de utilizao de uma enumerao

("\n Portugues\n Matematica\n Geografia\n"); ("\n Ingles\n Histria\n Matematica\n"); ("\n Geografia\n Matemtica\n Portugues\n"); ("\n Matematica\n Geografia\n Ingles\n"); ("\n Histria\n Portugues\n Geografia\n");

("\n Fim de semana\n"); ("\n Dia errado\n");

Tipos de Dados Denidos Pelo Usurio

95

union graus { float Celcius; float Faren; }; typedef union graus int main ( u_graus u_graus u_graus u_graus;

) { Temp_1 Temp_2; *p_T; /* p_T um ponteiro tipo union graus */

Temp_1.Celcius = 12.3; Temp_2.Faren = (Temp_1.Celcius + 40) * 9 / 5 p_T = &Temp_1; p_T -> Faren = Temp_2.Faren; printf ( "\n Temperatura = %f return 0; } Figura 12.12: Utilizando typedef

- 40;

", Temp_1.Celcius );

struct nome_do_tipo_estrutura { tipo nome_1: tamanho_1; tipo nome_2: tamanho_2; ... tipo nome_N: tamanho_N; } Figura 12.13: Forma geral de campos-de-bits

96

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct nome_do_tipo_estrutura { tipo nome_1: tamanho_1; tipo nome_2: tamanho_2; ... tipo nome_N: tamanho_N; } Figura 12.14: Exemplo de estrutura de campos-de-bits

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.

98

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

Poderamos ento, para abrir um arquivo binrio, escrever:


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 :

Noes de Manipulao de Arquivos

99

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

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 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():

100

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

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 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

Noes de Manipulao de Arquivos

101

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 automaticamente 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);

102

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

104

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

106

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

107

/* 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.

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.

! 

108

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

109

/* 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.

110

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

111

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.

112

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. .

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] GACLI-UNICAMP, Introduo Linguagem C, UNICAMP, Campinas, 2001. [2] CPDEE-UFMG, Curso de C, UFMG, Belo Horizonte, 2000. [3] KERNIGHAN, Brian W. e RITCHIE, 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. C Completo e Total, So Paulo, Makron Books, 1996, 830p.

114

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A
BIBLIOTECAS DO C
Ser apresentada aqui uma lista de todas as funes do padro ANSI-C, e algumas que no pertencem ao grupo ANSI-C, mas que so implementadas em vrios compiladores. As funes que no pertencem ao padro sero indicadas como tal. A lista seguir a ordem alfabtica dos nomes das bibliotecas.

A.1

ASSERT.H

Funes void assert(int test);

A.2

CONIO.H

Embora no seja uma biblioteca do padro ANSI-C, conio.h citada aqui por ser implementada em vrios compiladores e ser utilizada por muitos programadores. Funes cgets ( ); char *cgets(char *str); clreol ( ); void clreol(void); clrscr ( ); void clrscr(void); cprintf ( ); int cprintf (const char *format [, argument, ...]); cputs ( ); int cputs(const char *str); cscanf ( ); int cscanf (char *format [, address, ...]); delline ( ); void delline(void); getch ( ); int getch(void); getche ( ); int getche(void); getpass ( ); char *getpass(const char *prompt);

116

EDITORA - UFLA/FAEPE - Introduo Linguagem C

gettext ( ); int gettext(int left, int top, int right, int bottom, void* destin); gettextinfo ( ); void gettextinfo(struct text_info *r); gotoxy ( ); void gotoxy(int x, int y); highvideo ( ); void highvideo(void); insline ( ); void insline(void); inp ( ); int inp(unsigned portid); inpw ( ); unsigned inpw(unsigned portid); kbhit ( ); int kbhit(void); lowvideo ( ); void lowvideo(void); movetext ( ); int movetext(int left, int top, int right, int bottom, int destleft, int desttop); normvideo ( ); void normvideo(void); outp ( ); int outp(unsigned portid, int value); outpw ( ); unsigned outpw(unsigned portid, unsigned value); putch ( ); int putch(int ch); puttext ( ); int puttext(int left, int top, int right, int bottom, void* source); _setcursortype ( ); void _setcursortype(int cur_t); textattr ( ); void textattr(int newattr); textbackground ( ); void textbackground(int newcolor); textcolor ( ); void textcolor(int newcolor); textmode ( ); void textmode(int newmode); ungetch ( ); int ungetch(int ch); wherex ( ); int wherex(void); wherey ( ); int wherey(void); window ( ); void window(int left, int top, int right, int bottom);

A.3 CTYPE.H As funes da biblioteca ctype.h so usadas para testar e converter caracteres. Um caractere de controle refere-se ao caractere que no parte do conjunto normal de impresso. No conjunto de caracteres ASCII, os caracteres de controle so os caracteres de 0 (NUL) at 0x1F (US), e o caractere 0x7F (DEL). Os caracteres imprimveis so aqueles que vo de 0x20 (space) at 0x7E (tilde).

Bibliotecas do C

117

Funes isalnum; int isalnum(int character); isalpha; int isalpha(int character); iscntrl; int iscntrl(int character); isdigit; int isdigit(int character); isgraph; int isgraph(int character); islower; int islower(int character); isprint; int isprint(int character); ispunct; int ispunct(int character); isspace; int isspace(int character); isupper; int isupper(int character); isxdigit; int isxdigit(int character); tolower; int tolower(int character); toupper; int toupper(int character);

A.4

ERRNO.H

Varivel errno int errno; Macros EDOM #define EDOM <valor> ERANGE #define ERANGE <valor>

A.5

LIMITS.H

CHAR_BIT CHAR_MAX CHAR_MIN INT_MAX INT_MIN LONG_MAX LONG_MIN SCHAR_MAX

118

EDITORA - UFLA/FAEPE - Introduo Linguagem C

SCHAR_MIN SHRT_MAX SHRT_MIN UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX Os valores a seguir so denidos por diretivas #define . Estes valores so dependentes de implementao, mas no podem ser menores do que estas especicaes. CHAR_BIT 8 Nmero de bits em um byte. SCHAR_MIN -127 Mnimo valor para um signed char. SCHAR_MAX +127 Mximo valor para um signed char. UCHAR_MAX 255 Mximo valor para um unsigned char. CHAR_MIN Estes denem os valores mnimo e CHAR_MAX mximo para um char. Se um char estiver sendo representado como um signed integer, ento, seus valores sero os mesmos que do signed char (SCHAR). Caso contrrio, CHAR_MIN 0 e CHAR_MAX o mesmo que UCHAR_MAX. MB_LEN_MAX 1 Mximo nmero de bytes em um multibyte character. SHRT_MIN -32767 Mnimo valor para um short int. SHRT_MAX +32767 Mximo valor para um short int. USHRT_MAX 65535 Mximo valor para um unsigned short int. INT_MIN -32767 Mnimo valor para um int. INT_MAX +32767 Mximo valor para um int. UINT_MAX 65535 Mximo valor para um unsigned int. LONG_MIN -2147483647 Mnimo valor para um long int. LONG_MAX +2147483647 Mximo valor para um long int. ULONG_MAX 4294967295 Mximo valor para um unsigned long int.

A.6 LOCALE.H Variveis struct lconv

Bibliotecas do C

119

Macros NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME

Funes localeconv( ); setlocale( ); char *setlocale(int category, const char *locale);

Variveis e Denies A estrutura lconv contm as seguintes variveis em qualquer ordem: char char char char char char char char char char char char char char char char char char *decimal_point; *thousands_sep; *grouping; *int_curr_symbol; *currency_symbol; *mon_decimal_point; *mon_thousands_sep; *mon_grouping; *positive_sign; *negative_sign; int_frac_digits; frac_digits; p_cs_precedes; p_sep_by_space; n_cs_precedes; n_sep_by_space; p_sign_posn; n_sign_posn;

120

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A.7 MATH.H Macros HUGE_VAL Funes acos( ); double acos(double x); asin( ); double asin(double x); atan( ); double atan(double x); atan2( ); double atan2(double y ,double x); ceil( ); double ceil(double x); cos( ); double cos(double x); cosh( ); double cosh(double x); exp( ); double exp(double x); fabs( ); double fabs(double x); floor( ); double floor(double x); fmod( ); double fmod(double x, double y); frexp( ); double frexp(double value, int *exp); ldexp( ); double ldexp(double x, int exp); log( ); double log(double x); log10( ); double log10(double x); modf( ); double modf(double value, double *iptr); pow( ); double pow(double x, double y); sin( ); double sin(double x); sinh( ); double sinh(double x); [sqrt( );] double sqrt(double x); tan( ); double tan(double x); tanh( ); double tanh(double x);

A.8 SIGNAL.H Macros SIG_DFL SIG_ERR

Bibliotecas do C

121

SIG_IGN SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM Funes signal( ) void (*signal(int sig, void (*func)(int)))(int); raise( ) int raise(int sig); Variveis e denies typedef sig_atomic_t SIG_ERR Represents a signal error. SIG_IGN Signal ignore

A.9

STDARG.H

A biblioteca stdarg dene algumas macros usadas para obter argumentos em uma funo quando o nmero de argumentos no conhecido. Macros va_start( ) void va_start(va_list ap, last_arg); va_arg( ) type va_arg(va_list ap, type); va_end( ) void va_end(va_list ap);

A.10

STDIO.H A biblioteca stdio fornece funes para implementar entrada e sada.

Macros NULL _IOFBF _IOLBF

122

EDITORA - UFLA/FAEPE - Introduo Linguagem C

_IONBF BUFSIZ EOF FOPEN_MAX FILENAME_MAX L_tmpnam SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout Funes clearerr( ); void clearerr(FILE *stream); fclose( ); int fclose(FILE *stream); feof( ); int feof(FILE *stream); ferror( ); int ferror(FILE *stream); fflush( ); int fflush(FILE *stream); fgetpos( ); int fgetpos(FILE *stream, fpos_t *pos); fopen( ); FILE *fopen(const char *filename, const char *mode); fread( ); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); freopen( ); FILE *freopen(const char *filename, const char *mode,FILE *stream); fseek( ); int fseek(FILE *stream, long int offset, int whence); fsetpos( ); int fsetpos(FILE *stream, const fpos_t *pos); ftell( ); long int ftell(FILE *stream); fwrite( ); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); remove( ); int remove(const char *filename); rename( ); int rename(const char *old_filename, const char *new_filename); rewind( ); void rewind(FILE *stream); setbuf( ); void setbuf(FILE *stream, char *buffer); setvbuf( ); int setvbuf(FILE *stream, char *buffer, int mode, size_t size);

Bibliotecas do C

123

tmpfile( ); FILE *tmpfile(void); tmpnam( ); char *tmpnam(char *str); fprintf( ); int fprintf(FILE *stream, const char *format, ...); fscanf( ); int fscanf(FILE *stream, const char *format, ...); printf( ); int printf(const char *format, ...); scanf( ); int scanf(const char *format, ...); sprintf( ); int sprintf(char *str, const char *format, ...); sscanf( ); int sscanf(const char *str, const char *format, ...); vfprintf( ); int vfprintf(FILE *stream, const char *format, va_list arg); vprintf( ); int vprintf(const char *format, va_list arg); vsprintf( ); int vsprintf(char *str, const char *format, va_list arg); fgetc( ); int fgetc(FILE *stream); fgets( ); char *fgets(char *str, int N, FILE *stream); fputc( ); int fputc(int char, FILE *stream); fputs( ); int fputs(const char *str, FILE *stream); getc( ); int getc(FILE *stream); getchar( ); int getchar(void); gets( ); char *gets(char *str); putc( ); int putc(int char, FILE *stream); putchar( ); int putchar(int char); puts( ); int puts(const char *str); ungetc( ); int ungetc(int char, FILE *stream); perror( ); void perror(const char *str); Variveis typedef size_t typedef FILE typedef fpos_t Variveis e Denies size_t o resultado inteiro sem sinal do tamanho da palavra-chave (sizeof keyword ). FILE um tipo til para armzenar informaes de um arquivo (le stream). fpos_t um tipo til para armazenar qualquer posio em um arquivo. NULL o valor ce uma constante ponteiro nulo (null pointer constant).

124

EDITORA - UFLA/FAEPE - Introduo Linguagem C

_IOFBF, _IOLBF, e _IONBF so usadas na funo setvbuf. BUFSIZ um inteiro que representa o tamanho do buffer usado pela funo setbuf. EOF um inteiro negativo que indica que o nal do arquivo (end-of-le) foi alcanado. FOPEN_MAX um inteiro que representa o mximo nmero de arquivos que o sistema pode garantir que podem car abertos ao mesmo tempo. FILENAME_MAX um inteiro que representa o comprimento mximo de um vetor de char disponvel para manter o maior nome de arquivo possvel. L_tmpnam um inteiro que representa o maior comprimento de um vetor de char disponvel para manter o maior nome de arquivo temporrio possvel criado pela funo tmpnam. SEEK_CUR, SEEK_END, e SEEK_SET so usados na funo fseek. TMP_MAX o mximo nmero de nomes de arquivos nicos (unique lenames) que a funo tmpnam pode gerar. stderr, stdin, e stdout so ponteiros para tipos arquivos (FILE types) os quais correspondem aos standard error, standard input, e standard output streams. A.10.1 fopen Declarao: FILE *fopen(const char *filename, const char *mode); Abre um arquivo apontado por filename. O argumento mode pode ser uma das seguintes constantes strings: r modo texto para leitura w modo texto para escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a modo texto para adicionar escrita append text mode (abre ou cria um arquivo e aponta para o nal do arquivo end-of-le) rb modo binrio de leitura read binary mode wb modo binrio de escrita write binary mode ab modo binrio para adicionar escrita (abre ou cria um arquivo e aponta para o nal do arquivo end-of-le) r+ modo texto para leitura e escrita. w+ modo texto para leitura e escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a+ modo texto para leitura e escrita r+b ou rb+ modo binrio para leitura e escrita. Algumas funes em detalhe

Bibliotecas do C

125

w+b ou wb+ modo binrio para leitura e escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a+b ou ab+ modo binrio para leitura e escrita (abre ou cria um arquivo e ajusta o ponteiro para o nal do arquivo end-of-le) Se o arquivo no existir e for feita uma operao de abertura no modo read (r), ento a abertura falhar. Se o arquivo for aberto no modo append (a), ento todas as operaes de escrita ocorrero ao nal do arquivo no importando a posio corrente do arquivo. Se o arquivo for aberto no modo update (+), ento a sada no poder ser seguida diretamente por uma entrada e uma entrada no poder ser seguida diretamente por uma sada sem a interveno de fseek, fsetpos, rewind, ou fflush. Tendo sucesso na abertura do arquivo, ser retornado um ponteiro para o arquivo (le stream). Ocorrendo uma falha na abertura, um ponteiro nulo ser retornado. A.10.2 Entradas e sadas formatadas

Funes (x)printf As funes (x)printf fornecem meios para sada formatada de informaes para um stream. fprintf envia sada formatada para um stream printf envia sada formatada para o dispositvo padro (stdout) sprintf envia sada formatada para uma string vfprintf envia sada formatada para um stream usando uma lista de argumentos vprintf envia sada formatada para stdout usando uma lista de argumentos vsprintf envia sada formatada para uma string usando uma lista de argumentos int int int int int int fprintf (FILE *stream, const char *format, ...); printf (const char *format, ...); sprintf (char *str, const char *format, ...); vfprintf (FILE *stream, const char *format, va_list arg); vprintf (const char *format, va_list arg); vsprintf (char *str, const char *format, va_list arg);

Tipos de argumentos %d, %i Inteiros decimais com sinal signed int. %u Inteiro decimal sem sinal unsigned int.

126

EDITORA - UFLA/FAEPE - Introduo Linguagem C

%o unsigned int na base octal. %x unsigned int em hexadecimal usando minsculas: a, b, c, d, e, f. %X unsigned int em hexadecimal usando maisculas: A, B, C, D, E, F. %f Ponto utuante em decimal double. %e, %E double impresso em notao cientca, com e (minsculo) ou E (maisculo). %g , %G] double impresso como %e ou %f, o que tiver menor comprimento. O %G utiliza %E ou %F. %c char: ser impresso um nico caractere. %s Imprime uma string. %p Imprime o valor de um ponteiro. %n o argumento associado um ponteiro para inteiro no qual o nmero de caracteres impressos at este ponto colocado. Nenhum caractere impresso. %% Imprime o sinal %. H dois especicadores de formato que permitem que printf( ) mostre inteiros short e long. Esses especicadores podem ser aplicados aos tipos d, i, o, u, x e X. O especicador l diz a printf( ) que segue um tipo de dado long. Por exemplo, %ld signica que um long int ser mostrado. O especicador h instrui printf( ) a mostrar um short int. Portanto, %hu indica que o dado do tipo short unsigned int. A.10.3 Funes (x)scanf

As funes (x)scanf so utilizadas para leitura formatada de informaes de um stream. fscanf l entrada formatada de um stream scanf l entrada formatada do dispositivo padro (stdin) sscanf l entrada formatada de uma string int fscanf (FILE *stream, const char *format, ...); int scanf (const char *format, ...); int sscanf (const char *str, const char *format, ...); Tipos de argumentos %c char: l um nico caractere. %d, %i Inteiros decimais com sinal signed int. %u Inteiro decimal sem sinal unsigned int. %o unsigned int na base octal.

Bibliotecas do C

127

%x unsigned int em hexadecimal usando minsculas: a, b, c, d, e, f. %f Ponto utuante em decimal - double. %e Ponto utuante em notao cientca. %g Ponto utuante %s L uma String. %p L um ponteiro. %n Retorna um inteiro igual ao nmero de caracteres lidos. %[ ] Procura um conjunto de caracteres. %% L o sinal %. A.10.4 Funes de entrada e sada de caracteres

fgetc Retorna o prximo caractere da stream de entrada na posio atual e incrementa o indicador de posio de arquivo. O caractere lido como um unsigned char, que convertido para um inteiro. fgets L N-1 caracteres de stream e coloca-os na matriz de caracteres apontada por str. fputc Escreve o caractere ch na stream especicada na posio atual do arquivo e avana o indicador de posio de arquivo. fputs Escreve na stream especicada o contedo da string apontada por str. O terminador nulo no escrito. getc Retorna o prximo caractere (um unsigned char) da stream especicada e avana o indicador de posio da stream. getchar Retorna um caractere (um unsigned char) da entrada padro (stdin). gets L uma linha da entrada padro e aramazena em uma string apontada por str. putc Escreve o caractere contido no byte menos signicativo de ch na stream de sada apontada por stream e avana a posio do indicador da stream. putchar Escreve no dispositivo padro de sada (stdout) um caractere (um unsigned char) especicado pelo argumento char. puts Escreve a string apontada por str no dispositivo padro de sada, mas no escreve o terminador nulo. Um caractere de mudana de linha (newline) adicionado sada.

A.11

STDLIB.H A biblioteca stdlib dene algumas funes em macros de propsito geral.

128

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Macros NULL EXIT_FAILURE EXIT_SUCCESS RAND_MAX MB_CUR_MAX Variveis typedef size_t typedef wchar_t struct div_t struct ldiv_t size_t o tamanho em forma unsigned integer resultante da operao sizeof sobre uma varivel de qualquer tipo. wchar_t um tipo inteiro do tamanho de uma constante wide character. div_t a estrutura retornada pela funo div. ldiv_t a estrutura retornada pela funo ldiv. NULL o valor de uma constante ponteiro nulo. EXIT_FAILURE e EXIT_SUCCESS so valores retornados pela funo exit. RAND_MAX o mximo valor retornado pela funo rand. MB_CUR_MAX o mximo nmero de bytes em um conjunto de caracteres multibyte o qual no pode ser maior que MB_LEN_MAX. Funes abort( ); void abort(void); abs( ); int abs(int x); atexit( ); int atexit(void (*func)(void)); atof( ); double atof(const char *str); atoi( ); int atoi(const char *str); atol( ); long int atol(const char *str); bsearch( ) ; void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); calloc( ); void *calloc(size_t nitems, size_t size); div( ); div_t div(int numer, int denom);

Bibliotecas do C

129

exit( ); void exit(int status); free( ); void free(void *ptr); getenv( ); char *getenv(const char *name); labs( ); long int labs(long int x); ldiv( ); ldiv_t ldiv(long int numer, long int denom); malloc( ); void *malloc(size_t size); mblen( ); int mblen(const char *str, size_t n); mbstowcs( ); size_t mbstowcs(schar_t *pwcs, const char *str, size_t n); mbtowc( ); int mbtowc(whcar_t *pwc, const char *str, size_t n); qsort( ); void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)); rand( ); int rand(void); realloc( ); void *realloc(void *ptr, size_t size); srand( ); void srand(unsigned int seed); strtod( ); double strtod(const char *str, char **endptr); strtol( ); long int strtol(const char *str, char **endptr, int base); strtoul( ); unsigned long int strtoul(const char *str, char **endptr, int base); system( ); int system(const char *string); wcstombs( ); size_t wcstombs(char *str, const wchar_t *pwcs, size_t n); wctomb( ); int wctomb(char *str, wchar_t wchar); A.11.1 atoi atol strtod strtol strtoul A.11.2 calloc free malloc realloc Funes de manipulao de Memria Funes de manipuo de Strings

130

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A.11.3 abort atexit exit getenv system A.11.4

Funes de Ambiente (Environment)

Funes de busca e ordenao (Searching and Sorting)

bsearch qsort A.11.5 Funes matemticas

abs int abs(int x); div div_t div(int numer, int denom); labs long int labs(long int x); ldiv ldiv_t ldiv(long int numer, long int denom); rand int rand(void); srand void srand(unsigned int seed); Descrio abs, labs; Retorna o valor absoluto de x. div; Divide o numer (numerador) por denom (denominador). O resultado armazenado em uma estrutura div_t que possue dois membros: int quot; quociente. int rem; resto. ldiv; o mesmo que div, para argumentos do tipo long int. O resultado armazenado em uma estrutura ldiv_t. rand Retorna um nmero pseudo-randmico entre 0 e RAND_MAX. srand Inicializador da seqncia de rand. Se no for chamado o srand, rand atuar como se srand(1) tivesse sido chamado. A.11.6 Funes Multibyte

O comportamento das funes multibyte afetado pelos ajustes de LC_CTYPE feitos localmente. mblen int mblen(const char *str, size_t n);

Bibliotecas do C

131

mbstowcs

size_t mbstowcs(schar_t *pwcs, const char *str, size_t n);

mbtowc int mbtowc(whcar_t *pwc, const char *str, size_t n); wcstombs size_t wcstombs(char *str, const wchar_t *pwcs, size_t n); wctomb int wctomb(char *str, wchar_t wchar); mblen Retorna o comprimento de um character multibyte apontado por um argumento str. mbstowcs Converte a string de caracteres multibyte apontada pelo argumento str para um vetor apontado por pwcs mbtowc Examina um caractere multibyte apontado pelo argumento str. wcstombs Converte os cdigos armazenados na matriz pwcs para caracteres multibyte e os armazena na string str. wctomb Examina o cdigo que corresponde ao caractere multibyte dado pelo argumento wchar.

A.12

STRING.H

A biblioteca string fornece muitas funes teis para manipulao de strings (vetor de caracteres). Variveis e Denies size_t o inteiro sem sinal resultante de sizeof keyword. NULL o valor da constante ponteiro nulo. Funes memchr( ); void *memchr(const void *str, int c, size_t n); memcmp( ); int memcmp(const void *str1, const void *str2, size_t n); memcpy( ); void *memcpy(void *str1, const void *str2, size_t n); memmove( ); void *memmove(void *str1, const void *str2, size_t n); memset( ); void *memset(void *str, int c, size_t n); strcat( ); char *strcat(char *str1, const char *str2); strncat( ); char *strncat(char *str1, const char *str2, size_t n); strchr( ); char *strchr(const char *str, int c); strcmp( ); int strcmp(const char *str1, const char *str2); strncmp( ); int strncmp(const char *str1, const char *str2, size_t n); strcoll( ); int strcoll(const char *str1, const char *str2);

132

EDITORA - UFLA/FAEPE - Introduo Linguagem C

strcpy( ); char *strcpy(char *str1, const char *str2); strncpy( ); char *strncpy(char *str1, const char *str2, size_t n); strcspn( ); size_t strcspn(const char *str1, const char *str2); strerror( ); char *strerror(int errnum); strlen( ); size_t strlen(const char *str); strpbrk( ); char *strpbrk(const char *str1, const char *str2); strrchr( ); char *strrchr(const char *str, int c); strspn( ); size_t strspn(const char *str1, const char *str2); strstr( ); char *strstr(const char *str1, const char *str2); strtok( ); char *strtok(char *str1, const char *str2); strxfrm( ); size_t strxfrm(char *str1, const char *str2, size_t n);

A.13

TIME.H

A biblioteca time fornece algumas funes teis para ler e converter a hora e a data correntes. O comportamento de algumas funes denido pela categoria LC_TIME das propriedades locais.

Variveis e denies NULL o valor de um ponteiro nulo. CLOCKS_PER_SEC o nmero de clocks por segundos do processador. size_t o unsigned integer resultante de sizeof keyword. clock_t um tipo til para armazenar o tempo do processador. time_t um tipo til para armazenar o tempo de calendrio. struct tm uma estrutura usada para guardar o tempo e a data. Seus membros so: int tm_sec; seconds after the minute (0 to 61) int tm_min; minutes after the hour (0 to 59) int tm_hour; hours since midnight (0 to 23) int tm_mday; day of the month (1 to 31) int tm_mon; months since January (0 to 11) int tm_year; years since 1900 int tm_wday; days since Sunday (0 to 6 Sunday=0) int tm_yday; days since January 1 (0 to 365) int tm_isdst; Daylight Savings Time

Bibliotecas do C

133

Funes asctime( ); char *asctime(const struct tm *timeptr);

clock( ); clock_t clock(void); ctime( ); char *ctime(const time_t *timer); equivalente a asctime(locatime(timer)); difftime( ); double difftime(time_t time1, time_t time2); gmtime( ); struct tm *gmtime(const time_t *timer); localtime( ); struct tm *localtime(const time_t *timer); mktime( ); time_t mktime(struct tm *timeptr); time( ); time_t time(time_t *timer); Calcula a data e hora correntes e codica-os no formato time_t. Retorna o valor time_t. Se timer no for um ponteiro nulo, ento o valor tambm armazenado em um objeto para o qual ele aponta. Se no houver sucesso, retorna -1. strftime( ); size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);

You might also like