CURSO DE PÓS-GRADUAÇÃO “LATO SENSU” (ESPECIALIZAÇÃO) A DISTÂNCIA ADMINISTRAÇÃO EM REDES LINUX

INTRODUÇÃO À LINGUAGEM C

2 Edição
 

João Carlos Giacomin

UFLA - Universidade Federal de Lavras FAEPE - Fundação de Apoio ao Ensino, Pesquisa e Extensão Lavras – MG

PARCERIA UFLA – Universidade Federal de Lavras FAEPE – Fundação de Apoio ao Ensino, Pesquisa e Extensão REITOR Fabiano Ribeiro do Vale VICE-REITOR Antônio Nazareno Guimarães Mendes DIRETOR DA EDITORA Marco Antônio Rezende Alvarenga PRÓ-REITOR DE PÓS-GRADUAÇÃO Luiz Edson Mota de Oliveira PRÓ-REITOR ADJUNTO DE PÓS-GRADUAÇÃO “LATO SENSU” Antônio Ricardo Evangelista COORDENADOR DO CURSO Joaquim Quinteiro Uchôa PRESIDENTE DO CONSELHO DELIBERATIVO DA FAEPE Antônio Eduardo Furtini Neto EDITORAÇÃO Grupo Ginux (http://ginux.comp.ufla.br/) IMPRESSÃO Gráfica Universitária/UFLA Ficha Catalográfica preparada pela Divisão de Processos Técnicos da Biblioteca Central da UFLA Giacomin, João Carlos Introdução à Linguagem C / João Carlos Giacomin. – 2. ed. Lavras: UFLA/FAEPE, 2002. 105 p.: il. - Curso de Pós-Graduação “Lato Sensu” (Especialização) a Distância: Administração em Redes Linux Bibliografia. 1. Programa de Computador. 2. Linguagem de Programação. 3. Linguagem C. 4. Informática. I. Giacomin, J.C. II Universidade Federal de Lavras. III. Fundação de Apoio ao Ensino, Pesquisa e Extensão. IV. Título. CDD 005.133 Nenhuma parte desta publicação pode ser reproduzida, por qualquer meio ou forma , sem a prévia autorização.

SUMÁRIO

1 Introdução 1.1 Linguagens de Máquina, Nível . . . . . . . . . . . 1.2 A História do C . . . . . 1.3 A Biblioteca padrão C . 1.4 Características 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 Visão Geral de um Programa C . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Um Programa Utilizando uma Função . . . . . . . . . . . . . . . . . . . . . 3 Sintaxe 3.1 Identificadores . . . . . . . . . . . . . . 3.2 Tipos de Variáveis . . . . . . . . . . . . 3.2.1 Tipos Básicos . . . . . . . . . . . . . 3.3 Declaração e Inicialização de Variáveis 3.4 Operadores . . . . . . . . . . . . . . . . 3.4.1 Operador de Atribuição . . . . . . . . 3.4.2 Operadores Aritméticos . . . . . . . 3.4.3 Operadores Relacionais e Lógicos . 3.4.4 Precedência . . . . . . . . . . . . . . 3.4.5 Operador cast (Modelador) . . . . . 3.4.6 Operador sizeof . . . . . . . . . . . . 4 Funções Básicas da Biblioteca C 4.1 Função printf( ) . . . . . . . . 4.2 Função scanf( ) . . . . . . . . 4.3 Função getchar() . . . . . . . 4.4 Função putchar() . . . . . . . 5 Estruturas de Controle de Fluxo 5.1 If . . . . . . . . . . . . . . . 5.2 If-else-if . . . . . . . . . . . 5.3 Operador Ternário . . . . . 5.4 Switch . . . . . . . . . . . . 5.5 Loop for . . . . . . . . . . . 5.6 While . . . . . . . . . . . . . 5.7 Do-while . . . . . . . . . . . 5.8 Break . . . . . . . . . . . . 5.9 Continue . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . .3 Função strcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . .2 Chamada por Referência . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Função sem Retorno . . . . . 10. . . . . . . . . . . . . . . . .1 Chamada por Valor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8. . . . . . 12. . . . . . . . . . . . . . . . . . . . . .4. . . . . 10. . . 10 Funções 10. . . . . . . . . . . . . . . . . . . . .1 Estruturas . . .4 Ponteiros para Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Manipulação de Strings 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Matrizes Estáticas . . . . . . . . . . . . . . . . . . 10. .3 Matrizes de Ponteiros . 9. . . . . . . . . . . . .3. . . . . . . . . . 9 Ponteiros e Matrizes 9. . . . .5 Problemas com Ponteiros . . . . . . . . . . . . . . . . . . . . . . .5 Funções com Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12. . . . . . . . . .1 Função gets() . . . . . .4 Limites das Matrizes . . . . . . . . . . . . . . . . . . . . . . . .3 Enumerações . .2 Alterando os Valores da Matriz 11 Argumentos da Linha de Comando 12 Tipos de Dados Definidos Pelo Usuário 12. . 8. . . . . . . . . . . . . . . . . . . .1 Variáveis Locais . . . . . . . . . .2 Função com Retorno . . . . . . . .4. . . . 10.4 Função strcat() . . . 10. . . . . . . . . . . . .3 Variáveis Estáticas . 12. . . . . . . . . . .1 Passando Parâmetros Formais 10.2 Manipulação de Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . 9. . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . .6 Matrizes 6. .2 Variáveis Globais . . . . . . . . . . . . . . . . . 10. . .1 Declarando Ponteiros .2 Uniões . . . . . . . . . . . . 6. . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . 7. . . . . .2 Função puts() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . . . . . . . . . . . . .5. . . .3 Expressões com Ponteiros 8. . . . . . . . . . .1 Matriz Unidimensional . . . . . . 10. . . . . . . . . . . .1 Trabalhando com Estruturas . . . . . . . . . . . . . .1. . . . . . . . . . . .2 Matriz Multidimensional 6. . . . .3 Parâmetros Formais . .5 Função strcmp() . . . . 8 Ponteiros 8. . . . . . . . . . . . . . . .2 String e Ponteiros . . . 10. . . . . . . . . .1 Manipulando Matrizes através de Ponteiros . . . . . . 10. . . 10. . . . . . . . 8. . . . . . . . . . . . . . . . . . .4 Classes de Variáveis . .

. . . . . . . 15. . . . .10.h . . . . . .2 Lendo e Escrevendo Caracteres em Arquivos 13. . . . . . . . . . . .1 assert. . . . . . . .5 limits. . . . . . . . . . .3 ctype. . . . . . . . . . . .3 Capítulo 3 . . . . 15. . . . . . . . . A. . . . . . 15. . . . . . . . . . . . . . .9 Capítulo 10 . .12 Capítulo 13 . . A. . . . . . . . . . . . . . . . . . A. . . . . .1. . . . . . . . . . 13. . . . . . . . . . . . . . . . . . A. . . . . . . . . . . . . . .8 Capítulos 8 e 9 15. . . . .6 Capítulo 6 . . .1. . . . . . . 13. . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. Campos-de-Bits . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . . . .10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Entradas e saídas formatadas A. . . . . . . . . . . . . . . . . .1. . . A. .8 signal. . . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . . . . . . . . . . .13 Capítulo 14 . .2 getc() . . . . . . . . . . .1 putc() . . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . . . . . . . . . . . . . . . . .1 Algumas funções em detalhe A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 conio. . . . . . . . . . . . . 14 Noções de Alocação Dinâmica 15 Exercícios 15. . . . . 13. . . . . . . . . . . . . .2 Capítulo 2 . . . . . . . . . . 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . . . . . .h . . . . . .1 Abrindo e Fechando um Arquivo . . . . . . . . . . . . . .4 errno. . . . . . . . . . . . . .5 Capítulo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . . .7 Capítulo 7 . . . . . . . . . . . . .10. . . . . . . . . . . . . . . . . . .9 stdarg. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 A Função exit() . . . . . . . . . . . . . . . . .4 Capítulo 4 . . A. . . . . . . . . . .6 locale. . . . . .h . . . . . . . . . . . .10 Capítulo 11 . . . . .3 feof() . . A. . . . . . . . . . . 15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . . 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 Noções de Manipulação de Arquivos 13. . . . . A. . . . . . .7 math. . . . . . . . . . .5 Typedef . . . . . . . . . . . . . . . . 15. . . . . . . . . . A. .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . . . . . . . . . . . .1 Capítulo 1 . . . . . . . . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . A. . . . . . .12. . . . . . . . 15. . . .4 12. . . . . . .11 Capítulo 12 . 13.3 Funções (x)scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 stdio. . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 A Função fopen() . . . . . . . . . . . . . . . . Referências Bibliográficas A Bibliotecas do C A. . . . . . 13. . . . . . . . . . . . . . . . . . . . . . . .3 A Função fclose() . .

. . .13 time. . . . . . . . . . A. . . . . . . . . .10. . . . . . . . . . . . . . . . . . .11. .11 stdlib. .1 Funções de manipução de Strings . . . . . . . . . . .11. . . . . . . . . . . . . . . . . . . . . . .3 Funções de Ambiente (Environment) . A. . . . .h .A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11. . . . . . . . . A. . . . . . . . . . . . . . .6 Funções Multibyte . . . . . . . . . .h . . 127 127 129 129 130 130 130 130 131 132 .12 string. . . . . .5 Funções matemáticas . . . . . . . . . . . . . . . . . . . . . .2 Funções de manipulação de Memória . . . . . . A. . . . . . . . . A. . . .11. . . A. . . . .4 Funções de entrada e saída de caracteres . . . . . . . . . . . . . . . . . .11. . . . . . A. .h . . . . . . . . . . . . . . . . . .4 Funções de busca e ordenação (Searching and Sorting) A. . . . . A. . . . . . . . . . . . . . . . . . .11.

. . . Estrutura de um programa em C . . . . .   . . . . . . . . . . . . . . . .4 4. . . . . .2 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de for com apenas um comando . . . . . . Formas para imprimir caracteres utilizando a função printf Exemplo de programa que utiliza a função scanf . . . . . . . . . . . . . . . .1 2. . . . . . . . . . . . . . . . . . . . . . . . Um programa que utiliza uma função . . . Laços de for aninhados . . . . . . . . O comando de decisão if com um bloco de instruções . . 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 instruções básicas . .4 5. . . . . . . . . . . . . .6 3. . . . . . . . . . . . . . . . . . . . . .1 1. . . . . .1 4. . . . . . . . . . . . . . . . . . . . . . .8 5. . . .5 3. Exemplo simples de while . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 5. . .7 4. . . . . . . . . . . . . Trecho de programa em linguagem de montagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de programa que utiliza a função getchar . . . . . . . . . . . . . . . . . .11 5. . . . . .3 2. . . . . . . . . .3 5. . . . . . . .2 5. . . . . . . . . .2 1. . . . . . . . . . . . .1 5. . . . . . . . . . . . . . Programa Maior_de_dois . . Arredondamento de números em ponto flutuante . . . . . . . . . . . . . Exemplo de programa que utiliza o comando switch . . . . . . . . .12 5. . . Exemplo de um programa que utiliza o comando if-else-if . . . . . . . . . . . . . . . . . . . . .3 3. . . . . . . . . . . . . . . . . . . . Geração de uma tabela de quadrados de inteiros utilizando while . . . . . . . Loop infinito . . . . . . . . . . . . . . . . . . . Programa com exemplo de utilização de operador cast Exemplo de utilização da função printf . . . . . . . . . . . . . . . Complementando com zeros à esquerda . . . . . .2 4. . . Laço de for com duas variáveis de controle . . . . . . . . . . . . . . . . . . . . . . .1 3. . . . . . . Programa com operadores relacionais e lógicos . .14 Trecho de programa em linguagem de máquina . . Ambiente de programação do C . . Tamanho de campos na impressão . . Exemplo de programa que utiliza a função putchar . . Programa para calcular o valor de . . . . . . . . Exemplo de for com um bloco de instruções . Alinhamento de campos numéricos . . . . . . . . . . . . . . . . . . . . . . .9 5.13 5. . .4 3. . . .8 4. . . .6 4. .3 4. . . . . . . . . . . . .4 3. . . . . . . . Programa para conversão de pés para metros . . Exemplo de programa que utiliza o comando de decisão if . . . . . . . . . . . Trecho de programa em linguagem de alto nível . .9 5. . . . . . . Exemplo de programa que utiliza o operador ternário . . . . . . . . . . . . . . . . . .5 4. . . . . . . . . . . . . .8 4. . . . . . . Programa com diferentes tipos de variáveis. . . Programa com operadores aritméticos . . . . . . . . . . . . . .LISTA DE FIGURAS 1. . . . . . . .7 5. . . . . . . . . . . . . . . . . . . . . . . . Programa que exibe uma tabela das quatro primeiras potências dos números de 1 a 9 . . Inicialização de variáveis . . . . . . . . . . . .7 3. . . . . . . . . . . . . . .5 5. . . . .6 5. . . . . .2 2. . . Um programa simples em C . . . . . . . .3 2. . . . .

. . . . . . . Função que utiliza passagem por referência . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 10. . . . Exemplo simples de utilização de matriz . . . . .6 10. . . . . . . . . . . . .h . . . . . . . . . Variáveis locais em uma função . . . Programa simples que utiliza a função gets . . . . . Utilização de matrizes de ponteiros para mensagens de erro Inversão de uma string usando uma função que recebe um ponteiro Um codificador simples . .12 10. . . . .11 10. . . . . . . . .6 8. . . . . . . . . . . . . . . Utilização da função strcat da biblioteca string. . . . . . . . . . . . . . . Exemplo simples de operação com strings . . . . . . . . . . . . .h . .13 11. . . . . . . . . . . . . . . .4 6. . .15 5. . . . Programa que recebe uma string na linha de comando . . Exemplo simples de utilização do comando break . . Exemplo de utilização do comando continue . .1 8. . . . . . . . . . . . . . . . . . . . . . . . . . .7 10. . . . . . . . . . Utilização da função strcmp da biblioteca string. . .17 5.4 10. . . . . . .10 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 10. . . . . . Função com retorno de inteiro . . . . . . . Função que opera sobre uma matriz utilizando um ponteiro . . . Passagem de valor de uma variável para uma função . . . . . . . . . . . . . . . . . . . . . .5 7. . . .h Exemplos de declarações de ponteiros Atribuição de valor a um ponteiro . . . . . . . . . . . . . . . . . Utilização de ponteiros . . . . . . . . . . . . . Função que procura uma substring dentro de uma string . . . . . . . . . . . . . .5 6. . .5 8. . . . . . .4 7. .2 Geração de uma tabela de quadrados de inteiros utilizando do-while Exemplo de utilização do laço do-while . . . . . . . . . . . . . . . . . . . . . Exemplo simples de utilização da função puts . . . . . . . . . . . .3 8. . . . . .2 7. . . . . . . . . . .8 10. . .3 9. . . . . . . . . . . . . . . . . . . . . . . Utilização da função strcpy da biblioteca string. . . . . .18 6. Programa que recebe argumentos na linha de comando . . . . . .1 9. . . . . . . . . . . . . . . . . . . . Operações com Ponteiros . . . 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 Cópia de uma string (versão matriz) . . . Exemplo do erro de ponteiro perdido .6 7. . . . . . . . Variáveis locais em uma função . Alterando valores de uma matriz . . . . . . . . . . . .5 10. . . Cópia de uma string (versão ponteiro) . . . . .6 9. .2 8. . . . . . Ponteiros para ponteiros . . . . . . . . . . . . . . . . . . . .3 7. . . . . . . . . . . . . . . . Exemplo de utilização de matriz estática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 5. . . Exemplo simples de utilização de matriz multidimensional . . . . . . . . . . . . . . . . . . . . . . .1 6. . . . . . . . . . . . .1 11. . Uso de um ponteiro no lugar de uma string . . . . . . . . . . . . Exemplo de armazenamento de dados em matriz unidimensional Operações com matriz . . . . . . . . . . . . .3 6. . . . Função que utiliza uma matriz . . . .3 10.2 6. . . . .4 8. . . . .4 10. . . . . . . . . . . . . . Parâmetros formais de uma função .5. . . . . . .9 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 7. . . . . . . . . . . . . . . . .2 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variáveis globais em um programa . Erro na utilização de matriz . . . . . . . . . . . . . . . . . . . . . . .

. . . Capítulo 4: Programa para o exercício 1 . . . . . . . . . . .7 12. . . .3 12. . . .5 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de utilização de uma enumeração . . . .4 15. . . . . . . . Capítulo 10: Programa para o exercício 2 . . . . . . . . . .14 13. . . . . . . . . . Capítulo 5: Algoritmo para o exercício 3 . . . . . .4 12. . . . .12. .2 15. . . . .2 14. . . . . .10 12. . . . Capítulo 7: programa para o exercício 1 . .2 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 12. . . . Forma geral de declaração de uma união . . . . . . . . . . . . . . . . . . . . . 84 84 86 87 88 89 89 90 93 94 94 95 95 96 Escrevendo e lendo em arquivo . . . . . . . . . . . . .5 15. . . . . . . . . Exemplo de ponteiro para estrutura . .13 12. . . . . . . . . . . . . . . . . 100 Primeiro exemplo de alocação dinâmica de memória . . . . . .1 13. . . . . . .1 14. . . . . . . . . . . . . . . . . . Exemplos de passagens de elementos de estruturas para funções Exemplo de passagem de uma estrutura inteira para uma função . . . .9 12.6 15. Exemplo de passagem de uma estrutura inteira para uma função . . . . . . . . . . . . . . .1 12. . . . 105 106 107 108 109 110 111 . . . . . . . Exemplo de enumeração . . . . . . . . . .7 Forma geral de declaração de uma estrutura . . . . . . . . . . . . . 103 Segundo exemplo de alocação dinâmica de memória . . . . . . . . .12 12. . . . . . . . . . . . . . . . Exemplo de estrutura de campos-de-bits . Capítulo 5: Programa para o exercício 1 . Declarações de uniões e formas de utilização . . . . . .8 12. . . . 98 Uso da função exit na abertura de arquivos . . . . . . . . Utilizando typedef . . . . . . . . .1 15. . .2 15. . . . . . . . . . . Declaração de uma estrutura para clientes de um banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 15. . . . .6 12. 104 Capítulo 2: Programa para o exercício 1 . . . . . . . . . . . . . . . . . . . . . . Forma geral de campos-de-bits . . . . . . Exemplos de acesso a membros de variáveis do tipo estrutura . . . . . . . . . . . . . . . . . . . . Capítulo 3: programa para o exercício 1 . . . . . .

. . . . . . . . . .1 Palavras reservadas do C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 3. . . . . . . . . . . . . . .6 4. . . .LISTA DE TABELAS 3. . . . Operadores relacionais e lógicos . . . . . . . . . . . . . . . . . . . . . 22 24 26 27 28 30 33 99 Caracteres de controle da função printf . . . . . . . . . . . . . .1 13. . . . . . . . . . . . . . . .1 3. . . Comandos de atribuição reduzidos . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 3. . . Tipos de dados do C . . . . . . . . . . . . . . Modos válidos de abertura de arquivos . . . . . . . . . . . .5 3.4 3. . Nível de precedência dos operadores . . . . . Operadores aritméticos . . . . . . . . . . . .

1: Trecho de programa em linguagem de máquina . algumas diretamente inteligíveis pelo computador e outras que requerem passos intermediários de tradução. Ela é relacionada diretamente ao projeto do hardware daquele computador. isto é. Estas podem ser divididas em três grandes grupos: Linguagens de máquina. Linguagens de máquina são desajeitadas para humanos. +1300042774 +1400593419 +1200274027 Figura 1. E LINGUAGENS DE ALTO-NÍVEL Programadores escrevem instruções em várias linguagens de programação. Centenas de linguagens de computador são usadas atualmente. como poderá ser visto a seguir no trecho de um programa. que soma pagamento de hora-extra ao pagamento básico e armazena o resultado no pagamento total. Linguagens de alto nível. uma linguagem de máquina particular pode ser usada apenas em um tipo de computador. Linguagens de máquina geralmente consistem de cadeias de números (que se reduzem a 1s e 0s) que instruem o computador a realizar suas operações mais elementares.1 INTRODUÇÃO 1.       Linguagens de montagem. uma de cada vez.1. na Figura 1. Qualquer computador pode entender diretamente apenas sua própria linguagem de máquina. Linguagens de máquina são dependentes da máquina (machine-dependent). LINGUAGENS DE MONTAGEM. A linguagem de máquina é a “linguagem natural” de um computador em particular.1 LINGUAGENS DE MÁQUINA.

12

EDITORA - UFLA/FAEPE - Introdução à Linguagem C

Quando os computadores se tornaram mais populares, tornou-se claro que a programação em linguagens de máquina era muito lenta e tediosa para a maioria dos programadores. Em vez de usar as cadeias de números que computadores podiam entender diretamente, os programadores começaram a usar abreviações derivadas da língua inglesa para representar as operações elementares do computador. Estas abreviações do Inglês 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 máquina na velocidade dos computadores. A Figura 1.2 mostra um trecho de um programa em linguagem de montagem que também soma o pagamento de hora-extra ao pagamento básico e armazena o resultado no pagamento total, mas mais claramente que seu equivalente em linguagem de máquina:

LOAD ADD STORE

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

A utilização do computador cresceu rapidamente com o advento das linguagens de montagem, mas estas ainda requeriam muitas instruções para realizar mesmo as tarefas mais simples. Para acelerar o processo de programação, linguagens de alto nível foram desenvolvidas nas quais declarações simples poderiam ser escritas para realizar tarefas substanciais. Os programas tradutores que convertem programas de linguagens de alto nível em programas de linguagem de máquina são chamados compiladores. Linguagens de alto nível permitem aos programadores escreverem instruções que se parecem proximamente com o Inglês diário e contêm notações matemáticas comumente usadas. Um programa de folha de pagamento escrito em linguagem de alto nível poderia conter uma declaração tal como mostrada na Figura 1.3

grossPay = basePay + overTimePay Figura 1.3: Trecho de programa em linguagem de alto nível

Obviamente, linguagens de alto nível são muito mais desejáveis do ponto de vista dos programadores que linguagens de máquina ou linguagens de montagem. C e C++ estão entre as mais poderosas e mais largamente usadas linguagens de alto nível.

Introdução

13

1.2

A HISTÓRIA 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 características de sua linguagem B, baseando-se BCPL, e usou B para criar as primeiras versões do sistema operacional UNIX no Bell Laboratories em 1970 em um computador DEC PDP-7. Tanto BCPL quanto B eram linguagens não “tipadas” — todos os itens de dados ocupavam uma palavra na memória e o fardo de tratar um dado como um número inteiro ou um número real, por exemplo, ficava a cargo do programador. A linguagem C foi uma evolução 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 são escritos em C e/ou C++. C está disponível para a maioria dos computadores atuais. C é independente de Hardware. Com um projeto cuidadoso, é possível escrever programas em C que são portáveis para a maioria dos computadores. C usa muitos dos importantes conceitos do BCPL e do B enquanto soma a tipagem de dados e outras características poderosas. No final da década de 70, C havia evoluído para o que agora é conhecido como o tradicional “C”. A publicação, em 1978, do livro de Kernighan e Ritchie, The C Programming Language, trouxe uma grande atenção à linguagem. Esta publicação tornou-se um dos livros de ciência da computação de maior sucesso de todos os tempos. A rápida expansão do C sobre vários tipos de computadores (algumas vezes chamados plataformas de Hardware) conduziu a muitas variações. Estas eram similares mas sempre incompatíveis. Isto era um problema sério para desenvolvedores de programas que precisavam desenvolver código que rodasse sobre várias plataformas. Tornou-se claro que uma versão padrão de C era necessária. Em 1983, o comitê técnico X3J11 foi criado sob a American National Standards Committee on Computers and Information Processing (X3), para “fornecer uma definição de linguagem não ambígua e independente de máquina”. Em 1989, o padrão foi aprovado. O documento é conhecido como ANSI/ISO 9899: 1990. Cópias deste documento podem ser requisitadas ao Americam National Institute. A Segunda edição de Kernighan e Ritchie, publicada em 1988, reflete esta versão chamada ANSI C, agora usada em todo o mundo.

1.3

A BIBLIOTECA PADRÃO C

Programas em C consistem de módulos ou pedaços, chamados funções. Você pode programar todas as funções que você precisa para formar um programa em C, mas a maio-

14

EDITORA - UFLA/FAEPE - Introdução à Linguagem C

ria dos programadores em C aproveitam uma rica coleção de funções existentes, chamada C Standard Library. Portanto, há realmente duas etapas para aprender o “mundo” C. A primeira é aprender a própria linguagem C, e a segunda aprender como usar as funções da biblioteca padrão C. Neste curso, você será levado a usar a abordagem de construção de blocos (Building block approach) para criar programas. Evite reinventar a roda. Use pedaços existentes – isto é chamado reutilização 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 construção: Funções da biblioteca padrão C,
 

Funções que você mesmo criou,
 

Funções que outras pessoas criaram e disponibilizaram para você.
 

A vantagem de criar suas próprias funções é que você vai saber exatamente como elas funcionam. Você poderá examinar o código C. A desvantagem é o tempo consumido em esforço que leva do projeto ao desenvolvimento de novas funções. Usar funções existentes evita reinventar a roda. No caso de funções padrão ANSI, você sabe que elas são cuidadosamente escritas, e você sabe que por estar usando funções que são disponíveis em virtualmente todas as implementações ANSI C, seu programa terá uma chance muito maior de ser portável.

1.4

CARACTERÍSTICAS DE C

C é uma linguagem altamente portável e bastante eficiente em termos de desempenho. É uma linguagem de propósito geral, sendo utilizada para desenvolver os mais diversos tipos de software. Entre as principais características da linguagem C, podem ser citadas: portabilidade
               

modularidade recursos de baixo nível geração de código eficiente simplicidade facilidade de uso possibilidade de ser usada para os mais variados propósitos indicada para escrever compiladores, editores de textos, bancos de dados, etc.

O projeto GNU (Gnu’s Not Unix) foi proposto por Richard Stallman em 1983. O desenvolvimento do GCC é uma parte do Projeto GNU. C++ é uma versão estendida e melhorada de C que foi projetada para suportar programação orientada a objetos (OOP). e de atender a muitos outros testes e mais características de GCC. manterão e utilizarão programas escritos em C. sem se preocuparem em utilizar os benefícios da orientação a objetos proporcionados por C++. o conhecimento da linguagem C é de grande valor. 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 propósito de promover um compilador de primeira linha (world-class) que seja otimizado continuamente. Por muitos anos ainda os programadores escreverão.org). similar ao Unix: o sistema GNU (GNU é um acrônimo recursivo que se pronuncia “guh-NEW” ou “guniw”). 1. Para o programador. .gnu. que utilizam o núcleo Linux. apesar desses sistemas serem normalmente chamados de “Linux”. de reunir um grande time de desenvolvedores. é gratuito e de código aberto. eles são mais precisamente chamados Sistemas GNU/Linux. Richard Stallman é pesquisador do MIT e inventor do editor EMACS. por isso o código escrito em C estará em uso por muitos anos ainda. são hoje largamente utilizadas. Variações do sistema GNU. C++ contém e suporta toda a linguagem C e mais um conjunto de extensões orientadas a objetos. 1. O projeto teve início em 1984.Introdução 15 Como resultado. portanto recomendamos a utilização de um compilador de C que funcione bem para programas que seguem este padrão. Várias dessas empresas adotam estas linguagens na maioria de seus projetos.5 C E C++ Algumas vezes os iniciantes confundem o que é C++ e como difere de C. de assegurar que o GCC e o sistema GNU trabalhem em múltiplas arquiteturas e diversos ambientes. e a proposta era desenvolver um sistema operacional completo e livre. tem-se que C e C++ podem ser consideradas “padrões de indústria” pelas empresas de desenvolvimento de software. O compilador GCC é o compilador de C do projeto GNU (http//:www.6 O COMPILADOR GCC Todos os programas utilizados como exemplo neste curso utilizam apenas funções da linguagem C padrão ANSI (ANSI C).

Fortran.c.16 EDITORA . libgcj. Com isso.. execute a seguinte linha de comando: gcc nome.c -o nome. o arquivo nome.Introdução à Linguagem C Em Abril de 1999..UFLA/FAEPE .c será compilado gerado um executável nome. para compilar um programa denominado nome. Objective C.exe onde nome é o nome dado ao programa. Chill.exe’ é desnecessária).). Obtenha uma cópia do compilador e instale em seu computador. Uma versão do compilador GCC pode ser obtida no ftp do curso de Ciência da Computação da UFLA1 .. 1 ftp://ftp.exe (em ambientes Linux. e Java bem como bibliotecas para estas linguagens (libstdc++. C++.comp. Atualmente GCC contém aplicações para C. Naquele tempo GCC foi renomeado para “GNU C Compiler” e para “GNU Compiler Collection” e recebeu uma nova missão.ufla.br/pub/ . o Egcs Steering Committee foi indicado pelo FSF como o mantenedor oficial GNU para GCC. a extensão ‘. De posse do GCC instalado e configurado (independente de sua portagem ou ambiente).

} */ Figura 2. O programa possui uma ou várias funções. Além dessas. ou arquivos de inclusão. } int função_1 (variáveis) { declaração de variáveis instrução_1. Todas as funções começam com { e terminam com } . existem outras pré-programadas.2 ESTRUTURA DE UM PROGRAMA EM C Um programa em C é estruturado sobre funções. instrução_3. que dá início ao programa e chama todas as outras. sendo que a principal. que são incluídas nos programas como arquivos de cabeçalho. instrução_2.1. é sempre chamada main. return (INT).h> int main ( ) { declaração de variáveis instrução_1. função_1(variáveis). como indicado na Figura 2. instrução_2.1: Estrutura de um programa em C . /* Estrutura de um programa em C # include <arquivo_cabecalho.

conforme descrito na Figura 2. A função printf já está programada dentro de stdio.h> main ( ) { printf("Alo. 2. Quando não for especificado. Ao final. o tipo da função será int (inteiro).c -o exemp_01 Isto indica ao computador para utilizar o compilador GCC para compilar o programa exemp_01.1 VISÃO GERAL DE UM PROGRAMA C A geração do programa executável a partir do programa fonte obedece a uma seqüência de operações antes de tornar-se um executável. A segunda linha indica a inclusão de um arquivo de cabeçalho. o programador aciona o compilador que . A declaração de funções segue sempre o padrão: tipo nome (parâmetros). foi programada outra função chamada função_1.UFLA/FAEPE .c escrito em C e dar ao arquivo executável gerado o nome de exemp_01. etc).2: Um programa simples em C Edite este programa com o nome exemp_01.c e compile-o utilizando o compilador GCC. todas as outras funções podem ter qualquer nome que o programador desejar. tipo refere-se ao tipo de valor que a função pode retornar (inteiro. Não é obrigatório o uso de parâmetros. Mundo!"). e parâmetros são os valores passados pelo programa para a função. } Figura 2. ou outro de sua preferência. Modifique este programa para escrever outra mensagem além de “Alo. Nesse caso. As funções pré-programadas devem ser escritas em letras minúsculas. Depois de escrever o módulo fonte em um editor de textos. Após a função main. /* programa exemplo 01 */ # include <stdio. letra. A terceira linha. Todos os comentários iniciam com /* e terminam com */.3. Mundo!”. Escreva na linha de comando do computador: gcc exemp_01.18 EDITORA . rode o programa.Introdução à Linguagem C A primeira linha compreende apenas comentários.h. e é utilizada para escrever mensagens na tela do computador. inicia a função main. como pode ser visto no exemplo.2 apresenta um programa simples escrito em linguagem C. A Figura 2. Excetuando a main. decimal. nome é o nome dado à função. na função main.

utilizando-se a função printf. que termina com o executável criado pelo lincador. o qual utiliza uma função que retorna um valor do tipo inteiro. Na função main.2 UM PROGRAMA UTILIZANDO UMA FUNÇÃO Para que fique entendida a estrutura de um programa em C. Escreva na linha de comando do computador: gcc exemp_02.3: Ambiente de programação do C 2.4). A função quadrado é chamada pela main na sua quarta linha e retorna para a função main o quadrado do número passado como argumento. Essa ação desencadeia uma seqüência de etapas. façamos um segundo exemplo (Figura 2. A função scanf também pertence a stdio. o valor retornado é atribuído à variável quad. o número lido pela função scanf e o seu quadrado são escritos na tela. Edite este programa com o nome exemp_02.c e compile-o utilizando o compilador GCC.Estrutura de um Programa em C 19 no nosso exemplo é chamado pelo comando gcc.h e é utilizada para ler valores enviados pelo teclado. Ao final. Edição (módulo fonte em C) Pré−Processamento (novo fonte expandido) Compilação (arquivo objeto) Lincagem (executável) Execução Figura 2. cada qual traduzindo a codificação do usuário para uma forma de linguagem de nível inferior.c -o exemp_02 .

20 EDITORA . } Figura 2. printf("\n Quadrado de %d é : %d". scanf("%d".&num). quad = quadrado(num). } */ main ( ) { int num.h> int quadrado (int num) { return (num*num). num.Introdução à Linguagem C /* programa exemplo 02 # include <stdio. quad.UFLA/FAEPE . quad).4: Um programa que utiliza uma função Modifique este programa para que ele calcule o cubo do número: crie uma função cubo. . printf("Envie um numero inteiro: ").

as funções e as expressões. podendo dar significado a um identificador. O programador também pode definir novas funções em seus programas. os compiladores C entendem as letras maiúsculas e minúsculas como sendo diferentes. e a chamada de funções de I/O são definidas nas expressões. definir funções. alocar memória. As declarações expressam as partes do programa. A determinação e alteração de valores. permitem respectivamente escrever na tela e ler os dados a partir do teclado. que por sua vez são a união de uma ou mais funções executando cada qual o seu trabalho. sendo obrigatória a sua declaração no programa principal. Comentários no programa são colocados entre /* e */ não sendo considerados na compilação. Os comentários podem também ser colocados em uma linha. (ponto e vírgula) que faz parte do comando. como rotinas para cálculos. Portando uma variável declarada como X1 será dife- . Todo programa C inicia sua execução chamando a função main( ). 3. O primeiro caracter deve ser uma letra ou um sublinhado. isto é. funções.1 mostra um exemplo de programa que utiliza estes conceitos básicos. Os tipos definem as propriedades dos dados manipulados em um programa. etc. Cada instrução encerra com . A Figura 3. Os 32 primeiros caracteres de um identificador são significativos.1 IDENTIFICADORES São nomes usados para se fazer referência a variáveis. As funções printf( ) e scanf( ) por exemplo.3 SINTAXE Sintaxe são regras detalhadas para cada construção válida na linguagem C. rótulos e vários outros objetos definidos pelo usuário. após o sinal //. as declarações. As funções especificam as ações que um programa executa quando roda. Estas regras estão relacionadas com os tipos. Há funções básicas que estão definidas na biblioteca C. O C é “Case Sensitive”. impressão. As funções são as entidades operacionais básicas dos programas em C. definir conteúdo inicial.

números ou .). printf("\n Alô! Qual é o seu nome ? ").Nome). scanf("%s".1: Programa com instruções básicas rente de uma variável declarada com x1.22 EDITORA .1: Palavras reservadas do C auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 3. Um tipo de objeto de dados determina como valores de dados são representados. que valores pode expressar. %s ! \n". } Figura 3. no C podem ter qualquer nome se duas condições forem satisfeitas: o nome deve começar com uma letra ou sublinhado (_) e os caracteres subsequentes devem ser letras. e que tipo de operações você pode executar com estes valores.h> main( ) /* função obrigatória */ { char Nome[20]. O C possui outros comandos e palavras reservadas que são todos escritos em letras minúsculas.1 apresentada uma lista com as palavras reservadas do padrão ANSI C. o compilador não irá interpretá-los como sendo comandos. printf("\n Bom dia.Nome). Tabela 3. Os tipos principais podem ser colocados dentro da classe do tipo de objeto de dado. A Tabela 3. caso contrário. switch. Os comandos básicos do C devem ser escritos sempre com minúsculas (if.UFLA/FAEPE . As variáveis. mas como variáveis. etc. identificadores. uma variável chamada Tempo será diferente de TEMPO. dá a ele um tipo. for. tempo e TeMPo.2 TIPOS DE VARIÁVEIS Quando você declara um identificador.Introdução à Linguagem C # include <stdio.

Como o tipo default do C é o int. 3. inteiro (int).2. Exceto void. quando vamos declarar variáveis int com algum dos modificadores de tipo. Há três lugares nos quais podemos declarar variáveis.2. não o seu tamanho em bytes. Uma implementação do compilador pode mostrar um faixa maior do que a mostrada na Tabela 3.Sintaxe 23 sublinhado (_). O padrão ANSI determina apenas a faixa mínima de cada tipo. basta colocar o nome do modificador de tipo. O tamanho e a faixa de representação de cada um destes tipos de dados depende do processador utilizado e da implementação do compilador C. Os modificadores são: signed. Os tipos básicos do C juntamente com suas formas modificadas são apresentados na Tabela 3. As potências de 2 usadas significam: 3. ponto flutuante (float).1 Tipos Básicos Há cinco tipos básicos de dados em C: caractere (char). A forma geral da declaração de variáveis é: tipo_da_variável lista_de_variáveis. Um modificador é usado para alterar o significado de um tipo básico. os tipos básicos de C podem ter vários modificadores precedendo-os. As variáveis da lista de variáveis terão todas o mesmo tipo e deverão ser separadas por vírgula.3 DECLARAÇÃO E INICIALIZAÇÃO DE VARIÁVEIS As variáveis no C devem ser declaradas antes de serem usadas. modificando o seu tamanho ou sua forma de representação. long e short. Variáveis de até 32 caracteres são aceitas. mas não uma faixa menor. Estas variáveis são chamadas variáveis globais e podem ser usadas  % ¨ §  %¨  % #¨ ¢10)¢(©'&$"   5  ¨   5¨ % 5  ¨ 1"0)04%   ¨   ©¢§  §   ¢ ¥ ¥ !¡    2 3   ¥ £¡ ¦¤¢  ¥ ¡ ¦¤¢  . unsigned.2. Assim um long basta para declarar um long int. ponto flutuante de precisão dupla (double) e vazio (void). ou pelas bibliotecas do C. O primeiro é fora de todas as funções do programa. nem igual ao nome de uma função declarada pelo programador. Há apenas mais duas restrições: o nome de uma variável não pode ser igual a uma palavra reservada. Todos os outros tipos de dados em C são baseados nestes 5 tipos básicos.

Introdução à Linguagem C Tabela 3.UFLA/FAEPE . Estas variáveis são chamadas locais e só têm validade dentro do bloco no qual são declaradas. £ ¡ ¥ 2 3 " #!  ¡  long double    ¦¡ ¨ 2 0# 3 £   " ! #   £ ¡ # # ¡ ¥      ¨ #  ¡  float 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. Há mais dois detalhes que devem ser ressaltados. tamanho pelo menos igual a short mesmo tamanho que int sem negativos inteiro com sinal de pelo menos 32 bits. O terceiro lugar onde se pode declarar variáveis é na lista de parâmetros de uma função. Mais uma vez. O segundo lugar no qual se pode declarar variáveis é no início de um bloco de código de uma função. Pode-se dizer que. O mesmo vale para duas variáveis locais de uma mesma função. de funções diferentes.24 EDITORA . tamanho pelo menos igual a int mesmo tamanho que long sem valores negativos ¥ © # ¥ ¥ £ £ £  # &"  2 3     # ¨   %¨ ()§   £ ¡ ¤¢  £ ¡ ¤¢    Ponto Flutuante pelo menos 6 dígitos de precisão decimal pelo menos 10 dígitos decimais e precisão maior que do float pelo menos 10 dígitos decimais e precisão maior que do double # # . isto é. tamanho pelo menos igual a char mesmo tamanho que short sem negativos inteiro de pelo menos 16 bits. são conhecidas apenas pela função onde são declaradas. Já duas variáveis locais. apesar de estas variáveis receberem valores externos. todas as funções as vêem. As regras que regem onde uma variável é válida chamam-se regras de escopo da variável. só a função à qual ela pertence sabe da existência desta variável. Duas variáveis globais não podem ter o mesmo nome. podem ter o mesmo nome sem perigo algum de conflito.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. como elas estão fora de todas as funções.

Figura 3. unsigned int ui. float pi=3. double d. printf("double %d".h> main() { char c.sizeof(f)).2. printf("unsigned int %d". printf("float %d". unsigned char uc. int count=0.sizeof(d)). printf("unsigned char %d". printf("char %d".sizeof(uc)). Para fazer isto podemos usar a forma geral tipo_da_variável nome_da_variável = constante. Isto significa que até que um primeiro valor seja atribuído à nova variável ela tem um valor indefinido e que não pode ser utilizado para nada. printf("int %d".sizeof(c)).sizeof(ui)). int i. Isto é importante pois quando o C cria uma variável ele não a inicializa.3 apresenta um programa que identifica o tamanho de variáveis de diferentes tipos. } Figura 3.3: Programa com diferentes tipos de variáveis. # include <stdio. . Nunca presuma que uma variável declarada vale zero ou qualquer outro valor. Exemplos de inicialização podem ser vistos na Figura 3.2: Inicialização de variáveis A Figura 3.1416. char ch=’D’.Sintaxe 25 Podemos inicializar variáveis no momento de sua declaração. float f.sizeof(i)).

3: Operadores aritméticos Operador + * / % ++ -- Ação Soma (inteira e ponto flutuante) Subtração ou Troca de sinal (inteira e ponto flutuante) Multiplicação (inteira e ponto flutuante) Divisão (inteira e ponto flutuante) Resto de divisão (de inteiros) Incremento (inteiro e ponto flutuante) Decremento (inteiro e ponto flutuante) O C possui operadores unários e binários. Nesta linha. pois ele retorna o valor da variável multiplicado por -1. / e %. Então x++.UFLA/FAEPE .45 será atribuído a z. o valor 2.45. depois a x. 3. e retorna esta soma.(subtração). .26 EDITORA . sem alterar as variáveis.4 3. como: x = y = z = 2.como troca de sinal é um operador unário que não altera a variável sobre a qual é aplicado. Ao contrário de outras linguagens. A Tabela 3. e retornam o valor final da variável. soma seus valores. Os operadores de incremento e decremento são unários que alteram a variável sobre a qual estão aplicados.3 apresenta a lista dos operadores aritméticos do C.2 Operadores Aritméticos Os operadores aritméticos são usados para desenvolver operações matemáticas. A soma é um operador binário pois pega duas variáveis. Os binários usam duas variáveis e retornam um terceiro valor. x--. O operador de atribuição “=” atribui à variável à sua esquerda o valor calculado à direita. Os unários agem sobre uma variável apenas.Introdução à Linguagem C 3. O que eles fazem é incrementar ou decrementar de um a variável sobre a qual estão aplicados.4.4. O C permite que se façam atribuições encadeadas. sem alterar as variáveis originais. modificando ou não o seu valor. Outros operadores binários são os operadores .1 OPERADORES Operador de Atribuição O operador de atribuição em C é o sinal de igual “=”. Tabela 3. o operador de atribuição pode ser utilizado em expressões que também envolvem outros operadores. *. depois a y. O operador .

no final.4. Uma curiosidade: a linguagem de programação C++ tem este nome pois ela seria um “incremento” da linguagem C padrão. entende-se como verdadeiro qualquer valor que não seja 0.3. podem ser utilizados em forma reduzida. x *= y+1.4. Em x = 23.Sintaxe 27 são operações equivalentes a x = x+1. x = x*(y+1). e a Figura 3. /. 3. Quando são pós-fixados eles retornam o valor da variável sem o incremento e depois incrementam a variável. utilizando operações sobre números em ponto flutuante.5 apresenta um programa para fazer a conversão de medidas em pés para metros. Estes operadores podem ser pré-fixados ou pós-fixados. y = ++x.3 Operadores Relacionais e Lógicos O termo relacional refere-se às relações que os valores podem ter um com o outro e o termo lógico se refere às maneiras como essas relações podem ser conectadas. . Quando efetuados sobre um mesmo operando. + e . x = x-1. no final. Então. enquanto que o valor 0 indica  ¡  ¡   ¡ § § § i += 2. d = d .4: Comandos de atribuição reduzidos A Figura 3. y = 24 e x = 24. A função scanf() é utilizada para ler um valor numérico do teclado do computador. d -= 3. Tabela 3.4 apresenta um programa simples que utiliza operadores aritméticos sobre números inteiros. i = i+2. A diferença é que quando são pré-fixados eles incrementam e retornam o valor da variável já incrementada. Os operadores *. Em C. como ilustra a Tabela 3.funcionam como na maioria das linguagens. o operador % indica o resto de uma divisão inteira. teremos. em x = 23. y = x++. teremos. y = 23 e x = 24.

} Figura 3. metros). */ main() { float pes. printf("Informe o número de pés: ").4: Programa com operadores aritméticos #include <stdio. } Figura 3. printf("%d\n".5: Programa para conversão de pés para metros condição falsa. x%y). /* conversão de pés para metros */ printf("%f pes é %f metros\n". Tanto os operadores de relação como os lógicos têm a precedência menor que os operadores aritméticos.UFLA/FAEPE .Introdução à Linguagem C # include <stdio.h> main() { int x. pes. y.3048. scanf("%f". metros. Tabela 3. As expressões que usam operadores de relação e lógicos retornarão 0 para falso e 1 para verdadeiro. x/y).28 EDITORA . x =10.h> /* Conversão de pés para metros. y = 3. &pes). /* lê um float */ metros = pes * 0.5: Operadores relacionais e lógicos relacionais > maior que >= maior ou igual < menor <= menor ou igual == igual != não igual lógicos && and (E) || or (OU) ! not (NÃO) . As operações de avaliação produzem um resultado 0 ou 1. printf("%d\n".

# include <stdio. y=3. i!=j).4 Precedência O nível de precedência dos operadores é avaliado da esquerda para a direita. printf("digite dois números: ").7: Programa Maior_de_dois 3. i. i. i. produto. j. printf("%d == %d é %d\n". i==j).4. j.7 apresentam programas com exemplos de utilização de operadores relacionais e lógicos. scanf("%d%d".h> main( ) { int x=2. &i. Os parênteses podem ser utilizados para alterar a ordem da avaliação.h> main() { int i.8.Sintaxe 29 As Figuras 3. i. i<=j). j. printf("%d > %d é %d\n".j. i>=j). printf("%d < %d é %d\n".5 Operador cast (Modelador) Sintaxe: (tipo)expressão Podemos forçar uma expressão a ser de um determinado tipo usando o operador cast. Um exemplo pode ser visto na Figura 3. 3. } Figura 3. i> j). if ((produto = x*y) > 0) printf("é maior"). i. printf("%d >= %d é %d\n".6 e 3. i. printf("%d != %d é %d\n". j. j.4.6: Programa com operadores relacionais e lógicos /* Maior de Dois */ # include <stdio. i<j). se não fosse utilizado o . j. } Figura 3. &j). printf("%d <= %d é %d\n". Nesse exemplo.

UFLA/FAEPE . Mas porque usá-lo se sabemos. printf(" %d/3 é: %f ".-(unário) */% +<> <= >= == != && || = modelador (float) sobre a variável i. i. } Figura 3.6: Nível de precedência dos operadores Mais alta Mais baixa ! ++ -. # include <stdio. ou seja.30 EDITORA . que um inteiro ocupa 2 bytes? Devemos usá-lo para garantir portabilidade. O sizeof é chamado um operador porque ele é substituído pelo tamanho do tipo ou variável no momento da compilação.Introdução à Linguagem C Tabela 3. o programa imprimiria “1/3 = 0”. Ele não é uma função. Ele retorna o tamanho do tipo ou variável em bytes. O operador sizeof é usado para se saber o tamanho de variáveis ou de tipos. O sizeof admite duas formas: sizeof nome_da_variável sizeof (nome_do_tipo) . do tipo que está em seu operando.6 Operador sizeof O operador sizeof retorna o tamanho em bytes da variável. É utilizado para assegurar a portabilidade do programa.h> main( ) { int i=1. (float) i/3). e depois a conversão do resultado para float. pois. O tamanho de um inteiro pode depender do sistema para o qual se está compilando.4.8: Programa com exemplo de utilização de operador cast 3. ele faria primeiro a divisão de inteiros (1/3) resultando 0. por exemplo.

campos bit. O operador sizeof também funciona com estruturas. uniões e enumerações. Se declararmos a variável f como float e quisermos saber o seu tamanho faremos sizeof(f).Sintaxe 31 Se quisermos então saber o tamanho de um float fazemos sizeof(float). .

UFLA/FAEPE .32 EDITORA .Introdução à Linguagem C .

Aqui serão citadas apenas algumas mais comuns. 4. 4.1.5 e 4. 4. É uma função de I/O1 . Tabela 4.2.4 FUNÇÕES BÁSICAS DA BIBLIOTECA C Existem algumas funções muito usadas em programas feitos em linguagem C. 4. 4.1: Caracteres de controle da função printf \n \t \b \" \\ \f \0 nova linha tabulação retrocesso aspas barra invertida salta formulário nulo %c %d %e %f %o %s %u %x caractere simples decimal notação científica ponto flutuante octal cadeia de caracteres decimal sem sinal hexadecimal As Figuras 4. Cada argumento deve ser separado por vírgula. que permite escrever no dispositivo padrão (tela).1 FUNÇÃO PRINTF( ) Sintaxe: printf("expressão de controle". A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação que indicam o formato em que os argumentos devem ser impressos.argumentos).4. Estas são utilizadas principalmente para estabelecer a comunicação entre o usuário e o computador. 1 Input/Output: entrada/saída .6 apresentam vários exemplos de utilização da função printf em programas simples.3.

printf("\n%3.h> main( ) { printf("\n%4. 834.350). printf("\n%3. 67). } Figura 4.2f".h> main( ) { printf("Este é o numero dois: %d".13).78).0.h> main( ) { printf("\n%2d". "Vênus".350).78).2f %10.3f".2f".78). } Figura 4.78). printf("\n%4d".h> main( ) { printf("\n%10. printf("\n%10.2f %10. printf("\n%10.1: Exemplo de utilização da função printf #include <stdio. 4890. 1500. } Figura 4. 3456.34 EDITORA .350).3: Arredondamento de números em ponto flutuante #include <stdio.UFLA/FAEPE . printf("\n%6d". } Figura 4.2f".2f %10. 3456. 584.2f". 3456.1f".2: Tamanho de campos na impressão #include <stdio.Introdução à Linguagem C #include <stdio. 15.4: Alinhamento de campos numéricos . 3456. printf("%s está a %d milhões de milhas \n do sol".55. 8.3.0.2f %10.21). 2).

6: Formas para imprimir caracteres utilizando a função printf A tabela ASCII possui 256 códigos de 0 a 255. e seu endereço é o primeiro byte ocupado por ela. 21). argumentos). se imprimirmos em formato caractere um número maior que 255.4d". printf("\n%6. printf("%c %c %c %c\n". C oferece um operador para tipos básicos chamado operador de endereço e referenciado pelo símbolo & que retorna o endereço do operando. printf("\n%6. será impresso o resto da divisão do número por 256.7.h> main( ) { printf("%d %c %x %o\n". Sua sintaxe é similar a printf(). ’A’. Estas posições são chamadas de endereços. ’A’. . 21).Funções Básicas da Biblioteca C 35 #include <stdio. ’A’). } Figura 4.h> main( ) { printf("\n%04d". ’A’. } Figura 4. Um exemplo de programa que utiliza a função scanf é visto na Figura 4.2 FUNÇÃO SCANF( ) Também é uma função de I/O implementada em todos os compiladores C.0d". A lista de argumentos deve consistir nos endereços das variáveis. 0x41. printf("\n%06d".5: Complementando com zeros à esquerda #include <stdio. scanf("expressão de controle". pois o resto de 3393 por 256 é 65. Operador de endereço &: A memória do computador é dividida em bytes. Toda variável ocupa uma certa localização na memória. 0101). e são numerados de 0 até o limite da memória. ’A’. 21). se o número for 3393 será impresso A. 21). 65. Ela é o complemento de printf() e nos permite ler dados formatados da entrada padrão (teclado). 4.

Veja um exemplo na Figura 4. } Figura 4.4 FUNÇÃO PUTCHAR() Essa função escreve na tela o argumento de seu caractere na posição corrente. isdigit(). .36 EDITORA .3 FUNÇÃO GETCHAR() É a função original de entrada de caractere dos sistemas baseados em UNIX.h> main( ) { int num. tolower(). printf("\no número é %d". Há inúmeras outras funções de manipulação de char complementares às que foram vistas.7: Exemplo de programa que utiliza a função scanf 4. toupper(). #include <stdio.8: Exemplo de programa que utiliza a função getchar 4.h> main( ) { char ch. islower(). printf("\no endereço e %u". Veja um exemplo na Figura 4.ch).9. ch = getchar().num).&num). como isalpha(). scanf("%d".8. printf("Digite um número: "). printf("%c \n".UFLA/FAEPE . isupper().Introdução à Linguagem C #include <stdio. } Figura 4.&num). isspace(). A função getchar() armazena a entrada até que a tecla ENTER seja pressionada.

Funções Básicas da Biblioteca C

37

# include <stdio.h> main( ) { char ch; printf("digite uma letra minúscula : "); ch = getchar( ); putchar(toupper(ch)); putchar(’\n’); } Figura 4.9: Exemplo de programa que utiliza a função putchar

38

EDITORA - UFLA/FAEPE - Introdução à Linguagem C

5
ESTRUTURAS DE CONTROLE DE FLUXO
Os comandos de controle de fluxo são a essência de qualquer linguagem, porque governam o fluxo da execução do programa. São poderosos e ajudam a explicar a popularidade da linguagem. Podemos dividir em três categorias. A primeira consiste em instruções condicionais if e switch. A segunda são os comandos de controle de loop, o while, o for e o do-while. A terceira contém instruções de desvio incondicional goto.

5.1

IF Sintaxe:
if (condição) comando; else comando;

Se a condição avaliar em verdadeiro (qualquer valor diferente de 0), o computador executará o comando ou o bloco, de outro modo, se a cláusula 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 números:"); scanf("%d%d",&a,&b); if (b) printf("%d\n",a/b); else printf("divisão por zero\n"); } Figura 5.1: Exemplo de programa que utiliza o comando de decisão if

2: O comando de decisão if com um bloco de instruções Na Figura 5. este conjunto de instruções deve ser escrito dentro de um bloco que inicia com abre-chaves e finaliza com fecha-chaves.1. havia um bloco de dois comandos a serem executados após o if. else if (condição) comando. printf("\nO numero e %d\n".1. será indicada condição falsa para o comando if. } else printf ("Errou. #include <stdio. são pedidos dois números inteiros. printf("Qual e o numero: "). Na Figura 5. havia apenas uma instrução a ser executada após a verificação do comando if. sendo impressa a mensagem de erro. portanto. Uma variável é testada sucessivamente contra uma lista de variáveis inteiras ou de caracteres. scanf("%d".2. e depois será impresso o valor a/b somente se b for diferente de zero. if (segredo == num) { printf("Acertou!"). tente outra vez! \n"). srand(time(NULL)). 5. o comando ou o bloco de comandos é executado. Depois de encontrar uma coincidência. a e b.2 IF-ELSE-IF Sintaxe: if (condição) comando. .h> #include <stdlib.Introdução à Linguagem C No exemplo da Figura 5. segredo). portanto.UFLA/FAEPE .h> #include <time. segredo = rand( )/100.40 EDITORA . Se b for igual a zero.h> main( ) { int num. e será executado o comando alternativo (else). } Figura 5.segredo. não era necessário utilizar-se chaves.&num).

Neste caso o programa executa a declaração correspondente.Estruturas de Controle de Fluxo 41 Em uma estrutura if-else-if são colocadas várias opções que serão testadas uma de cada vez. max assumirá o valor de y. } Figura 5. começando pela 1 e continuando a testar até que seja encontrada uma expressão cujo resultado seja diferente de zero. &num). if (segredo == num) { printf("Acertou!").3: Exemplo de um programa que utiliza o comando if-else-if 5. else printf ("Errado.h> #include <stdlib. scanf("%d". caso contrário.3 OPERADOR TERNÁRIO Sintaxe: condição ? expressão1 : expressão2 É uma maneira compacta de expressar if-else.h> #include <time.h> main( ) { int num. se for falsa. A operação ? funciona da seguinte forma: a condição é testada. só será executada a declaração equivalente à primeira condição que for diferente de zero. muito alto!\n"). a variável max terá o valor de x se x for maior que y. srand(time(NULL)). printf("Qual e o numero: "). segredo). Só uma declaração será executada. A última declaração (default) é a que será executada no caso de todas as condições serem falsas e é opcional. se for verdadeira será calculada a expressão1.4. muito baixo!\n"). #include <stdio.segredo. . No exemplo apresentado na Figura 5. printf("\nO numero e %d\n". segredo = rand( )/100. ou seja. } else if (segredo < num) printf ("Errado. calcula-se a expressão2.

printf("max = %d\n". max = (x>y) ? x : y.5 LOOP FOR Sintaxe: for (inicialização. 5. Se nenhuma coincidência for encontrada o comando default será executado. } Uma variável é testada sucessivamente contra uma lista de variáveis inteiras ou de caracteres. break. &x. condição.5 apresenta um exemplo de uso do switch.Introdução à Linguagem C #include <stdio. max).h> main( ) { int x. break. case constante2: seqüência de comandos. printf("Entre com dois números: "). } Figura 5. max. Depois de encontrar uma coincidência. incremento) comando. y. Este comando é normalmente utilizado para executar repetidamente um .4: Exemplo de programa que utiliza o operador ternário 5. A Figura 5. &y). O comando for é de alguma maneira encontrado em todas linguagens procedurais de programação.UFLA/FAEPE .42 EDITORA . o comando ou o bloco de comandos é executado.4 SWITCH Sintaxe: switch(variável){ case constante1: seqüência de comandos. default: seqüência de comandos. A seqüência de comandos é executada até que o comando break seja encontrado. scanf("%d. O default é opcional. %d".

printf(" Digite sua opção: "). As Figuras 5. printf("3. A condição é uma expressão de relação que testa a variável de controle do loop contra algum valor para determinar quando o loop terminará. break. O comando for executa a inicialização incondicionalmente e testa a condição. case ’2’: printf("escolheu alteração\n"). printf("2. break. Exclusão \n"). Os três compõem a segunda família de comandos de controle de fluxo. Podemos pensar nesta família como sendo a dos comandos de repetição controlada. Inclusão \n"). switch(x) { case ’1’: printf("escolheu inclusão\n").7 apresentam dois exemplos simples de utilização do comando de repetição for. Os outros são o while e o do-while. a incialização é um comando de atribuição que o compilador usa para estabelecer a variável de controle do loop. O incremento define a maneira como a variável de controle do loop será alterada cada vez que o computador repetir a seqüência de comandos.5: Exemplo de programa que utiliza o comando switch conjunto de comandos por um número pré determinado de vezes. Se a condição for falsa ele não faz mais nada.Estruturas de Controle de Fluxo 43 #include <stdio.h> main ( ) { char x.6 e 5. case ’3’: printf("escolheu exclusão\n"). Alteração \n"). default: printf("opção inválida\n"). break. x = getchar( ). Em sua forma mais simples. Se a condição for verdadeira ele executa a . } } Figura 5. O for é o primeiro de uma série de três comandos para se trabalhar com loops (laços de repetição). printf("1.

Figura 5. x++) printf("%d\n". Ele fica repetindo estas operações até que a condição seja falsa.7: Exemplo de for com um bloco de instruções instrução (no primeiro exemplo printf) ou um bloco de instruções. que ser escrito entre chaves.6: Exemplo de for com apenas um comando #include <stdio. printf("\t %d } } Quadrado \n\n"). %d \n". portanto. Uma aplicação muito utilizada para laços de repetição é para o cálculo de séries numéricas. x<100. x<100. xq).h> main() { int x. sendo N um número determinado pelo usuário. } Figura 5. o número pode ser calculado utilizando-se a série abaixo.Introdução à Linguagem C #include <stdio. printf ("\n\t Numero for(x=1. Quanto maior N. tendo. calcula-se : £££ ¡ ¥¥¤¢  #   §      ¢§ # ¦§ ¡ ¢ ¥ § #   § # ¥       .44 EDITORA .UFLA/FAEPE . e o segundo exemplo executa um bloco com dois comandos. melhor a precisão obtida. xq.h> main( ) { int x. for(x=1. faz o incremento e volta a testar a condição. x. x++) { xq = x*x. O primeiro exemplo mostra um loop for que executa apenas um comando.x). Por exemplo. Depois de calcular o valor de S. Esta série é calculada para os N primeiros inteiros.

as funções exp() e log() fazem parte da biblioteca math.8: Programa para calcular o valor de   No exemplo apresentado na Figura 5.h e são utilizadas para se calcular uma exponencial . x. Observe que é necessário colocar-se o ponto depois de 1. float S.8 apresenta uma forma de se calcular o valor de número N de termos1 . sinal. sinal = 1. É permitido também omitir-se qualquer um dos elementos do for. N).8. } Figura 5.h: gcc -lm pi.9 e 5. printf("\n\n O valor de PI eh %f. S = S + (float)sinal/(x*x*x). printf("primeiros termos \n"). caso contrário será calculado o quociente inteiro de 1/3 que resulta no valor zero. n. printf(" \n Envie o numero de termos "). S. Versões recentes do GCC requerem que o parâmetro -lm seja passado quando o programa utiliza a biblioteca math./3)*log(32*S)). para os %d".h> #include <math. para um ¢ £¡ . por exemplo. para que o resultado seja um número em ponto flutuante. n < N.10.&N). isto é. na fração. sinal = sinal. for (n = 1. x = 1. n++) { x +=2.c -o pi 1   O programa da Figura 5. } S = exp((1. scanf(" %d ". A linguagem C permite que se utilize mais de uma variável no controle do laço de repetição for. poderemos omiti-la./3.Estruturas de Controle de Fluxo 45 #include <stdio. se não quisermos uma inicialização. S = 1. Neste caso b = 32*S e e = 1.h> main( ) { int N. Vejamos os exemplos das Figuras 5.

) printf ("loop infinito\n").12. #include <stdio. linha<=24. linha++) { for(coluna=1. x+y<100.11: Laços de for aninhados .11 e 5.46 EDITORA .10: Loop infinito #include <stdio. um for dentro de outro. } Figura 5. como nenhuma das três definições são obrigatórias.h> main( ) { for ( . } Figura 5. for(linha=1. como visto na Figura 5. y = 0. podemos deixar a condição em aberto. x+y). coluna++) putchar(’\n’). for (x = 0.++y) printf("%d ".9: Laço de for com duas variáveis de controle Um uso interessante para o for é o loop infinito.UFLA/FAEPE . como visto nas Figuras 5. } } printf("-"). Figura 5. .y.Introdução à Linguagem C #include <stdio. Outra forma usual do for é o for aninhado.coluna. coluna<40.10. ou seja.h> main( ) { int x. ++x.h> main( ) { int linha.

Estruturas de Controle de Fluxo 47 #include<stdio. k<j. . printf("\t i i^2 i^3 i^4 \n"). } } Figura 5. j<5. for ( i=1. k. k++) /* laço mais interno: eleva a j */ { temp = temp*i. j++) /* primeiro nível do aninhamento */ { temp = 1.6 WHILE Sintaxe: while(condição) comando. for ( k=0. i++) /* laço externo: define o numero base */ { for ( j=1.h> main( ) { int i.temp).13 e 5.i<10. temp. Ele permite que o código fique sendo executado numa mesma parte do programa de acordo com uma determinada condição. simples ou bloco       ele é executado desde que a condição seja verdadeira testa a condição antes de executar o laço As Figuras 5.14 apresentam exemplos de utilização do laço de repetição while.12: Programa que exibe uma tabela das quatro primeiras potências dos números de 1 a 9 5. o comando pode ser vazio. } printf("\n"). Uma maneira possível de executar um laço é utilizando o comando while. j. } printf("%9d".

%d \n".Introdução à Linguagem C # include <stdio. while (ch != ’a’) ch = getchar( ). } while(condição). mas neste caso. Figura 5. while (x < 100) { xq = x*x. printf ("\n\t Numero x = 1.48 EDITORA . . Também executa comandos repetitivos.h> main( ) { int x.14: Geração de uma tabela de quadrados de inteiros utilizando while 5. } } Quadrado \n\n").13: Exemplo simples de while #include <stdio. A principal diferença entre os comandos while e do-while é que no segundo o conjunto de instruções do bloco deverá ser executado pelo menos uma vez.16 apresentam exemplos de utilização do laço do-while. printf("\t %d x++.UFLA/FAEPE . a condição só será testada depois que o conjunto de instruções tiver sido executado pelo menos uma vez. As Figuras 5. xq. enquanto no primeiro (while) pode acontecer do bloco de instruções não ser executado nenhuma vez. } Figura 5.7 DO-WHILE Sintaxe: do {comando.h> main( ) { char ch. x. obrigatoriamente. xq).15 e 5.

8 BREAK Quando o comando break é encontrado em qualquer lugar do corpo do for. . printf("\t %d x++. } Quadrado \n\n").Estruturas de Controle de Fluxo 49 #include <stdio. 5. ele causa seu término imediato. para isso utilizamos o continue.h> main( ) { int x. } while (x <100). xq. Um exemplo é apresentado na Figura 5. printf ("\n\t Numero x = 1. Veja o exemplo da Figura 5.9 CONTINUE Algumas vezes torna-se necessário “saltar” uma parte do programa. Figura 5. %d \n".17. x. xq). do { xq = x*x.18. O controle do programa passará então imediatamente para o código que segue o loop. O comando continue força a próxima iteração do loop — pula o código que estiver em seguida.15: Geração de uma tabela de quadrados de inteiros utilizando do-while 5.

printf("2. if (ch == ’a’) break. printf("3. ) { ch = getchar( ).Introdução à Linguagem C # include <stdio. break. } Figura 5. . alteração\n"). break.50 EDITORA . case ’3’: printf("escolheu exclusao\n"). case ’2’: printf("escolheu alteracao\n"). } } while(ch != ’1’ && ch != ’2’ && ch != ’3’ && ch != ’4’). break.16: Exemplo de utilização do laço do-while main( ) { char ch. printf("4. printf("1. } } Figura 5. exclusão\n"). case ’4’: printf("sair\n"). do { ch=getchar(). for( . sair\n"). printf(" Digite sua opção:"). inclusão\n").17: Exemplo simples de utilização do comando break .UFLA/FAEPE .h> main( ) { char ch. switch(ch) { case ’1’: printf("escolheu inclusao\n").

printf ("%d\n". x).h> main( ) { int x.18: Exemplo de utilização do comando continue .Estruturas de Controle de Fluxo 51 # include <stdio. } } Figura 5. for(x = 0. x<100. x++) { if (x%2) continue.

52 EDITORA .UFLA/FAEPE .Introdução à Linguagem C .

6. se declararmos: float exemplo[20]. Quando o compilador C encontra uma declaração de matriz ele reserva um espaço na memória do computador suficientemente grande para armazenar o número de células especificadas em tamanho. Estes bytes são reservados de maneira contígua. O endereço mais baixo corresponde ao primeiro elemento.1 MATRIZ UNIDIMENSIONAL Sintaxe: tipo nome[tamanho]. . exemplo[19] ¡ ¡ Mas ninguém o impede de escrever: exemplo[30] exemplo[103]  ¥    % . Para acessá-los escrevemos: exemplo[0] exemplo[1] . A matriz é um conjunto ordenado de dados que possuem o mesmo tipo. Consiste em locações contíguas de memória. Por exemplo. As matrizes têm 0 como índice do primeiro elemento. o C irá reservar bytes. o índice varia de 0 a 9.6 MATRIZES A matriz é um tipo de dado usado para representar uma certa quantidade de variáveis que são referenciadas pelo mesmo nome. os dados serão indexados de 0 a 19. portanto sendo declarada uma matriz de inteiros de 10 elementos. Neste exemplo.

o programa tem que testar os limites das matrizes.2 e 6.4. Se o programador não tiver atenção com os limites de validade para os índices ele corre o risco de ter dados sobrescritos ou de ver o computador travar. Veja um exemplo na Figura 6. } } Figura 6. int t. As Figuras 6.2 MATRIZ MULTIDIMENSIONAL Sintaxe: tipo nome[tamanho][tamanho] .6 é apresentado . printf ("%d\n". nem mensagem de erros são enviadas. 6. Na Figura 6.3 apresentam programas que utilizam matrizes unidimensionais. A matriz multidimensional funciona como a matriz de uma dimensão (vetor).1: Exemplo simples de utilização de matriz 6. mas somente como variáveis globais. As dimensões são declaradas em seqüência entre colchetes.1.h> main( ) { int x[10].. Este é um cuidado que o programador deve tomar.54 EDITORA .t++) { x[t] = t*2.. 6. Vários erros sérios (bugs) terríveis podem surgir. Quando for inicializar uma matriz local sua classe deve ser static. for(t=0. mas tem mais de um índice.3 MATRIZES ESTÁTICAS Os vetores de dados podem ser inicializados como os dados de tipos simples.Introdução à Linguagem C Por quê? Porque o C não verifica se o índice que você usou está dentro dos limites válidos.5. 6.4 LIMITES DAS MATRIZES A verificação de limites não é feita pela linguagem.UFLA/FAEPE ..t<10. #include <stdio. x[t]). Veja um exemplo na Figura 6.

count++. int count=0. int totalnums. for (i = 0. i<5. soma. i ).&num[count]). &notas[i] ). i<5.". /* verifica quantos números foram digitados */ totalnums = count -1. for( i = 0. } Figura 6. } Figura 6. num[count]).Matrizes 55 #include <stdio.2: Exemplo de armazenamento de dados em matriz unidimensional #include <stdio. printf("Media das notas: %d.h> main ( ) { int num[100]. scanf("%d". } while (num[count-1] != -999).3: Operações com matriz . i++) { printf("Digite a nota do aluno %d: ".h> main( ) { int notas[5]. count++) printf (" %d". soma/5). for (count = 0. do { printf ("\nEntre com um numero (-999 p/ terminar): "). i. /* retira a contagem do número 999 */ printf ("\n\n\n\t Os números que você digitou foram:\n\n"). scanf ("%d". } soma = 0. count < totalnums. i++) soma = soma + notas[i].

dentro do laço de for.7. # include <stdio.3. x[i] ). excederá o tamanho da matriz (que é 10). for(i=0. printf (" %d\n ".p++) { x[t][p] = t*p.Introdução à Linguagem C # include <stdio. i. } Figura 6.1. i<100. } } Figura 6.6.h> main( ) { int i. for( i = 0. } } Figura 6. static int x[10] ={0.2.h> main( ) { int erro[10]. i++) { erro[i]=1.5: Exemplo de utilização de matriz estática um programa que causará problemas ao computador durante sua execução porque o índice da matriz erro.4. x[t][p] ).56 EDITORA . for( t = 0. printf("%d\n".UFLA/FAEPE .8. erro[i] ). i<10.6: Erro na utilização de matriz . i++) printf("%d\n". t++. t<10. int t.h> main ( ) { int x[10][10].4: Exemplo simples de utilização de matriz multidimensional #include <stdio.9}.5. p=0.

não sendo necessário colocar o ’\0’. . Uma string é uma matriz tipo char que termina com ’\0’. O caractere ’\0’ tem o código numérico 00. } Figura 7. A Figura 7.7 MANIPULAÇÃO DE STRINGS Em C não existe um tipo de dado string.1 mostra um programa simples para operação com strings.h> #include <string. #include <stdio. puts(&re[0]). // como o endereço de sua primeira posição. // um vetor de caracteres de 8 posições puts(re).h> main( ) { static char re[] = "lagarto".1 FUNÇÃO GETS() Sintaxe: gets(nome_matriz). // uma variável do tipo matriz (ou vetor ) é referenciada putchar(’\n’).1: Exemplo simples de operação com strings 7. Por essa razão uma string deve conter uma posição a mais do que o número de caracteres que se deseja. portanto pode-se verificar o final de uma string procurando o valor numérico zero armazenado na matriz de caracteres. Constantes strings são uma lista de caracteres que aparecem entre aspas. que é colocado pelo compilador. no seu lugar é utilizado uma matriz de caracteres.

A Figura 7. No programa da Figura 7.h> main() { char str[80].h> main() { puts("mensagem").4. coloca um ’\n’ no final. A Figura 7. printf("%s".3: Exemplo simples de utilização da função puts 7. # include <stdio. até que a tecla <ENTER> seja pressionada. } Figura 7. Reconhece os códigos de barra invertida. # include <stdio. Escreve o seu argumento no dispositivo padrão de saída (vídeo). Esta função faz parte da biblioteca string.2 FUNÇÃO PUTS() Sintaxe: puts(nome_do_vetor_de_caracteres). origem).2 apresenta um programa simples que utiliza a função gets. gets(str). A função gets() não testa limites na matriz em que é chamada.h> # include <string.UFLA/FAEPE .2: Programa simples que utiliza a função gets 7. .str). a string “alo” será copiada para a variável (matriz de caracteres) str.3 apresenta um programa simples que utiliza a função puts.h.Introdução à Linguagem C É utilizada para leitura de uma string através do dispositivo padrão.58 EDITORA .3 FUNÇÃO STRCPY() Sintaxe: strcpy(destino. } Figura 7. A função strcpy() copia o conteúdo de uma string para uma variável tipo string (um vetor de char).

s2). #include <string." dia").h> main() { char um[20]. strcat (um. Concatena duas strings. dois[10].h> main() { char str[20]. puts(str).5 FUNÇÃO STRCMP() Sintaxe: strcmp(s1.5. string2)."alo"). se forem iguais devolve 0. Essa função compara duas strings. A Figura 7. dois).h> # include <string.h 7.h 7.6 mostra um exemplo da função strcmp(). Não verifica tamanho. printf ("%s\n".h> #include <stdio. .4: Utilização da função strcpy da biblioteca string. "bom"). um). } Figura 7.5: Utilização da função strcat da biblioteca string. } // une a string dois à string um Figura 7.Manipulação de Strings 59 # include <stdio. Um exemplo é visto na Figura 7.4 FUNÇÃO STRCAT() Sintaxe: strcat(string1. strcpy (um. strcpy (dois. strcpy(str.

60

EDITORA - UFLA/FAEPE - Introdução à Linguagem C

main( ) { char s[80]; printf("Digite a senha:"); gets(s); if (strcmp(s,"laranja")) printf("senha inválida\n"); else printf("senha ok!\n") ; } Figura 7.6: Utilização da função strcmp da biblioteca string.h

8
PONTEIROS
Sintaxe: tipo *nomevar; Para ser um bom programador em linguagem C é fundamental que se tenha um bom domínio de ponteiros. Por isto, o leitor deve acompanhar com atenção esta parte do curso que trata deles. Ponteiros são tão importantes na linguagem C que você já os viu e nem percebeu, quando falamos da função scanf. Em scanf("%d", &num); o operador & indica o endereço de memória onde o compilador alocou a variável num ao ler a sua declaração no início 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 são muito difíceis de encontrar. Ponteiro é uma variável que contém o endereço de outra variável. Os ponteiros são utilizados para alocação dinâmica, podendo substituir matrizes com mais eficiência. Também fornecem a maneira pelas quais funções podem modificar os argumentos chamados, como veremos no capítulo de funções.

8.1

DECLARANDO PONTEIROS Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor mas sim um endereço para aquele tipo especificado. A Figura 8.1 mostra exemplos de declarações.
int *pt; char *temp, *pt2; Figura 8.1: Exemplos de declarações de ponteiros

62

EDITORA - UFLA/FAEPE - Introdução à Linguagem C

O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros para caracteres. Eles ainda não foram inicializados (como toda variável do C que é apenas declarada). Isto significa que eles apontam para um lugar indefinido. Este lugar pode estar, por exemplo, na porção da memória reservada ao sistema operacional do computador. Usar o ponteiro nestas circunstâncias 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 importância! Para atribuir um valor a um ponteiro recém-criado poderíamos igualá-lo a um valor de memória. Mas, como saber a posição na memória de uma variável do nosso programa? Seria muito difícil saber o endereço de cada variável que usamos, mesmo porque estes endereços são determinados pelo compilador na hora da compilação e relocados na execução. Podemos então deixar que o compilador faça este trabalho por nós. Para saber o endereço de uma variável basta usar o operador &. Veja o exemplo da Figura 8.2.

int count; int *pt; pt = &count; Figura 8.2: Atribuição de valor a um ponteiro

Declaramos a variável count como sendo do tipo inteiro e um declaramos um ponteiro para um inteiro, pt. A expressão &count nos dá o endereço de count, o qual armazenamos em pt. O valor de count não é alterado quando se inicializa o valor de pt. Como nós colocamos um endereço 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 fizemos pt=&count a expressão *pt é equivalente ao próprio count. Após a inicialização da variável ponteiro com o endereço da variável inteira, esta variável pode ser referenciada pelo seu nome ou pelo ponteiro que contém seu endereço. Isto significa que, se quisermos atribuir um valor para count podemos fazer de duas formas: count = 5; ou *pt = 5; As duas formas são equivalentes e têm o mesmo resultado. Qualquer modificação feita utilizando-se *pt, causará uma modificação na variável count.

que é printf("px= %d\n".3 EXPRESSÕES COM PONTEIROS Os ponteiros podem aparecer em expressões. // valor de px. então *px pode ser utilizado em qualquer lugar que x o seria. // endereço da variável x. então podemos fazer a declaração: py = px.Ponteiros 63 8.3: Utilização de ponteiros 8. que é o endereço printf("*px= %d\n".h> main( ) { int x. // imprime valor de x. assim a expressão abaixo pega o conteúdo do endereço que px aponta e soma 1. // imprime o valor de x printf("&x= %d\n". eles podem ser manipulados tal como as variáveis. py = px.2 MANIPULAÇÃO DE PONTEIROS Desde que os ponteiros são variáveis. A Figura 8. y = *px+1.*px). se px aponta para um inteiro x. valor de x px Figura 8. // y é uma variável do tipo de x .x). // conteúdo da variável apontada printf("*py= %d\n". isto é.*px. x = 9.*py.*py). Se py e px são ponteiros para inteiros.&x). O operador * tem maior precedência que as operações aritméticas. px = &x. #include <stdio. pois py = } igual ao conteúdo de px de x por px.3 apresenta um programa que exemplifica a utilização de ponteiros para acessar um variável x. printf("x= %d\n".px).

4 PONTEIROS PARA PONTEIROS Um ponteiro para um ponteiro é uma forma de indicação múltipla. A conseqüência desta atribuição é imprevisível. // y é um ponteiro do tipo de px Os incrementos e decrementos dos endereços podem ser realizados com os operadores ++ e --.5 apresenta um programa exemplo. (*px)++ /* equivale a x=x+1. No trecho de programa da Figura 8. que possuem precedência sobre o * e operações matemáticas e são avaliados da direita para a esquerda: *px++.4. os parênteses são necessários. Num ponteiro normal. o ponteiro p não foi inicializado.*/ No exemplo da Figura 8.6. o primeiro ponteiro contém o endereço do segundo. *(px--). float **balanço. seu valor é o endereço da variável desejada. pois sem eles px seria incrementado em vez do conteúdo que é apontado. 8. A Figura 8. não recebeu nenhum endereço. ou *px+=1 */ 8. // balanço é um ponteiro para um ponteiro float. Quando se trata de ponteiros para ponteiros. porque os operadores * e ++ são avaliados da direita para esquerda. portanto o valor 10 foi colocado em uma posição aleatória e desconhecida de memória. Isso pode acarretar sobreposições em áreas de dados ou mesmo área do programa na memória.UFLA/FAEPE .64 EDITORA .Introdução à Linguagem C No próximo caso somente o ponteiro será incrementado e o conteúdo da próxima posição da memória será atribuído a y. pois a cada vez que a operação com o ponteiro é utilizada. . poderá estar sendo lido ou gravado em posições desconhecidas da memória.5 PROBLEMAS COM PONTEIROS O erro chamado de ponteiro perdido é um dos mais difíceis de se encontrar. y = *(px+1). que aponta para a variável desejada. /* sobe uma posição na memória*/ /* mesma coisa de *px-.

*px+1). x=10. printf("px= %u\n". printf("px=%u\n". px = &x. *px).**q).*p. printf("%d". printf("px= %u\n". printf("px= %u\n". printf("*(px++)= %d\n". *px.6: Exemplo do erro de ponteiro perdido . } Figura 8.px). x = 10. (*px)++).5: Ponteiros para ponteiros int *p. *(px++)). px). printf("*px++-=%d\n". printf("*px+1= %d\n". printf("px= %u\n".4: Operações com Ponteiros # include <stdio. printf("(*px)++=%d\n". printf("px= %u\n". printf("*px= %d\n".px). } Figura 8.Ponteiros 65 # include <stdio. x = 1. *px+=1). printf("x= %d\n". q=&p. x). *p = x. *px++). printf("*px+=1= %d\n".h> main( ) { int x.**q. Figura 8. px).h> main() { int x. px). p=&x.px).

Introdução à Linguagem C .UFLA/FAEPE .66 EDITORA .

isto é.. sendo que eles podem ser tratados da mesma maneira. . cada uma com um endereço específico. Eis porque: tendo alocado na memória o espaço para a matriz.. ele toma o nome da variável (que é um ponteiro) e aponta para o primeiro elemento da matriz. Quando uma matriz é declarada da seguinte forma: tipo_da_variável nome_da_variável [tam1][tam2] . em bytes. Este tamanho é: tam1 x tam2 x tam3 x . [tamN]. Portanto. necessário para armazenar esta matriz. As versões com ponteiros geralmente são mais rápidas. x tamN x tamanho_do_tipo O compilador então aloca este número de bytes em um espaço livre de memória.. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz. ela pode ser descrita como uma extensa lista de posições de memória enfileiradas. o compilador C calcula o tamanho. Mas aí surge a pergunta: então como é que podemos usar a seguinte notação? nome_da_variável[índice] Isto pode ser facilmente explicado desde que você entenda que a notação acima é absolutamente equivalente a se fazer: *(nome_da_variável+índice) É preciso lembrar que a memória de um computador não tem arranjos multidimensionais. Este conceito é fundamental.. quando for declarada uma matriz de dimensão múltipla.9 PONTEIROS E MATRIZES Em C existe um grande relacionamento entre ponteiros e matrizes. o compilador colocará no programa executável uma rotina para o cálculo da posição de memória correspondente aos elementos da matriz referenciados pelos múltiplos índices.

while (t[i] = s[i]) i++.1: Cópia de uma string (versão matriz) No laço while.t). Sendo pa um ponteiro para inteiro então: pa = &a[0]. } Figura 9. conforme mostrado no programa da Figura 9.Introdução à Linguagem C Em C. e em geral pa-i aponta para i elementos antes de pa e pa+i para i elementos depois. Então sabemos que: *nome_da_matriz é equivalente a nome_da_matriz[0] 9. *nome_da_matriz e então devemos ter um índice igual a zero. É possível fazer cópia de caracteres utilizando matrizes e ponteiros.h> main( ) { int i = 0. pa+i é o endereço de a[i] e *(pa+i) é o conteúdo. é feita a cópia de cada elemento de s para cada posição de t e é incrementado o índice i até que o caractere ’\0’ finalizador de string. ou seja o valor 00 (NULL). /* é a mesma coisa de pa=&a[0]. . então por definição pa+1 aponta para o próximo elemento. de fato. ao pegarmos o valor do primeiro elemento de uma matriz. static char s[ ] = "abobora". queremos. seja encontrado em s. /*passa o conteúdo de a[0] para x */ Se pa aponta para um elemento particular de um vetor a.UFLA/FAEPE . Se pa aponta para a[0] então: *(pa+1) aponta para a[1]. # include <stdio. printf("%s\n".*/ x = *pa.1. /*passa o endereço inicial do vetor a para o ponteiro pa */ pa = a.68 EDITORA . char t[10]. a indexação de uma matriz começa com o valor zero. É porque. resultando (*nome_da_matriz+0).1 MANIPULANDO MATRIZES ATRAVÉS DE PONTEIROS Considerando a declaração da matriz int a[10].

} Figura 9. como constante. char re[ ] = "simples". strcpy (s.h> main( ) { char *ps.3: Uso de um ponteiro no lugar de uma string . } Figura 9.3. t ). t[10]. pt = &t[0]. ou seja. puts (al). ps = s. */ for( . Neste caso a string é armazenada como parte da função em que aparecem. puts (&re[0]). somente ponteiros são envolvidos."abobora"). /* ou puts(re). al. while(*ps) *pt++ = *ps++. # include <stdio. s[10]. podemos atribuir uma constante string para texto.Ponteiros e Matrizes 69 O mesmo exemplo pode ser resolvido utilizando-se ponteiros. que não é uma cópia de caracteres.h> main( ) { char *al = "conjunto". printf("%s". Um exemplo é visto na Figura 9. /* funciona como static char texto[ ] = "composto".2: Cópia de uma string (versão ponteiro) 9.2 STRING E PONTEIROS Sendo um ponteiro para caractere char *texto. char *texto = "composto". */ #include <stdio. putchar(’\n’).*pt. conforme mostrado na Figura 9. al++) putchar(*al).2.

As matrizes de ponteiros são tradicionalmente utilizadas para mensagens de erro. erro[1]). *erro[0]++). Para verificar o conteúdo de var pode-se utilizar o ponteiro armazenado em x: *x[2]."erro de leitura\n"}. Para atribuir o endereço de uma variável inteira chamada var ao terceiro elemento da matriz de ponteiros pode-se fazer um comando de atribuição simples: x[2] = &var.4. } Figura 9. Neste caso. erro[0] = "arquivo nao encontrado\n". printf("%s". erro[0]).UFLA/FAEPE .Introdução à Linguagem C 9.3 MATRIZES DE PONTEIROS A declaração de matrizes de ponteiros é semelhante a qualquer outro tipo de matrizes: int *x[10].4: Utilização de matrizes de ponteiros para mensagens de erro . ) printf("%c". que são constantes : char *erro[ ] = {"arquivo não encontrado\n".h> main( ) { char *erro[2]. #include <stdio. a matriz x contém ponteiros para variáveis inteiras. erro[1] = "erro da leitura\n". e o endereço da variável var foi armazenado na posição 2 da matriz de ponteiros (x).70 EDITORA . Um exemplo é mostrado na Figura 9. printf("%s".*erro[0]. for( .

pode-se definir uma função com o nome Printf. . e normalmente é escrito em minúsculas. Sintaxe: tipo nome(parâmetros){ comandos} Uma função pode retornar apenas um valor para o programa que a chamou. Geralmente os programas em C consistem em várias pequenas funções.10 FUNÇÕES Uma função é uma unidade autônoma de código do programa e é projetada para cumprir uma tarefa particular. Quando o código da função é escrito após a linha de comando que a chamará pela primeira vez. O nome da função deverá sempre iniciar com uma letra.2 apresenta um outro exemplo de função sem retorno. No exemplo da Figura 10. para diferenciar da função printf da biblioteca stdio.h. antes do início da função main. e este valor deve ser do tipo especificado no cabeçalho da função. Na verdade o protótipo pode ser colocado em outro lugar. 10. A Figura 10. é o tipo da função.1 a função inverso escreve a string vet em ordem reversa (do último para o primeiro caracter). escrita com P maiúsculo. Os parâmetros são valores de variáveis que serão passados pelo programa para a função. Além da variável de retorno nenhum outro valor pode ser retornado pela função para o programa que a chamou. Os parâmetros de recepção de valores devem ser separados por vírgulas. A declaração do tipo da função é obrigatória no GCC. Por exemplo. Este anúncio de função é chamado de protótipo. deve-se escrever uma linha de anúncio da existência desta função. os programadores iniciantes usam nomes com letras maiúsculas para não correrem o risco de usar nome igual ao de alguma função já definida em alguma biblioteca existente no compilador que está sendo usado. Às vezes.1 FUNÇÃO SEM RETORNO Quando uma função não retorna um valor para a função que a chamou ela é declarada como void. desde que seja antes da primeira chamada à função.

mas esta variável é o expoente que já foi passado como parâmetro..72 EDITORA . *s . A função elevado da Figura 10. então ela deve declarar as variáveis que aceitaram os valores dos argumentos. não sendo reconhecidas por outra função.h> void inverso(char *s ). ) printf("%c". Observe que no loop for da função elevado não foi feita a inicialização da variável de controle. } Figura 10. mas esta modificação não afeta a variável e da função main. Veja um . putchar(’\n’).*s--). for( .3 modifica o valor da variável expoente que lhe foi passada pela função main.UFLA/FAEPE . inverso(vet). 10. s++) t++. que funciona como o valor lógico falso. expoente) e retorna um inteiro (i) que é igual à base elevada ao expoente. A Figura 10. sendo essas variáveis os parâmetros formais. main( ) { char *vet = "abcde".1: Inversão de uma string usando uma função que recebe um ponteiro 10. t-. ele deverá declarar um tipo diferente de void para a função. /* t conta quantos caracteres tem o vetor s */ s--.2 FUNÇÃO COM RETORNO Quando o programador quiser que a função envie um valor para o programa que a chamou. O loop vai parar de ser executado quando a variável expoente atingir o valor zero.3 PARÂMETROS FORMAIS Quando uma função utiliza argumentos.Introdução à Linguagem C #include <stdio. for( . e as variáveis de uma função só existem dentro desta. } /* protótipo de função */ void inverso(char *s) /* o parâmetro passado é um ponteiro */ { int t = 0.3 apresenta um exemplo de programa que utiliza uma função que recebe dois valores inteiros (base. pois expoente é apenas uma cópia de e.

/* desloca o alfabeto uma posição */ } while(ch). scanf("%s". a variável x recebe uma cópia da variável t.2: Um codificador simples exemplo na Figura 10. onde são declarados os parâmetros formais string. A função pertence neste exemplo vai procurar um certo caractere dentro de uma string. main( ) { char letras[26]. printf("\n\n Insira uma frase a ser codificada "). portanto as alterações no processamento não alteram as variáveis. letras).5.2 Chamada por Referência Quando se deseja que uma função modifique valores das variáveis do programa que a chamou. 10. ch+1). printf("(máximo de 25 caracteres). deve-se passar para a função não a variável. Isto é feito utilizando-se ponteiros. e caractere. mas o seu endereço na memória do computador. No exemplo da Figura 10. \n"). code( letras ).4. No exemplo da Figura 10. retorna 0. printf("%c". Se for encontrado.h> void code (char *s). retorna o valor 1.6 a função . } Figura 10.3. e a modificação de seu valor dentro da função Sqr não altera o valor da variável t na função main.1 Chamada por Valor O valor de um argumento é copiado para o parâmetro formal da função.Funções 73 #include<stdio. } void code( char *s ) /* Codifica as letras */ { char ch. senão.3. do { ch = *s++. 10. uma variável do tipo char. um ponteiro que contém o endereço do início de uma string.

mas o código que compreende o corpo de uma função (bloco entre { }) está escondido do resto do programa.4 CLASSES DE VARIÁVEIS Uma função pode chamar outras funções. elevado(b. main( ) { int b.3: Função com retorno de inteiro int pertence(char *string.74 EDITORA . return 0. } int elevado(int base. a não ser que o código use variáveis globais. utilizando os ponteiros a e b que recebem os endereços de x e y respectivamente. else string++. ele não pode afetar nem ser afetado por outras partes do programa. int expoente ). printf("valor = %d\n".UFLA/FAEPE .Introdução à Linguagem C #include <stdio. printf("Digite a base e expoente x. i =1. int expoente) // são passados dois inteiros como parâmetros { int i. expoente--) i = base*i. if ((expoente<0) || (!base)) return 0. estáticas e globais. // retorna o inteiro i para a função main } Figura 10. &e). } Figura 10. . scanf("%d. &b.4: Parâmetros formais de uma função troca troca os valores contidos nas variáveis x e y de main.%d". char caracter) { while (*string) if (*string == caracter) return 1. Existem três classes básicas de variáveis: locais.e)).e. for( . return i.h> int elevado(int base. 10. y : "). expoente.

*b = temp.6: Função que utiliza passagem por referência 10. x.4. *a = *b.5: Passagem de valor de uma variável para uma função #include <stdio. main( ) { int x=10. . O armazenamento de variáveis locais por default é feito na pilha. Na realidade todas as variáveis declaradas dentro de um bloco { } podem ser referenciadas apenas dentro deste bloco.1 Variáveis Locais As variáveis que são declaradas dentro de uma função são chamadas de locais. int *b) // *a e *b são ponteiros que recebem os endereços de x e y { int temp.t). y).h> int Sqr( int x ). temp = *a. } void troca (int *a. Elas existem apenas durante a execução do bloco de código no qual estão declaradas. } Figura 10.Funções 75 #include <stdio. troca(&x. printf("%d eh o quadrado de %d".h> void troca (int *a. printf("x=%d y=%d\n". int *b ). y=20. main( ) { int t =10.&y). Sqr(t). /* Modificação no valor de x não altera t */ return(x). } int Sqr(int x) { x = x*x. } Figura 10.

ela será uma variável global. scanf ("%d".UFLA/FAEPE . Sendo a variável cont declarada fora de qualquer função do programa. Permanecem com seu valor durante toda execução do programa. i <= x.*/ } Figura 10. func1. /* A variável i na função linha não é reconhecida pela função main. . Um exemplo é visto na Figura 10. 10.4.2 Variáveis Globais São conhecidas por todo programa e podem ser usadas em qualquer parte do código. No entanto só são reconhecidas na função onde estão declaradas.4. Fica numa região fixa da memória própria para esse fim. linha (tamanho).h> void linha (int x). func1 irá escrever o valor 109 (e não 100) para cont. sendo. #include <stdio. resulta na modificação do mesmo cont em func1. } void linha(int x) { int i. conservando o valor durante a execução de diferentes funções do programa. A Figura 10. conforme pode ser visto no programa da Figura 10.9.Introdução à Linguagem C assim sendo uma região dinâmica. func2). i++) putchar(95). for( i = 0.7: Variáveis locais em uma função 10.3 Variáveis Estáticas Funcionam de forma parecida com as variáveis globais. Logo. printf ("Digite o tamanho: "). São muito utilizadas para inicializar vetores.8. portanto reconhecida pelos três blocos de programa (main. main( ) { int tamanho. &tamanho). Deve ser declarada fora de qualquer função e até mesmo antes da declaração da função main. A modificação do valor de cont em func2.76 EDITORA .7 apresenta um exemplo de função que utiliza variáveis locais.

printf ("cont é = %d".h> void func1( ). ").6. int cont. temp).h> main( ) { int i. main( ) { cont = 100. } Figura 10. temp = cont. } Figura 10.9}.5. } void func1( ) { int temp.8: Variáveis globais em um programa #include <stdio. for(cont =1.Funções 77 # include <stdio.2. i<10.9: Variáveis locais em uma função .7.4. static int x[10] = {0. func2( ). cont<10. func1( ). i++) printf (" %d \n ". printf ("temp é = %d". cont). cont++) printf(" . x[i]). func2( ).1.8.3. } void func2( ) { int cont. for(i=0.

conforme se vê na Figura 10. poderia ter sido escrita utilizando-se um ponteiro na passagem de parâmetros. teremos dentro de func() um int* chamado matrx. i < 10. #include <stdio.10 apresenta um exemplo de função que trabalha com uma matriz. main( ) { int t[10].5.h> void mostra (int num[ ] ). . num[i]).Introdução à Linguagem C 10. Podemos declarar func() das três maneiras seguintes: void func (int matrx[50]).11.10. Veja que. Note que. no caso de estarmos passando uma matriz para uma função. for ( i = 0.10: Função que utiliza uma matriz A função mostra. e que queiramos passá-la como argumento de uma função func(). } Figura 10. void func (int *matrx). i++) t[i] = i. Isto faz com que possamos alterar o valor desta matriz dentro da função.1 FUNÇÕES COM MATRIZES Passando Parâmetros Formais Para passar uma matriz para uma função é necessário passar somente o endereço e não uma cópia da matriz. } void mostra ( int num[ ] ) { int i. i < 10. teremos de passá-la através de um ponteiro. i. A Figura 10.78 EDITORA . for( i = 0. nos três casos. Quando vamos passar uma matriz como argumento de uma função. Digamos que temos a seguinte matriz: int matrx [50]. i++ ) printf ("%d".5 10. mostra(t).UFLA/FAEPE . podemos declarar a função de três maneiras equivalentes. da Figura 10. void func (int matrx[]).

12: Função que procura uma substring dentro de uma string . str[t] . char *p. avança. Sem o uso da segunda declaração return.Funções 79 void mostra ( int *num ) { int i. i < 10. foi encontrada a substring */ } return -1. *p2. /* pega o ponto de início de str */ p2 = sub. for (t = 0. } Figura 10. t++) { p = &str[t].11: Função que opera sobre uma matriz utilizando um ponteiro A Figura 10. /* verificado igualdade entre os caracteres */ p2++. i++) printf ("%d". char *str) { register int t. encontra_substr(char *sub. se nenhuma correspondência for encontrada. */ } if (!*p2) return t. uma variável temporária e código extra precisariam ser usados. for( i = 0. *(num+i)). while(*p2 && (*p2==*p)) /* enquanto nao for final de sub e for */ { p++. /* se está no final de sub.12 apresenta um exemplo de função que recebe dois ponteiros como argumentos e retorna um inteiro. Verifique que existem duas declarações return. } Figura 10. visto que a função terminará quando passar pela primeira linha contendo return. o que é perfeitamente possível em C. /* de sub e str. Ela retorna o índice de início de uma substring dentro de uma string ou -1.

Introdução à Linguagem C 10.13 mostra um exemplo de como fazê-lo utilizando um ponteiro que aponta para o primeiro elemento da matriz s.13: Alterando valores de uma matriz . } } Figura 10. #include <stdio.UFLA/FAEPE . main( ) { char s[80]. printf ("%c". } void maiusc (char *string) { register int t.2 Alterando os Valores da Matriz Existem várias formas de se alterar os valores de uma matriz utilizando-se uma função. string[t] ). t++) { string[t] = toupper ( string[t] ). for( t = 0. maiusc(s). gets(s). A Figura 10.80 EDITORA .5. string[t].h> void maiusc (char *string ).

} printf("alo %s". e seja emitido um sinal sonoro (o correspondente ASCII do número 7).2 deve ser chamado na linha de comando como NomePrograma 3 display. char *argv[ ] ) { if (argc != 2) { printf("falta digitar o nome\n"). O primeiro argumento (argc) é a quantidade de argumentos que foram passados quando o programa foi chamado. Por convenção argv[0] é o nome do programa que foi chamado. depois de compilado. Cada argumento da linha de comando deve ser separado por um espaço ou tabulação. O programa da Figura 11. para que seja apresentada na tela a contagem 3. #include <stdio. 1. exit(0). portanto argc é pelo menos igual a 1.1 apresenta um programa simples que utiliza argumentos na linha de comando. a contagem não será apresentada. um para cada string.h> int main( int argc. Se não for digitado o número 3 e a palavra display. A Figura 11. argv[1]). Então ele escreverá na tela do computador a mensagem: “alo NomeUsuário”.1: Programa que recebe uma string na linha de comando Este programa.11 ARGUMENTOS DA LINHA DE COMANDO No ambiente C existe uma maneira de passar argumentos através da linha de comandos para um programa quando ele inicia. 2. o segundo argumento (argv) é um ponteiro de vetores de caracteres que contém os argumentos. . deverá ser chamado na linha de comando como NomePrograma NomeUsuário. } Figura 11.

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

Uma declaração de estrutura forma um modelo que pode ser usado para criar variáveis de estruturas. a União (union) permite que duas ou mais variáveis de tipos diferentes utilizem a mesma posição de memória alternadamente. como indicado na formulação geral da Figura reffig:estrutura. União. Estes tipos de dados são compostos por vários tipos básicos do C. Campo-bit. o Campo-bit é um tipo de Estrutura que permite acesso individualizado aos bits de uma variável. a Enumeração (enum) é uma lista de símbolos. de forma separada. este item é opcional na declaração da estrutura. no exemplo. . mas na verdade são conjuntos de coisas.1 ESTRUTURAS Ao manusearmos dados. Enumeração e Tipo-definido. A Estrutura (structure) é um agrupamento de variáveis sob um mesmo nome.txt. porque utiliza o comando typedef para dar um outro nome a um tipo de dado já existente. Uma estrutura é uma coleção de variáveis referenciadas por um único nome. As variáveis que compreendem a estrutura são chamadas de membros da estrutura ou campos da estrutura. A palavra reservada struct usada para definir uma estrutura. primeiro imediatamente após a declaração da estrutura. depois. A figura 2 apresenta um exemplo simples de uma estrutura que poderia ser usada para o banco de dados de clientes de uma agência bancária. variáveis_estrutura é uma lista de variáveis do tipo identificador. muitas vezes nos deparamos com informações que não são fáceis de armazenar em variáveis escalares como são os tipos inteiro e ponto flutuante. provendo um meio conveniente de manter informações relacionadas agrupadas. e o Tipo-definido seria melhor chamado como Tipo-redefinido.12 TIPOS DE DADOS DEFINIDOS PELO USUÁRIO A linguagem C permite ao programador criar seus próprios tipos de dados de cinco formas diferentes: Estruturas. As variáveis estrutura são declaradas de duas formas diferentes. O identificador dá nome ao novo tipo de variável estrutura criado. 12.

2. a estrutura Conta_Banco possue 7 campos. } variáveis_estrutura. Figura 12.Introdução à Linguagem C struct identificador { tipo nome_de_elemento_1. char nome[30]. Cliente_especial[100].2: Declaração de uma estrutura para clientes de um banco No exemplo da Figura 12. tipo nome_de_elemento_N. int Digitos_CPF. float Saldo.84 EDITORA . } Gerente.. char nome[30]. float Saldo. Depois é utilizada uma string para armazenar o nome e sobrenome do cliente. char Sexo. sendo o primeiro. e . . struct Conta_Banco { int Num_conta. Figura 12. int Data_Abertura [8]. que podemos dizer que deve ter no máximo 4 dígitos. unsigned long int CPF. int Digitos_CPF. int Data_Abertura [8].UFLA/FAEPE . Cliente_especial[100]. unsigned long int CPF. char Sexo.. um inteiro que armazena o número da conta. struct Conta_Banco Gerente.1: Forma geral de declaração de uma estrutura struct Conta_Banco { int Num_conta. O segundo e o terceiro campos são um número inteiro que deverá comportar os 9 algarismos do CPF e um inteiro para guardar o par de digitos verificadores do CPF. tipo nome_de_elemento_2. Cliente_padrao[1000]. }. Cliente_padrao[1000].

inclusive outras estruturas. É como criar uma variável de qualquer outro tipo. é feita como a passagem de qualquer parâmetro. Os membros de uma estrutura podem ser qualquer tipo de dados conhecidos da linguagem C. Gerente.Tipos de Dados Definidos Pelo Usuário 85 um char para idientificar o sexo (’M’ ou ’F’).1 Trabalhando com Estruturas Após criar o novo tipo de variável. char. Neste caso todos os elementos do lado esquerdo da atribuição receberão os valores dos elementos correspondentes da estrutura do lado direito. A única coisa que o programador deve observar é que o tipo da variável que receberá o valor na função tem que ser o mesmo tipo do parâmetro da estrutura que está sendo passado.3 apresenta um trecho de código com várias referências aos membros das variáveis declaradas na Figura 12. ou podem ser outros tipos de dados criados pelo programador.2 foram mostradas duas formas de criar variáveis do tipo estrutura. inclusive ponteiros. Matrizes de estruturas são muito usadas. . Foram criadas três variáveis. int. A primeira atribui um saldo à conta do gerente (variável Gerente). A segunda e a terceira são vetores (matrizes unidimensionais) que armazenam várias variáveis do tipo Conta_Banco. Como acessar os campos individuais dentro de cada variável estrutura ? Membros individuais da estrutura são referenciados pelo uso do operador de seleção de membro: o ponto. para declará-la primeiro define-se a estrutura e então declara uma variável matriz daquele tipo. Um float armazena o saldo do cliente e um vetor de inteiros indica a data da abertura da conta. e um exemplo incorreto. Se duas variáveis são do mesmo tipo. Vamos utilizar o exemplo da segunda forma. o nome da estrutura é indexado. Passando elementos da estrutura para funções A passagem de elementos de estruturas para funções não tem segredos. A primeira é uma variável simples. temos que criar algumas variáveis deste tipo. 12.2. no caso uma estrutura. etc. podendo ser por valor ou por referência. Na Figura 12. uma forma é declarar a variável logo após a declaração da estrutura e a outra forma é declarar a variável como outra qualquer na lista declaração de variáveis.1. A Figura 12. Para acessar uma estrutura específica. e depois utilizá-las no programa. pode-se atribuir uma a outra.4 mostra alguns exemplos de passagens. A Figura 12.

UFLA/FAEPE . . .. char Nome[30] struct Conta_Banco Gerente.5. float recebe. Cliente_padrao[1000]. tanto a variável de chamada. Quando usar uma estrutura como um parâmetro. param.. . são do tipo struct exemplo. i = 12. Cliente_padrão[j].... j.Saldo = 12947. . quanto o parâmetro que a recebe na função. /* Fim do Programa */ Figura 12. j. a estrutura inteira é passada usando o método padrão de chamada por valor. Qualquer modificação feita na variável estrutura dentro da função não afetará a variável usada para chamar a função.51. . Nome = Cliente_especial[i]..3: Exemplos de acesso a membros de variáveis do tipo estrutura } Passsando estruturas inteiras para funções Quando uma estrutura é usada como argumento para uma função. j++) printf("\n\n Nome do cliente %d = %s "..86 EDITORA . Cliente_especial[100]. .Introdução à Linguagem C int main (void) { int i. Gerente. arg.. for (j = 500.Nome).Sexo = ’F’. lembre-se de que o tipo de argumento deve coincidir com o tipo de parâmetro. Cliente_especial[10]... No exemplo da Figura 12. j <510.Nome.

return 0.Novo].9. Atualiza_Saldo(Gerente. Atualiza_Nome(Cliente_especial[12]. Nome_Novo[30]. /* passagem por referência */ .. }... Atualiza_Saldo(Cliente_padrao[273].Num_conta. /* passagem por valor */ . Saldo.20) . return 0.. Atualiza_Saldo(Numero.. /* função para atualizar saldo de uma conta cujo número está sendo passado int Atualiza_Saldo( int Numero. unsigned long int CPF.09. Giacomin */ int Atualiza_Nome( char Velho[30].. Saldo).nome.. int Data_Abertura [8]. float Saldo. Nome[30]. retorna zero */ } /* função para atualizar Nome de cliente.Sexo.. de Joao Giacomin para: Joao C. float Saldo_Novo) { procedimentos da função. char Sexo. } main( ) { int float char struct */ Numero. } */ Figura 12. /* Inicializar programa e variáveis */ .Tipos de Dados Definidos Pelo Usuário 87 struct Conta_Banco { int Num_conta. Cliente_especial[100]. Novo[30]) { strcpy(Velho. por exemplo. /* se a função teve sucesso. Cliente_padrao[1000].4: Exemplos de passagens de elementos de estruturas para funções Ponteiros para estruturas A linguagem C permite ponteiros para estruturas da mesma maneira que aceita ponteiros para qualquer outro tipo de variável.Nome_Novo). /* passagem por valor */ . 1893.atribuição de um char a um int */ . 1893. . char nome[30]. scanf("%s". Saldo). /* passagem por valor . Saldo = 34587. Conta_Banco Gerente. int Digtos_CPF..Num_conta. Atualiza_Saldo(Gerente.. Saldo = 187.. &Nome_Novo[0]).. /* Erro .20).

parm.b. }.7 apresenta a utilização deste operador no exemplo da Figura 12. existe um operador especial definido pela linguagem C. } Figura 12. A solução para esse problema é passar somente um ponteiro para a função (Figura 12. A Figura 12.parm. O operador * é raramente utilizado quando trabalhamos com ponteiros para estruturas.6 . func_1(arg).5: Exemplo de passagem de uma estrutura inteira para uma função Para declarar um ponteiro para estrutura coloca-se o operador * na frente do nome da variável. ch=’a’.b=1000. mas isto se torna inviável enquanto as estruturas se tornam cada vez maiores. o operador & é colocado antes do nome da variável estrutura. O grande problema quando se trabalha com estrutruras grandes é o tempo gasto para passar todos os parâmetros pela pilha. que é composto pelo sinal negativo seguido pelo sinal de maior: “->”.88 EDITORA . /* protótipo */ int main( ) { struct exemplo arg.UFLA/FAEPE . char ch. isto passa a demandar muito tempo de execução. é o operador seta.a. Para encontrar o endereço de uma variável estrutura.Introdução à Linguagem C struct exemplo { int a. return 0.parm. Pode-se passar toda a estrutura para uma função.a=arg. arg.6). void func_1(struct exemplo). Exemplo: struct Conta_Banco *inf_cliente. Para o acesso a um membro de uma estrutura. } void func_1(struct exemplo parm) { printf("%d\n%d\n%c".b.ch).

*p_Conta. return 0. elas podem ser declaradas posteriormente como se declaram as variáveis inteiras e de ponto flutuante. como mostrado na Figura 12.Tipos de Dados Definidos Pelo Usuário 89 struct Conta_Banco { /* a mesma estrutura da figura 12. } Figura 12. /* coloca o endereço de Gerente no ponteiro */ printf(" \n Saldo do Gerente = %f ".8.7: Exemplo de passagem de uma estrutura inteira para uma função 12.6: Exemplo de ponteiro para estrutura int main( ) { struct Conta_Banco p_Conta = &Gerente. (*p_Conta). Gerente. } Figura 12. A declaração de uma união é semelhante à declaração de uma estrutura. p_Conta->saldo). */ int main( ) { struct Conta_Banco Gerente. printf(" \n Saldo do Gerente = %f ".2 UNIÕES Uma declaração union determina uma única localização de memória onde podem estar armazenadas várias variáveis diferentes. *p_Conta. As variáveis_union não precisam ser declaradas imediatamente após a declaração da union. return 0.saldo). /* declara um ponteiro para uma estrutura Conta_Banco */ p_Conta = &Gerente. .4 }.

coloca-se a palavra chave enum. usa-se o operador ponto.9 apresenta dois exemplos de uniões.9.3. Finalmente.14 na variável Temp_1. verifique no exemplo da Figura 12.Introdução à Linguagem C Quando uma variável union é declarada..9 que o acesso a um elemento union utiliza a mesma sintaxe das estruturas: os operadores ponto e seta. São mostradas também formas diferentes de se acessar os elementos das uniões.3 ENUMERAÇÕES Uma enumeração é uma extensão da linguagem C acrescentada pelo padrão ANSI. a memória alocada corresponde ao tamanho da maior variável na union. Edite e execute o programa da Figura 12.. Uma enumeração é um conjunto de constantes inteiras que especifica todos os valores legais que uma variável de um tipo específico pode ter. 12.Faren. muito cuidado deve ser tomado na sua utilização. Se a variável union é acessada por meio de um ponteiro. tipo_2 nome_2. Quando se opera diretamente na union. e a segunda de tipos diferentes. union nome_da_union { tipo_1 nome_1. No exemplo da Figura 12. porque Faren e Celcius ocupam a mesma posição de memória da variável Temp_1. depois uma lista de palavras entre chaves e em seguida os nomes das variáveis que terão . Neste caso. a primeira possui elementos do mesmo tipo. Evite armazenar uma variável de um tipo em uma union e acessá-la como variável de outro tipo. portanto. As formas de passar variáveis tipo union para funções são as mesmas da passagem de variáveis struct. As enumerações são definidas como as estruturas. Uniões podem ser feitas com variáveis de diferentes tipos. A união Identificador abriga três tipos de variáveis diferentes.Celcius. tipo_n nome_n.8: Forma geral de declaração de uma união A Figura 12. .9 e verifique alguns possíveis erros que poderão ocorrer na execução da função printf. usa-se o operador seta. ao se colocar o valor 54. São definidas de modo semelhante às estruturas com a palavra reservada enum usada para indicar o início de um tipo enumerado.90 EDITORA . o compilador cria automaticamente uma variável grande o bastante para armazenar o tipo da variável de maior tamanho na union. Por isso não foi mais possível recuperar o valor 12. float. } variáveis_union. Figura 12. este valor foi atribuido também a Temp_1.UFLA/FAEPE .

Portanto. seus valores estarão em seqüência iniciando de zero. se atribuíssemos o valor 5 ao símbolo Seg. eles podem ser usados em qualquer lugar em que um inteiro possa ser usado. por exemplo. . Se cada símbolo corresponde a um inteiro. neste exemplo. eu vou chamar a atenção para um fato curioso. . e os outros viriam na seqüência. Se não for atribuido nenhum valor aos símbolos. 12. Se o usuário tivesse a intenção de utilizar esta enumeração em uma chave. Tal como nas estruturas e uniões. O typedef poderia se utilizado para chamar de Real qualquer variável do tipo float. O ponto-chave para o entendimento das enumerações é que cada símbolo representa um valor inteiro.10 apresenta um exemplo de enumeração que um aluno utiliza para organizar seu horário de aulas semanais. mas da forma como foi feito o programa ficou bem mais legível. Onde tipo é qualquer tipo de dado permitido e nome é o novo nome para esse tipo. ao contrário. Por exemplo. como no exemplo. mas. Ter = 6. A variável semana é uma enumeração dos dias da semana. poderia ter somado 1 ao valor da variável Dia. e gostaria que cada dia da semana correspondesse ao seu número de ordem. os nomes das variáveis não precisam vir imediatamente após a declaração da enumeração. usando-se a palavra reservada typedef. então pode-se atribuir os símbolos a variáveis inteiras. e Sab = 6. Verifique.4 TYPEDEF A linguagem C permite definir explicitamente novos nomes de tipos de dados conhecidos. Seg = 5. Para finalizar. A vantagem de se fazer isto é que a palavra Real nos traduz melhor o sentido dos números em ponto flutuante que a palavra float. Não se cria um novo tipo de dado. Sab = 10. comando switch. poderíamos atribuir alguns valores. como pode ser visto na Figura 12. que é o dia correspondente ao número inteiro 5. . define-se um novo nome para um tipo existente.11. neste exemplo. Dom=1. então teríamos: Dom = 0. ou poderia ter feito no programa a seguinte atribuição: Dia = Qui. . Forma geral: typedef tipo nome.Tipos de Dados Definidos Pelo Usuário 91 este tipo de enumeração. A Figura 12. atribuiria apenas o primeiro símbolo. Dom = 0. na declaração da enumeração (Seg = 5). Portanto. . Seg = 1. que poderiam ser colocados os valores inteiros de 1 a 7 no lugar dos símbolos de Seg a Dom. Assim poderia pesquisar o horário de quinta-feira. Se quiséssemos mudar esta seqüência. se o programador quisesse saber as aulas de amanhã. Dessa forma.

Dois exemplos de utilização de typedef podem ser vistos na Figura 12. vai traduzir a palavra Real para float e depois compilar normalmente. A linguagem C tem um modo próprio de acessar um ou mais bits dentro de um byte ou palavra. certas interfaces de dispositivos transmitem informações codificadas em bits dentro de um byte. As variáveis campos-de-bits possuem certas restrições: não se pode obter seu endereço. No entanto é válido misturar membros normais de estrutura com elementos compos-bit.92 EDITORA . Vamos. mas o tamanho de cada elemento. o compilador vai ler todas as declarações de variáveis tipo Real. Verifique que se trata de uma estrutura. ou uma union. ou campo. Os tamanhos indicados acima são dados em números de bits. se o espaço é limitado.12. por exemplo. ou uma enum. Os membros. ou campos. certas rotinas de codificação de dados necessitam acessar os bits dentro de um byte. como uma struct. A Figura 12. não se pode sobrepor o limite dos inteiros.Introdução à Linguagem C Mas não há problema em se fazer isto? Não. u_graus. O typedef torna-se especialmente útil quando deseja-se utilizar um identificador único para um tipo novo de variável que foi criada. A Figura 12. pode-se armazenar muitas variáveis booleanas (true/false) em um byte. não podem ser colocadas em matrizes. Um campo-bit é somente um tipo de membro de estrutura que define o quão grande. segundo. em bits. . e terceiro. Um método que a linguagem C utiliza para acessar os bits baseia-se na estrutura chamada campos-bit. cada elemento deve ser. das variáveis deste tipo podem ser acessados tal como são acessados os membros de uma estrutura comum. Isso pode ser útil por diversas razões: primeiro. para declarar uma variável deste tipo de união. Isto traz mais legibilidade ao programa. union graus.9 Verifique que a única diferença agora é que é preciso escrever apenas um identificador. e não escrever dois identificadores. que é uma forma diferente do exemplo da Figura 12.UFLA/FAEPE .13 apresenta a forma geral de uma estrutura tipo campos-de-bits. declarar uma estrutura de campos bit que nos permite acesso a um byte pedaço por pedaço.14 apresenta um exemplo de estrutura de campos-de-bits. 12.5 CAMPOS-DE-BITS Campos bit são uma extensão da estrutura simples que permite que os bits individuais de uma determinada estrutura sejam acessados. é definido em bits.

p_T->Faren = Temp_2.3. / * p_T é um ponteiro tipo union graus union Ientificador Id_1. /* /* Aqui o número 12.Celcius + 40) * 9 / 5 p_T = &Temp_1. printf ("\n Temperatura = %f ".Celcius).3 de Temp_1 foi substituído por 54. /* Será impresso o valor 54.Letra. Temp_2.Tipos de Dados Definidos Pelo Usuário 93 union graus { float Celcius.9: Declarações de uniões e formas de utilização . printf ("\n Letra = %c \n Inteiro = %d \n Real = %f ". Identificador.14 */ Identificador.Faren = (Temp_1.Letra = ’A’ .14 calculado acima */ Se for feita uma tentativa de ler o valor 12. return 0. Identificador.3. só se conseguirá 54. Temp_1. } Figura 12. int Inteiro. *p_T. }. } int main ( ) { union graus Temp_1. Id_2. Identificador.Celcius = 12.40.Real). float Faren.Inteiro.14 */ */ .Faren. union Identificador { char Letra. Temp_2. float Real. Temp_1.

Sex. int main ( ) { int Dia . default: printf } return 0. ("\n Fim de semana\n"). Dia). switch(Dia) { case Seg: printf break. case Ter: printf break. ("\n História\n Portugues\n Geografia\n"). Sex. ("\n Geografia\n Matemática\n Portugues\n"). Figura 12. Seg. scanf("%d". Sab} Escola. Ter. case Qui: printf break.10: Exemplo de enumeração enum Semana {Dom = 1.94 EDITORA . Qua. Qui. Qui. case Sex: printf break. Seg.11: Exemplo de utilização de uma enumeração ("\n Portugues\n Matematica\n Geografia\n"). Sab}. ("\n Ingles\n História\n Matematica\n"). Ter.Introdução à Linguagem C enum Semana {Dom. Qua. case Sab: case Dom: printf break. case Qua: printf break. ("\n Matematica\n Geografia\n Ingles\n"). enum Semana Escola.UFLA/FAEPE . ("\n Dia errado\n"). } Figura 12. .

tipo nome_N: tamanho_N. tipo nome_2: tamanho_2. }. float Faren.3.. } Figura 12.Celcius + 40) * 9 / 5 p_T = &Temp_1..Faren.Celcius ).12: Utilizando typedef . p_T -> Faren = Temp_2. ) { Temp_1 Temp_2. struct nome_do_tipo_estrutura { tipo nome_1: tamanho_1.13: Forma geral de campos-de-bits . ". . printf ( "\n Temperatura = %f return 0. } Figura 12.Celcius = 12. Temp_2. /* p_T é um ponteiro tipo union graus */ Temp_1. Temp_1. *p_T.40. typedef union graus int main ( u_graus u_graus u_graus u_graus.Tipos de Dados Definidos Pelo Usuário 95 union graus { float Celcius.Faren = (Temp_1.

. } Figura 12. tipo nome_N: tamanho_N.UFLA/FAEPE .Introdução à Linguagem C struct nome_do_tipo_estrutura { tipo nome_1: tamanho_1.. tipo nome_2: tamanho_2.96 EDITORA .14: Exemplo de estrutura de campos-de-bits ..

onde um ponteiro de arquivo define vários aspectos do arquivo.13 NOÇÕES DE MANIPULAÇÃO DE ARQUIVOS Para tratar de arquivos a linguagem C fornece um nível de abstração entre o programador e o dispositivo que estiver sendo usado. . O modo de abertura diz à função fopen() que tipo de uso você vai fazer do arquivo. Seu protótipo é: FILE *fopen (char *nome_do_arquivo. Existe um sistema bufferizado de acesso ao arquivo.1 mostra um programa exemplo que escreve uma seqüência de números em um arquivo (teste. p será então um ponteiro para um arquivo.1 ABRINDO E FECHANDO UM ARQUIVO No sistema de entrada e saída ANSI é definido o tipo “ponteiro de arquivo”. status e posição corrente. Podemos declarar um ponteiro de arquivo da seguinte maneira: FILE *p. além de ter a fila associada a ele. como nome.1 A Função fopen() Esta é a função de abertura de arquivos.1 mostra os valores de modo válidos. O nome_do_arquivo determina qual arquivo deverá ser aberto. Esta abstração é chamada fila de bytes e o dispositivo normalmente é o arquivo. Este nome deve ser válido no sistema operacional que estiver sendo utilizado. A Tabela 13.h dependendo do seu compilador.1. É usando este tipo de ponteiro que vamos poder manipular arquivos no C.dat) e depois lê os valores contidos no arquivo. A Figura 13. 13. mas uma definição usando o comando typedef. Este não é um tipo propriamente dito. Esta definição está no arquivo cabeçalho stdio. char *modo). 13.h ou stdlib.

} } Figura 13.1: Escrevendo e lendo em arquivo Poderíamos então.bin". *pn. pn = &nu. "r")."wb")."%d ". 13. while(!feof(fp)) { fscanf( fp. while(nu) { fprintf (fp. int nu. escrever: FILE *fp.Introdução à Linguagem C #include <stdio. scanf("%d".2 A Função exit() Aqui abrimos um parêntesis para explicar a função exit() cujo protótipo é: . printf("Entre com os numeros para gravar e 0 para sair: "). if (!fp) printf ("Erro na abertura do arquivo.h> main ( ) { FILE *fp. char ch. nu). A condição !fp testa se o arquivo foi aberto com sucesso porque no caso de um erro a função fopen() retorna um ponteiro nulo (NULL).dat". printf( "%d". nu)."). scanf("%d". &nu). fp = fopen("teste. fp = fopen ("exemplo.98 EDITORA . } fclose(fp)."%d ". "w").dat".UFLA/FAEPE .1. &nu). &nu). fp = fopen("teste. para abrir um arquivo binário.

Noções de Manipulação de Arquivos 99 Tabela 13. A função exit() se torna importante em casos como alocação dinâmica e abertura de arquivos pois pode ser essencial que uma determinada memória seja alocada ou que um arquivo seja aberto. Poderíamos reescrever o exemplo da seção anterior usando agora o exit() para garantir que o programa não deixará de abrir o arquivo.3 A Função fclose() Quando abrimos um arquivo devemos fechá-lo.1. o código_de_retorno. 13. como é mostrado na Figura 13. para o sistema operacional. Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne. Para tanto devemos usar a função fclose(): .1: Modos válidos 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" Significado Abre um arquivo para leitura Cria um arquivo para escrita Acrescenta dados no fim do arquivo (“append”) Abre um arquivo binário para leitura Cria um arquivo binário para escrita Acrescenta dados binários no fim 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 binário para leitura e escrita Cria um arquivo binário para leitura e escrita Acrescenta dados ou cria uma arquivo binário para leitura e escrita Abre um arquivo texto para leitura Cria um arquivo texto para escrita Acrescenta dados no fim 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).2. A convenção mais usada é que um programa retorne zero no caso de um término normal e retorne um número não nulo no caso de ter ocorrido um problema. Esta função aborta a execução do programa.

} Figura 13. getc.bin". outras funções existem no padrão ANSI para se escrever e se ler em arquivos. Se perdermos o ponteiro de um determinado arquivo não poderemos nem fechá-lo.UFLA/FAEPE .. há uma espécie de posição atual no arquivo. É utilizando este ponteiro que vamos poder trabalhar com o arquivo. /* Comandos.2 LENDO E ESCREVENDO CARACTERES EM ARQUIVOS Além das funções fprintf e fscanf vista no exemplo inicial.100 EDITORA . */ fp = fopen ("exemplo. if (!fp) { printf ("Erro na abertura do arquivo.2: Uso da função exit na abertura de arquivos int fclose (FILE *fp). A função retorna zero no caso de sucesso. “Perder” neste caso seria se atribuir um valor de um outro ponteiro qualquer ao ponteiro de arquivo (perdendo assim o valor original). É importante que se perceba que se deve tomar o maior cuidado para não se “perder” o ponteiro do arquivo.2. é a posição de onde será lido ou escrito .").. } /* Comandos . Aqui serão citadas brevemente as funções putc. Esta posição. 13.1 putc() Toda vez que estamos trabalhando com arquivos. e a função feof que verifica o se o arquivo chegou ao final.. Fim de programa. gerenciada pelo compilador. exit (1).Introdução à Linguagem C #include <stdio. */ return 0. "wb").. O ponteiro fp passado à função fclose() determina o arquivo a ser fechado. 13.h> main (void) { FILE *fp.

Escreve um caracter no arquivo. Protótipo: int getc (FILE *fp). Às vezes.FILE *fp).2. . não temos que mexer nesta posição pois quando lemos um caractere a posição no arquivo é automaticamente atualizada. Protótipo: int putc (int ch. 13.Noções de Manipulação de Arquivos 101 o próximo caracter. é necessário verificar se um arquivo chegou ao fim. Ela retorna não-zero se o arquivo chegou ao EOF. Seu protótipo é: int feof (FILE *fp).2 getc() Retorna um caracter lido do arquivo. num acesso seqüencial a um arquivo.2. 13. Para isto podemos usar a função feof(). caso contrário retorna zero. Normalmente. Num acesso randômico teremos que mexer nesta posição (ver fseek()).3 feof() EOF (“End of file”) indica o fim de um arquivo.

Introdução à Linguagem C .102 EDITORA .UFLA/FAEPE .

#include <stdio.1 e 14.h. de acordo com a necessidade. A alocação dinâmica de memória é muito útil quando se tem que trabalhar com várias matrizes de grandes dimensões. if (!p) printf("memoria insuficiente\n"). As Figuras 14. for(t=0.14 NOÇÕES DE ALOCAÇÃO DINÂMICA Há duas maneiras de armazenar variáveis na memória do computador. t. ++t) printf("%d ". Primeiro por variáveis globais e static locais. p=(int *) malloc(40*sizeof(int)). t<40. a alocação dinâmica fica disponível com a inclusão de stdio. *(p+t)). quando o C armazena a informação em uma área de memória livre. No caso do C standard.1: Primeiro exemplo de alocação dinâmica de memória . e após o seu uso. else { for(t=0.2 mostram exemplos de alocação dinâmica de memória.h> main( ) { int *p. free(p). ++t) *(p+t) = t. esta área é liberada para que possa ser utilizada por outras matrizes. } } Figura 14. segundo através de alocação dinâmica. Para cada matriz a ser utilizada pelo programa destina-se uma área de memória suficiente. t<40.

104 EDITORA .Introdução à Linguagem C #include <stdio. max = *(p+1). i++) scanf ("%f". quant). &quant). exit(1). scanf("%d". } Figura 14. for ( i = 2. if ( !( p = (float*) malloc((quant+1)*sizeof(float))) ) { printf ("sem memoria\n"). free(p). } printf ("digite %d numeros:\n".h> main( ) { int i.min. (p+i)). i <= quant.2: Segundo exemplo de alocação dinâmica de memória .*p. i++) { if (*(p+i) >= max) max = *(p+i). printf ("quantidade de numeros:\n"). float max. for ( i = 1.UFLA/FAEPE .quant. i <= quant. max). } printf("O maior e :%f \n".

printf ( "\n\t Divisão X/Y \n"). y.15 EXERCÍCIOS 15. puts. 2. Y. Editar o programa da Figura 15. printf ( "\n\t %f \n\t %d \n\t %d \n".1 e fazer sua compilação. X/Y. Procurar em livros e/ou guias de referência da Linguagem C quais são as funções das seguintes bibliotecas: string. X = x. x/y. /* programa do Exercicio_1 capitulo_2 */ # include <stdio.h e math. &y ). scanf (" %d %d ".1: Capítulo 2: Programa para o exercício 1 . &x.h: getchar. 15.1 CAPÍTULO 1 1.2 CAPÍTULO 2 1. } Figura 15. Anotar o nome de todas as funções com seus respectivos tipos de retorno e seus argumentos. Dizer o que fazem as seguintes funções da biblioteca stdio. Executar o programa e dizer o que ele faz. putc. x%y). float X. printf (" \n\t Envie dois numeros inteiros \n\t ").h. Y = y.h> int main ( ) { int x.

e então seja calculado e anunciado o número de dias vivido pelo usuário.2. &Dias).Dias. 15. compilar e executar o programa da Figura 15. /* programa do Exercicio_1 capitulo_3 */ # include <stdio. 2.25.h> int main ( ) { int Dias. pode-se digitar o primeiro. 15. Editar.5 CAPÍTULO 5 1. printf ("\n\n\t %d dias equivalem a %f anos. .Introdução à Linguagem C Para escrever os dois números pedidos pelo programa.4. 2. scanf ("%d". um espaço. float Anos. Anos = Dias/365. Modifique o programa para que todos os números sejam impressos com quatro algarismos antes do ponto decimal e três algarismos após. printf ("\n\t Entre com o número de dias: ").UFLA/FAEPE . } Figura 15. Explique porque a variável Dias é inteira e Anos é float. Pode-se também digitar <ENTER> após cada número. Modifique o programa anterior para que sejam requisitados o dia. e pressionar <ENTER>. digitar o segundo. Editar.3 CAPÍTULO 3 1.Anos).4 CAPÍTULO 4 1.2. o dia. o mês e o ano atuais. Explicar (comentar) o que faz cada linha.106 EDITORA . 15. Dizer o que faz o programa da Figura 15.\n". compilar e executar o programa da Figura 15. o mês e o ano de nascimento do usuário.2: Capítulo 3: programa para o exercício 1 Dizer o que o programa faz.

3. printf ( "\n O quociente de %f e %f eh %f ". de forma que ele calcule a série até que encontre um termo cujo valor absoluto seja menor que 0. printf ( "\n A tecla pressionada foi %c \n\n". x. printf ("\n Envie dois números : ").Exercícios 107 /* programa do Exercicio_1 capitulo_3 */ # include <stdio. Fazer um programa em linguagem C que calcule o seno de um ângulo dado utilizando os N primeiros termos da série. Reescrever o programa anterior para que o seno do ângulo seja calculado até que o módulo do último termo da série seja menor que 0. O ângulo A(radianos) e o valor de N deverão ser requisitados ao usuário do programa. compilar e executar o programa. x*y ). } Figura 15. 6. Os números que aparecem no denominador são os fatoriais dos expoentes de cada termo.00001. Para isto. Ch ). float x. y. Modificar o programa de cálculo de PI (Figura 5. Editar. &y ).8).h> int main ( ) { char Ch.5 4. printf ( "\n O produto de %f e %f eh %f ". do Capítulo 5.00001. &x. Reescrever o programa do item anterior utilizando o comando switch. Ch = getchar( ). O seno de um ângulo qualquer (dado em radianos) pode ser calculado pela série abaixo. y. printf ( "Fim de Programa\n" ). x/y ). £££ ¥¥¤¡  !  §£ §  © 2 ¤§ ¡ ¡ ¦  ¨§ § ¥ ¥ ¥ £ ¡ ¦¤¢  . x. 5. scanf ("%f %f ".3: Capítulo 4: Programa para o exercício 1 2. y. conforme o algoritmo da Figura 15. deverá ser usado um Loop while ou do-while. Fazer um programa em C que identifique triângulos.

valor).UFLA/FAEPE .h> main( ) { int opcao. } if(opcao==2) { printf("informe um valor em hexadecimal:"). &valor). scanf("%x". valor).Introdução à Linguagem C #include<stdio. printf(" 4: octal para decimal\n"). printf("%d em octal é: %o". &valor). printf("informe a sua opção:"). &opcao). printf(" 1: decimal para hexadecimal\n"). } if(opcao==4){ printf("informe um valor em octal:"). valor. printf("%d em hexadecimal é : %x". printf("%o em decimal é: %d". printf(" 2: hexadecimal para decimal\n"). valor). scanf("%d". } } Figura 15. valor. scanf("%o". printf("Converter:\n"). valor. } if(opcao==3){ printf("informe um valor em decimal:"). int valor.4: Capítulo 5: Programa para o exercício 1 . if(opcao==1) { printf("informe um valor em decimal:"). scanf("%d". valor.108 EDITORA . scanf("%d". printf(" 3: decimal para octal\n"). &valor). valor). &valor). printf("%x em decimal é: %d".

7 CAPÍTULO 7 1. C (reais. e estas serão armazenadas em um vetor.5: Capítulo 5: Algoritmo para o exercício 3 15. as notas serão armazenadas em uma matriz bidimensional. (Nota1+Nota2+Nota3+Nota4)/4. Aprovação.6. e para cada aluno. Editar. 4 notas de 0 a 100%. Ao final o programa apresentará a matriz e sua transposta na tela do computador. 2. Ao final. compilar. Média. executar e dizer o que faz o programa da Figura 15. B. será apresentado um relatório contendo 3 colunas: Nome do aluno.6 CAPÍTULO 6 1. lados do triângulos) Se A < (B+C) e B < (A+C) e C < (A+B) /* verifica se é triângulo */ Então Se A = B e B = C Então Imprima (Triângulo Equilátero) Senão Se A = B ou A = C ou B = C Então Imprima (Triângulo Isóceles) Senão Imprima (Triângulo Escaleno) FimSe FimSe FimSe Fim Figura 15. e calcule a sua transposta. . e R (reprovado) para alunos com média inferior a 60. 15. Fazer um programa em Linguagem C que leia os nomes de 10 alunos de uma turma. Os nomes dos alunos serão armazenados em um vetor de strings. Fazer um programa em Linguagem C que leia uma matriz de dimensões NxM. Serão calculadas as médias dos alunos. Na coluna aprovação será colocada a letra A (aprovado) para alunos com média igual ou superior a 60.Exercícios 109 /* Identificação de triângulos */ Início Ler A.

printf ("\n Envie outra string de ate 10 caracteres "). st1[i]. for ( j = 0. } puts ("\n"). st3[21]. j = j+i. Capítulo 6 (Figura 6. int i.h> main( ) { char st1[11].Introdução à Linguagem C #include <stdio. apresentar as strings Stfonte e Stdestino em forma de duas colunas. Refazer o programa do cálculo das médias dos alunos. Fazer um programa em C que leia uma string de até 30 caracteres e armazene-a em uma variável Stfonte. j.110 EDITORA . Utilizando ponteiros.6: Capítulo 7: programa para o exercício 1 Explique porque as strings st1 e st2 devem ter no máximo 10 caracteres se os respectivos vetores foram declarados com 11 posições.) { ch = st3[i-1]. putchar (’\n’). 2. i-. i++) st3[i] = st1[i]. Utilizando ponteiros.UFLA/FAEPE . printf ("\n Envie uma string de ate 10 caracteres "). . puts (st3). copie o conteúdo de Stfonte para uma variável Stdestino. de forma que a string fique escrita de forma inversa.h> #include <string. gets(st1). st2[11].8 CAPÍTULOS 8 E 9 1. for ( i = 0. utilizando ponteiros para o cálculo das médias e para a apresentação dos resultados. for ( i = j. j++) st3[i+j] = st2[j]. ch . gets(st2).3. i . } Figura 15. putchar (ch). 15. st2[j].

printf("Informe o raio: "). Fazer uma função em C que calcule o produto de duas matrizes A e B e retorne o resultado em outra matriz P. Utilize o nome StrCat para esta função. compilar e executar o programa da Figura 15. scanf("%f". Deverão ser feitas 4 funções. Fazer uma função em C que concatena duas strings. Fazer uma função em C que calcule o fatorial de um número passado como parâmetro. } float area(float raio) { return 3.Exercícios 111 15.h. res). Modifique o programa anterior para que ele repita os cálculo para diferentes raios enviados pelo usuário. para não confundir com como strcat() da biblioteca string.res. e calcular o volume e a área de uma esfera de mesmo raio. 5. 2.7 /* cálculo da área de um círculo */ #include <stdio. printf("A área é: %f\n".h> float area(float raio). /* protótipo*/ main( ) { float r. O loop será repetido até que o usuário responda N (não). &r). 4.7: Capítulo 10: Programa para o exercício 2 3.h> #include <math.2). Modificar o programa anterior para calcular a área e o perímetro do círculo. Deverá ser utilizado um loop do-while onde. ao final será perguntado ao usuário se deseja novo cálculo.9 CAPÍTULO 10 1.1415926 * pow(raio. . } Figura 15. res=area(r). Editar. 6.

exclusão de dados. 15. C da equação serão passados na linha de comando. No menu será previsto inclusão de dados.12 CAPÍTULO 13 1. Fazer um programa em C que calcule as raízes de uma equação de segundo grau. 2. Onde se lê <usuário> deverá estar escrito o nome completo do usuário. idade. deverá ter um menu de opções: por nome. 15.13 CAPÍTULO 14 1.112 EDITORA . sexo. B. sexo (M/F). Os valores A. telefone. Na opção consulta. Fazer um programa em C para ler e armazenar em uma estrutura. ¡ 15. e consulta. que poderiam ser por exemplo os candidatos a vagas em uma empresa. Para cada opção deverá ser feita uma função específica. os dados de uma pessoa. Usar a estrutura do exercício 1 do Capítulo 12 para armazenar em um vetor os dados de um conjunto de 20 pessoas. deverão ser apresentados todos os dados das pessoas que possuem aquele nome. Modificar o programa do exercício 1 do Capítulo 13 para armazenar os dados em arquivo. idade.11 CAPÍTULO 12 1. ¥ £ ¤¡   ¡ ¡¥ ¢ 2  . O programa deverá identificar quantos nomes foram escritos. por exemplo.UFLA/FAEPE . Fazer um programa em C que receba em sua linha de comando o nome do usuário e escreva a mensagem: “Bom dia <usuário>”.Introdução à Linguagem C 15.10 CAPÍTULO 11 1. Quando for pedida uma consulta por nome. . O programa deverá ter um menu de opções para trabalhar com os dados (usar o comando switch). Os campos da estrutura DADOS serão: nome.

. 2000. 182p. Curso de C. Campus. Campinas. 241p. Mcgraw-Hill. Herbert. Dennis M. [2] CPDEE-UFMG. Makron Books. 1996. Rio de Janeiro. [5] HANCOCK. Campus. UFMG.J. C: A Linguagem de Programação. UNICAMP. 830p. 1990. . McGraw-Hill. 1986. Standart C: guia de referência básica. [4] PLAUGER. Belo Horizonte. P. Brian W. Rio de Janeiro. 2001. São Paulo. Treinamento em Linguagem C — módulo 1 e 2.1985. Les e KRIEGER. 1991. 306p. [3] KERNIGHAN. C Completo e Total. Morris. [7] CHILDT. São Paulo. [6] MIZRAHI. São Paulo.REFERÊNCIAS BIBLIOGRÁFICAS [1] GACLI-UNICAMP. e RITCHIE. Introdução à Linguagem C. Manual de Linguagem C. e BRODIE J. Viviane V.

Introdução à Linguagem C .UFLA/FAEPE .114 EDITORA .

cputs ( ). char *cgets(char *str)..H Embora não seja uma biblioteca do padrão ANSI-C. Funções cgets ( ).1 ASSERT. cscanf ( ). delline ( ). . cprintf ( ). int cscanf (char *format [. . clrscr ( ). . conio.H Funções void assert(int test). getch ( ). mas que são implementadas em vários compiladores. As funções que não pertencem ao padrão serão indicadas como tal. clreol ( ). void delline(void). e algumas que não pertencem ao grupo ANSI-C. getpass ( ). argument. int cputs(const char *str). address..2 CONIO. void clrscr(void).. getche ( )..]). A. void clreol(void). int getch(void). int cprintf (const char *format [. A. A lista seguirá a ordem alfabética dos nomes das bibliotecas. char *getpass(const char *prompt).h é citada aqui por ser implementada em vários compiladores e ser utilizada por muitos programadores.]). int getche(void).A BIBLIOTECAS DO C Será apresentada aqui uma lista de todas as funções do padrão ANSI-C.

outpw ( ). void gettextinfo(struct text_info *r). int gettext(int left. int right. void* source). int desttop). ungetch ( ). int movetext(int left. int right. void insline(void). int destleft. int right.116 EDITORA . normvideo ( ). . Um caractere de controle refere-se ao caractere que não é parte do conjunto normal de impressão. int y). putch ( ). void window(int left. int bottom. int value). os caracteres de controle são os caracteres de 0 (NUL) até 0x1F (US). No conjunto de caracteres ASCII. int puttext(int left. int putch(int ch). void gotoxy(int x. int top. unsigned outpw(unsigned portid. textcolor ( ). int ungetch(int ch). wherex ( ). void textmode(int newmode). int wherey(void). int wherex(void). void normvideo(void). unsigned value). void textcolor(int newcolor). int top. gettextinfo ( ).H As funções da biblioteca ctype.UFLA/FAEPE . _setcursortype ( ). int bottom). int top. textattr ( ). void _setcursortype(int cur_t). int top.3 CTYPE. insline ( ). int bottom. wherey ( ). window ( ). outp ( ). void textbackground(int newcolor). inpw ( ). lowvideo ( ). int right. unsigned inpw(unsigned portid). textmode ( ). void* destin). kbhit ( ). movetext ( ). gotoxy ( ). highvideo ( ). void lowvideo(void). int outp(unsigned portid. void textattr(int newattr). puttext ( ). int kbhit(void). A.h são usadas para testar e converter caracteres. int bottom.Introdução à Linguagem C gettext ( ). Os caracteres imprimíveis são aqueles que vão de 0x20 (space) até 0x7E (tilde). int inp(unsigned portid). e o caractere 0x7F (DEL). inp ( ). textbackground ( ). void highvideo(void).

isupper. int isgraph(int character). islower. A. int isdigit(int character). int ispunct(int character). isalpha. int isalnum(int character).H Variável errno int errno. ispunct. int isspace(int character).5 LIMITS. int isalpha(int character). int tolower(int character). int iscntrl(int character). int isprint(int character).H CHAR_BIT CHAR_MAX CHAR_MIN INT_MAX INT_MIN LONG_MAX LONG_MIN SCHAR_MAX . tolower. toupper. int isupper(int character). isprint. isgraph. iscntrl.Bibliotecas do C 117 Funções isalnum. int isxdigit(int character). isspace. isxdigit. isdigit. Macros EDOM #define EDOM <valor> ERANGE #define ERANGE <valor> A. int toupper(int character). int islower(int character).4 ERRNO.

LONG_MAX +2147483647 Máximo valor para um long int. CHAR_MIN é 0 e CHAR_MAX é o mesmo que UCHAR_MAX. Estes valores são dependentes de implementação. então. CHAR_MIN Estes definem os valores mínimo e CHAR_MAX máximo para um char. mas não podem ser menores do que estas especificações. LONG_MIN -2147483647 Mínimo valor para um long int.UFLA/FAEPE . seus valores serão os mesmos que do signed char (SCHAR). SCHAR_MAX +127 Máximo valor para um signed char. MB_LEN_MAX 1 Máximo número de bytes em um multibyte character.Introdução à Linguagem C SCHAR_MIN SHRT_MAX SHRT_MIN UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX Os valores a seguir são definidos por diretivas #define . SHRT_MAX +32767 Máximo valor para um short int. USHRT_MAX 65535 Máximo valor para um unsigned short int. Caso contrário. INT_MIN -32767 Mínimo valor para um int. ULONG_MAX 4294967295 Máximo valor para um unsigned long int.118 EDITORA . INT_MAX +32767 Máximo valor para um int. UCHAR_MAX 255 Máximo valor para um unsigned char. CHAR_BIT 8 Número de bits em um byte. UINT_MAX 65535 Máximo valor para um unsigned int. Se um char estiver sendo representado como um signed integer.6 LOCALE. A. SHRT_MIN -32767 Mínimo valor para um short int.H Variáveis struct lconv . SCHAR_MIN -127 Mínimo valor para um signed char.

*int_curr_symbol. char *setlocale(int category. *negative_sign.Bibliotecas do C 119 Macros NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME Funções localeconv( ). p_cs_precedes. n_cs_precedes. p_sep_by_space. frac_digits. *thousands_sep. const char *locale). n_sep_by_space. *positive_sign. n_sign_posn. int_frac_digits. *mon_decimal_point. *mon_grouping. . *grouping. setlocale( ). Variáveis e Definições A estrutura lconv contém as seguintes variáveis em qualquer ordem: char char char char char char char char char char char char char char char char char char *decimal_point. *currency_symbol. *mon_thousands_sep. p_sign_posn.

double log10(double x). fmod( ). A. double cosh(double x).UFLA/FAEPE . tan( ). double frexp(double value. asin( ). double sinh(double x). cos( ). double ldexp(double x. cosh( ).H Macros HUGE_VAL Funções acos( ). double y). double log(double x). double *iptr). floor( ). double tan(double x). double acos(double x).120 EDITORA . double sin(double x). double asin(double x). double tanh(double x). double modf(double value. double exp(double x). log10( ).] double sqrt(double x).7 MATH.8 SIGNAL. exp( ). double fabs(double x). double atan(double x). modf( ). double floor(double x). tanh( ). double pow(double x.Introdução à Linguagem C A. double ceil(double x). double cos(double x). double fmod(double x. double y).double x). frexp( ). [sqrt( ). int exp). log( ). atan2( ).H Macros SIG_DFL SIG_ERR . fabs( ). ceil( ). atan( ). pow( ). sin( ). sinh( ). ldexp( ). double atan2(double y . int *exp).

10 STDIO.9 STDARG. va_arg( ) type va_arg(va_list ap.Bibliotecas do C 121 SIG_IGN SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM Funções signal( ) void (*signal(int sig. void (*func)(int)))(int). Variáveis e definições typedef sig_atomic_t SIG_ERR Represents a signal error. Macros NULL _IOFBF _IOLBF . Macros va_start( ) void va_start(va_list ap. va_end( ) void va_end(va_list ap). SIG_IGN Signal ignore A.H A biblioteca stdarg define algumas macros usadas para obter argumentos em uma função quando o número de argumentos não é conhecido. last_arg). raise( ) int raise(int sig).H A biblioteca stdio fornece funções para implementar entrada e saída. A. type).

int mode. fwrite( ). rewind( ). . size_t size. ferror( ). fopen( ). const char *mode. size_t size). fgetpos( ). char *buffer). int whence). int ferror(FILE *stream). fsetpos( ). fseek( ). const char *new_filename). int feof(FILE *stream). setbuf( ). char *buffer. setvbuf( ). const fpos_t *pos). int fsetpos(FILE *stream. size_t fread(void *ptr. long int offset. int remove(const char *filename). remove( ). freopen( ). const char *mode).122 EDITORA . long int ftell(FILE *stream).Introdução à Linguagem C _IONBF BUFSIZ EOF FOPEN_MAX FILENAME_MAX L_tmpnam SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout Funções clearerr( ). int fseek(FILE *stream. size_t nmemb. int fflush(FILE *stream). size_t size. ftell( ). int fgetpos(FILE *stream. FILE *fopen(const char *filename. size_t fwrite(const void *ptr. fclose( ). feof( ). FILE *stream). void rewind(FILE *stream). fpos_t *pos). void setbuf(FILE *stream. int setvbuf(FILE *stream. int fclose(FILE *stream). rename( ).FILE *stream). void clearerr(FILE *stream).UFLA/FAEPE . size_t nmemb. fread( ). int rename(const char *old_filename. FILE *stream). fflush( ). FILE *freopen(const char *filename.

const char *format. . fgets( ).. vsprintf( ). . vprintf( ). int vprintf(const char *format. int puts(const char *str). FILE *stream). getc( ). sscanf( ). fputs( ). const char *format. . int fputc(int char. va_list arg). vfprintf( ). const char *format. perror( ). int printf(const char *format. putc( ).). fpos_t é um tipo útil para armazenar qualquer posição em um arquivo. char *fgets(char *str. void perror(const char *str). tmpnam( ). printf( ).. gets( )..).). fputc( ). int N. fprintf( ). int vfprintf(FILE *stream. . va_list arg).. scanf( ). fscanf( ). int ungetc(int char. int sscanf(const char *str. char *gets(char *str).. int putchar(int char). int scanf(const char *format. int fputs(const char *str..Bibliotecas do C 123 tmpfile( ).). int fprintf(FILE *stream. int vsprintf(char *str.. FILE *stream). char *tmpnam(char *str). FILE *stream). . const char *format. . NULL é o valor ce uma constante ponteiro nulo (null pointer constant).. FILE *stream). int fscanf(FILE *stream. int getchar(void). . FILE *tmpfile(void). int fgetc(FILE *stream). const char *format. va_list arg).).. Variáveis typedef size_t typedef FILE typedef fpos_t Variáveis e Definições size_t é o resultado inteiro sem sinal do tamanho da palavra-chave (sizeof keyword ). putchar( ). ungetc( ). int getc(FILE *stream).. int sprintf(char *str. int putc(int char. FILE é um tipo útil para armzenar informações de um arquivo (file stream). FILE *stream).).. getchar( ). fgetc( ).. sprintf( ). const char *format. puts( ).

SEEK_CUR. stdin. TMP_MAX é o máximo número de nomes de arquivos únicos (unique filenames) que a função tmpnam pode gerar. A. FILENAME_MAX é um inteiro que representa o comprimento máximo de um vetor de char disponível para manter o maior nome de arquivo possível. EOF é um inteiro negativo que indica que o final do arquivo (end-of-file) foi alcançado. L_tmpnam é um inteiro que representa o maior comprimento de um vetor de char disponível para manter o maior nome de arquivo temporário possível criado pela função tmpnam. Algumas funções em detalhe .124 EDITORA . e standard output streams. SEEK_END. e _IONBF são usadas na função setvbuf. BUFSIZ é um inteiro que representa o tamanho do buffer usado pela função setbuf. 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 final do arquivo – end-of-file) rb modo binário de leitura – read binary mode wb modo binário de escrita – write binary mode ab modo binário para adicionar escrita (abre ou cria um arquivo e aponta para o final do arquivo – end-of-file) r+ modo texto para leitura e escrita. FOPEN_MAX é um inteiro que representa o máximo número de arquivos que o sistema pode garantir que podem ficar abertos ao mesmo tempo.1 fopen Declaração: FILE *fopen(const char *filename. e SEEK_SET são usados na função fseek.Introdução à Linguagem C _IOFBF.UFLA/FAEPE . 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 binário para leitura e escrita. Abre um arquivo apontado por filename. stderr. standard input.10. e stdout são ponteiros para tipos arquivos (FILE types) os quais correspondem aos standard error. _IOLBF. const char *mode).

%i Inteiros decimais com sinal – signed int.. sprintf (char *str. então a abertura falhará... A. va_list arg). . Ocorrendo uma falha na abertura. va_list arg).). ou fflush. printf (const char *format. const char *format. const char *format. Se o arquivo for aberto no modo append (a). . Se o arquivo for aberto no modo update (+). será retornado um ponteiro para o arquivo (file stream).10..). então todas as operações de escrita ocorrerão ao final do arquivo não importando a posição corrente do arquivo. Tendo sucesso na abertura do arquivo. fprintf envia saída formatada para um stream printf envia saída formatada para o dispositvo padrão (stdout) sprintf envia saída formatada para uma string vfprintf envia saída formatada para um stream usando uma lista de argumentos vprintf envia saída formatada para stdout usando uma lista de argumentos vsprintf envia saída formatada para uma string usando uma lista de argumentos int int int int int int fprintf (FILE *stream.). vsprintf (char *str.2 Entradas e saídas formatadas Funções (x)printf As funções (x)printf fornecem meios para saída formatada de informações para um stream. va_list arg). vfprintf (FILE *stream.. . fsetpos. então a saída não poderá ser seguida diretamente por uma entrada e uma entrada não poderá ser seguida diretamente por uma saída sem a intervenção de fseek.. Tipos de argumentos %d. . const char *format. um ponteiro nulo será retornado. const char *format. rewind. vprintf (const char *format.Bibliotecas do C 125 w+b ou wb+ modo binário para leitura e escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a+b ou ab+ modo binário para leitura e escrita (abre ou cria um arquivo e ajusta o ponteiro para o final do arquivo – end-of-file) Se o arquivo não existir e for feita uma operação de abertura no modo read (r). %u Inteiro decimal sem sinal – unsigned int.

D. E. %X unsigned int em hexadecimal usando maiúsculas: A. O %G utiliza %E ou %F. u.. int sscanf (const char *str. %hu indica que o dado é do tipo short unsigned int.). . %i Inteiros decimais com sinal – signed int. %p Imprime o valor de um ponteiro. %f Ponto flutuante em decimal – double.. const char *format. %u Inteiro decimal sem sinal – unsigned int. Por exemplo. %d. %ld significa que um long int será mostrado. b. com e (minúsculo) ou E (maiúsculo). Há dois especificadores de formato que permitem que printf( ) mostre inteiros short e long.UFLA/FAEPE . e. %g . int scanf (const char *format.126 EDITORA .10. F. Tipos de argumentos %c char: lê um único caractere. Nenhum caractere é impresso. %o unsigned int na base octal. f.. O especificador h instrui printf( ) a mostrar um short int. d. o que tiver menor comprimento. %x unsigned int em hexadecimal usando minúsculas: a. fscanf lê entrada formatada de um stream scanf lê entrada formatada do dispositivo padrão (stdin) sscanf lê entrada formatada de uma string int fscanf (FILE *stream.). %% Imprime o sinal %.. %e. const char *format. A. o. x e X.3 Funções (x)scanf As funções (x)scanf são utilizadas para leitura formatada de informações de um stream. Esses especificadores podem ser aplicados aos tipos d. %E double impresso em notação científica.Introdução à Linguagem C %o unsigned int na base octal.. B. i. . C.. %s Imprime uma string. %G] double impresso como %e ou %f.). %c char: será impresso um único caractere. c. . O especificador l diz a printf( ) que segue um tipo de dado long. Portanto. %n o argumento associado é um ponteiro para inteiro no qual o número de caracteres impressos até este ponto é colocado. .

O caractere é lido como um unsigned char. c. %f Ponto flutuante em decimal . d. getc Retorna o próximo caractere (um unsigned char) da stream especificada e avança o indicador de posição da stream. %p Lê um ponteiro.double. fputs Escreve na stream especificada o conteúdo da string apontada por str. %g Ponto flutuante %s Lê uma String. %n Retorna um inteiro igual ao número de caracteres lidos. %% Lê o sinal %. A. e. %[ ] Procura um conjunto de caracteres. gets Lê uma linha da entrada padrão e aramazena em uma string apontada por str. putchar Escreve no dispositivo padrão de saída (stdout) um caractere (um unsigned char) especificado pelo argumento char. mas não escreve o terminador nulo. A. Um caractere de mudança de linha (newline) é adicionado à saída.10. puts Escreve a string apontada por str no dispositivo padrão de saída. getchar Retorna um caractere (um unsigned char) da entrada padrão (stdin).11 STDLIB. . que é convertido para um inteiro. putc Escreve o caractere contido no byte menos significativo de ch na stream de saída apontada por stream e avança a posição do indicador da stream.Bibliotecas do C 127 %x unsigned int em hexadecimal usando minúsculas: a. fgets Lê N-1 caracteres de stream e coloca-os na matriz de caracteres apontada por str.4 Funções de entrada e saída de caracteres fgetc Retorna o próximo caractere da stream de entrada na posição atual e incrementa o indicador de posição de arquivo. b. %e Ponto flutuante em notação científica. fputc Escreve o caractere ch na stream especificada na posição atual do arquivo e avança o indicador de posição de arquivo. f. O terminador nulo não é escrito.H A biblioteca stdlib define algumas funções em macros de propósito geral.

MB_CUR_MAX é o máximo número de bytes em um conjunto de caracteres multibyte o qual não pode ser maior que MB_LEN_MAX. size_t nitems. const void *base. div_t div(int numer. ldiv_t é a estrutura retornada pela função ldiv.128 EDITORA . size_t size. div( ). Funções abort( ). void *bsearch(const void *key. .UFLA/FAEPE . const void *)). double atof(const char *str). void *calloc(size_t nitems. atof( ). atexit( ). int atexit(void (*func)(void)). atol( ). abs( ). void abort(void). atoi( ).Introdução à Linguagem C Macros NULL EXIT_FAILURE EXIT_SUCCESS RAND_MAX MB_CUR_MAX Variáveis typedef size_t typedef wchar_t struct div_t struct ldiv_t size_t é o tamanho em forma unsigned integer resultante da operação sizeof sobre uma variável de qualquer tipo. NULL é o valor de uma constante ponteiro nulo. int denom). EXIT_FAILURE e EXIT_SUCCESS são valores retornados pela função exit. calloc( ). int abs(int x). long int atol(const char *str). int atoi(const char *str). size_t size). int (*compar)(const void *. wchar_t é um tipo inteiro do tamanho de uma constante wide character. div_t é a estrutura retornada pela função div. bsearch( ) . RAND_MAX é o máximo valor retornado pela função rand.

free( ). int rand(void). wctomb( ). rand( ). ldiv_t ldiv(long int numer. system( ). const void*)). int mblen(const char *str. mbstowcs( ). wchar_t wchar). char **endptr. char **endptr.1 atoi atol strtod strtol strtoul A. getenv( ). long int denom). void *realloc(void *ptr. realloc( ). double strtod(const char *str. int wctomb(char *str.2 calloc free malloc realloc Funções de manipulação de Memória Funções de manipução de Strings . labs( ). int (*compar)(const void *. size_t n). size_t mbstowcs(schar_t *pwcs. malloc( ). strtol( ). mbtowc( ). char **endptr). wcstombs( ). void exit(int status). size_t n). const char *str. size_t nitems. int mbtowc(whcar_t *pwc. A. long int strtol(const char *str. mblen( ). size_t size. const char *str. srand( ). int base). long int labs(long int x). size_t n). int base). size_t size). void free(void *ptr).11. int system(const char *string). size_t n). strtod( ). char *getenv(const char *name). void srand(unsigned int seed). unsigned long int strtoul(const char *str. strtoul( ). void qsort(void *base. void *malloc(size_t size). ldiv( ). const wchar_t *pwcs. qsort( ).Bibliotecas do C 129 exit( ). size_t wcstombs(char *str.11.

Descrição abs. rand atuará como se srand(1) tivesse sido chamado. Divide o numer (numerador) por denom (denominador). Retorna o valor absoluto de x.11. quociente. A. rand int rand(void).130 EDITORA . rand Retorna um número pseudo-randômico entre 0 e RAND_MAX.6 Funções Multibyte O comportamento das funções multibyte é afetado pelos ajustes de LC_CTYPE feitos localmente.Introdução à Linguagem C A. ldiv. o mesmo que div. size_t n).4 Funções de Ambiente (Environment) Funções de busca e ordenação (Searching and Sorting) bsearch qsort A.11. . int denom). O resultado é armazenado em uma estrutura ldiv_t. long int denom). resto.3 abort atexit exit getenv system A. div div_t div(int numer. labs.5 Funções matemáticas abs int abs(int x). O resultado é armazenado em uma estrutura div_t que possue dois membros: int quot. srand void srand(unsigned int seed). labs long int labs(long int x). para argumentos do tipo long int. div. int rem. mblen int mblen(const char *str. ldiv ldiv_t ldiv(long int numer. Se não for chamado o srand. srand Inicializador da seqüência de rand.11.11.UFLA/FAEPE .

size_t n). size_t n). size_t n). size_t n). strchr( ). const void *str2. size_t n). strcoll( ). size_t n). mblen Retorna o comprimento de um character multibyte apontado por um argumento str. mbtowc int mbtowc(whcar_t *pwc. memcpy( ). char *strchr(const char *str. const char *str2). int c). size_t n). NULL é o valor da constante ponteiro nulo. strcmp( ). int strcoll(const char *str1. char *strcat(char *str1. char *strncat(char *str1. void *memchr(const void *str. strcat( ). size_t n). int memcmp(const void *str1. const char *str. memcmp( ). wctomb int wctomb(char *str. const char *str2. const char *str2). wcstombs Converte os códigos armazenados na matriz pwcs para caracteres multibyte e os armazena na string str. int c. Variáveis e Definições size_t é o inteiro sem sinal resultante de sizeof keyword. 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. int strncmp(const char *str1. const void *str2. const wchar_t *pwcs. int strcmp(const char *str1. memmove( ). void *memset(void *str.H A biblioteca string fornece muitas funções úteis para manipulação de strings (vetor de caracteres).Bibliotecas do C 131 mbstowcs size_t mbstowcs(schar_t *pwcs. wctomb Examina o código que corresponde ao caractere multibyte dado pelo argumento wchar. memset( ). const char *str. size_t n). . int c. void *memcpy(void *str1.12 STRING. Funções memchr( ). A. const char *str2. wcstombs size_t wcstombs(char *str. const void *str2. const char *str2). strncat( ). wchar_t wchar). size_t n). strncmp( ). void *memmove(void *str1.

const char *str2. seconds after the minute (0 to 61) int tm_min. minutes after the hour (0 to 59) int tm_hour. char *strrchr(const char *str. days since January 1 (0 to 365) int tm_isdst. int c). const char *str2). strncpy( ). strlen( ). char *strerror(int errnum).Introdução à Linguagem C strcpy( ). const char *str2). months since January (0 to 11) int tm_year. time_t é um tipo útil para armazenar o tempo de calendário. day of the month (1 to 31) int tm_mon.13 TIME. char *strcpy(char *str1. hours since midnight (0 to 23) int tm_mday. char *strncpy(char *str1. strrchr( ). CLOCKS_PER_SEC é o número de clocks por segundos do processador.UFLA/FAEPE .H A biblioteca time fornece algumas funções úteis para ler e converter a hora e a data correntes. size_t strlen(const char *str). A. O comportamento de algumas funções é definido pela categoria LC_TIME das propriedades locais. const char *str2). const char *str2). Variáveis e definições NULL é o valor de um ponteiro nulo. Seus membros sâo: int tm_sec. const char *str2. strcspn( ). clock_t é um tipo útil para armazenar o tempo do processador. size_t strxfrm(char *str1. Daylight Savings Time . char *strstr(const char *str1. size_t é o unsigned integer resultante de sizeof keyword. strstr( ). char *strtok(char *str1. size_t n). struct tm é uma estrutura usada para guardar o tempo e a data. strxfrm( ).132 EDITORA . strspn( ). const char *str2). strtok( ). size_t strcspn(const char *str1. size_t n). years since 1900 int tm_wday. days since Sunday (0 to 6 Sunday=0) int tm_yday. strpbrk( ). size_t strspn(const char *str1. const char *str2). strerror( ). char *strpbrk(const char *str1.

. time_t time2). Retorna o valor time_t. retorna -1. time_t time(time_t *timer). É equivalente a asctime(locatime(timer)). mktime( ). Se timer não for um ponteiro nulo. clock( ). gmtime( ). size_t maxsize. char *asctime(const struct tm *timeptr). struct tm *gmtime(const time_t *timer).Bibliotecas do C 133 Funções asctime( ). double difftime(time_t time1. size_t strftime(char *str. const struct tm *timeptr). ctime( ). time( ). strftime( ). char *ctime(const time_t *timer). struct tm *localtime(const time_t *timer). Se não houver sucesso. time_t mktime(struct tm *timeptr). Calcula a data e hora correntes e codifica-os no formato time_t. então o valor é também armazenado em um objeto para o qual ele aponta. const char *format. difftime( ). clock_t clock(void). localtime( ).

Sign up to vote on this title
UsefulNot useful