Académique Documents
Professionnel Documents
Culture Documents
Recife, 2009
Sumrio
Apresentao.........................................................................................5
Conhecendo o Volume 3.......................................................................6
Captulo 1 Armazenamento de Dados em Vetores..........................8
1.1 O que so vetores?.......................................................................8
1.2 Declarao de Vetores..................................................................9
1.3 Referncia a elementos de vetor................................................. 11
1.4 Inicializao de vetores...............................................................13
1.5 Leitura de elementos para o vetor...............................................15
1.6 Impresso dos elementos de um vetor........................................22
1.7 Tamanho de um vetor e segmentao de memria....................27
1.8 Passando vetores como parmetros de funes........................28
Captulo 2 Armazenamento de Dados em Registros.....................35
2.1 O que so registros?...................................................................35
2.2 Declarao de um Registro.........................................................36
2.3 Acessando os campos do registro...............................................39
2.4 Vetor de registro..........................................................................40
2.5 Acessando os campos do vetor de registro.................................42
2.6 Usando vetor de registro.............................................................43
Apresentao
Caro(a) aluno(a),
Seja bem-vindo (a) ao terceiro mdulo da disciplina Programao II. Neste mdulo,
vamos dar mais um passo no nosso aprendizado sobre a linguagem de programao
C.
Nos dois volumes anteriores, aprendemos os comandos bsicos do C, a utilizar
as estruturas de controle (seleo e repetio) e a modularizar nossos programas em
mdulos ou funes. Com estes assuntos, adquirimos a capacidade de desenvolver
programas mais elaborados.
Neste livro, ns vamos aprender novas formas de armazenar nossos dados. Com os
vetores e registros, poderemos manusear um volume maior de dados, de forma facilitada.
Outro assunto muito importante que ser abordado neste volume o armazenamento de
dados em arquivos. Atualmente, ao terminar a execuo do programa, todos os dados
que foram digitados so perdidos. Com o armazenamento de dados em arquivos, isto
no acontece. Assim, iremos desenvolver programas com operaes como: cadastro de
elementos, remoo, alterao, consultas, listagens, etc.
Continuem resolvendo as questes propostas no final de cada captulo, alm de
executar buscas na Internet, visando um maior aprofundamento de cada assunto. Ao final
deste mdulo, teremos a capacidade de resolver questes com operaes presentes
nos principais sistemas de controle do mercado, como por exemplo: sistema de controle
de estoque, sistema de controle de cliente, etc. Vamos comear mais uma nova etapa
no conhecimento da linguagem de programao C?
Bons estudos!
Professora Snia Virginia Alves Frana
Programao 2
Conhecendo o Volume 3
Neste terceiro volume, vocs iro encontrar o mdulo 03 da
disciplina: Programao II. Este volume est estruturado em trs
captulos, que sero estudados ao longo de 15h/aula. Para facilitar
seus estudos, veja a organizao deste volume.
Captulo 1: Armazenamento de Dados em Vetores
Carga Horria do Captulo 1: 5 h/aula
Objetivos do Captulo 1: Apresentar o uso de vetores para o
armazenamento de dados.
Contedo Programtico do Captulo 1
Definio de vetores;
Declarao, leitura e escrita de dados em vetores;
Passagem de vetores como parmetros de funes;
Captulo 2: Armazenamento de Dados em Registros
Carga Horria do Captulo 2: 5 h/aula
Objetivos do Captulo 2: Apresentar o uso de registros para o
armazenamento de dados.
Contedo Programtico do Captulo 2
Definio de registros;
Declarao, leitura e escrita de dados em registros;
Vetor de registro;
Captulo 3: Armazenamento de Dados em Arquivos
Carga Horria do Captulo 3: 5 h/aula
Objetivos do Captulo 3: Apresentar os principais comandos para
o armazenamento de dados em arquivos. Com os arquivos, os dados
manipulados no programa podem ser armazenados definitivamente.
Contedo Programtico do Captulo 3
Definio de arquivos;
6
Programao 2
Ponteiros;
Comandos para manipulao de dados em arquivos;
Ao final de cada captulo vocs encontraro:
A seo Atividades e Orientaes de Estudo: que contm
exerccios para a fixao do assunto estudado, alm de
indicao de fruns de discusso.
A seo Conhea Mais: que contm dicas de sites e livros
que devem ser lidos para ampliar os seus conhecimentos.
A seo Vamos Revisar?: que apresenta um resumo dos
principais tpicos abordados no captulo.
Programao 2
Captulo 1 Armazenamento de
Dados em Vetores
Vamos conversar sobre o assunto?
Neste terceiro volume, vamos aprender novas formas de armazenar
nossos dados. Comearemos aprendendo como armazenar os dados
em vetores. Com os vetores, ns podemos armazenar um grande
conjunto de dados, facilitando o acesso e manuseio dos mesmos. Os
dados so a alma de um programa. Assim, a manipulao dos dados
de forma mais adequada e facilitada, trar ganhos para o programa e
para o programador. Vamos continuar a nossa caminhada?
Programao 2
media
3.0
7.5
5.8
9.5
8.2
tipo identificador[tamanho];
Programao 2
onde:
tipo: o tipo de dados que o vetor armazena: int, float, char,
etc.
identificador: o nome do vetor. As regras para nomear um
vetor so as mesmas usadas para nomear variveis, constantes
e funes.
tamanho: o tamanho do vetor. Isto , o nmero de elementos
que o vetor pode armazenar.
A seguir, so apresentados exemplos de declaraes de vetores.
Os vetores so declarados na seo de declarao de variveis do
programa. Se estivermos desenvolvendo um programa modularizado,
podemos declarar o vetor como uma varivel local de um mdulo.
Exemplo 1.1: declarao de vetores
Ateno
2
Ns j havamos
utilizado vetor
de caracteres, j
que trabalhamos
com variveis
que armazenam
uma cadeia de
caracteres. No
prximo volume,
teremos um
captulo dedicado
a este assunto.
int idade[100];
float nota[25];
char nome[80];
Programao 2
#define TAMANHO 30
int valor[TAMANHO];
identificador[indice]
onde:
identificador: o nome do vetor que queremos acessar.
ndice: o ndice do elemento do vetor que queremos acessar.
Cada elemento do vetor referenciado pelo nome do vetor e,
entre colchetes, tem-se o ndice, que um nmero inteiro. O ndice
ir indicar qual elemento do vetor estamos querendo referenciar. A
seguir, so apresentadas algumas atribuies a elementos de um
vetor chamado valor, que composto por 10 elementos do tipo float.
11
Programao 2
float valor[10];
//declarao do vetor
int x;
x = 3;
valor[1] = 6.6;
valor[x] = 9.9
valor[x+2] = 10.0;
6.6
0
9.9
2
10.0
4
12
Programao 2
Onde:
tipo: o tipo dos elementos do vetor: int, float, char, etc.
identificador: o nome do vetor.
tamanho: o tamanho do vetor. Isto , o nmero de elementos
que o vetor pode armazenar.
lista de valores: uma lista, separada por vrgulas, dos valores
de cada elemento do vetor. A lista de valores colocada entre
chaves.
Vamos ver a seguir, exemplos de inicializao de vetores.
Exemplo 1.4: Inicializao de vetores
12
30
57
25
18
15
13
Programao 2
8.4
6.9
4.5
0.0
0.0
0.0
0.0
0.0
0.0
0.0
14
Programao 2
ou
int valor[3];
valor[0] = 7;
valor[1] = 4;
valor[2] = 20;
15
Programao 2
main()
int valor[5];
int i;
printf(Cadastro dos elementos do vetor Valor
\n\n);
5
6
scanf(%d,&valor[i]);
10
getche();
11
Programao 2
17
Programao 2
i+1
valor
10
10
15
10
15
10
15
10
15
12
18
Programao 2
main()
{ int valor[5];
int q, continuar;
q=0;
printf(Cadastro dos elementos do vetor Valor
\n\n);
5
6
do
scanf(%d,&valor[q]);
q++;
10
printf(\n\nCadastrar
(1-sim/2-nao)? );
outro
11
12
13
elemento
scanf(%d, &continuar);
Ateno
3
Quando no
sabemos quantos
elementos sero
cadastrados,
temos que
estipular um valor
para a quantidade
de elementos
que sero
armazenados no
vetor. Isso se d
porque temos que
saber o tamanho
do vetor no
momento da sua
declarao.
Programao 2
20
Programao 2
q+1
valor
12
12
15
12
15
18
21
Programao 2
main()
{ int valor[5];
int q, continuar, i;
q=0;
do
scanf(%d,&valor[q]);
q++;
10
printf(\n\nCadastrar
(1-sim/2-nao)? );
outro
11
scanf(%d, &continuar);
12
13
printf(\n\nElementos do Vetor: );
14
15
16
getche();
17
printf( %d ,valor[i]);
22
elemento
Programao 2
23
Programao 2
main()
{ int mat[10];
float nota[10];
int q, i, continuar;
soma = 0;
q=0;
do
10
system(cls);
printf(Universidade Aberta do Brasil UFRPE\n\n);
24
Programao 2
11
q+1);
printf(\n\nDados
do
Alunos
12
printf(\nMatricula: );
13
scanf(%d,&mat[q]);
14
printf(\nNota: );
15
scanf(%f,¬a[q]);
16
17
q++;
18
);
19
20
21
media = soma/q;
22
system(cls);
%d\n\n,
printf(\n\nCadastrar outro(1-sim/2-nao)?
scanf(%d, &continuar);
23
24
25
printf(Alunos
turma\n\n);
com
26
27
28
29
30
nota
acima
da
media
da
if (nota[i]>media)
printf(%d \n,mat[i]);
printf(\n\nDigite
);
31
getche();
32
qualquer
tecla
para
sair
Programao 2
26
Programao 2
Figura 1.13: Tela de Execuo do Programa Completo 1.4 Apresentao dos Resultados
Programao 2
Onde:
tipo_retorno: o tipo de retorno da funo.
nome_funo: o nome da funo.
tipo_vetor: o tipo de dados dos elementos do vetor.
nome_vetor: o nome do vetor. Observe que depois do nome
do vetor temos o [ e o ], mas no colocamos nada entre eles.
Neste caso, no necessrio informar o tamanho do vetor.
Quando formos chamar uma funo que recebe um vetor como
28
Programao 2
nome_da_funo(nome_do_vetor);
Onde:
nome_da_funo: o nome da funo que ser chamada.
nome_do_vetor: o nome do vetor que queremos passar
como parmetro. Neste caso, indicamos apenas o nome do
vetor, sem os colchetes.
O exemplo 1.6, a seguir, apresenta a declarao de uma funo
que tem um vetor como parmetro e a chamada da funo.
Exemplo 1.6:
declarao e chamada de uma funo que tem um vetor como parmetro
//corpo da funo
5
6
main()
float n;
...
10
11
...
12
Programao 2
Soma
11
18
17
Programao 2
Resultante
12
11
15
11
12
15
14
13
22
14
13
22
31
Programao 2
22
13
14
12
14
25
interseccao
12
14
25
Diferenca
32
12
Programao 2
12
Unio
14
25
12
14
25
25
Conhea Mais
Para ampliar nossos conhecimentos sobre os assuntos tratados
neste captulo, leiam o captulo que aborda armazenamento em
vetores, do livro:
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
33
Programao 2
Vamos Revisar?
Vamos lembrar rapidinho o que foi visto neste captulo?
Leia o resumo a seguir, composto com os principais conceitos
apresentados.
Vetores: conhecidos como estruturas de dados homogneas, os
vetores so um conjunto de variveis que armazenam elementos
do mesmo tipo.
ndices: para acessar um elemento do vetor, precisamos indicar em
que posio do vetor est o elemento.
No momento da declarao dos vetores, precisamos indicar quantos
elementos sero armazenados no mesmo.
de responsabilidade do programador o acesso aos elementos do
vetor. Se o programa tentar acessar uma posio que no existe no
vetor, o compilador no indicar o erro.
Quando passamos um vetor como parmetro de uma funo, seus
valores podem ser alterados
34
Programao 2
Captulo 2 Armazenamento de
Dados em Registros
Vamos conversar sobre o assunto?
Neste captulo, vamos aprender mais uma forma de armazenamento
de dados, que so os registros. Nos registros podemos agrupar dados
de tipos diferentes. Por conta disto, os registros so chamados de
estruturas de dados heterogneas. Assim como os vetores, os registros
vo facilitar o gerenciamento dos dados dos nossos programas, que
esto cada vez maiores. Veremos, tambm, como unir os conceitos
de vetores e registros, trabalhando com vetor de registro. Leiam este
captulo com calma e ateno, uma vez que iremos utilizar registros
em muitas situaes nos nossos programas, certo?
35
Programao 2
Boletim de Notas
Matricula...: 12345
Nome........: Michel
Disciplina..: Matemtica
Mdia........: 10.0
Situao....: Aprovado
36
Programao 2
Sintaxe
} nome_do_tipo;
Onde:
typedef: indica que um novo tipo de dado ser definido.
struct: indica que o tipo de dado que ser definido um
registro, ou seja, um agrupamento de variveis de tipos de
dados diferentes.
declarao das variveis: so as variveis que fazem parte do
registro. Neste local, precisamos especificar quais as variveis
iro compor o registro, alm do tipo das mesmas. As variveis
so colocadas entre chaves.
nome_do_tipo: dado um nome ao novo tipo de dado que
est sendo criado. S depois que o novo tipo de dado criado,
que o registro poder ser declarado.
Na sequncia, vamos ver a declarao de um registro. Assim como
toda varivel, ao declarar uma varivel que um registro, precisamos
dizer que tipo de dado o registro armazena. Neste caso, iremos dizer
que o registro do tipo de dado que acabamos de definir no typedef.
A sintaxe a seguinte:
Sintaxe
nome_do_tipo
nome_do_registro;
Onde:
nome_do_tipo: o nome do tipo de dado que definimos
no nosso programa, formado pelo agrupamento de vrias
variveis.
nome_do_registro: o nome da varivel registro que est
sendo declarada. O nome de um registro segue as regras dos
identificadores.
O exemplo 2.1 apresenta a declarao do registro do boletim do
aluno:
37
Programao 2
situao[10];
float media;
} Tipo_Aluno;
Tipo_Aluno aluno;
38
Programao 2
matricula
nome
disciplina
situacao
media
aluno
Figura 2.2: Representao grfica do registro aluno
nome_do_registro.campo
Onde:
nome_do_registro: o nome da varivel registro que queremos
acessar.
Aps o nome_do_registro devemos colocar um ponto, que
ir separar o nome do registro, do campo que vem logo em
seguida.
campo: o campo do registro que ser acessado.
39
Programao 2
Saiba Mais
O ponto que
aparece neste
comando, deve
ser lido como
campo. Assim,
a leitura do
comando da linha
1 seria: aluno no
campo matricula
recebe 12345.
4
aluno.matricula = 12345;
scanf(%f, &aluno.media);
gets(aluno.nome);
Programao 2
situao[10];
float media;
}Tipo_Aluno;
Tipo_Aluno alunos[50];
alunos
matricula
nome
disciplina
media
situacao
0
matricula
nome
disciplina
media
situacao
1
matricula
nome
disciplina
media
situacao
...
matricula
nome
disciplina
media
situacao
48
41
49
Programao 2
nome_do_vetor[indice].campo
Onde:
nome_do_vetor: nome do vetor que queremos acessar.
[ndice]: ndice do vetor que ser acessado.
.campo: campo do registro que ser acessado.
O exemplo 2.4 apresenta acessos a campos do vetor de registro
alunos.
Exemplo 2.4: Acesso aos elementos de um vetor de registro
alunos[2].media = 7.5;
alunos[3].matricula = 12345;
gets(alunos[0].nome);
scanf(%d,&alunos[2].matricula);
Programao 2
43
Programao 2
Colgio Legal
Relatrio Geral
Matricula
Nome
Serie
Irmao
Mensalidade
xx
xxxxx
xx.xx
xx
xxxxx
xx.xx
xx
xxxxx
xx.xx
xx
xxxxx
xx.xx
xx
xxxxx
xx.xx
44
Programao 2
#include <stdio.h>
main()
char nome[20];
float mens;
Tipo_Aluno;
Tipo_Aluno alunos[20];
qa =0;
10
do
11
system(cls);
12
printf(Colegio Legal\n);
13
printf(\n\nCadastro de Alunos\n\n);
14
printf(\nMatricula.: );
15
scanf(%d,&alunos[qa].mat);
16
printf(\nNome......: );
17
fflush(stdin);
18
gets(alunos[qa].nome);
19
printf(\nSerie(1-4): );
20
scanf(%d,&alunos[qa].serie);
21
);
22
scanf(%d,&alunos[qa].irmao);
23
switch(alunos[qa].serie)
24
25
26
27
28
printf(\nIrmao
na
escola(1-sim/0-nao):
45
Programao 2
29
if (alunos[qa].irmao == 1)
30
alunos[qa].mens = alunos[qa].mens*0.8;
31
qa++;
32
printf(\n\nDeseja
sim/0-nao)? );
cadastrar
outro
aluno(1-
33
34
35
system(cls);
36
printf(Colegio Legal\n);
37
printf(\n\nRelatorio Geral\n);
38
printf(\n________________________________);
39
scanf(%d,&resp);
printf(\nMatricula
Mensalidade);
Nome
Serie
Irmao
40
printf(\n________________________________);
41
42
printf(\n%9d
%-20s
%5d
%5d
%11.2f,
43
printf(\n_______________________________);
44
45
getche();
46
Programao 2
Programao 2
Programao 2
Programao 2
Programao 2
Programao 2
linha 42.
52
Programao 2
Programao 2
Diria Hotel
Quarto Standard
Diria - Aluguel
de carro
R$ 170
R$ 50
R$ 350
R$ 60
R$ 370
R$ 75
Total da Viagem:
dias*diriahotel + dias*diariacarro(se o cliente for alugar carro)
Cadastro de Cliente
Codigo:
Nome:
Roteiro (1-Brasil, 2-EUA, 3-frica):
Tipo de Quarto (1- Standard, 2-Luxo):
Alugar Carro (1-sim/0-nao)?
Quantidade de Dias:
Inserir outro (1-sim,0-nao)?
Viagem Legal Turismo
Relatrio Geral
Cdigo
Nome
Roteiro
Quarto
Carro
Dias
Total
xx
xxxxx
xx
xx.xx
xx
xxxxx
xx
xx.xx
xx
xxxxx
xx
xx.xx
54
Programao 2
Salrio Base
R$ 2500
R$ 1700
Cadastro de Funcionario
Matricula:
Nome:
Cargo(1-Analista de Sistemas, 2- programador):
Sexo(1-mas/2-fem):
Anos de experincia:
Quantidade de filhos:
Cadastrar outro (1-sim/2-nao)?
55
Programao 2
Empresa Legal
Listagem Geral
Matricula
Nome
Cargo
Sexo
Anos
Q. Filho
Salrio
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
Valor de 1 ligao
Dia
1.30
Noite
1.60
Fixo
1.25
Empresarial
1.10
56
Programao 2
Ligue Mais
Cadastro de Cliente
Cdigo:
Nome:
Sexo(1-fem/2-mas):
Quantidade de Ligaes:
Plano(1-Dia/2-Noite/3-Fixo/4-Empresarial):
Cadastrar outro (1-sim/0-nao)?
Ligue Mais
Listagem Geral
Codigo
Nome
Sexo
Quant. Lig.
Plano
Total
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
xx
xxxxx
xx
xxx.xx
57
Programao 2
Universidade Legal
Relatrio Geral
Matricula
Nota1
Nota2
Nota3
Media
xxxxxxxxx
x.x
x.x
x.x
x.x
xxxxxxxxx
x.x
x.x
x.x
x.x
xxxxxxxxx
x.x
x.x
x.x
x.x
xxxxxxxxx
x.x
x.x
x.x
x.x
58
Programao 2
Ministrio da Educao
Cadastro de Polo
Codigo:
Cidade:
Quantidade de alunos:
Quantidade de tutores:
Tem lab. de informatica (1-sim/0-nao)?
Tem lab. de ciencias (1-sim/0-nao)?
Cadastrar outro plo (1-sim,0-nao)?
Ministrio da Educao
Listagem Geral
Codigo
Cidade
Alunos
Tutores
LI
LC
Verba Liberada
xx
xxxxx
xxx
xxx
xxxxx.xx
xx
xxxxx
xxx
xxx
xxxxx.xx
xx
xxxxx
xxx
xxx
xxxxx.xx
xx
xxxxx
xxx
xxx
xxxxx.xx
Conhea Mais
Vocs podero aprender mais sobre registros e vetores de registros
lendo os livros:
Vamos Revisar?
Nesta seo iremos revisar os principais tpicos vistos neste
59
Programao 2
captulo. Vale a pena dar uma lida para verificar como est o nosso
aprendizado. Observem o resumo a seguir:
Os registros so um agrupamento de variveis de tipos diferentes,
mas que tem uma relao lgica.
Por ser formado por elementos de diferentes tipos, os registros so
chamados de estruturas de dados heterogneas.
Para declarar uma varivel registro, precisamos definir um novo
tipo de dado para o programa, utilizando o typedef.
Cada elemento do registro chamado de campo.
Unindo os conceitos de vetores e de registros, temos os vetores
de registro que facilitam a declarao e o manuseio de grandes
volumes de dados.
60
Programao 2
Captulo 3 Armazenamento de
Dados em Arquivos
Vamos conversar sobre o assunto?
Neste captulo, vamos aprender a armazenar nossos dados de
forma definitiva. At ento, ao terminar a execuo de um programa,
todos os dados que foram armazenados nas variveis eram perdidos.
Em muitas aplicaes isto no pode acontecer. Por exemplo, um
professor precisa ter certeza de que todo o trabalho para digitar
as notas dos alunos da turma no ser perdido quando ele fechar
o programa. Com os arquivos, poderemos armazenar os dados e
recuper-los quando necessrio. Este captulo abordar os comandos
que nos possibilitaro manipular dados armazenados em um arquivo.
Vamos comear?
61
Programao 2
Programao 2
tipo
*nome_do_ponteiro;
Onde:
tipo: tipo de varivel que o ponteiro armazena endereo.
Podemos dizer que nosso ponteiro armazena o endereo de
uma varivel inteira, real, caractere, etc. Para este captulo,
estaremos utilizando um ponteiro que vai armazenar o endereo
de um arquivo.
*: o asterisco na frente do nome de uma varivel simboliza que
a varivel que est sendo declarada um ponteiro.
nome_do_ponteiro: daremos um nome nossa varivel que
armazena endereos.
O exemplo 3.1 apresenta exemplos de declaraes de ponteiros
que armazenam endereos de memria de arquivos.
Exemplo 3.1: Declarao de ponteiros para arquivos
FILE *p aluno;
FILE *p produto;
Programao 2
Programao 2
ponteiro_arquivo = fopen(nome_do_arquivo,
modo_de_abertura);
Onde:
ponteiro_arquivo: ao abrir um arquivo, a funo fopen retorna
o endereo de memria do arquivo. Por conta disso, devemos
atribuir o endereo de memria do arquivo, para um ponteiro.
Aps o arquivo ser aberto, usaremos este endereo de memria
para acess-lo.
nome_do_arquivo: determina qual arquivo dever ser aberto.
Neste espao colocado o nome do arquivo, da forma que
foi salvo no diretrio. O comando fopen procura o arquivo que
desejamos abrir, no mesmo diretrio onde est armazenado o
programa executvel.
modo_de_abertura: informa que tipo de uso voc vai fazer do
arquivo. O modo de abertura indica o que faremos no arquivo:
leitura, gravaes e alteraes. Alm disso, o modo de abertura
tambm vai indicar se queremos que um novo arquivo seja
criado. A tabela abaixo, apresenta os principais modos de
abertura.
65
Programao 2
Modo
Significado
r+b
w+b
a+b
if (pprofessor == NULL)
Programao 2
fclose(ponteiro_arquivo);
Onde:
ponteiro_arquivo: o ponteiro que tem armazenado o
endereo de memria do arquivo que queremos fechar.
S podemos fechar arquivos que esto abertos. O exemplo 3.3,
apresenta o uso do comando fclose. Vamos utilizar os ponteiros
declarados no exemplo anterior.
Exemplo 3.3: Fechamento de arquivo
fclose(palunos);
fclose(pprofessores);
Programao 2
ponteiro_arquivo);
Onde:
®istro: o registro que armazenar os dados do registro
lido do arquivo. assim, ns pegamos um registro que est no
arquivo, e armazenamos no registro passado como parmetro.
numero_de_bytes: na verdade, o que o comando de leitura
faz informar que o leitor precisa se deslocar, fazendo a leitura
de uma certa quantidade de bytes. A quantidade de bytes que o
leitor deve se deslocar exatamente quantos bytes de memria
o registro ocupa. Por exemplo: se o nosso arquivo armazena
registros de alunos, composto pelos campos: matricula (int),
nota1 (float), nota2 (float) e media (float). Sabe-se que um int
ocupa 4 bytes e um float, tambm, ocupa 4 bytes. Dessa forma,
teremos: 4 bytes para a matricula + 4 bytes para a nota1 + 4
bytes para a nota2 + 4 bytes para a media = 16 bytes. Assim,
esse registro ocupa 16 bytes (Figura 3.4). esse o nmero de
bytes que o leitor dever ler, para recuperar o registro de um
aluno, armazenado no arquivo. Existe uma funo chamada
sizeof que informa quantos bytes ocupa um tipo de dado.
Assim, no precisamos estar lembrados de quantos bytes um
int ocupa. Alm disso, no precisamos fazer as contas para
saber quantos bytes o nosso registro ocupa. Para utilizar a
funo sizeof, precisamos apenas, passar como parmetro
68
Programao 2
4 bytes
4 bytes
4 bytes
matricula
nota1
nota2
media
4
5
TAluno aluno;
FILE *paluno;
7
8
Programao 2
Agora que j sabemos como fazer para ler um registro que est
armazenado no arquivo, vamos aprender a gravar um registro no
arquivo.
70
Programao 2
ponteiro_arquivo);
Onde:
®istro: o registro que ser armazenado no arquivo.
numero_de_bytes: a quantidade de bytes que sero
gravadas no arquivo. Neste parmetro, tambm usaremos o
sizeof.
quantidade: neste terceiro parmetro, tambm, usaremos
SEMPRE 1. Este parmetro significa quantas vezes a gravao
ser executada. Ns sempre queremos que seja feita a
gravao de um registro por vez. Por isso, sempre utilizaremos
1.
ponteiro_arquivo: precisamos informar em qual arquivo a
gravao ser feita. Assim, utilizamos o ponteiro que tem o
endereo do arquivo.
Agora vamos ver o exemplo 3.5, que apresenta a gravao de um
registro no arquivo. Para um melhor entendimento, foram feitas as
declaraes das variveis que sero usadas no fwrite.
71
Programao 2
} TAluno
4
5
TAluno aluno;
FILE *paluno;
7
8
fseek(ponteiro_arquivo,numero_de_bytes, origem);
72
Programao 2
Onde:
ponteiro_arquivo: precisamos informar em qual arquivo o leitor
est sendo posicionado.
numero_de_bytes: a quantidade de bytes que o leitor ir se
deslocar pelo arquivo, at chegar no local desejado.
origem: determina a partir de onde os nmero_de_bytes de
deslocamento do leitor sero contados. Os possveis valores
so:
Origem
Significado
SEEK_SET
SEEK_CUR
SEEK_END
fseek(paluno, 0,SEEK_END);
Ateno
6
O parmetro
origem, deve ser
colocado todo em
letra maiscula.
Programao 2
Figura 3.6: Posio do leitor aps a execuo dos fseek do exemplo 3.6
rewind(ponteiro_arquivo);
Onde:
ponteiro_arquivo: o ponteiro que tem o endereo do arquivo
que queremos posicionar o leitor.
O exemplo 3.7 apresenta o uso do comando rewind.
Exemplo 3.7: Uso do comando rewind
rewind(paluno);
Programao 2
int feof(ponteiro_arquivo);
Onde:
int: o retorno da funo. A funo feof retorna um nmero
inteiro, que indica se o arquivo terminou ou no. Quando a
funo retorna zero, significa que ainda no chegou no final do
arquivo. Qualquer valor diferente de zero, indica que chegou ao
final do arquivo.
ponteiro_arquivo: o ponteiro que tem o endereo do arquivo
que queremos verificar se chegou ao fim.
O exemplo 3.8 apresenta o uso do comando feof.
Exemplo 3.8: uso do comando feof
while (feof(paluno)==0)
remove(nome_do_arquivo);
Onde:
nome_do_arquivo: o nome do arquivo que queremos apagar.
75
Programao 2
remove(alunos.bin);
Neste exemplo,
computador.
arquivo
alunos.bin
ser
removido
do
rename(nome_do_arquivo, novo_nome_do_arquivo);
Onde:
nome_do_arquivo: o nome do arquivo que queremos
renomear. Neste caso; utilizado o nome do arquivo salvo no
diretrio do nosso computador.
novo_nome_do_arquivo: o novo nome para o nosso
arquivo.
O exemplo 3.10 apresenta o uso do comando rename.
Exemplo 3.10: uso do comando rename
rename(alunos.bin, alunos_temp.bin);
Programao 2
#include <stdio.h>
2
3
char nome[20];
float med;
} TAluno;
7
8
FILE *paluno;
10
11
void linha()
12
{ int i;
13
14
15
printf(_);
16
77
Programao 2
17
void cabec()
18
{ system(cls);
19
printf(Universidade
Pernambuco\n);
20
linha();
21
Federal
Rural
de
22
23
void abre_arquivo()
24
25
if (paluno == NULL)
26
27
Programao 2
79
Ateno
7
O nome do
arquivo que
ns passarmos
como parmetro
no fopen ser
utilizado para
salvar nosso
arquivo no
diretrio. Por
exemplo, aps
a execuo do
mdulo abre_
arquivo, teremos
um arquivo
chamado alunos.
dat no diretrio
onde est salvo
o programa
executvel. Por
conveno,
coloque os
arquivos de
dados sempre
com a extenso
dat ou bin.
Programao 2
void inserir()
29
{ int resp;
30
do { cabec();
31
32
printf(\nMatricula: );
33
scanf(%d, &aluno_aux.mat);
34
printf(\nNome.....: );
35
fflush(stdin);
36
gets(aluno_aux.nome);
37
printf(\nMedia....: );
38
scanf(%f, &aluno_aux.med);
39
fseek(paluno, 0, SEEK_END);
40
fwrite(&aluno_aux,
paluno);
41
printf(\n\nAluno cadastrado com sucesso!
\n\n);
42
printf(\nDeseja
(1-sim/0-nao)? );
43
44
45
sizeof(TAluno),
cadastrar
1,
outro
scanf(%d, &resp);
Programao 2
novo cadastro.
Linha 31: printf que informa o que esta tela faz cadastro de
alunos.
Linhas 32 e 33: printf solicitando que seja digitada a matrcula
do aluno e scanf que l esta informao. Os dados do aluno
vo sendo colocados no registro aluno_aux.
Linhas 34 a 36: printf solicitando que seja digitado o nome do
aluno, fflush para limpar o buffer de entrada (j que teremos a
leitura de uma sequncia de caractere) e o gets que l o nome
do aluno e armazena no registro aluno_aux.
Linhas 37 e 38: printf solicitando que seja digitada a mdia do
aluno e scanf que l esta informao. Neste momento, o registro
aluno_aux acabou de ser todo preenchido com os dados do
aluno e j pode ser gravado no arquivo.
Linha 39: para gravar o registro no arquivo, devemos posicionar
o leitor no final do arquivo para no correr o risco de fazer a
gravao sobre algum outro registro. Para isso, executado o
fseek.
Linha 40: com o leitor posicionado no final do arquivo, podemos
executar o fwrite, que vai gravar o contedo do registro aluno_
aux, no nosso arquivo.
Linha 41: printf para informar que o aluno foi cadastrado com
sucesso.
Linhas 42 e 43: printf para pergunta se o usurio deseja
cadastrar outro aluno e scanf que l a resposta para esta
pergunta.
Linha 44: final do do/while, com a condio de parada. O do/
while executado enquanto o usurio estiver respondendo que
quer cadastrar mais alunos. Notem que, no precisamos nos
preocupar com a capacidade do arquivo. Vamos armazenando
quantos registros desejarmos.
Linha 45: fecha chaves que indica o final do mdulo inserir.
A figura 3.7 apresenta a tela de execuo do programa 3.1, na tela
de cadastro de novo aluno.
81
Programao 2
47
{ int p;
48
p = 0;
49
rewind(paluno);
50
51
while (feof(paluno)==0)
52
53
54
55
56
if (aluno_aux.mat == matp)
else
{
paluno);
return p;
fread(&aluno_aux,
p++;
82
sizeof(TAluno),
1,
Programao 2
57
58
59
return -1;
60
61
62
63
64
65
printf(\n\n);
66
linha();
67
printf(Matricula
68
linha();
69
printf(%9d
70
71
linha();
72
%-20s
Nome
Media\n);
%5.1f\n, aluno_aux.mat,
aluno_aux.nome, aluno_aux.med);
Programao 2
84
Programao 2
void consultar()
74
75
do{ cabec();
76
printf(\n\nConsultar Aluno\n\n\n);
77
printf(Matricula do aluno: );
78
scanf(%d, &matcon);
79
posicao = procura(matcon);
80
if (posicao == -1)
81
\n\n);
82
83
84
else
mostre(posicao);
printf(\n\nDeseja
(1-sim/0-nao)? );
85
86
87
consultar
outro
scanf(%d, &resp);
Programao 2
Programao 2
void remover()
89
90
aluno_nulo.mat = 0;
91
aluno_nulo.med = 0;
92
do{ cabec();
93
printf(\n\nRemover aluno\n\n\n);
94
printf(Matricula: );
95
scanf(%d, &matrem);
96
posicao = procura(matrem);
97
if (posicao == -1)
98
99
else
100
101
printf(\n\nDeseja
102
scanf(%d, &conf);
103
if (conf == 1)
mostre(posicao);
(1-sim/0-nao)? );
remover
aluno
104
{ f s e e k ( p a l u n o , p o s i c a o * s i z e o f
(TAluno),SEEK_SET);
105
f w r i t e ( & a l u n o _ n u l o ,
sizeof(TAluno), 1, paluno);
106
sucesso!);
107
printf(\n\nAluno
87
removido
com
Programao 2
108
109
110
111
else
printf(\nRemocao cancelada!);
printf(\n\n\nDeseja
(1-sim/0-nao)? );
112
113
114
remover
outro
scanf(%d, &resp);
Programao 2
Programao 2
void alterar()
116
117
do { cabec();
118
n\n);
printf(\n\nAlterar
media
119
printf(Matricula: );
120
scanf(%d, &matalt);
121
posicao = procura(matalt);
122
if (posicao == -1)
123
124
else
125
126
do
aluno\n\
printf(\nAluno,nao encontrado!!\a);
mostre(posicao);
printf(\n\nAlterar
aluno(1-sim/0-nao)? );
127
scanf(%d, &conf);
128
if (conf == 1)
129
130
media
do
printf(\nNova media: );
scanf(%f, &aluno_aux.med);
131
\n\n);
132
SEEK_SET);
fseek(paluno,posicao*sizeof(TAluno),
133
paluno);
fwrite(&aluno_aux,sizeof(TAluno),
134
135
1,
mostre(posicao);
printf(\nMedia do aluno alterada com
sucesso!\n);
136
137
else
90
Programao 2
138
139
140
\n\n);
printf(\n\nAlteracao
cancelada!
printf(\n\nDeseja
(1-sim/0-nao)? );
141
142
143
alterar
outro
scanf(%d, &resp);
Programao 2
Programao 2
void listagem()
145
{ cabec();
146
printf(\n\nListagem Geral\n\n\n);
147
linha();
148
printf(Matricula
149
linha();
150
rewind(paluno);
151
152
while (feof(paluno)==0)
153
154
155
156
mat,
Nome
Media\n);
if (aluno_aux.mat != 0)
printf(%9d
%-20s
%5.1f\n, aluno_aux.
aluno_aux.nome, aluno_aux.med);
fread(&aluno_aux,
paluno);
sizeof(TAluno),
1,
157
158
linha();
159
160
getche();
161
Programao 2
Programao 2
main()
163
{ int op;
164
abre_arquivo();
165
do{ cabec();
166
printf(\n\nOpcoes: \n\n\n);
167
printf(
168
printf(
2- Remover aluno\n\n);
169
170
printf(
matricula\n\n);
\n\n);
3-
printf(
4-
Consultar
Alterar
aluno
media
do
por
aluno
171
printf(
5- Listagem geral\n\n);
172
printf(
0- Sair\n\n);
173
linha();
174
175
scanf(%d, &op);
176
switch(op)
177
178
179
180
181
182
183
184
invalida!);
185
default:
printf(\n\n\aOpcao
break;
95
Programao 2
186
187
188
Programao 2
Consulta
Shopping Center
Consultar Loja
Cdigo da loja que deseja consultar:
Cdigo
Nome
rea
Tipo
Condomnio
xxx
xxxxxxx
xx
xx
xxxx
97
Programao 2
Relatrio Geral
Shopping Center
Listagem Geral
Codigo
Nome
rea
Tipo
Condomnio
xxx
xxxxxxx
xx
xx
xxxxx
xxx
xxxxxxx
xx
xx
xxxxx
xxx
xxxxxxx
xx
xx
xxxxx
Valor do m
R$ 50
R$ 65
R$ 80
R$ 95
98
Programao 2
Tela de Cadastro
Vida Boa Turismo
Cadastrar Roteiro
Cdigo:
Pas(1-Brasil, 2-Espanha, -3-Italia):
Cidade:
Diria de Hotel: R$
Diria Aluguel de Carro: R$
Inserir outro(1-sim,2-no)?
Pas
Cidade
xxx
xxxxxxxx
Diria
Hotel
Carro
xxx
xxxx
Pas
Cidade
xxx
xxx
xxx
Diria
Hotel
Carro
xxxxxxxx
xxx
xxxx
xxxxxxxx
xxx
xxxx
xxxxxxxx
xxx
xxxx
99
Programao 2
Pas
Cidade
xxx
xxxxxxxx
Diria
Hotel
Carro
xxx
xxxx
Quantidade de dias:
Alugar carro(1-sim, 2-no)?
Valor total da viagem = R$ xxxxx
Simular outro roteiro(1-sim, 2-no)?
Observaes:
Os dados do roteiro devem ser armazenados em um arquivo.
No pode cadastrar roteiros com cdigos repetidos.
O valor da viagem deve ser calculado com base nos valores do
roteiro escolhido; viagem = quantos dias * valor diria hotel +
quantos dias * valor diria carro (caso alugue carro).
Na consulta deve passar o cdigo do roteiro e apresentar os
dados do roteiro.
Na listagem, apresentar os dados de todos os roteiros em forma
de tabela.
Conhea Mais
Para melhorar o nosso conhecimento sobre manipulao de
arquivos binrios, vejam este assunto nos livros:
LAUREANO, Marcos. Programando em C Para Linux, Unix e
Windows. Rio de Janeiro: Brasport, 2005.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C
Curso Completo. So Paulo: Makron, 1999.
100
Programao 2
Vamos revisar?
Vamos fazer uma reviso do assunto que foi visto neste captulo,
lendo o resumo a seguir:
Os arquivos servem para armazenar nossos dados de forma
definitiva.
Os arquivos binrios so adequados para o armazenamento de
registros.
Cada registro que armazenado no arquivo ocupa a mesma
quantidade de memria.
Toda operao sobre um arquivo ser executada no ponto onde
o leitor se encontra.
Com o comando fseek, podemos colocar o leitor sobre o registro
que desejamos ler ou gravar.
S podemos manipular um arquivo que esteja aberto. Aps o uso
do arquivo, devemos fech-lo.
O arquivo criado pelo programa salvo no mesmo diretrio em
que est armazenado o nosso programa executvel.
101
Programao 2
Consideraes Finais
Neste volume, tivemos a oportunidade de aprender como
armazenar dados em vetores, registros e arquivos. O armazenamento
adequado dos dados possibilitou o desenvolvimento de programas
com operaes mais elaboradas como: cadastro de elementos,
remoo, alterao, consultas e listagens. Perceberam o quanto
nossos programas evoluram desde o nosso primeiro programa
completo, at hoje? Vejam que todos os conceitos que aprendemos
esto sempre em uso nos nossos programas. Isto bom porque nos
acostumamos com a sintaxe dos comandos. Agora, temos apenas
mais um mdulo para finalizar a nossa caminhada, em busca do
aprendizado da linguagem de programao C. Continuem firmes nos
estudos! Estamos quase no final! At o prximo mdulo.
102
Programao 2
Referncias
103
Programao 2
Conhecendo a Autora
Sou graduada em Cincia da computao pela Universidade Federal
de Sergipe. Fiz mestrado e doutorado na Universidade Federal de
Pernambuco, desenvolvendo pesquisas nas reas de Sistemas Distribudos
e Geoprocessamento. Comeei a ensinar em 2000, nos cursos de Cincia
da Computao e Sistemas de Informao. Desde o incio da minha carreira
como professora, ministro disciplinas de Programao e tenho uma paixo
pela linguagem C. Atualmente, encontrei uma nova paixo: Educao a
Distncia.
104