Você está na página 1de 34

Introduo

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

Funes so utilizadas para dividir um programa grande em


diversas partes menores, cada parte executando uma pequena tarefa
especifica.
Ousodefunesmodularizaocdigofacilitandosuareutilizao,
aprimoramentosecorreesdeerros.
AlinguagemCformadaporfunesprdefinidas(bibliotecas)e
instrues.
Osprogramaspodemconterfunesdefinidaspeloprogramadore
funesprdefinidasdeC.

PerguntasBsicasparaCriaodeFunes

Importante: Antes de se criar uma funo, boa prtica de


programaoresponderasseguintesperguntasbsicas:
1. Oquefarafuno?Clculo?Impresso?
2. Quevaloresreceberparasuaexecuo?
3. Queresultadodeverretornar?Havermesmoumvalorde
retorno?Seeleexiste,qualotipo?
Resumindo: Definaatarefa,aentradaeoretorno.

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

Umavariveldeclarada dentro docorpodafunochamadade


varivellocal (sexistedentrodafuno;naquelelocal;sexisteentre
aquelaschaves).
Quando a funo termina, a varivel liberada (apagada) da
memria,literalmentedeixadeexistir.

ChamandoumaFuno

Para executar uma funo, devese chamla a partir de outra


funo.
Afuno main() nopodeserchamadapeloprogramador(padro
da linguagem para controle interno da execuo), mas a partir dela
possvelchamaroutrasfunes(masnoobrigatoriamentesomenteapartir
damain).
Por exemplo, uma funo equao() pode chamar outra funo
calculo_interno_1(),porexemplo.
Asfunesspodemserchamadasdepoisdedeclaradas.

Exerccio: Escreva um programa que possui uma funo que l


uma palavra e a imprime 10 vezes na tela. No incio do programa,
imprimir a mensagem Incio. Logo aps, chamar a funo para ler a
palavra emostrara palavra10vezes.Nofinal doprograma,imprimira
mensagemFim.
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 4
IntroduoProgramaoIntroduoLinguagemC

PassagemdeParmetrosporValor(Cpia)

Em C, valores so passados para as funes atravs de


argumentosnaschamadas.
Os argumentos, quando recebidos nas funes, passam a ser
chamadosdeparmetrosesousadosnosblocosdecdigodestasfunes.
Na passagem por valor, os valores dos argumentos so
copiados paraosparmetros.Destaforma(porvalor),osdadospodem
seralteradosemanipuladosnafunochamada,masnosoalteradosna
funoorigem.

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");

//chamada com '#' e 40


imprimeCaracter('#', 40);

printf("\n Teste finalizado.\n");

//outra chamada
imprimeCaracter('#', 40);

printf("\n\n");
}

Exercicio: Escreva um programa em C com uma funo para


calcularotriplodeumnmeroreal.Leiaonmeronamain,chamea
funo passando o nmero lido dentro de um comando printf com a
mensagemtriplode...=....Afunodeveentoreceberonmerocomo
parmetroeretornaroresultadodoclculodotriplo.

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).

Sintaxe: tipo *nome_da_variavel;

Exemplos: int *p, *t; //ponteiros p vars int


float *q; //ponteiro p var float

OperadoresdePonteiros

& umoperadorunrioqueretornao endereo damemriado


seuoperando.

Exemplo:a = &m; //a recebe o endereo de


//memria que contm m

* umoperadorunrioqueretornao valor (contedo)doseu


operando.

Exemplo1:

#include <stdio.h>
main()
{ int x=10, y = 20;
int *p; //declara apontador p

p=&x; //p recebe endereo de x (aponta p/ x)


y=*p; //y recebe o valor do apontado por p
*p=30; //apontado por p recebe 30
printf("\n\nx=%d, y=%d, p=%p\n\n", x, y, 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

Existem duas operaes aritmticas com ponteiros e o nmero de


bytesaunidadeconsiderada:

1) IncrementoouAdio Incrementa ou adiciona de


acordocomaquantidadedebytesdotipo.

Ex: int *p; //p = 2000


p++; //p = 2004

2) DecrementoouSubtrao Decrementa ou subtrai


deacordocomaquantidadedebytesdotipo.

Ex: int *q; //q = 2000


q--; //q = 1996

19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 8
IntroduoProgramaoIntroduoLinguagemC

Exemplo4:

#include <stdio.h>
main()
{ int *a; //a = apontador para vars int
int x = 10;

a = &x; //a aponta para x


printf("\n\na = %p", a); //endereo de a
a++; //incremento
printf("\na++ = %p", a); //endereo de a
a--; //decremento
printf("\na-- = %p\n", a); //endereo de a
}

ComparaescomPonteiros

Osoperadores:

== != > >= < <=

Soaceitoscomponteirosecomparamosendereosdememria.

IndireoSimples

Apontador Endereo

Exemplo: int *p; //ponteiro para vars int


int x = 5;
p = &x; //indireo simples

IndireoMltipla

Podemosterumponteiroapontandoparaoutroponteiro,quepor
suavezapontaparaumvalorfinal.

Endereo Endereo Valor

Sintaxe: tipo **nome_da_varivel;

Exemplo: int **q; //ponteiro de ponteiros

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

//valor do apontado por p


printf("\n**q=%d\n", **q); //q aponta p
//valor do apontado por p
printf("\n*p=%d\n", *p); //valor apontado p
printf("\n&x=%p\n", &x); //endereco de x
printf("\n&p=%p\n", &p); //endereco de p
printf("\n*q=%p\n", *q); //valor de q
}

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

Na passagem por referncia os endereos das variveis so


passados, habilitando a funo a manipular diretamente os valores das
variveisdafunochamadora.

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).

Exerccio 2: Acompanhe, anote e explique a sada do programa


abaixo:

#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

Exercicio 3: Comente cada linha do cdigo abaixo e desenhe o


esquemadefuncionamentonamemria:

#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");
}

Noexemplo9,ooperador & noutilizado.Istoocorreporqueo


nomedovetorjtratadopelocompiladorcomoumendereo.
Sefosseusadop = &x[0];,nolugardep = x;,tambmestaria
correto.

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");

for (j=0; j<5; j++)


printf("%d\t", *(v+j)); //aritmtica
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);
}

Exemplo 12: Programa que l uma string origem e chama uma


funoquerecebeduasstrings(destinoeorigem)ecopiaastringorigem
paraastringdestino.Nofinalimprimeasduasstrings.Obs.:nousara
funostrcpy(...).

#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

Exerccio4(resolvido):Reescrever afuno strcop emapenas


umalinha.

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' );
}

Exerccio 5: Escrever um programa onde definida uma string


qualquer.Logoaps,mostrarastringeotamanhodastring,semusara
funostrlen().

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):

malloc memoryallocation (alocaodememria)


reserva sequencialmente um certo nmero de blocos de
memria eretorna,paraumponteiro,oendereodoprimeiro
blocoreservado(primeirobytelivreencontrado);

free liberao de memria libera memria alocada


atravsdeumponteiro.

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));

*p=20; //valor do primeiro


*(p+1)=30; //valor do segundo...
*(p+2)=40;
19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 18
IntroduoProgramaoIntroduoLinguagemC

printf("\n\n*p = %d, *(p+1) = %d, *(p+2) = %d\n\n",


*p, *(p+1), *(p+2));

free(p); //aps utilizao, liberar


}

Exemplo2:Programaquelotamanhodeumvetordereais,aloca
memriaparaoselementosdovetor,lvaloresparapreencher ovetore
imprimeosvaloreslidos.

#include <stdio.h>
#include <stdlib.h>
main()
{ float *v;
int i, tam;

printf("Qual o tamanho do vetor? ");


scanf("%d", &tam);

//alocao:
v = (float*)malloc(tam * sizeof(float));

if( v == NULL )
{ printf("\nImpossivel alocar memria.\n");
return; //interrompe a execuo
}

for (i=0; i<tam; i++)


{ printf("\n\nv[%d]: ", i);
scanf("%f", v+i); //leitura
}

printf("\n\nVetor alocado e lido:\n");


for (i=0; i<tam; i++)
printf("%.2f\t", *(v+i)); //impresso

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>

void leImprime (float *v, int tam)


{ int i;

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));
}

float buscaMaior(float *v, int tam, int *vz)


{ int i, maior;
maior = *v; //primeiro elemento

for(i=0; i<tam; i++)


if( *(v+i) > maior)
maior = *(v+i);
else if( *(v+i) == maior)
(*vz)++; //incrementa apontado
//CUIDADO: parenteses!

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.

Exerccio 2: Reescreva o programa anterior usando alocao


dinmicadememrianadefiniodovetor.

Exerccio3:Escreverumprogramaquecontmumafunoquel
umafraseeretornaumponteiroparaoinciodafrase.Namain(),declarar
umponteirodecaracteres,chamarafunoeimprimir10vezesafraselida.
ImprimiramensagemFIMnofinaldoprograma.

Exerccio 4:Escreva um programa que leia o seunomecompleto,


conteemostrequantasvezes'a'ou'A'aparecemnoseunome(oumostre
umamensagemnoaparece).

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 ;)
};

Exemplo: struct data {


int dia;
char mes[10];
int ano;
};

Este cdigo cria o tipo registro chamado data que contm trs
elementos:dia,mseano.

Paradeclararvariveisdotipodata,utilizamosasintaxe:

struct data hoje;

Estecdigodeclaraumavarivelchamada hoje dotipo struct


data.

Para acessar elementos do registro separadamente, utilizase o


operador.(ponto).

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

for(i=0; i<MAX; i++)


{
printf("Livro %d:\n", i+1);
printf("Ttulo: %s\n", v[i].titulo);
printf("Codigo: %d\n", v[i].codigo);
printf("Preco: %.2f\n", v[i].preco);
}
printf("--------------------------\n\n");

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.

Exerccio 4: Criar um programa para descrever carros de uma


determinada revendedora, que contm uma estrutura com os seguintes
campos:marca(string15),cor(string10),ano(inteiro)epreco(real).
1. Escrevaadefinioparaaestrutura'Carro';
2. DeclareumvetortipostructCarrocomtamanho5;
3. Crieummenucomasseguintesopes(utilizeumafunoparaexecutar
cadatarefa):
1)Leituradedados;
2)Impresso(todososdadoslidos);
3)Buscapormarca(cor,anoepreo);
4)Sair

Qualqueroutraopo,imprimaInvlido.

RegistrosePonteiros

Ponteiros podem apontar para registros do mesmo modo que


apontamparaqualquervarivel.
Podemos acessar os dados atravs do operador > (seta). A
vantagemoaumentodavelocidadedeprocessamento,jquenecessrio
copiarapenasoendereo,aoinvsdetodocontedodavarivel.

19992011Prof.Dr.AdrianoCaminhaeProfa.Dra.VeraLciaPrudnciadosSantosCaminhaICEx/UFFVoltaRedondaRJ 26
IntroduoProgramaoIntroduoLinguagemC

recomendvel que estruturas muito grandes sejam sempre


passadasporendereo.

Noexemploabaixo, struct livro ocupa40bytes.Sepassssemos


oargumentoporvalor,oprogramaseriaobrigadoacopiar40bytes,porm,
passandooargumentoporreferncia,apenas4bytes(endereo)so
copiados.

Exemplo4:

#include <stdio.h>
#define MAX 5
struct livro {
char titulo[30];
int codigo; //4 bytes
float preco; //4 bytes
};

//funcao recebe registro por referencia


void leitura(struct livro *b)
{ int i;
for(i=0;i<MAX;i++)
{ printf("Titulo %d: ", i);
gets(b->titulo); //operador seta
printf("Codigo %d: ", i);
scanf("%d", &b->codigo);
printf("Preco %d: ", i);
scanf("%f", &b->preco);
printf("\n");
fgetc(stdin);
b++; //proximo registro
}
}

//funcao recebe registro por referencia


void impressao(struct livro *b)
{
int i;
for(i=0;i<MAX;i++)
{ //uso do operador seta para acessar cada
//campo do apontado
printf("%d\nTit: %s\nCod: %d\nPreco: %.2f\n\n",
i, b->titulo, b->codigo, b->preco);
b++; //proximo registro
}
}

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).

Sintaxe:FILE *fopen (char *nome, char *modo)

*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.

Exemplo 1: Programa que l caracteres do arquivo entrada.txt


paraoarquivosaida.txt.necessriocriarestesdoisarquivosnamesma
pastaeentrada.txtdeveconterumtextoqualquer.

#include <stdio.h>
main()
{
char ch;
FILE *in, *out; //ponteiros para arquivos

//abertura para leitura, com teste


if ((in = fopen("entrada.txt", "rt")) == NULL)
{ printf("Impossivel abrir arquivo");
return;
}

//abertura para gravao, com teste


if ((out = fopen("saida.txt", "wt")) == NULL)
{ printf("Impossivel abrir arquivo");
return;
}

//copia, enquanto no chegar ao fim do arquivo


while( (ch = getc(in)) != EOF)
putc(ch, out); //grava caracter no arquivo

//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;

printf("Digite o caminho do arquivo:");


gets(nome);

//abre o arquivo para gravao


if( !(fp = fopen(nome, "w")) )
{ printf("Impossivel abrir o arquivo.\n");
return;
}

printf("\n\nMensagem gravada no arquivo:\n\");


//imprime a mensagem do arquivo
fprintf(fp, "Nome deste arquivo: %s\n", nome);
fclose(fp); //fecha o arquivo

//abre novamente o arquivo, agora para leitura


fp = fopen(nome, "r");

//funo para verificar o final do arquivo


while( !feof(fp) )
{ //l um caractere do arquivo
fscanf(fp, "%c", &c);

printf("%c", c); //mostra caractere lido


}

fclose(fp); //fecha arquivo


}

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;
}

fread(ch, sizeof(char), 20, in);


fread(valor, sizeof(int), 20, in);
for(i=0; i<20; i++)
printf("%c", ch[i]);

printf("\n");

for(i=0; i<20; i++)


printf("%d \n", valor[i]);

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];

for(i=0; i<MAX; i++)


{ puts("Nome: ");
gets(dados[i].nome);
puts("Dia: ");
scanf("%d", &dados[i].dia);
fgetc(stdin);
puts("Mes: ");
gets(dados[i].mes);
puts("Ano: ");
scanf("%d", &dados[i].ano);
fgetc(stdin);
}

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("Qual o nome do arquivo? ");


gets(arquivo);

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;
}
}

puts("Imprimindo vetor lido do arquivo\n");


for(i=0; i<MAX; i++)
{
printf("Nome = %s \n", dadosarq[i].nome);
printf("Dia= %d \n", dadosarq[i].dia);
printf("Mes = %s \n", dadosarq[i].mes);
printf("Ano = %d \n\n", dadosarq[i].ano);
}

Exerccio 1: Escrever um programa para ler nmeros reais e os


gravaremumarquivocujonomedeveserdados.txt.Emseguidamostrao
contedodoarquivonatela.

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

Você também pode gostar