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

INTRODUÇÃO À LINGUAGEM C

2 Edição
 

João Carlos Giacomin

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

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

SUMÁRIO

1 Introdução 1.1 Linguagens de Máquina, Nível . . . . . . . . . . . 1.2 A História do C . . . . . 1.3 A Biblioteca padrão C . 1.4 Características de C . . 1.5 C e C++ . . . . . . . . . 1.6 O Compilador GCC . . .

11 Linguagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de . . . . . . . . . . . . Montagem, e Linguagens de Alto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 13 13 14 15 15 17 18 19 21 21 22 23 23 26 26 26 27 29 29 30 33 33 35 36 36 39 39 40 41 42 42 47 48 49 49

2 Estrutura de um Programa em C 2.1 Visão Geral de um Programa C . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Um Programa Utilizando uma Função . . . . . . . . . . . . . . . . . . . . . 3 Sintaxe 3.1 Identificadores . . . . . . . . . . . . . . 3.2 Tipos de Variáveis . . . . . . . . . . . . 3.2.1 Tipos Básicos . . . . . . . . . . . . . 3.3 Declaração e Inicialização de Variáveis 3.4 Operadores . . . . . . . . . . . . . . . . 3.4.1 Operador de Atribuição . . . . . . . . 3.4.2 Operadores Aritméticos . . . . . . . 3.4.3 Operadores Relacionais e Lógicos . 3.4.4 Precedência . . . . . . . . . . . . . . 3.4.5 Operador cast (Modelador) . . . . . 3.4.6 Operador sizeof . . . . . . . . . . . . 4 Funções Básicas da Biblioteca C 4.1 Função printf( ) . . . . . . . . 4.2 Função scanf( ) . . . . . . . . 4.3 Função getchar() . . . . . . . 4.4 Função putchar() . . . . . . . 5 Estruturas de Controle de Fluxo 5.1 If . . . . . . . . . . . . . . . 5.2 If-else-if . . . . . . . . . . . 5.3 Operador Ternário . . . . . 5.4 Switch . . . . . . . . . . . . 5.5 Loop for . . . . . . . . . . . 5.6 While . . . . . . . . . . . . . 5.7 Do-while . . . . . . . . . . . 5.8 Break . . . . . . . . . . . . 5.9 Continue . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.2. 4. Aqui serão citadas apenas algumas mais comuns. 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. Cada argumento deve ser separado por vírgula. Tabela 4. 1 Input/Output: entrada/saída .1.1 FUNÇÃO PRINTF( ) Sintaxe: printf("expressão de controle". 4.3. A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação que indicam o formato em que os argumentos devem ser impressos.5 e 4.6 apresentam vários exemplos de utilização da função printf em programas simples. 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. É uma função de I/O1 .4.4 FUNÇÕES BÁSICAS DA BIBLIOTECA C Existem algumas funções muito usadas em programas feitos em linguagem C.argumentos).

78).13). printf("\n%6d". printf("\n%3. 67). } Figura 4.3.2f %10.34 EDITORA . 15.2f %10.h> main( ) { printf("\n%10. 3456.h> main( ) { printf("Este é o numero dois: %d". 8.2f".2f".2f".78). printf("%s está a %d milhões de milhas \n do sol".2f". 3456. } Figura 4.2: Tamanho de campos na impressão #include <stdio. 1500.78).3f". printf("\n%10. 3456. 834.h> main( ) { printf("\n%2d".Introdução à Linguagem C #include <stdio.21). printf("\n%3.0. 584.2f %10.1: Exemplo de utilização da função printf #include <stdio. 2).0. "Vênus".350).55.3: Arredondamento de números em ponto flutuante #include <stdio. } Figura 4. 4890.2f %10.78). printf("\n%10.4: Alinhamento de campos numéricos .h> main( ) { printf("\n%4. } Figura 4.UFLA/FAEPE .350). 3456.1f".350). printf("\n%4d".

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

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

Funções Básicas da Biblioteca C

37

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

38

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

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

5.1

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

Se a condição avaliar em verdadeiro (qualquer valor diferente de 0), o computador executará o comando ou o bloco, de outro modo, se a cláusula else existir, o computador executará o comando ou o bloco que é seu objetivo. Veja os exemplos das Figuras 5.1 e 5.2.
#include <stdio.h> main( ) { int a,b; printf("digite dois números:"); scanf("%d%d",&a,&b); if (b) printf("%d\n",a/b); else printf("divisão por zero\n"); } Figura 5.1: Exemplo de programa que utiliza o comando de decisão if

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

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

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

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

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

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

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

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

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

O controle do programa passará então imediatamente para o código que segue o loop. ele causa seu término imediato. } while (x <100). x.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.Estruturas de Controle de Fluxo 49 #include <stdio. Figura 5.8 BREAK Quando o comando break é encontrado em qualquer lugar do corpo do for.18. %d \n". Veja o exemplo da Figura 5. do { xq = x*x. Um exemplo é apresentado na Figura 5. } Quadrado \n\n").17. 5. printf("\t %d x++.h> main( ) { int x. xq. O comando continue força a próxima iteração do loop — pula o código que estiver em seguida. printf ("\n\t Numero x = 1. xq). para isso utilizamos o continue. .

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

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

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

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

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

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

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

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

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

5: Utilização da função strcat da biblioteca string.4: Utilização da função strcpy da biblioteca string.5. s2). Concatena duas strings.4 FUNÇÃO STRCAT() Sintaxe: strcat(string1. #include <string. Essa função compara duas strings. dois)."alo"). strcat (um. strcpy (dois.Manipulação de Strings 59 # include <stdio. "bom"). printf ("%s\n". Um exemplo é visto na Figura 7. Não verifica tamanho.h 7. se forem iguais devolve 0. dois[10]. strcpy (um.h 7. um).h> main() { char str[20].h> #include <stdio.5 FUNÇÃO STRCMP() Sintaxe: strcmp(s1.6 mostra um exemplo da função strcmp(). string2). } // une a string dois à string um Figura 7.h> main() { char um[20]. A Figura 7. .h> # include <string." dia"). strcpy(str. 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".3: Utilização de ponteiros 8. // y é uma variável do tipo de x . A Figura 8. então podemos fazer a declaração: py = px. px = &x. isto é.*px). que é o endereço printf("*px= %d\n". // imprime valor de x. #include <stdio. que é printf("px= %d\n". // endereço da variável x.&x). x = 9.2 MANIPULAÇÃO DE PONTEIROS Desde que os ponteiros são variáveis. pois py = } igual ao conteúdo de px de x por px.*px. O operador * tem maior precedência que as operações aritméticas.*py).Ponteiros 63 8. // conteúdo da variável apontada printf("*py= %d\n". Se py e px são ponteiros para inteiros.3 EXPRESSÕES COM PONTEIROS Os ponteiros podem aparecer em expressões. se px aponta para um inteiro x. valor de x px Figura 8.*py.h> main( ) { int x. // valor de px. py = px. então *px pode ser utilizado em qualquer lugar que x o seria. assim a expressão abaixo pega o conteúdo do endereço que px aponta e soma 1.x). eles podem ser manipulados tal como as variáveis.3 apresenta um programa que exemplifica a utilização de ponteiros para acessar um variável x. y = *px+1. // imprime o valor de x printf("&x= %d\n".px).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

*/ int main( ) { struct Conta_Banco Gerente. p_Conta->saldo). return 0. As variáveis_union não precisam ser declaradas imediatamente após a declaração da union. 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. *p_Conta. /* declara um ponteiro para uma estrutura Conta_Banco */ p_Conta = &Gerente. Gerente. .saldo).4 }.Tipos de Dados Definidos Pelo Usuário 89 struct Conta_Banco { /* a mesma estrutura da figura 12. /* coloca o endereço de Gerente no ponteiro */ printf(" \n Saldo do Gerente = %f ". printf(" \n Saldo do Gerente = %f ". } Figura 12.6: Exemplo de ponteiro para estrutura int main( ) { struct Conta_Banco p_Conta = &Gerente. *p_Conta. } Figura 12.7: Exemplo de passagem de uma estrutura inteira para uma função 12.8. elas podem ser declaradas posteriormente como se declaram as variáveis inteiras e de ponto flutuante. A declaração de uma união é semelhante à declaração de uma estrutura. (*p_Conta).

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

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

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

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

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

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

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. } Figura 12..UFLA/FAEPE . tipo nome_N: tamanho_N. .96 EDITORA .

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

&nu). while(nu) { fprintf (fp. pn = &nu. } fclose(fp). char ch. if (!fp) printf ("Erro na abertura do arquivo. fp = fopen("teste.1. int nu. "r"). fp = fopen ("exemplo. nu)."). &nu). nu).dat". para abrir um arquivo binário."%d ".98 EDITORA . *pn.bin".Introdução à Linguagem C #include <stdio.dat". "w"). scanf("%d".UFLA/FAEPE .2 A Função exit() Aqui abrimos um parêntesis para explicar a função exit() cujo protótipo é: .1: Escrevendo e lendo em arquivo Poderíamos então. scanf("%d". &nu).h> main ( ) { FILE *fp. printf("Entre com os numeros para gravar e 0 para sair: "). escrever: FILE *fp. } } Figura 13. while(!feof(fp)) { fscanf( fp. printf( "%d"."wb"). 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)."%d ". fp = fopen("teste. 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. 13. A função exit() se torna importante em casos como alocação dinâmica e abertura de arquivos pois pode ser essencial que uma determinada memória seja alocada ou que um arquivo seja aberto.Noções de Manipulação de Arquivos 99 Tabela 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. Esta função aborta a execução do programa. como é mostrado na Figura 13.2. Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne. o código_de_retorno. para o sistema operacional. Para tanto devemos usar a função fclose(): .1.3 A Função fclose() Quando abrimos um arquivo devemos fechá-lo.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).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful