Professional Documents
Culture Documents
=
7 0 2
6 4 2
5 1 3
A . Considere o programa abaixo que manipula a matriz A .
#include <stdio.h>
int main()
{
int i, j, A[3][3];
for( i = 0; i < 3; i++ )
for( j = 0; j < 3; j++ )
if( A[i][j] % 2 == 0 )
A[i][j] = A[i][j] * 3;
return( 0 );
}
Desenhe a nova matriz resultante aps a execuo do programa acima.
3. Escreva um programa em C que preencha uma matriz quadrada de ordem 4 com valores inteiros
fornecidos pelo usurio. Mostre a soma de todos os elementos da matriz.
4. Para a matriz do exerccio anterior, calcule e escreva a soma dos elementos da diagonal
principal.
5. Para a matriz do exerccio 3, calcule e escreva a soma dos elementos da diagonal secundria.
6. Dadas as matrizes
3 3x
A e
3 3x
B preenchidas com valores aleatrios entre 0 e 20, gere a matriz
B A C + = .
7. Escreva um programa em C que preencha uma matriz
10 10x
D com valores aleatrios entre 0 e
1000. Escreva o maior valor armazenado bem como a sua localizao.
8. Faa um programa em C que entre com valores reais para uma matriz
3 2x
C . Gere e escreva a
t
C . A matriz transposta gerada trocando linha por coluna. Veja o exemplo a seguir:
(
=
6 5 4
3 2 1
C
(
(
(
=
6 3
5 2
4 1
t
C
9. Dadas as matrizes
2 3x
A e
3 2x
B , gere B A C * = .
10. Escreva um programa em C que leia e armazene 50 nomes. Mostre a quantidade de nomes que
comeam com a letra a.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
33
11. Para o exerccio 10, escreva apenas os nomes que comeam com a letra c.
12. Para a matriz do exerccio 10, escreva o maior nome armazenado (aquele que apresenta o maior
nmero de caracteres).
13. Escreva um programa em C que leia o nome de 10 alunos de uma turma. Leia tambm a nota da
primeira e da segunda prova. Calcule a mdia aritmtica e escreva todas as informaes no vdeo.
8.4 Exerccios Complementares
10. O que o programa abaixo imprime?
#include <stdio.h>
int main()
{
int t, i, M[3][4];
for (t=0; t<3; ++t)
for (i=0; i<4; ++i)
M[t][i] = (t*4)+i+1;
for (t=0; t<3; ++t)
{
for (i=0; i<4; ++i)
printf ("%d ", M[t][i]);
printf ("\n");
}
return(0);
}
11. Escreva um programa em C para gerar a seguinte matriz:
(
(
(
(
=
16 12 8 4
12 9 6 3
8 6 4 2
4 3 2 1
t
12. Faa um programa em C que preencha uma matriz quadrada de ordem 5 com valores aleatrios
entre 0 e 50. Em seguida, escreva todos os elementos que esto acima da diagonal secundria bem
como a sua soma.
13. Escreva um programa em C que preencha uma matriz quadrada de ordem 10 com valores
aleatrios entre 0 e 1000. Escreva todos os elementos da diagonal principal e da secundria.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
34
14. Dadas as matrizes
2 2x
X e
2 2x
Y preenchidas com valores inteiros fornecidos pelo usurio, gere a
matriz Y X Z = .
15. Escreva um programa em C que entre com valores para uma matriz
4 3x
A . Gere e escreva a
matriz B que o triplo da matriz A .
16. Escreva um programa em C que preencha uma matriz
5 4x
C com valores reais informados pelo
usurio. Calcular e escreva a soma de todos os seus elementos.
17. Dada uma matriz B (quadrada de ordem 10) de nmeros inteiros, determine a quantidade de
nmeros mpares e pares armazenados.
18. Faa um programa em C que leia uma matriz 12 x 4 com valores das vendas de uma loja, em
que cada linha representa um ms do ano, e cada coluna, uma semana do ms. Calcule e escreva:
a) total vendido em cada ms;
b) total vendido no ano;
19. Escreva um programa em C que preencha uma matriz quadrada de ordem 5 com valores inteiros
fornecidos pelo usurio. Verifique se a matriz ou no uma matriz triangular superior. Matriz
triangular superior uma matriz onde todos os elementos de posio L < C so diferentes de 0 e
todos os elementos de L > C so iguais a 0. L e C representam respectivamente linha e coluna.
20. Considere a seguinte matriz ] 3 ][ 2 ][ 3 [ B . Preencha a matriz com valores aleatrios entre 0 e 50.
Em seguida calcule e escreva a soma dos elementos.
21. Criar um programa em C que possa armazenar as alturas de dez atletas de cinco delegaes que
participaro dos jogos de vero. Escreva a maior altura de cada delegao.
22. Escreva um programa em C que leia 10 nomes via teclado. Os nomes devero ser armazenados
em ordem crescente de tamanho (em relao ao nmero de caracteres presentes na string).
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
35
Captulo 9
Introduo aos Ponteiros
9.1 Definio
Os ints guardam inteiros. Os floats guardam nmeros de ponto flutuante. Os chars guardam
caracteres. Ponteiros guardam endereos de memria. Quando voc anota o endereo de um colega
voc est criando um ponteiro. O ponteiro o seu pedao de papel. Ele tem anotado um endereo.
Qual o sentido disto? Simples. Quando voc anota o endereo de um colega, depois voc vai usar
este endereo para ach-lo. A linguagem C funciona assim. Voc anota o endereo de algo numa
varivel ponteiro para depois usar.
Da mesma maneira, uma agenda, onde so guardados endereos de vrios amigos, poderia ser vista
como sendo uma matriz de ponteiros na linguagem C.
Um ponteiro tambm tem tipo. Veja: quando voc anota um endereo de um amigo voc o trata
diferente de quando voc anota o endereo de uma firma. Apesar de o endereo dos dois locais ter o
mesmo formato (rua, nmero, bairro, cidade, etc.) eles indicam locais cujos contedos so
diferentes. Ento os dois endereos so ponteiros de tipos diferentes.
Na linguagem C quando declaramos ponteiros ns informamos ao compilador para que tipo de
varivel vamos apont-lo. Um ponteiro int aponta para um inteiro, isto , guarda o endereo de um
inteiro.
9.2 Declarao de ponteiros
Para declarar um ponteiro temos a seguinte forma geral:
tipo_do_ponteiro *nome_da_varivel;
o asterisco (*) que faz o compilador saber que uma varivel no vai guardar um valor e sim um
endereo para aquele tipo especificado. Exemplos de declaraes:
int *pt;
char *temp,*pt2;
O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros para
caracteres. Eles ainda no foram inicializados (como toda varivel do C que apenas declarada).
Isto significa que eles apontam para um lugar indefinido. Este lugar pode estar, por exemplo, na
poro da memria reservada ao sistema operacional do computador. Usar o ponteiro nestas
circunstncias pode levar a um travamento do micro, ou a algo pior. O ponteiro deve ser
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
36
inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto de suma
importncia!
9.3 Operadores de ponteiros (& e *)
Para atribuir um valor a um ponteiro recm-criado poderamos igual-lo a um valor de memria.
Mas, como saber a posio na memria de uma varivel do nosso programa? Seria muito difcil
saber o endereo de cada varivel que usamos, mesmo porque estes endereos so determinados
pelo compilador na hora da compilao e realocados na execuo. Podemos ento deixar que o
compilador faa este trabalho por ns. Para saber o endereo de uma varivel basta usar o operador
&. Veja o exemplo:
int count = 10;
int *pt;
pt = &count;
Criamos um inteiro count com o valor 10 e um ponteiro para um inteiro pt. A expresso &count
nos d o endereo de count, o qual armazenamos em pt. Simples, no ? Repare que no alteramos
o valor de count, que continua valendo 10.
Como ns colocamos um endereo em pt, ele est agora "liberado" para ser usado. Podemos, por
exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador "inverso" do
operador &. o operador *. No exemplo acima, uma vez que fizemos pt = &count a expresso *pt
equivalente ao prprio count. Isto significa que, se quisermos mudar o valor de count para 12,
basta fazer *pt=12.
Vamos fazer uma pausa e voltar nossa analogia para ver o que est acontecendo.
Digamos que exista uma firma. Ela como uma varivel que j foi declarada. Voc tem um papel
em branco onde vai anotar o endereo da firma. O papel um ponteiro do tipo firma. Voc ento
liga para a firma e pede o seu endereo, o qual voc vai anotar no papel. Isto equivalente, no C, a
associar o papel firma com o operador &. Ou seja, o operador & aplicado firma equivalente a
voc ligar para a mesma e pedir o endereo. Uma vez de posse do endereo no papel voc poderia,
por exemplo, fazer uma visita firma. No C voc faz uma visita firma aplicando o operador * ao
papel. Uma vez dentro da firma voc pode copiar seu contedo ou modific-lo.
Uma observao importante: apesar do smbolo ser o mesmo, o operador * (multiplicao) no o
mesmo operador que o * (referncia de ponteiros). Para comear o primeiro binrio, e o segundo
unrio.
Aqui vo dois exemplos de usos simples de ponteiros:
#include <stdio.h>
int main()
{
int num, valor;
int *p;
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
37
num = 55;
p = #
valor = *p; //atribuio de forma indireta
printf("\n\n%d\n",valor);
printf("Endereo para onde o ponteiro aponta: %p\n",p);
printf("Valor da varivel apontada: %d\n",*p);
return(0);
}
#include <stdio.h>
int main()
{
int num,*p;
num = 55;
p = # /* Pega o endereo de num */
printf("\nValor inicial: %d\n",num);
*p = 100; /*Muda o valor de num de uma maneira indireta */
printf("\nValor final: %d\n",num);
return(0);
}
Nos exemplos acima vemos um primeiro exemplo do funcionamento dos ponteiros. No primeiro
exemplo, o cdigo %p usado na funo printf() indica funo que ela deve escreva um endereo.
Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais simples, igualar
dois ponteiros. Se temos dois ponteiros p1 e p2 podemos igual-los fazendo p1=p2. Repare que
estamos fazendo com que p1 aponte para o mesmo lugar que p2. Se quisermos que a varivel
apontada por p1 tenha o mesmo contedo da varivel apontada por p2 devemos fazer *p1=*p2.
Basicamente, depois que se aprende a usar os dois operadores (& e *) fica fcil entender operaes
com ponteiros.
9.4 Cuidados com ponteiros
O principal cuidado ao se usar um ponteiro deve ser: saiba sempre para onde o ponteiro est
apontando. Isto inclui: nunca use um ponteiro que no foi inicializado. Um pequeno programa que
demonstra como no usar um ponteiro:
#include <stdio.h>
int main() /* Errado - No Execute */
{
int x,*p;
x = 13;
*p = x;
return(0);
}
Este programa compilar e rodar. O que acontecer? Ningum sabe. O ponteiro p pode estar
apontando para qualquer lugar. Voc estar gravando o nmero 13 em um lugar desconhecido. Com
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
38
um nmero apenas, voc provavelmente no vai ver nenhum defeito. Agora, se voc comear a
gravar nmeros em posies aleatrias no seu computador, no vai demorar muito para travar o
micro (se no acontecer coisa pior).
9.5 Exerccios em Classe
1. Aps a execuo do trecho de programa abaixo, o que ser impresso?
#include <stdio.h>
void main( void )
{
int x, *y;
x = 25;
y = &x;
*y += 2;
printf(%d, x );
}
2. Considere o trecho de programa abaixo. Quais sero os valores armazenados nas variveis aps
sua execuo?
#include <stdio.h>
void main( void )
{
int a = 2, b = 3, temp;
int *pa, *pb;
pb = &b;
pa = &a;
temp = *pb;
*pb = *pa;
*pa = temp;
}
3. Analise o trecho de programa abaixo e informe o que ser impresso aps a execuo.
#include <stdio.h>
void main( void )
{
float x, y, *z;
x = 10.0;
z = y;
*z = x + 2.5;
printf(x = %f, y = %f, x, y);
}
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
39
Captulo 10
Funes
10.1 Introduo
At agora os nossos programas foram codificados com uma funo principal (main()) onde toda a
atividade do programa ocorre. Em algumas situaes, utilizamos algumas funes definidas da
linguagem C tais como: rand(), pow(), sqrt(). Lembre-se que essas funes foram utilizadas dentro
da funo principal.
A medida que os nossos programas vo ficando maiores, sua complexidade aumenta e portanto fica
tambm mais difcil fazer manutenes e at mesmo entender a lgica do programa. Dessa forma,
as linguagens de programao permitem que os usurios separem seus programas em blocos. A
idia dividir programas grandes e complexos em blocos para facilitar a sua construo. Esses
blocos de construo so chamados em C de funes. Portanto, uma funo nada mais do que um
bloco de construo que realiza uma atividade especfica.
A declarao de uma funo em C segue o mesmo padro adotado para a funo principal do
programa. A sua forma geral :
tipo_de_retorno nome_da_funo ( declarao_de_parmetros )
{
corpo_da_funo;
}
O tipo_de_retorno o tipo de varivel que a funo vai retornar. O default o tipo int, ou seja, uma
funo para qual no declaramos o tipo de retorno considerada como retornando um inteiro. A
declarao de parmetros feita de forma semelhante a declarao de variveis que estamos
acostumados a fazer em nossos programas. A grande diferena na declarao dos parmetros que
devemos especificar o tipo para cada varivel. Exemplo:
tipo variavel1, tipo variavel2, tipo variavel3, ..., tipo variavelN
Estas variveis que compem os parmetros da funo representam as entradas para a funo. A
sada da funo est especifica no tipo de retorno. O copo_da_funo contm as instrues que iro
processar os dados de entrada (parmetros), gerando as sadas da funo.
Para que um valor seja retornado pela funo, deve-se utilizar o comando return. Quando se chega
a uma declarao return a funo encerrada imediatamente e, se o valor de retorno informado, a
funo retorna este valor. importante lembrar que o valor de retorno fornecido tem que ser
compatvel com o tipo de retorno declarado para a funo. A forma geral do comando return :
return valor_de_retorno;
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
40
Ou
return;
Abaixo apresentado um exemplo simples de um programa que calcula a raiz quadrada de um
nmero inteiro, usando uma funo definida.
#include <stdio.h>
int quadrado( int x )
{
return x*x;
}
int main()
{
int y, total;
printf(Digite um valor: );
scanf(%d, &y );
total = quadrado(y);
printf(O quadrado de %d %d, y, total);
return( 0 );
}
No exemplo acima, note que o retorno da funo quadrado() atribudo a uma varivel do tipo
inteiro. A situao abaixo no pode ser realizada, pois causar erros:
quadrado(y) = total;
10.2 Prottipos de funes
No exemplo anterior onde codificamos uma funo para calcular o quadrado de um nmero, o
cdigo da funo foi escrito antes da funo principal main(). Existe uma explicao para isso. No
momento da compilao da funo principal, nos locais onde as funes so chamadas, temos que
saber o tipo de retorno das funes e os parmetros das funes. Quando as funes definidas pelo
usurio esto antes da funo principal, ao compilar a funo main() o compilador j compilou as
funes e sabe os tipos de parmetros e retornos das funes.
Caso no seja possvel codificar as funes antes da funo main(), a linguagem C apresenta o
conceito de prottipos de funes. Os prottipos nada mais so do que declaraes de funes, ou
seja, voc declara a funo que ir usar. Dessa forma, o compilador ser informado sobre a funo e
os tipos de valores que a funo recebe e retorna. O formato para um prottipo de funo :
tipo_de_retorno nome_da_funo( lista_de_parmetros );
sendo que o tipo_de_retorno, o nome_da_funo e a lista_de_parmetros so os mesmo que voc
utilizar na codificao da funo. O prottipo representa o cabealho da funo (sem o cdigo).
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
41
Repare tambm que o prottipo de uma funo termina com ponto e vrgula. Na codificao da
funo no podemos terminar o cabealho com ponto e vrgula.
Como exemplo vamos reescrever o programa que utiliza uma funo definida pelo usurio para
calcular o quadrado de um nmero, usando prottipos.
#include <stdio.h>
int quadrado( int x );
int main()
{
int y, total;
printf(Digite um valor: );
scanf(%d, &y );
total = quadrado(y);
printf(O quadrado de %d %d, y, total);
return( 0 );
}
int quadrado( int x )
{
return x*x;
}
No exemplo acima, a funo quadrado() foi codificada aps a funo main(), mas seu prottipo foi
declarado antes.
Quando temos uma funo que no retorna nenhum tipo de valor ou que no recebe nenhum
parmetro, utilizamos o tipo void na especificao. A palavra void do ingls significa vazio. Como
exemplo, considere a funo abaixo que no retorna nenhum valor e tambm no recebe nenhum
parmetro.
#include <stdio.h>
void escreva( void );
int main( main )
{
escreva();
return( 0 );
}
void escreva( void )
{
printf(Testando!);
}
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
42
Repare no exemplo acima que s utilizamos o comando return quando uma funo deve retornar
um valor ou ser interrompida (como j foi visto).
10.3 Passagem de Parmetros
Nos exemplos anteriores, quando chamamos as funes passamos valores paras as mesmas. Isso
acontece porque valores declarados em uma funo no so acessveis dentro de outra. Em C temos
dois tipos de passagem de parmetros: passagem por valor e passagem por referncia.
Na passagem por valor como o prprio nome indica, apenas uma cpia dos valores so passados
para a funo. As alteraes realizadas pela funo no so feitas nos valores originais do
parmetro. Como exemplo podemos citar o programa para o clculo do quadrado de um nmero
codificado anteriormente. Vamos considerar outro exemplo abaixo:
#include <stdio.h>
float somar( float x, float y );
int main( void )
{
float a, b, total;
printf(Digite um valor: );
scanf(%f, &a );
printf(Digite um valor: );
scanf(%f, &b );
total = somar( a, b );
printf(a soma dos nmeros : %f, total );
return( 0 );
}
float somar( float x, float y )
{
float t;
t = x + y;
return t;
}
No exemplo acima, os valores declarados na funo main() so passados para a funo somar(),
que realiza a soma e retorna o resultado. Veja que os valores originais na funo main() no so
alterados. Esse tipo de passagem de parmetro por valor, e o padro da linguagem.
Uma outra maneira de passagem de parmetros quando a funo que recebe os parmetros
consegue alterar os valores originais na funo onde os mesmos foram declarados. Esse tipo de
passagem de parmetro conhecido como passagem por referncia. Neste caso a referncia
(endereo) das variveis so passadas para as funes. Considere o exemplo abaixo:
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
43
#include <stdio.h>
void troca( float *x, float *y );
int main( void )
{
float a, b;
printf(Digite um valor: );
scanf(%f, &a );
printf(Digite um valor: );
scanf(%f, &b );
troca( &a, &b );
printf(a = %f e b = %f, a, b );
return( 0 );
}
void troca( float *x, float *y )
{
float t;
t = *x;
*x = *y;
*y = t;
}
O que acontece no exemplo acima que estamos passando para a funo troca() os endereos das
variveis a e b. Estes endereos so armazenados nos ponteiros x e y da funo. Como vimos no
captulo anterior, o operador (*) utilizado para acessar o contedo apontado pelos ponteiros.
Uma utilizao muito comum de passagem de parmetros por referncia quando uma funo deve
retornar dois ou mais valores. Lembre-se que uma funo retorna apenas um valor. Dessa forma, a
soluo passar os parmetros por referncia.
10.4 Passagem de arrays para funes
Da mesma forma que passamos variveis comuns para as funes, tambm podemos passar arrays.
Vamos considerar como exemplo a seguinte declarao para um array unidimensional:
int y[200];
Considere tambm que queiramos chamar a funo alterar() e passar o array y como parmetro.
Para passarmos o array para a funo, apenas referenciamos o nome da varivel. Exemplo:
alterar( y );
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
44
O diferencial est na declarao da varivel que ir receber o parmetro. Essa declarao pode ser
feita de duas maneiras diferentes:
1. void alterar( int t[200] );
2. void alterar( int *t );
Quando passamos um array para uma funo em C, a passagem de parmetros feita por
referncia. Nas trs situaes acima, a funo alterar() recebe um ponteiro (endereo) do primeiro
elemento armazenado no array. Esse tipo de passagem de parmetro bem prtico para a
linguagem. Imagine a situao onde temos um array com uma quantidade grande de elementos, se a
passagem dos parmetros fosse por valor, o compilador teria que fazer uma cpia de todos os
valores para a funo, o que poderia haver uma perda de desempenho do programa.
A manipulao do array dentro da funo realizada da mesma forma que estvamos manipulando,
independentes da forma com que o parmetro declarado.
10.5 Escopo de variveis
As variveis que utilizamos em nossos programas podem ser declaradas em trs lugares diferentes.
Dependendo da sua declarao, a abrangncia das variveis muda. Os trs tipos so:
Variveis locais;
Variveis globais;
Parmetros formais.
Os nossos primeiros programas em C usavam apenas a funo main(). Dessa forma, todas as
variveis eram declaradas dentro dessa funo. Essas variveis so denominadas variveis locais, e
s tem validade dentro do bloco onde foram declaradas.
As variveis globais so declaradas fora das funes de um programa, podendo ser acessadas e
alteradas por todas as funes.
Os parmetros formais se referem as variveis que so declaradas para receber os parmetros das
funes. Essas variveis s apresentam abrangncia enquanto a funo est sendo executada, ou
seja, essas variveis so locais a funo.
10.6 Exerccios em Classe
1. Considere o programa em C abaixo
#include <stdio.h>
int teste( int a, int b );
int main( void )
{
int x = 9, y = 5, total;
total = teste( x, y );
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
45
return( 0 );
}
int teste( int a, int b )
{
int y;
y = a % b;
return y;
}
Qual ser o valor armazenado na varivel total aps a execuo do programa acima?
2. Analise o programa abaixo e responda:
#include <stdio.h>
#include <math.h>
int teste( int a );
int main( void )
{
int x = 144, total;
total = teste( x );
return( 0 );
}
int teste( int a )
{
int y;
y = sqrt( a );
return y;
}
a) Qual o valor armazenado na varivel total aps a execuo do programa?
b) Quais so as variveis globais do programa acima?
c) Indique todas as variveis locais e a quais funes elas pertencem.
3. Escreva um programa em C que contenha uma funo que receba como parmetro um array
unidimensional contendo 1000 nmeros inteiros. A funo dever encontrar e retornar o maior
elemento armazenado no array.
4. Reescreva apenas a funo do exerccio anterior, usando passagem de parmetros por
referncia.
5. Escreva apenas uma funo em C que receba como parmetro uma string e retorne a quantidade
de vogais presentes na string.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
46
6. Analise o programa abaixo:
#include <stdio.h>
void teste( int *x, int *y );
int main( void )
{
int a = 10, b = 7;
teste( &a, &b );
return( 0 );
}
void teste( int *x, int *y )
{
*x += *y;
*y -= 4;
}
Aps a execuo do programa acima, quais sero os valores armazenados respect ivamente nas
variveis a e b?
7. Escreva um programa em C contendo uma funo que receba como parmetro um valor inteiro
com trs dgitos. A funo dever determinar o valor armazenado na casa das dezenas. Por
exemplo: 123 = 2. Utilize passagem de parmetros por referncia.
8. Escreva um programa em C contendo uma funo que receba como parmetro um valor inteiro
positivo, representando um termo na seqncia de Fibonacci. A funo dever retornar o valor
correspondente ao termo. Utilize passagem de parmetros por referncia.
9. Um nmero chamado triangular quando o resultado do produto de trs nmeros
consecutivos. Por exemplo: 24 = 2 x 3 x 4. Escreva apenas uma funo em C que receba como
parmetro um nmero inteiro e positivo e verifique se o mesmo triangular. Utilize passagem de
parmetro por valor.
10. Escreva apenas uma funo em C que receba como parmetro um array bidimensional
(quadrado de ordem 10 contendo valores inteiros). Calcule e retorne a soma dos elementos da
diagonal principal.
10.7 Exerccios Complementares
11. Escreva um programa em C contendo uma funo que receba um nmero inteiro. A funo
dever retornar o sucessor e o antecessor do nmero. Utilize passagem de parmetro por referncia.
12. Escreva um programa em C que contenha uma funo que receba como parmetro trs valores
inteiros. A funo dever encontrar o maior dos trs valores e retornar para a funo principal que
dever escreva o valor no vdeo. Utilize passagem de parmetros por valor.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
47
13. Reescreva o programa do exerccio anterior utilizando passagem de parmetros por referncia.
14. Reescreva a funo do exerccio 9, utilizando passagem de parmetro por referncia.
15. Escreva apenas uma funo em C que receba como parmetro uma string e retorne a ltima
letra.
16. Escreva apenas uma funo em C que receba um valor representando uma temperatura na escala
Fahrenheit e converta para a escala Centgrados. A frmula de converso :
5
160 9 +
=
C
F , onde F
representa a temperatura em Fahrenheit e C em Centgrados.
17. Escreva um programa em C, contendo uma funo que receba trs valores inteiros. Seu
programa dever escreva os valores em ordem crescente. Utilize passagem de parmetros por
referncia.
18. Escreva um programa em C para calcular e escreva as razes de uma equao do 2 grau. Seu
programa dever ter duas funes: uma para o clculo do delta e a outra para calcular as razes da
equao.
19. Escreva apenas uma funo em C que receba como parmetro trs valores inteiros e positivos e
verifique se os mesmo podem formar um tringulo. Lembre-se que: trs nmeros podem representar
os lados de um tringulo se cada lado menor que a soma dos outros dois. Utilize passagem de
parmetro por referncia.
20. Escreva um programa em C, contendo uma funo que calcule e retorne o valor da expresso:
16
3 5
2
+
=
x
x
y .
21. Escreva apenas uma funo em C que receba como parmetro uma frase e retorne o valor do
caractere localizado no meio da frase, caso a frase tenha um nmero mpar de caracteres.
22. Escreva um programa em C, contendo uma funo que calcule e retorne o valor da expresso:
N
h
1
...
4
1
3
1
2
1
1 + + + = .
23. Escreva apenas uma funo em C que calcule e retorne o valor da expresso:
n
n
n n n
y +
+ +
+ =
2
1
...
2
3
1
2 1
.
24. Repare a seguinte caracterstica do nmero 3025: 30 + 25 = 55 e 55
2
= 3025. Escreva um
programa em C contendo uma funo que verifique um nmero com quatro dgitos apresenta a
caracterstica acima. Seu programa dever leia vrios nmeros(um de cada vez). O programa
termina quando for lido um valor menor do que 1000 ou maior que 9999.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
48
25. Uma empresa classifica seus funcionrios em trs nveis de acordo com um ndice de
produtividade. So eles: (1) Excelente, (2) Bom e (3) Regular. Cada nvel acrescenta um abono ao
salrio base do funcionrio, de acordo com a seguinte tabela:
Nvel Aumento
Excelente 80% do salrio base
Bom 50% do salrio base
Regular 30% do salrio base
Escreva um programa em C que leia o cdigo do funcionrio (numrico), seu salrio base e seu
nvel. O programa dever escreva o novo salrio do funcionrio. O clculo do salrio dever ser
feito por uma funo. O programa dever ser executado para vrios funcionrios at que o cdigo 0
seja informado.
26. Escreva um programa em C que apresente o seguinte menu de opes para os usurios:
Escolha uma opo:
1. somar
2. subtrair
3. Multiplicar
4. Dividir
Resultado:
O usurio dever escolher uma opo vlida e em seguida fornecer dois valores. Dependendo da
opo escolhida, seu programa dever executar os clculos e exibir o resultado. Utilize uma funo
para cada opo.
27. A concessionria local de telefonia de uma cidade do interior gostaria de fazer um programa
que pudesse controlar a central de 1000 assinantes que foi disponibilizada para a cidade. Faa um
programa que funcione de acordo com o seguinte menu:
Menu de Opes:
1. Incluso de novo telefone
2. Alterao de telefone
3. Excluso de telefone
4. Impresso dos telefones cadastrados.
5. Consulta por nome
6. Sair
Para cada uma das opes do menu dever ter uma funo no seu programa. Sugesto: trabalhe com
dois arrays, um para o nmero dos telefones e o outro para os nomes. Declare os arrays como
variveis globais.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
49
Captulo 11
Estruturas
11.1 Definio e declarao de estruturas em C
At o momento vimos como agrupar vrias informaes (utilizando arrays) do mesmo tipo. Em C
podemos agrupar tambm informaes de tipos diferentes formando um novo tipo de dados. Esse
novo tipo chamado de tipo personalizado ou tipos definidos pelo usurio. Este tipo conhecido
como estrutura em C ou como registro em algumas linguagens de programao como o pascal.
Define-se estrutura como um conjunto de variveis que so referenciadas sob o mesmo nome,
oferecendo um meio de manter as informaes relacionadas juntas. Como exemplo de uma
estrutura podemos citar uma ficha pessoal contendo nome, telefone e endereo. Essas trs
informaes esto relacionadas entre si para compor a ficha. A ficha em si a estrutura.
Para se criar uma estrutura em C usa-se o comando struct. Sua forma geral :
struct nome_da_estrutura
{
tipo_1 nome_1;
tipo_2 nome_2;
...
tipo_n nome_n;
} variveis_estrutura;
O nome_da_estrutura o nome para a estrutura. As variveis_estrutura so opcionais e seriam
nomes de variveis que o usurio j estaria declarando e que seriam do tipo nome_da_estrutura.
Note que a declarao terminada com ponto e vrgula (;). Um primeiro exemplo:
struct teste{
float i;
int f;
} a, b;
Neste caso, teste uma estrutura com dois campos, i e f. Foram tambm declaradas duas variveis,
a e b que so do tipo da estrutura, isto , a possui os campos i e f, o mesmo acontecendo com b. O
exemplo abaixo cria uma estrutura de endereos:
struct tipo_endereco
{
char rua [50];
int numero;
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
50
char bairro [20];
char cidade [30];
char sigla_estado [3];
long int CEP;
};
Um outro exemplo a criao de uma estrutura chamada pessoa, que contm os dados pessoais de
um individuo:
struct pessoa
{
char nome [50];
long int telefone;
struct tipo_endereco endereco;
};
Como mostrado no exemplo acima, uma estrutura pode fazer parte de outra (a struct tipo_endereco
usada pela struct ficha_pessoal).
O programa abaixo mostra como as duas estruturas declaradas acima podem ser utilizadas dentro de
um programa. O programa preenche uma ficha pessoal de um cliente.
#include <stdio.h>
#include <string.h>
struct tipo_endereco
{
char rua[50];
int numero;
char bairro[20];
char cidade[30];
char sigla_estado[3];
long int CEP;
};
struct pessoa
{
char nome[50];
long int telefone;
struct tipo_endereco endereco;
};
int main( void )
{
struct pessoa ficha;
strcpy (ficha.nome,"Luiz Osvaldo Silva");
ficha.telefone=4921234;
strcpy (ficha.endereco.rua,"Rua das Flores");
ficha.endereco.numero=10;
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
51
strcpy (ficha.endereco.bairro,"Cidade Velha");
strcpy (ficha.endereco.cidade,"Belo Horizonte");
strcpy (ficha.endereco.sigla_estado,"MG");
ficha.endereco.CEP=31340230;
return 0;
}
O programa acima declara uma varivel ficha do tipo pessoa e preenche os seus dados. O exemplo
mostra como podemos acessar um elemento de uma estrutura: basta usar o ponto (.). Assim, para
acessar o campo telefone de ficha, escrevemos:
ficha.telefone = 4921234;
Como a struct pessoa possui um campo, endereco, que tambm uma struct, podemos fazer acesso
aos campos desta struct interna da seguinte maneira:
ficha.endereco.numero = 10;
ficha.endereco.CEP=31340230;
Desta forma, estamos acessando, primeiramente, o campo endereco da struct ficha e, dentro deste
campo, estamos acessando o campo numero e o campo CEP.
11.2 Matrizes de estruturas
Uma estrutura como qualquer outro tipo de dado no C. Podemos, portanto, criar matrizes de
estruturas. Vamos ver como ficaria a declarao de um array de 100 do tipo struct pessoa:
struct pessoa fichas [100];
Poderamos ento acessar a segunda letra da sigla de estado da dcima terceira ficha fazendo:
fichas[12].endereco.sigla_estado[1];
Observao: Como todas as matrizes, matrizes de estruturas comeam a indexao em 0.
11.3 Passando elementos de estruturas como parmetros para funes
Nos exemplos apresentados acima para a utilizao de estruturas, as mesmas sempre foram
declaradas como variveis globais. Para passar um elemento de uma varivel estrutura para uma
funo simples, pois voc passa apenas o valor desse elemento para a funo. Exemplo:
struct misterio{
char x;
int y;
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
52
float z;
char s[10];
} teste;
func( teste.x ); //passa apenas o valor do caractere x para a funo
func( teste.y ); //passa apenas o valor da varivel y para funo
func( teste.s[2] ); //passa o valor do caractere de s[2]
Nos exemplos mostrados acima, temos a passagem de parmetros por valor. Caso seja necessrio
passar o endereo de um elemento individual da estrutura, basta colocar o operado & antes da
varivel do tipo da estrutura. Exemplo:
func( &teste.x ); //passa o endereo do caractere x para a funo
func( &teste.y ); //passa o endereo da varivel y para a funo
func( teste.s ); //passa o endereo da string s para a funo.
No se esquea que o operador & precede o nome da varivel do tipo estrutura e no o nome do
elemento individual da estrutura. Outro ponto a destacar com relao a variveis do tipo vetores
de caracteres (strings) que j significam endereos de memria, portanto a utilizao do operador &
dispensvel.
11.4 Passando estruturas inteiras para funes
No tpico anterior passamos elementos individuais como parmetros para funes. Da mesma
forma, podemos passar para uma funo a estrutura inteira. Quando uma estrutura for passada como
parmetro para uma funo, no se esquea que o tipo de argumento deve coincidir com o tipo de
parmetro. Veja o exemplo abaixo:
void main( void )
{
struct exemplo{
int a, b;
char c;
} d;
d.a = 1000;
f( d );
}
f( struct {
int x, y;
char h; } p )
{
printf(%d, p.x);
}
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
53
11.5 Ponteiros para estruturas
A linguagem de programao C permite a utilizao de ponteiros para estruturas da mesma forma
que permite a utilizao de ponteiros para os outros tipos de variveis. Como para as outras
variveis, a declarao do ponteiro feita utilizando o operador * na frente do nome da estrutura.
Exemplo:
struct teste *p;
No exemplo acima, a varivel p armazena o endereo de memria da estrutura teste. Ponteiros para
estruturas apresentam duas aplicaes bsicas:
Gerar passagem por referncia
Criao de estruturas de dados encadeadas (listas). Este ser o enfoque do curso de Estruturas
de Dados 1 no prximo ano.
A principal desvantagem da passagem de estruturas por valor est no tempo necessrio para
armazenar e retirar todos os elementos da estrutura da pilha, caso a estrutura apresente muitos
membros. Estruturas grandes quando passadas por valor podem prejudicar o desempenho do
programa. O mesmo no acontece para estruturas pequenas.
Uma soluo para no comprometer o desempenho do programa quando uma estrutura grande
precisa ser passada para uma funo, a utilizao de ponteiros para estruturas. Neste caso, apenas
um endereo de memria armazenado na pilha. Exemplo da atribuio do endereo de uma
estrutura para uma varivel ponteiro.
struct teste {
int a, b;
float x;
} y;
struct teste *p;
p = &y;
Quando utilizamos ponteiros para estruturas, a forma de acessar os dados sofre alterao. Nesta
situao utiliza-se o operador () ao operador (.). Por exemplo:
pa = 10;
O operador seta somente utilizado quando se est acessando um elemento de estrutura atravs de
um ponteiro para a estrutura.
11.6 Comando typedef
A linguagem C permite que o programador defina novos nomes aos tipos de dados que esto sendo
criados. Para definir esses nomes utiliza-se o comando typedef. Vale salientar que o comando
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
54
typedef utilizado apenas para definir um novo nome para um tipo existente. A forma geral do
comando typedef :
typedef tipo nome;
sendo tipo qualquer tipo de dados permitido pela linguagem e nome o novo nome para esse tipo.
O novo nome a ser definido nada mais do que uma opo ao nome antigo e no uma substituio.
Como exemplo, podemos criar um novo nome para o tipo de dado int usando:
typedef int carro;
A instruo acima informa ao compilador que carro um outro nome para o tipo int. Dessa forma,
para declarar uma varivel do tipo inteiro podemos ter duas opes:
int y;
carro y;
11.7 Exerccios em Classe
1. Analise o programa em C abaixo:
#include <stdio.h>
struct teste {
int x, y;
};
void func ( struct teste *t );
int main( void )
{
struct teste p;
p.x = 10;
p.x = 20;
func( &p );
return( 0 );
}
void func( struct teste *t )
{
t x = t x * 2;
t y = t x - t y;
}
Aps a execuo do programa acima, quais so os valores armazenados respectivamente nas
variveis x e y?
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
55
2. Escreva um programa em C que declare uma estrutura chamada ponto. Esta estrutura ser
composta por duas variveis x e y, que representam as coordenadas do ponto. Em seguida declare 2
pontos, leia as respectivas posies de cada um e calcule a distncia entre eles. A distncia entre
dois pontos dada pela seguinte expresso:
2 2
) 1 2 ( ) 1 2 ( y y x x d + = . Exiba a distncia entre
os pontos.
3. Escreva um programa em C para armazenar o nome e o salrio de 100 funcionrios de uma
empresa. O seu programa dever ter uma funo que retorne o valor do maior salrio pago pela
empresa.
4. Um nmero real um nmero que apresenta uma parte inteira e uma parte decimal. Por
exemplo: 1.567, 20.878 etc. Deseja-se criar uma representao computacional que simule um
nmero real.
a) Defina em C uma estrutura para representar um nmero real.
b) Escreva uma funo em C que receba como parmetro (passagem por referncia) um nmero
real conforme definido no item a e retorne apenas a parte inteira.
5. Para uma turma de 40 alunos, escreva um programa em C que permita armazenar o nome a
respectiva nota de cada um dos alunos na disciplina Algoritmos. Exiba a mdia geral da turma e
quantidade de alunos que ficaram com nota acima da mdia.
6. Em uma garagem existe um registro de todos os carros que esto venda. Sabe-se que a
garagem comporta no mximo 20 carros. Para cada carro tem-se registrado o modelo, a cor e o ano
de fabricao. Escreva apenas uma funo em C que retorne a quantidade de carros que foram
fabricados antes de 2000.
11.8 Exerccios Complementares
7. Com base no exerccio 2, escreva um programa em C que declare 3 pontos. Mostre qual a maior
distncia entre os pontos.
8. Em uma pizzaria, quando um cliente liga para fazer um pedido so anotados o nome do cliente,
e o sabor da pizza (mussarela, calabresa e marguerita). Suponha que em uma hora foram feitos 6
pedidos. Escreva um programa em C, que contenha uma funo que escreva a porcentagem de cada
sabor de pizza pedido.
9. Os nmeros complexos apareceram no sculo XVI ao longo das descobertas de procedimentos
gerais para resoluo de equaes algbricas de terceiro e quarto grau. No sculo XVII os
complexos so usados de maneira tmida para facilitar os clculos. No sculo XVIII so mais
usados na medida que se descobre que os complexos permitem a conexo de vrios resultados
dispersos da Matemtica no conjunto dos nmeros reais. No entanto, nada feito para esclarecer o
significado desses novos nmeros. No sculo XIX, aparece a representao geomtrica dos
nmeros complexos, motivada pela necessidade em Geometria, Topografia e Fsica, de se trabalhar
com o conceito de vetor no plano. Os nmeros complexos passam a ser aplicados em vrias reas
do conhecimento humano, dentro e fora da Matemtica.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
56
Um nmero complexo todo nmero que pode ser formado por duas partes: a parte real e a parte
imaginria. A representao geral de um nmero complexo :
bi a z + =
sendo a e b nmero reais. O nmero a a parte real e o nmero b a parte imaginria. Exemplos de
nmero complexos: 2+3i, 5+i. O smbolo i que indica que um nmero complexo tem valor 1 .
Com base nas informaes do texto, responda:
a) Defina em C uma estrutura que possa representar um nmero complexo.
b) Escreva uma funo em C que receba como parmetro (passagem por referncia) dois nmeros
complexos conforme definido no item a e verifique se so iguais. Por exemplo: y = a+bi e x
= c+di. Estes nmeros so iguais se a = c e b = d.
10. Escreva um programa em C que faa a manuteno da conta bancria de 10 possveis clientes
do banco Z. Dever ser apresentado o usurio o seguinte menu:
Cada uma das opes do menu dever ser codificada dentro de uma funo especifica.
Escolha uma opo:
1. Cadastro de clientes
2. Efeturar saque
3. Efeturar depsito
4. Imprimir clientes
Digite uma opo [ ]
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
57
Captulo 12
Manipulao de arquivos em C
12.1 Introduo
O armazenamento de dados em variveis e arrays temporrio, ou seja, os dados so perdidos
quando uma varivel local sai do escopo ou quando o programa termina. Portanto, os arquivos
so utilizados para reteno em longo prazo de grandes quantidades de dados, mesmo depois que o
programa termina. Estes dados so armazenados em dispositivos de armazenamento secundrio
como discos magnticos, discos pticos, etc.
12.2 Streams
Em C, o sistema de arquivos trabalha com vrios dispositivos diferentes. Dessa forma, o sistema de
arquivos deve conseguir trabalhar com esses dispositivos da mesma forma, embora esses
dispositivos sejam muito diferentes. Isso acontece porque o sistema de arquivo transforma-os em
um dispositivo lgico chamado streams. Estas streams so independentes do dispositivo.
Existem dois tipos de streams: texto e binria. Uma stream de texto nada mais do que uma
seqncia de caracteres. Por outro lado, uma stream binria uma seqncia de bytes. Em C
devemos associar uma stream com um arquivo especfico atravs da operao de abertura.
Cada stream associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE. Essa
estrutura definida no cabealho STDIO.H
As principais funes para manipular um arquivo esto relacionadas na tabela abaixo:
Nome Funo
fopen() Abre um arquivo
fclose() Fecha um arquivo
putc() Escreve um caractere em um arquivo
getc() L um caractere de um arquivo
fseek() Posiciona o ponteiro de arquivo em um byte especfico
feof() Devolve verdadeiro se o fim de arquivo for atingido
ferror() Devolve verdadeiro se ocorreu um erro
rewind() Repe o ponteiro de posio de arquivo no incio do arquivo
remove() Apaga um arquivo
fflush() Descarrega um arquivo
Para realizar as operaes bsicas em um arquivo (escrever e leia), seu programa precisa usar
ponteiros para arquivos.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
58
Um ponteiro de arquivo um ponteiro para as informaes sobre o arquivo tais como seu nome,
status e posio atual do arquivo. Um ponteiro de arquivo uma varivel do tipo FILE que
definido em STDIO.H. A declarao dessa varivel :
FILE *arq;
12.3 Abrindo um arquivo
A abertura de um arquivo realizada com a funo fopen(). Esta funo associa um arquivo a uma
stream. O retorno da funo fopen() um ponteiro do tipo FILE para o arquivo que est sendo
aberto. A funo fopen() necessita de dois parmetros: o primeiro um ponteiro para uma cadeia
de caracteres que representa o nome do arquivo e o segundo o modo como o arquivo ser aberto,
ou seja, apenas para leitura, apenas para escrita ou leitura e escrita ao mesmo tempo.
Os valores para o modo de leitura esto relacionados na tabela abaixo.
Modo Funo
r Abre um arquivo texto para leitura
w Cria um arquivo texto para escrita
a Anexa a um arquivo texto
rb Abre um arquivo binrio para leitura
wb Cria um arquivo binrio para escrita
ab Anexa a um arquivo binrio
r+ Abre um arquivo texto para leitura/escrita
w+ Cria um arquivo texto para leitura/escrita
a+ Anexa ou cria um arquivo texto para leitura/escrita
r+b Abre um arquivo binrio para leitura/escrita
w+b Cria um arquivo binrio para leitura/escrita
a+b Anexa um arquivo binrio para leitura/escrita
No momento da abertura de um arquivo, caso ocorra algum problema, a funo fopen() devolver
um ponteiro nulo. Portanto, devemos sempre testar o valor de retorno antes de utilizarmos o
ponteiro.
O trecho de cdigo abaixo mostra a abertura de um arquivo.
FILE *arq;
arq = fopen( teste, w );
if( arq == NULL )
{
printf(O arquivo no pde ser aberto);
exit(1);
}
Caso voc utilize a funo fopen() para abrir um arquivo no modo de escrita, e exista algum
arquivo com o mesmo nome este ser apagado e um novo arquivo ser criado, caso no exista, o
arquivo ser criado. Arquivos existentes s podem ser abertos no modo de leitura. Se porventura
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
59
voc quiser adicionar informaes ao final do arquivo, o mesmo deve ser aberto no modo anexar. O
modo de leitura/escrita no apagar um arquivo se ele j existir.
12.4 Fechando um arquivo
Para fechar um arquivo associado a uma stream usamos o comando fclose(). Se a operao for bem-
sucedida, a funo retornar o valor zero. Qualquer outro valor indica erro. A utilizao do
comando fclose() exemplificada abaixo.
fclose( arq );
12.5 Escrevendo e lendo caracteres em um arquivo
A operao para escrever caracteres em um arquivo pode ser realizada atravs de duas funes
equivalentes: putc() e fputc(). Ambas as funes so utilizadas para escrever caracteres em um
arquivo que foi previamente aberto no modo escrita. A sintaxe para a funo putc() :
int putc( int ch, FILE *arq );
sendo que ch o caractere que ser escrito no arquivo e arq o ponteiro de arquivo devolvido pela
funo fopen(). Por razes mais antigas, o caractere ch do tipo inteiro. Caso a operao for bem-
sucedida, a funo retornar o caractere escrito, caso contrrio retornar EOF (end of file).
O processo de leitura de caracteres de um arquivo tambm envolve duas funes: getc() e fgetc().
Ambas as funes lem caracteres de um arquivo previamente aberto no modo leitura. A sintaxe
para a funo getc() :
int getc( FILE *arq );
Se a operao for bem sucedida, a funo retornar um inteiro. Quando o final do arquivo for
atingido um EOF ser retornado.
O programa abaixo utiliza as funes apresentadas acima para abrir e escrever caracteres em um
arquivo.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *arq;
char ch;
arq = fopen( teste.txt, w );
if( arq == NULL )
{
printf(arquivo no pode ser aberto);
exit(1);
}
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
60
do {
ch = getchar();
putc( ch, arq );
} while( ch != $ );
fclose( arq );
return( 0 );
}
Abaixo vamos abrir o arquivo criado no programa acima e leia os caracteres gravados.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *arq;
char ch;
arq = fopen( teste.txt, r );
if( arq == NULL )
{
printf(arquivo no pode ser aberto);
exit(1);
}
//l um caractere
ch = getc( arq );
while( ch != EOF )
{
putchar( ch );
ch = getchar( fp );
}
fclose( arq );
return( 0 );
}
12.6 Escrevendo e lendo strings em um arquivo
Da mesma forma que podemos escrever e leia apenas caracteres de um arquivo, C apresenta
funes para leitura e escrita de strings. As funes so: fputs() e fgets(). Ambas as funes operam
de forma semelhante s funes putc() e getc().
A funo fgets() l uma string at que um caractere de nova linha seja lido ou que o comprimento
de caracteres especificado para leitura tenham sido lidos. A string resultante ser terminada por um
nulo.
O programa abaixo mostra a utilizao das funes fputs() e fgets().
#include <stdio.h>
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
61
#include <stdlib.h>
int main()
{
char s[80];
FILE *arq;
arq = fopen( teste.txt, w );
if( arq == NULL )
{
printf(o arquivo no pode ser aberto );
exit(1);
}
do {
printf(Entre com uma string (enter para sair): \n);
gets( s );
strcat( s, \n );
fputs( s, arq );
} while( *s != \n);
return( 0 );
}
12.7 Funes fread() e fwrite()
Quando desejamos escrever ou leia tipos de dados que apresentam mais que um byte, as funes
fread() e fwrite() so utilizadas. Estas funes apresentam sintaxes diferentes das funes
apresentadas at agora.
size_t fread( void *buf, size_t num_bytes, size_t count, FILE *arq );
size_t fwrite( void *buf, size_t num_bytes, size_t count, FILE *arq );
Para fread(), buf um ponteiro para a regio de memria que contm os dados que sero lidos. Para
fwrite() um ponteiro para as informaes que sero escritas no arquivo; num_bytes o tamanho
da informao que ser lida ou escrita. O argumento count determina quantos itens sero copiados.
O tipo de dado size_t definido na biblioteca STDIO.H e aproximadamente o mesmo que
unsigned.
A funo fread() devolve o nmero de itens lidos e funo fwrite() o nmero de itens escritos.
Estas funes podem ser utilizadas tanto para arquivos do tipo texto quanto para arquivos do tipo
binrio.
O programa abaixo escreve um valor do tipo double e um do tipo inteiro em um arquivo e depois
faz a leitura dos dados.
#include <stdio.h>
#include <stdlib.h>
int main()
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
62
{
double d = 12.33;
long l = 1230456;
FILE *arq;
arq = fopen( num.txt, wb+ );
if( arq == NULL )
{
printf(o arquivo no pode ser aberto );
exit(1);
}
fwrite( &d, sizeof( double ), 1, arq );
fwrite( &l, sizeof( long ), 1, arq );
rewind( arq );
fread( &d, sizeof( double ), 1, arq );
fread( &l, sizeof( long ), 1, arq );
printf(Os valores so %f %ld, d, l );
fclose( arq );
return( 0 );
}
Uma das aplicaes que aparecem com freqncia na manipulao de arquivos envolve a leitura e a
escrita de valores definidos pelo usurio. Considere a seguinte declarao:
struct lista {
float salrio;
char nome[40];
} custo;
A instruo abaixo escreve o contedo de custo no arquivo apontado por arq.
fwrite( &custo, sizeof( lista ), 1, arq );
12.8 Exerccios
1. Escreva um programa em C que preencha uma matriz quadrada de ordem 4 com valores
aleatrios entre 0 e 100. Em seguida grave os dados em um arquivo do tipo texto.
2. Considere um registro contendo o nome o curso de 10 alunos. Escreva um programa em C que
permita entrar com os dados e armazen-los em um arquivo.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
63
Bibliografia
ARAKAKI R. e outros. Fundamentos de Programao C: Tcnicas e Aplicaes. Rio
de Janeiro, Livros Tcnicos e Cientficos Editora Ltda, 1989. Campinas, So Paulo,
2000.
Curso de C - http://ead1.eee.ufmg.br/cursos/C/c.html
DEITEL, H. M., DEITEL, P.J. C++ - Como Programar. 3 Edio, Editora Bookman,
Porto Alegre, RS.
FORBELLONE, A. L. V. & EBERSPCHER, H. F. Lgica de programao - a
construo de algoritmos e estruturas de dados. So Paulo, Makron Books, 2a Ed.,
2000.
http://www.icmc.sc.usp.br/ensino/material/ Apostila de Tpicos de Linguagens de
MANZANO, J. A. N. G. & OLIVEIRA, J. F. Algoritmos: lgica para
desenvolvimento de programao. So Paulo: rica, 8a Ed., 2000.
MANZANO, J. A. N. G. Estudo dirigido: Linguagem C. So Paulo: rica, 1997.
MIZRAHI, V. V. Treinamento em Linguagem C Curso Completo Mdulo 1. 1
Edio, Editora Makron Books, So Paulo, SP.
MIZRAHI, V. V. Treinamento em Linguagem C Curso Completo Mdulo 2. 1
Edio, Editora Makron Books, So Paulo, SP.
MORAES, P. S. Lgica de programao, Centro de Computao - DSC, Unicamp,
Programao. Instituto de Cincias Matemticas e de Computao USP, So
Carlos.
SALVETTI D.D. & BARBOSA L.M. Algoritmos. Makron Books, So Paulo, 1998.
SCHILDT, H. C Completo e Total. 3 Edio, Editora Makron Books, So Paulo, SP,
1997.
SCHILDT, H. Turbo C++. So Paulo, Makron Books, 1992.
SEBESTA R. W. Conceitos de linguagem de programao. Bookman Editora, 4
edio, Porto Alegre, 2000.
Algoritmos / Linguagem C Prof. Mauricio Duarte
(maur.duarte@gmail.com)
64
SMULLYAN, R. Alice no Pas dos Enigmas, Jorge Zahar Editor, Rio de Janeiro,
2000.
ZIVIANI, N. Projeto de Algoritmos com implementaes em Pascal e C. 2 Edio,
Editora Pioneira Informtica, So Paulo, SP, 1993.