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

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2f %10. printf("\n%3. printf("\n%4d". } Figura 4.350).1f".h> main( ) { printf("\n%10. printf("\n%6d".3f".2f".350). } Figura 4. } Figura 4.h> main( ) { printf("\n%4.55.h> main( ) { printf("Este é o numero dois: %d". printf("%s está a %d milhões de milhas \n do sol".2f %10. 8.34 EDITORA . 834.2f".78). 1500.4: Alinhamento de campos numéricos .3: Arredondamento de números em ponto flutuante #include <stdio. } Figura 4.350).2: Tamanho de campos na impressão #include <stdio. printf("\n%3. 4890.78). 3456. 3456.2f". "Vênus".2f %10.78).2f".78).UFLA/FAEPE .2f %10. 67). 3456. printf("\n%10.0. 3456.3. printf("\n%10.h> main( ) { printf("\n%2d".13).0.Introdução à Linguagem C #include <stdio.21). 15.1: Exemplo de utilização da função printf #include <stdio. 584. 2).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

O endereço mais baixo corresponde ao primeiro elemento.6 MATRIZES A matriz é um tipo de dado usado para representar uma certa quantidade de variáveis que são referenciadas pelo mesmo nome. Consiste em locações contíguas de memória. os dados serão indexados de 0 a 19. Por exemplo. se declararmos: float exemplo[20]. exemplo[19] ¡ ¡ Mas ninguém o impede de escrever: exemplo[30] exemplo[103]  ¥    % . .1 MATRIZ UNIDIMENSIONAL Sintaxe: tipo nome[tamanho]. 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. A matriz é um conjunto ordenado de dados que possuem o mesmo tipo. 6. Neste exemplo. portanto sendo declarada uma matriz de inteiros de 10 elementos. Para acessá-los escrevemos: exemplo[0] exemplo[1] . Estes bytes são reservados de maneira contígua. As matrizes têm 0 como índice do primeiro elemento. o índice varia de 0 a 9.

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

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

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

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

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

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

60

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

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

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

8.1

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

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

62

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

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

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

Declaramos a variável count como sendo do tipo inteiro e um declaramos um ponteiro para um inteiro, pt. A expressão &count nos dá o endereço de count, o qual armazenamos em pt. O valor de count não é alterado quando se inicializa o valor de pt. Como nós colocamos um endereço em pt, ele está agora “liberado” para ser usado. Podemos, por exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador “inverso” do operador &. É o operador *. No exemplo acima, uma vez que fizemos pt=&count a expressão *pt é equivalente ao próprio count. Após a inicialização da variável ponteiro com o endereço da variável inteira, esta variável pode ser referenciada pelo seu nome ou pelo ponteiro que contém seu endereço. Isto significa que, se quisermos atribuir um valor para count podemos fazer de duas formas: count = 5; ou *pt = 5; As duas formas são equivalentes e têm o mesmo resultado. Qualquer modificação feita utilizando-se *pt, causará uma modificação na variável count.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful