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

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

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

. . . . . . . . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . . . . . . 13. .3 Capítulo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10. . . . 15. . . . . . . . . . . . 13. . . . . 15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . . . . . . . .2 getc() .1. . . . . . . . .h . . . . 15. . . . . . . . A. .1 Abrindo e Fechando um Arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Capítulo 11 . . A. .4 12. .1 Algumas funções em detalhe A. . . . . . . . . . . . . . . . . . . Campos-de-Bits . . . . .2. . . . . . . . .11 Capítulo 12 .8 Capítulos 8 e 9 15. . . . . . . . . . . . . . . . . . . . . . . .1 A Função fopen() . . . .10 stdio. . . . . . . . . . . . . . . . . . .9 stdarg. . . . . . . . . . . . . . . .2 Entradas e saídas formatadas A. . . . . 13. . . . . . . . . . . . .1. .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 limits. . . . . . . . . . . . . . . . . . . . . . . .12 Capítulo 13 . . . . . . . . . . . . . . . . . . . . . . . . .9 Capítulo 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Capítulo 1 . . . . . . . . . . Referências Bibliográficas A Bibliotecas do C A. . . . . . . . 14 Noções de Alocação Dinâmica 15 Exercícios 15.4 errno. . . . . . . . . .10. . . . . . . . . . . . . . . . . . . . . . . . . . . 91 92 97 97 97 98 99 100 100 101 101 103 105 105 105 106 106 106 109 109 110 111 112 112 112 112 113 115 115 115 116 117 117 118 120 120 121 121 124 125 126 13 Noções de Manipulação de Arquivos 13. . A. . . . . . . . . . . . . . . . .12.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. . . . . . . 15. . . . . . . . . . . . . . . . . . . . . . . . . .6 Capítulo 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Typedef . . A. . . . . . . . . A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13. . . . . . . . . . . . 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A. . . . . . .13 Capítulo 14 . . . . . . . .2 A Função exit() .10. . . . . . . . . . . . . . . . . . . . .5 Capítulo 5 .7 math. . . . A. . . .1 putc() . . . . . . . . A. . . .8 signal. . . . . . 15. . . . . . . . . . . . . . . . . . . . . .h . . . . . . . . . A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. . . . . .2. . . . . . . 15.h . . . . . . . . . . . . . . . . .3 A Função fclose() .1. . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Lendo e Escrevendo Caracteres em Arquivos 13. . . . . . . . . . . . . . . . .3 feof() . . . . . . . . . . . . . . . . . . . . . . .3 Funções (x)scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 assert. . . . . . . . . . . . . . . . A. . . . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 conio. 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Capítulo 7 . .4 Capítulo 4 . . . .2 Capítulo 2 . . . 15. . . . . . . . . . . . .3 ctype. . . . . . . . . . . . . . . . . .6 locale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .h . . .2. . . . . . . . . . . .

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

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

. . Programa que recebe uma string na linha de comando . . . . . . . . . . . . .4 10. . . . . . . Operações com Ponteiros . . . .5 6. . . . . . . . . . . . .3 10. . . .6 8. . . . . . . . . . . . . . . . . Função que procura uma substring dentro de uma string . . .4 7. Ponteiros para ponteiros . .2 8. . . . . . . .1 11. . . Variáveis locais em uma função . . . Exemplo de utilização do comando continue . .1 10. . . . . . . . . . . . . . . . .7 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 9. . . . . . . . . . . .11 10. . .15 5. . . . . . . . . . . .9 10. . . . . . . .5. .2 9. Utilização da função strcat da biblioteca string. . . . . Exemplo simples de utilização do comando break . . . . . . . . .13 11. . . . . . . . . . .1 9. . . . . . . . . . . . . . . . . . . . . . .h Exemplos de declarações de ponteiros Atribuição de valor a um ponteiro . . . Uso de um ponteiro no lugar de uma string . . . . . . . . . . .3 8. . . . . .h . . . . Passagem de valor de uma variável para uma função . . . . . . . . . . . . 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 . . . . . . . . . . . . .6 10. . . . . . . . .10 10. . . .8 10. . .4 8. . . . . . . .2 6. . . . . . . . . . . .h . . . . . . . Função com retorno de inteiro . . . . . . . . . .3 7. . . . . . . . . . . . . . . . . . . . . .2 Geração de uma tabela de quadrados de inteiros utilizando do-while Exemplo de utilização do laço do-while . . . . . . . . . .5 8. . . . . . . . . . . . . . . . . . . . . . . . . Função que utiliza passagem por referência . .6 7. . . . . . . . . Variáveis globais em um programa . . . . . . . . . Exemplo simples de utilização de matriz multidimensional . . . . . Erro na utilização de matriz . . . . . . . . . . . Programa simples que utiliza a função gets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 7. . . . . . . . . . . . . . . . . . . . . .12 10. . . . . . . . . . . . . . .4 6.18 6. . . . . . .3 6. . . . . . . . . Alterando valores de uma matriz . . . . . . . . Utilização da função strcmp da biblioteca string. . . . . Função que utiliza uma matriz . . . . . . Exemplo simples de utilização de matriz . . . .5 7. . . . . . . . . . . Exemplo simples de utilização da função puts . . . . . . . . . . . . . . . . . . . . . . . . . . Utilização da função strcpy da biblioteca string. . . . . . . . . . Programa que recebe argumentos na linha de comando . .16 5. . . . . . . . Exemplo do erro de ponteiro perdido . . . . Exemplo de utilização de matriz estática . . . . . . . .4 10. . . . . . . .2 7. . . . . . . . . . . . . . . . . .1 8. . . . . Função que opera sobre uma matriz utilizando um ponteiro . . . . . . . . .5 10. . . . . . . . . . Parâmetros formais de uma função . . . . . . Variáveis locais em uma função . . . . . . . .2 10. . . . . . Exemplo de armazenamento de dados em matriz unidimensional Operações com matriz . . . . . . . Utilização de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . 49 50 50 51 54 55 55 56 56 56 57 58 58 59 59 60 61 62 63 65 65 65 68 69 69 70 72 73 74 74 75 75 76 77 77 78 79 79 80 81 82 Cópia de uma string (versão matriz) . .17 5. . . .6 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cópia de uma string (versão ponteiro) . . . . . . . . . . . . . .1 6. . . . . . Exemplo simples de operação com strings . . . .

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.Sintaxe 31 Se quisermos então saber o tamanho de um float fazemos sizeof(float). .

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

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

