Você está na página 1de 50

Universidade Metodista de

Piracicaba UNIMEP
Faculdade de Cincia e Tecnologia da
Informao
Maro/2000
Apostila de Linguagem de Programao C - Mdulo II
NDICE
1. Funes
. Conceituao
. Passagem de parmetros por valor;
. Passagem de parmetros por referncia.
2. Ponteiros
. Conceituao
. Operadores associados a ponteiros;
. Ponteiros e atri!es
3. Tipos Estruturados
. Estruturas;
. Unies;
. Enumerao e
. Tipo Definido.
4. Arquivos
. "pera#es $%sicas com ar&uivos;
. "pera#es $%sicas com registros;
. odos de acesso a registros.
2
2
Apostila de Linguagem de Programao C - Mdulo II 3
3
Apostila de Linguagem de Programao C - Mdulo II
1. FUNES
As funes permitem ao programador separar um programa longo em vrias
partes menores, cada qual com uma finalidade especfica, tornando assim o
programa modular. Alm desta vantagem podemos destacar outras como: a
repetio das mesmas instrues de programa em diferentes pontos do programa,
clareza na representao de lgica, portabilidade no caso da criao de
bibliotecas e etc.
'endo assim a funo ( um seguimento independente do programa &ue e)ecuta uma tarefa
espec*fica. +odo o programa em ,C- ( formado por uma ou mais fun#es. .ma dessas
fun#es deve ser a funo main/0. 1s fun#es adicionais do programa estaro su2ordinadas
3 funo main/0 ou a alguma outra funo. 'e um programa cont(m v%rias fun#es4 suas
defini#es podem aparecer em &ual&uer ordem. .ma funo ser% e)ecutada &uando for
c5amada. 1p6s a e)ecuo4 o controle retorna para o ponto no &ual a funo foi c5amada.
Forma Geral:-
tipo nome7da7funo /lista de parmetros0
8
corpo da funo;
9
"nde:
tipo define o tipo da informao que a funo vai retornar, podendo ser qualquer
tipo vlido. Se nenhum tipo for especificado o compilador assume que a funo
devolve um resultado inteiro (default), quando a funo no retorna nenhum
resultado coloca-se void;
nome7da7funo ; identificador criado pelo programador;
lista de parmetros ; so as informa#es passadas para a funo tam2(m con5ecidas como
argumentos. .ma funo pode no conter argumentos4 lista va!ia entre parnteses. +odos
os parmetros da funo devem conter o tipo e o nome da vari%vel.
4
4
Apostila de Linguagem de Programao C - Mdulo II
1s vari%veis declaradas dentro de uma funo no podem interagir com o c6digo ou os
dados definidos em outra funo4 conceito de variveis locais.
" padro 1N'I e)pandiu a declarao de fun#es colocando<se a utili!ao de prot6tipos.
'ua finalidade ( a de informar ao compilador a e)istncia de outras fun#es no programa
al(m da funo main/0. Isto fa! com &ue o compilador avalie os tipos especificados nos
parmetros evitando incompati2ilidade de tipo na c5amada a funo.
Exemplo:
=include >stdio.5?
=include >conio.5?
void tela@/0; AA prot6tipo da funo tela@/0
void telaB/0; AA prot6tipo da funo telaB/0
void tela@/0
8 clrscr/0;
goto)C/BD4@D0;printf/,Digite o Eegistro 1cadmico.....-0;
goto)C/BD4@B0;printf/,Digite o nome do aluno.............-0;
goto)C/BD4@F0;printf/,Digite a m(dia do aluno............-0;
9
void telaB/0
8 clrscr/0;
goto)C/BD4@D0;printf/,1 m(dia geral da classe (.....-0;
goto)C/FD4BD0;printf/,+ecle algo GG-0;
9
void main/0
8 float media7a4 media7gHD;
c5ar raI@DJ4 nomeIBKJ;
int );
for /)H@;)>HFD;)LL0

Apostila de Linguagem de Programao C - Mdulo II


8 tela1();
goto)C/FD4@D0;gets/ra0;
goto)C/FD4@B0;gets/nome0;
goto)C/FD4@F0;scanf/,Mf-4Nmedia7a0;
media7gLHmedia7a;
9
media7gAHFD;
tela2();
goto)C/KD4@D0;printf/,MO.B-4media7g0;
getc5ar/0;
9
1 funo pode retornar um tipo de dado atrav(s do comando return. Esse comando tem
dois importantes usos: provoca uma sa*da imediata da funo retornando ao c6digo
c5amador e ele pode ser usado tam2(m para devolver uma informao. +odas as fun#es
podem devolver uma informao e)ceto as do tipo void /va!io0. " default ( o tipo int4 ou
sePa4 uma funo para a &ual no declaramos o tipo de retorno ( considerada como
retornando um inteiro.
1l(m de retornar informa#es as fun#es podem rece2er informa#es atrav(s dos
argumentos /passagem de parmetros0.
Exemplo1:< " programa a2ai)o verifica se um nQmero ( par ou *mpar.
=include >stdio.5?
=include >conio.5?
int verifica/ int a0;
int verifica / int a0
8
if /a M B0 return /D0;
else return /@0;
!
!
Apostila de Linguagem de Programao C - Mdulo II
9
void main/0
8 int num4resp;
clrscr/0;
printf/,Entre com um numero inteiro : ,0;
scanf/,Md-4Nnum0;
respHverifica/num0;
if /respHH@0 printf/, " nQmero ( impar GG Rn-0;
else printf/, " nQmero ( parGG Rn-0;
9
Exemplo2:< " programa a2ai)o retorna o &uadrado de um nQmero dado.
=include >stdio.5?
=include >conio.5?
int &uadrado/ int )0;
void main()
8 int n;
clrscr/0;
printf/,Entre com um numero inteiro : ,0;
scanf/,Md-4Nn0;
printf/, RnRn " &uadrado do nQmero ( : Md-4 &uadrado/n00;
9
int &uadrado/ int )0
8 return /)S)0; 9
"
"
Apostila de Linguagem de Programao C - Mdulo II
Em ,C- podemos ter dois tipos de parmetros: passagem de parmetros por valor e
passagem de parmetros por referncia.
Na passagem de parmetros por valor as informa#es dos parmetros so copiadas para
a funo receptora. 1s altera#es nesses parmetros no tem nen5um efeito na funo de
origem da informao.
Na passagem de parmetros por referncia ( enviado o endereo do parmetro para a
funo receptora4 dessa forma o endereo ( usado para acessar as informa#es originais.
Isto significa &ue &ual&uer alterao efetuada no parmetro estar% modificando o conteQdo
original da informao enviada.
Exemplo3:- O exemplo abaixo envia duas variveis numricas para
uma funo utilizando passagem de parmetros por referncia.
#include <stdio.h>
#include <conio.h>
void calculo (int *a,int *b);
void main()
{
int num1=100,num2=200;
calculo (&num1,&num2);
printf("\n Os valore atuais de num1= %d e num2 = %d,num1,num2);
}
void calculo (int *a, int *b)
{
*a = *a *2;
*b = *b 50;
#
#
Apostila de Linguagem de Programao C - Mdulo II
}
O resl!a"o ser#: num1=200 e num2=150;
Exemplo4 :- O programa abaixo l uma string e conta quantos caracteres so
dgitos, quantos so vogais, quantos so consoantes e quantos so espaos em
branco. O exemplo usa passagem de parmetros e aritmtica de ponteiros
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
void analisa (char linha[], int *pv, int *pc,int *pd, int *pb, int *po);
void main()
{ char linha[80];
int vogais=0,consoantes=0,digitos=0,brancos=0,outros=0;
clrscr();
printf("Digite uma linha de texto:\n");
gets(linha);
analisa(linha, &vogais, &consoantes, &digitos, &brancos,&outros);
printf("\n No de vogais: %d",vogais);
printf("\n No de consoantes: %d",consoantes);
printf("\n No de digitos: %d",digitos);
printf("\n No de brancos: %d",brancos);
$
$
Apostila de Linguagem de Programao C - Mdulo II
printf("\n No de outros: %d",outros);
getchar();getchar();
}
void analisa (char linha[], int *pv, int *pc, int *pd, int *pb, int *po)
{ char c;
int cont=0;
while ((c=toupper(linha[cont])) != '\0') {
if (c=='A' || c=='E' || c=='' || c=='O'|| c=='U')
++ *pv;
else if (c>= 'A'&& c<='Z')
++ *pc;
else if (c>='0' && c<='9')
++ *pd;
else if (c==' ' || c=='t')
++ *pb;
else ++*po;
++ cont;
}
}
Exemplo$:- O programa abaixo l um vetor de nmeros inteiros e eleva cada um
dos seus elementos ao quadrado armazenado o resultado no prprio vetor. Os
%&
%&
Apostila de Linguagem de Programao C - Mdulo II
elementos do vetor so enviados um por um para uma funo que calcula o
quadrado do nmero.
#include <stdio.h>
#include <conio.h>
void eleva (int *x);
void main()
{ int x[10];
int i;
clrscr();
for (i=0;i<9;i++){
gotoxy(10,i+2);
scanf("%d",&x[i]);
eleva(&x[i]);
printf("%d",x[i]);
}
getchar();
}
void eleva (int *x)
{*x=*x * *x;}
%%
%%
Apostila de Linguagem de Programao C - Mdulo II %2
%2
Apostila de Linguagem de Programao C - Mdulo II
2. %ON&E'(OS
Uma das mais poderosas caractersticas oferecidas pela Linguagem "C o uso
de ponteiros.
Um ponteiro proporciona um modo de acesso a variveis sem referenci-las
diretamente. O mecanismo usado para isto o endereo da varivel.
"s ints guardam inteiros4 os floats guardam nQmeros de ponto flutuante 4 os c!ars
guardam caracteres e os ponteiros guardam endereos de mem6ria.
Um ponteiro uma varivel que contm um endereo de memria. Esse
endereo normalmente a posio de uma outra varivel na memria. Se uma
varivel contm o endereo de uma outra, ento diz-se que a 1 varivel aponta
para a se!unda".
Podemos destacar algumas razes para o uso de ponteiros.
@. Ponteiros so usados em situaes em que a passagem de argumentos
valores difcil ou ainda quando deseja-se retornar mais que uma
informao para uma funo;
@. Passar matrizes e strings de uma funo para outra;
@. Para manipular matrizes (aritmtica de ponteiros);
@. Para criar estruturas de dados mais complexas como: listas encadeadas
e rvores binrias;
@. Para localizao de memria livre atravs da funo malloc();
@. Para compilao mais eficiente do cdigo => notao de ponteiros
mais rpida.
Opera"ores )sso*+a"os a %o,!e+ros
& - operador unrio que devolve o endereo da memria do seu operando;
* - operador unrio que devolve o contedo da varivel localizada no
endereo de memria do seu operando, que uma varivel ponteiro.
Ponteiros tambm tem tipos. Quando declaramos um ponteiro ns informamos ao
compilador para que tipo de varivel o ponteiro est apontando.
%3
%3
Apostila de Linguagem de Programao C - Mdulo II
Forma Geral :-
tipo *identificador;
Exemplo:-
int Sp)4SpC;
Para atri2uir valores as vari%veis ponteiro e para acessar as informa#es usamos:<
Sp)HT;
SpCHK;
Na declarao4 o s*m2olo S indica o tipo apontado /o ponteiro0 em outras situa#es indica o
conteQdo da vari%vel apontada.
" ponteiro deve ser iniciali!ado /apontado para algum lugar con5ecido0 antes de ser usado.
Ponteiros so sempre iniciali!ados com o valor D ou N.UU ento antes de us%<los devemos
atri2uir algum endereo v%lido a eles4 o &ue ( feito pelas instru#es:
p)HN);
pCHNC;
Exemplo:
int )HK4CHO;
int Sp)4SpC;
p)HN);
pCHNC;
printf/,p)HMp4 Sp)HMd4 Np)HMpRn-4 p)4Sp)4Np)0;
printf/,pCHMp4 SpCHMd4 NpCHMpRn-4 pC4SpC4NpC0;
" resultado ser%:
p)HOKFVV4 Sp)HK4 Np)HOKFWB
pCHOKFWD4 SpCHO4 NpCHOKFWF
%4
%4
Apostila de Linguagem de Programao C - Mdulo II
"$':< " formato Mp no printf indica &ue vai ser e)i2ido um endereo.
Na mem6ria:
X Y
KKK
OKFVV OKFWD
p) pC

OKFWB OKFWF
"nde: p) H? retorna o endereo para o &ual o ponteiro aponta;
Np) H? retorna o endereo do ponteiro;
Sp) H? retorna o conteQdo da vari%vel apontada.
Podemos fa!er algumas opera#es aritm(ticas com ponteiros. 1 primeira4 e mais simples4 (
a de igualar dois ponteiros p@HpB4 assim p@ aponta para o mesmo lugar &ue pB. 'e
&uisermos &ue a vari%vel apontada por p@ ten5a o mesmo conteQdo da vari%vel apontada
por pB devemos fa!er Sp@HSpB.
"utras opera#es com ponteiros tam2(m 2astante usadas so o incremento e o decremento.
Zuando incrementamos um ponteiro ele passa a apontar para o pr6)imo valor do mesmo
tipo para o &ual o ponteiro aponta /avana um nQmero de 2Ctes na mem6ria0 como por
e)emplo:
int Sp;
pLL; AA avana dois 2Ctes na mem6ria
p<<; AA decrementa dois 2Ctes na mem6ria
!4##
#
!4$&
!
%
%
Apostila de Linguagem de Programao C - Mdulo II
Para incrementar o conteQdo da vari%vel apontada pelo ponteiro p temos:
SpLL;
"utras opera#es podem ser efetuadas com ponteiros como a adio e su2trao de inteiros
com ponteiros4 2em como os operadores de /HH 4 GH4 ?4 >4 ?H4>H0.
E)emplos:
pHpL@K; AA desloca o ponteiro @K posi#es;
S/pL@K0; AA utili!a o conteQdo do ponteiro @K posi#es adiante;
p@?pB; AA compara &ual dos dois ponteiros est% mais adiante na mem6ria.
E)istem opera#es &ue no podem ser efetuadas com ponteiros4 como por e)emplo dividir
ou multiplicar ponteiros.
E)emplos:<
=include >stdio.5?
void main/0
8
int num4valor;
int Sp;
numH[D;
pHNnum; AA rece2e o endereo de num
%!
%!
Apostila de Linguagem de Programao C - Mdulo II
valorHSp; AA valor rece2e o mesmo conteQdo de num
printf/,RnRn Md Rn-4valor0;
printf/,Endereo para onde o ponteiro aponta: Mp Rn-4p0;
printf/,\alor da vari%vel apontada: Md Rn-4Sp0;
SpH@DD; AA modifica o conteQdo da vari%vel num indiretamente
printf/,\alor da vari%vel modificada Md Rn-4Sp0;
9
%ON&E'(OS E M)&('-ES
.ma das aplica#es mais importantes com ponteiros e a varredura se&]encial de uma
matri!4 isto (4 &uando temos &ue percorrer todos os elementos de uma matri! de uma forma
se&]encial4 podemos usar um ponteiro incrementando<o at( o final da matri!.
Em uma matriz o prprio nome da matriz o endereo do primeiro elemento da
matriz. Portanto, se x uma matriz unidimensional, ento, o endereo do primeiro
elemento da matriz pode ser expresso &x[0] ou simplesmente x. Alm disso o
endereo do segundo elemento da matriz pode ser expresso por &x[1] ou (x + 1),
e assim por diante at o ensimo elemento da matriz &x[ i ] ou (x + i). Desta forma
temos dois modos diferentes de acessar os elementos de uma matriz. A vantagem
de se utilizar ponteiros que o acesso mais rpido.
Na expresso (x + i) x representa o endereo e i representa uma quantidade
inteira que significa i elementos depois do primeiro (deslocamento).
Como &x[ i ] e (x + i) representam o endereo do insimo elemento de x, x[ i ] e *(x
+ i) representam o contedo desse endereo.
Exemplo:
#include <stdio.h>
#include <conio.h>
void main()
%"
%"
Apostila de Linguagem de Programao C - Mdulo II
{ int x[10], i;
clrscr();
for (i=0;i<=9;i++)
{
scanf("%d,&x[i]);
printf(\n i= %d x[i]= %d *(x+i) = %d &x[i] = %p x+1 = %p,i , x[i], *(x+i),
&x[i], x+i);
}
getchar();
}
Resultado:-
i = 0 x[ i ]= 10 *(x+i) = 10 &x[ i ] = 72 x + i=72
i = 1 x[ i ]= 11 *(x+i) = 11 &x[ i ] = 74 x + i=74
i = 2 x[ i ]= 12 *(x+i) = 12 &x[ i ] = 76 x + i=76
i = 3 x[ i ]= 13 *(x+i) = 13 &x[ i ] = 78 x + i=78
i = 4 x[ i ]= 14 *(x+i) = 14 &x[ i ] = 7A x + i=7A
......
Ponteiros associados a matrizes substituem com vantagem a indexao de
matrizes sendo um processo conhecido com aritmtica de ponteiros.
Exemplo1:- Desenvolver um programa que dado um vetor de 10 elementos
numricos inteiros calcular um outro vetor que dever conter os elementos do 1
vetor elevados ao quadrado. Usar aritmtica de ponteiros.
#include <stdio.h>
%#
%#
Apostila de Linguagem de Programao C - Mdulo II
#include <conio.h>
#include <math.h>
void main()
{
int vet1[10],vet2[10],x;
clrscr();
for(x=0;x<10;x++)
{ scanf("%d",(vet1+x)); // no precisa &
*(vet2+x)=pow(*(vet1+x),2);
printf("%d\n",*(vet2+x));
}
getchar();
}
OU
void main()
{
int vet1[10],vet2[10],x,*pt;
clrscr();
pt=vet1; // no precisa & porque o nome de uma matriz um
ponteiro
for(x=0;x<10;x++)
{ scanf("%d",(pt+x));
*(vet2+x) = pow (*(pt+x),2);
%$
%$
Apostila de Linguagem de Programao C - Mdulo II
printf("%d\n",*(vet2+x);}
getchar();
}

Exemplo2:- Dados dois vetores numricos de 5 elementos cada desenvolver um
programa utilizando aritmtica de ponteiros que compare os elementos desses
vetores.
#include <stdio.h>
#include <conio.h>
void main()
{ float x[5],y[5],i;
clrscr();
for (i=0;i<5;i++)
{ scanf("%f, x+1);
scanf("%f, y+1);
if (*(x+i) < *(y+i)) printf("%f o menor,*(x+i));
else if (*(x+i) == *(y+i)) printf("%f e %f so iguais,*(x+i),*(y+i));
else printf("%f o maior, *(y+i));
}
getchar();
}
3. Es!r!ras. U,+/es. &+pos 0e1+,+"os e E,mera/es
2&
2&
Apostila de Linguagem de Programao C - Mdulo II
1 Uinguagem ,C- permite &ue se crie v%rios tipos diferentes de dados &ue possam ser
agrupados de formas definidas. Essas formas so um tipo de dado definido pelo
programador e so con5ecidas como: estruturas e uni#es.
ES&(U&U()
.ma estrutura ( uma coleo de tipos diferentes referenciadas por um nome4 isto (4 a
estrutura ( uma forma de se ter informa#es agrupadas.
^orma _eral:
struct nome 8
tipo nome7da7vari%vel;
tipo nome7da7vari%vel; elem. da estrutura
....
9 vari%veis da estrutura;
"$':< 1 struct ( um tipo de dado4 no e)iste um espao reservado na mem6ria para ela at(
&ue sePa declarada uma vari%vel para arma!enar o tipo definido.
E)emplo:< struct ve*culo 8
c5ar modeloIBKJ;
c5ar marcaI@KJ;
float custo;
9; AS leva ; SA
ve*culo carro;
onde: ve*culo ( o nome da estrutura e carro ( o nome da vari%vel &ue tem o tipo de
estrutura ve*culo.
"utra forma de declarar uma estrutura pode ser:<
struct ve*culo 8
c5ar modeloIBKJ;
c5ar marcaI@KJ;
2%
2%
Apostila de Linguagem de Programao C - Mdulo II
float custo;
9 carro;
AS ( poss*vel com2inar as duas declara#es. SA
'e tivermos duas ou mais vari%veis &ue so do mesmo tipo de estrutura podemos:
struct )C 8
int );
float C;
9 a42;
AS onde a e 2 so duas vari%veis do mesmo tipo;
Para referenciar cada elemento da estrutura utili!a<se o operador ponto.
^orma _eral:< nome7da7vari%velnome7do7elemento;
Exemplo:-
a . ) H@D; 2 . ) HK;
a . C HB.K; 2 . C H D.K;
gets/carro.modelo0;
scanf/,Mf-4Ncarro.custo0;
` poss*vel tam2(m ter<se uma matri! de estruturas. E)emplos:
struct ve*culo 8
c5ar modeloIBDJ;
c5ar marcaI@KJ;
float custo;
9 carroI@DDJ;
AS isto cria @DD conPuntos de vari%veis &ue esto organi!adas com os elementos acima SA.
Para referenciar cada elemento da estrutura utili!a<se:
gets/carroIDJ.marca0;
gets/carroIDJ.modelo0;
scanf/,Mf-4 NcarroIDJ.custo0;
22
22
Apostila de Linguagem de Programao C - Mdulo II
....
Para simplificar esta estrutura poder*amos ter:<
for /)HD;)>@DD;)LL0
8 gets/carroI)J.marca0;
gets/carroI)J.modelo0;
scanf/,Mf-4 NcarroI)J.custo0; 9
UN'2O
'o estruturas &ue possuem v%rios tipos diferentes de dados. Em uma ,union, os elementos
compartil5am a mesma %rea de mem6ria4 en&uanto em uma ,struct- cada elemento tem sua
pr6pria %rea de mem6ria. 1ssim as uni#es so utili!adas com a finalidade de economi!ar
mem6ria. Em uma unio o compilador se encarrega de conta2ili!ar a mem6ria necess%ria
para arma!enar os mem2ros.
^orma _eral:<
union nome 8
tipo nome7da7vari%vel;
tipo nome7da7vari%vel;
....
9 vari%veis7da7unio;
E)emplo:<
union modelo 8
c5ar corI@BJ;
int taman5o;
9 cala4camisa;
Cada uma dessas vari%veis cala e camisa podem representar uma string de I@BJ caracteres
e um nQmero inteiro em um determinado momento do programa.
Para acessar um elemento de uma unio utili!a<se a mesma sinta)e &ue ( utili!ada para
estrutura.
23
23
Apostila de Linguagem de Programao C - Mdulo II
"$':< .ni#es so usadas fre&]entemente &uando so necess%rias convers#es de tipos
diferentes;
ENUME()ES
` um conPunto de constantes inteiras &ue especifica todos os valores legais &ue uma
vari%vel desse tipo pode ter.
^orma _eral:<
enum nome 8lista de enemerao9 lista7de7vari%veis;
"$':< o nome e a lista de vari%veis ( opcional.
1s enumera#es so an%logas as estruturas. Cada s*m2olo representa um valor inteiro. Pode
ser usado em &ual&uer lugar em &ue um inteiro pode ser usado. " valor do @a s*m2olo da
enumerao ( D. 1 cada s*m2olo o inteiro ( incrementado.
E)emplo:< enum semana 8'egundaHB4 tera4 &uarta4&uinta4se)ta9;
semana u;
uH&uinta;
printf/,Mi-4u0;
/* o resultado do printf ser o nmero 5 porque quinta o quarto valor da lista, que
comea no nmero 2. O default comear no zero.
possvel especificar o valor de um ou + smbolos usando um inicializador. sto ,
colocando-se um sinal de igual e um valor inteiro aps o smbolo.
Exemplo:- enum moeda {dolar=1,iene,lira,libra};
Neste caso os valores dos smbolos sero: dolar=1; iene=2;lira=3;libra=4;
Uma spos+3o *omm. por4m err5,ea. so6re e,mera/es 4 7e os
s8m6olos po"em ser e,9+a"os e re*e6+"os "a e,!ra"a "e "a"os. 's!o ,3o
a*o,!e*e.
Exemplo:- moeda=dolar;
Printf("%d,moeda);
OBS:- Dolar simplismente um nome para um inteiro,no uma string.
24
24
Apostila de Linguagem de Programao C - Mdulo II
Uma enumerao freqentemente usada para definir uma tabela de smbolos de
um compilador, por exemplo.
&'%OS 0EF'N'0OS %E:O USU;('O
" usu%rio ainda pode definir um novo nome para o tipo de dado &ue ele desePa declarar.
Essa forma de declarao sugere a mesma finalidade da estrutura4 mas so fre&]entemente
utili!ados para tornar os programas mais port%teis e tam2(m para documentao e
padroni!ao permitindo nomes mais definidos.
^orma _eral : < tCpedef tipo novo7tipo;
E)emplo@:< tCpedef int idade;
idade 5omem4mul5er;
"nde: 5omem e mul5er so duas vari%veis e&uivalentes do tipo inteiro.
E)emploB:< tCpedef struct 8
int a;
float 2;
9 num;
num );
"nde: ) possue dois elementos ).a do tipo inteiro e ).2 do tipo ponto flutuante.
" recurso do tCpedef pode ser usado repetidamente para padroni!ar um tipo de dado em
relao aos outros tipos.
E)emplo:< tCpedef struct 8
int dia;
int ms;
int anos;
9 data;
data dat;
.....
2
2
Apostila de Linguagem de Programao C - Mdulo II
no programa: dat.diaH@D; dat.msH@B; dat.anoH@WWV;
Exemplos de programas utilizando os comando dados:
Exemplo1: O programa abaixo contem uma estrutura que armazena o nmero da
conta e o saldo de 5 clientes. O programa calcula o saldo mdio dos 5 clientes e
exibe na tela quais os clientes que possuem saldo acima ou igual a mdia.
#include <stdio.h>
#include <conio.h>
void main()
{
struct cliente
{ char conta[20];
float saldo;
};
cliente cli[5];
float saldo_medio=0,aux;
int x;
for (x=0;x<5;x++)
{
clrscr();
printf("\t\t\t CONTROLE BANCARO \n");
2!
2!
Apostila de Linguagem de Programao C - Mdulo II
printf("\t Nr da Conta.........: ");gets(cli[x].conta);
printf("\t Saldo ..............: ");scanf("%f",&aux);
cli[x].saldo=aux;
saldo_medio += cli[x].saldo;
getchar();
}
saldo_medio=saldo_medio/5;
clrscr();
printf("\t\t CLENTES COM SALDO ACMA DA MEDA \n\n\n");
printf("\t Nr da conta \t Saldo \n\n");
for (x=0;x<5;x++)
{ if (cli[x].saldo >=saldo_medio)
printf("\t %s \t\t %8.2f \n", cli[x].conta,cli[x].saldo);
}
getchar();
}
Exemplo2:- O programa abaixo contem uma unio para armazenar o ano de
nascimento e a idade de um aluno e uma estrutura que armazena o ra, o nome e a
idade do aluno. O programa l os dados calcula e exibe a idade utilizando as
estruturas de armazenamento.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
2"
2"
Apostila de Linguagem de Programao C - Mdulo II
void main()
{
union id
{ int ano_nas;
int i;
};
struct classe
{ char ra[10];
char nome[20];
id idade;
}aluno;
struct time t;
struct date d;
clrscr();
gettime(&t);
getdate(&d);
printf("Data :%02d/%02d/%4d\n", d.da_day,d.da_mon,d.da_year);
printf("Hora: %2d:%2d:%2d\n", t.ti_hour,t.ti_min,t.ti_sec);
printf("\t\t\t CONTROLE DE ALUNOS \n\n\n");
printf("\t Registro Academico.....: ");gets(aluno.ra);
printf("\t Nome...................: ");gets(aluno.nome);
2#
2#
Apostila de Linguagem de Programao C - Mdulo II
printf("\t Ano de Nascimento......: ");scanf("%d",&aluno.idade.ano_nas);
aluno.idade.i= d.da_year - aluno.idade.ano_nas;
printf("\t dade..................: %d",aluno.idade.i);
getchar();getchar();
}
Exemplo3:- O programa abaixo l o nome de uma pessoa, o valor e o tipo de
moeda e faz a converso utilizando tipo definido e tipo enumerado.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void main()
{
typedef char string;
typedef float real;
string nome[30];
real valor,valor_conv;
enum moeda {dolar=1,franco,libra};
moeda x;
clrscr();
printf("\t\t\t CAMBO \n\n\n");
printf("\t Nome...................: ");gets(nome);
2$
2$
Apostila de Linguagem de Programao C - Mdulo II
printf("\t Valor..................: ");scanf("%f",&valor);
printf("\t 1. Dolar \n");
printf("\t 2. Franco \n");
printf("\t 3. Libra \n\n");
printf("\t\t OPCAO <1-3> ");scanf("%d",&x);
switch (x) {
case 1:valor_conv=valor/1.12; printf("\t Valor Convertido %10.2f em
dolar",valor_conv); break;
case franco:valor_conv=valor/1.473; printf("\t Valor Convertido %10.2f
em franco",valor_conv);break;
case libra:valor_conv=valor/1.101; printf("\t Valor Convertido %10.2f em
libra",valor_conv);break;
default: printf("\tMoeda nvalida !!");
}
getchar();getchar();
}
Exemplo4:- O exemplo abaixo l as informaes de um cliente como: nome,
nmero da conta, tipo e saldo e armazena em uma estrutura. As informaes da
estrutura so enviadas para uma funo que calcula um reajuste no saldo
dependendo do tipo de conta do cliente.
#include <stdio.h>
#include <conio.h>
struct teste{
char nome[20];
3&
3&
Apostila de Linguagem de Programao C - Mdulo II
char numcont[15];
char tipo;
float saldo;
};
void ajuste (teste *cliente);
void main()
{ teste pess;
int i;
float sal;
clrscr();
printf("Nome....: \n");gets(pess.nome);
printf("Numero Conta...:\n");gets(pess.numcont);
printf("Tipo da Conta..:\n");scanf("%c",&pess.tipo);
printf("Saldo..........:\n");scanf("%f",&sal);
pess.saldo=sal;
ajuste(&pess);
printf("Novo Saldo.....:%8.2f\n",pess.saldo);
getchar();getchar();
}
void ajuste(teste *cliente)
{
if (cliente->tipo=='P') cliente->saldo = cliente->saldo*1.10;
3%
3%
Apostila de Linguagem de Programao C - Mdulo II
else cliente->saldo=cliente->saldo*1.05;
}
OBS:- para utilizar os elementos da estrutura necessrio usar o operador seta (-
>).
Exemplo$:- Outra forma de resolver o mesmo exerccio.
#include <stdio.h>
#include <conio.h>
struct teste{
char nome[20];
char numcont[15];
char tipo;
float saldo;
};
void ajuste (char tipo,float *vl);
void main()
{ teste pess;
int i;
float sal;
clrscr();
printf("Nome....: \n");gets(pess.nome);
printf("Numero Conta...:\n");gets(pess.numcont);
32
32
Apostila de Linguagem de Programao C - Mdulo II
printf("Tipo da Conta..:\n");scanf("%c",&pess.tipo);
printf("Saldo..........:\n");scanf("%f",&sal);
pess.saldo=sal;
ajuste(pess.tipo,&pess.saldo);
printf("Novo Saldo.....:%8.2f\n",pess.saldo);
getchar();getchar();
}
void ajuste(char tipo,float *vl)
{
if (tipo=='P') *vl = *vl * 1.10;
else *vl=*vl * 1.05;
}
Exemplo<:- O mesmo exerccio anterior usando uma matriz de estruturas.
#include <stdio.h>
#include <conio.h>
struct teste{
char nome[20];
char numcont[15];
char tipo;
float saldo;
};
void ajuste (teste cliente[5]);
33
33
Apostila de Linguagem de Programao C - Mdulo II
void main()
{ teste pess[5];
int x;
float sal;
clrscr();
for (x=0;x<5;x++)
{
printf("Nome....: \n");gets(pess[x].nome);
printf("Numero Conta...:\n");gets(pess[x].numcont);
printf("Tipo da Conta..:\n");scanf("%c",&pess[x].tipo);
printf("Saldo..........:\n");scanf("%f",&sal);
pess[x].saldo=sal; getchar();
}
ajuste(pess);
for (x=0;x<5;x++)
{
printf("Novo Saldo.....:%8.2f\n",pess[x].saldo);}
// as informacoes serao modificadas na variavel real
getchar();getchar();
}
void ajuste(teste cliente[5])
{ int x;
for (x=0;x<5;x++)
34
34
Apostila de Linguagem de Programao C - Mdulo II
{
if (cliente[x].tipo=='P') cliente[x].saldo = cliente[x].saldo*1.10;
else cliente[x].saldo=cliente[x].saldo*1.05;
}
}
F. )(=U'>OS
Quando desenvolvemos programas de computadores muito comum precisarmos
"guardar dados para posterior recuperao. A recuperao dos dados pode ser
alguns minutos depois, dias depois, ou at mesmo anos depois do
armazenamento inicial. Sendo assim dados que precisam ser guardados por um
tempo indeterminado ficam armazenados em arquivos.
At o momento somente trabalhamos com o conceito de dados armazenados de
forma temporria (em memria principal). Quando desejamos armazenar dados
por um perodo de tempo indeterminado, podendo reutiliz-los, modific-los e ou
continuar a armazenar mais dados utilizamos arquivos.
#$%U&'( :- um conjunto de registros logicamente organizados armazenados
em um dispositivo de memria secundria (disco rgido, disquetes, fitas
magnticas, cd, etc), onde cada registro compreende um conjunto de informaes
denominadas campos. Em um arquivo possvel armazenar um volume grande
de dados.
3
3
Apostila de Linguagem de Programao C - Mdulo II
Um arquivo formado por um ou mais registros, que por sua vez, como j
sabemos, formado por um conjunto de campos.
O sistema de E/S em "C fornece uma interface que permite a utilizao de
qualquer dispositivo real de armazenamento (console, disco rgido, disco flexvel,
fita magntica, etc). Embora cada um dos dispositivos seja muito diferente, o
sistema de E/S os transforma em um dispositivo lgico independente, chamado
de stream. sto significa que a mesma funo, pode escrever em um arquivo em
disco ou em um outro dispositivo qualquer. Sendo assim na abertura do arquivo
necessrio informar a associao da stream com o dispositivo especfico de
armazenamento.
Para que um programa em "C possa ler e gravar dados em um arquivo podemos
utilizar vrias maneiras. A linguagem "C divide as categorias de acesso a disco
em dois grupos chamados alto nvel, ou leitura e gravao bufferizada e de baixo
nvel, ou leitura e gravao no bufferizada. Neste curso iremos estudar a
categoria do grupo de alto nvel por possuir algumas vantagens sobre a de baixo
nvel, entre elas: a facilidade para ler e gravar qualquer tipo de dado e a
portabilidade, seguindo padres definidos pela ANS, o que no ocorre com o
grupo de baixo nvel. Outra vantagem da categoria de alto nvel poder contar
com a utilizao de vrias funes de biblioteca para leitura e gravao de dados
no arquivo, como por exemplo: dados lidos e escritos um caracter por vez; dados
lidos e escritos como strings; dados lidos e escritos de modo formatado; dados
REI!TR
"
3!
3!
Apostila de Linguagem de Programao C - Mdulo II
lidos e escritos num formato chamado registro. A forma mais comum armazenar
as informaes em registros, isto estruturas, para posteriormente serem
gravadas no arquivo.
Alm das duas categorias de acesso ao disco anteriormente discutidas na
linguagem de programao "C possvel classificar os arquivos conforme a forma
como eles so abertos: em modo texto ou em modo binrio.
Um arquivo aberto em modo texto interpretado em "C como sendo uma
seqncia de caracteres agrupados em linhas que devem ser separadas por um
caracter de nova linha, as informaes numricas tambm so armazenadas em
cadeias de caracteres, enquanto que, no modo binrio tudo muito mais simples.
No h necessidade de nenhuma converso de tipos. Para os tipos numricos na
forma binria eles so armazenados como esto na memria, nem mesmo a
indicao de final de arquivo necessria pois acaba sendo interpretada
automaticamente. Sendo assim estaremos utilizando leitura e gravao em alto
nvel com modo de acesso binrio.
Por ser o arquivo uma unidade separada, o que o torna independente, pode ser
criado, consultado e alterado por programas distintos, sendo uma estrutura fora do
ambiente do programa. O nmero mximo de arquivos que podem ser abertos
simultaneamente por um programa depende das consideraes tomadas no
projeto do compilador e das restries do S.O. que geralmente superior a 8
arquivos. Para isso necessrio que seja informado ao S.O. quem o arquivo,
onde as informaes sero lidas e ou gravadas.
O%E()ES ?;S'@)S @OM )(=U'>O
Para utili!armos a estrutura de dados do tipo ar&uivo fa!emos o uso de opera#es 2%sicas
como: a2rir4 fec5ar4 apagar4 copiar e renomear.
ABRIR O ARQUIVO:< Para podermos utili!ar as informa#es contidas no ar&uivo ou para
guard%<las nesse ar&uivo devemos primeiramente a2rir o ar&uivo:
3"
3"
Apostila de Linguagem de Programao C - Mdulo II
Quando solicitamos a abertura de um arquivo necessria a declarao de uma
estrutura do tipo F':E
1
que receber um ponteiro para o arquivo que est sendo
aberto. Para que o S.O. possa abrir o arquivo trs informaes devem ser
fornecidas: o nome do arquivo, o tipo de abertura (se o arquivo est sendo lido
ou gravado) e onde guardar as informaes sobre o arquivo. sso tudo possvel
com a funo 1ope,AB que se encarrega de: preencher a estrutura FLE com as
informaes necessrias. O resultado dessa funo ser retornar um ponteiro do
tipo FLE que aponta para a localizao na memria da estrutura FLE.
Esta operao ocorre da seguinte forma:
"orma #eral:<struct nome7da7estrutura
8 tipo nome@;
tipo nomeB;
9;
"$%E Sponteiro;
ponteiroHfopen/,D:nome.e)t-4-modo-0;
Os arquivos podem ser utilizados de vrios modos diferentes conforme descrito na
tabela abaixo:
MO0O S'GN'F'@)0O
r Abre um arquivo texto para leitura. O arquivo deve existir.
w Cria um arquivo texto para escrita. Se o arquivo exitir ser recriado por cima caso no
exista ser criado.
a Abre um arquivo texto para gravao.Se o arquivo existir os dados sero anexados no
@ A estrutura 'IL( )ont*m in+orma,es so-re o ar.ui/o tais )omo0 seu taman1o atual2 a lo)ali3ao de seus
-u++ers de dados2 se o ar.ui/o est4 sendo lido ou gra/ado2 et).
PR"R#M#
EM $C%
!&" &
'I!C"
5ome do ar.ui/o
e tipo de a-ertura
Ponteiro para
a estrutura
'IL(
3#
3#
Apostila de Linguagem de Programao C - Mdulo II
final do arquivo se no existir ser criado um novo.
r+ Abrir um arquivo texto para leitura e gravao. O arquivo tem que existir.
w+ Abre um arquivo texto para leitura e gravao. Se o arquivo existir ser recriado por
cima. Se no existir ser criado.
a+ Abre um arquivo texto para atualizao e para adicionar dados no fim do arquivo se ele
existir se no cria-se um novo arquivo
rb Abre um arquivo binrio para leitura. O arquivo deve existir.
wb Cria um arquivo binrio para escrita. Se o arquivo exitir ser recriado por cima caso no
exista ser criado.
ab Abre um arquivo binrio para gravao.Se o arquivo existir os dados sero anexados no
final do arquivo se no existir ser criado um novo.
rb+ Abre um arquivo binrio para leitura e gravao. O arquivo deve existir e pode ser
atualizado.
wb+ Abrir um arquivo binrio para leitura e gravao. Se o arquivo existir ele ser destrudo
e reinicializado. Se no existir ser criado.
ab+ Abrir um arquivo binrio para atualizao e para adicionar dados ao fim do arquivo
existente ou um novo arquivo ser criado.
E)emplo:
struct aluno
8 c5ar raIWJ;
c5ar nomeIBDJ;
float media;
9;
^IUE S1EZ;
1EZHfopen /,1:curso.dat-4-a2L-0;
Depois de estabelecer a linha de comunicao com o arquivo e o S.O. o prximo
passo ser ler ou gravar informaes nesse arquivo.
FECHAR ARQUIVO:< +odo ar&uivo a2erto dever% ser fec5ado para garantir a integridade
dos dados arma!enados4 caso isso no ocorra poder% 5aver perda de informa#es. 1 funo
3$
3$
Apostila de Linguagem de Programao C - Mdulo II
para fec5ar um ar&uivo ( fclose().
"orma #eral:
fclose/ponteiro0;
onde: ponteiro ( o nome da vari%vel ponteiro da estrutura ^IUE.
APAGAR ARQUIVO:< Deleta um ar&uivo e)istente. +odo ar&uivo antes de ser apagado deve
ser fec5ado.
"orma #eral:
remove/nome f*sico do ar&uivo0;
onde: nome dado ao ar&uivo de dados.
Esta funo devolve !ero caso sePa 2em sucedida e um valor diferente de !ero caso
contr%rio.

RENOMEAR ARQUIVO:- Permite mudar o nome do ar&uivo e)istente para um outro nome
diferente. 1ntes de renomear o ar&uivo deve ser fec5ado.
"orma #eral:
rename/nome f*sico do ar&uivo4novo nome f*sico do ar&uivo0;
onde: Nome dado ao ar&uivo de dados e o novo nome &ue ser% dado
" comando rename/0 retorna !ero se a operao ocorreu com sucesso.
O%E()ES ?;S'@)S @OM (EG'S&(O 0E UM )(=U'>O
Zuando P% temos um ar&uivo a2erto4 podemos tanto ler os registros P% arma!enados no
ar&uivo como escrever /gravar0 novos registros no ar&uivo.
LER REGISTRO DO ARQUIVO:- &uando lemos um registro de um ar&uivo estamos
transferindo os dados do registro do ar&uivo4 arma!enados em mem6ria secund%ria4 para a
mem6ria principal do computador /mem6ria E10. Para isto utili!amos a seguinte
instruo:
4&
4&
Apostila de Linguagem de Programao C - Mdulo II
"orma #eral:
fread(&estruturasi'eof(estrutura)1ponteiro);
(nde: Nestrutura < ( o endereo na mem6ria onde os dados sero lidos;
si!eof/estrutura0 ; operador &ue retorna o taman5o da estrutura;
@: &uantidade de estruturas a ser lida /normalmente @0;
ponteiro: o nome do ponteiro da estrutura ^IUE.
Normalmente a funo fread/0 retorna o nQmero de registros lidos4 &ue deve ser igual ao
terceiro argumento &ue ( igual a @. 'e for final de ar&uivo o nQmero &ue ir% retornar ser%
!ero.
ESCREVER UM REGISTRO NO ARQUIVO (GRAVAR) :- &uando escrevemos /gravamos0
um registro num ar&uivo4 estamos transferindo os dados do registro4 arma!enados em
mem6ria principal4 para a mem6ria secund%ria do computador /dis&uete4 disco r*gido4 CD4
etc0. .tili!amos a seguinte instruo:
"orma #eral:
f)rite(&estruturasi'eof(estrutura)1ponteiro);
(nde:Nestrutura<( o endereo na mem6ria onde os dados sero arma!enados;
si!eof/estrutura0 ; operador &ue retorna o taman5o da estrutura;
@: &uantidade de estruturas a ser gravada /normalmente @0;
ponteiro: o nome do ponteiro da estrutura ^IUE.

(*#+N$,+-.( /E +*01$2(3
1s opera#es reali!adas com registros em uma estrutura de dados do tipo ar&uivo podem
ser resumidas em: insero de um novo registro /incluso04 o2teno de um registro do
ar&uivo /consulta04 modificao dos dados arma!enados no ar&uivo /alterao0 ou remoo
de um registro do ar&uivo /e)cluso0. Dependendo do tipo de pro2lema estas opera#es
podero ocorrer em maior ou menor escala.
Neste caso ( necess%rio &ue sePa analisada &ual ( a mel5or forma de acessar esses
4%
4%
Apostila de Linguagem de Programao C - Mdulo II
registros. $asicamente e)istem duas formas diferentes de acesso aos registros de um
ar&uivo: o acesso se&]encial e o acesso direto /tam2(m con5ecido como randbmico0.
E)istem outras formas de acesso &ue so varia#es destas &ue no sero tratadas.
Ae!!o Se"#e$%&l: Zuando desePamos ter acesso aos dados de um determinado registro
mas no sa2emos a locali!ao desse registro no ar&uivo devemos vascul5ar o ar&uivo
desde o in*cio em 2usca do registro desePado at( o final do ar&uivo se necess%rio. Esta
operao dever% ser repetida se&]encialmente4 isto (4 avanando pelos registros
arma!enados at( &ue se encontre o registro procurado. Isto significa &ue para acessar um
registro espec*fico precisamos o2edecer a ordem com &ue os registros foram arma!enados
no ar&uivo4 o &ue implica em percorrer todos os registro &ue o antecedem.
Ae!!o D%'e(o o) R&$*+m%o: Neste caso para acessarmos o registro desePado ( necess%rio
&ue sai2amos a sua posio f*sica /posio do registro no ar&uivo no instante da gravao0.
Dessa forma ( poss*vel se posicionar instantaneamente no registro desePado sem ter &ue
percorrer todos os registros &ue o antecedem. Para isto4 ( necess%rio con5ecer o nQmero da
posio f*sica do registro dentro do ar&uivo. 1 posio f*sica de um registro ( um nQmero
Qnico4 pois nunca dois registros diferentes podero ter a mesma locali!ao.
1 seguir sero listados alguns comandos &ue permitem a manipulao dos registros nos
ar&uivos de acesso se&]encial e direto.

@OM)N0OS E FUNES %)() M)N'%U:)2O 0E (EG'S&(OS
Para posicionar o ponteiro de arquivo para o registro desejado temos:
"orma #eral:
fsee4/ponteiro4si!eof/estrutura04deslocamento0;
(nde: ponteiro: ( o nome do ponteiro da estrutura ^IUE.
si!eof/estrutura0 ; operador &ue retorna o taman5o da estrutura;
deslocamento: posio especificada para o ponteiro do ar&uivo;
" Qltimo argumento /do deslocamento0 tam2(m ( c5amado de modo e pode utili!ar trs
42
42
Apostila de Linguagem de Programao C - Mdulo II
possi2ilidades de acordo com a ta2ela a2ai)o4 para determinar de onde o taman5o do
registro comear% a ser medido:
0ES@('2O
Pode ser uma macro
MO0O
Pode ser um nmero
Comeo do arquivo SEEK_SET 0
Posio corrente do ponteiro SEEK_CUR 1
Final do arquivo SEEK_END 2
Para indicar o final do ar&uivo usamos a funo feof/ 0 &ue retorna um nQmero inteiro
enviado pelo '." &ue indica final de ar&uivo.
"orma #eral:
feof/ponteiro0;
(nde: ponteiro ( o nome da vari%vel do tipo ^IUE;
No D"' a funo feof/0 retorna ;@ caso sePa final de ar&uivo e D caso contr%rio.
E)emplo:
c5ile / Gfeof/ponteiro00
fread/Nestrutura4si!eof/estrutura04@4ponteiro0;
Para posicionar o ponteiro de ar&uivo no in*cio do ar&uivo4 isto (4 no @a registro temos:
"orma #eral:
re)ind/ponteiro0;
(nde: Ponteiro ( o nome da vari%vel do tipo ^IUE.
1 funo ftell/0 retorna um nQmero inteiro longo &ue representa o nQmero de 2Ctes do
comeo do ar&uivo at( a posio atual.
"orma #eral:
ftell/ponteiro0;
(nde: Ponteiro ( o nome da vari%vel do tipo ^IUE.
43
43
Apostila de Linguagem de Programao C - Mdulo II
'e o nQmero &ue retornou dessa funo for dividido pelo taman5o da estrutura teremos o
nQmero da posio f*sica do registro.
E)emplo: " programa a2ai)o fa! a incluso4 consulta /por acesso se&]encial e
acesso direto04 a alterao4 a e)cluso e a reorgani!ao de um ar&uivo &ue
contem o modelo4 a marca e o preo de um ve*culo.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct veiculo {
char modelo[20];
char marca[20];
float preco;
};
FLE *parq; //variavel ponteiro de arquivo
veiculo reg;
void menu();
void abre_arquivo1();
void abre_arquivo2();
void inclusao();
void consulta_s();
void consulta_d();
void alteracao();
void exclusao();
void reorganizar();
void tela1();
void tela2();
char resposta();
void main()
{
abre_arquivo1();
menu();
fclose(parq);
}
/********************ABERTURA DE ARQUVO***********************/;
44
44
Apostila de Linguagem de Programao C - Mdulo II
void abre_arquivo1() // abertura para inclusao
{
parq=fopen("b:t3.dad","ab+"); //devolve o ponteiro do arquivo
if (parq==NULL)
{ printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
delay(1000);
exit(1); //volta para o editor do turbo C ou para o S.O.
}
}
void abre_arquivo2() //abertura para alteracao e exclusao
{
parq=fopen("b:t3.dad","rb+"); //devolve o ponteiro do arquivo
if (parq==NULL)
{ printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
delay(1000);
exit(1); //volta para o editor do turbo C ou para o S.O.
}
}
/**************************MENU**********************/;
void menu()
{ int op;
do{
clrscr();
gotoxy(20,2);printf("<<< M E N U D E O P C O E S >>>");
gotoxy(30,6);printf("1 - NCLUSAO ");
gotoxy(30,8);printf("2 - CONSULTA SEQUENCAL");
gotoxy(30,10);printf("3 - CONSULTA DRETA");
gotoxy(30,12);printf("4 - ALTERACAO");
gotoxy(30,14);printf("5 - EXCLUSAO");
gotoxy(30,16);printf("6 - FM ");
gotoxy(25,18);printf("Digite a opcao <1-6> ?");
do
{ gotoxy(47,18);clreol();scanf("%d",&op);
} while (op<1 || op>6);
if (op!=6)
{
switch (op)
{ case 1:inclusao();break;
case 2:consulta_s();break;
case 3:consulta_d();break;
case 4:alteracao();break;
case 5:exclusao();break;
}
}
}while (op!=6);
}
4
4
Apostila de Linguagem de Programao C - Mdulo II
/**************************NCLUSAO**********************/;
void inclusao()
{ char op;
int x;
long N;
fseek(parq,sizeof(reg),SEEK_END);
N=(ftell(parq)/sizeof(reg)-1); //-1 porque comecou do zero
do {
tela1();
getchar();
gotoxy(10,6);printf("O NMERO DO REGSTRO : %ld",N);
gotoxy(40,8);gets(reg.modelo);
gotoxy(40,10);gets(reg.marca);
gotoxy(40,12);scanf("%f",&reg.preco);
fseek(parq,N*sizeof(reg),SEEK_CUR);
fwrite(&reg,sizeof(reg),1,parq);
op=resposta(); //chamada a uma funcao resposta
N++;
}while(op!='N');
}
/**************************CONSULTA ACESSO SEQUENCAL****************/;
void consulta_s()
{ int num,lin=8;
tela2();
rewind(parq); // posiciona no inicio do arquivo
fread(&reg,sizeof(reg),1,parq);
while (!feof(parq))
{
gotoxy(10,lin);printf("%s",reg.modelo);
gotoxy(40,lin);printf("%s",reg.marca);
gotoxy(60,lin);printf("%10.2f",reg.preco);
fread(&reg,sizeof(reg),1,parq);
lin++;
}
getch();
}
/**************************CONSULTA ACESSO DRETO*****************/;
void consulta_d()
{ int num;
long tam;
4!
4!
Apostila de Linguagem de Programao C - Mdulo II
char op;
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2; // -2 porque comea do zero e o SEEK_END da o
nmero do proximo registro
do{
tela1();
gotoxy(10,6);printf("QUAL REGSTRO DESEJA CONSULTAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
op=resposta();
}while(op!='N');
}
/**************************ALTERACAO ACESSO DRETO******************/;
void alteracao()
{ int num;
long tam;
char op, resp[20]="";
fclose(parq);
abre_arquivo2();
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2;
do{
tela1();
gotoxy(10,6);printf("QUAL REGSTRO DESEJA ALTERAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
getchar();
gotoxy(40,8);gets(resp); //variavel para receber a alteracao
if (strcmp(resp,"") !=0)
{ strcpy(reg.modelo,resp);
4"
4"
Apostila de Linguagem de Programao C - Mdulo II
gotoxy(40,8);clreol();printf("%s",reg.modelo);
}
gotoxy(40,10);gets(resp);
if (strcmp(resp,"") !=0)
{ strcpy(reg.marca,resp);
gotoxy(40,10);clreol();printf("%s",reg.marca);
}
do{
gotoxy(40,12);gets(resp);
if (strcmp(resp,"") !=0)
{ reg.preco=atof(resp); //conversao de uma string em um float
gotoxy(40,12);clreol();printf("%8.2f",reg.preco);
}
}while (reg.preco <=0);
fseek(parq,num*sizeof(reg),SEEK_SET);
fwrite(&reg,sizeof(reg),1,parq);
op=resposta();
}while(op!='N');
fclose(parq);
abre_arquivo1();
}
/**************************EXCLUSAO LOGCA - ACESSO DRETO**********/;
void exclusao()
{ int num,cont=0;
long tam;
char op;
fclose(parq);
abre_arquivo2();
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2;
do{
tela1();
gotoxy(10,6);printf("QUAL REGSTRO DESEJA CONSULTAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
if (strcmp(reg.modelo,"***") == 0)
{ gotoxy(20,22);printf("Registro ja excluido !!");
delay(1000);
}
else
4#
4#
Apostila de Linguagem de Programao C - Mdulo II
{
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
gotoxy(40,19);printf("Confirma Exclusao ?");
op=resposta();
if (op=='S')
{ strcpy(reg.modelo,"***");
fseek(parq,num*sizeof(reg),SEEK_SET);
fwrite(&reg,sizeof(reg),1,parq);
cont++;
gotoxy(40,19);printf("Registro Excluido !!");delay(1000);
}
}
gotoxy(40,19);clreol();
op=resposta();
}while(op!='N');
fclose(parq);
abre_arquivo1();
//********************* reorganizar - exclusao fisica *****************
if (cont > 0) reorganizar(); // so reorganiza se tiver registros excluidos
}
void reorganizar()
{
FLE *parq2;
parq2=fopen("b:t3.bak","wb+"); //devolve o ponteiro do arquivo
fclose(parq);
abre_arquivo2();
rewind(parq);
while (! feof(parq))
{
if (fread(&reg,sizeof(reg),1,parq) >=1) // retorna 1 quando leu registro e 0
casocontrario
if (strcmp(reg.modelo,"***") !=0)
fwrite(&reg,sizeof(reg),1,parq2);
}
fclose(parq);
fclose(parq2);
remove("b:t3.dad");
rename("b:t3.bak","b:t3.dad");
abre_arquivo1();
}
4$
4$
Apostila de Linguagem de Programao C - Mdulo II
/**************************TELAS**********************/;
void tela2()
{
clrscr();
gotoxy(30,3); printf("CADASTRO DE VECULOS ");
gotoxy(10,5);printf("MODELO \t\t\t MARCA \t\t\t PRECO R$\n");
}
void tela1()
{
clrscr();
gotoxy(40,2);printf("CADASTRO DE VECULOS");
gotoxy(10,8);printf(" MODELO............: ");
gotoxy(10,10);printf(" MARCA.............: ");
gotoxy(10,12);printf(" PRECO.............: R$");
}
/**************************FUNCAO RESPOSTA**********************/;
char resposta()
{ char op;
gotoxy(40,20);printf("Deseja Continuar <S/N> ?");
do{
gotoxy(65,20);clreol();scanf("%c",&op);
op=toupper(op);
}while (op!='N' && op !='S');
return(op);
}
&
&