Escolar Documentos
Profissional Documentos
Cultura Documentos
Programao
IntroduoLinguagemC
Prof.Dr.AdrianoCaminha
adriano@puvr.uff.br
Profa.Dra.VeraCaminha
veracaminha@puvr.uff.br
ICEx/UFF
VoltaRedondaRJ
19992011
IntroduoProgramaoIntroduoLinguagemC
Sumrio
Funes..................................................................................................... 03
PerguntasBsicasparaCriaodeFunes......................................... 03
VariveisLocais....................................................................................... 04
ChamandoumaFuno........................................................................... 04
PassagemdeParmetrosporValor(Cpia).......................................... 05
Exerccios.................................................................................................. 06
Ponteiros................................................................................................... 07
OperadoresdePonteiros......................................................................... 07
AritmticadePonteiros........................................................................... 08
ComparaescomPonteiros.................................................................... 09
IndireoSimples..................................................................................... 09
IndireoMltipla................................................................................... 09
InicializaodePonteiros........................................................................ 10
PassagemdeArgumentosporReferncia.............................................. 12
PonteiroseVetores.................................................................................. 15
Exerccios.................................................................................................. 17
AlocaoDinmica................................................................................... 18
Exerccios.................................................................................................. 21
Registros................................................................................................... 22
RegistrosDentrodeRegistros................................................................. 23
VetoreseRegistros.................................................................................. 25
RegistrosePonteiros............................................................................... 26
Exerccios.................................................................................................. 28
Arquivos.................................................................................................... 28
AcessandoArquivosemC....................................................................... 29
AberturaeFechamentodeArquivos...................................................... 29
ModosdeAberturadeArquivos.............................................................. 29
FunesparaAcessarDadosdeArquivos.............................................. 30
Exerccios.................................................................................................. 34
Downloaddaapostila:www.templojava.org(cadastreseevisiteApostilaseLivros)
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 2
IntroduoProgramaoIntroduoLinguagemC
Funes
PerguntasBsicasparaCriaodeFunes
Sintaxe:
<tipo de retorno> <nome>(<parmetros>)
{
<declarao das variveis locais>
<bloco de instruo>
<valor de retorno se existir>
}
Onde:
<tipoderetorno>=float,int,void(vazioousemvalorde
retorno),etc.
<nome>=nomedafunoqueserutilizadonaschamadasfuno.
<parmetros> = Lista de valores recebidos pela funo para o
clculooutarefa.Afunopodenoterparmetros,nestecasoos
parntesesficarovazios.
Obs.:Assinatura=primeiralinhadadeclaraodafuno.
Exemplo: Funoqueimprimeumalinhanatela.
tarefa=imprimirlinha,
entrada=nenhumvalor,
retorno=nenhumvalor.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 3
IntroduoProgramaoIntroduoLinguagemC
#include <stdio.h>
//definio da funo
void linha()
{
printf("\n--------------------------\n");
}
//funo main com chamadas funo
main()
{ linha(); //chamada funo
printf("Aprendendo funcoes...");
linha(); //quantas vezes for necessrio
printf("Cada linha foi uma chamada");
linha(); //mais uma chamada
}
VariveisLocais
ChamandoumaFuno
PassagemdeParmetrosporValor(Cpia)
Exemplo:
#include <stdio.h>
//funo que imprime n vezes um caracter ch
void imprimeCaracter(char ch, int n)
{ int i; //varivel local
for(i=0; i<n; i++)
printf("%c", ch);
}
main()
{ //os parmetros devem ser chamados na ordem
//argumentos '*' e 35 (valores para ch e n)
imprimeCaracter('*', 35);
printf("\nEstudando passagem de parmetros.\n");
//outra chamada
imprimeCaracter('#', 40);
printf("\n\n");
}
Sintaxepararetornodevalor:
<tipo de retorno> <nome>(<parmetros>)
{ <declarao das variveis locais>
<bloco de instruo>
return <valor de retorno>;
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 5
IntroduoProgramaoIntroduoLinguagemC
Exerccio:Escreverumafuno paracadapardeparnteses da
equaoabaixo.Namain,lerdoisnmerosinteirospositivosxey,chamar
cadafunoutilizandoestesdoisinteiroscomoargumentosdeacordocom
cadaassinaturadecadafuno(svezesssernecessriopassarumdos
valores)edepoismostraroresultado.
Obs.:Nesteexerccio,osmbolo^serusadopararepresentarelevadoa.
E=(x*y)(x((x2)(y^3))^(1/2)+((4*x)^(1/2)))
Exerccios
Faaosexerccios09a19daLista3.
Comeceescrevendoosprogramasnocaderno,sdepois
passeparaoseueditorparaentooscompilareexecutar,
anotandonocadernoospossveiserrosecorrees.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 6
IntroduoProgramaoIntroduoLinguagemC
Ponteiros
Umponteiroumavarivelquecontmoendereodememriade
outravarivel.
possvelterumponteiroparaqualquertipodevarivel.
Quandoumponteironoapontaparanada,elepossuivalornulo
(null).
OperadoresdePonteiros
Exemplo1:
#include <stdio.h>
main()
{ int x=10, y = 20;
int *p; //declara apontador p
Nofinal,x=30,y=10ep(oponteirop)contmoendereodex(ou
seja,apontaparax).
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 7
IntroduoProgramaoIntroduoLinguagemC
Exemplo2:
#include <stdio.h>
main()
{ int y;
int *p, *q; //declara apontadores p e q
y = 10;
p = &y; //p "aponta" para y
q = p; //q "aponta" para p
*q = 40; //"apontado" por q recebe 40
printf("\ny=%d, *p=%d, *q=%d\n\n",y,*p,*q);
}
Aofinal:y=40,*p=40,*q=40
Exemplo3:
#include <stdio.h>
main()
{ int *a; //a = apontador para vars int
int c, b=2;
a = &b; //a recebe o endereco de b
c = b;
//valor apontado por a, valor b, valor c
printf("\n\n*a=%d, b=%d, c=%d\n\n", *a, b, c);
b = 3;
//valor apontado por a, valor b, valor c
printf("\n\n*a=%d, b=%d, c=%d\n\n", *a, b, c);
}
AritmticadePonteiros
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 8
IntroduoProgramaoIntroduoLinguagemC
Exemplo4:
#include <stdio.h>
main()
{ int *a; //a = apontador para vars int
int x = 10;
ComparaescomPonteiros
Osoperadores:
Soaceitoscomponteirosecomparamosendereosdememria.
IndireoSimples
Apontador Endereo
IndireoMltipla
Podemosterumponteiroapontandoparaoutroponteiro,quepor
suavezapontaparaumvalorfinal.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 9
IntroduoProgramaoIntroduoLinguagemC
Exemplo5:
#include <stdio.h>
main()
{ int x, *p, **q; //q apontador para apontador
//de vars int
p = &x; //p aponta para x
q = &p; //q aponta para p
x = 100; //atribui valor a x
InicializaodePonteiros
Quandosedeclaraumponteiro,elenoapontaparalugarnenhum,
elenopossuiumvalor.
Aotentarimprimirumponteironoinicializado,mostradoovalor
nilecomandosdeatribuioaoapontado(queaindanofoidefinido)no
soaceitospelocompilador.
Exemplo:
Errado Certo
int *p; int *p, x;
*p=100; //apontado por p? p=&x; //ok!
*p=100;
Porconvenodevemosatribuirovalor NULL(emmaisculas)aum
ponteiroquenoestapontandoparanada.
Issopodeserfeitotambmparaliberarumapontador,ouseja,um
apontador que aponta para um certo espao na memria passar a no
apontarparanada.
Exemplo:int *p = NULL;
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 10
IntroduoProgramaoIntroduoLinguagemC
Exemplo6:
#include <stdio.h>
main()
{ int *a, *b, x, y, aux;
x=10;
y=20;
a=&x; //ok, apontador inicializado
b=&y; //ok, apontador inicializado
//valor apontado a, valor apontado b
printf("\n*a=%d, *b=%d\n", *a, *b);
//troca
aux=*a;
*a=*b;
*b=aux;
//aps a troca
printf("\nTroca: *a=%d, *b=%d\n", *a, *b);
}
Exerccio1:Tenteescreverumprogramaquecontmuma funo
que troca os valores de duas variveis inteiras. Na main, leia dois
inteiros,chameafunoparatrocarosvaloresdasduasvariveisinteirase
depoisasimprima.
Nofoipossvel?
Explicao:
Napassagemdeargumentosporvalor,trocamseosvalores dentro
da funo, mas no na funo chamadora, ou seja, no funciona com
passagemporvalor!
Testeoexemploaseguir:
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 11
IntroduoProgramaoIntroduoLinguagemC
Exemplo7:
#include <stdio.h>
void troca(int x, int y) //por valor
{ int aux;
aux = x;
x = y;
y = aux;
}
main()
{ int x=10, y=20;
printf("\nx=%d, y=%d\n", x, y);
troca(x, y);
printf("\nTroca: x=%d, y=%d\n", x, y);
}
Namemria:
Endereo Comando
...
110 aux=a;
108 b=20; b=aux;
106 a=10; a=b;
104 y=20
102 x=10
...
Obs:Nofunciona,poisquandoafunoterminaasvariveislocais
deixamdeexistir,nosoretornadas!
Soluo:
Utilizarpassagemdeargumentosporreferncia!
PassagemdeArgumentosporReferncia
Exemplo8:
#include <stdio.h>
void troca(int *x, int *y) //por referncia
{ int aux;
aux = *x; //apontado por x
*x = *y; //apontado por x e apontado por y
*y = aux; //apontado por y
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 12
IntroduoProgramaoIntroduoLinguagemC
main()
{ int x=10, y=20;
printf("\nx=%d, y=%d\n", x, y);
troca(&x, &y); //por referncia (endereos)
printf("\nTroca: x=%d, y=%d\n", x, y);
}
Afunotroca()temoobjetivodereceberduasvariveisinteiras
etrocarseuvalor.
Naprimeiraresoluodoexerccio,socriadascpiasdasvariveis
x e y dentrodafuno troca().Estascpias,quesexistemdentroda
funo,tmoseuvalortrocado,masistonoimplica nenhumaalterao
nasvariveisxeynafunomain().
Paraqueosvaloresdosargumentospossamseralteradosdentrode
uma funo, necessrio que estes argumentos sejam passados por
referncia(endereo).
#include <stdio.h>
main()
{ int *p1, valor, idade, *p4, *p5, vetor[3];
float *p2, temp;
char aux, *nome="Algoritmos", *p3;
//a
valor = 10;
p1 = &valor;
*p1 = 20;
printf("%d\n", valor);
//b
temp = 27.59;
p2 = &temp;
*p2 = 29.35;
printf("%f\n", temp);
//c
p3 = &nome[0];
aux = *p3;
printf("%c\n", aux);
//d
p3 = &nome[4];
aux = *p3;
printf("%c\n", aux);
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 13
IntroduoProgramaoIntroduoLinguagemC
//e
p3 = nome;
printf("%c", *p3);
//f
p3 = p3 + 4;
printf("%c\n", *p3);
//g
p3--;
printf("%c\n", *p3);
//h
vetor[0] = 33;
vetor[1] = 55;
vetor[2] = 27;
p4 = vetor;
idade = *p4;
printf("%d\n", idade);
//i
p5 = p4+1;
idade = *p5;
printf("%d\n", idade);
//j
p4 = p5+1;
idade = *p4;
printf("%d\n", idade);
//k
p4 = p4-2;
idade = *p4;
printf("%d\n", idade);
//l
p5 = &vetor[2]-1;
printf("%d\n", *p5);
//m
p5++;
printf("%d\n", *p5);
}
Sada:
20
29.350000
A
r
Ar
o
33
55
27
33
55
27
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 14
IntroduoProgramaoIntroduoLinguagemC
#include <stdio.h>
int quadrado(int *a)
{ *a=(*a)*(*a);
return *a;
}
main()
{ int x=10;
printf("\n\nQuadrado de %d=",x);
printf("%d\n\n", quadrado(&x));
}
PonteiroseVetores
VetoresemCsotratadospelocompiladorcomoponteiros.
Isso significa que o nome do vetor representa o endereo
ocupadopeloprimeiroelemento.
Exemplo9:
#include <stdio.h>
main()
{ int i,*p, x[]={8,3,5,1,7};
p = x; //p aponta para o 1o elemento de x
for(i=0; i<5; i++)
{ printf("%d\t", *p);
p++;
}
printf("\n");
}
Exemplo10:
#include <stdio.h>
main()
{ int i, x[]={8,3,5,1,7};
for(i=0; i<5; i++)
//aritmtica de ponteiros para navegar
printf("%d\t", *(x+i)); //no vetor
printf("\n");
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 15
IntroduoProgramaoIntroduoLinguagemC
Exemplo11:
#include <stdio.h>
main()
{ int v[]={10, 20, 30, 40, 50}, *p1, *p2, j, i=100;
for (j=0; j<5; j++)
printf("%d\t", v[j]); //elemento pelo ndice
printf("\n");
p1=&v[2];
printf("%d\n", *p1);
p2=&i;
printf("%d\n", *p2);
p2=p1;
printf("%d\n", *p2);
p2++;
printf("%d\n", *p2);
p1=p1+2;
printf("%d\n", *p1);
}
#include <stdio.h>
//declarao permite implementao aps a main
void strcop(char *d, char *o); //prottipo
main()
{ char destino[30];
char *origem = "Cadeia de caracteres de origem.";
strcop(destino, origem);
printf("%s\n%s\n\n", origem, destino);
}
//implementao da funo declarada
void strcop(char *d, char *o)
{ while( *o != '\0')
{ *d = *o;
o++;
d++;
}
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 16
IntroduoProgramaoIntroduoLinguagemC
Soluo:
#include <stdio.h>
void strcop(char *d, char *o); //prottipo
main()
{ char destino[30];
char *origem="Cadeia de caracteres de origem.";
strcop(destino, origem);
printf("%s\n%s\n\n", origem, destino);
}
void strcop(char *d, char *o) //implementao
{ while( ( *d++ = *o++) != '\0' );
}
Exerccios
FaaosexercciosdaLista4.
ProcurerevisarosseusalgoritmosemPortugolcorrespondentesa
estesexercciosetentereescrevlosemlinguagemC,esteo
processonormaldeescritadeumbomprograma.
Comeceescrevendoosprogramasnocaderno,sdepois
passeparaoseueditorparaentooscompilareexecutar,
anotandonocadernoospossveiserrosecorrees.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 17
IntroduoProgramaoIntroduoLinguagemC
AlocaoDinmica
possvelobtermemriaduranteaexecuodoprograma,para
permitirasoluodeproblemasnosquaisaindanosesabeotamanhooua
quantidadedeespaonecessrioparaasvariveisouestruturasdeclaradas
dentrodele.
Funes(bibliotecastdlib.h):
Sintaxe:
ponteiro = (tipo*)malloc(tam*sizeof(tipo));
Onde:
ponteiro nomedoponteiroquereceberoendereodoprimeiro
espaodememriaalocado;
(tipo*) castparagarantirqueoretornoteromesmotipodo
ponteiro;
tam quantidadedeelementosaalocar;
sizeof(tipo) tamanhodotipo;
Obs.:Senoforpossvelalocarmemriasuficiente,retornaNULL.
Exemplo1:
#include <stdio.h>
#include <stdlib.h>
main()
{ int *p; //declara apontador
//alocar 50 inteiros:
p = (int*)malloc(50 * sizeof(int));
Exemplo2:Programaquelotamanhodeumvetordereais,aloca
memriaparaoselementosdovetor,lvaloresparapreencher ovetore
imprimeosvaloreslidos.
#include <stdio.h>
#include <stdlib.h>
main()
{ float *v;
int i, tam;
//alocao:
v = (float*)malloc(tam * sizeof(float));
if( v == NULL )
{ printf("\nImpossivel alocar memria.\n");
return; //interrompe a execuo
}
printf("\n\n");
free(v); //liberao
}
Exemplo3:Programaquelotamanhodeumvetordereaisealoca
memriaparaovetor. Logoaps,chamaumafunoquefaz a leitura e
impressodovetor,recebendoovetoreseutamanho.Outrafunoprocura
omaiorelementonovetorlidoemostraquantasvezesoelementomaior
aparecenovetor.Estafunoretornaovalordomaior.Nofinal,imprimeo
valordomaioreaquantidadedevezesqueeleaparecenovetor.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 19
IntroduoProgramaoIntroduoLinguagemC
#include <stdio.h>
#include <stdlib.h>
for (i=0;i<tam;i++)
{ printf("\n\nv[%d]: ", i);
scanf("%f", v+i); //leitura
}
printf("\n\nVetor: ");
for (i=0;i<tam;i++)
printf("%.2f\t", *(v+i));
}
return maior;
}
main()
{ float *v, maior;
int tam, vezes;
printf("Digite o tamanho do vetor: ");
scanf("%d", &tam);
v=(float*)malloc(tam*sizeof(float));
if( v != NULL )
{ leImprime(v, tam);
maior = buscaMaior(v, tam, &vezes);
printf("\nMaior: %.2f e aparece %d vezes no
vetor.\n", maior, vezes);
free(v);
}
else
printf("\nImpossivel alocar memria.\n");
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 20
IntroduoProgramaoIntroduoLinguagemC
Exerccio1:Escrevaumprogramasemalocaodememriaqueleia
umafrasede30caracteresechameumafunoquerecebeumponteiro
paraafraseeimprimeafrase10vezesnatela.ImprimaamensagemFIM
nofinaldoprograma.
Exerccio3:Escreverumprogramaquecontmumafunoquel
umafraseeretornaumponteiroparaoinciodafrase.Namain(),declarar
umponteirodecaracteres,chamarafunoeimprimir10vezesafraselida.
ImprimiramensagemFIMnofinaldoprograma.
Exerccio5:Escrevaumprogramaqueleiaumafraseecopieafrase
em outro vetor de forma inversa a que foi lida. Imprima a frase lida, o
tamanhodafraseeafraseinversa.
Exerccio6: Escrevaumprogramaqueleiaumafrase,verifiqueo
seutamanhoechameumafunoquerecebeafrase,oseutamanhoeum
caracterelido.Afunodevecontareretornarovalorda quantidadede
ocorrnciasdocaracteredafrase.Imprimaovalorretornado.
Exerccios
FaaosexercciosdaLista4.
Comeceescrevendoosprogramasnocaderno,sdepois
passeparaoseueditorparaentooscompilareexecutar,
anotandonocadernoospossveiserrosecorrees.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 21
IntroduoProgramaoIntroduoLinguagemC
Registros
Umregistroumconjuntodevariveis,provavelmentedetipos
diferentes,referenciadosporumnome.
Asvariveisqueformamoregistrosochamadosdeelementosdo
registro.
FormaGeral:
struct nomedoregistro {
elementos (variveis separadas por ;)
};
Este cdigo cria o tipo registro chamado data que contm trs
elementos:dia,mseano.
Paradeclararvariveisdotipodata,utilizamosasintaxe:
Exemplo:
hoje.dia = 10;
hoje.mes = junho;
hoje.ano = 2011;
printf(%d de %s de %d\n, hoje.dia, hoje.mes,
hoje.ano);
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 22
IntroduoProgramaoIntroduoLinguagemC
Exemplo1:
#include <stdio.h>
struct pessoa //cria tipo registro pessoa
{
char *nome;
int idade;
float altura;
};
main()
{ struct pessoa p1; //declara varivel
p1.nome="Maria de Souza";
p1.idade=32;
p1.altura=1.69;
printf("\nNome: %s\nIdade: %d\nAltura: %f\n\n",
p1.nome, p1.idade, p1.altura);
}
Exerccio1:Reescreveroprogramafazendoaleituradosdadosda
pessoaviatelado.Acrescentaroelementopesonoregistropessoa,parano
finalcalculareimprimiroIMCdapessoa.
RegistrosDentrodeRegistros
Registrospodemconteroutrosregistroscomoelementos.
Exemplo:
struct data {
int dia;
char mes[10];
int ano;
};
struct pessoa {
char nome[60];
char end[80];
char fone[20];
struct data nascimento;
};
struct pessoa p;
p.nome = Jos da Silva;
p.end = Rua A, 300;
p.fone = 3333-2222;
p.nascimento.dia = 20;
p.nascimento.mes = maio;
p.nascimento.ano = 1985;
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 23
IntroduoProgramaoIntroduoLinguagemC
Exerccio2:Escreverumprogramautilizandoumregistrodentrode
umregistro.Dadaatabelaabaixo,lerosdadosdoregistroparaumapessoa
(nome, endereo, fone, altura, peso e nascimento) e calcular seu IMC.
Imprimir os dados lidos, o IMC e uma das mensagens de acordo com a
tabela.
Abaixode18.4 Abaixodopesoideal
Entre18.5e24.9 Parabns,pesonormal
Entre25,0e29.9 Acimadopeso(sobrepeso)
Entre30.0e34.9 ObesidadedegrauI
Entre35.0e39.9 ObesidadedegrauII
Acimade40.0 ObesidadedegrauIII
Exemplo2:(comprottipodafunoqueexibeosdadosdoregistro)
#include <stdio.h>
//cria tipo registro
struct livro {
char *titulo;
int codigo;
float preco;
};
//prototipo da funcao
void imprime(struct livro b);
main()
{ //declara varivel registro
struct livro book;
//define valores dos campos
book.titulo="Programando em C";
book.codigo=1452;
book.preco=99.99;
//chamada da funcao
imprime(book);
}
//funcao que recebe registro por valor/copia
void imprime(struct livro b)
{
printf("\n\nTitulo: %s\nCodigo: %d\nPreco: %.2f\n\n",
b.titulo, b.codigo, b.preco);
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 24
IntroduoProgramaoIntroduoLinguagemC
VetoreseRegistros
aformamaiscomumdeusoderegistros,poissimilarauma
coleoouaumbancodedados.
Simplificaapassagemdeparmetrosporreferncia.
Exemplo3:
Programaquelosdadosde3livros.
Considereaestruturadoexemploanteriormodificandoocampottulopara
vetordechar.
#include <stdio.h>
#define MAX 3
//cria tipo registro
struct livro {
char titulo[30]; //ja aloca espao na memoria
int codigo;
float preco;
};
//prototipo da funcao
void imprime(struct livro v[]);
main()
{ //declara vetor de registros
struct livro vb[MAX];
//leitura dos valores dos campos
int i;
printf("\n\nCadastro de livros\n\n");
for(i=0; i<MAX; i++)
{ printf("Titulo %d: ", i);
gets( vb[i].titulo);
printf("Codigo %d: ", i);
scanf("%d", &vb[i].codigo);
printf("Preco %d: ", i);
scanf("%f", &vb[i].preco);
fgetc(stdin); //limpa buffer
printf("\n");
}
printf("\n");
//chamada da funcao
imprime(vb);
}
//funcao que recebe vetor (por referencia)
void imprime(struct livro v[])
{ int i;
printf("Livros Cadastrados:\n");
printf("--------------------------\n");
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 25
IntroduoProgramaoIntroduoLinguagemC
Exerccio3:Escreverumprogramautilizandoumregistrochamado
aluno eduasfunes(leitura e impressao)querecebem umvetor do
tipostruct aluno.Namain(),chamarafunoleituraparalerosdados
de3alunos ecalcularamdiadecadaum.Logoaps,chamarafuno
impresso para mostrar os dados de cada aluno e uma das seguintes
mensagens:
Aprovado,seamdiaformaiorouiguala6.0;
Reprovado,seamdiaformenorque4.0;
FazerVS,casocontrrio.
Qualqueroutraopo,imprimaInvlido.
RegistrosePonteiros
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 26
IntroduoProgramaoIntroduoLinguagemC
Exemplo4:
#include <stdio.h>
#define MAX 5
struct livro {
char titulo[30];
int codigo; //4 bytes
float preco; //4 bytes
};
main()
{ struct livro vb[MAX];
//leitura
printf("\nCadastre os %d livros:\n\n", MAX);
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 27
IntroduoProgramaoIntroduoLinguagemC
leitura(vb);
//impressao
printf("Livros Cadastrados:\n");
printf("----------------------\n\n");
impressao(vb);
printf("----------------------\n\n");
}
Exerccio5: Escreverumprogramaquecriaumregistrochamado
pontocontendoasposiesdexeydeumponto,dotiporeal.Declarardois
pontosnamain(),leraposio(coordenadasxey)decadaumecalculara
distncia entre eles. Dividir o programa em funes (leitura e calculo de
distancia).Imprimirovalordadistnciaentreosdoispontos.
Exerccios
FaaosexercciosdaLista4.
Comeceescrevendoosprogramasnocaderno,sdepois
passeparaoseueditorparaentooscompilareexecutar,
anotandonocadernoospossveiserrosecorrees.
Arquivos
Osarquivossousadosparaconservaopermanentedegrandes
quantidadesdedados.
Oscomputadoresarmazenamarquivosemdispositivossecundrios
dearmazenamento(discosrgidos,etc).
Umarquivoumasequnciaordenadadebytes,emgeral
representandodadosutilizadosporaplicativos.
Umregistroumgrupodecamposrelacionadosentresi.
Umarquivoumgrupoderegistrosrelacionadosentresi.
Exemplo:Umsistemadefolhadepagamento
Cadaregistrodeumempregadopossuiosseguintescampos:
nome,
endereo,
PIS,
CPF,
RG,
impostoretidonafonte,etc.
Logo,umarquivodefolhadepagamentodeumaempresacontm
registros,umregistroparacadaempregado.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 28
IntroduoProgramaoIntroduoLinguagemC
AcessandoArquivosemC
Antesdeacessarosdadosdentrodeumarquivonecessrioabri
loeaoterminarderealizarasoperaesnoarquivo,devemosfechlo.
Asoperaesdeaberturaefechamentogarantemaintegridadedos
dados.
Asfunesreferentesaarquivosestonabibliotecastdio.h
AberturaeFechamentodeArquivos
TodoarquivoabertoreferenciadoporumponteirodotipoFILE
(estruturaquecontminformaesusadasparaprocessararquivos).
*fopenfunoqueabreoarquivonomecomomododeaberturae
retornaumponteiroparaaestruturaFILE.
*nomenomedoarquivodeveserumastring,quepodeincluiro
caminhocompleto.
Afunofclose()usadaparafecharoarquivo.
ModosdeAberturadeArquivos
rabrirarquivoparaleitura
wabrirarquivoparagravao
aabrirarquivoparagravaoemanexo
+aadiodosmbolo+permiteleituraeescrita
babrirarquivoemmodobinrio
tabrirarquivoemmodotexto
Exemplos:
r+leituraeescrita
rbleituramodobinrio
wbescritamodobinrio
rtleituramodotexto
wtescritamodotexto
Nomodow,seoarquivoestiverpresente,eleserdestrudoe
reinicializado.Senoexistirsercriado.
Paraabrirparaescritaeacrescentardadosaofinaldoarquivo,sem
destruirosdadosinseridosanteriormente,deveseusaromodoa.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 29
IntroduoProgramaoIntroduoLinguagemC
FunesparaAcessarDadosdeArquivos
getc()eputc()leregravar,caracteracaracter.
fgets()efputs()leregravar,linhaalinha.
fread()efwrite()leregravarsequnciasdecaracteres,
nmeros,etc.
fprintf()gravadadosemumarquivo.
fscanf()ldadosdeumarquivo.
feof()verificaseofimdeumarquivo.
EOFsignificafimdearquivoe,assimcomoafeof()usadopara
testesenquantosepercorreoarquivo.
#include <stdio.h>
main()
{
char ch;
FILE *in, *out; //ponteiros para arquivos
//fecha os arquivos
fclose(in);
fclose(out);
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 30
IntroduoProgramaoIntroduoLinguagemC
Exemplo2:Programaqueabreumarquivoegravaumamensagem
queincluionomedoprprioarquivo.
#include <stdio.h>
#include <stdlib.h>
main()
{ FILE *fp;
char nome[50], c;
Exemplo3:Programaqueabreumarquivonomodobinrioegrava
umamensagemeumvetordenmeros.
#include <stdio.h>
#include <stdlib.h>
main()
{
int i;
char ch[20] = "Arquivo Binrio";
int valor[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20};
FILE *in;
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 31
IntroduoProgramaoIntroduoLinguagemC
in = fopen("binario.bin", "wb");
if( in == NULL )
{ printf("Impossivel abrir o arquivo");
return;
}
fwrite(ch, sizeof(char), 20, in);
fwrite(valor, sizeof(int), 20, in);
}
Exemplo4:Programaqueabreumarquivonomodobinrio,lseu
contedoemostranatela.
#include <stdio.h>
#include <stdlib.h>
main()
{ int i;
char ch[20];
int valor[20];
FILE *in;
in = fopen("binario.bin", "rb");
if(in == NULL)
{ printf("Impossivel abrir O arquivo");
return;
}
printf("\n");
printf("\n");
fclose(in);
}
Exemplo5:Programaquecriaumtiporegistro,ldadosparaum
vetor de registros,copia o vetorparaum arquivobinrio,losdados do
arquivobinrioparaumsegundovetorderegistroseimprimeestesegundo
vetor.
#include <stdio.h>
#include <stdlib.h>
#define MAX 2
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 32
IntroduoProgramaoIntroduoLinguagemC
struct pessoa{
char nome[40];
int dia;
char mes[20];
int ano;
};
main()
{ int i;
FILE *pa;
char arquivo[40];
struct pessoa dados[MAX], dadosarq[MAX];
puts("Imprimindo\n");
for(i=0; i<MAX; i++)
{
printf("Dia = %d \n", dados[i].dia);
printf("Mes = %s \n", dados[i].mes);
printf("Ano = %d \n\n", dados[i].ano);
}
puts("Gravando \n\n");
if((pa = fopen(arquivo, "w+b")) == NULL)
{
puts("Arquivo nao pode ser aberto");
exit(1); //saida com codigo 1 (erro)
}
//gravacao
for(i=0; i<MAX; i++)
if(fwrite(&dados[i], sizeof(struct pessoa), 1, pa)!= 1)
{
puts("Erro na escrita");
}
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 33
IntroduoProgramaoIntroduoLinguagemC
//leitura
rewind(pa); //aponta para o inicio do arquivo
for(i=0; i<MAX; i++) {
if(fread(&dadosarq[i], sizeof(struct pessoa), 1, pa)!=1)
{
puts("Erro na leitura");
}
if( feof(pa) ) //se fim, erro
{
puts("Erro na leitura");
break;
}
}
Exerccio2:Escreverumprogramaparaler3registrosdealunos
(nome,v1,v2emedia)amdiadevesercalculada,nolidaeosgravar
em um arquivo cujo nome deve ser turma.bin. Em seguida mostra o
contedodoarquivonatela.Mostretambmamdiadaturma.
Exerccios
FaaosexercciosdaLista4.
Comeceescrevendoosprogramasnocaderno,sdepois
passeparaoseueditorparaentooscompilareexecutar,
anotandonocadernoospossveiserrosecorrees.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 34