350). 2). 8.2f". printf("\n%10. } Figura 4.2f %10. 15.2f %10. printf("\n%10. printf("%s está a %d milhões de milhas \n do sol".2f".78).2: Tamanho de campos na impressão #include <stdio. } Figura 4.Introdução à Linguagem C #include <stdio.350). 3456.h> main( ) { printf("\n%2d".0. printf("\n%4d".2f". 4890.3f". 1500. "Vênus".h> main( ) { printf("\n%4.2f".350).3.1f".78).UFLA/FAEPE . 834.78).2f %10. printf("\n%6d". 67).13).4: Alinhamento de campos numéricos .0.2f %10. 3456. 3456. printf("\n%3. } Figura 4.34 EDITORA .1: Exemplo de utilização da função printf #include <stdio. } Figura 4.h> main( ) { printf("Este é o numero dois: %d". 584. 3456. printf("\n%3.78).21).55.h> main( ) { printf("\n%10.3: Arredondamento de números em ponto flutuante #include <stdio.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

main( ) { char s[80]. string[t]. t++) { string[t] = toupper ( string[t] ). string[t] ). printf ("%c".5.80 EDITORA .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. } void maiusc (char *string) { register int t. for( t = 0.h> void maiusc (char *string ). } } Figura 10. #include <stdio. A Figura 10.UFLA/FAEPE .13 mostra um exemplo de como fazê-lo utilizando um ponteiro que aponta para o primeiro elemento da matriz s. maiusc(s). gets(s).Introdução à Linguagem C 10.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1 fopen Declaração: FILE *fopen(const char *filename.UFLA/FAEPE . O argumento mode pode ser uma das seguintes constantes strings: r modo texto para leitura w modo texto para escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a modo texto para adicionar escrita – append text mode (abre ou cria um arquivo e aponta para o final do arquivo – end-of-file) rb modo binário de leitura – read binary mode wb modo binário de escrita – write binary mode ab modo binário para adicionar escrita (abre ou cria um arquivo e aponta para o final do arquivo – end-of-file) r+ modo texto para leitura e escrita. e _IONBF são usadas na função setvbuf. 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. e SEEK_SET são usados na função fseek. e standard output streams. const char *mode). TMP_MAX é o máximo número de nomes de arquivos únicos (unique filenames) que a função tmpnam pode gerar.Introdução à Linguagem C _IOFBF. EOF é um inteiro negativo que indica que o final do arquivo (end-of-file) foi alcançado. standard input. 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. Algumas funções em detalhe . stdin.10. 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. _IOLBF. 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. BUFSIZ é um inteiro que representa o tamanho do buffer usado pela função setbuf. SEEK_CUR. Abre um arquivo apontado por filename. SEEK_END.124 EDITORA . A. e stdout são ponteiros para tipos arquivos (FILE types) os quais correspondem aos standard error.

será retornado um ponteiro para o arquivo (file stream). .10. const char *format. vprintf (const char *format. . Ocorrendo uma falha na abertura. 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. ou fflush. .). %u Inteiro decimal sem sinal – unsigned int. sprintf (char *str.. A. rewind. Se o arquivo for aberto no modo update (+).. vsprintf (char *str. %i Inteiros decimais com sinal – signed int. Tipos de argumentos %d. va_list arg). . va_list arg). vfprintf (FILE *stream. então todas as operações de escrita ocorrerão ao final do arquivo não importando a posição corrente do arquivo.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. um ponteiro nulo será retornado. fsetpos. va_list arg). printf (const char *format.Bibliotecas do C 125 w+b ou wb+ modo binário para leitura e escrita (trunca o arquivo para comprimento zero ou cria um novo arquivo) a+b ou ab+ modo binário para leitura e escrita (abre ou cria um arquivo e ajusta o ponteiro para o final do arquivo – end-of-file) Se o arquivo não existir e for feita uma operação de abertura no modo read (r).). const char *format..). const char *format. 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.. Tendo sucesso na abertura do arquivo.. Se o arquivo for aberto no modo append (a).. então a abertura falhará. const char *format.

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful