Você está na página 1de 133

CURSO DE PS-GRADUAO

LATO SENSU (ESPECIALIZAO) A DISTNCIA


ADMINISTRAO EM REDES LINUX

INTRODUO LINGUAGEM C

2 Edio

Joo Carlos Giacomin

UFLA - Universidade Federal de Lavras


FAEPE - Fundao de Apoio ao Ensino, Pesquisa e Extenso
Lavras MG

PARCERIA
UFLA Universidade Federal de Lavras
FAEPE Fundao de Apoio ao Ensino, Pesquisa e Extenso
REITOR
Fabiano Ribeiro do Vale
VICE-REITOR
Antnio Nazareno Guimares Mendes
DIRETOR DA EDITORA
Marco Antnio Rezende Alvarenga
PR-REITOR DE PS-GRADUAO
Luiz Edson Mota de Oliveira
PR-REITOR ADJUNTO DE PS-GRADUAO LATO SENSU
Antnio Ricardo Evangelista
COORDENADOR DO CURSO
Joaquim Quinteiro Ucha
PRESIDENTE DO CONSELHO DELIBERATIVO DA FAEPE
Antnio Eduardo Furtini Neto
EDITORAO
Grupo Ginux (http://ginux.comp.ufla.br/)
IMPRESSO
Grfica Universitria/UFLA
Ficha Catalogrfica preparada pela Diviso de Processos Tcnicos
da Biblioteca Central da UFLA
Giacomin, Joo Carlos
Introduo Linguagem C / Joo Carlos Giacomin. 2. ed. Lavras:
UFLA/FAEPE, 2002.
105 p.: il. - Curso de Ps-Graduao Lato Sensu (Especializao) a
Distncia: Administrao em Redes Linux
Bibliografia.
1.
Programa de Computador. 2. Linguagem de Programao.
3.
Linguagem C. 4. Informtica. I. Giacomin, J.C. II Universidade Federal de
Lavras. III. Fundao de Apoio ao Ensino, Pesquisa e Extenso. IV. Ttulo.
CDD 005.133
Nenhuma parte desta publicao pode ser reproduzida, por qualquer
meio ou forma , sem a prvia autorizao.

SUMRIO

1 Introduo
1.1
Linguagens de Mquina,
Nvel . . . . . . . . . . .
1.2
A Histria do C . . . . .
1.3
A Biblioteca padro C .
1.4
Caractersticas de C . .
1.5
C e C++ . . . . . . . . .
1.6
O Compilador GCC . . .

11
Linguagens
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .

Montagem, e Linguagens de Alto. . . . . . . . . . . . . . . . . . . .


. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .

11
13
13
14
15
15

2 Estrutura de um Programa em C
2.1
Viso Geral de um Programa C . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
Um Programa Utilizando uma Funo . . . . . . . . . . . . . . . . . . . . .

17
18
19

3 Sintaxe
3.1
Identificadores . . . . . . . . . . . . . .
3.2
Tipos de Variveis . . . . . . . . . . . .
3.2.1 Tipos Bsicos . . . . . . . . . . . . .
3.3
Declarao e Inicializao de Variveis
3.4
Operadores . . . . . . . . . . . . . . . .
3.4.1 Operador de Atribuio . . . . . . . .
3.4.2 Operadores Aritmticos . . . . . . .
3.4.3 Operadores Relacionais e Lgicos .
3.4.4 Precedncia . . . . . . . . . . . . . .
3.4.5 Operador cast (Modelador) . . . . .
3.4.6 Operador sizeof . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

21
21
22
23
23
26
26
26
27
29
29
30

4 Funes Bsicas da Biblioteca C


4.1
Funo printf( ) . . . . . . . .
4.2
Funo scanf( ) . . . . . . . .
4.3
Funo getchar() . . . . . . .
4.4
Funo putchar() . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

33
33
35
36
36

5 Estruturas de Controle de Fluxo


5.1
If . . . . . . . . . . . . . . .
5.2
If-else-if . . . . . . . . . . .
5.3
Operador Ternrio . . . . .
5.4
Switch . . . . . . . . . . . .
5.5
Loop for . . . . . . . . . . .
5.6
While . . . . . . . . . . . . .
5.7
Do-while . . . . . . . . . . .
5.8
Break . . . . . . . . . . . .
5.9
Continue . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

39
39
40
41
42
42
47
48
49
49

.
.
.
.
.
.
.
.
.

de
. .
. .
. .
. .
. .
. .

6 Matrizes
6.1
Matriz Unidimensional .
6.2
Matriz Multidimensional
6.3
Matrizes Estticas . . .
6.4
Limites das Matrizes . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

53
53
54
54
54

7 Manipulao de Strings
7.1
Funo gets() . . .
7.2
Funo puts() . . .
7.3
Funo strcpy() . .
7.4
Funo strcat() . .
7.5
Funo strcmp() .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

57
57
58
58
59
59

8 Ponteiros
8.1
Declarando Ponteiros . . .
8.2
Manipulao de Ponteiros .
8.3
Expresses com Ponteiros
8.4
Ponteiros para Ponteiros . .
8.5
Problemas com Ponteiros .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

61
61
63
63
64
64

9 Ponteiros e Matrizes
9.1
Manipulando Matrizes atravs de Ponteiros . . . . . . . . . . . . . . . . . .
9.2
String e Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3
Matrizes de Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67
68
69
70

10 Funes
10.1 Funo sem Retorno . . . . . . . .
10.2 Funo com Retorno . . . . . . . .
10.3 Parmetros Formais . . . . . . . .
10.3.1 Chamada por Valor . . . . . . .
10.3.2 Chamada por Referncia . . . .
10.4 Classes de Variveis . . . . . . . .
10.4.1 Variveis Locais . . . . . . . . .
10.4.2 Variveis Globais . . . . . . . .
10.4.3 Variveis Estticas . . . . . . .
10.5 Funes com Matrizes . . . . . . .
10.5.1 Passando Parmetros Formais
10.5.2 Alterando os Valores da Matriz

71
71
72
72
73
73
74
75
76
76
78
78
80

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

11 Argumentos da Linha de Comando

81

12 Tipos de Dados Definidos Pelo Usurio


12.1 Estruturas . . . . . . . . . . . . . .
12.1.1 Trabalhando com Estruturas . .
12.2 Unies . . . . . . . . . . . . . . . .
12.3 Enumeraes . . . . . . . . . . . .

83
83
85
89
90

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

12.4
12.5

Typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Campos-de-Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13 Noes de Manipulao de Arquivos


13.1 Abrindo e Fechando um Arquivo . . . . . . .
13.1.1 A Funo fopen() . . . . . . . . . . . . . .
13.1.2 A Funo exit() . . . . . . . . . . . . . . .
13.1.3 A Funo fclose() . . . . . . . . . . . . . .
13.2 Lendo e Escrevendo Caracteres em Arquivos
13.2.1 putc() . . . . . . . . . . . . . . . . . . . . .
13.2.2 getc() . . . . . . . . . . . . . . . . . . . . .
13.2.3 feof() . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

91
92
97
97
97
98
99
100
100
101
101

14 Noes de Alocao Dinmica

103

15 Exerccios
15.1 Captulo 1 . . .
15.2 Captulo 2 . . .
15.3 Captulo 3 . . .
15.4 Captulo 4 . . .
15.5 Captulo 5 . . .
15.6 Captulo 6 . . .
15.7 Captulo 7 . . .
15.8 Captulos 8 e 9
15.9 Captulo 10 . .
15.10 Captulo 11 . .
15.11 Captulo 12 . .
15.12 Captulo 13 . .
15.13 Captulo 14 . .

105
105
105
106
106
106
109
109
110
111
112
112
112
112

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

Referncias Bibliogrficas

113

A Bibliotecas do C
A.1
assert.h . . . . . . . . . . . . . .
A.2
conio.h . . . . . . . . . . . . . . .
A.3
ctype.h . . . . . . . . . . . . . . .
A.4
errno.h . . . . . . . . . . . . . . .
A.5
limits.h . . . . . . . . . . . . . . .
A.6
locale.h . . . . . . . . . . . . . .
A.7
math.h . . . . . . . . . . . . . . .
A.8
signal.h . . . . . . . . . . . . . .
A.9
stdarg.h . . . . . . . . . . . . . .
A.10 stdio.h . . . . . . . . . . . . . . .
A.10.1 Algumas funes em detalhe
A.10.2 Entradas e sadas formatadas
A.10.3 Funes (x)scanf . . . . . . .

115
115
115
116
117
117
118
120
120
121
121
124
125
126

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
. .

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

A.10.4 Funes de entrada e sada de caracteres . . . . . . . .


A.11 stdlib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.11.1 Funes de manipuo de Strings . . . . . . . . . . . .
A.11.2 Funes de manipulao de Memria . . . . . . . . . .
A.11.3 Funes de Ambiente (Environment) . . . . . . . . . . .
A.11.4 Funes de busca e ordenao (Searching and Sorting)
A.11.5 Funes matemticas . . . . . . . . . . . . . . . . . . .
A.11.6 Funes Multibyte . . . . . . . . . . . . . . . . . . . . .
A.12 string.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.13 time.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

127
127
129
129
130
130
130
130
131
132

LISTA DE FIGURAS

1.1
1.2
1.3

Trecho de programa em linguagem de mquina . . . . . . . . . . . . . . . .


Trecho de programa em linguagem de montagem . . . . . . . . . . . . . . .
Trecho de programa em linguagem de alto nvel . . . . . . . . . . . . . . . .

11
12
12

2.1
2.2
2.3
2.4

Estrutura de um programa em C . .
Um programa simples em C . . . . .
Ambiente de programao do C . . .
Um programa que utiliza uma funo

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

17
18
19
20

3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8

Programa com instrues bsicas . . . . . . . . . . . .


Inicializao de variveis . . . . . . . . . . . . . . . . . .
Programa com diferentes tipos de variveis. . . . . . . .
Programa com operadores aritmticos . . . . . . . . . .
Programa para converso de ps para metros . . . . . .
Programa com operadores relacionais e lgicos . . . . .
Programa Maior_de_dois . . . . . . . . . . . . . . . . .
Programa com exemplo de utilizao de operador cast

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

22
25
25
28
28
29
29
30

4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9

Exemplo de utilizao da funo printf . . . . . . . . . . . .


Tamanho de campos na impresso . . . . . . . . . . . . . .
Arredondamento de nmeros em ponto flutuante . . . . . .
Alinhamento de campos numricos . . . . . . . . . . . . . .
Complementando com zeros esquerda . . . . . . . . . . .
Formas para imprimir caracteres utilizando a funo printf
Exemplo de programa que utiliza a funo scanf . . . . . .
Exemplo de programa que utiliza a funo getchar . . . . .
Exemplo de programa que utiliza a funo putchar . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

34
34
34
34
35
35
36
36
37

5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12

Exemplo de programa que utiliza o comando de deciso if . . . . . . . . . .


O comando de deciso if com um bloco de instrues . . . . . . . . . . . .
Exemplo de um programa que utiliza o comando if-else-if . . . . . . . . . .
Exemplo de programa que utiliza o operador ternrio . . . . . . . . . . . . .
Exemplo de programa que utiliza o comando switch . . . . . . . . . . . . .
Exemplo de for com apenas um comando . . . . . . . . . . . . . . . . . . .
Exemplo de for com um bloco de instrues . . . . . . . . . . . . . . . . . .
Programa para calcular o valor de
. . . . . . . . . . . . . . . . . . . . . .
Lao de for com duas variveis de controle . . . . . . . . . . . . . . . . . .
Loop infinito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Laos de for aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programa que exibe uma tabela das quatro primeiras potncias dos nmeros de 1 a 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exemplo simples de while . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gerao de uma tabela de quadrados de inteiros utilizando while . . . . .

39
40
41
42
43
44
44
45
46
46
46

5.13
5.14

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

47
48
48

5.15
5.16
5.17
5.18

Gerao de uma tabela de quadrados de inteiros utilizando do-while


Exemplo de utilizao do lao do-while . . . . . . . . . . . . . . . . .
Exemplo simples de utilizao do comando break . . . . . . . . . . .
Exemplo de utilizao do comando continue . . . . . . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

49
50
50
51

6.1
6.2
6.3
6.4
6.5
6.6

Exemplo simples de utilizao de matriz . . . . . . . . . . . . . .


Exemplo de armazenamento de dados em matriz unidimensional
Operaes com matriz . . . . . . . . . . . . . . . . . . . . . . . .
Exemplo simples de utilizao de matriz multidimensional . . . .
Exemplo de utilizao de matriz esttica . . . . . . . . . . . . . .
Erro na utilizao de matriz . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

54
55
55
56
56
56

7.1
7.2
7.3
7.4
7.5
7.6

Exemplo simples de operao com strings . . . . .


Programa simples que utiliza a funo gets . . . .
Exemplo simples de utilizao da funo puts . .
Utilizao da funo strcpy da biblioteca string.h .
Utilizao da funo strcat da biblioteca string.h .
Utilizao da funo strcmp da biblioteca string.h

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

57
58
58
59
59
60

8.1
8.2
8.3
8.4
8.5
8.6

Exemplos de declaraes de ponteiros


Atribuio de valor a um ponteiro . . .
Utilizao de ponteiros . . . . . . . . .
Operaes com Ponteiros . . . . . . .
Ponteiros para ponteiros . . . . . . . .
Exemplo do erro de ponteiro perdido .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

61
62
63
65
65
65

9.1
9.2
9.3
9.4

Cpia de uma string (verso matriz) . . . . . . . . . . . . . .


Cpia de uma string (verso ponteiro) . . . . . . . . . . . . .
Uso de um ponteiro no lugar de uma string . . . . . . . . . .
Utilizao de matrizes de ponteiros para mensagens de erro

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

68
69
69
70

10.1
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9
10.10
10.11
10.12
10.13

Inverso de uma string usando uma funo que recebe um ponteiro


Um codificador simples . . . . . . . . . . . . . . . . . . . . . . . . .
Funo com retorno de inteiro . . . . . . . . . . . . . . . . . . . . . .
Parmetros formais de uma funo . . . . . . . . . . . . . . . . . . .
Passagem de valor de uma varivel para uma funo . . . . . . . .
Funo que utiliza passagem por referncia . . . . . . . . . . . . . .
Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . .
Variveis globais em um programa . . . . . . . . . . . . . . . . . . .
Variveis locais em uma funo . . . . . . . . . . . . . . . . . . . . .
Funo que utiliza uma matriz . . . . . . . . . . . . . . . . . . . . . .
Funo que opera sobre uma matriz utilizando um ponteiro . . . . .
Funo que procura uma substring dentro de uma string . . . . . . .
Alterando valores de uma matriz . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

72
73
74
74
75
75
76
77
77
78
79
79
80

11.1
11.2

Programa que recebe uma string na linha de comando . . . . . . . . . . . .


Programa que recebe argumentos na linha de comando . . . . . . . . . . .

81
82

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

12.1
12.2
12.3
12.4
12.5
12.6
12.7
12.8
12.9
12.10
12.11
12.12
12.13
12.14

Forma geral de declarao de uma estrutura . . . . . . . . . . . .


Declarao de uma estrutura para clientes de um banco . . . . . .
Exemplos de acesso a membros de variveis do tipo estrutura . .
Exemplos de passagens de elementos de estruturas para funes
Exemplo de passagem de uma estrutura inteira para uma funo .
Exemplo de ponteiro para estrutura . . . . . . . . . . . . . . . . . .
Exemplo de passagem de uma estrutura inteira para uma funo .
Forma geral de declarao de uma unio . . . . . . . . . . . . . .
Declaraes de unies e formas de utilizao . . . . . . . . . . . .
Exemplo de enumerao . . . . . . . . . . . . . . . . . . . . . . .
Exemplo de utilizao de uma enumerao . . . . . . . . . . . . .
Utilizando typedef . . . . . . . . . . . . . . . . . . . . . . . . . . .
Forma geral de campos-de-bits . . . . . . . . . . . . . . . . . . . .
Exemplo de estrutura de campos-de-bits . . . . . . . . . . . . . . .

13.1
13.2

Escrevendo e lendo em arquivo . . . . . . . . . . . . . . . . . . . . . . . . . 98


Uso da funo exit na abertura de arquivos . . . . . . . . . . . . . . . . . . 100

14.1
14.2

Primeiro exemplo de alocao dinmica de memria . . . . . . . . . . . . . 103


Segundo exemplo de alocao dinmica de memria . . . . . . . . . . . . 104

15.1
15.2
15.3
15.4
15.5
15.6
15.7

Captulo 2: Programa para o exerccio 1 .


Captulo 3: programa para o exerccio 1 .
Captulo 4: Programa para o exerccio 1 .
Captulo 5: Programa para o exerccio 1 .
Captulo 5: Algoritmo para o exerccio 3 .
Captulo 7: programa para o exerccio 1 .
Captulo 10: Programa para o exerccio 2

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

84
84
86
87
88
89
89
90
93
94
94
95
95
96

105
106
107
108
109
110
111

LISTA DE TABELAS

3.1
3.2
3.3
3.4
3.5
3.6

Palavras reservadas do C . . . . . . .
Tipos de dados do C . . . . . . . . . .
Operadores aritmticos . . . . . . . .
Comandos de atribuio reduzidos . .
Operadores relacionais e lgicos . . .
Nvel de precedncia dos operadores

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

22
24
26
27
28
30

4.1

Caracteres de controle da funo printf . . . . . . . . . . . . . . . . . . . .

33

13.1

Modos vlidos de abertura de arquivos . . . . . . . . . . . . . . . . . . . . .

99

1
INTRODUO

1.1

LINGUAGENS DE MQUINA, LINGUAGENS DE MONTAGEM, E LINGUAGENS DE


ALTO-NVEL

Programadores escrevem instrues em vrias linguagens de programao, algumas


diretamente inteligveis pelo computador e outras que requerem passos intermedirios de
traduo. Centenas de linguagens de computador so usadas atualmente. Estas podem
ser divididas em trs grandes grupos:
Linguagens de mquina,
Linguagens de montagem,
Linguagens de alto nvel.
Qualquer computador pode entender diretamente apenas sua prpria linguagem de
mquina. A linguagem de mquina a linguagem natural de um computador em particular.
Ela relacionada diretamente ao projeto do hardware daquele computador. Linguagens
de mquina geralmente consistem de cadeias de nmeros (que se reduzem a 1s e 0s)
que instruem o computador a realizar suas operaes mais elementares, uma de cada
vez. Linguagens de mquina so dependentes da mquina (machine-dependent), isto ,
uma linguagem de mquina particular pode ser usada apenas em um tipo de computador.
Linguagens de mquina so desajeitadas para humanos, como poder ser visto a seguir no
trecho de um programa, na Figura 1.1, que soma pagamento de hora-extra ao pagamento
bsico e armazena o resultado no pagamento total.
+1300042774
+1400593419
+1200274027
Figura 1.1: Trecho de programa em linguagem de mquina

12

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Quando os computadores se tornaram mais populares, tornou-se claro que a programao em linguagens de mquina era muito lenta e tediosa para a maioria dos programadores. Em vez de usar as cadeias de nmeros que computadores podiam entender diretamente, os programadores comearam a usar abreviaes derivadas da lngua inglesa para
representar as operaes elementares do computador. Estas abreviaes do Ingls 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 mquina na velocidade dos computadores. A Figura 1.2 mostra um trecho de um programa em linguagem de montagem que tambm soma
o pagamento de hora-extra ao pagamento bsico e armazena o resultado no pagamento
total, mas mais claramente que seu equivalente em linguagem de mquina:

LOAD
ADD
STORE

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

A utilizao do computador cresceu rapidamente com o advento das linguagens de


montagem, mas estas ainda requeriam muitas instrues para realizar mesmo as tarefas
mais simples. Para acelerar o processo de programao, linguagens de alto nvel foram
desenvolvidas nas quais declaraes simples poderiam ser escritas para realizar tarefas
substanciais. Os programas tradutores que convertem programas de linguagens de alto
nvel em programas de linguagem de mquina so chamados compiladores. Linguagens
de alto nvel permitem aos programadores escreverem instrues que se parecem proximamente com o Ingls dirio e contm notaes matemticas comumente usadas. Um
programa de folha de pagamento escrito em linguagem de alto nvel poderia conter uma
declarao tal como mostrada na Figura 1.3

grossPay = basePay + overTimePay


Figura 1.3: Trecho de programa em linguagem de alto nvel

Obviamente, linguagens de alto nvel so muito mais desejveis do ponto de vista dos
programadores que linguagens de mquina ou linguagens de montagem. C e C++ esto
entre as mais poderosas e mais largamente usadas linguagens de alto nvel.

Introduo

1.2

13

A HISTRIA 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 caractersticas de sua linguagem
B, baseando-se BCPL, e usou B para criar as primeiras verses do sistema operacional
UNIX no Bell Laboratories em 1970 em um computador DEC PDP-7. Tanto BCPL quanto B
eram linguagens no tipadas todos os itens de dados ocupavam uma palavra na memria e o fardo de tratar um dado como um nmero inteiro ou um nmero real, por exemplo,
ficava a cargo do programador.
A linguagem C foi uma evoluo 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 so escritos
em C e/ou C++. C est disponvel para a maioria dos computadores atuais. C independente de Hardware. Com um projeto cuidadoso, possvel escrever programas em C que
so portveis para a maioria dos computadores. C usa muitos dos importantes conceitos
do BCPL e do B enquanto soma a tipagem de dados e outras caractersticas poderosas.
No final da dcada de 70, C havia evoludo para o que agora conhecido como o
tradicional C. A publicao, em 1978, do livro de Kernighan e Ritchie, The C Programming
Language, trouxe uma grande ateno linguagem. Esta publicao tornou-se um dos
livros de cincia da computao de maior sucesso de todos os tempos.
A rpida expanso do C sobre vrios tipos de computadores (algumas vezes chamados plataformas de Hardware) conduziu a muitas variaes. Estas eram similares mas
sempre incompatveis. Isto era um problema srio para desenvolvedores de programas que
precisavam desenvolver cdigo que rodasse sobre vrias plataformas. Tornou-se claro que
uma verso padro de C era necessria. Em 1983, o comit tcnico X3J11 foi criado sob
a American National Standards Committee on Computers and Information Processing (X3),
para fornecer uma definio de linguagem no ambgua e independente de mquina. Em
1989, o padro foi aprovado. O documento conhecido como ANSI/ISO 9899: 1990. Cpias deste documento podem ser requisitadas ao Americam National Institute. A Segunda
edio de Kernighan e Ritchie, publicada em 1988, reflete esta verso chamada ANSI C,
agora usada em todo o mundo.

1.3

A BIBLIOTECA PADRO C

Programas em C consistem de mdulos ou pedaos, chamados funes. Voc pode


programar todas as funes que voc precisa para formar um programa em C, mas a maio-

14

EDITORA - UFLA/FAEPE - Introduo Linguagem C

ria dos programadores em C aproveitam uma rica coleo de funes existentes, chamada
C Standard Library. Portanto, h realmente duas etapas para aprender o mundo C. A
primeira aprender a prpria linguagem C, e a segunda aprender como usar as funes da
biblioteca padro C.
Neste curso, voc ser levado a usar a abordagem de construo de blocos (Building
block approach) para criar programas. Evite reinventar a roda. Use pedaos existentes
isto chamado reutilizao 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 construo:
Funes da biblioteca padro C,
Funes que voc mesmo criou,
Funes que outras pessoas criaram e disponibilizaram para voc.
A vantagem de criar suas prprias funes que voc vai saber exatamente como
elas funcionam. Voc poder examinar o cdigo C. A desvantagem o tempo consumido
em esforo que leva do projeto ao desenvolvimento de novas funes.
Usar funes existentes evita reinventar a roda. No caso de funes padro ANSI,
voc sabe que elas so cuidadosamente escritas, e voc sabe que por estar usando funes que so disponveis em virtualmente todas as implementaes ANSI C, seu programa
ter uma chance muito maior de ser portvel.

1.4

CARACTERSTICAS DE C

C uma linguagem altamente portvel e bastante eficiente em termos de desempenho. uma linguagem de propsito geral, sendo utilizada para desenvolver os mais
diversos tipos de software.
Entre as principais caractersticas da linguagem C, podem ser citadas:
portabilidade
modularidade
recursos de baixo nvel
gerao de cdigo eficiente
simplicidade
facilidade de uso
possibilidade de ser usada para os mais variados propsitos
indicada para escrever compiladores, editores de textos, bancos de dados, etc.

Introduo

15

Como resultado, tem-se que C e C++ podem ser consideradas padres de indstria
pelas empresas de desenvolvimento de software. Vrias dessas empresas adotam estas
linguagens na maioria de seus projetos. Para o programador, o conhecimento da linguagem
C de grande valor.

1.5

C E C++

Algumas vezes os iniciantes confundem o que C++ e como difere de C. C++ uma
verso estendida e melhorada de C que foi projetada para suportar programao orientada a objetos (OOP). C++ contm e suporta toda a linguagem C e mais um conjunto de
extenses orientadas a objetos.
Por muitos anos ainda os programadores escrevero, mantero e utilizaro programas escritos em C, sem se preocuparem em utilizar os benefcios da orientao a objetos
proporcionados por C++, por isso o cdigo escrito em C estar em uso por muitos anos
ainda.

1.6

O COMPILADOR GCC

Todos os programas utilizados como exemplo neste curso utilizam apenas funes da
linguagem C padro ANSI (ANSI C), portanto recomendamos a utilizao de um compilador
de C que funcione bem para programas que seguem este padro. O compilador GCC o
compilador de C do projeto GNU (http//:www.gnu.org), gratuito e de cdigo aberto.
O projeto GNU (Gnus Not Unix) foi proposto por Richard Stallman em 1983. Richard
Stallman pesquisador do MIT e inventor do editor EMACS. O projeto teve incio em 1984,
e a proposta era desenvolver um sistema operacional completo e livre, similar ao Unix: o
sistema GNU (GNU um acrnimo recursivo que se pronuncia guh-NEW ou guniw).
Variaes do sistema GNU, que utilizam o ncleo Linux, so hoje largamente utilizadas;
apesar desses sistemas serem normalmente chamados de Linux, eles so mais precisamente chamados Sistemas GNU/Linux.
O desenvolvimento do GCC uma parte do Projeto GNU, com o objetivo de melhorar
o compilador usado no sistema GNU incluindo a variante GNU/Linux. O trabalho de desenvolvimento do GCC usa um ambiente aberto de desenvolvimento e suporta muitas outras
plataformas com o propsito de promover um compilador de primeira linha (world-class) que
seja otimizado continuamente, de reunir um grande time de desenvolvedores, de assegurar
que o GCC e o sistema GNU trabalhem em mltiplas arquiteturas e diversos ambientes, e
de atender a muitos outros testes e mais caractersticas de GCC.

16

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Em Abril de 1999, o Egcs Steering Committee foi indicado pelo FSF como o mantenedor oficial GNU para GCC. Naquele tempo GCC foi renomeado para GNU C Compiler e
para GNU Compiler Collection e recebeu uma nova misso.
Atualmente GCC contm aplicaes para C, C++, Objective C, Chill, Fortran, e Java
bem como bibliotecas para estas linguagens (libstdc++, libgcj,...).
Uma verso do compilador GCC pode ser obtida no ftp do curso de Cincia da Computao da UFLA1 . Obtenha uma cpia do compilador e instale em seu computador.
De posse do GCC instalado e configurado (independente de sua portagem ou ambiente), para compilar um programa denominado nome.c, execute a seguinte linha de comando:
gcc nome.c -o nome.exe
onde nome o nome dado ao programa. Com isso, o arquivo nome.c ser compilado
gerado um executvel nome.exe (em ambientes Linux, a extenso .exe desnecessria).

ftp://ftp.comp.ufla.br/pub/

2
ESTRUTURA DE UM PROGRAMA EM C

Um programa em C estruturado sobre funes. O programa possui uma ou vrias


funes, sendo que a principal, que d incio ao programa e chama todas as outras,
sempre chamada main. Alm dessas, existem outras pr-programadas, que so includas
nos programas como arquivos de cabealho, ou arquivos de incluso. Todas as funes
comeam com { e terminam com } , como indicado na Figura 2.1.

/* Estrutura de um programa em C
# include <arquivo_cabecalho.h>
int main ( )
{
declarao de variveis
instruo_1;
instruo_2;
funo_1(variveis);
instruo_3;
}
int funo_1 (variveis)
{
declarao de variveis
instruo_1;
instruo_2;
return (INT);
}

*/

Figura 2.1: Estrutura de um programa em C

18

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A primeira linha compreende apenas comentrios. Todos os comentrios iniciam com


/* e terminam com */. A segunda linha indica a incluso de um arquivo de cabealho.
A terceira linha, inicia a funo main. Aps a funo main, foi programada outra funo
chamada funo_1. Excetuando a main, todas as outras funes podem ter qualquer
nome que o programador desejar.
A declarao de funes segue sempre o padro: tipo nome (parmetros). Nesse
caso, tipo refere-se ao tipo de valor que a funo pode retornar (inteiro, decimal, letra, etc),
nome o nome dado funo, e parmetros so os valores passados pelo programa para
a funo. Quando no for especificado, o tipo da funo ser int (inteiro). No obrigatrio
o uso de parmetros, como pode ser visto no exemplo, na funo main.
A Figura 2.2 apresenta um programa simples escrito em linguagem C.
/* programa exemplo 01 */
# include <stdio.h>
main ( )
{
printf("Alo, Mundo!");
}
Figura 2.2: Um programa simples em C

Edite este programa com o nome exemp_01.c e compile-o utilizando o compilador


GCC, ou outro de sua preferncia. Escreva na linha de comando do computador:
gcc exemp_01.c -o exemp_01
Isto indica ao computador para utilizar o compilador GCC para compilar o programa
exemp_01.c escrito em C e dar ao arquivo executvel gerado o nome de exemp_01. Ao
final, rode o programa.
A funo printf j est programada dentro de stdio.h, e utilizada para escrever
mensagens na tela do computador. As funes pr-programadas devem ser escritas em
letras minsculas.
Modifique este programa para escrever outra mensagem alm de Alo, Mundo!.

2.1

VISO GERAL DE UM PROGRAMA C

A gerao do programa executvel a partir do programa fonte obedece a uma seqncia de operaes antes de tornar-se um executvel, conforme descrito na Figura 2.3. Depois
de escrever o mdulo fonte em um editor de textos, o programador aciona o compilador que

Estrutura de um Programa em C

19

no nosso exemplo chamado pelo comando gcc. Essa ao desencadeia uma seqncia
de etapas, cada qual traduzindo a codificao do usurio para uma forma de linguagem de
nvel inferior, que termina com o executvel criado pelo lincador.

Edio
(mdulo fonte em C)

PrProcessamento
(novo fonte expandido)

Compilao
(arquivo objeto)

Lincagem
(executvel)

Execuo

Figura 2.3: Ambiente de programao do C

2.2

UM PROGRAMA UTILIZANDO UMA FUNO

Para que fique entendida a estrutura de um programa em C, faamos um segundo


exemplo (Figura 2.4), o qual utiliza uma funo que retorna um valor do tipo inteiro.
A funo quadrado chamada pela main na sua quarta linha e retorna para a funo
main o quadrado do nmero passado como argumento. Na funo main, o valor retornado
atribudo varivel quad. Ao final, o nmero lido pela funo scanf e o seu quadrado so
escritos na tela, utilizando-se a funo printf.
A funo scanf tambm pertence a stdio.h e utilizada para ler valores enviados pelo
teclado. Edite este programa com o nome exemp_02.c e compile-o utilizando o compilador
GCC. Escreva na linha de comando do computador:
gcc exemp_02.c -o exemp_02

20

EDITORA - UFLA/FAEPE - Introduo Linguagem C

/* programa exemplo 02
# include <stdio.h>

*/

int quadrado (int num)


{
return (num*num);
}
main ( )
{
int num, quad;
printf("Envie um numero inteiro: ");
scanf("%d",&num);
quad = quadrado(num);
printf("\n Quadrado de %d : %d", num, quad);
}
Figura 2.4: Um programa que utiliza uma funo

Modifique este programa para que ele calcule o cubo do nmero: crie uma funo
cubo.

3
SINTAXE

Sintaxe so regras detalhadas para cada construo vlida na linguagem C. Estas


regras esto relacionadas com os tipos, as declaraes, as funes e as expresses.
Os tipos definem as propriedades dos dados manipulados em um programa.
As declaraes expressam as partes do programa, podendo dar significado a um
identificador, alocar memria, definir contedo inicial, definir funes.
As funes especificam as aes que um programa executa quando roda. A determinao e alterao de valores, e a chamada de funes de I/O so definidas nas expresses.
As funes so as entidades operacionais bsicas dos programas em C, que por
sua vez so a unio de uma ou mais funes executando cada qual o seu trabalho. H
funes bsicas que esto definidas na biblioteca C. As funes printf( ) e scanf( ) por
exemplo, permitem respectivamente escrever na tela e ler os dados a partir do teclado. O
programador tambm pode definir novas funes em seus programas, como rotinas para
clculos, impresso, etc.
Todo programa C inicia sua execuo chamando a funo main( ), sendo obrigatria
a sua declarao no programa principal.
Comentrios no programa so colocados entre /* e */ no sendo considerados na
compilao. Os comentrios podem tambm ser colocados em uma linha, aps o sinal //.
Cada instruo encerra com ; (ponto e vrgula) que faz parte do comando.
A Figura 3.1 mostra um exemplo de programa que utiliza estes conceitos bsicos.

3.1

IDENTIFICADORES

So nomes usados para se fazer referncia a variveis, funes, rtulos e vrios outros objetos definidos pelo usurio. O primeiro caracter deve ser uma letra ou um sublinhado. Os 32 primeiros caracteres de um identificador so significativos.
O C Case Sensitive, isto , os compiladores C entendem as letras maisculas e
minsculas como sendo diferentes. Portando uma varivel declarada como X1 ser dife-

22

EDITORA - UFLA/FAEPE - Introduo Linguagem C

# include <stdio.h>
main( ) /* funo obrigatria */
{
char Nome[20];
printf("\n Al! Qual o seu nome ? ");
scanf("%s",Nome);
printf("\n Bom dia, %s ! \n",Nome);
}
Figura 3.1: Programa com instrues bsicas

rente de uma varivel declarada com x1, uma varivel chamada Tempo ser diferente de
TEMPO, tempo e TeMPo. Os comandos bsicos do C devem ser escritos sempre com
minsculas (if, for, switch, etc.), caso contrrio, o compilador no ir interpret-los como
sendo comandos, mas como variveis. O C possui outros comandos e palavras reservadas
que so todos escritos em letras minsculas. A Tabela 3.1 apresentada uma lista com as
palavras reservadas do padro ANSI C.
Tabela 3.1: Palavras reservadas do C

auto
break
case
char
const
continue
default
do

3.2

double
else
enum
extern
float
for
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
typedef
union
unsigned
void
volatile
while

TIPOS DE VARIVEIS

Quando voc declara um identificador, d a ele um tipo. Os tipos principais podem


ser colocados dentro da classe do tipo de objeto de dado. Um tipo de objeto de dados
determina como valores de dados so representados, que valores pode expressar, e que
tipo de operaes voc pode executar com estes valores. As variveis, identificadores, no C
podem ter qualquer nome se duas condies forem satisfeitas: o nome deve comear com
uma letra ou sublinhado (_) e os caracteres subsequentes devem ser letras, nmeros ou

Sintaxe

23

sublinhado (_). H apenas mais duas restries: o nome de uma varivel no pode ser igual
a uma palavra reservada, nem igual ao nome de uma funo declarada pelo programador,
ou pelas bibliotecas do C. Variveis de at 32 caracteres so aceitas.
3.2.1

Tipos Bsicos

H cinco tipos bsicos de dados em C: caractere (char), inteiro (int), ponto flutuante
(float), ponto flutuante de preciso dupla (double) e vazio (void). Todos os outros tipos de
dados em C so baseados nestes 5 tipos bsicos. O tamanho e a faixa de representao
de cada um destes tipos de dados depende do processador utilizado e da implementao
do compilador C. O padro ANSI determina apenas a faixa mnima de cada tipo, no o seu
tamanho em bytes.
Exceto void, os tipos bsicos de C podem ter vrios modificadores precedendo-os.
Um modificador usado para alterar o significado de um tipo bsico, modificando o seu
tamanho ou sua forma de representao. Os modificadores so: signed, unsigned, long
e short. Os tipos bsicos do C juntamente com suas formas modificadas so apresentados
na Tabela 3.2.
Uma implementao do compilador pode mostrar um faixa maior do que a mostrada
na Tabela 3.2, mas no uma faixa menor. As potncias de 2 usadas significam:



 




  




  

!

3.3

" # # 
 #

DECLARAO E INICIALIZAO DE VARIVEIS

As variveis no C devem ser declaradas antes de serem usadas. A forma geral da


declarao de variveis :
tipo_da_varivel lista_de_variveis;
As variveis da lista de variveis tero todas o mesmo tipo e devero ser separadas
por vrgula. Como o tipo default do C o int, quando vamos declarar variveis int com
algum dos modificadores de tipo, basta colocar o nome do modificador de tipo. Assim um
long basta para declarar um long int.
H trs lugares nos quais podemos declarar variveis. O primeiro fora de todas as
funes do programa. Estas variveis so chamadas variveis globais e podem ser usadas

24

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Tabela 3.2: Tipos de dados do C

char
signed char
unsigned char
short



unsigned long

float
double
long double



unsigned short
int
unsigned int
long

Inteiros

 

    


 



 








 





!



 
 

   
 
 

  !




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; tamanho pelo
menos igual a char
mesmo tamanho que short sem negativos
inteiro de pelo menos 16 bits; tamanho pelo
menos igual a short
mesmo tamanho que int sem negativos
inteiro com sinal de pelo menos 32 bits; tamanho pelo menos igual a int
mesmo tamanho que long sem valores negativos

Ponto Flutuante

    
 


    




! 

pelo menos 6 dgitos de preciso decimal


pelo menos 10 dgitos decimais e preciso
maior que do float
pelo menos 10 dgitos decimais e preciso
maior que do double

a partir de qualquer lugar no programa. Pode-se dizer que, como elas esto fora de todas
as funes, todas as funes as vem. O segundo lugar no qual se pode declarar variveis
no incio de um bloco de cdigo de uma funo. Estas variveis so chamadas locais e s
tm validade dentro do bloco no qual so declaradas, isto , s a funo qual ela pertence
sabe da existncia desta varivel. O terceiro lugar onde se pode declarar variveis na lista
de parmetros de uma funo. Mais uma vez, apesar de estas variveis receberem valores
externos, so conhecidas apenas pela funo onde so declaradas.
As regras que regem onde uma varivel vlida chamam-se regras de escopo da
varivel. H mais dois detalhes que devem ser ressaltados. Duas variveis globais no
podem ter o mesmo nome. O mesmo vale para duas variveis locais de uma mesma funo.
J duas variveis locais, de funes diferentes, podem ter o mesmo nome sem perigo algum
de conflito.

Sintaxe

25

Podemos inicializar variveis no momento de sua declarao. Para fazer isto podemos
usar a forma geral

tipo_da_varivel nome_da_varivel = constante;


Isto importante pois quando o C cria uma varivel ele no a inicializa. Isto significa
que at que um primeiro valor seja atribudo nova varivel ela tem um valor indefinido e
que no pode ser utilizado para nada. Nunca presuma que uma varivel declarada vale
zero ou qualquer outro valor. Exemplos de inicializao podem ser vistos na Figura 3.2.

char ch=D;
int count=0;
float pi=3.1416;
Figura 3.2: Inicializao de variveis

A Figura 3.3 apresenta um programa que identifica o tamanho de variveis de diferentes tipos.
# include <stdio.h>
main()
{
char c;
unsigned char uc;
int i;
unsigned int ui;
float f;
double d;
printf("char %d",sizeof(c));
printf("unsigned char %d",sizeof(uc));
printf("int %d",sizeof(i));
printf("unsigned int %d",sizeof(ui));
printf("float %d",sizeof(f));
printf("double %d",sizeof(d));
}
Figura 3.3: Programa com diferentes tipos de variveis.

26

3.4
3.4.1

EDITORA - UFLA/FAEPE - Introduo Linguagem C

OPERADORES
Operador de Atribuio

O operador de atribuio em C o sinal de igual =. Ao contrrio de outras linguagens,


o operador de atribuio pode ser utilizado em expresses que tambm envolvem outros
operadores. O operador de atribuio = atribui varivel sua esquerda o valor calculado
direita. O C permite que se faam atribuies encadeadas, como:
x = y = z = 2.45;
Nesta linha, o valor 2.45 ser atribudo a z, depois a y, depois a x.
3.4.2

Operadores Aritmticos

Os operadores aritmticos so usados para desenvolver operaes matemticas. A


Tabela 3.3 apresenta a lista dos operadores aritmticos do C.
Tabela 3.3: Operadores aritmticos

Operador
+
*
/
%
++
--

Ao
Soma (inteira e ponto flutuante)
Subtrao ou Troca de sinal (inteira e ponto flutuante)
Multiplicao (inteira e ponto flutuante)
Diviso (inteira e ponto flutuante)
Resto de diviso (de inteiros)
Incremento (inteiro e ponto flutuante)
Decremento (inteiro e ponto flutuante)

O C possui operadores unrios e binrios. Os unrios agem sobre uma varivel apenas, modificando ou no o seu valor, e retornam o valor final da varivel. Os binrios usam
duas variveis e retornam um terceiro valor, sem alterar as variveis originais. A soma
um operador binrio pois pega duas variveis, soma seus valores, sem alterar as variveis,
e retorna esta soma. Outros operadores binrios so os operadores - (subtrao), *, / e
%. O operador - como troca de sinal um operador unrio que no altera a varivel sobre
a qual aplicado, pois ele retorna o valor da varivel multiplicado por -1.
Os operadores de incremento e decremento so unrios que alteram a varivel sobre
a qual esto aplicados. O que eles fazem incrementar ou decrementar de um a varivel
sobre a qual esto aplicados. Ento
x++;
x--;

Sintaxe

27

so operaes equivalentes a
x = x+1;
x = x-1;

Estes operadores podem ser pr-fixados ou ps-fixados. A diferena que quando


so pr-fixados eles incrementam e retornam o valor da varivel j incrementada. Quando
so ps-fixados eles retornam o valor da varivel sem o incremento e depois incrementam
a varivel. Ento, em
x = 23;
y = x++;

teremos, no final, y = 23 e x = 24. Em


x = 23;
y = ++x;

teremos, no final, y = 24 e x = 24.


Uma curiosidade: a linguagem de programao C++ tem este nome pois ela seria um
incremento da linguagem C padro.
Os operadores *, /, + e - funcionam como na maioria das linguagens, o operador %
indica o resto de uma diviso inteira. Quando efetuados sobre um mesmo operando, podem
ser utilizados em forma reduzida, como ilustra a Tabela 3.4.
Tabela 3.4: Comandos de atribuio reduzidos

i += 2;
x *= y+1;
d -= 3;








i = i+2;
x = x*(y+1);
d = d - 3;

A Figura 3.4 apresenta um programa simples que utiliza operadores aritmticos sobre
nmeros inteiros, e a Figura 3.5 apresenta um programa para fazer a converso de medidas
em ps para metros, utilizando operaes sobre nmeros em ponto flutuante.
A funo scanf() utilizada para ler um valor numrico do teclado do computador.
3.4.3

Operadores Relacionais e Lgicos

O termo relacional refere-se s relaes que os valores podem ter um com o outro e
o termo lgico se refere s maneiras como essas relaes podem ser conectadas. Em C,
entende-se como verdadeiro qualquer valor que no seja 0, enquanto que o valor 0 indica

28

EDITORA - UFLA/FAEPE - Introduo Linguagem C

# include <stdio.h>
main()
{
int x, y;
x =10; y = 3;
printf("%d\n", x/y);
printf("%d\n", x%y);
}
Figura 3.4: Programa com operadores aritmticos
#include <stdio.h>
/* Converso de ps para metros. */
main()
{
float pes, metros;
printf("Informe o nmero de ps: ");
scanf("%f", &pes);
/* l um float */
metros = pes * 0.3048;
/* converso de ps para metros */
printf("%f pes %f metros\n", pes, metros);
}
Figura 3.5: Programa para converso de ps para metros

condio falsa. As expresses que usam operadores de relao e lgicos retornaro 0


para falso e 1 para verdadeiro. Tanto os operadores de relao como os lgicos tm a
precedncia menor que os operadores aritmticos. As operaes de avaliao produzem
um resultado 0 ou 1.
Tabela 3.5: Operadores relacionais e lgicos

relacionais
>
maior que
>= maior ou igual
<
menor
<= menor ou igual
== igual
!= no igual

lgicos
&& and (E)
|| or (OU)
!
not (NO)

Sintaxe

29

As Figuras 3.6 e 3.7 apresentam programas com exemplos de utilizao de operadores relacionais e lgicos.
# include <stdio.h>
main()
{
int i,j;
printf("digite dois nmeros: ");
scanf("%d%d", &i, &j);
printf("%d == %d %d\n", i, j, i==j);
printf("%d != %d %d\n", i, j, i!=j);
printf("%d <= %d %d\n", i, j, i<=j);
printf("%d >= %d %d\n", i, j, i>=j);
printf("%d < %d %d\n", i, j, i<j);
printf("%d > %d %d\n", i, j, i> j);
}
Figura 3.6: Programa com operadores relacionais e lgicos

/* Maior de Dois */
# include <stdio.h>
main( )
{
int x=2, y=3, produto;
if ((produto = x*y) > 0) printf(" maior");
}
Figura 3.7: Programa Maior_de_dois

3.4.4

Precedncia

O nvel de precedncia dos operadores avaliado da esquerda para a direita. Os


parnteses podem ser utilizados para alterar a ordem da avaliao.
3.4.5

Operador cast (Modelador)


Sintaxe: (tipo)expresso

Podemos forar uma expresso a ser de um determinado tipo usando o operador


cast. Um exemplo pode ser visto na Figura 3.8. Nesse exemplo, se no fosse utilizado o

30

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Tabela 3.6: Nvel de precedncia dos operadores

Mais alta

Mais baixa

! ++ -- -(unrio)
*/%
+<>
<= >=
== !=
&&
||
=

modelador (float) sobre a varivel i, o programa imprimiria 1/3 = 0, pois, ele faria primeiro
a diviso de inteiros (1/3) resultando 0, e depois a converso do resultado para float.
# include <stdio.h>
main( )
{
int i=1;
printf(" %d/3 : %f ", i, (float) i/3);
}
Figura 3.8: Programa com exemplo de utilizao de operador cast

3.4.6

Operador sizeof

O operador sizeof retorna o tamanho em bytes da varivel, ou seja, do tipo que est
em seu operando. utilizado para assegurar a portabilidade do programa. O operador
sizeof usado para se saber o tamanho de variveis ou de tipos. Ele retorna o tamanho
do tipo ou varivel em bytes. Mas porque us-lo se sabemos, por exemplo, que um inteiro
ocupa 2 bytes? Devemos us-lo para garantir portabilidade. O tamanho de um inteiro pode
depender do sistema para o qual se est compilando. O sizeof chamado um operador
porque ele substitudo pelo tamanho do tipo ou varivel no momento da compilao. Ele
no uma funo. O sizeof admite duas formas:
sizeof nome_da_varivel
sizeof (nome_do_tipo)

Sintaxe

31

Se quisermos ento saber o tamanho de um float fazemos sizeof(float). Se declararmos a varivel f como float e quisermos saber o seu tamanho faremos sizeof(f). O
operador sizeof tambm funciona com estruturas, campos bit, unies e enumeraes.

32

EDITORA - UFLA/FAEPE - Introduo Linguagem C

4
FUNES BSICAS DA BIBLIOTECA C

Existem algumas funes muito usadas em programas feitos em linguagem C. Estas


so utilizadas principalmente para estabelecer a comunicao entre o usurio e o computador. Aqui sero citadas apenas algumas mais comuns.

4.1

FUNO PRINTF( )
Sintaxe: printf("expresso de controle",argumentos);

uma funo de I/O1 , que permite escrever no dispositivo padro (tela). A expresso
de controle pode conter caracteres que sero exibidos na tela e os cdigos de formatao
que indicam o formato em que os argumentos devem ser impressos. Cada argumento deve
ser separado por vrgula.

Tabela 4.1: Caracteres de controle da funo printf

\n
\t
\b
\"
\\
\f
\0

nova linha
tabulao
retrocesso
aspas
barra invertida
salta formulrio
nulo

%c
%d
%e
%f
%o
%s
%u
%x

caractere simples
decimal
notao cientfica
ponto flutuante
octal
cadeia de caracteres
decimal sem sinal
hexadecimal

As Figuras 4.1, 4.2, 4.3, 4.4, 4.5 e 4.6 apresentam vrios exemplos de utilizao da
funo printf em programas simples.
1

Input/Output: entrada/sada

34

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
printf("Este o numero dois: %d", 2);
printf("%s est a %d milhes de milhas \n do sol", "Vnus", 67);
}
Figura 4.1: Exemplo de utilizao da funo printf
#include <stdio.h>
main( )
{
printf("\n%2d",350);
printf("\n%4d",350);
printf("\n%6d",350);
}
Figura 4.2: Tamanho de campos na impresso
#include <stdio.h>
main( )
{
printf("\n%4.2f", 3456.78);
printf("\n%3.2f", 3456.78);
printf("\n%3.1f", 3456.78);
printf("\n%10.3f", 3456.78);
}
Figura 4.3: Arredondamento de nmeros em ponto flutuante
#include <stdio.h>
main( )
{
printf("\n%10.2f %10.2f %10.2f", 8.0, 15.3, 584.13);
printf("\n%10.2f %10.2f %10.2f", 834.0, 1500.55, 4890.21);
}
Figura 4.4: Alinhamento de campos numricos

Funes Bsicas da Biblioteca C

35

#include <stdio.h>
main( )
{
printf("\n%04d", 21);
printf("\n%06d", 21);
printf("\n%6.4d", 21);
printf("\n%6.0d", 21);
}
Figura 4.5: Complementando com zeros esquerda
#include <stdio.h>
main( )
{
printf("%d %c %x %o\n", A, A, A, A);
printf("%c %c %c %c\n", A, 65, 0x41, 0101);
}
Figura 4.6: Formas para imprimir caracteres utilizando a funo printf

A tabela ASCII possui 256 cdigos de 0 a 255, se imprimirmos em formato caractere


um nmero maior que 255, ser impresso o resto da diviso do nmero por 256; se o
nmero for 3393 ser impresso A, pois o resto de 3393 por 256 65.

4.2

FUNO SCANF( )

Tambm uma funo de I/O implementada em todos os compiladores C. Ela o


complemento de printf() e nos permite ler dados formatados da entrada padro (teclado).
Sua sintaxe similar a printf().
scanf("expresso de controle", argumentos);
A lista de argumentos deve consistir nos endereos das variveis. C oferece um operador para tipos bsicos chamado operador de endereo e referenciado pelo smbolo & que
retorna o endereo do operando. Um exemplo de programa que utiliza a funo scanf
visto na Figura 4.7.
Operador de endereo &:
A memria do computador dividida em bytes, e so numerados de 0 at o limite
da memria. Estas posies so chamadas de endereos. Toda varivel ocupa uma certa
localizao na memria, e seu endereo o primeiro byte ocupado por ela.

36

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
int num;
printf("Digite um nmero: ");
scanf("%d",&num);
printf("\no nmero %d",num);
printf("\no endereo e %u",&num);
}
Figura 4.7: Exemplo de programa que utiliza a funo scanf

4.3

FUNO GETCHAR()

a funo original de entrada de caractere dos sistemas baseados em UNIX. A funo


getchar() armazena a entrada at que a tecla ENTER seja pressionada. Veja um exemplo
na Figura 4.8.
#include <stdio.h>
main( )
{
char ch;
ch = getchar();
printf("%c \n",ch);
}
Figura 4.8: Exemplo de programa que utiliza a funo getchar

4.4

FUNO PUTCHAR()

Essa funo escreve na tela o argumento de seu caractere na posio corrente. Veja
um exemplo na Figura 4.9.
H inmeras outras funes de manipulao de char complementares s que foram
vistas, como isalpha(), isupper(), islower(), isdigit(), isspace(), toupper(), tolower().

Funes Bsicas da Biblioteca C

# include <stdio.h>
main( )
{
char ch;
printf("digite uma letra minscula : ");
ch = getchar( );
putchar(toupper(ch));
putchar(\n);
}
Figura 4.9: Exemplo de programa que utiliza a funo putchar

37

38

EDITORA - UFLA/FAEPE - Introduo Linguagem C

5
ESTRUTURAS DE CONTROLE DE FLUXO

Os comandos de controle de fluxo so a essncia de qualquer linguagem, porque


governam o fluxo da execuo do programa. So poderosos e ajudam a explicar a popularidade da linguagem. Podemos dividir em trs categorias. A primeira consiste em instrues
condicionais if e switch. A segunda so os comandos de controle de loop, o while, o for e
o do-while. A terceira contm instrues de desvio incondicional goto.

5.1

IF
Sintaxe:
if (condio) comando;
else comando;

Se a condio avaliar em verdadeiro (qualquer valor diferente de 0), o computador


executar o comando ou o bloco, de outro modo, se a clusula 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 nmeros:");
scanf("%d%d",&a,&b);
if (b) printf("%d\n",a/b);
else printf("diviso por zero\n");
}
Figura 5.1: Exemplo de programa que utiliza o comando de deciso if

40

EDITORA - UFLA/FAEPE - Introduo Linguagem C

No exemplo da Figura 5.1, so pedidos dois nmeros inteiros, a e b, e depois ser


impresso o valor a/b somente se b for diferente de zero. Se b for igual a zero, ser indicada
condio falsa para o comando if, e ser executado o comando alternativo (else), sendo
impressa a mensagem de erro.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main( )
{
int num,segredo;
srand(time(NULL));
segredo = rand( )/100;
printf("Qual e o numero: ");
scanf("%d",&num);
if (segredo == num)
{
printf("Acertou!");
printf("\nO numero e %d\n", segredo);
}
else printf ("Errou, tente outra vez! \n");
}
Figura 5.2: O comando de deciso if com um bloco de instrues

Na Figura 5.1, havia apenas uma instruo a ser executada aps a verificao do
comando if, portanto, no era necessrio utilizar-se chaves. Na Figura 5.2, havia um bloco
de dois comandos a serem executados aps o if, portanto, este conjunto de instrues deve
ser escrito dentro de um bloco que inicia com abre-chaves e finaliza com fecha-chaves.

5.2

IF-ELSE-IF
Sintaxe:
if (condio) comando;
else if (condio) comando;

Uma varivel testada sucessivamente contra uma lista de variveis inteiras ou de


caracteres. Depois de encontrar uma coincidncia, o comando ou o bloco de comandos
executado.

Estruturas de Controle de Fluxo

41

Em uma estrutura if-else-if so colocadas vrias opes que sero testadas uma de
cada vez, comeando pela 1 e continuando a testar at que seja encontrada uma expresso
cujo resultado seja diferente de zero. Neste caso o programa executa a declarao correspondente. S uma declarao ser executada, ou seja, s ser executada a declarao
equivalente primeira condio que for diferente de zero. A ltima declarao (default) a
que ser executada no caso de todas as condies serem falsas e opcional.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main( )
{
int num,segredo;
srand(time(NULL));
segredo = rand( )/100;
printf("Qual e o numero: ");
scanf("%d", &num);
if (segredo == num)
{
printf("Acertou!");
printf("\nO numero e %d\n", segredo);
}
else if (segredo < num) printf ("Errado, muito alto!\n");
else printf ("Errado, muito baixo!\n");
}
Figura 5.3: Exemplo de um programa que utiliza o comando if-else-if

5.3

OPERADOR TERNRIO
Sintaxe: condio ?

expresso1 :

expresso2

uma maneira compacta de expressar if-else. A operao ? funciona da seguinte


forma: a condio testada, se for verdadeira ser calculada a expresso1, se for falsa,
calcula-se a expresso2.
No exemplo apresentado na Figura 5.4, a varivel max ter o valor de x se x for maior
que y, caso contrrio, max assumir o valor de y.

42

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
int x, y, max;
printf("Entre com dois nmeros: ");
scanf("%d, %d", &x, &y);
max = (x>y) ? x : y;
printf("max = %d\n", max);
}
Figura 5.4: Exemplo de programa que utiliza o operador ternrio

5.4

SWITCH
Sintaxe:
switch(varivel){
case constante1:
seqncia de comandos;
break;
case constante2:
seqncia de comandos;
break;
default:
seqncia de comandos;
}

Uma varivel testada sucessivamente contra uma lista de variveis inteiras ou de


caracteres. Depois de encontrar uma coincidncia, o comando ou o bloco de comandos
executado.
Se nenhuma coincidncia for encontrada o comando default ser executado. O default opcional. A seqncia de comandos executada at que o comando break seja
encontrado. A Figura 5.5 apresenta um exemplo de uso do switch.

5.5

LOOP FOR
Sintaxe: for (inicializao; condio; incremento) comando;

O comando for de alguma maneira encontrado em todas linguagens procedurais


de programao. Este comando normalmente utilizado para executar repetidamente um

Estruturas de Controle de Fluxo

43

#include <stdio.h>
main ( )
{
char x;
printf("1. Incluso \n");
printf("2. Alterao \n");
printf("3. Excluso \n");
printf(" Digite sua opo: ");
x = getchar( );
switch(x) {
case 1:
printf("escolheu incluso\n");
break;
case 2:
printf("escolheu alterao\n");
break;
case 3:
printf("escolheu excluso\n");
break;
default:
printf("opo invlida\n");
}
}
Figura 5.5: Exemplo de programa que utiliza o comando switch

conjunto de comandos por um nmero pr determinado de vezes. As Figuras 5.6 e 5.7


apresentam dois exemplos simples de utilizao do comando de repetio for.
O for o primeiro de uma srie de trs comandos para se trabalhar com loops (laos
de repetio). Os outros so o while e o do-while. Os trs compem a segunda famlia
de comandos de controle de fluxo. Podemos pensar nesta famlia como sendo a dos
comandos de repetio controlada.
Em sua forma mais simples, a incializao um comando de atribuio que o compilador usa para estabelecer a varivel de controle do loop. A condio uma expresso de
relao que testa a varivel de controle do loop contra algum valor para determinar quando
o loop terminar. O incremento define a maneira como a varivel de controle do loop ser
alterada cada vez que o computador repetir a seqncia de comandos.
O comando for executa a inicializao incondicionalmente e testa a condio. Se
a condio for falsa ele no faz mais nada. Se a condio for verdadeira ele executa a

44

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
int x;
for(x=1; x<100; x++) printf("%d\n",x);
}
Figura 5.6: Exemplo de for com apenas um comando
#include <stdio.h>
main()
{
int x, xq;
printf ("\n\t
Numero
for(x=1; x<100; x++)
{
xq = x*x;
printf("\t %d
}
}

Quadrado \n\n");

%d \n", x, xq);

Figura 5.7: Exemplo de for com um bloco de instrues

instruo (no primeiro exemplo printf) ou um bloco de instrues, faz o incremento e volta
a testar a condio. Ele fica repetindo estas operaes at que a condio seja falsa.
O primeiro exemplo mostra um loop for que executa apenas um comando, e o segundo exemplo executa um bloco com dois comandos, tendo, portanto, que ser escrito
entre chaves.
Uma aplicao muito utilizada para laos de repetio para o clculo de sries numricas. Por exemplo, o nmero pode ser calculado utilizando-se a srie abaixo.




 

 



Esta srie calculada para os N primeiros inteiros, sendo N um nmero determinado


pelo usurio. Quanto maior N, melhor a preciso obtida. Depois de calcular o valor de S,
calcula-se :





Estruturas de Controle de Fluxo

O programa da Figura 5.8 apresenta uma forma de se calcular o valor de


nmero N de termos1 .

45

para um

#include <stdio.h>
#include <math.h>
main( )
{
int N, n, sinal;
float S, x;
printf(" \n Envie o numero de termos ");
scanf(" %d ",&N);
S = 1;
x = 1;
sinal = 1;
for (n = 1; n < N; n++)
{
x +=2;
sinal = sinal;
S = S + (float)sinal/(x*x*x);
}
S = exp((1./3)*log(32*S));
printf("\n\n O valor de PI eh %f, para os %d", S, N);
printf("primeiros termos \n");
}
Figura 5.8: Programa para calcular o valor de

No exemplo apresentado na Figura 5.8, as funes exp() e log() fazem parte da bi
blioteca math.h e so utilizadas para se calcular uma exponencial . Neste caso b = 32*S
e e = 1./3. Observe que necessrio colocar-se o ponto depois de 1, na frao, para que
o resultado seja um nmero em ponto flutuante, caso contrrio ser calculado o quociente
inteiro de 1/3 que resulta no valor zero.
A linguagem C permite que se utilize mais de uma varivel no controle do lao de
repetio for. permitido tambm omitir-se qualquer um dos elementos do for, isto , se
no quisermos uma inicializao, por exemplo, poderemos omiti-la. Vejamos os exemplos
das Figuras 5.9 e 5.10.
1

Verses recentes do GCC requerem que o parmetro -lm seja passado quando o programa utiliza a
biblioteca math.h: gcc -lm pi.c -o pi

46

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
int x,y;
for (x = 0, y = 0; x+y<100; ++x,++y) printf("%d ", x+y);
}
Figura 5.9: Lao de for com duas variveis de controle

Um uso interessante para o for o loop infinito, como nenhuma das trs definies
so obrigatrias, podemos deixar a condio em aberto, como visto na Figura 5.10. Outra
forma usual do for o for aninhado, ou seja, um for dentro de outro, como visto nas
Figuras 5.11 e 5.12.
#include <stdio.h>
main( )
{
for ( ; ; ) printf ("loop infinito\n");
}
Figura 5.10: Loop infinito

#include <stdio.h>
main( )
{
int linha,coluna;
for(linha=1; linha<=24; linha++)
{
for(coluna=1; coluna<40; coluna++)
putchar(\n);
}
}

printf("-");

Figura 5.11: Laos de for aninhados

Estruturas de Controle de Fluxo

47

#include<stdio.h>
main( )
{
int i, j, k, temp;
printf("\t i
i^2
i^3
i^4 \n");
for ( i=1;i<10; i++) /* lao externo: define o numero base */
{
for ( j=1; j<5; j++)
/* primeiro nvel do aninhamento */
{
temp = 1;
for ( k=0; k<j; k++) /* lao mais interno: eleva a j */
{
temp = temp*i;
}
printf("%9d",temp);
}
printf("\n");
}
}
Figura 5.12: Programa que exibe uma tabela das quatro primeiras potncias dos nmeros de 1 a 9

5.6

WHILE
Sintaxe: while(condio) comando;

Uma maneira possvel de executar um lao utilizando o comando while. Ele permite
que o cdigo fique sendo executado numa mesma parte do programa de acordo com uma
determinada condio.
o comando pode ser vazio, simples ou bloco
ele executado desde que a condio seja verdadeira
testa a condio antes de executar o lao

As Figuras 5.13 e 5.14 apresentam exemplos de utilizao do lao de repetio while.

48

EDITORA - UFLA/FAEPE - Introduo Linguagem C

# include <stdio.h>
main( )
{
char ch;
while (ch != a) ch = getchar( );
}
Figura 5.13: Exemplo simples de while
#include <stdio.h>
main( )
{
int x, xq;
printf ("\n\t
Numero
x = 1;
while (x < 100)
{
xq = x*x;
printf("\t %d
x++;
}
}

Quadrado \n\n");

%d \n", x, xq);

Figura 5.14: Gerao de uma tabela de quadrados de inteiros utilizando while

5.7

DO-WHILE
Sintaxe:
do
{comando; }
while(condio);

Tambm executa comandos repetitivos, mas neste caso, a condio s ser testada
depois que o conjunto de instrues tiver sido executado pelo menos uma vez. As Figuras 5.15 e 5.16 apresentam exemplos de utilizao do lao do-while.
A principal diferena entre os comandos while e do-while que no segundo o conjunto de instrues do bloco dever ser executado pelo menos uma vez, obrigatoriamente,
enquanto no primeiro (while) pode acontecer do bloco de instrues no ser executado
nenhuma vez.

Estruturas de Controle de Fluxo

#include <stdio.h>
main( )
{
int x, xq;
printf ("\n\t
Numero
x = 1;
do {
xq = x*x;
printf("\t %d
x++;
}
while (x <100);
}

49

Quadrado \n\n");

%d \n", x, xq);

Figura 5.15: Gerao de uma tabela de quadrados de inteiros utilizando do-while

5.8

BREAK

Quando o comando break encontrado em qualquer lugar do corpo do for, ele causa
seu trmino imediato. O controle do programa passar ento imediatamente para o cdigo
que segue o loop. Veja o exemplo da Figura 5.17.

5.9

CONTINUE

Algumas vezes torna-se necessrio saltar uma parte do programa, para isso utilizamos o continue. O comando continue fora a prxima iterao do loop pula o cdigo
que estiver em seguida. Um exemplo apresentado na Figura 5.18.

50

EDITORA - UFLA/FAEPE - Introduo Linguagem C

# include <stdio.h>
main( )
{
char ch;
printf("1. incluso\n");
printf("2. alterao\n");
printf("3. excluso\n");
printf("4. sair\n");
printf(" Digite sua opo:");
do {
ch=getchar();
switch(ch)
{
case 1: printf("escolheu inclusao\n"); break;
case 2: printf("escolheu alteracao\n"); break;
case 3: printf("escolheu exclusao\n"); break;
case 4: printf("sair\n");
}
}
while(ch != 1 && ch != 2 && ch != 3 && ch != 4);
}
Figura 5.16: Exemplo de utilizao do lao do-while

main( )
{
char ch;
for( ; ; )
{
ch = getchar( );
if (ch == a) break;
}
}
Figura 5.17: Exemplo simples de utilizao do comando break

Estruturas de Controle de Fluxo

# include <stdio.h>
main( )
{
int x;
for(x = 0; x<100; x++)
{
if (x%2) continue;
printf ("%d\n", x);
}
}
Figura 5.18: Exemplo de utilizao do comando continue

51

52

EDITORA - UFLA/FAEPE - Introduo Linguagem C

6
MATRIZES

A matriz um tipo de dado usado para representar uma certa quantidade de variveis
que so referenciadas pelo mesmo nome. Consiste em locaes contguas de memria. O
endereo mais baixo corresponde ao primeiro elemento. A matriz um conjunto ordenado
de dados que possuem o mesmo tipo.

6.1

MATRIZ UNIDIMENSIONAL
Sintaxe: tipo nome[tamanho];

As matrizes tm 0 como ndice do primeiro elemento, portanto sendo declarada uma


matriz de inteiros de 10 elementos, o ndice varia de 0 a 9.
Quando o compilador C encontra uma declarao de matriz ele reserva um espao
na memria do computador suficientemente grande para armazenar o nmero de clulas
especificadas em tamanho. Por exemplo, se declararmos:
float exemplo[20];


 
o C ir reservar


bytes. Estes bytes so reservados de maneira contgua. Neste
exemplo, os dados sero indexados de 0 a 19. Para acess-los escrevemos:
exemplo[0]
exemplo[1]
.
.
exemplo[19]

Mas ningum o impede de escrever:


exemplo[30]
exemplo[103]

54

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Por qu? Porque o C no verifica se o ndice que voc usou est dentro dos limites
vlidos. Este um cuidado que o programador deve tomar. Se o programador no tiver
ateno com os limites de validade para os ndices ele corre o risco de ter dados sobrescritos ou de ver o computador travar. Vrios erros srios (bugs) terrveis podem surgir. As
Figuras 6.1, 6.2 e 6.3 apresentam programas que utilizam matrizes unidimensionais.
#include <stdio.h>
main( )
{
int x[10];
int t;
for(t=0;t<10;t++)
{
x[t] = t*2;
printf ("%d\n", x[t]);
}
}
Figura 6.1: Exemplo simples de utilizao de matriz

6.2

MATRIZ MULTIDIMENSIONAL
Sintaxe: tipo nome[tamanho][tamanho] ...;

A matriz multidimensional funciona como a matriz de uma dimenso (vetor), mas tem
mais de um ndice. As dimenses so declaradas em seqncia entre colchetes. Veja um
exemplo na Figura 6.4.

6.3

MATRIZES ESTTICAS

Os vetores de dados podem ser inicializados como os dados de tipos simples, mas
somente como variveis globais. Quando for inicializar uma matriz local sua classe deve
ser static. Veja um exemplo na Figura 6.5.

6.4

LIMITES DAS MATRIZES

A verificao de limites no feita pela linguagem, nem mensagem de erros so


enviadas, o programa tem que testar os limites das matrizes. Na Figura 6.6 apresentado

Matrizes

55

#include <stdio.h>
main ( )
{
int num[100];
int count=0;
int totalnums;
do
{
printf ("\nEntre com um numero (-999 p/ terminar): ");
scanf ("%d",&num[count]);
count++;
}
while (num[count-1] != -999);
/* verifica quantos nmeros foram digitados */
totalnums = count -1;
/* retira a contagem do nmero 999 */
printf ("\n\n\n\t Os nmeros que voc digitou foram:\n\n");
for (count = 0; count < totalnums; count++)
printf (" %d", num[count]);
}
Figura 6.2: Exemplo de armazenamento de dados em matriz unidimensional
#include <stdio.h>
main( )
{
int notas[5], i, soma;
for (i = 0; i<5; i++)
{
printf("Digite a nota do aluno %d: ", i );
scanf("%d", &notas[i] );
}
soma = 0;
for( i = 0; i<5; i++) soma = soma + notas[i];
printf("Media das notas: %d.", soma/5);
}
Figura 6.3: Operaes com matriz

56

EDITORA - UFLA/FAEPE - Introduo Linguagem C

# include <stdio.h>
main ( )
{
int x[10][10];
int t, p=0;
for( t = 0; t<10; t++,p++)
{
x[t][p] = t*p;
printf("%d\n", x[t][p] );
}
}
Figura 6.4: Exemplo simples de utilizao de matriz multidimensional
#include <stdio.h>
main( )
{
int i;
static int x[10] ={0,1,2,3,4,5,6,7,8,9};
for(i=0; i<10; i++) printf("%d\n", x[i] );
}
Figura 6.5: Exemplo de utilizao de matriz esttica

um programa que causar problemas ao computador durante sua execuo porque o ndice
da matriz erro, dentro do lao de for, exceder o tamanho da matriz (que 10).
# include <stdio.h>
main( )
{
int erro[10], i;
for( i = 0; i<100; i++)
{
erro[i]=1;
printf (" %d\n ", erro[i] );
}
}
Figura 6.6: Erro na utilizao de matriz

7
MANIPULAO DE STRINGS

Em C no existe um tipo de dado string, no seu lugar utilizado uma matriz de


caracteres. Uma string uma matriz tipo char que termina com \0. Por essa razo uma
string deve conter uma posio a mais do que o nmero de caracteres que se deseja. O
caractere \0 tem o cdigo numrico 00, portanto pode-se verificar o final de uma string
procurando o valor numrico zero armazenado na matriz de caracteres. Constantes strings
so uma lista de caracteres que aparecem entre aspas, no sendo necessrio colocar o \0,
que colocado pelo compilador. A Figura 7.1 mostra um programa simples para operao
com strings.

#include <stdio.h>
#include <string.h>
main( )
{
static char re[] = "lagarto";
// um vetor de caracteres de 8 posies
puts(re);
puts(&re[0]);
// uma varivel do tipo matriz (ou vetor ) referenciada
putchar(\n);
// como o endereo de sua primeira posio.
}
Figura 7.1: Exemplo simples de operao com strings

7.1

FUNO GETS()
Sintaxe: gets(nome_matriz);

58

EDITORA - UFLA/FAEPE - Introduo Linguagem C

utilizada para leitura de uma string atravs do dispositivo padro, at que a tecla
<ENTER> seja pressionada. A funo gets() no testa limites na matriz em que chamada.
A Figura 7.2 apresenta um programa simples que utiliza a funo gets.
# include <stdio.h>
main()
{
char str[80];
gets(str);
printf("%s",str);
}
Figura 7.2: Programa simples que utiliza a funo gets

7.2

FUNO PUTS()
Sintaxe: puts(nome_do_vetor_de_caracteres);

Escreve o seu argumento no dispositivo padro de sada (vdeo), coloca um \n no final. Reconhece os cdigos de barra invertida. A Figura 7.3 apresenta um programa simples
que utiliza a funo puts.
# include <stdio.h>
# include <string.h>
main()
{
puts("mensagem");
}
Figura 7.3: Exemplo simples de utilizao da funo puts

7.3

FUNO STRCPY()
Sintaxe: strcpy(destino, origem);

Esta funo faz parte da biblioteca string.h. A funo strcpy() copia o contedo de
uma string para uma varivel tipo string (um vetor de char). No programa da Figura 7.4, a
string alo ser copiada para a varivel (matriz de caracteres) str.

Manipulao de Strings

59

# include <stdio.h>
# include <string.h>
main()
{
char str[20];
strcpy(str,"alo");
puts(str);
}
Figura 7.4: Utilizao da funo strcpy da biblioteca string.h

7.4

FUNO STRCAT()
Sintaxe: strcat(string1, string2);
Concatena duas strings. No verifica tamanho. Um exemplo visto na Figura 7.5.
#include <string.h>
#include <stdio.h>
main()
{
char um[20], dois[10];
strcpy (um, "bom");
strcpy (dois," dia");
strcat (um, dois);
printf ("%s\n", um);
}

// une a string dois string um

Figura 7.5: Utilizao da funo strcat da biblioteca string.h

7.5

FUNO STRCMP()

Sintaxe: strcmp(s1, s2);


Essa funo compara duas strings, se forem iguais devolve 0. A Figura 7.6 mostra um
exemplo da funo strcmp().

60

EDITORA - UFLA/FAEPE - Introduo Linguagem C

main( )
{
char s[80];
printf("Digite a senha:");
gets(s);
if (strcmp(s,"laranja")) printf("senha invlida\n");
else printf("senha ok!\n") ;
}
Figura 7.6: Utilizao da funo strcmp da biblioteca string.h

8
PONTEIROS

Sintaxe: tipo *nomevar;


Para ser um bom programador em linguagem C fundamental que se tenha um bom
domnio de ponteiros. Por isto, o leitor deve acompanhar com ateno esta parte do curso
que trata deles. Ponteiros so to importantes na linguagem C que voc j os viu e nem
percebeu, quando falamos da funo scanf. Em scanf("%d", &num); o operador & indica
o endereo de memria onde o compilador alocou a varivel num ao ler a sua declarao
no incio 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 so
muito difceis de encontrar.
Ponteiro uma varivel que contm o endereo de outra varivel. Os ponteiros so
utilizados para alocao dinmica, podendo substituir matrizes com mais eficincia. Tambm fornecem a maneira pelas quais funes podem modificar os argumentos chamados,
como veremos no captulo de funes.

8.1

DECLARANDO PONTEIROS
Para declarar um ponteiro temos a seguinte forma geral:
tipo_do_ponteiro *nome_da_varivel;

o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um
valor mas sim um endereo para aquele tipo especificado. A Figura 8.1 mostra exemplos
de declaraes.
int *pt;
char *temp, *pt2;
Figura 8.1: Exemplos de declaraes de ponteiros

62

EDITORA - UFLA/FAEPE - Introduo Linguagem C

O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois


ponteiros para caracteres. Eles ainda no foram inicializados (como toda varivel do C
que apenas declarada). Isto significa que eles apontam para um lugar indefinido. Este
lugar pode estar, por exemplo, na poro da memria reservada ao sistema operacional do
computador. Usar o ponteiro nestas circunstncias 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 importncia!
Para atribuir um valor a um ponteiro recm-criado poderamos igual-lo a um valor de
memria. Mas, como saber a posio na memria de uma varivel do nosso programa?
Seria muito difcil saber o endereo de cada varivel que usamos, mesmo porque estes
endereos so determinados pelo compilador na hora da compilao e relocados na execuo. Podemos ento deixar que o compilador faa este trabalho por ns. Para saber o
endereo de uma varivel basta usar o operador &. Veja o exemplo da Figura 8.2.

int count;
int *pt;
pt = &count;
Figura 8.2: Atribuio de valor a um ponteiro

Declaramos a varivel count como sendo do tipo inteiro e um declaramos um ponteiro para um inteiro, pt. A expresso &count nos d o endereo de count, o qual armazenamos em pt. O valor de count no alterado quando se inicializa o valor de pt.
Como ns colocamos um endereo 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 expresso *pt equivalente ao prprio count. Aps a inicializao da varivel
ponteiro com o endereo da varivel inteira, esta varivel pode ser referenciada pelo seu
nome ou pelo ponteiro que contm seu endereo. Isto significa que, se quisermos atribuir
um valor para count podemos fazer de duas formas:
count = 5;
ou
*pt = 5;
As duas formas so equivalentes e tm o mesmo resultado. Qualquer modificao
feita utilizando-se *pt, causar uma modificao na varivel count.

Ponteiros

8.2

63

MANIPULAO DE PONTEIROS

Desde que os ponteiros so variveis, eles podem ser manipulados tal como as variveis. Se py e px so ponteiros para inteiros, ento podemos fazer a declarao:
py = px;
A Figura 8.3 apresenta um programa que exemplifica a utilizao de ponteiros para
acessar um varivel x.
#include <stdio.h>
main( )
{
int x,*px,*py;
x = 9;
px = &x;
py = px;
printf("x= %d\n",x);
// imprime o valor de x
printf("&x= %d\n",&x);
// endereo da varivel x, que
printf("px= %d\n",px);
// valor de px, que o endereo
printf("*px= %d\n",*px);
// contedo da varivel apontada
printf("*py= %d\n",*py);
// imprime valor de x, pois py =
}

igual ao contedo de px
de x
por px, isto , valor de x
px

Figura 8.3: Utilizao de ponteiros

8.3

EXPRESSES COM PONTEIROS

Os ponteiros podem aparecer em expresses, se px aponta para um inteiro x, ento


*px pode ser utilizado em qualquer lugar que x o seria.
O operador * tem maior precedncia que as operaes aritmticas, assim a expresso
abaixo pega o contedo do endereo que px aponta e soma 1.
y = *px+1; // y uma varivel do tipo de x

64

EDITORA - UFLA/FAEPE - Introduo Linguagem C

No prximo caso somente o ponteiro ser incrementado e o contedo da prxima


posio da memria ser atribudo a y.
y = *(px+1); // y um ponteiro do tipo de px
Os incrementos e decrementos dos endereos podem ser realizados com os operadores ++ e --, que possuem precedncia sobre o * e operaes matemticas e so avaliados
da direita para a esquerda:
*px++;
*(px--);

/* sobe uma posio na memria*/


/* mesma coisa de *px-- */

No exemplo da Figura 8.4, os parnteses so necessrios, pois sem eles px seria


incrementado em vez do contedo que apontado, porque os operadores * e ++ so avaliados da direita para esquerda.
(*px)++ /* equivale a x=x+1; ou *px+=1 */

8.4

PONTEIROS PARA PONTEIROS

Um ponteiro para um ponteiro uma forma de indicao mltipla. Num ponteiro normal, seu valor o endereo da varivel desejada. Quando se trata de ponteiros para ponteiros, o primeiro ponteiro contm o endereo do segundo, que aponta para a varivel desejada. A Figura 8.5 apresenta um programa exemplo.
float **balano; // balano um ponteiro para um ponteiro float.

8.5

PROBLEMAS COM PONTEIROS

O erro chamado de ponteiro perdido um dos mais difceis de se encontrar, pois a


cada vez que a operao com o ponteiro utilizada, poder estar sendo lido ou gravado
em posies desconhecidas da memria. Isso pode acarretar sobreposies em reas de
dados ou mesmo rea do programa na memria.
No trecho de programa da Figura 8.6, o ponteiro p no foi inicializado, no recebeu nenhum endereo, portanto o valor 10 foi colocado em uma posio aleatria e desconhecida
de memria. A conseqncia desta atribuio imprevisvel.

Ponteiros

65

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

66

EDITORA - UFLA/FAEPE - Introduo Linguagem C

9
PONTEIROS E MATRIZES

Em C existe um grande relacionamento entre ponteiros e matrizes, sendo que eles


podem ser tratados da mesma maneira. As verses com ponteiros geralmente so mais
rpidas.
Quando uma matriz declarada da seguinte forma:
tipo_da_varivel nome_da_varivel [tam1][tam2] ...

[tamN];

o compilador C calcula o tamanho, em bytes, necessrio para armazenar esta matriz.


Este tamanho :
tam1 x tam2 x tam3 x ...

x tamN x tamanho_do_tipo

O compilador ento aloca este nmero de bytes em um espao livre de memria. O


nome da varivel que voc declarou na verdade um ponteiro para o tipo da varivel da
matriz. Este conceito fundamental. Eis porque: tendo alocado na memria o espao
para a matriz, ele toma o nome da varivel (que um ponteiro) e aponta para o primeiro
elemento da matriz.
Mas a surge a pergunta: ento como que podemos usar a seguinte notao?
nome_da_varivel[ndice]
Isto pode ser facilmente explicado desde que voc entenda que a notao acima
absolutamente equivalente a se fazer:
*(nome_da_varivel+ndice)
preciso lembrar que a memria de um computador no tem arranjos multidimensionais, isto , ela pode ser descrita como uma extensa lista de posies de memria enfileiradas, cada uma com um endereo especfico. Portanto, quando for declarada uma matriz
de dimenso mltipla, o compilador colocar no programa executvel uma rotina para o clculo da posio de memria correspondente aos elementos da matriz referenciados pelos
mltiplos ndices.

68

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Em C, a indexao de uma matriz comea com o valor zero. porque, ao pegarmos


o valor do primeiro elemento de uma matriz, queremos, de fato, *nome_da_matriz e ento
devemos ter um ndice igual a zero, resultando (*nome_da_matriz+0). Ento sabemos que:
*nome_da_matriz equivalente a nome_da_matriz[0]

9.1

MANIPULANDO MATRIZES ATRAVS DE PONTEIROS

Considerando a declarao da matriz int a[10]; Sendo pa um ponteiro para inteiro


ento:
pa = &a[0];
/*passa o endereo inicial do vetor a para o ponteiro pa */
pa = a;
/* a mesma coisa de pa=&a[0];*/
x = *pa;
/*passa o contedo de a[0] para x */

Se pa aponta para um elemento particular de um vetor a, ento por definio pa+1


aponta para o prximo elemento, e em geral pa-i aponta para i elementos antes de pa e
pa+i para i elementos depois.
Se pa aponta para a[0] ento: *(pa+1) aponta para a[1]; pa+i o endereo de a[i] e
*(pa+i) o contedo.
possvel fazer cpia de caracteres utilizando matrizes e ponteiros, conforme mostrado no programa da Figura 9.1.
# include <stdio.h>
main( )
{
int i = 0;
char t[10];
static char s[ ] = "abobora";
while (t[i] = s[i]) i++;
printf("%s\n",t);
}
Figura 9.1: Cpia de uma string (verso matriz)

No lao while, feita a cpia de cada elemento de s para cada posio de t e


incrementado o ndice i at que o caractere \0 finalizador de string, ou seja o valor 00
(NULL), seja encontrado em s.

Ponteiros e Matrizes

69

O mesmo exemplo pode ser resolvido utilizando-se ponteiros, conforme mostrado na


Figura 9.2.
# include <stdio.h>
main( )
{
char *ps,*pt, t[10], s[10];
strcpy (s,"abobora");
ps = s;
pt = &t[0];
while(*ps) *pt++ = *ps++;
printf("%s", t );
}
Figura 9.2: Cpia de uma string (verso ponteiro)

9.2

STRING E PONTEIROS

Sendo um ponteiro para caractere char *texto, podemos atribuir uma constante string
para texto, que no uma cpia de caracteres, somente ponteiros so envolvidos. Neste
caso a string armazenada como parte da funo em que aparecem, ou seja, como constante. Um exemplo visto na Figura 9.3.
char *texto = "composto";
/* funciona como static char texto[ ] = "composto"; */

#include <stdio.h>
main( )
{
char *al = "conjunto";
char re[ ] = "simples";
puts (al);
puts (&re[0]);
/* ou puts(re); */
for( ; al; al++) putchar(*al);
putchar(\n);
}
Figura 9.3: Uso de um ponteiro no lugar de uma string

70

9.3

EDITORA - UFLA/FAEPE - Introduo Linguagem C

MATRIZES DE PONTEIROS
A declarao de matrizes de ponteiros semelhante a qualquer outro tipo de matrizes:
int *x[10];

Para atribuir o endereo de uma varivel inteira chamada var ao terceiro elemento da
matriz de ponteiros pode-se fazer um comando de atribuio simples:
x[2] = &var;
Neste caso, a matriz x contm ponteiros para variveis inteiras, e o endereo da varivel var foi armazenado na posio 2 da matriz de ponteiros (x). Para verificar o contedo
de var pode-se utilizar o ponteiro armazenado em x:
*x[2];
As matrizes de ponteiros so tradicionalmente utilizadas para mensagens de erro, que
so constantes :
char *erro[ ] = {"arquivo no encontrado\n","erro de leitura\n"};
printf("%s", erro[0]);
printf("%s", erro[1]);

Um exemplo mostrado na Figura 9.4.


#include <stdio.h>
main( )
{
char *erro[2];
erro[0] = "arquivo nao encontrado\n";
erro[1] = "erro da leitura\n";
for( ;*erro[0]; ) printf("%c", *erro[0]++);
}
Figura 9.4: Utilizao de matrizes de ponteiros para mensagens de erro

10
FUNES

Uma funo uma unidade autnoma de cdigo do programa e projetada para cumprir uma tarefa particular. Geralmente os programas em C consistem em vrias pequenas
funes. A declarao do tipo da funo obrigatria no GCC. Os parmetros de recepo
de valores devem ser separados por vrgulas.
Sintaxe: tipo nome(parmetros){ comandos}
Uma funo pode retornar apenas um valor para o programa que a chamou, e este
valor deve ser do tipo especificado no cabealho da funo, o tipo da funo. O nome
da funo dever sempre iniciar com uma letra, e normalmente escrito em minsculas. s
vezes, os programadores iniciantes usam nomes com letras maisculas para no correrem
o risco de usar nome igual ao de alguma funo j definida em alguma biblioteca existente
no compilador que est sendo usado. Por exemplo, pode-se definir uma funo com o nome
Printf, escrita com P maisculo, para diferenciar da funo printf da biblioteca stdio.h. Os
parmetros so valores de variveis que sero passados pelo programa para a funo.
Alm da varivel de retorno nenhum outro valor pode ser retornado pela funo para o
programa que a chamou.

10.1

FUNO SEM RETORNO

Quando uma funo no retorna um valor para a funo que a chamou ela declarada
como void. No exemplo da Figura 10.1 a funo inverso escreve a string vet em ordem
reversa (do ltimo para o primeiro caracter).
Quando o cdigo da funo escrito aps a linha de comando que a chamar pela
primeira vez, deve-se escrever uma linha de anncio da existncia desta funo, antes do
incio da funo main. Este anncio de funo chamado de prottipo. Na verdade o
prottipo pode ser colocado em outro lugar, desde que seja antes da primeira chamada
funo.
A Figura 10.2 apresenta um outro exemplo de funo sem retorno.

72

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
void inverso(char *s );
main( )
{
char *vet = "abcde";
inverso(vet);
}

/* prottipo de funo */

void inverso(char *s)


/* o parmetro passado um ponteiro */
{
int t = 0;
for( ; *s ; s++) t++;
/* t conta quantos caracteres tem o vetor s */
s--;
for( ; t-- ; ) printf("%c",*s--);
putchar(\n);
}
Figura 10.1: Inverso de uma string usando uma funo que recebe um ponteiro

10.2

FUNO COM RETORNO

Quando o programador quiser que a funo envie um valor para o programa que
a chamou, ele dever declarar um tipo diferente de void para a funo. A Figura 10.3
apresenta um exemplo de programa que utiliza uma funo que recebe dois valores inteiros
(base, expoente) e retorna um inteiro (i) que igual base elevada ao expoente.
Observe que no loop for da funo elevado no foi feita a inicializao da varivel de
controle, mas esta varivel o expoente que j foi passado como parmetro. O loop vai
parar de ser executado quando a varivel expoente atingir o valor zero, que funciona como
o valor lgico falso.
A funo elevado da Figura 10.3 modifica o valor da varivel expoente que lhe foi
passada pela funo main, mas esta modificao no afeta a varivel e da funo main,
pois expoente apenas uma cpia de e, e as variveis de uma funo s existem dentro
desta, no sendo reconhecidas por outra funo.

10.3

PARMETROS FORMAIS

Quando uma funo utiliza argumentos, ento ela deve declarar as variveis que aceitaram os valores dos argumentos, sendo essas variveis os parmetros formais. Veja um

Funes

73

#include<stdio.h>
void code (char *s);
main( )
{
char letras[26];
printf("\n\n Insira uma frase a ser codificada ");
printf("(mximo de 25 caracteres). \n");
scanf("%s", letras);
code( letras );
}
void code( char *s ) /* Codifica as letras */
{
char ch;
do
{
ch = *s++;
printf("%c", ch+1); /* desloca o alfabeto uma posio */
} while(ch);
}
Figura 10.2: Um codificador simples

exemplo na Figura 10.4, onde so declarados os parmetros formais string, um ponteiro


que contm o endereo do incio de uma string, e caractere, uma varivel do tipo char.
A funo pertence neste exemplo vai procurar um certo caractere dentro de uma
string. Se for encontrado, retorna o valor 1, seno, retorna 0.
10.3.1

Chamada por Valor

O valor de um argumento copiado para o parmetro formal da funo, portanto


as alteraes no processamento no alteram as variveis. No exemplo da Figura 10.5, a
varivel x recebe uma cpia da varivel t, e a modificao de seu valor dentro da funo
Sqr no altera o valor da varivel t na funo main.
10.3.2

Chamada por Referncia

Quando se deseja que uma funo modifique valores das variveis do programa que
a chamou, deve-se passar para a funo no a varivel, mas o seu endereo na memria
do computador. Isto feito utilizando-se ponteiros. No exemplo da Figura 10.6 a funo

74

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
int elevado(int base, int expoente );
main( )
{
int b,e;
printf("Digite a base e expoente x, y : ");
scanf("%d,%d", &b, &e);
printf("valor = %d\n", elevado(b,e));
}
int elevado(int base, int expoente)
// so passados dois inteiros como parmetros
{
int i;
if ((expoente<0) || (!base)) return 0;
i =1;
for( ; expoente; expoente--) i = base*i;
return i;
// retorna o inteiro i para a funo main
}
Figura 10.3: Funo com retorno de inteiro
int pertence(char *string, char caracter)
{
while (*string) if (*string == caracter) return 1;
else string++;
return 0;
}
Figura 10.4: Parmetros formais de uma funo

troca troca os valores contidos nas variveis x e y de main, utilizando os ponteiros a e b


que recebem os endereos de x e y respectivamente.

10.4

CLASSES DE VARIVEIS

Uma funo pode chamar outras funes, mas o cdigo que compreende o corpo de
uma funo (bloco entre { }) est escondido do resto do programa, ele no pode afetar nem
ser afetado por outras partes do programa, a no ser que o cdigo use variveis globais.
Existem trs classes bsicas de variveis: locais, estticas e globais.

Funes

75

#include <stdio.h>
int Sqr( int x );
main( )
{
int t =10;
printf("%d eh o quadrado de %d", Sqr(t),t);
}
int Sqr(int x)
{
x = x*x; /* Modificao no valor de x no altera t */
return(x);
}
Figura 10.5: Passagem de valor de uma varivel para uma funo
#include <stdio.h>
void troca (int *a, int *b );
main( )
{
int x=10, y=20;
troca(&x,&y);
printf("x=%d y=%d\n", x, y);
}
void troca (int *a, int *b)
// *a e *b so ponteiros que recebem os endereos de x e y
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
Figura 10.6: Funo que utiliza passagem por referncia

10.4.1

Variveis Locais

As variveis que so declaradas dentro de uma funo so chamadas de locais. Na


realidade todas as variveis declaradas dentro de um bloco { } podem ser referenciadas
apenas dentro deste bloco. Elas existem apenas durante a execuo do bloco de cdigo
no qual esto declaradas. O armazenamento de variveis locais por default feito na pilha,

76

EDITORA - UFLA/FAEPE - Introduo Linguagem C

assim sendo uma regio dinmica. A Figura 10.7 apresenta um exemplo de funo que
utiliza variveis locais.

#include <stdio.h>
void linha (int x);
main( )
{
int tamanho;
printf ("Digite o tamanho: ");
scanf ("%d", &tamanho);
linha (tamanho);
}
void linha(int x)
{
int i;
for( i = 0; i <= x; i++) putchar(95);
/* A varivel i na funo linha
no reconhecida pela funo main.*/
}
Figura 10.7: Variveis locais em uma funo

10.4.2

Variveis Globais

So conhecidas por todo programa e podem ser usadas em qualquer parte do cdigo.
Permanecem com seu valor durante toda execuo do programa. Deve ser declarada fora
de qualquer funo e at mesmo antes da declarao da funo main. Fica numa regio
fixa da memria prpria para esse fim. Um exemplo visto na Figura 10.8.
Sendo a varivel cont declarada fora de qualquer funo do programa, ela ser uma
varivel global, sendo, portanto reconhecida pelos trs blocos de programa (main, func1,
func2). A modificao do valor de cont em func2, resulta na modificao do mesmo cont
em func1. Logo, func1 ir escrever o valor 109 (e no 100) para cont.
10.4.3

Variveis Estticas

Funcionam de forma parecida com as variveis globais, conservando o valor durante


a execuo de diferentes funes do programa. No entanto s so reconhecidas na funo
onde esto declaradas. So muito utilizadas para inicializar vetores, conforme pode ser
visto no programa da Figura 10.9.

Funes

77

# include <stdio.h>
void func1( ), func2( );
int cont;
main( )
{
cont = 100;
func1( );
}
void func1( )
{
int temp;
temp = cont;
func2( );
printf ("temp = %d", temp);
printf ("cont = %d", cont);
}
void func2( )
{
int cont;
for(cont =1; cont<10; cont++) printf(" . ");
}
Figura 10.8: Variveis globais em um programa

#include <stdio.h>
main( )
{
int i;
static int x[10] = {0,1,2,3,4,5,6,7,8,9};
for(i=0; i<10; i++) printf (" %d \n ", x[i]);
}
Figura 10.9: Variveis locais em uma funo

78

EDITORA - UFLA/FAEPE - Introduo Linguagem C

10.5
10.5.1

FUNES COM MATRIZES


Passando Parmetros Formais

Para passar uma matriz para uma funo necessrio passar somente o endereo
e no uma cpia da matriz. Quando vamos passar uma matriz como argumento de uma
funo, podemos declarar a funo de trs maneiras equivalentes. Digamos que temos a
seguinte matriz:
int matrx [50];
e que queiramos pass-la como argumento de uma funo func(). Podemos declarar
func() das trs maneiras seguintes:
void func (int matrx[50]);
void func (int matrx[]);
void func (int *matrx);

Veja que, nos trs casos, teremos dentro de func() um int* chamado matrx. Note que,
no caso de estarmos passando uma matriz para uma funo, teremos de pass-la atravs
de um ponteiro. Isto faz com que possamos alterar o valor desta matriz dentro da funo.
A Figura 10.10 apresenta um exemplo de funo que trabalha com uma matriz.
#include <stdio.h>
void mostra (int num[ ] );
main( )
{
int t[10], i;
for ( i = 0; i < 10; i++) t[i] = i;
mostra(t);
}
void mostra ( int num[ ] )
{
int i;
for( i = 0; i < 10; i++ ) printf ("%d", num[i]);
}
Figura 10.10: Funo que utiliza uma matriz

A funo mostra, da Figura 10.10, poderia ter sido escrita utilizando-se um ponteiro
na passagem de parmetros, conforme se v na Figura 10.11.

Funes

79

void mostra ( int *num )


{
int i;
for( i = 0; i < 10; i++) printf ("%d", *(num+i));
}
Figura 10.11: Funo que opera sobre uma matriz utilizando um ponteiro

A Figura 10.12 apresenta um exemplo de funo que recebe dois ponteiros como
argumentos e retorna um inteiro. Ela retorna o ndice de incio de uma substring dentro de
uma string ou -1, se nenhuma correspondncia for encontrada. Verifique que existem duas
declaraes return, o que perfeitamente possvel em C, visto que a funo terminar
quando passar pela primeira linha contendo return. Sem o uso da segunda declarao
return, uma varivel temporria e cdigo extra precisariam ser usados.

encontra_substr(char *sub, char *str)


{
register int t;
char *p, *p2;
for (t = 0; str[t] ; t++)
{
p = &str[t];
/* pega o ponto de incio de str */
p2 = sub;
while(*p2 && (*p2==*p))
/* enquanto nao for final de sub e for */
{
p++; /* verificado igualdade entre os caracteres */
p2++; /* de sub e str, avana. */
}
if (!*p2) return t;
/* se est no final de sub, foi encontrada a substring */
}
return -1;
}
Figura 10.12: Funo que procura uma substring dentro de uma string

80

EDITORA - UFLA/FAEPE - Introduo Linguagem C

10.5.2

Alterando os Valores da Matriz

Existem vrias formas de se alterar os valores de uma matriz utilizando-se uma funo.
A Figura 10.13 mostra um exemplo de como faz-lo utilizando um ponteiro que aponta para
o primeiro elemento da matriz s.
#include <stdio.h>
void maiusc (char *string );
main( )
{
char s[80];
gets(s);
maiusc(s);
}
void maiusc (char *string)
{
register int t;
for( t = 0; string[t]; t++)
{
string[t] = toupper ( string[t] );
printf ("%c", string[t] );
}
}
Figura 10.13: Alterando valores de uma matriz

11
ARGUMENTOS DA LINHA DE COMANDO

No ambiente C existe uma maneira de passar argumentos atravs da linha de comandos para um programa quando ele inicia. O primeiro argumento (argc) a quantidade de
argumentos que foram passados quando o programa foi chamado; o segundo argumento
(argv) um ponteiro de vetores de caracteres que contm os argumentos, um para cada
string. Por conveno argv[0] o nome do programa que foi chamado, portanto argc
pelo menos igual a 1. Cada argumento da linha de comando deve ser separado por um espao ou tabulao. A Figura 11.1 apresenta um programa simples que utiliza argumentos
na linha de comando.
#include <stdio.h>
int main( int argc, char *argv[ ] )
{
if (argc != 2)
{
printf("falta digitar o nome\n");
exit(0);
}
printf("alo %s", argv[1]);
}
Figura 11.1: Programa que recebe uma string na linha de comando

Este programa, depois de compilado, dever ser chamado na linha de comando como
NomePrograma NomeUsurio. Ento ele escrever na tela do computador a mensagem:
alo NomeUsurio.
O programa da Figura 11.2 deve ser chamado na linha de comando como NomePrograma 3 display, para que seja apresentada na tela a contagem 3, 2, 1, e seja emitido um
sinal sonoro (o correspondente ASCII do nmero 7). Se no for digitado o nmero 3 e a
palavra display, a contagem no ser apresentada.

82

EDITORA - UFLA/FAEPE - Introduo Linguagem C

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

12
TIPOS DE DADOS DEFINIDOS PELO
USURIO

A linguagem C permite ao programador criar seus prprios tipos de dados de cinco


formas diferentes: Estruturas, Campo-bit, Unio, Enumerao e Tipo-definido. A Estrutura
(structure) um agrupamento de variveis sob um mesmo nome, o Campo-bit um tipo
de Estrutura que permite acesso individualizado aos bits de uma varivel, a Unio (union)
permite que duas ou mais variveis de tipos diferentes utilizem a mesma posio de memria alternadamente, a Enumerao (enum) uma lista de smbolos, e o Tipo-definido
seria melhor chamado como Tipo-redefinido, porque utiliza o comando typedef para dar
um outro nome a um tipo de dado j existente.

12.1

ESTRUTURAS

Ao manusearmos dados, muitas vezes nos deparamos com informaes que no so


fceis de armazenar em variveis escalares como so os tipos inteiro e ponto flutuante,
mas na verdade so conjuntos de coisas. Estes tipos de dados so compostos por vrios
tipos bsicos do C.
Uma estrutura uma coleo de variveis referenciadas por um nico nome, provendo
um meio conveniente de manter informaes relacionadas agrupadas. Uma declarao
de estrutura forma um modelo que pode ser usado para criar variveis de estruturas. As
variveis que compreendem a estrutura so chamadas de membros da estrutura ou campos
da estrutura. A palavra reservada struct usada para definir uma estrutura, como indicado
na formulao geral da Figura reffig:estrutura.txt.
O identificador d nome ao novo tipo de varivel estrutura criado, no exemplo,
variveis_estrutura uma lista de variveis do tipo identificador, este item
opcional na declarao 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 agncia bancria.
As variveis estrutura so declaradas de duas formas diferentes, primeiro imediatamente
aps a declarao da estrutura, depois, de forma separada.

84

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct identificador {
tipo nome_de_elemento_1;
tipo nome_de_elemento_2;
...
tipo nome_de_elemento_N;
} variveis_estrutura;
Figura 12.1: Forma geral de declarao de uma estrutura

struct Conta_Banco {
int Num_conta;
unsigned long int CPF;
int Digitos_CPF;
char nome[30];
char Sexo;
float Saldo;
int Data_Abertura [8];
} Gerente, Cliente_padrao[1000], Cliente_especial[100];
struct Conta_Banco {
int Num_conta;
unsigned long int CPF;
int Digitos_CPF;
char nome[30];
char Sexo;
float Saldo;
int Data_Abertura [8];
};
struct Conta_Banco Gerente, Cliente_padrao[1000],
Cliente_especial[100];
Figura 12.2: Declarao de uma estrutura para clientes de um banco

No exemplo da Figura 12.2, a estrutura Conta_Banco possue 7 campos, sendo o


primeiro, um inteiro que armazena o nmero da conta, que podemos dizer que deve ter
no mximo 4 dgitos. O segundo e o terceiro campos so um nmero inteiro que dever
comportar os 9 algarismos do CPF e um inteiro para guardar o par de digitos verificadores
do CPF. Depois utilizada uma string para armazenar o nome e sobrenome do cliente, e

Tipos de Dados Definidos Pelo Usurio

85

um char para idientificar o sexo (M ou F). Um float armazena o saldo do cliente e


um vetor de inteiros indica a data da abertura da conta.
Os membros de uma estrutura podem ser qualquer tipo de dados conhecidos da linguagem C, inclusive ponteiros, ou podem ser outros tipos de dados criados pelo programador, inclusive outras estruturas.
12.1.1

Trabalhando com Estruturas

Aps criar o novo tipo de varivel, no caso uma estrutura, temos que criar algumas
variveis deste tipo, e depois utiliz-las no programa. como criar uma varivel de qualquer
outro tipo, int, char, etc.
Na Figura 12.2 foram mostradas duas formas de criar variveis do tipo estrutura, uma
forma declarar a varivel logo aps a declarao da estrutura e a outra forma declarar a
varivel como outra qualquer na lista declarao de variveis. Vamos utilizar o exemplo da
segunda forma.
Foram criadas trs variveis. A primeira uma varivel simples, Gerente. A segunda
e a terceira so vetores (matrizes unidimensionais) que armazenam vrias variveis do tipo
Conta_Banco. Matrizes de estruturas so muito usadas, para declar-la primeiro define-se
a estrutura e ento declara uma varivel matriz daquele tipo. Para acessar uma estrutura
especfica, o nome da estrutura indexado.
Como acessar os campos individuais dentro de cada varivel estrutura ? Membros
individuais da estrutura so referenciados pelo uso do operador de seleo de membro: o
ponto. A Figura 12.3 apresenta um trecho de cdigo com vrias referncias aos membros
das variveis declaradas na Figura 12.2. A primeira atribui um saldo conta do gerente
(varivel Gerente).
Se duas variveis so do mesmo tipo, pode-se atribuir uma a outra. Neste caso todos
os elementos do lado esquerdo da atribuio recebero os valores dos elementos correspondentes da estrutura do lado direito.

Passando elementos da estrutura para funes


A passagem de elementos de estruturas para funes no tem segredos, feita como
a passagem de qualquer parmetro, podendo ser por valor ou por referncia. A nica coisa
que o programador deve observar que o tipo da varivel que receber o valor na funo
tem que ser o mesmo tipo do parmetro da estrutura que est sendo passado. A Figura 12.4
mostra alguns exemplos de passagens, e um exemplo incorreto.

86

EDITORA - UFLA/FAEPE - Introduo Linguagem C

int main (void) {


int
i, j;
float
recebe;
char
Nome[30]
struct Conta_Banco Gerente, Cliente_padrao[1000],
Cliente_especial[100];
...
Gerente.Saldo = 12947.51;
...
i = 12;
Nome = Cliente_especial[i].Nome;
...
Cliente_especial[10].Sexo = F;
...
for (j = 500; j <510; j++)
printf("\n\n Nome do cliente %d = %s ", j,
Cliente_padro[j].Nome);

...
/* Fim do Programa */
Figura 12.3: Exemplos de acesso a membros de variveis do tipo estrutura

Passsando estruturas inteiras para funes


Quando uma estrutura usada como argumento para uma funo, a estrutura inteira
passada usando o mtodo padro de chamada por valor. Qualquer modificao feita na
varivel estrutura dentro da funo no afetar a varivel usada para chamar a funo.
Quando usar uma estrutura como um parmetro, lembre-se de que o tipo de argumento deve coincidir com o tipo de parmetro. No exemplo da Figura 12.5, tanto a varivel
de chamada, arg, quanto o parmetro que a recebe na funo, param, so do tipo struct
exemplo.

Tipos de Dados Definidos Pelo Usurio

87

struct Conta_Banco {
int Num_conta;
unsigned long int CPF;
int Digtos_CPF;
char nome[30];
char Sexo;
float Saldo;
int Data_Abertura [8];
};
/* funo para atualizar saldo de uma conta cujo nmero est sendo passado
int Atualiza_Saldo( int Numero, float Saldo_Novo) {
procedimentos da funo;
return 0; /* se a funo teve sucesso, retorna zero */
}

*/

/* funo para atualizar Nome de cliente, por exemplo,


de Joao Giacomin para: Joao C. Giacomin
*/
int Atualiza_Nome( char Velho[30], Novo[30]) {
strcpy(Velho,Novo];
return 0;
}
main( ) {
int
float
char
struct

Numero;
Saldo;
Nome[30], Nome_Novo[30];
Conta_Banco Gerente, Cliente_padrao[1000],
Cliente_especial[100];

/*
Inicializar programa e variveis
*/
...
Atualiza_Saldo(Numero, 1893.20); /* passagem por valor */
...
Saldo = 34587.9;
Atualiza_Saldo(Gerente.Num_conta, Saldo); /* passagem por valor */
...
Saldo = 187.09;
Atualiza_Saldo(Cliente_padrao[273].Num_conta, Saldo); /* passagem por valor
...
scanf("%s",Nome_Novo);
Atualiza_Nome(Cliente_especial[12].nome, &Nome_Novo[0]);
/* passagem por referncia */
...
Atualiza_Saldo(Gerente.Sexo, 1893.20) ;
/* Erro - atribuio de um char a um int */
...

*/

Figura 12.4: Exemplos de passagens de elementos de estruturas para funes

Ponteiros para estruturas


A linguagem C permite ponteiros para estruturas da mesma maneira que aceita ponteiros para qualquer outro tipo de varivel.

88

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct exemplo {
int a,b;
char ch;
};

void func_1(struct exemplo); /* prottipo */


int main( ) {
struct exemplo arg;
arg.a=arg.b=1000;
ch=a;
func_1(arg);
return 0;
}
void func_1(struct exemplo parm) {
printf("%d\n%d\n%c",parm.a,parm.b,parm.ch);
}
Figura 12.5: Exemplo de passagem de uma estrutura inteira para uma funo

Para declarar um ponteiro para estrutura coloca-se o operador * na frente do nome da


varivel. Exemplo: struct Conta_Banco *inf_cliente;
Pode-se passar toda a estrutura para uma funo, mas isto se torna invivel enquanto
as estruturas se tornam cada vez maiores. O grande problema quando se trabalha com
estrutruras grandes o tempo gasto para passar todos os parmetros pela pilha, isto passa
a demandar muito tempo de execuo. A soluo para esse problema passar somente
um ponteiro para a funo (Figura 12.6).
Para encontrar o endereo de uma varivel estrutura, o operador & colocado antes
do nome da varivel estrutura.
O operador * raramente utilizado quando trabalhamos com ponteiros para estruturas. Para o acesso a um membro de uma estrutura, existe um operador especial definido
pela linguagem C, o operador seta, que composto pelo sinal negativo seguido pelo sinal de maior: ->. A Figura 12.7 apresenta a utilizao deste operador no exemplo da
Figura 12.6

Tipos de Dados Definidos Pelo Usurio

struct Conta_Banco {
/* a mesma estrutura da figura 12.4
};

89

*/

int main( ) {
struct Conta_Banco Gerente, *p_Conta;
/* declara um ponteiro para uma estrutura Conta_Banco */
p_Conta = &Gerente;
/* coloca o endereo de Gerente no ponteiro

*/

printf(" \n Saldo do Gerente = %f ", (*p_Conta).saldo);


return 0;
}
Figura 12.6: Exemplo de ponteiro para estrutura

int main( ) {
struct Conta_Banco

Gerente, *p_Conta;

p_Conta = &Gerente;
printf(" \n Saldo do Gerente = %f ", p_Conta->saldo);
return 0;
}
Figura 12.7: Exemplo de passagem de uma estrutura inteira para uma funo

12.2

UNIES

Uma declarao union determina uma nica localizao de memria onde podem
estar armazenadas vrias variveis diferentes. A declarao de uma unio semelhante
declarao de uma estrutura, como mostrado na Figura 12.8.
As variveis_union no precisam ser declaradas imediatamente aps a declarao da union, elas podem ser declaradas posteriormente como se declaram as variveis
inteiras e de ponto flutuante.

90

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Quando uma varivel union declarada, o compilador cria automaticamente uma


varivel grande o bastante para armazenar o tipo da varivel de maior tamanho na union.
union nome_da_union {
tipo_1 nome_1;
tipo_2 nome_2;
...
tipo_n nome_n;
} variveis_union;
Figura 12.8: Forma geral de declarao de uma unio

A Figura 12.9 apresenta dois exemplos de unies, a primeira possui elementos do


mesmo tipo, float, e a segunda de tipos diferentes. So mostradas tambm formas diferentes de se acessar os elementos das unies. Unies podem ser feitas com variveis de
diferentes tipos. Neste caso, a memria alocada corresponde ao tamanho da maior varivel
na union.
No exemplo da Figura 12.9, ao se colocar o valor 54.14 na varivel Temp_1.Faren,
este valor foi atribuido tambm a Temp_1.Celcius, porque Faren e Celcius ocupam a
mesma posio de memria da varivel Temp_1. Por isso no foi mais possvel recuperar
o valor 12.3.
A unio Identificador abriga trs tipos de variveis diferentes, portanto, muito
cuidado deve ser tomado na sua utilizao. Edite e execute o programa da Figura 12.9 e
verifique alguns possveis erros que podero ocorrer na execuo da funo printf. Evite
armazenar uma varivel de um tipo em uma union e acess-la como varivel de outro tipo.
Finalmente, verifique no exemplo da Figura 12.9 que o acesso a um elemento union
utiliza a mesma sintaxe das estruturas: os operadores ponto e seta. Quando se opera
diretamente na union, usa-se o operador ponto. Se a varivel union acessada por meio
de um ponteiro, usa-se o operador seta. As formas de passar variveis tipo union para
funes so as mesmas da passagem de variveis struct.

12.3

ENUMERAES

Uma enumerao uma extenso da linguagem C acrescentada pelo padro ANSI.


Uma enumerao um conjunto de constantes inteiras que especifica todos os valores legais que uma varivel de um tipo especfico pode ter. So definidas de modo semelhante s
estruturas com a palavra reservada enum usada para indicar o incio de um tipo enumerado.
As enumeraes so definidas como as estruturas, coloca-se a palavra chave enum,
depois uma lista de palavras entre chaves e em seguida os nomes das variveis que tero

Tipos de Dados Definidos Pelo Usurio

91

este tipo de enumerao. Tal como nas estruturas e unies, os nomes das variveis no
precisam vir imediatamente aps a declarao da enumerao.
A Figura 12.10 apresenta um exemplo de enumerao que um aluno utiliza para organizar seu horrio de aulas semanais. A varivel semana uma enumerao dos dias da
semana.
O ponto-chave para o entendimento das enumeraes que cada smbolo representa
um valor inteiro. Dessa forma, eles podem ser usados em qualquer lugar em que um inteiro
possa ser usado. Se no for atribuido nenhum valor aos smbolos, como no exemplo, seus
valores estaro em seqncia iniciando de zero. Portanto, neste exemplo, Dom = 0, Seg
= 1, e Sab = 6.
Se quisssemos mudar esta seqncia, poderamos atribuir alguns valores, por exemplo, se atribussemos o valor 5 ao smbolo Seg, na declarao da enumerao (Seg = 5),
ento teramos: Dom = 0, Seg = 5, Ter = 6, . . . , Sab = 10.
Se o usurio tivesse a inteno de utilizar esta enumerao em uma chave, comando
switch, e gostaria que cada dia da semana correspondesse ao seu nmero de ordem.
Portanto, atribuiria apenas o primeiro smbolo, Dom=1, e os outros viriam na seqncia,
como pode ser visto na Figura 12.11.
Verifique, neste exemplo, que poderiam ser colocados os valores inteiros de 1 a 7 no
lugar dos smbolos de Seg a Dom, mas da forma como foi feito o programa ficou bem mais
legvel.
Para finalizar, eu vou chamar a ateno para um fato curioso. Se cada smbolo corresponde a um inteiro, ento pode-se atribuir os smbolos a variveis inteiras. Por exemplo,
se o programador quisesse saber as aulas de amanh, poderia ter somado 1 ao valor da
varivel Dia, ou poderia ter feito no programa a seguinte atribuio: Dia = Qui. Assim
poderia pesquisar o horrio de quinta-feira, que o dia correspondente ao nmero inteiro
5.

12.4

TYPEDEF

A linguagem C permite definir explicitamente novos nomes de tipos de dados conhecidos, usando-se a palavra reservada typedef. No se cria um novo tipo de dado, mas,
ao contrrio, define-se um novo nome para um tipo existente.
Forma geral: typedef tipo nome;
Onde tipo qualquer tipo de dado permitido e nome o novo nome para esse tipo.
O typedef poderia se utilizado para chamar de Real qualquer varivel do tipo float.
A vantagem de se fazer isto que a palavra Real nos traduz melhor o sentido dos nmeros
em ponto flutuante que a palavra float.

92

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Mas no h problema em se fazer isto? No, o compilador vai ler todas as declaraes de variveis tipo Real, vai traduzir a palavra Real para float e depois compilar
normalmente.
O typedef torna-se especialmente til quando deseja-se utilizar um identificador
nico para um tipo novo de varivel que foi criada, como uma struct, ou uma union,
ou uma enum. Dois exemplos de utilizao de typedef podem ser vistos na Figura 12.12,
que uma forma diferente do exemplo da Figura 12.9
Verifique que a nica diferena agora que preciso escrever apenas um identificador, u_graus, para declarar uma varivel deste tipo de unio, e no escrever dois identificadores, union graus. Isto traz mais legibilidade ao programa.

12.5

CAMPOS-DE-BITS

Campos bit so uma extenso da estrutura simples que permite que os bits individuais
de uma determinada estrutura sejam acessados.
A linguagem C tem um modo prprio de acessar um ou mais bits dentro de um byte
ou palavra. Isso pode ser til por diversas razes: primeiro, se o espao limitado, pode-se
armazenar muitas variveis booleanas (true/false) em um byte; segundo, certas interfaces
de dispositivos transmitem informaes codificadas em bits dentro de um byte; e terceiro,
certas rotinas de codificao de dados necessitam acessar os bits dentro de um byte.
Um mtodo que a linguagem C utiliza para acessar os bits baseia-se na estrutura
chamada campos-bit. Um campo-bit somente um tipo de membro de estrutura que define
o quo grande, em bits, cada elemento deve ser. A Figura 12.13 apresenta a forma geral de
uma estrutura tipo campos-de-bits. Verifique que se trata de uma estrutura, mas o tamanho
de cada elemento, ou campo, definido em bits. Os tamanhos indicados acima so dados
em nmeros de bits. Vamos, por exemplo, declarar uma estrutura de campos bit que nos
permite acesso a um byte pedao por pedao.
A Figura 12.14 apresenta um exemplo de estrutura de campos-de-bits.
As variveis campos-de-bits possuem certas restries: no se pode obter seu endereo; no podem ser colocadas em matrizes; no se pode sobrepor o limite dos inteiros.
No entanto vlido misturar membros normais de estrutura com elementos compos-bit. Os
membros, ou campos, das variveis deste tipo podem ser acessados tal como so acessados os membros de uma estrutura comum.

Tipos de Dados Definidos Pelo Usurio

93

union graus {
float Celcius;
float Faren;
};
union Identificador {
char Letra;
int
Inteiro;
float Real;
}
int main ( ) {
union graus Temp_1, Temp_2, *p_T;
/ * p_T um ponteiro tipo union graus
union Ientificador Id_1, Id_2;
Temp_1.Celcius = 12.3;
Temp_2.Faren = (Temp_1.Celcius + 40) * 9 / 5

*/

- 40;

p_T = &Temp_1;
p_T->Faren = Temp_2.Faren;
/*
/*

Aqui o nmero 12.3 de Temp_1 foi substitudo por


54.14 calculado acima */
Se for feita uma tentativa de ler o valor 12.3,
s se conseguir 54.14 */

printf ("\n Temperatura = %f ", Temp_1.Celcius);


/* Ser impresso o valor 54.14 */
Identificador.Letra = A ;
printf ("\n Letra = %c \n Inteiro = %d \n Real = %f ",
Identificador.Letra, Identificador.Inteiro,
Identificador.Real);
return 0;
}
Figura 12.9: Declaraes de unies e formas de utilizao

94

EDITORA - UFLA/FAEPE - Introduo Linguagem C

enum Semana {Dom, Seg, Ter, Qua, Qui, Sex, Sab} Escola;
Figura 12.10: Exemplo de enumerao

enum Semana {Dom = 1, Seg, Ter, Qua, Qui, Sex, Sab};


int main ( ) {
int
Dia ;
enum Semana Escola;
scanf("%d", Dia);
switch(Dia) {
case Seg: printf
break;
case Ter: printf
break;
case Qua: printf
break;
case Qui: printf
break;
case Sex: printf
break;
case Sab:
case Dom: printf
break;
default: printf
}
return 0;

("\n Portugues\n Matematica\n Geografia\n");


("\n Ingles\n Histria\n Matematica\n");
("\n Geografia\n Matemtica\n Portugues\n");
("\n Matematica\n Geografia\n Ingles\n");
("\n Histria\n Portugues\n Geografia\n");

("\n Fim de semana\n");


("\n Dia errado\n");

}
Figura 12.11: Exemplo de utilizao de uma enumerao

Tipos de Dados Definidos Pelo Usurio

95

union graus {
float Celcius;
float Faren;
};
typedef union graus
int main (
u_graus
u_graus
u_graus

u_graus;

) {
Temp_1
Temp_2;
*p_T; /* p_T um ponteiro tipo union graus */

Temp_1.Celcius = 12.3;
Temp_2.Faren = (Temp_1.Celcius + 40) * 9 / 5
p_T = &Temp_1;
p_T -> Faren = Temp_2.Faren;
printf ( "\n Temperatura = %f

- 40;

", Temp_1.Celcius );

return 0;
}
Figura 12.12: Utilizando typedef

struct nome_do_tipo_estrutura {
tipo nome_1: tamanho_1;
tipo nome_2: tamanho_2;
...
tipo nome_N: tamanho_N;
}
Figura 12.13: Forma geral de campos-de-bits

96

EDITORA - UFLA/FAEPE - Introduo Linguagem C

struct nome_do_tipo_estrutura {
tipo nome_1: tamanho_1;
tipo nome_2: tamanho_2;
...
tipo nome_N: tamanho_N;
}
Figura 12.14: Exemplo de estrutura de campos-de-bits

13
NOES DE MANIPULAO DE
ARQUIVOS

Para tratar de arquivos a linguagem C fornece um nvel de abstrao entre o programador e o dispositivo que estiver sendo usado. Esta abstrao chamada fila de bytes e o
dispositivo normalmente o arquivo. Existe um sistema bufferizado de acesso ao arquivo,
onde um ponteiro de arquivo define vrios aspectos do arquivo, como nome, status e
posio corrente, alm de ter a fila associada a ele. A Figura 13.1 mostra um programa
exemplo que escreve uma seqncia de nmeros em um arquivo (teste.dat) e depois l os
valores contidos no arquivo.

13.1

ABRINDO E FECHANDO UM ARQUIVO

No sistema de entrada e sada ANSI definido o tipo ponteiro de arquivo. Este no


um tipo propriamente dito, mas uma definio usando o comando typedef. Esta definio
est no arquivo cabealho stdio.h ou stdlib.h dependendo do seu compilador. Podemos
declarar um ponteiro de arquivo da seguinte maneira:
FILE *p;
p ser ento um ponteiro para um arquivo. usando este tipo de ponteiro que vamos
poder manipular arquivos no C.
13.1.1

A Funo fopen()

Esta a funo de abertura de arquivos. Seu prottipo :


FILE *fopen (char *nome_do_arquivo, char *modo);
O nome_do_arquivo determina qual arquivo dever ser aberto. Este nome deve ser
vlido no sistema operacional que estiver sendo utilizado. O modo de abertura diz funo
fopen() que tipo de uso voc vai fazer do arquivo. A Tabela 13.1 mostra os valores de modo
vlidos.

98

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main ( )
{
FILE *fp;
char ch;
int nu, *pn;
pn = &nu;
fp = fopen("teste.dat", "w");
printf("Entre com os numeros para gravar e 0 para sair: ");
scanf("%d", &nu);
while(nu)
{
fprintf (fp,"%d ", nu);
scanf("%d", &nu);
}
fclose(fp);
fp = fopen("teste.dat", "r");
while(!feof(fp))
{
fscanf( fp,"%d ", &nu);
printf( "%d", nu);
}
}
Figura 13.1: Escrevendo e lendo em arquivo

Poderamos ento, para abrir um arquivo binrio, escrever:


FILE *fp;
fp = fopen ("exemplo.bin","wb");
if (!fp)
printf ("Erro na abertura do arquivo.");

A condio !fp testa se o arquivo foi aberto com sucesso porque no caso de um erro
a funo fopen() retorna um ponteiro nulo (NULL).
13.1.2

A Funo exit()

Aqui abrimos um parntesis para explicar a funo exit() cujo prottipo :

Noes de Manipulao de Arquivos

99

Tabela 13.1: Modos vlidos 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 binrio para leitura
Cria um arquivo binrio para escrita
Acrescenta dados binrios 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 binrio para leitura e escrita
Cria um arquivo binrio para leitura e escrita
Acrescenta dados ou cria uma arquivo binrio 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);


Esta funo aborta a execuo do programa. Pode ser chamada de qualquer ponto
no programa e faz com que o programa termine e retorne, para o sistema operacional, o
cdigo_de_retorno. A conveno mais usada que um programa retorne zero no caso de
um trmino normal e retorne um nmero no nulo no caso de ter ocorrido um problema. A
funo exit() se torna importante em casos como alocao dinmica e abertura de arquivos
pois pode ser essencial que uma determinada memria seja alocada ou que um arquivo
seja aberto. Poderamos reescrever o exemplo da seo anterior usando agora o exit() para
garantir que o programa no deixar de abrir o arquivo, como mostrado na Figura 13.2.
13.1.3

A Funo fclose()

Quando abrimos um arquivo devemos fech-lo. Para tanto devemos usar a funo
fclose():

100

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main (void)
{
FILE *fp;
/* Comandos... */
fp = fopen ("exemplo.bin", "wb");
if (!fp)
{
printf ("Erro na abertura do arquivo. Fim de programa.");
exit (1);
}
/* Comandos ... */
return 0;
}
Figura 13.2: Uso da funo exit na abertura de arquivos

int fclose (FILE *fp);


importante que se perceba que se deve tomar o maior cuidado para no se perder
o ponteiro do arquivo. Perder neste caso seria se atribuir um valor de um outro ponteiro
qualquer ao ponteiro de arquivo (perdendo assim o valor original). utilizando este ponteiro
que vamos poder trabalhar com o arquivo. Se perdermos o ponteiro de um determinado
arquivo no poderemos nem fech-lo. O ponteiro fp passado funo fclose() determina
o arquivo a ser fechado. A funo retorna zero no caso de sucesso.

13.2

LENDO E ESCREVENDO CARACTERES EM ARQUIVOS

Alm das funes fprintf e fscanf vista no exemplo inicial, outras funes existem
no padro ANSI para se escrever e se ler em arquivos. Aqui sero citadas brevemente as
funes putc, getc, e a funo feof que verifica o se o arquivo chegou ao final.
13.2.1

putc()

Toda vez que estamos trabalhando com arquivos, h uma espcie de posio atual no
arquivo. Esta posio, gerenciada pelo compilador, a posio de onde ser lido ou escrito

Noes de Manipulao de Arquivos

101

o prximo caracter. Normalmente, num acesso seqencial a um arquivo, no temos que


mexer nesta posio pois quando lemos um caractere a posio no arquivo automaticamente atualizada. Num acesso randmico teremos que mexer nesta posio (ver fseek()).
Prottipo:
int putc (int ch,FILE *fp);
Escreve um caracter no arquivo.
13.2.2

getc()

Retorna um caracter lido do arquivo. Prottipo:


int getc (FILE *fp);
13.2.3

feof()

EOF (End of file) indica o fim de um arquivo. s vezes, necessrio verificar se um


arquivo chegou ao fim. Para isto podemos usar a funo feof(). Ela retorna no-zero se o
arquivo chegou ao EOF, caso contrrio retorna zero. Seu prottipo :
int feof (FILE *fp);

102

EDITORA - UFLA/FAEPE - Introduo Linguagem C

14
NOES DE ALOCAO DINMICA

H duas maneiras de armazenar variveis na memria do computador. Primeiro por


variveis globais e static locais, segundo atravs de alocao dinmica, quando o C
armazena a informao em uma rea de memria livre, de acordo com a necessidade.
No caso do C standard, a alocao dinmica fica disponvel com a incluso de stdio.h.
A alocao dinmica de memria muito til quando se tem que trabalhar com vrias
matrizes de grandes dimenses. Para cada matriz a ser utilizada pelo programa destina-se
uma rea de memria suficiente, e aps o seu uso, esta rea liberada para que possa
ser utilizada por outras matrizes. As Figuras 14.1 e 14.2 mostram exemplos de alocao
dinmica de memria.
#include <stdio.h>
main( )
{
int *p, t;
p=(int *) malloc(40*sizeof(int));
if (!p) printf("memoria insuficiente\n");
else
{
for(t=0; t<40; ++t) *(p+t) = t;
for(t=0; t<40; ++t) printf("%d ", *(p+t));
free(p);
}
}
Figura 14.1: Primeiro exemplo de alocao dinmica de memria

104

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
main( )
{
int i,quant;
float max,min,*p;
printf ("quantidade de numeros:\n");
scanf("%d", &quant);
if ( !( p = (float*) malloc((quant+1)*sizeof(float))) )
{
printf ("sem memoria\n");
exit(1);
}
printf ("digite %d numeros:\n", quant);
for ( i = 1; i <= quant; i++) scanf ("%f", (p+i));
max = *(p+1);
for ( i = 2; i <= quant; i++)
{
if (*(p+i) >= max) max = *(p+i);
}
printf("O maior e :%f \n", max);
free(p);
}
Figura 14.2: Segundo exemplo de alocao dinmica de memria

15
EXERCCIOS

15.1

CAPTULO 1

1. Procurar em livros e/ou guias de referncia da Linguagem C quais so as funes das


seguintes bibliotecas: string.h e math.h. Anotar o nome de todas as funes com seus
respectivos tipos de retorno e seus argumentos.

2. Dizer o que fazem as seguintes funes da biblioteca stdio.h: getchar, putc, puts.

15.2

CAPTULO 2

1. Editar o programa da Figura 15.1 e fazer sua compilao. Executar o programa e dizer
o que ele faz.

/* programa do Exercicio_1 capitulo_2 */


# include <stdio.h>
int main ( )
{
int
x, y;
float
X, Y;
printf (" \n\t Envie dois numeros inteiros \n\t ");
scanf (" %d %d ", &x, &y );
X = x;
Y = y;
printf ( "\n\t Diviso X/Y \n");
printf ( "\n\t %f \n\t %d \n\t %d \n", X/Y, x/y, x%y);
}
Figura 15.1: Captulo 2: Programa para o exerccio 1

106

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Para escrever os dois nmeros pedidos pelo programa, pode-se digitar o primeiro, um
espao, digitar o segundo, e pressionar <ENTER>. Pode-se tambm digitar <ENTER>
aps cada nmero.

15.3

CAPTULO 3

1. Editar, compilar e executar o programa da Figura 15.2.


/* programa do Exercicio_1 capitulo_3 */
# include <stdio.h>
int main ( )
{
int Dias;
float Anos;
printf ("\n\t Entre com o nmero de dias: ");
scanf ("%d", &Dias);
Anos = Dias/365.25;
printf ("\n\n\t %d dias equivalem a %f anos.\n",Dias,Anos);
}
Figura 15.2: Captulo 3: programa para o exerccio 1

Dizer o que o programa faz. Explicar (comentar) o que faz cada linha. Explique porque
a varivel Dias inteira e Anos float.
2. Modifique o programa anterior para que sejam requisitados o dia, o ms e o ano atuais,
o dia, o ms e o ano de nascimento do usurio, e ento seja calculado e anunciado o
nmero de dias vivido pelo usurio.

15.4

CAPTULO 4

1. Editar, compilar e executar o programa da Figura 15.2.


2. Modifique o programa para que todos os nmeros sejam impressos com quatro algarismos antes do ponto decimal e trs algarismos aps.

15.5

CAPTULO 5

1. Dizer o que faz o programa da Figura 15.4.

Exerccios

107

/* programa do Exercicio_1 capitulo_3 */


# include <stdio.h>
int main ( )
{
char Ch;
float x, y;
printf ("\n Envie dois nmeros : ");
scanf ("%f %f ", &x, &y );
printf ( "\n O produto de %f e %f eh %f ", x, y, x*y );
Ch = getchar( );
printf ( "\n O quociente de %f e %f eh %f ", x, y, x/y );
printf ( "\n A tecla pressionada foi %c \n\n", Ch );
printf ( "Fim de Programa\n" );
}
Figura 15.3: Captulo 4: Programa para o exerccio 1

2. Reescrever o programa do item anterior utilizando o comando switch. Editar, compilar


e executar o programa.
3. Fazer um programa em C que identifique tringulos, conforme o algoritmo da Figura 15.5
4. Modificar o programa de clculo de PI (Figura 5.8), do Captulo 5, de forma que ele
calcule a srie at que encontre um termo cujo valor absoluto seja menor que 0,00001.
Para isto, dever ser usado um Loop while ou do-while.
5. O seno de um ngulo qualquer (dado em radianos) pode ser calculado pela srie
abaixo.


    
         
Os nmeros que aparecem no denominador so os fatoriais dos expoentes de cada
termo.
Fazer um programa em linguagem C que calcule o seno de um ngulo dado utilizando
os N primeiros termos da srie. O ngulo A(radianos) e o valor de N devero ser
requisitados ao usurio do programa.
6. Reescrever o programa anterior para que o seno do ngulo seja calculado at que o
mdulo do ltimo termo da srie seja menor que 0,00001.

108

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include<stdio.h>
main( )
{
int opcao;
int valor;
printf("Converter:\n");
printf("
1: decimal para hexadecimal\n");
printf("
2: hexadecimal para decimal\n");
printf("
3: decimal para octal\n");
printf("
4: octal para decimal\n");
printf("informe a sua opo:");
scanf("%d", &opcao);
if(opcao==1) {
printf("informe um valor em decimal:");
scanf("%d", &valor);
printf("%d em hexadecimal : %x", valor, valor);
}
if(opcao==2) {
printf("informe um valor em hexadecimal:");
scanf("%x", &valor);
printf("%x em decimal : %d", valor, valor);
}
if(opcao==3){
printf("informe um valor em decimal:");
scanf("%d", &valor);
printf("%d em octal : %o", valor, valor);
}
if(opcao==4){
printf("informe um valor em octal:");
scanf("%o", &valor);
printf("%o em decimal : %d", valor, valor);
}
}
Figura 15.4: Captulo 5: Programa para o exerccio 1

Exerccios

109

/* Identificao de tringulos */
Incio
Ler
A, B, C
(reais, lados do tringulos)
Se
A < (B+C) e B < (A+C) e C < (A+B)
/* verifica se tringulo */
Ento
Se
A = B e B = C
Ento Imprima (Tringulo Equiltero)
Seno
Se
A = B ou A = C ou B = C
Ento Imprima (Tringulo Isceles)
Seno Imprima (Tringulo Escaleno)
FimSe
FimSe
FimSe
Fim
Figura 15.5: Captulo 5: Algoritmo para o exerccio 3

15.6

CAPTULO 6

1. Fazer um programa em Linguagem C que leia uma matriz de dimenses NxM, e calcule a sua transposta. Ao final o programa apresentar a matriz e sua transposta na
tela do computador.
2. Fazer um programa em Linguagem C que leia os nomes de 10 alunos de uma turma,
e para cada aluno, 4 notas de 0 a 100%. Os nomes dos alunos sero armazenados
em um vetor de strings, as notas sero armazenadas em uma matriz bidimensional.
Sero calculadas as mdias dos alunos, (Nota1+Nota2+Nota3+Nota4)/4, e estas sero armazenadas em um vetor. Ao final, ser apresentado um relatrio contendo 3
colunas: Nome do aluno, Mdia, Aprovao. Na coluna aprovao ser colocada a
letra A (aprovado) para alunos com mdia igual ou superior a 60, e R (reprovado) para
alunos com mdia inferior a 60.

15.7

CAPTULO 7

1. Editar, compilar, executar e dizer o que faz o programa da Figura 15.6.

110

EDITORA - UFLA/FAEPE - Introduo Linguagem C

#include <stdio.h>
#include <string.h>
main( )
{
char st1[11], st2[11], st3[21], ch ;
int i, j;
printf ("\n Envie uma string de ate 10 caracteres ");
gets(st1);
printf ("\n Envie outra string de ate 10 caracteres ");
gets(st2);
for ( i = 0; st1[i]; i++) st3[i] = st1[i];
for ( j = 0; st2[j]; j++) st3[i+j] = st2[j];
j = j+i;
puts (st3);
for ( i = j; i ; i-- )
{
ch = st3[i-1];
putchar (ch);
putchar (\n);
}
puts ("\n");
}
Figura 15.6: Captulo 7: programa para o exerccio 1

Explique porque as strings st1 e st2 devem ter no mximo 10 caracteres se os respectivos vetores foram declarados com 11 posies.

15.8

CAPTULOS 8 E 9

1. Fazer um programa em C que leia uma string de at 30 caracteres e armazene-a


em uma varivel Stfonte. Utilizando ponteiros, copie o contedo de Stfonte para uma
varivel Stdestino, de forma que a string fique escrita de forma inversa. Utilizando
ponteiros, apresentar as strings Stfonte e Stdestino em forma de duas colunas.

2. Refazer o programa do clculo das mdias dos alunos, Captulo 6 (Figura 6.3, utilizando ponteiros para o clculo das mdias e para a apresentao dos resultados.

Exerccios

15.9

111

CAPTULO 10

1. Fazer uma funo em C que concatena duas strings. Utilize o nome StrCat para esta
funo, para no confundir com como strcat() da biblioteca string.h.
2. Editar, compilar e executar o programa da Figura 15.7
/* clculo da rea de um crculo */
#include <stdio.h>
#include <math.h>
float area(float raio);

/* prottipo*/

main( )
{
float r,res;
printf("Informe o raio: ");
scanf("%f", &r);
res=area(r);
printf("A rea : %f\n", res);
}
float area(float raio)
{
return 3.1415926 * pow(raio,2);
}
Figura 15.7: Captulo 10: Programa para o exerccio 2

3. Modificar o programa anterior para calcular a rea e o permetro do crculo, e calcular


o volume e a rea de uma esfera de mesmo raio. Devero ser feitas 4 funes.
4. Modifique o programa anterior para que ele repita os clculo para diferentes raios
enviados pelo usurio. Dever ser utilizado um loop do-while onde, ao final ser perguntado ao usurio se deseja novo clculo. O loop ser repetido at que o usurio
responda N (no).
5. Fazer uma funo em C que calcule o fatorial de um nmero passado como parmetro.
6. Fazer uma funo em C que calcule o produto de duas matrizes A e B e retorne o
resultado em outra matriz P.

112

15.10

EDITORA - UFLA/FAEPE - Introduo Linguagem C

CAPTULO 11

1. Fazer um programa em C que receba em sua linha de comando o nome do usurio


e escreva a mensagem: Bom dia <usurio>. Onde se l <usurio> dever estar
escrito o nome completo do usurio. O programa dever identificar quantos nomes
foram escritos.
2. Fazer um programa em C que calcule as razes de uma equao de segundo grau. Os


valores A, B, C da equao sero passados na linha de comando.  
  .
15.11

CAPTULO 12

1. Fazer um programa em C para ler e armazenar em uma estrutura, os dados de uma


pessoa. Os campos da estrutura DADOS sero: nome, idade, telefone, sexo (M/F).

15.12

CAPTULO 13

1. Usar a estrutura do exerccio 1 do Captulo 12 para armazenar em um vetor os dados


de um conjunto de 20 pessoas, que poderiam ser por exemplo os candidatos a vagas
em uma empresa.

15.13

CAPTULO 14

1. Modificar o programa do exerccio 1 do Captulo 13 para armazenar os dados em


arquivo. O programa dever ter um menu de opes para trabalhar com os dados
(usar o comando switch). No menu ser previsto incluso de dados, excluso de
dados, e consulta. Para cada opo dever ser feita uma funo especfica. Na opo
consulta, dever ter um menu de opes: por nome, idade, sexo. Quando for pedida
uma consulta por nome, por exemplo, devero ser apresentados todos os dados das
pessoas que possuem aquele nome.

REFERNCIAS BIBLIOGRFICAS

[1] GACLI-UNICAMP, Introduo Linguagem C, UNICAMP, Campinas, 2001.


[2] CPDEE-UFMG, Curso de C, UFMG, Belo Horizonte, 2000.
[3] KERNIGHAN, Brian W. e RITCHIE, Dennis M., C: A Linguagem de Programao,
Rio de Janeiro, Campus, 1986.
[4] PLAUGER, P.J. e BRODIE J. Standart C: guia de referncia bsica, So Paulo,
Mcgraw-Hill, 1991. 306p.
[5] HANCOCK, Les e KRIEGER, Morris. Manual de Linguagem C, Rio de Janeiro, Campus,1985. 182p.
[6] MIZRAHI, Viviane V. Treinamento em Linguagem C mdulo 1 e 2, So Paulo,
McGraw-Hill, 1990, 241p.
[7] CHILDT, Herbert. C Completo e Total, So Paulo, Makron Books, 1996, 830p.

114

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A
BIBLIOTECAS DO C

Ser apresentada aqui uma lista de todas as funes do padro ANSI-C, e algumas
que no pertencem ao grupo ANSI-C, mas que so implementadas em vrios compiladores.
As funes que no pertencem ao padro sero indicadas como tal. A lista seguir a ordem
alfabtica dos nomes das bibliotecas.

A.1

ASSERT.H

Funes
void assert(int test);

A.2

CONIO.H

Embora no seja uma biblioteca do padro ANSI-C, conio.h citada aqui por ser
implementada em vrios compiladores e ser utilizada por muitos programadores.
Funes
cgets ( ); char *cgets(char *str);
clreol ( ); void clreol(void);
clrscr ( ); void clrscr(void);
cprintf ( ); int cprintf (const char *format [, argument, ...]);
cputs ( ); int cputs(const char *str);
cscanf ( ); int cscanf (char *format [, address, ...]);
delline ( ); void delline(void);
getch ( ); int getch(void);
getche ( ); int getche(void);
getpass ( ); char *getpass(const char *prompt);

116

EDITORA - UFLA/FAEPE - Introduo Linguagem C

gettext ( ); int gettext(int left, int top, int right, int bottom, void*
destin);
gettextinfo ( ); void gettextinfo(struct text_info *r);
gotoxy ( ); void gotoxy(int x, int y);
highvideo ( ); void highvideo(void);
insline ( ); void insline(void);
inp ( ); int inp(unsigned portid);
inpw ( ); unsigned inpw(unsigned portid);
kbhit ( ); int kbhit(void);
lowvideo ( ); void lowvideo(void);
movetext ( ); int movetext(int left, int top, int right, int bottom, int
destleft, int desttop);
normvideo ( ); void normvideo(void);
outp ( ); int outp(unsigned portid, int value);
outpw ( ); unsigned outpw(unsigned portid, unsigned value);
putch ( ); int putch(int ch);
puttext ( ); int puttext(int left, int top, int right, int bottom, void*
source);
_setcursortype ( ); void _setcursortype(int cur_t);
textattr ( ); void textattr(int newattr);
textbackground ( ); void textbackground(int newcolor);
textcolor ( ); void textcolor(int newcolor);
textmode ( ); void textmode(int newmode);
ungetch ( ); int ungetch(int ch);
wherex ( ); int wherex(void);
wherey ( ); int wherey(void);
window ( ); void window(int left, int top, int right, int bottom);

A.3 CTYPE.H
As funes da biblioteca ctype.h so usadas para testar e converter caracteres.
Um caractere de controle refere-se ao caractere que no parte do conjunto normal de
impresso. No conjunto de caracteres ASCII, os caracteres de controle so os caracteres
de 0 (NUL) at 0x1F (US), e o caractere 0x7F (DEL). Os caracteres imprimveis so aqueles
que vo de 0x20 (space) at 0x7E (tilde).

Bibliotecas do C

Funes
isalnum; int isalnum(int character);
isalpha; int isalpha(int character);
iscntrl; int iscntrl(int character);
isdigit; int isdigit(int character);
isgraph; int isgraph(int character);
islower; int islower(int character);
isprint; int isprint(int character);
ispunct; int ispunct(int character);
isspace; int isspace(int character);
isupper; int isupper(int character);
isxdigit; int isxdigit(int character);
tolower; int tolower(int character);
toupper; int toupper(int character);

A.4

ERRNO.H

Varivel
errno int errno;
Macros
EDOM #define EDOM <valor>
ERANGE #define ERANGE <valor>

A.5

LIMITS.H

CHAR_BIT
CHAR_MAX
CHAR_MIN
INT_MAX
INT_MIN
LONG_MAX
LONG_MIN
SCHAR_MAX

117

118

EDITORA - UFLA/FAEPE - Introduo Linguagem C

SCHAR_MIN
SHRT_MAX
SHRT_MIN
UCHAR_MAX
UINT_MAX
ULONG_MAX
USHRT_MAX
Os valores a seguir so definidos por diretivas #define . Estes valores so dependentes de implementao, mas no podem ser menores do que estas especificaes.
CHAR_BIT 8 Nmero de bits em um byte.
SCHAR_MIN -127 Mnimo valor para um signed char.
SCHAR_MAX +127 Mximo valor para um signed char.
UCHAR_MAX 255 Mximo valor para um unsigned char.
CHAR_MIN Estes definem os valores mnimo e
CHAR_MAX mximo para um char. Se um char estiver sendo representado como um signed integer, ento, seus valores sero os mesmos que do signed char (SCHAR).
Caso contrrio, CHAR_MIN 0 e CHAR_MAX o mesmo que UCHAR_MAX.
MB_LEN_MAX 1 Mximo nmero de bytes em um multibyte character.
SHRT_MIN -32767 Mnimo valor para um short int.
SHRT_MAX +32767 Mximo valor para um short int.
USHRT_MAX 65535 Mximo valor para um unsigned short int.
INT_MIN -32767 Mnimo valor para um int.
INT_MAX +32767 Mximo valor para um int.
UINT_MAX 65535 Mximo valor para um unsigned int.
LONG_MIN -2147483647 Mnimo valor para um long int.
LONG_MAX +2147483647 Mximo valor para um long int.
ULONG_MAX 4294967295 Mximo valor para um unsigned long int.

A.6 LOCALE.H
Variveis
struct lconv

Bibliotecas do C

Macros
NULL
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MONETARY
LC_NUMERIC
LC_TIME

Funes
localeconv( );
setlocale( ); char *setlocale(int category, const char *locale);

Variveis e Definies
A estrutura lconv contm as seguintes variveis em qualquer ordem:
char
char
char
char
char
char
char
char
char
char
char
char
char
char
char
char
char
char

*decimal_point;
*thousands_sep;
*grouping;
*int_curr_symbol;
*currency_symbol;
*mon_decimal_point;
*mon_thousands_sep;
*mon_grouping;
*positive_sign;
*negative_sign;
int_frac_digits;
frac_digits;
p_cs_precedes;
p_sep_by_space;
n_cs_precedes;
n_sep_by_space;
p_sign_posn;
n_sign_posn;

119

120

EDITORA - UFLA/FAEPE - Introduo Linguagem C

A.7 MATH.H
Macros
HUGE_VAL
Funes
acos( ); double acos(double x);
asin( ); double asin(double x);
atan( ); double atan(double x);
atan2( ); double atan2(double y ,double x);
ceil( ); double ceil(double x);
cos( ); double cos(double x);
cosh( ); double cosh(double x);
exp( ); double exp(double x);
fabs( ); double fabs(double x);
floor( ); double floor(double x);
fmod( ); double fmod(double x, double y);
frexp( ); double frexp(double value, int *exp);
ldexp( ); double ldexp(double x, int exp);
log( ); double log(double x);
log10( ); double log10(double x);
modf( ); double modf(double value, double *iptr);
pow( ); double pow(double x, double y);
sin( ); double sin(double x);
sinh( ); double sinh(double x);
[sqrt( );] double sqrt(double x);
tan( ); double tan(double x);
tanh( ); double tanh(double x);

A.8 SIGNAL.H
Macros
SIG_DFL
SIG_ERR

Bibliotecas do C

121

SIG_IGN
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
Funes
signal( ) void (*signal(int sig, void (*func)(int)))(int);
raise( ) int raise(int sig);
Variveis e definies
typedef sig_atomic_t
SIG_ERR Represents a signal error.
SIG_IGN Signal ignore

A.9

STDARG.H

A biblioteca stdarg define algumas macros usadas para obter argumentos em uma
funo quando o nmero de argumentos no conhecido.
Macros
va_start( ) void va_start(va_list ap, last_arg);
va_arg( ) type va_arg(va_list ap, type);
va_end( ) void va_end(va_list ap);

A.10

STDIO.H
A biblioteca stdio fornece funes para implementar entrada e sada.

Macros
NULL
_IOFBF
_IOLBF

122

EDITORA - UFLA/FAEPE - Introduo Linguagem C

_IONBF
BUFSIZ
EOF
FOPEN_MAX
FILENAME_MAX
L_tmpnam
SEEK_CUR
SEEK_END
SEEK_SET
TMP_MAX
stderr
stdin
stdout
Funes
clearerr( ); void clearerr(FILE *stream);
fclose( ); int fclose(FILE *stream);
feof( ); int feof(FILE *stream);
ferror( ); int ferror(FILE *stream);
fflush( ); int fflush(FILE *stream);
fgetpos( ); int fgetpos(FILE *stream, fpos_t *pos);
fopen( ); FILE *fopen(const char *filename, const char *mode);
fread( ); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
freopen( ); FILE *freopen(const char *filename, const char *mode,FILE
*stream);
fseek( ); int fseek(FILE *stream, long int offset, int whence);
fsetpos( ); int fsetpos(FILE *stream, const fpos_t *pos);
ftell( ); long int ftell(FILE *stream);
fwrite( ); size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
remove( ); int remove(const char *filename);
rename( ); int rename(const char *old_filename, const char *new_filename);
rewind( ); void rewind(FILE *stream);
setbuf( ); void setbuf(FILE *stream, char *buffer);
setvbuf( ); int setvbuf(FILE *stream, char *buffer, int mode, size_t
size);

Bibliotecas do C

123

tmpfile( ); FILE *tmpfile(void);


tmpnam( ); char *tmpnam(char *str);
fprintf( ); int fprintf(FILE *stream, const char *format, ...);
fscanf( ); int fscanf(FILE *stream, const char *format, ...);
printf( ); int printf(const char *format, ...);
scanf( ); int scanf(const char *format, ...);
sprintf( ); int sprintf(char *str, const char *format, ...);
sscanf( ); int sscanf(const char *str, const char *format, ...);
vfprintf( ); int vfprintf(FILE *stream, const char *format, va_list arg);
vprintf( ); int vprintf(const char *format, va_list arg);
vsprintf( ); int vsprintf(char *str, const char *format, va_list arg);
fgetc( );

int fgetc(FILE *stream);

fgets( ); char *fgets(char *str, int N, FILE *stream);


fputc( ); int fputc(int char, FILE *stream);
fputs( ); int fputs(const char *str, FILE *stream);
getc( ); int getc(FILE *stream);
getchar( ); int getchar(void);
gets( ); char *gets(char *str);
putc( ); int putc(int char, FILE *stream);
putchar( ); int putchar(int char);
puts( ); int puts(const char *str);
ungetc( ); int ungetc(int char, FILE *stream);
perror( ); void perror(const char *str);
Variveis
typedef size_t
typedef FILE
typedef fpos_t
Variveis e Definies
size_t o resultado inteiro sem sinal do tamanho da palavra-chave (sizeof keyword ).
FILE um tipo til para armzenar informaes de um arquivo (file stream).
fpos_t um tipo til para armazenar qualquer posio em um arquivo.
NULL o valor ce uma constante ponteiro nulo (null pointer constant).

124

EDITORA - UFLA/FAEPE - Introduo Linguagem C

_IOFBF, _IOLBF, e _IONBF so usadas na funo setvbuf.


BUFSIZ um inteiro que representa o tamanho do buffer usado pela funo setbuf.
EOF um inteiro negativo que indica que o final do arquivo (end-of-file) foi alcanado.
FOPEN_MAX um inteiro que representa o mximo nmero de arquivos que o sistema pode
garantir que podem ficar abertos ao mesmo tempo.
FILENAME_MAX um inteiro que representa o comprimento mximo de um vetor de char
disponvel para manter o maior nome de arquivo possvel.
L_tmpnam um inteiro que representa o maior comprimento de um vetor de char disponvel para manter o maior nome de arquivo temporrio possvel criado pela funo
tmpnam.
SEEK_CUR, SEEK_END, e SEEK_SET so usados na funo fseek.
TMP_MAX o mximo nmero de nomes de arquivos nicos (unique filenames) que a funo tmpnam pode gerar.
stderr, stdin, e stdout so ponteiros para tipos arquivos (FILE types) os quais correspondem aos standard error, standard input, e standard output streams.
A.10.1

Algumas funes em detalhe

fopen
Declarao: FILE *fopen(const char *filename, const char *mode);
Abre um arquivo apontado por filename. 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 binrio de leitura read binary mode
wb modo binrio de escrita write binary mode
ab modo binrio 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.
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 binrio para leitura e escrita.

Bibliotecas do C

125

w+b ou wb+ modo binrio para leitura e escrita (trunca o arquivo para comprimento zero ou
cria um novo arquivo)
a+b ou ab+ modo binrio para leitura e escrita (abre ou cria um arquivo e ajusta o ponteiro
para o final do arquivo end-of-file)
Se o arquivo no existir e for feita uma operao de abertura no modo read (r), ento
a abertura falhar.
Se o arquivo for aberto no modo append (a), ento todas as operaes de escrita
ocorrero ao final do arquivo no importando a posio corrente do arquivo.
Se o arquivo for aberto no modo update (+), ento a sada no poder ser seguida
diretamente por uma entrada e uma entrada no poder ser seguida diretamente por uma
sada sem a interveno de fseek, fsetpos, rewind, ou fflush.
Tendo sucesso na abertura do arquivo, ser retornado um ponteiro para o arquivo (file
stream). Ocorrendo uma falha na abertura, um ponteiro nulo ser retornado.
A.10.2

Entradas e sadas formatadas

Funes (x)printf
As funes (x)printf fornecem meios para sada formatada de informaes para
um stream.
fprintf envia sada formatada para um stream
printf envia sada formatada para o dispositvo padro (stdout)
sprintf envia sada formatada para uma string
vfprintf envia sada formatada para um stream usando uma lista de argumentos
vprintf envia sada formatada para stdout usando uma lista de argumentos
vsprintf envia sada formatada para uma string usando uma lista de argumentos
int
int
int
int
int
int

fprintf (FILE *stream, const char *format, ...);


printf (const char *format, ...);
sprintf (char *str, const char *format, ...);
vfprintf (FILE *stream, const char *format, va_list arg);
vprintf (const char *format, va_list arg);
vsprintf (char *str, const char *format, va_list arg);

Tipos de argumentos
%d, %i Inteiros decimais com sinal signed int.
%u Inteiro decimal sem sinal unsigned int.

126

EDITORA - UFLA/FAEPE - Introduo Linguagem C

%o unsigned int na base octal.


%x unsigned int em hexadecimal usando minsculas: a, b, c, d, e, f.
%X unsigned int em hexadecimal usando maisculas: A, B, C, D, E, F.
%f Ponto flutuante em decimal double.
%e, %E double impresso em notao cientfica, com e (minsculo) ou E (maisculo).
%g , %G] double impresso como %e ou %f, o que tiver menor comprimento. O %G utiliza %E
ou %F.
%c char: ser impresso um nico caractere.
%s Imprime uma string.
%p Imprime o valor de um ponteiro.
%n o argumento associado um ponteiro para inteiro no qual o nmero de caracteres
impressos at este ponto colocado. Nenhum caractere impresso.
%% Imprime o sinal %.
H dois especificadores de formato que permitem que printf( ) mostre inteiros
short e long. Esses especificadores podem ser aplicados aos tipos d, i, o, u, x e X.
O especificador l diz a printf( ) que segue um tipo de dado long. Por exemplo, %ld
significa que um long int ser mostrado. O especificador h instrui printf( ) a mostrar
um short int. Portanto, %hu indica que o dado do tipo short unsigned int.
A.10.3

Funes (x)scanf

As funes (x)scanf so utilizadas para leitura formatada de informaes de um


stream.
fscanf l entrada formatada de um stream
scanf l entrada formatada do dispositivo padro (stdin)
sscanf l entrada formatada de uma string
int fscanf (FILE *stream, const char *format, ...);
int scanf (const char *format, ...);
int sscanf (const char *str, const char *format, ...);
Tipos de argumentos
%c char: l um nico caractere.
%d, %i Inteiros decimais com sinal signed int.
%u Inteiro decimal sem sinal unsigned int.
%o unsigned int na base octal.

Bibliotecas do C

127

%x unsigned int em hexadecimal usando minsculas: a, b, c, d, e, f.


%f Ponto flutuante em decimal - double.
%e Ponto flutuante em notao cientfica.
%g Ponto flutuante
%s L uma String.
%p L um ponteiro.
%n Retorna um inteiro igual ao nmero de caracteres lidos.
%[ ] Procura um conjunto de caracteres.
%% L o sinal %.
A.10.4

Funes de entrada e sada de caracteres

fgetc Retorna o prximo caractere da stream de entrada na posio atual e incrementa o


indicador de posio de arquivo. O caractere lido como um unsigned char, que
convertido para um inteiro.
fgets L N-1 caracteres de stream e coloca-os na matriz de caracteres apontada por str.
fputc Escreve o caractere ch na stream especificada na posio atual do arquivo e avana
o indicador de posio de arquivo.
fputs Escreve na stream especificada o contedo da string apontada por str. O terminador
nulo no escrito.
getc Retorna o prximo caractere (um unsigned char) da stream especificada e avana
o indicador de posio da stream.
getchar Retorna um caractere (um unsigned char) da entrada padro (stdin).
gets L uma linha da entrada padro e aramazena em uma string apontada por str.
putc Escreve o caractere contido no byte menos significativo de ch na stream de sada
apontada por stream e avana a posio do indicador da stream.
putchar Escreve no dispositivo padro de sada (stdout) um caractere (um unsigned
char) especificado pelo argumento char.
puts Escreve a string apontada por str no dispositivo padro de sada, mas no escreve
o terminador nulo. Um caractere de mudana de linha (newline) adicionado sada.

A.11

STDLIB.H
A biblioteca stdlib define algumas funes em macros de propsito geral.

128

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Macros
NULL
EXIT_FAILURE
EXIT_SUCCESS
RAND_MAX
MB_CUR_MAX
Variveis
typedef size_t
typedef wchar_t
struct div_t
struct ldiv_t
size_t o tamanho em forma unsigned integer resultante da operao sizeof sobre uma varivel de qualquer tipo.
wchar_t um tipo inteiro do tamanho de uma constante wide character.
div_t a estrutura retornada pela funo div.
ldiv_t a estrutura retornada pela funo ldiv.
NULL o valor de uma constante ponteiro nulo.
EXIT_FAILURE e EXIT_SUCCESS so valores retornados pela funo exit.
RAND_MAX o mximo valor retornado pela funo rand.
MB_CUR_MAX o mximo nmero de bytes em um conjunto de caracteres multibyte o
qual no pode ser maior que MB_LEN_MAX.
Funes
abort( ); void abort(void);
abs( ); int abs(int x);
atexit( ); int atexit(void (*func)(void));
atof( ); double atof(const char *str);
atoi( ); int atoi(const char *str);
atol( ); long int atol(const char *str);
bsearch( ) ; void *bsearch(const void *key, const void *base, size_t
nitems, size_t size, int (*compar)(const void *, const void *));
calloc( ); void *calloc(size_t nitems, size_t size);
div( ); div_t div(int numer, int denom);

Bibliotecas do C

129

exit( ); void exit(int status);


free( ); void free(void *ptr);
getenv( ); char *getenv(const char *name);
labs( ); long int labs(long int x);
ldiv( ); ldiv_t ldiv(long int numer, long int denom);
malloc( ); void *malloc(size_t size);
mblen( ); int mblen(const char *str, size_t n);
mbstowcs( ); size_t mbstowcs(schar_t *pwcs, const char *str, size_t n);
mbtowc( ); int mbtowc(whcar_t *pwc, const char *str, size_t n);
qsort( ); void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
rand( ); int rand(void);
realloc( ); void *realloc(void *ptr, size_t size);
srand( ); void srand(unsigned int seed);
strtod( ); double strtod(const char *str, char **endptr);
strtol( ); long int strtol(const char *str, char **endptr, int base);
strtoul( ); unsigned long int strtoul(const char *str, char **endptr,
int base);
system( ); int system(const char *string);
wcstombs( ); size_t wcstombs(char *str, const wchar_t *pwcs, size_t n);
wctomb( ); int wctomb(char *str, wchar_t wchar);
A.11.1

Funes de manipuo de Strings

atoi
atol
strtod
strtol
strtoul
A.11.2

Funes de manipulao de Memria

calloc
free
malloc
realloc

130

A.11.3

EDITORA - UFLA/FAEPE - Introduo Linguagem C

Funes de Ambiente (Environment)

abort
atexit
exit
getenv
system
A.11.4

Funes de busca e ordenao (Searching and Sorting)

bsearch
qsort
A.11.5

Funes matemticas

abs int abs(int x);


div div_t div(int numer, int denom);
labs long int labs(long int x);
ldiv ldiv_t ldiv(long int numer, long int denom);
rand int rand(void);
srand void srand(unsigned int seed);
Descrio
abs, labs; Retorna o valor absoluto de x.
div; Divide o numer (numerador) por denom (denominador). O resultado armazenado
em uma estrutura div_t que possue dois membros:
int quot; quociente.
int rem; resto.
ldiv; o mesmo que div, para argumentos do tipo long int. O resultado armazenado
em uma estrutura ldiv_t.
rand Retorna um nmero pseudo-randmico entre 0 e RAND_MAX.
srand Inicializador da seqncia de rand. Se no for chamado o srand, rand atuar
como se srand(1) tivesse sido chamado.
A.11.6

Funes Multibyte

O comportamento das funes multibyte afetado pelos ajustes de LC_CTYPE feitos


localmente.
mblen int mblen(const char *str, size_t n);

Bibliotecas do C

mbstowcs

131

size_t mbstowcs(schar_t *pwcs, const char *str, size_t n);

mbtowc int mbtowc(whcar_t *pwc, const char *str, size_t n);


wcstombs size_t wcstombs(char *str, const wchar_t *pwcs, size_t n);
wctomb

int wctomb(char *str, wchar_t wchar);

mblen Retorna o comprimento de um character multibyte apontado por um argumento str.


mbstowcs Converte a string de caracteres multibyte apontada pelo argumento str para
um vetor apontado por pwcs
mbtowc Examina um caractere multibyte apontado pelo argumento str.
wcstombs Converte os cdigos armazenados na matriz pwcs para caracteres multibyte e
os armazena na string str.
wctomb Examina o cdigo que corresponde ao caractere multibyte dado pelo argumento
wchar.

A.12

STRING.H

A biblioteca string fornece muitas funes teis para manipulao de strings (vetor
de caracteres).
Variveis e Definies
size_t o inteiro sem sinal resultante de sizeof keyword.
NULL o valor da constante ponteiro nulo.
Funes
memchr( ); void *memchr(const void *str, int c, size_t n);
memcmp( ); int memcmp(const void *str1, const void *str2, size_t n);
memcpy( ); void *memcpy(void *str1, const void *str2, size_t n);
memmove( ); void *memmove(void *str1, const void *str2, size_t n);
memset( ); void *memset(void *str, int c, size_t n);
strcat( ); char *strcat(char *str1, const char *str2);
strncat( ); char *strncat(char *str1, const char *str2, size_t n);
strchr( ); char *strchr(const char *str, int c);
strcmp( ); int strcmp(const char *str1, const char *str2);
strncmp( ); int strncmp(const char *str1, const char *str2, size_t n);
strcoll( ); int strcoll(const char *str1, const char *str2);

132

EDITORA - UFLA/FAEPE - Introduo Linguagem C

strcpy( ); char *strcpy(char *str1, const char *str2);


strncpy( ); char *strncpy(char *str1, const char *str2, size_t n);
strcspn( ); size_t strcspn(const char *str1, const char *str2);
strerror( ); char *strerror(int errnum);
strlen( ); size_t strlen(const char *str);
strpbrk( ); char *strpbrk(const char *str1, const char *str2);
strrchr( ); char *strrchr(const char *str, int c);
strspn( ); size_t strspn(const char *str1, const char *str2);
strstr( ); char *strstr(const char *str1, const char *str2);
strtok( ); char *strtok(char *str1, const char *str2);
strxfrm( ); size_t strxfrm(char *str1, const char *str2, size_t n);

A.13

TIME.H

A biblioteca time fornece algumas funes teis para ler e converter a hora e a data
correntes. O comportamento de algumas funes definido pela categoria LC_TIME das
propriedades locais.

Variveis e definies
NULL o valor de um ponteiro nulo.
CLOCKS_PER_SEC o nmero de clocks por segundos do processador.
size_t o unsigned integer resultante de sizeof keyword.
clock_t um tipo til para armazenar o tempo do processador.
time_t um tipo til para armazenar o tempo de calendrio.
struct tm uma estrutura usada para guardar o tempo e a data. Seus membros so:
int tm_sec; seconds after the minute (0 to 61)
int tm_min; minutes after the hour (0 to 59)
int tm_hour; hours since midnight (0 to 23)
int tm_mday; day of the month (1 to 31)
int tm_mon; months since January (0 to 11)
int tm_year; years since 1900
int tm_wday; days since Sunday (0 to 6 Sunday=0)
int tm_yday; days since January 1 (0 to 365)
int tm_isdst; Daylight Savings Time

Bibliotecas do C

133

Funes
asctime( );

char *asctime(const struct tm *timeptr);

clock( ); clock_t clock(void);


ctime( ); char *ctime(const time_t *timer);
equivalente a asctime(locatime(timer));
difftime( ); double difftime(time_t time1, time_t time2);
gmtime( ); struct tm *gmtime(const time_t *timer);
localtime( ); struct tm *localtime(const time_t *timer);
mktime( ); time_t mktime(struct tm *timeptr);
time( ); time_t time(time_t *timer);
Calcula a data e hora correntes e codifica-os no formato time_t. Retorna o valor
time_t. Se timer no for um ponteiro nulo, ento o valor tambm armazenado
em um objeto para o qual ele aponta. Se no houver sucesso, retorna -1.
strftime( ); size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);

Você também pode gostar