Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução À Linguagem C PDF
Introdução À Linguagem C PDF
Introdução À Linguagem C PDF
INTRODUO LINGUAGEM C
2 Edio
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
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
35
36
36
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
81
83
83
85
89
90
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12.4
12.5
Typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Campos-de-Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
91
92
97
97
97
98
99
100
100
101
101
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
127
129
129
130
130
130
130
131
132
LISTA DE FIGURAS
1.1
1.2
1.3
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
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
.
.
.
.
.
.
.
.
.
.
.
.
49
50
50
51
6.1
6.2
6.3
6.4
6.5
6.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
54
55
55
56
56
56
7.1
7.2
7.3
7.4
7.5
7.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
57
58
58
59
59
60
8.1
8.2
8.3
8.4
8.5
8.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
62
63
65
65
65
9.1
9.2
9.3
9.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
72
73
74
74
75
75
76
77
77
78
79
79
80
11.1
11.2
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
13.1
13.2
14.1
14.2
15.1
15.2
15.3
15.4
15.5
15.6
15.7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
33
13.1
99
1
INTRODUO
1.1
12
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
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
1.3
A BIBLIOTECA PADRO C
14
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
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
/* 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);
}
*/
18
2.1
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
2.2
20
/* programa exemplo 02
# include <stdio.h>
*/
Modifique este programa para que ele calcule o cubo do nmero: crie uma funo
cubo.
3
SINTAXE
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
# 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
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
"
#
#
#
24
char
signed char
unsigned char
short
unsigned long
float
double
long double
unsigned short
int
unsigned int
long
Inteiros
!
!
Ponto Flutuante
!
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
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
OPERADORES
Operador de Atribuio
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;
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
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
# 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
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
30
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
4
FUNES BSICAS DA BIBLIOTECA C
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.
\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
#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
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
4.2
FUNO SCANF( )
36
#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()
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().
# 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
5
ESTRUTURAS DE CONTROLE DE FLUXO
5.1
IF
Sintaxe:
if (condio) comando;
else comando;
40
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;
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
42
#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;
}
5.5
LOOP FOR
Sintaxe: for (inicializao; condio; incremento) comando;
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
44
#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);
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.
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
#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("-");
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
48
# 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);
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.
#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);
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
# 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
# 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
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];
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]
54
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
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", ¬as[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
# 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
#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
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);
}
7.5
FUNO STRCMP()
60
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
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
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
8.3
64
8.4
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
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
9
PONTEIROS E MATRIZES
[tamN];
x tamN x tamanho_do_tipo
68
9.1
Ponteiros e Matrizes
69
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
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]);
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
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
#include <stdio.h>
void inverso(char *s );
main( )
{
char *vet = "abcde";
inverso(vet);
}
/* prottipo de funo */
10.2
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
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
#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
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
76
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
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
10.5
10.5.1
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
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.
80
10.5.2
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
#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
12.1
ESTRUTURAS
84
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
85
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.
86
...
/* Fim do Programa */
Figura 12.3: Exemplos de acesso a membros de variveis do tipo estrutura
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 */
}
*/
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 */
...
*/
88
struct exemplo {
int a,b;
char ch;
};
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
*/
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
12.3
ENUMERAES
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
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.
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;
/*
/*
94
enum Semana {Dom, Seg, Ter, Qua, Qui, Sex, Sab} Escola;
Figura 12.10: Exemplo de enumerao
}
Figura 12.11: Exemplo de utilizao de uma enumerao
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
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
A Funo fopen()
98
#include <stdio.h>
main ( )
{
FILE *fp;
char ch;
int nu, *pn;
pn = ν
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
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()
99
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
A Funo fclose()
Quando abrimos um arquivo devemos fech-lo. Para tanto devemos usar a funo
fclose():
100
#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
13.2
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
101
getc()
feof()
102
14
NOES DE ALOCAO DINMICA
104
#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
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.
106
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
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
15.5
CAPTULO 5
Exerccios
107
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
#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
110
#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
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
112
15.10
CAPTULO 11
CAPTULO 12
15.12
CAPTULO 13
15.13
CAPTULO 14
REFERNCIAS BIBLIOGRFICAS
114
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
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
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
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
_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
124
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
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
Tipos de argumentos
%d, %i Inteiros decimais com sinal signed int.
%u Inteiro decimal sem sinal unsigned int.
126
Funes (x)scanf
Bibliotecas do C
127
A.11
STDLIB.H
A biblioteca stdlib define algumas funes em macros de propsito geral.
128
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
atoi
atol
strtod
strtol
strtoul
A.11.2
calloc
free
malloc
realloc
130
A.11.3
abort
atexit
exit
getenv
system
A.11.4
bsearch
qsort
A.11.5
Funes matemticas
Funes Multibyte
Bibliotecas do C
mbstowcs
131
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
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( );