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

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

scanf("%d". printf("\n Quadrado de %d é : %d".UFLA/FAEPE . } */ main ( ) { int num.Introdução à Linguagem C /* programa exemplo 02 # include <stdio. printf("Envie um numero inteiro: "). num. .h> int quadrado (int num) { return (num*num).&num). } Figura 2. quad = quadrado(num).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.20 EDITORA . quad). quad.

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

Um tipo de objeto de dados determina como valores de dados são representados.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. A Tabela 3. Os comandos básicos do C devem ser escritos sempre com minúsculas (if.UFLA/FAEPE .Nome). identificadores.2 TIPOS DE VARIÁVEIS Quando você declara um identificador. números ou . O C possui outros comandos e palavras reservadas que são todos escritos em letras minúsculas. etc. uma variável chamada Tempo será diferente de TEMPO. Tabela 3. %s ! \n". caso contrário. o compilador não irá interpretá-los como sendo comandos. dá a ele um tipo.h> main( ) /* função obrigatória */ { char Nome[20].1: Programa com instruções básicas rente de uma variável declarada com x1. scanf("%s". for. tempo e TeMPo. switch. As variáveis.Introdução à Linguagem C # include <stdio.).Nome).22 EDITORA . Os tipos principais podem ser colocados dentro da classe do tipo de objeto de dado. mas como variáveis. 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. printf("\n Bom dia. e que tipo de operações você pode executar com estes valores.1 apresentada uma lista com as palavras reservadas do padrão ANSI C. que valores pode expressar. } Figura 3. printf("\n Alô! Qual é o seu nome ? ").

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

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

double d.sizeof(f)).sizeof(uc)). char ch=’D’.sizeof(c)). Figura 3.h> main() { char c.Sintaxe 25 Podemos inicializar variáveis no momento de sua declaração. printf("double %d".sizeof(d)). printf("float %d". Isto é importante pois quando o C cria uma variável ele não a inicializa.2: Inicialização de variáveis A Figura 3. printf("int %d". unsigned int ui. float pi=3. 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("unsigned int %d". unsigned char uc. int count=0. printf("unsigned char %d". float f. Nunca presuma que uma variável declarada vale zero ou qualquer outro valor. Exemplos de inicialização podem ser vistos na Figura 3.sizeof(i)). int i. } Figura 3. . Para fazer isto podemos usar a forma geral tipo_da_variável nome_da_variável = constante.sizeof(ui)).3 apresenta um programa que identifica o tamanho de variáveis de diferentes tipos. printf("char %d". # include <stdio.3: Programa com diferentes tipos de variáveis.2.1416.

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

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

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

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

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

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

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

Estas são utilizadas principalmente para estabelecer a comunicação entre o usuário e o computador.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.3.2.1.argumentos). Tabela 4. Aqui serão citadas apenas algumas mais comuns. 4. 4.4 FUNÇÕES BÁSICAS DA BIBLIOTECA C Existem algumas funções muito usadas em programas feitos em linguagem C.1 FUNÇÃO PRINTF( ) Sintaxe: printf("expressão de controle". É uma função de I/O1 . 4. 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.5 e 4. 1 Input/Output: entrada/saída .6 apresentam vários exemplos de utilização da função printf em programas simples. 4. que permite escrever no dispositivo padrão (tela). Cada argumento deve ser separado por vírgula. 4.4.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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. o C irá reservar bytes. portanto sendo declarada uma matriz de inteiros de 10 elementos. . Por exemplo. o índice varia de 0 a 9. Neste exemplo. 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. 6. O endereço mais baixo corresponde ao primeiro elemento. As matrizes têm 0 como índice do primeiro elemento. os dados serão indexados de 0 a 19.6 MATRIZES A matriz é um tipo de dado usado para representar uma certa quantidade de variáveis que são referenciadas pelo mesmo nome. Estes bytes são reservados de maneira contígua. se declararmos: float exemplo[20].1 MATRIZ UNIDIMENSIONAL Sintaxe: tipo nome[tamanho].

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

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

t++. x[i] ).4.4: Exemplo simples de utilização de matriz multidimensional #include <stdio. p=0.6: Erro na utilização de matriz .6.2.3.Introdução à Linguagem C # include <stdio.p++) { x[t][p] = t*p.h> main ( ) { int x[10][10]. } } Figura 6. int t. t<10. static int x[10] ={0. for(i=0.5.8.h> main( ) { int i. } Figura 6.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.9}.h> main( ) { int erro[10]. x[t][p] ). i++) printf("%d\n".56 EDITORA . printf (" %d\n ". i<100. for( t = 0. excederá o tamanho da matriz (que é 10). for( i = 0. } } Figura 6. i. printf("%d\n". i<10. # include <stdio. i++) { erro[i]=1. erro[i] ).UFLA/FAEPE . dentro do laço de for.1.7.

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

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

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

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.

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

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

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

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

Eis porque: tendo alocado na memória o espaço para a matriz. Portanto.. isto é. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz. [tamN]. cada uma com um endereço específico.... sendo que eles podem ser tratados da mesma maneira. ele toma o nome da variável (que é um ponteiro) e aponta para o primeiro elemento da matriz. necessário para armazenar esta matriz. x tamN x tamanho_do_tipo O compilador então aloca este número de bytes em um espaço livre de memória. em bytes. As versões com ponteiros geralmente são mais rápidas. Este tamanho é: tam1 x tam2 x tam3 x . 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. ela pode ser descrita como uma extensa lista de posições de memória enfileiradas. 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. Quando uma matriz é declarada da seguinte forma: tipo_da_variável nome_da_variável [tam1][tam2] . . o compilador C calcula o tamanho.9 PONTEIROS E MATRIZES Em C existe um grande relacionamento entre ponteiros e matrizes. quando for declarada uma matriz de dimensão múltipla.

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

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

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

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

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

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

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

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

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

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

Quando vamos passar uma matriz como argumento de uma função. Digamos que temos a seguinte matriz: int matrx [50]. for ( i = 0.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. da Figura 10.10: Função que utiliza uma matriz A função mostra. .11. e que queiramos passá-la como argumento de uma função func(). void func (int *matrx).78 EDITORA . i++ ) printf ("%d". } Figura 10.Introdução à Linguagem C 10.UFLA/FAEPE . i < 10. Podemos declarar func() das três maneiras seguintes: void func (int matrx[50]). i++) t[i] = i.10 apresenta um exemplo de função que trabalha com uma matriz. #include <stdio. Veja que. main( ) { int t[10]. Isto faz com que possamos alterar o valor desta matriz dentro da função. void func (int matrx[]). for( i = 0. nos três casos. no caso de estarmos passando uma matriz para uma função. num[i]). teremos de passá-la através de um ponteiro. Note que.h> void mostra (int num[ ] ). } void mostra ( int num[ ] ) { int i.5. mostra(t). A Figura 10. i < 10.5 10. conforme se vê na Figura 10. podemos declarar a função de três maneiras equivalentes.10. i. teremos dentro de func() um int* chamado matrx. poderia ter sido escrita utilizando-se um ponteiro na passagem de parâmetros.

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

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

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

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

Uma estrutura é uma coleção de variáveis referenciadas por um único nome. 12. e o Tipo-definido seria melhor chamado como Tipo-redefinido. A Estrutura (structure) é um agrupamento de variáveis sob um mesmo nome. 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. no exemplo. o Campo-bit é um tipo de Estrutura que permite acesso individualizado aos bits de uma variável. de forma separada. 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. Uma declaração de estrutura forma um modelo que pode ser usado para criar variáveis de estruturas. a Enumeração (enum) é uma lista de símbolos. Campo-bit. provendo um meio conveniente de manter informações relacionadas agrupadas. porque utiliza o comando typedef para dar um outro nome a um tipo de dado já existente. União. variáveis_estrutura é uma lista de variáveis do tipo identificador. As variáveis estrutura são declaradas de duas formas diferentes. A palavra reservada struct usada para definir uma estrutura.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. a União (union) permite que duas ou mais variáveis de tipos diferentes utilizem a mesma posição de memória alternadamente. Estes tipos de dados são compostos por vários tipos básicos do C. como indicado na formulação geral da Figura reffig:estrutura.1 ESTRUTURAS Ao manusearmos dados. O identificador dá nome ao novo tipo de variável estrutura criado. primeiro imediatamente após a declaração da estrutura. As variáveis que compreendem a estrutura são chamadas de membros da estrutura ou campos da estrutura. depois. Enumeração e Tipo-definido.txt. . este item é opcional na declaração da estrutura. mas na verdade são conjuntos de coisas.

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

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

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

Tipos de Dados Definidos Pelo Usuário 87 struct Conta_Banco { int Num_conta. char Sexo. /* Erro .9.Nome_Novo). retorna zero */ } /* função para atualizar Nome de cliente.Num_conta. }. Nome[30].... Atualiza_Saldo(Cliente_padrao[273]. Nome_Novo[30]. /* passagem por valor . Novo[30]) { strcpy(Velho. Saldo). .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[0]).. Saldo. float Saldo.. Giacomin */ int Atualiza_Nome( char Velho[30]. por exemplo. /* função para atualizar saldo de uma conta cujo número está sendo passado int Atualiza_Saldo( int Numero. Saldo = 187.20) . /* passagem por valor */ .. return 0. scanf("%s".. Atualiza_Saldo(Gerente. int Data_Abertura [8].nome. de Joao Giacomin para: Joao C.20). 1893. Atualiza_Nome(Cliente_especial[12].atribuição de um char a um int */ . unsigned long int CPF. int Digtos_CPF. Conta_Banco Gerente.Num_conta. char nome[30]. /* se a função teve sucesso..Sexo. /* passagem por valor */ .Novo].09. float Saldo_Novo) { procedimentos da função. } main( ) { int float char struct */ Numero. Saldo = 34587. /* Inicializar programa e variáveis */ . } */ Figura 12. /* passagem por referência */ . Saldo). Atualiza_Saldo(Gerente. Cliente_especial[100]. Atualiza_Saldo(Numero. 1893..... Cliente_padrao[1000]. return 0.

return 0. func_1(arg).88 EDITORA . mas isto se torna inviável enquanto as estruturas se tornam cada vez maiores. Pode-se passar toda a estrutura para uma função.a=arg.UFLA/FAEPE . Para encontrar o endereço de uma variável estrutura. O operador * é raramente utilizado quando trabalhamos com ponteiros para estruturas.parm. A Figura 12. Exemplo: struct Conta_Banco *inf_cliente.6 . o operador & é colocado antes do nome da variável estrutura. /* protótipo */ int main( ) { struct exemplo 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. void func_1(struct exemplo).6). } Figura 12.a.ch).parm. char ch. é o operador seta. }. Para o acesso a um membro de uma estrutura. isto passa a demandar muito tempo de execução. A solução para esse problema é passar somente um ponteiro para a função (Figura 12. } void func_1(struct exemplo parm) { printf("%d\n%d\n%c".b. arg.parm.b=1000.7 apresenta a utilização deste operador no exemplo da Figura 12.Introdução à Linguagem C struct exemplo { int a. 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: “->”.b. ch=’a’. existe um operador especial definido pela linguagem C.

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

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

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

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

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

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

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

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

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

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

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. Esta função aborta a execução do programa. o código_de_retorno.1. para o sistema operacional.2.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). Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne. 13.Noções de Manipulação de Arquivos 99 Tabela 13. 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. como é mostrado na Figura 13. Para tanto devemos usar a função fclose(): .3 A Função fclose() Quando abrimos um arquivo devemos fechá-lo. 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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. setlocale( ). *mon_thousands_sep. p_sign_posn. n_sep_by_space. char *setlocale(int category. *mon_grouping. const char *locale). p_cs_precedes. int_frac_digits. *mon_decimal_point. *thousands_sep. *positive_sign. . *int_curr_symbol. frac_digits. n_cs_precedes. p_sep_by_space. *negative_sign. n_sign_posn.Bibliotecas do C 119 Macros NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME Funções localeconv( ). *currency_symbol. *grouping.

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

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

char *buffer. fpos_t *pos). remove( ). int fclose(FILE *stream). size_t size). fflush( ). size_t nmemb. ferror( ).UFLA/FAEPE . const char *mode).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( ). fgetpos( ).FILE *stream). fseek( ). const char *mode. size_t fwrite(const void *ptr. int whence). void clearerr(FILE *stream). int mode. int fsetpos(FILE *stream.122 EDITORA . rename( ). fclose( ). FILE *freopen(const char *filename. int feof(FILE *stream). int fseek(FILE *stream. freopen( ). void setbuf(FILE *stream. long int offset. int ferror(FILE *stream). setbuf( ). int rename(const char *old_filename. int fflush(FILE *stream). fwrite( ). long int ftell(FILE *stream). feof( ). int remove(const char *filename). rewind( ). int setvbuf(FILE *stream. const char *new_filename). . setvbuf( ). const fpos_t *pos). size_t fread(void *ptr. fsetpos( ). ftell( ). int fgetpos(FILE *stream. FILE *stream). char *buffer). FILE *fopen(const char *filename. fopen( ). void rewind(FILE *stream). size_t size. size_t size. size_t nmemb. fread( ). FILE *stream).

int getc(FILE *stream). const char *format. perror( ). . fprintf( ).. FILE *stream).). gets( ). . sscanf( ). int vprintf(const char *format. int putchar(int char). int vsprintf(char *str. void perror(const char *str). sprintf( ). const char *format. scanf( ). . int vfprintf(FILE *stream. int fgetc(FILE *stream). getc( ).. FILE *stream). char *gets(char *str). vsprintf( ). int sscanf(const char *str. tmpnam( ). FILE *stream). int N. int ungetc(int char. vfprintf( ).. ungetc( ). . const char *format. fgetc( ). va_list arg). fputs( ). int sprintf(char *str. int scanf(const char *format.. int getchar(void). int puts(const char *str). const char *format... fputc( ). va_list arg).. int fputs(const char *str.). vprintf( ). putc( ). const char *format. fgets( ). FILE *stream). FILE é um tipo útil para armzenar informações de um arquivo (file stream). getchar( ). . int fprintf(FILE *stream.).).. int fscanf(FILE *stream. int fputc(int char. FILE *tmpfile(void). 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 ). int putc(int char. fpos_t é um tipo útil para armazenar qualquer posição em um arquivo.). FILE *stream). va_list arg).. int printf(const char *format. printf( ). NULL é o valor ce uma constante ponteiro nulo (null pointer constant). char *fgets(char *str.). .Bibliotecas do C 123 tmpfile( )... putchar( ).. char *tmpnam(char *str). puts( ). . fscanf( ). const char *format.

stdin.10. _IOLBF. BUFSIZ é um inteiro que representa o tamanho do buffer usado pela função setbuf. A.124 EDITORA . 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. 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. Algumas funções em detalhe . Abre um arquivo apontado por filename. const char *mode). e _IONBF são usadas na função setvbuf. stderr. standard input. SEEK_END. e SEEK_SET são usados na função fseek. 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. EOF é um inteiro negativo que indica que o final do arquivo (end-of-file) foi alcançado.Introdução à Linguagem C _IOFBF. TMP_MAX é o máximo número de nomes de arquivos únicos (unique filenames) que a função tmpnam pode gerar.1 fopen Declaração: FILE *fopen(const char *filename. 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.UFLA/FAEPE . e standard output streams. SEEK_CUR. 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. e stdout são ponteiros para tipos arquivos (FILE types) os quais correspondem aos standard error.

%u Inteiro decimal sem sinal – unsigned int. Se o arquivo for aberto no modo append (a).. const char *format. Ocorrendo uma falha na abertura. Se o arquivo for aberto no modo update (+). 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. Tipos de argumentos %d. const char *format. ou fflush.... vsprintf (char *str. sprintf (char *str.). um ponteiro nulo será retornado. 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.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. então todas as operações de escrita ocorrerão ao final do arquivo não importando a posição corrente do arquivo.). . printf (const char *format. . fsetpos. va_list arg). A.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). %i Inteiros decimais com sinal – signed int. vfprintf (FILE *stream.). . ..10. const char *format. va_list arg).. va_list arg). então a abertura falhará. vprintf (const char *format. const char *format. será retornado um ponteiro para o arquivo (file stream). Tendo sucesso na abertura do arquivo. rewind.

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

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

Funções abort( ). atexit( ). calloc( ). 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.128 EDITORA . atoi( ). int atexit(void (*func)(void)). div_t div(int numer.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. wchar_t é um tipo inteiro do tamanho de uma constante wide character. void abort(void). int atoi(const char *str). . atof( ). size_t size. ldiv_t é a estrutura retornada pela função ldiv. int denom). abs( ). div( ). size_t size). int (*compar)(const void *. long int atol(const char *str). EXIT_FAILURE e EXIT_SUCCESS são valores retornados pela função exit. div_t é a estrutura retornada pela função div. const void *)).UFLA/FAEPE . RAND_MAX é o máximo valor retornado pela função rand. int abs(int x). bsearch( ) . double atof(const char *str). size_t nitems. const void *base. NULL é o valor de uma constante ponteiro nulo. void *calloc(size_t nitems. atol( ). void *bsearch(const void *key.

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful