Vous êtes sur la page 1sur 80

Programao de Computadores II

Prof. Erlon Pinheiro

Programao de Computadores II

Prof. Erlon Pinheiro

Sumrio
Unidade 1: MODULARIZAO..................................................................................... 5
1.1 - Introduo..............................................................................................................5
1.2 - MODULARIZAO EM C.................................................................................6
1.2.1 - Introduo s Funes....................................................................................6
1.2.2 Argumentos e Passagem de parmetros........................................................ 8
1.2.3 - Retornando valores.........................................................................................9
1.2.4 Passagem de parmetros por valor ............................................................. 11
1.2.5 PONTEIROS............................................................................................... 12
1.2.5.2 - Declarando e Utilizando Ponteiros............................................................12
1.2.6 - Passagem de parmetros por valor e passagem por referncia....................15
1.2.7 - Variveis globais..........................................................................................19
1.2.8 - Ponteiros e Vetores.......................................................................................19
Exerccios Complementares 1.................................................................................... 23
Unidade 2: Strings........................................................................................................... 29
2.1 - Introduo............................................................................................................29
2.2 Leitura de Strings................................................................................................30
2.3 Criando funes que manipulam strings............................................................ 32
2.4 Funes pr-definidas para manipulao de strings...........................................34
a) gets.......................................................................................................................34
c) strcpy................................................................................................................... 35
d) strcat.................................................................................................................... 35
e) strlen.................................................................................................................... 36
f) strcmp...................................................................................................................36
g) toupper.................................................................................................................37
Exerccios Complementares 2..................................................................................... 37
Unidade 3: Matrizes.........................................................................................................40
3.1 Introduo: Definies Iniciais...........................................................................40
3.2 - Matrizes de strings.............................................................................................. 40
3.3 - Matrizes multidimensionais................................................................................ 41
3.4 - Inicializao........................................................................................................ 41
3.4.1 - Inicializao sem especificao de tamanho................................................42
3.5 Passagem de Matrizes para Funes.................................................................. 43
3.6 Tipos Bsicos de Matrizes..................................................................................43
Exerccios Complementares 3..................................................................................... 45
Unidade 4: Pesquisa e Ordenao de Vetores................................................................. 49
4.1 - Ordenao em vetores......................................................................................... 49
4.2 - Pesquisa em vetores............................................................................................ 52
4.2.1 - Mtodo Pesquisa Sequencial........................................................................52
4.2.2 - Pesquisa Binria .......................................................................................... 54
Exerccios de Complementares 4................................................................................ 57
Unidade 5: Estruturas...................................................................................................... 58
5.1 Introduo ao Uso de Structs..............................................................................58
5.2 Definio de Tipos .............................................................................................58
5.3 Declarando variveis do tipo estrutura...............................................................58
5.4 - Vetores de estruturas........................................................................................... 61
5.5 - Atribuio entre estruturas do mesmo tipo......................................................... 62
5.6 - Passando uma estrutura para funes..................................................................63
5.7 Ponteiros e Estruturas......................................................................................... 64
Exerccios Complementares 5..................................................................................... 66

Programao de Computadores II

Prof. Erlon Pinheiro

(Dica: Estudar a seo 5.5 - Atribuio entre estruturas do mesmo tipo)...................69


Unidade 6: Arquivos........................................................................................................71
6.1 Introduo: Definies e uso de Arquivos......................................................... 71
6.2 - Abrindo e Fechando um Arquivo....................................................................71
- fopen......................................................................................................................71
- fclose..................................................................................................................... 72
6.3 Finalizando a execuo de um programa .......................................................... 72
Comando exit...........................................................................................................72
6.4 - Lendo e Escrevendo Caracteres em Arquivos.....................................................73
Funo putc..............................................................................................................73
Funo getc..............................................................................................................74
6.5 - Outros Comandos de Acesso a Arquivos............................................................76
Funo fgets............................................................................................................76
Funo fputs............................................................................................................ 76
Fluxos Padro.......................................................................................................... 76
Funo fprintf......................................................................................................... 77
Funo fscanf...........................................................................................................77
Exerccios Complementares 6..................................................................................... 78
Referncias Bibliogrficas...............................................................................................80

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 1: MODULARIZAO
1.1 - Introduo
Estudos da psicologia mostram que o ser humano normal capaz de resolver problemas que
envolvam 7 (com incerteza de 2) variveis simultaneamente. Um problema complexo se
envolve mais do que 9 ou 10 variveis. Como, ento, podemos resolver problemas desse tipo?
A soluo que encontramos para solucionar esses problemas dividir um problema complexo
em vrios subproblemas elementares, onde no estejamos sujeitos a esta limitao humana.
Esta estratgia de soluo de problemas comumente conhecida como a tcnica de Dividir para
Conquistar, a qual o fundamento bsico para a Modularizao.
Neste sentido a modularizao de programas consiste da diviso do programa em mdulos ou
subprogramas, que nada mais so do que um conjunto de comandos agrupados com a finalidade
de executar uma determinada funo.
Alm disso, a modularizao uma tcnica de programao que permite a aplicao direta dos
refinamentos sucessivos, isto , possibilita que haja um mapeamento entre os diversos tipos de
algoritmos criados quando utilizamos refinamentos e o prprio ato de programar.
Outro problema que nos defrontamos quando estamos programando a repetio de cdigo.
Voc j deve ter notado que certos trechos de seus programas se repetem em vrios momentos,
igualmente como foram escritos num primeiro instante ou de uma maneira muito aproximada.
Esta repetio de cdigo, alm de ser algo desagradvel para o programador, torna o programa
redundante e dificulta, em ltima instncia, a sua legibilidade.
A modularizao uma soluo natural para este problema, pois um mdulo pode ser ativado
em pontos diferentes de um mesmo programa.
Para falarmos um pouco mais sobre as vantagens da modularizao necessitamos definir alguns
conceitos sobre qualidade de programas. Um programa de boa qualidade quando apresenta as
seguintes caractersticas:

Confiabilidade: o programa est correto e confivel.


Legibilidade: o programa fcil de ser lido por um programador de nvel mdio.
Manutenibilidade: o programa fcil de ser modificado. Quando o usurio requer
modificaes no programa, fruto de novas necessidades, a atualizao do programa deve
ser natural.
Flexibilidade: o programa fcil de ser reutilizado; no possui muitas restries.

Nesse contexto, podemos citar agora uma srie de vantagens da modularizao:

Facilita o projeto de sistemas:


Incentiva a aplicao da tcnica de refinamentos sucessivos.

Minimiza a manuteno de programas:

Programao de Computadores II

Prof. Erlon Pinheiro

Modificaes no programa precisam ser realizadas apenas no mdulo


correspondente, sem ter de alterar o resto do programa.
Melhora a legibilidade dos programas:

No h necessidade de se entrar em detalhes de programao para se


entender o que o programa faz.
Viabiliza a validao:

Testes e correes de cada segmento podem ser realizados em separado, s


reunindo os mdulos quando todos estiverem devidamente validados.
Permite a diviso de tarefas em uma equipe:

Cada mdulo pode ser realizado por um programador diferente.

Facilita a reutilizao de cdigo:

Em trechos onde ocorre repetio de cdigo no programa

Em trechos onde ocorre repetio parcial de cdigo, onde


s so modificados os argumentos utilizados.
Estimula o encapsulamento de informaes:
O programador que usar o mdulo s precisa saber o que o mdulo faz e no
como faz

1.2 - MODULARIZAO EM C
Agora que j estamos familiarizados com o conceito de modularizao e conhecemos as suas
vantagens, podemos nos ater a tcnica de modularizao que implementada em C.
Em C para modularizar programas usaremos funes.

1.2.1 - Introduo s Funes


Na linguagem C tudo gira em torno das funes. Por exemplo, a funo de nome main
obrigatria em todos os programas em C, pois esta funo que ser chamada quando o
programa for executado. O contedo da funo delimitado por chaves { }. O cdigo que estiver
dentro das chaves ser executado seqencialmente quando a funo for chamada. Exemplos de
outras funes que j conhecemos: a funo printf () e a funo scanf ().
Uma funo um bloco de cdigo de programa que pode ser usado diversas vezes em sua
execuo. O uso de funes permite que o programa fique mais legvel, mais bem estruturado.
Um programa em C consiste, no fundo, de vrias funes colocadas juntas.
Abaixo o tipo mais simples de funo:

Programao de Computadores II

Prof. Erlon Pinheiro

#include <stdio.h>
#include <stdlib.h>
void mensagem (void) // Funo simples: s imprime Ola!
{
printf ("Ola! ");
}
main ()
{
mensagem();
printf ("Eu estou estudando C!\n");
system(pause);
}
Este programa define uma funo mensagem() que imprime apenas a mensagem Ola! na
tela. O primeiro void na especificao da funo mensagem() significa que a funo no
retornar valor algum e o void entre parnteses significa que a funo mensagem no recebe
valor algum para sua execuo. Estudaremos mais a frente maiores detalhes sobre utilizao de
argumentos. A funo mensagem() chamada a partir de main() , que, como j vimos, tambm
uma funo. A diferena fundamental entre main e as demais funes do programa que
main a primeira funo a ser executada pelo programa.
Obs.: A funo pode ser implementada depois da funo main(), mas neste caso necessitamos
colocar no incio do programa o prottipo da funo, por exemplo, o cdigo anterior ficaria
assim:
#include <stdio.h>
#include <stdlib.h>
void mensagem (void);
main()
{
mensagem();
printf ("Eu estou estudando C!\n");
system(pause);
}
void mensagem (void) // Funo simples: s imprime Ola!
{
printf ("Ola! ");
}

Exerccio de Fixao

Programao de Computadores II

Prof. Erlon Pinheiro

1) Faa um programa que utilize uma funo para mostrar na tela a soma de dois nmeros lidos
dentro da funo.
2) Faa um programa que utilize uma funo para calcular e mostrar na tela o fatorial de um
nmero.

1.2.2 Argumentos e Passagem de parmetros


Parmetros so as entradas que a funo recebe no instante da ativao do mdulo. atravs
dos parmetros que podemos nos comunicar com a funo. J utilizamos funes com
parmetros. As funes printf() e scanf() so funes que recebem uma expresso de controle e
uma lista de argumentos.
Obs.: Costumamos dizer que na hora da chamada passamos o argumento que ser um
parmetro na execuo da funo.
Vamos ver outro exemplo simples de funo com passagem de parmetros:
#include <stdio.h>
#include <stdlib.h>
void quadrado(int x) /* Calcula o quadrado de x */
{
printf ("O quadrado e %d.\n",(x*x));
}
main ()
{
int num;
printf ("Entre com um numero: ");
scanf ("%d",&num);
printf ("\n\n");
quadrado(num);
system("pause");
}

Programao de Computadores II

Prof. Erlon Pinheiro

Na definio de quadrado() dizemos que a funo receber um parmetro inteiro x. Quando


fazemos a chamada funo, o inteiro num passado como argumento. H alguns pontos a
observar. Em primeiro lugar temos de satisfazer aos requisitos da funo quanto ao tipo e
quantidade de argumentos quando a chamamos. Apesar de existirem algumas converses de
tipo, que o C faz automaticamente, importante ficar atento. Em segundo lugar, no
importante o nome da varivel que se passa como argumento, ou seja, a varivel num, ao ser
passada como argumento para quadrado() copiada para a varivel x. Dentro de quadrado()
trabalha-se apenas com x. Se mudarmos o valor de x dentro de quadrado() o valor de num na
funo main() permanece inalterado.
O prximo exemplo possui uma funo que recebe como parmetros mais de uma varivel.
Repare que, neste caso, os argumentos so separados por vrgula e devemos explicitar o tipo de
cada um dos parmetros, um a um. Note tambm que os argumentos passados para a funo
no necessitam ser todos variveis, porque mesmo sendo constantes sero copiados para a
varivel de entrada da funo.
#include <stdio.h>
#include <stdlib.h>
void mult(float a, float b, float c)// Multiplica 3 nmeros
{
printf ("%.1f * %.1f * %.1f = %.1f.\n\n",a,b,c,a*b*c);
}
main ()
{
float x,y;
x=23.5;
y=12.9;
mult (x,y,3.87);
system("pause");
}
Exerccio de Fixao
1) Faa um programa que utilize uma funo para mostrar na tela a soma de dois nmeros lidos
fora da funo.
2) Faa um programa que utilize uma funo para calcular e mostrar na tela o fatorial de um
nmero. O nmero deve ser lido na funo main() e passado para a funo calcular o fatorial.

1.2.3 - Retornando valores


Muitas vezes necessrio fazer com que uma funo retorne um valor. As funes que vimos
at aqui no retornavam valores (usavam o void). Podemos especificar um tipo de retorno
indicando-o antes do nome da funo (no lugar do void). Mas para dizer ao C o que vamos

Programao de Computadores II

Prof. Erlon Pinheiro

retornar, precisamos da palavra reservada return. Sabendo disto fica fcil fazer uma funo
para multiplicar dois inteiros e que retorna o resultado da multiplicao. Veja:
#include <stdio.h>
#include <stdlib.h>
int prod (int x,int y)
{ return (x*y); }
main ()
{
int saida;
saida=prod (12,7);
printf ("A saida e: %d\n",saida);
system(pause);
}
Veja que, como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em
uma expresso qualquer. No programa fizemos a atribuio deste resultado varivel saida,
que posteriormente foi impressa usando o printf. Uma observao adicional: se no
especificarmos o tipo de retorno de uma funo, o compilador C automaticamente supor que
este tipo inteiro. Porm, no uma boa prtica no se especificar o valor de retorno e, neste
curso, este valor ser sempre especificado.
Com relao funo main, o retorno sempre ser inteiro. Podemos fazer a funo main
retornar um zero quando ela executada sem qualquer tipo de erro.
Mais um exemplo de funo, que agora recebe dois floats e tambm retorna um float:
#include <stdio.h>
#include <stdlib.h>
float prod (float x,float y)
{
return (x*y);
}
int main (void)
{
float saida;
saida=prod (45.2,0.0067);
printf ("A saida e: %8.5f. \n",saida);
system("pause");
}

- Forma geral

Apresentamos aqui a forma geral de uma funo:

10

Programao de Computadores II

Prof. Erlon Pinheiro

tipo_de_retorno nome_da_funo (lista_de_parmetros)


{
cdigo_da_funo
}
Exerccios de Fixao
1) Faa um programa que utilize uma funo para calcular a soma de dois nmeros lidos fora da
funo. O clculo deve ser retornado para ser impresso pela funo main().
2) Faa um programa que utilize uma funo para calcular o fatorial de um nmero. O nmero
deve ser lido na funo main(), passado para a funo calcular o fatorial e o resultado deve ser
impresso na funo main().

1.2.4 Passagem de parmetros por valor


At o momento utilizamos passagem de parmetros por valor. Isto significa que qualquer
alterao feita em um parmetro dentro de uma funo no alterou o seu argumento (fora da
funo), por exemplo:
#include <stdio.h>
#include <stdlib.h>
void mostra_valor(int a);
main()
{
int a;
a = 0;
mostra_valor(a);
printf("Valor de a fora da funo: %d.\n\n",a);
system("pause");
}
void mostra_valor (int a)
{
a = 1;
printf("Valor de a dentro da funo: %d.\n\n",a);
}
Existe outro tipo de passagem de parmetros que iremos estudar posteriormente: passagem de
parmetros por referncia. Este tipo de passagem de parmetros altera o valor do argumento
passado para uma funo. Mas para usarmos este tipo de passagem precisamos entender o que
so variveis do tipo ponteiro.

11

Programao de Computadores II

Prof. Erlon Pinheiro

1.2.5 PONTEIROS
O C altamente dependente dos ponteiros. Assim, para um programador em C
fundamental dominar o bsico (pelo menos) deles. Por isto, recomendo ao leitor um carinho
especial com esta parte do curso que trata deles. Ponteiros so to importantes na linguagem C
que voc j os viu e nem percebeu, pois mesmo para se fazer uma introduo bsica
linguagem C precisa-se deles.
O Ministrio da Sade adverte: o uso descuidado de ponteiros pode levar a srios bugs e a dores de
cabea terrveis :-).
1.2.5.1 - Como Funcionam os Ponteiros
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 este 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. O 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 no 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.
No 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.
1.2.5.2 - Declarando e Utilizando Ponteiros
Para declarar um ponteiro temos a seguinte forma geral:
tipo_do_ponteiro *nome_da_varivel;
o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um valor, mas
sim um endereo para aquele tipo especificado. Vamos ver 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.

12

Programao de Computadores II

Prof. Erlon Pinheiro

O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto de
suma importncia!
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 cont=10;
int *pt;
pt=&cont;
Criamos um inteiro cont com o valor 10 e um apontador para um inteiro pt. A expresso &cont
nos d o endereo de cont, o qual armazenamos em pt. Simples, no ? Repare que no
alteramos o valor de cont, 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 cont usando pt. Para tanto vamos usar o operador "inverso" do
operador &. o operador *. No exemplo acima, uma vez que fizemos pt=&cont a expresso *pt
equivalente ao prprio cont. Isto significa que, se quisermos mudar o valor de cont 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 pr-fixado.
Aqui vo dois exemplos de usos simples de ponteiros:
#include <stdio.h>
#include <stdlib.h>
main ()
{
int num,valor;
int *p;
num=55;
p=&num; /* Pega o endereo de num */
valor=*p;
/* Valor e igualado a num de uma
13

Programao de Computadores II

Prof. Erlon Pinheiro

maneira indireta */
printf ("\n\n Variavel valor = %d \n",valor);
printf ("Endereco para onde o ponteiro aponta: %p\n",p);
printf ("Valor da variavel apontada: %d\n",*p);
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
main ()
{
int num,*p;
num=55;
p=&num; /* Pega o endereco 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);
system(pause);
}
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 imprimir
um endereo.
Exerccios de Fixao
Veja como voc est.
a) Explique o que uma varivel do tipo ponteiro.
b) Qual o valor de x e y no final do programa? Tente primeiro descobrir e depois verifique no
computador o resultado. A seguir, escreva um /* comentrio */ em cada comando de atribuio
explicando o que ele faz e o valor da varivel esquerda do '=' aps sua execuo.
main()
{
int x, y, *p,*q;
y = 1;
x = 2;
p = &y;
q = &x;
x--; //x = x -1;
*p *= x+1;// *p = (*p)*(x+1);
*q += y; // *q = *q +y;
p = q;
*p -= x; // *q = *q x;
printf ("y = %d\n", y);
printf ("x = %d\n", x);
14

Programao de Computadores II

Prof. Erlon Pinheiro

1.2.6 - Passagem de parmetros por valor e passagem por referncia


J vimos que, na linguagem C, quando chamamos uma funo os parmetros formais da funo
copiam os valores dos parmetros que so passados para a funo. Isto quer dizer que no so
alterados os valores que os parmetros tm fora da funo. Este tipo de chamada de funo
denominado chamada por valor. Isto ocorre porque so passados para a funo apenas os
valores dos parmetros e no os prprios parmetros. Veja o exemplo abaixo:
#include <stdio.h>
#include <stdlib.h>
float quadrado (float num);
main ()
{
float num,quad;
printf ("Entre com um numero: ");
scanf ("%f",&num);
quad = quadrado(num);
printf ("\n\nO numero original e: %f\n",num);
printf ("O seu quadrado vale: %f\n",quad);
system("pause"); }
float quadrado (float num)
{
num=num*num;
return num;
}
No exemplo acima o parmetro formal num da funo quadrado() sofre alteraes dentro da
funo, mas a varivel num da funo main() permanece inalterada: uma chamada por valor.
Outro tipo de passagem de parmetros para uma funo ocorre quando alteraes nos
parmetros formais, dentro da funo, alteram os valores dos parmetros que foram passados
para a funo. Este tipo de chamada de funo tem o nome de "chamada por referncia". Este
nome vem do fato de que, neste tipo de chamada, no se passa para a funo os valores das
variveis, mas sim suas referncias (a funo usa as referncias para alterar os valores das
variveis fora da funo).
O C s faz chamadas por valor. Isto bom quando queremos usar os parmetros formais
vontade dentro da funo, sem termos que nos preocupar em estar alterando os valores dos
parmetros que foram passados para a funo. Mas isto tambm pode ser ruim s vezes, porque
podemos querer mudar os valores dos parmetros fora da funo tambm. H entretanto, no C,
um recurso de programao que podemos usar para simular uma chamada por referncia.
Quando queremos alterar as variveis que so passadas para uma funo, ns podemos declarar
seus parmetros formais como sendo ponteiros. Os ponteiros so a "referncia" que precisamos
15

Programao de Computadores II

Prof. Erlon Pinheiro

para poder alterar a varivel fora da funo. O nico inconveniente que, quando usarmos a
funo, teremos de lembrar de colocar um & na frente das variveis que estivermos passando
para a funo. Veja um exemplo:
#include <stdio.h>
#include <stdlib.h>
void troca (int *a,int *b);
main ()
{
int num1,num2;
num1=100;
num2=200;
troca (&num1,&num2);
printf ("\n\nEles agora valem %d %d\n",num1,num2);
system("pause");
}
void troca (int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
No muito difcil. O que est acontecendo que passamos para a funo troca() o endereo
das variveis num1 e num2. Estes endereos so copiados nos ponteiros a e b. Atravs do
operador * estamos acessando o contedo apontado pelos ponteiros e modificando-o. Mas,
quem este contedo? Nada mais que os valores armazenados em num1 e num2, que, portanto,
esto sendo modificados!
Espere um momento... ser que ns j no vimos esta estria de chamar uma funo com as
variveis precedidas de &? J! assim que ns chamamos a funo scanf(). Mas por qu? Vamos
pensar um pouco. A funo scanf() usa chamada por referncia porque ela precisa alterar as
variveis que passamos para ela! No para isto mesmo que ela feita? Ela l variveis para ns
e portanto precisa alterar seus valores. Por isto passamos para a funo o endereo da varivel
a ser modificada!
Exerccio de Fixao
Escreva uma funo que receba duas variveis inteiras e "zere" o valor das variveis. Use o que
voc aprendeu nas pginas anteriores para fazer a implementao.
RESOLUO:
#include<stdio.h>

16

Programao de Computadores II

Prof. Erlon Pinheiro

#include<stdlib.h>
void zera_numeros(int *n1, int *n2);
main()
{
int num1, num2;
//Entrada de dados
printf(Digite dois nmeros inteiros:);
scanf(%d%d, &num1,&num2);
//Processamento de dados
zera_numeros(&num1,&num2);
//Sada de dados
printf(\n\nnum1 = %d e num2 = %d\n\n,num1,num2);
system(pause);
}
void zera_numeros(int *n1, int *n2)
{
*n1 = 0;
*n2 = 0;
}
Exerccio de fixao parcialmente resolvido
Desenvolver um programa calculadora que apresente um menu de selees no programa
principal. Esse menu deve dar ao usurio a possibilidade de escolher uma entre quatro
operaes aritmticas. Escolhida a opo desejada, deve ser solicitada entrada de dois
nmeros, processada a operao, deve ser exibido o resultado.
Algoritmo
Note que este programa deve ser um conjunto de cinco mdulos, sendo um principal e quatro
secundrios. O mdulo principal efetuar o controle dos quatro mdulos secundrios que, por

17

Programao de Computadores II

Prof. Erlon Pinheiro

sua vez, efetuaro o pedido de leitura de dois valores, faro operao e apresentaro o
resultado obtido.
Tendo uma idia da estrutura do programa, ser escrito em separado cada algoritmo com os
seus detalhes de operao. Primeiro o programa principal e depois os outros mdulos.
Programa Principal
1. Apresentar um menu de selees com cinco opes:
1. Adio
2. Subtrao
3. Multiplicao
4. Diviso Inteira
5. Fim de Programa
Escolha uma opo:
2. Armazenar a opo escolhida;
3. O mdulo correspondente a opo escolhida deve ser executado;
4. Ao escolher o valor 5, o programa deve ser encerrado e caso o usurio escolha uma opo
invlida, o programa deve exibir uma mensagem de erro e voltar ao menu inicial.
Modulo 1 - Adio
1.
2.
3.
4.

Ler dois valores, no caso variveis inteiras A e B;


Efetuar a soma das variveis A e B, atribuindo o seu resultado na varivel X;
Apresentar o valor da varivel X;
Voltar ao programa Principal;

Modulo 2 - Subtrao
1.
2.
3.
4.

Ler dois valores, no caso variveis inteiras A e B;


Efetuar a subtrao das variveis A e B, atribuindo o seu resultado na varivel X;
Apresentar o valor da varivel X;
Voltar ao programa Principal;

Modulo 3 - Multiplicao
1. Ler dois valores, no caso variveis inteiras A e B;
2. Efetuar a multiplicao das variveis A e B, atribuindo o seu resultado na varivel X;
3. Apresentar o valor da varivel X;
Modulo 4 Diviso Inteira
18

Programao de Computadores II

Prof. Erlon Pinheiro

1. Ler dois valores, no caso variveis inteiras A e B;


2. Efetuar a diviso inteira das variveis A e B, atribuindo o seu resultado na varivel X;
3. Apresentar o valor da varivel X;
Faa o programa C referente a este algoritmo.
1.2.7 - Variveis globais
Variveis globais so declaradas fora de todas as funes do programa. Elas so conhecidas e
podem ser alteradas por todas as funes do programa. Quando uma funo tem uma varivel
local com o mesmo nome de uma varivel global a funo dar preferncia varivel local.
Vamos ver um exemplo:
int z,k;
func1 (...)
{
int x,y;
...
}
func2 (...)
{
int x,y,z;
...
z=10;
...
}
main ()
{
int cont;
...
}
No exemplo acima as variveis z e k so globais. Veja que func2() tem uma varivel local
chamada z. Quando temos ento, em func2(), o comando z=10 quem recebe o valor de 10 a
varivel local, no afetando o valor da varivel global z.
Na nossa disciplina NO ser permitido o uso de variveis globais. Elas ocupam memria o
tempo todo (as locais s ocupam memria enquanto esto sendo usadas) e tornam o programa
mais difcil de ser entendido e menos geral. As nicas variveis que sero admitidas como
globais sero os ndices de vetores e matrizes.

1.2.8 - Ponteiros e Vetores


Veremos nestas sees que ponteiros e vetores tm uma ligao muito forte.
Quando voc declara um vetor da seguinte forma:
19

Programao de Computadores II

Prof. Erlon Pinheiro

tipo_da_varivel nome_da_varivel [tam];


o compilador C calcula o tamanho, em bytes, necessrio para armazenar este vetor. Este
tamanho :
tam x tamanho_do_tipo
O compilador ento aloca este nmero de bytes em um espao livre de memria. O nome da
varivel que voc declarou na verdade um ponteiro para o tipo da varivel vetor. Este conceito
fundamental. Eis por que: Tendo alocado na memria o espao para o vetor, ele toma o nome da
varivel (que um ponteiro) e aponta para o primeiro elemento do vetor.
Mas a surge a pergunta: ento como que podemos usar a seguinte notao?
nome_da_varivel[ndice]
Isto pode ser facilmente explicado desde que voc entenda que a notao acima absolutamente
equivalente a se fazer:
*(nome_da_varivel+ ndice)
Agora podemos entender como que funciona um vetor! Vamos ver o que podemos tirar de
informao deste fato. Fica claro, por exemplo, porque que, no C, a indexao comea com
zero. porque, ao pegarmos o valor do primeiro elemento de um vetor, queremos, de fato,
*nome_da_varivel e ento devemos ter um ndice igual a zero. Ento sabemos que:
*nome_da_varivel equivalente a nome_da_varivel[0]
Outra coisa: apesar de, na maioria dos casos, no fazer muito sentido, poderamos ter ndices
negativos. Estaramos pegando posies de memria antes do vetor. Isto explica tambm
porque o C no verifica a validade dos ndices. Ele no sabe o tamanho do vetor. Ele apenas
aloca a memria, ajusta o ponteiro do nome do vetor para o incio do mesmo e, quando voc
usa os ndices, encontra os elementos requisitados.
H uma diferena entre o nome de um vetor e um ponteiro que deve ser frisada: um ponteiro
uma varivel, mas o nome de um vetor no uma varivel. Isto significa que no se consegue
alterar o endereo que apontado pelo "nome do vetor". Seja:
const int tam = 10;
int vetor[tam];
int *ponteiro, i;
ponteiro = &i;
/* as operaes a seguir so invlidas */
vetor = vetor + 2; /* ERRADO: vetor no e' variavel */
vetor++;
/* ERRADO: vetor no e' variavel */
vetor = ponteiro; /* ERRADO: vetor no e' variavel */
Teste as operaes acima no seu compilador. Ele dar uma mensagem de erro.
20

Programao de Computadores II

Prof. Erlon Pinheiro

/* as operacoes abaixo sao validas */


ponteiro = vetor; /* CERTO: ponteiro e' variavel */
ponteiro = vetor+2; /* CERTO: ponteiro e' variavel */

Sabemos agora que, na verdade, o nome de um vetor um ponteiro constante. Sabemos


tambm que podemos indexar o nome de um vetor. Como conseqncia podemos tambm
indexar um ponteiro qualquer. O programa mostrado a seguir funciona perfeitamente:
#include <stdio.h>
#include <stdlib.h>
main ()
{
const int tam = 10;
int vetor [tam] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *p;
p=vetor;
printf ("O terceiro elemento do vetor e: %d",p[2]);
system(pause);
}
Podemos ver que p[2] equivale a *(p+2) e a vetor[2].

O que voc aprendeu nesta seo de suma importncia. No siga adiante antes de entend- la
bem.
1.2.9 - Vetores como Parmetros
Seja o seguinte vetor:
const int TAM = 50;
int meuvetor[TAM];
Para passar o vetor meuvetor como parmetro em uma funo C, por exemplo, da funo
func(), tem-se que ter o parmetro formal de func() declarado de uma das trs maneiras
apresentadas a seguir:
void func(int vet[TAM])
ou
void func(int vet[])
ou
void func(int *vet)
Nos trs casos, tem-se em func() um int * chamado vet. Ao passar um vetor para uma funo,
na realidade se est passando um ponteiro. Nesse ponteiro armazenado o endereo do
primeiro elemento do vetor. Isto significa que no feita uma cpia, elemento a elemento do
21

Programao de Computadores II

Prof. Erlon Pinheiro

vetor. Isso faz com que se possa alterar o valor dos elementos do vetor dentro da funo
(passagem por referncia). Para simplificar podemos utilizar o primeiro modelo como padro.
Exemplo: Como que ficaria um programa (modularizado) que apenas leia um vetor de 15
nmeros inteiros e apresente-o na tela?
Resoluo:
#include <stdio.h>
#include <stdlib.h>
const int TAM = 15;
int i;
void leitura(int vet[TAM]);// ou void leitura(int *vet);
void mostra_vet(int vet[TAM]); // void mostra_vet(int *vet);
main ()
{
int meuvetor[TAM];
//Entrada de dados
printf ("Entrada de dados do vetor:\n\n);
leitura(meuvetor);//Note que passamos apenas o nome
//Sada de dados
printf(\n\nO vetor lido:\n\n);
mostra_vet(meuvetor);
system(pause);
}
void leitura(int vet[TAM])// void leitura(int *vet)
{
for(i=0;i<TAM;i++)
{
printf(Digite o %do numero: , i+1);
scanf(%d, &vet[i]);
}
}
void mostra_vet(int vet[TAM])
{
for(i=0;i<TAM;i++)
printf(%5d, vet[i]);
printf(\n\n);
}
Obs.: Refaa os exerccios de Programao I para treinar modularizao utilizando vetores.

22

Programao de Computadores II

Prof. Erlon Pinheiro

Exerccios Complementares 1
PROCURE PRIMEIRO PENSAR E RESOLVER OS EXERCCIOS EM PAPEL, E S DEPOIS
IMPLEMENTE E TESTE O PROGRAMA EM SEU COMPUTADOR.
1. Faa um programa que calcule e mostre o CLCULO DA HIPOTENUSA, sabendo as medidas
dos catetos do tringulo retngulo.
2. Para cada item faa um programa modularizado C que:
a) utilizando uma funo calcule o arranjo de n elementos, p a p. Utilize frmula
A=
n!/( n p)!. A leitura de n e p deve ser feita na funo main() e deve ser criado um
mdulo que retorne o valor de A. Deve-se utilizar o mdulo que calcula o fatorial
implementado em sala.
b) utilizando uma funo calcule o nmero de combinaes de n elementos, p a p. Utilize
frmula C = n!/(p! * ( n p)!). A leitura de n e p deve ser feita na funo main() e deve ser
criado um mdulo que retorne o valor de C.
c) calcule o somatrio dos n primeiros termos da srie de Fibonacci ( 1, 1, 2, 3, 5, 8, ...). A
funo deve receber o valor de n e retornar o valor do somatrio para ser impresso na
funo principal.
3. Faa um programa C modularizado que leia 2 salrios, identifique e imprima o maior. Use
uma funo para identificar e imprimir o maior salrio.
4. Faa um programa C modularizado que calcule e mostre o valor da REA DE UM QUADRADO,
sabendo a medida do lado do quadrado.
Faa uma verso deste problema para a rea DE UM CRCULO.
5. Faa um programa C modularizado que calcule e mostre o CLCULO DA REA DE UM
TRINGULO, sabendo a medida da base e da altura do tringulo.
6. Crie um programa C modularizado que simule uma CALCULADORA que apresente o menu
abaixo e permita que o usurio efetue quantas e quais operaes desejar com dois nmeros
lidos na opo 1 - Entrada de Dados. Ou seja, o usurio deve escolher a opo 1, digitar dois
nmeros e, em seguida, voltar ao menu para escolher qualquer das 4 operaes. Aps o usurio
efetuar a escolha da operao, mostre o resultado e volte ao menu para que uma nova operao
possa ser escolhida ou uma nova entrada de dados possa ser feita.
1 - Entrada de dados
2 - Adio
3 - Subtrao
4 - Multiplicao
5 - Diviso
6 - Encerrar
Escolha uma das operaes:
Para mostrar o menu de opes e ler a opo escolhida use uma funo.
Use funes para implementar as opes 2, 3, 4 e 5. Em cada funo use como parmetros os
dois valores numricos reais lidos na opo 1; os quais sero usados nas operaes de adio,
23

Programao de Computadores II

Prof. Erlon Pinheiro

subtrao, multiplicao ou diviso, dependendo da operao realizada pela funo. Cada


funo deve retornar o resultado da operao realizada.
Na operao de diviso o denominador no pode ser nulo. Use uma funo para verificar
este fato antes de efetuar a diviso. Esta funo deve ter como parmetro o denominador da
diviso e retornar verdadeiro caso o denominador seja nulo e falso caso contrrio.
Resoluo Parcial
Algoritmo
Note que este programa deve ser um conjunto de seis mdulos, alm da funo principal. O
mdulo principal efetuar o controle dos seis mdulos secundrios que: (1 mdulo) mostrar o
menu, ler e retornar a opo lida;
(2 mdulo) calcular e retornar a adio;
(3 mdulo) calcular e retornar a subtrao;
(4 mdulo) calcular e retornar a multiplicao;
(5 mdulo) calcular e retornar a diviso;
(6 mdulo) verificar se o denominador nulo.
Tendo uma ideia da estrutura do programa, ser escrito em separado cada algoritmo com os
seus detalhes de operao. Primeiro o programa principal (main) e depois os outros mdulos.
Programa Principal
1. Chamar o mdulo que apresenta um menu de selees com seis opes:
1. Entrada de dados
2. Adio
3. Subtrao
4. Multiplicao
5. Diviso
6. Fim de Programa
Escolha uma opo:
2. Armazenar a opo escolhida;
3. O mdulo correspondente a opo escolhida deve ser executado;
4. Ao escolher o valor 6, o programa deve ser encerrado e caso o usurio escolha uma opo
invlida, o programa deve exibir uma mensagem de erro e voltar ao menu inicial (uso de um
24

Programao de Computadores II

Prof. Erlon Pinheiro

comando de repetio: de preferncia o do/while). Observe que na opo 5 a funo que


verifica se o denominador nulo dever ser utilizada.
Modulo 1 Mostra o menu
Apresentar o menu de opes;
Ler a opo desejada;
Retornar a opo para a funo main;

Modulo 2: Adio
Efetuar a soma dos nmeros lidos na funo main;
retornar o valor calculado;
Voltar ao programa Principal = finalizar o mdulo;
Modulo 3 - Subtrao
Efetuar a subtrao dos nmeros lidos na funo main;
retornar o valor calculado;
Voltar ao programa Principal = finalizar o mdulo;
Modulo 4 - Multiplicao
Efetuar a multiplicao dos nmeros lidos
retornar o valor calculado;
Voltar ao programa Principal = finalizar o mdulo;
Modulo 5 Diviso
Efetuar a diviso dos nmeros lidos
retornar o valor calculado;
Voltar ao programa Principal = finalizar o mdulo;
Modulo 6: Verifica denominador nulo:
Fica como exerccio...
Obs.: A verificao do denominador nulo ser feita na funo principal.
25

Programao de Computadores II

Prof. Erlon Pinheiro

Faa o programa C referente a este algoritmo.


7. Faa um programa que leia os limites de um intervalo de nmeros inteiros, identifique, conte
e imprima a quantidade de nmeros pares e mpares deste intervalo. Construir uma funo
para identificar, contar a quantidade de nmeros pares e mpares. A impresso deve ser feita na
funo main().

8. Faa um programa C que utilizando uma funo ordene trs nmeros inteiros (distintos)
lidos na funo principal main( ). Imprima os nmeros ordenados em main( ). A funo deve
receber apenas os trs parmetros (ponteiros) para ordenar os nmeros por referncia. Dica:
Podem usar variveis locais para ajudar no processo de ordenao.
9. Faa uma funo que verifique se um nmero inteiro, declarado como parmetro da funo,
divisvel por 5. A funo deve retornar 1 se sim e 0 caso contrrio.
10. No algoritmo abaixo implemente a funo MAIOR
algoritmo imprime_maior;
.
:
{ algoritmo principal }
inicio
inteiro a, b, c;
leia (a, b, c);
escreva (Maior nmero = , MAIOR (a, b, c));
fim.
11. Escreva uma funo que possua um nmero inteiro A como parmetro e devolva o nmero
de divisores de A. Para verificar o nmero de divisores de A teste, para todo x no intervalo [1,
A/2].
Usando a funo escrita acima, escreva outra funo que possua um nmero inteiro N como
parmetro e determine se ele ou no um nmero primo. N ser primo se a funo definida no
pargrafo acima retornar o nmero de divisores igual a 1.
12. No algoritmo abaixo implemente a funo F de forma que retorne o resultado da seguinte
expresso: f(x) = x2 + 3x -9
algoritmo expressao;
:
{ALGORITMO PRINCIPAL}
inicio
real x;
escreva(Digite um numero real: );
leia (x);
escreva (f(x) = x2 + 3x 9 = , f(x));
fim.

26

Programao de Computadores II

Prof. Erlon Pinheiro

13. Seja o seguinte trecho de programa:


int i=3,j=5;
int *p, *q;
p = &i;
q = &j;
Qual o valor das seguintes expresses ?
a) p == &i; b) *p - *q
c) (*p)*(*q)== 20

d) 10* - (*p)/(*q)+7

14. Se i e j so variveis inteiras e p e q ponteiros para inteiros devidamente inicializadas, quais


das seguintes expresses de atribuio so ilegais?
a) p = &i;
b) *q = &j;
c) p = q;
d) i = *j;
e) i = *&j;
f) i = *&*&j;
g) q = *p;
h) i = (*p)++ + *q

15. Utilizando a elaborao de procedimentos, faa um programa que leia dois vetores de 10
elementos do tipo real. Intercale os elementos destes dois vetores criando um novo vetor de 20
elementos. Exiba o novo vetor.
Exemplo:
Vetor1
0
2

1
9

2
7

3
5.5

4
10

5
4

6
3

7
-1

8
6

9
21

1
-4

2
12

3
6

4
90

5
-4

6
5

7
43

8
27

9
82

Vetor2
0
32

Vetor criado a partir dos anteriores


0 1

2 3

4 5

2 3
2

9 -4 7 1
2

7 8

5.5 6 1
0

9
0

1
0
4

1
1
-4

1
2
3

1
3
5

1
4
-1

1
5
4
3

1
6
6

1
7
2
7

1
8
2
1

19
82

16. Utilizando a elaborao de procedimentos, faa um programa que tendo lido um vetor VET
de 10 nmeros inteiros diferentes de zero, crie um novo vetor VETPAR com os elementos pares
do vetor VET. Antes de preencher o vetor VETPAR com os nmeros pares de VET faa com que
todos os componentes de VETPAR recebam o valor zero. Ao final exiba VETPAR.
Exemplo:
27

Programao de Computadores II

Prof. Erlon Pinheiro

Vetor VET
0
2

4
10

5
3

6
5

7
6

9
21

2
4

3
6

4
0

5
0

6
0

7
0

8
0

9
0

Vetor VETPAR
0
2

1
10

17. Uma mercearia trabalha com 10 mercadorias diferentes identificadas pelos nmeros
inteiros de 1 a 10. O dono da mercearia anota em uma tabela a quantidade de cada mercadoria
vendida durante o dia. Ele possui uma outra tabela que indica para cada mercadoria o preo de
venda. Um exemplo das tabelas mostrado abaixo. Utilizando a elaborao de procedimentos,
faa um programa que calcule e exiba o faturamento do dia da mercearia.
Vetores exemplo:
Quantidade

Preo

0
23

0
10

1
41

1
5

2
7

2
2

3
23

3
12

4
23

4
23

5
45

5
1.5

6
6

6
6

7
8

8
211

9
112

7
5.55

8
3.50

9
1

Faturamento referente a mercadoria nmero 2 = 41*5

18. Faa um programa que leia 2 vetores, A e B, de tamanhos e tipos iguais e, construa um
terceiro vetor C composto pela juno de A e B. Use mdulos.

19. Uma Universidade deseja saber se existem alunos cursando simultaneamente as disciplinas
Programao II e Lgica para Computao. Para tanto, coloque os nmeros de matrcula dos
alunos que cursam a disciplina Programao II em um vetor e os nmeros de alunos que cursam
Lgica para Computao em outro vetor. Exiba os nmeros de matrcula que aparecem em
ambos os vetores. Use procedimentos e funes.

28

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 2: Strings
2.1 - Introduo
Strings so vetores de chars. Nada mais e nada menos. As strings so o uso mais comum para os
vetores. Devemos apenas ficar atentos para o fato de que as strings tm o seu ltimo elemento
como um '\0'. A declarao geral para uma string :
char nome_da_string [tamanho];
Devemos lembrar que o tamanho da string deve incluir o '\0' final. A biblioteca padro do C
possui diversas funes que manipulam strings. Estas funes so teis pois no se pode, por
exemplo, igualar duas strings:
string1==string2;

/* NAO faca isto */

Fazer isto um desastre. As strings devem ser igualadas elemento a elemento.


Para armazenar uma string em C devemos reservar uma posio adicional para o caractere de
fim da cadeia. Todas as funes de manipulao de strings em C recebem como parmetro um
vetor de char, isto , um ponteiro para o primeiro elemento do vetor que representa a string.
Ex.: para imprimir uma string utilizando o comando printf, utiliza-se o especificador de
formato %s printf recebe um vetor de char e imprime elemento por elemento at encontrar o
caractere nulo. Vantagem de delimitar a string por \0 no necessrio passar explicitamente
o nmero de caracteres a ser considerado.
main( )
{
const int tam = 4;
char faculdade[tam];
faculdade[0] = U;
faculdade[1] = V;
faculdade[2] = V;
faculdade[3] = \0;
printf(%s \n, faculdade);
system(pause);
}

29

Programao de Computadores II

Prof. Erlon Pinheiro

Se o caractere \0 no fosse colocado, a funo printf seria executada de forma errada, pois no
conseguiria identificar o final da cadeia.

Como as strings so vetores, podemos reescrever o cdigo anterior inicializando os elementos


diretamente na declarao:
main( )
{
char faculdade[ ] = {U,V,V,\0}; /*a varivel
faculdade automaticamente dimensionada e
inicializada com 4 elementos.*/
printf(%s \n, faculdade);
system(pause);
}

Exemplos de declaraes e inicializaes de strings:


char s1[] = ; //cadeia vazia (\0)
char s2[] = Vila Velha; //vetor de 11 elementos
char s3[81]; /*string capaz de armazenar cadeias de at 80 elementos, com contedo
desconhecido */
char s4[81] = UVV; /* tambm capaz de armazenar at 80 caracteres, mas seus primeiros 4
elementos j foram atribudos na declarao. */
2.2 Leitura de Strings
Em programao I vimos que a leitura de um caractere deve ser feita com cuidado, por
exemplo:
char a;
...
scanf(%c, &a);
...
30

Programao de Computadores II

Prof. Erlon Pinheiro

Diferentemente dos especificadores %d e %f, o %c no pula os caracteres brancos (espao,


tabulao ou nova linha). Assim, este cdigo possivelmente gerar erro quando for utilizado em
programas maiores. O correto seria:
char a;
...
scanf( %c, &a); /* o branco no formato pula brancos
da entrada */
...
Para capturar uma string:
char faculdade[81];
...
scanf(%s, faculdade); /* aqui no foi usado o caractere & pois a string um vetor o nome da
varivel representa o endereo do primeiro elemento do vetor */
Uso do especificador %s na leitura limitado, pois ele pula os caracteres brancos, capturando
somente a primeira seqncia de no-brancos.
Como ler nomes compostos?
Especificador %[...], onde especificamos entre os colchetes todos os caracteres que aceitaremos
na leitura. Exemplo: o formato %[aeiou] l seqncias de vogais, isto a leitura prossegue at
se encontrar um caractere que no seja vogal.
Se o primeiro caractere for o acento circunflexo (^), teremos o efeito inverso (negao). Assim,
%[^aeiou] faz a leitura enquanto uma vogal no for encontrada.
char faculdade[81];
scanf( %[^\n], faculdade); /* l seqncia de caracteres at que seja encontrado o caractere
de mudana de linha (\n), ou seja, captura-se
at que ele tecle Enter */
Perigo: se o usurio fornecer uma linha com mais de 80 caracteres... invaso de espao de
memria no reservado!
char faculdade[81];
scanf( %80[^\n], faculdade); /* l no mximo 80 caracteres */
Exemplos:
31

Programao de Computadores II

Prof. Erlon Pinheiro

2.3 Criando funes que manipulam strings


A impresso de uma varivel string feita como se ela fosse uma varivel simples, isto , basta
usar a tag %s em um printf que a string ser impressa.
1) possvel criar uma funo que imprima o string caractere por caractere:
void imprime(char *s)
{
int i;
for (i=0; s[i] != \0; i++)
printf(%c, s[i]);
printf(\n);
}
2) Esse cdigo teria uma funcionalidade anloga utilizao do especificador de formato %s.
void imprime (char* s)
{
printf(%s\n, s);
}
3) Funo para retornar o comprimento de uma string basta contar o nmero de caracteres at
o caractere nulo.
int comprimento (char *s)
{
int i;
int n = 0; /* contador */
for (i=0; s[i] != \0; i++)
n++;
return n;
}

32

Programao de Computadores II

Prof. Erlon Pinheiro

O trecho de cdigo a seguir faz uso desta funo:


main ( )
{
int tam;
char cidade[ ] = Vila Velha;
tam = comprimento(cidade);
printf(A string \ %s \ tem %d caracteres\n, cidade, tam);
system(pause);
}
4) Funo que copia os elementos de uma string para outra:
void copia (char *dest, char *orig)
{
int i;
for(i=0; orig[i] != \0; i++)
dest[i] = orig[i];
dest[i] = \0; /* fecha a cadeia copiada */
}
6) Funo para concatenar uma string com outra j existente:
void concatena (char* dest, char* orig)
{
int i=0; /* indice usado na cadeia de destino */
int j; /* indice usado na cadeia de origem */
/* acha o final do destino */
while (dest[i] != 0)
i++;

33

Programao de Computadores II

Prof. Erlon Pinheiro

/* copia elementos da origem para o final do destino */


for (j=0; orig[j] != \0; j++)
{
dest[i] = orig[j];
i++;
}
dest[i] = \0; /* fecha a cadeia destino */
}

2.4 Funes pr-definidas para manipulao de strings


Vamos ver agora algumas funes bsicas para manipulao de strings.
a) gets
A funo gets( ) l uma string do teclado. Sua forma geral :
gets (nome_da_string);
O programa abaixo demonstra o funcionamento da funo gets( ):
#include <stdio.h>
#include <stdlib.h>
main ( )
{
char nome[100];
printf ("Digite o seu nome: ");
gets (nome);
printf ("\n\n Ola %s", nome);
system(pause);
}
b) puts
puts imprime o contedo de uma string e desce para a prxima linha. Para imprimir a string do
exemplo anterior bastava usar: puts(nome);

34

Programao de Computadores II

Prof. Erlon Pinheiro

c) strcpy
Sua forma geral : strcpy (string_destino,string_origem);
A funo strcpy() copia a string-origem para a string- destino. Seu funcionamento
semelhante ao da rotina apresentada na seo anterior. As funes apresentadas nestas sees
esto no arquivo cabealho string.h. A seguir apresentamos um exemplo de uso da funo
strcpy():
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
char str1[100],str2[100],str3[100];
printf ("Entre com uma string: ");
gets (str1);
strcpy (str2,str1); /* Copia str1 em str2 */
strcpy (str3,"Voce digitou a string "); /* Copia "Voce digitou a string" em str3 */
printf ("\n\n%s%s",str3,str2);
system(pause);
}
d) strcat
A funo strcat() tem a seguinte forma geral:
strcat (string_destino,string_origem);
A string de origem permanecer inalterada e ser anexada ao fim da string de destino. Um
exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
char str1[100],str2[100];
printf ("Entre com uma string: ");
gets (str1);
strcpy (str2,"Voce digitou a string ");
strcat (str2,str1); /* str2 armazenara' Voce digitou a string + o conteudo de str1 */
printf ("\n\n%s",str2);
system(pause);
}

35

Programao de Computadores II

Prof. Erlon Pinheiro

e) strlen
Sua forma geral : strlen (string);
A funo strlen() retorna o comprimento da string fornecida. O terminador nulo no contado.
Isto quer dizer que, de fato, o comprimento do vetor da string deve ser um a mais que o inteiro
retornado por strlen().
Um exemplo do seu uso:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
int comprimento;
char frase[100];
printf ("Entre com uma frase: ");
gets (frase);
comprimento = strlen (frase);
printf ("\n\nA frase que voce digitou tem tamanho %d", comprimento);
system(pause);
}
f) strcmp
Sua forma geral : strcmp (string1,string2);
A funo strcmp() compara a string 1 com a string 2. Se as duas forem idnticas, a funo
retorna zero. Se elas forem diferentes a funo retorna no-zero. Um exemplo da sua
utilizao:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
char str1[100],str2[100];
printf ("Entre com uma string: ");
gets (str1);
printf ("\n\nEntre com outra string: ");
gets (str2);
if (strcmp(str1,str2)) // strcmp(str1,str2) != 0
printf ("\n\nAs duas strings so diferentes.");
else
printf ("\n\nAs duas strings so iguais.");
system(pause);
}

36

Programao de Computadores II

Prof. Erlon Pinheiro

g) toupper
Esta uma funo para tornar um caractere alfabtico no seu correspondente maisculo. Para
utiliz-lo deve-se utilizar a biblioteca ctype, isto , para utiliz-la no incio do programa deve-se
usar a diretiva: #include<ctype.h>
A funo toupper recebe um caractere e retorna o seu correspondente maisculo. Caso o
caractere no seja uma letra vlida a funo mantm o caractere original.
Exemplo: Considere a declarao abaixo:
char car;
car = toupper(`a`);
Aps a execuo destas linhas a varivel car conter o caractere `A`.
Exerccio de Fixao
Faa um programa que leia quatro palavras pelo teclado, e armazene cada palavra em uma
string. Depois, concatene todas as strings lidas numa nica string. Por fim apresente esta como
resultado ao final do programa.
Exerccios Complementares 2
1. Fazer um programa em "C" que l uma string qualquer de no mximo 80 caracteres e
imprime:
a) Quantos caracteres tem o string;
b) Quantos caracteres so de pontuao;
c) Quantos caracteres so nmeros;
d) Quantos caracteres so espao em branco.
2. Fazer um programa em "C" que l uma string contendo palavras separadas por um
espao em branco cada e as imprime uma abaixo das outras.
3. Fazer um programa em "C" que pergunta o nome, o endereo, o telefone e a idade de
uma pessoa e monta um string com a seguinte frase:
"Seu nome ..., voc tem ... anos, mora na rua ... e seu telefone ... ."
4. Fazer uma rotina que recebe uma string como parmetro e imprime quantas palavras
(separadas por espaos em branco) o mesmo contm.
5. Fazer uma rotina que aguarda (leia) uma string do teclado e retorna o valor 1 se a string
digitada foi "SIM" e 0 se a string digitada foi "NAO". A rotina s deve retornar alguma coisa
se a string digitada for "SIM" ou "NAO".
6. Implemente uma rotina que faa a mesma coisa que a funo "strcpy". (essa foi feita em
sala de aula...)

37

Programao de Computadores II

Prof. Erlon Pinheiro

7. Fazer um programa em "C" que solicita um nmero inteiro e soletra o mesmo na tela.
Ex:
124: um, dois, quatro
8. Escrever uma funo que recebe uma string e um caractere como parmetro e remove
todas as ocorrncias do caractere da string.
9. Escreva uma funo em "C" que receba uma string, um caractere e o ndice de uma
posio vlida da string como parmetro e insira o caractere na posio "empurrando"
todos os demais para o lado.
10. Faa um programa que leia uma frase de no mximo 80 caracteres e imprima o nmero
de vogais presentes na frase.
11. Escreva um programa que leia um texto (de no mximo 70 caracteres) e mostre na tela o
mesmo texto, duplicando cada uma das letras deste texto. Exemplo:
texto lido: INSTITUTO DE INFORMATICA
texto devolvido:
IINNSSTTIITTUUTTOO DDEE IINNFFOORRMMAATTIICCAA.
12. Faa um programa que leia uma string e o codifique, utilizando a tabela de substituio
de caracteres abaixo. Imprima a string original e a string decodificada.
CARACTERE EXISTENTE

CARACTERE A SER SUBSTITUDO

13. Faa um programa que leia uma string e o decodifique, utilizando a tabela de
substituio de caracteres do exerccio anterior.

38

Programao de Computadores II

Prof. Erlon Pinheiro

14. Implemente um mdulo que faa a mesma coisa que a funo "strcmp".
(O algoritmo foi falado em sala)
15 . Faa um mdulo que receba um string e retorne a mesma string toda em maisculo.

39

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 3: Matrizes
3.1 Introduo: Definies Iniciais
J vimos como declarar matrizes unidimensionais (vetores). Vamos tratar agora de matrizes
bidimensionais. A forma geral da declarao de uma matriz bidimensional muito parecida
com a declarao de um vetor:
tipo_da_varivel nome_da_varivel [altura][largura];
muito importante ressaltar que, nesta estrutura, o ndice da esquerda indexa as linhas e o da
direita indexa as colunas. Quando vamos preencher ou ler uma matriz no C o ndice mais
direita varia mais rapidamente que o ndice esquerda. Mais uma vez bom lembrar que, na
linguagem C, os ndices variam de zero ao valor declarado, menos um; mas o C no vai verificar
isto para o usurio. Manter os ndices na faixa permitida tarefa do programador. Abaixo
damos um exemplo do uso de uma matriz:
#include <stdio.h>
#include <stdlib.h>
main ()
{
int mat [20][10];
int i,j,cont;
cont=1;
for (i=0;i<20;i++)
for (j=0;j<10;j++)
{
mat[i][ j ]=cont;
cont++;
}
system(pause);
}
No exemplo acima, a matriz mat preenchida, sequencialmente por linhas, com os nmeros de
1 a 200. Voc deve entender o funcionamento do programa acima antes de prosseguir.
3.2 - Matrizes de strings
Matrizes de strings so matrizes bidimensionais. Imagine uma string. Ela um vetor. Se
fizermos um vetor de strings estaremos fazendo uma lista de vetores. Esta estrutura uma
matriz bidimensional de chars. Podemos ver a forma geral de uma matriz de strings como
sendo:
char nome_da_varivel [num_de_strings][compr_das_strings];
A surge a pergunta: como acessar uma string individual? Fcil. s usar apenas o primeiro
ndice. Ento, para acessar uma determinada string faa:

40

Programao de Computadores II

Prof. Erlon Pinheiro

nome_da_varivel [ndice]
Aqui est um exemplo de um programa que l 5 strings e as exibe na tela:
#include <stdio.h>
#include <stdlib.h>
main ()
{
char strings [5][100];
int cont;
for (cont=0;cont<5;cont++)
{
printf ("\n\nDigite uma string: ");
gets (strings[cont]);
}
printf ("\n\n\nAs strings que voce digitou foram:\n\n");
for (cont=0;cont<5;cont++)
printf ("%s\n",strings[cont]);
system(pause);
}
3.3 - Matrizes multidimensionais
O uso de matrizes multidimensionais na linguagem C simples. Sua forma geral :
tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];
Uma matriz N-dimensional funciona basicamente como outros tipos de matrizes. Basta lembrar
que o ndice que varia mais rapidamente o ndice mais direita.
3.4 - Inicializao
Podemos inicializar matrizes, assim como podemos inicializar variveis. A forma geral de uma
matriz como inicializao :
tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN] = {lista_de_valores};
A lista de valores composta por valores (do mesmo tipo da varivel) separados por vrgula. Os
valores devem ser dados na ordem em que sero colocados na matriz. Abaixo vemos alguns
exemplos de inicializaes de matrizes:
float vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
char str [10] = { 'J', 'o', 'a', 'o', '\0' };
char str [10] = "Joao";
char str_vect [3][10] = { "Joao", "Maria", "Jose" };
O primeiro demonstra inicializao de vetores. O segundo exemplo demonstra a inicializao de
matrizes multidimensionais, onde matrx est sendo inicializada com 1, 2, 3 e 4 em sua primeira
linha, 5, 6, 7 e 8 na segunda linha e 9, 10, 11 e 12 na ltima linha. No terceiro exemplo vemos
41

Programao de Computadores II

Prof. Erlon Pinheiro

como inicializar uma string e, no quarto exemplo, um modo mais compacto de inicializar uma
string. O quinto exemplo combina as duas tcnicas para inicializar um vetor de strings. Repare
que devemos incluir o ; no final da inicializao.
3.4.1 - Inicializao sem especificao de tamanho
Podemos, em alguns casos, inicializar matrizes das quais no sabemos o tamanho a priori. O
compilador C vai, neste caso verificar o tamanho do que voc declarou e considerar como sendo
o tamanho da matriz. Isto ocorre na hora da compilao e no poder mais ser mudado durante
o programa, sendo muito til, por exemplo, quando vamos inicializar uma string e no
queremos contar quantos caracteres sero necessrios. Alguns exemplos:
char mess [] = "Linguagem C: flexibilidade e poder.";
int matrx [][2] = { 1,2,2,4,3,6,4,8,5,10 };
No primeiro exemplo, a string mess ter tamanho 36. Repare que o artifcio para realizar a
inicializao sem especificao de tamanho no especificar o tamanho! No segundo exemplo o
valor no especificado ser 5.
Obs: Note que o nmero de linhas pode ser omitido, mas o nmero de coluna no!

42

Programao de Computadores II

Prof. Erlon Pinheiro

AUTO AVALIAO
Veja como voc est. O que imprime o programa a seguir? Tente entend-lo e responder. A
seguir, execute-o e comprove o resultado.
# include <stdio.h>
# include <stdlib.h>
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 (%3d , M[t][i]);
printf (\n);
}
system(pause);
}
3.5 Passagem de Matrizes para Funes
Aps a declarao de uma matriz, a varivel que representa a matriz um ponteiro para o
primeiro vetor-linha da matriz.
Com isto, mat[1] aponta para o primeiro elemento do segundo vetor-linha, e assim por
diante.
Assim, uma matriz criada estaticamente representada por um ponteiro para um vetor-linha
com o nmero de elementos da linha. Quando passamos uma matriz para uma funo, o
parmetro da funo deve ser deste tipo. Infelizmente, a sintaxe para representar este tipo
obscura. O prottipo de uma funo que recebe a matriz declarada acima seria:
void f (..., float (*mat)[3], ...);
Para uma matriz com 3 colunas
Uma segunda opo declarar o parmetro como matriz, podendo omitir o nmero de linhas:
void f (..., float mat[][3], ...);
Ou ainda uma terceira opo seria declarar o parmetro com o tamanho especfico da matriz:
void f (..., float mat[4][3], ...);
De qualquer forma, o acesso aos elementos da matriz dentro da funo feito da forma usual,
com indexao dupla.

3.6 Tipos Bsicos de Matrizes


Matrizes Quadradas So matrizes que possuem a quantidade de linhas igual a quantidade de
colunas, formando um quadrado.
43

Programao de Computadores II

Prof. Erlon Pinheiro

Devido a essa propriedade essas matrizes apresentam caractersticas nicas comparadas s


outras matrizes.
Matriz Diagonal: elementos que podem ser diferentes de zero esto dispostos nas posies
ocupadas por uma linha imaginria que corta a matriz na sua diagonal, do canto superior
esquerdo ao canto inferior direito, o resto da matriz s pode conter zeros.

-1

-1

Os elementos que ocupam essas posies possuem o nmero da sua linha igual ao nmero da
sua coluna, sendo possvel identific-los em um trecho de programa atravs do comando de
seleo:
if (linha == coluna)
Matriz Triangular Superior: Os elementos que esto dispostos nas posies ocupadas abaixo
da diagonal principal devem (obrigatoriamente) ser iguais a zero, o resto da matriz pode ser
no nula.
9

Os elementos que ocupam essas posies possuem o nmero da sua linha menor que o nmero
da coluna, sendo possvel identific-los em um trecho de programa atravs do comando:
if (linha < coluna)
Matriz Triangular Inferior: elementos que esto dispostos nas posies ocupadas abaixo da
diagonal principal podem ser diferentes de zero.
Os elementos que ocupam essas posies possuem o nmero da sua linha maior que o nmero
da coluna, sendo possvel identific-los em um trecho de programa atravs do comando:
if (linha > coluna)

44

Programao de Computadores II

Prof. Erlon Pinheiro

Matriz Diagonal Secundria: elementos que esto dispostos nas posies ocupadas por uma
linha imaginria que corta a matriz na sua diagonal, do canto superior direito ao canto inferior
esquerdo podem ser diferentes de zero, o resto da matriz s pode conter zeros.
0

Os elementos que ocupam essas posies possuem o nmero da sua linha somado ao de sua
coluna igual dimenso de colunas menos uma unidade (lembre-se, em C a contagem inicia-se
do zero), sendo possvel identificlos em um trecho de programa (em C) atravs do comando:
if (linha + coluna == qtde_colunas-1)
No caso de matriz 4x4 do exemplo acima:
if (linha + coluna == 3)
Se essa condio for verdadeira, esse elemento estar na diagonal secundria.
Exerccios Complementares 3
1. Escreva um programa em C que preencha uma matriz 4X4 com "0" e a sua diagonal
principal com "1. Em seguida, exiba a matriz na tela (uma linha da matriz por vez).
Resoluo:
#include<stdio.h>
#include<stdlib.h>
const int n=4;
int i, j;
void preenche(int m[n][n]);
void mostra_mat(int m[n][n]);
main( )
{
int mat[n][n];
//Entrada de dados automtica
preenche( mat );
//Sada de dados
45

Programao de Computadores II

Prof. Erlon Pinheiro

printf( \n\n\tMatriz Identidade %d x %d\n\n, n, n);


mostra_mat(mat);
system(pause);
}
void preenche(int m[n][n])
{
for(i=0;i<n; i++)
for(j=0;j<n;j++)
if(i==j)
m[i][j]=1;
else
m[i][j]=0;
}
void mostra_mat(int m[n][n])
{
for(i=0;i<n; i++)
{
for(j=0;j<n;j++)
printf(%5d, m[i][j]);
printf(\n\n);
}
}

2. Fazer um programa C modularizado que leia uma matriz 15 x 15 de reais e calcule a


soma dos elementos da diagonal secundria. Mostrar a soma ao final.
3. Fazer um programa C modularizado que calcule a mdia dos elementos da diagonal
principal de uma matriz 10 x 10 de inteiros.
4. Fazer um programa C modularizado que encontre (e mostre) o maior valor de uma
matriz 10 x 5 de inteiros positivos.
Resoluo:
int encontra_maior( int m[lin][col]) //const int lin=10, col=5;
{
int maior=m[0][0];
for(i=0;i<lin;i++)
for(j=0;j<col;j++)
if ( m[i][j] > maior )
maior = m[i][j];
return(maior);
}
Refaa este programa de forma que a posio do maior elemento seja retornada.
5. Para um professor que tenha 5 turmas de 30 alunos cada, escreva um programa C
modularizado que leia as mdias dos alunos de cada turma e calcule a mdia de cada turma.
Em seguida, exiba o resultado.

46

Programao de Computadores II

Prof. Erlon Pinheiro

6. Faa um programa C modularizado que leia o nome de 40 alunos de uma turma de


Programao de Computadores II e imprima os alunos que tenham iniciais A.
7. Faa um programa C modularizado que calcule da soma de dois vetores unidimensionais
de 40 posies. Guarde a resposta em um terceiro vetor. (Simule os vetores com uma matriz
3X40)
8. Faa um programa C modularizado para calcular a soma de duas matrizes de ordens 5 x
3. Guarde a resposta numa terceira matriz e mostre-a na tela.
9. Faa um programa C modularizado que calcule e mostre a multiplicao de duas
matrizes de ordens m x n e n x n,respectivamente. O programa deve guardar o produto
numa terceira matriz m x n. Para fins de exemplo suponha m = 3 e n = 2.
10. Faa um programa C modularizado que receba as vendas semanais ( de um ms ) de 5
vendedores de uma loja e armazene essas vendas em uma matriz.
Calcule e imprima:
. total de vendas do ms ( 4 semanas) de cada vendedor;
. total de vendas de cada semana (todos os vendedores juntos);
. total de vendas do ms.
12. Faa um programa C modularizado que carregue uma matriz 2 X 2 com nmeros inteiros,
calcule e imprima a soma dos elementos da diagonal principal.
13. Dadas duas matrizes numricas A e B de dimenso 4x3, fazer um programa C modularizado
que gere uma matriz de zeros e uns denominada C, tal que o elemento C[i,j] seja verdadeiro (1
na linguagem C) se os elementos nas posies respectivas das matrizes A e B forem iguais e
falso (0 na linguagem C) caso contrrio. Exibir na tela as matrizes A, B e C:
EXEMPLO:

14. Dada uma matriz contendo 4 notas de 10 alunos, elabore um programa C modularizado que
calcule e exiba um vetor (unidimensional) que dever conter a mdia aritmtica das 4 notas de
cada aluno.
15. Elabore um programa C modularizado que receba o estoque de 4 produtos(colunas) que
esto armazenados em 5 armazns (linhas) e coloque estes dados em uma matriz 5 por 4.
Calcule e imprima:
a) a quantidade de itens armazenados em cada armazm;
47

Programao de Computadores II

Prof. Erlon Pinheiro

b) qual armazm possui a maior quantidade de itens em estoque;


c) qual armazm possui a menor quantidade de itens em estoque.

48

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 4: Pesquisa e Ordenao de Vetores


4.1 - Ordenao em vetores
Ordenar um vetor colocar os seus componentes sob algum critrio de ordenao (ascendente
ou descendente).
Existem vrios algoritmos de ordenao.
Mtodo da bolha
Exemplo1:
Vamos comparar as 5 posies do vetor e efetuar a troca, se necessrio.
0
1
2
3
4
5
1
9
4
2
Vetor original
0
1

1
5

0
1

1
5

0
1

No troca posio 1 com 2

Troca posio 0 com 1

4
2

3
4

2
9

Troca posio 2 com 3


4

2
3

Troca posio 3 com 4


4

Vetor Final

Vamos comparar as 4 posies do vetor e efetuar a troca, se necessrio.


0
1
2
3
4
1
5
4
2
9
Vetor original atual
0
1

1
5

0
1

Troca posio 1 com 2


4

9
3

No troca posio 0 com 1

2
2

4
9

5
1

3
2

4
0

Troca posio 2 com 3


4

Vetor Final

49

Programao de Computadores II

Prof. Erlon Pinheiro

Vamos comparar as 3 posies do vetor e efetuar a troca, se necessrio.


0
1
2
3
4
1
4
2
5
9
Vetor original atual
0
1

1
4

0
1

2
1

4
0

2
5
2
2

1
2

3
9
3
5

2
4

4
No troca posio 0 com 1
4
9

3
5

Troca posio 1 com 2


4

Vetor Final ORDENADO!!!

O algoritmo termina quando no houver mais trocas durante a execuo do processo de


comparaes, logo, vamos comparar as 2 posies do vetor e efetuar a troca, se necessrio.
0
1

1
2

0
1

4
1

2
0

2
5
2
4

1
2

3
9
3
5

2
4

4
4
9

3
5

Vetor original atual


No troca posio 0 com 1
4

Vetor Final ORDENADO!!!

Exemplo de um mdulo que implementa o algoritmo da ordenao pelo mtodo da bolha:

50

Programao de Computadores II

Prof. Erlon Pinheiro

void bolha(int *v)


{
int limsup = tam -1, trocou, aux;
do
{
trocou=0;
for( i=0; i <= (limsup-1); i++)
{
if( v[i] > v[i+1] )
{
aux = v[i];
v[i] = v[i+1];
v[i+1] = aux;
trocou = 1;
}
}
limsup = limsup - 1;
}
while(trocou = =1);
}
Exemplo de um programa que l uma lista de 20 nmeros inteiros e mostra-os ordenados na
tela.
#include <stdio.h>
#include <stdlib.h>
const int tam = 20;
int i;
void entrada(int *v)
{
for(i=0;i<tam;i++)
{
printf("Digite o %do numero do vetor: ",i+1);
scanf("%d",&v[i]);
}
printf("\n\n\n");
}
void mostra_vet(int *v)
{
for(i=0;i<tam;i++)
{
printf("%5d",v[i]);
}
printf("\n\n");
}
void bolha(int *v)
{
int limsup = tam -1, trocou, aux;

51

Programao de Computadores II

Prof. Erlon Pinheiro

do
{
trocou=0;
for(i=0;i<=(limsup-1);i++)
{
if(v[i]>v[i+1])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
trocou=1;
}
}
limsup= limsup - 1;
}while(trocou==1);
}
main ( )
{
int vet[tam];
//Entrada de dados
printf("Entre com os dados do vetor:\n\n");
entrada(vet);
//Processamento e saida de dados
bolha(vet);
// Sada de dados
printf("\n\nO vetor ordenado:\n\n ");
mostra_vet(vet);
system("pause");
}
4.2 - Pesquisa em vetores
Pesquisar significa procurar algum valor dentre os componentes de um vetor.
Existem vrios algoritmos de pesquisa. O mais simples deles a pesquisa seqencial estudada
em Programao de Computadores I.
4.2.1 - Mtodo Pesquisa Sequencial
Caracteriza-se pela busca exaustiva, componente a componente do vetor. A busca termina
quando o componente procurado encontrado ou quando o vetor chega ao seu final.
Este mtodo utilizado quando o vetor est desordenado.
Exemplo:
Valor procurado: 9
O algoritmo verificar as posies 0, 1 e 2 no obtendo sucesso.
Resultado: Existe na posio 3
52

Programao de Computadores II

0
8

Prof. Erlon Pinheiro

1
4

2
5

3
9

4
2

A seguinte funo faz pesquisa seqencial e retorna a posio onde o valor procurado foi
encontrado ou -1 caso contrrio.
int pesq_seq(int *v, int proc)
{
int i = 0, pos = -1;
while(( i < tam)&&(pos = =-1)) // tam a constante de tamanho do vetor
{
if( v[ i ] = = proc )
pos = i;
else
i++;
}
return(pos);
}
Um programa completo que faz a pesquisa seqencial em um vetor com 20 elementos
inteiros:
#include <stdio.h>
#include <stdlib.h>
const int tam = 20;
int i;
void entrada(int *v)
{
for(i=0;i<tam;i++)
{
printf("Digite o %do numero do vetor: ",i+1);
scanf("%d",&v[i]);
}
printf("\n\n\n");
}
void mostra_vet(int *v)
{
for(i=0;i<tam;i++)
{
printf("%d ",v[i]);
}
printf("\n\n");
}
int pesq_seq(int *v, int proc)
{
int i = 0, pos = -1;
while(( i <= tam)&&(pos == -1)) // tam a constante de tamanho do vetor
{
53

Programao de Computadores II

Prof. Erlon Pinheiro

if( v[ i ] == proc )
pos = i;
else
i++;
}
return(pos);
}
main ( )
{
int vet[tam],proc, posicao;
//Entrada de dados
printf("Entre com os dados do vetor:\n\n");
entrada(vet);
//Processamento e saida de dados
printf("\n\nO vetor:\n\n ");
mostra_vet(vet);
printf("\n\nDigite o numero para a pesquisa: ");
scanf("%d",&proc);
posicao = pesq_seq(vet,proc);
if(posicao==-1)
printf("\n\nO numero nao esta no vetor.\n\n ");
else
printf("\n\nO numero %d esta na posicao %d do vetor.\n\n ", proc, posicao);
system("pause");
}
4.2.2 - Pesquisa Binria
Caracteriza-se por uma busca mais eficiente, mas o vetor deve estar ordenado.
O mtodo utiliza 3 variveis que inicialmente recebem o seguinte valor:
LimInf = 0; //Primeira posio do vetor
LimSup = TamVetor 1; //ltima posio do vetor
Meio = (LimInf + LimSup) / 2; // diviso inteira
A busca termina quando encontramos o elemento desejado ou o limite inferior ultrapassa o
limite superior (elemento no encontrado) ou quando o limite superior ultrapassa o limite
inferior (elemento no encontrado).
Exemplo1:
Nmero procurado: 6
Posio
0
1
Vetor
2
3
ndice
Inf

2
5

3
6
Meio

4
7

5
8

6
9
Sup

Verifica-se que o vetor na posio meio o valor procurado. Se afirmativo encerra-se a


pesquisa, caso contrrio feita uma nova pesquisa utilizando-se a metade inferior ou
superior, dependendo se o nmero procurado menor ou maior que o nmero do meio.
54

Programao de Computadores II

Prof. Erlon Pinheiro

Supondo agora que desejamos encontrar o valor 8, teramos:


Posio
Vetor
ndice

0
2

1
3

2
5

3
6

4
7
Inf

5
8
Meio

6
9
Sup

Encontramos o valor desejado !!!


Exemplo de um mdulo que implementa a busca binria em um vetor ordenado de inteiros.
Resoluo:
int pesq_bin(int *v, int p)
{
int limsup = tam-1, liminf = 0, meio, pos = -1;
while((liminf <= limsup) && (pos = = -1))
{
meio = (liminf + limsup) / 2;
if(v[meio] = = p)
pos=meio;
else
if(v[meio] > p)
limsup= meio -1;
else
liminf = meio +1;
}
return(pos);
}
Exemplo de um programa que ordena um vetor de 20 nmeros inteiros e realiza a Busca
Binria de um valor procurado:
#include <stdio.h>
#include <stdlib.h>
const int tam = 20;
int i;
void entrada(int *v)
{
for(i=0;i<tam;i++)
{
printf("Digite o %do numero do vetor: ",i+1);
scanf("%d",&v[i]);
}
printf("\n\n\n");
}
void mostra_vet(int *v)
{
for(i=0;i<tam;i++)
55

Programao de Computadores II

Prof. Erlon Pinheiro

{
printf("%5d",v[i]);
}
printf("\n\n");
}
void bolha(int *v)
{
int limsup = tam -1, trocou, aux;
do
{
trocou=0;
for(i=0;i<=(limsup-1);i++)
{
if(v[i]>v[i+1])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
trocou=1;
}
}
limsup= limsup - 1;
}while(trocou==1);
}
int pesq_bin(int *v, int p)
{
int limsup=tam-1, liminf=0,meio, pos=-1;
while((liminf<=limsup)&&(pos==-1))
{
meio = (liminf+limsup)/2;
if(v[meio]==p)
pos=meio;
else
if(v[meio]>p)
limsup= meio -1;
else
liminf = meio +1;
}
return(pos);
}
main ( )
{
int vet[tam],proc, posicao;
//Entrada de dados
printf("Entre com os dados do vetor:\n\n");
56

Programao de Computadores II

Prof. Erlon Pinheiro

entrada(vet);
//Processamento e saida de dados
bolha(vet);
printf("\n\nO vetor ordenado:\n\n ");
mostra_vet(vet);
printf("\n\nDigite o numero para a pesquisa: ");
scanf("%d",&proc);
posicao = pesq_bin(vet,proc);
if(posicao==-1)
printf("\n\nO numero nao esta no vetor.\n\n ");
else
printf("\n\nO numero %d esta na posicao %d do vetor.\n\n ", proc, posicao);
system("pause");
}
Exerccios de Complementares 4
1. Escreva um programa modularizado que leia um vetor de 100 posies com nmeros reais e
mostre-o ordenado em ordem decrescente.
2.
Refaa o cdigo da pesquisa binria para o vetor ordenado decrescentemente do
exerccio anterior.
3.
Faa um programa C modularizado que leia uma matriz contendo as 30
matrculas de 7 turmas de programao II. Este programa deve ter mdulos que:
i.
Ordena as matrculas de uma determinada turma;
ii.
Ordena todas s matrculas de todas as turmas (observao: o mdulo deste item (ii)
deve usar o mdulo do item (i) );
iii.
Mostre as matrculas de uma determinada turma da matriz;
iv.
Mostre todas as matrculas de todas as turmas contidas na matriz;
v.
Verifica se uma matrcula est em uma determinada turma usando uma adaptao da
pesquisa binria.

57

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 5: Estruturas
5.1 Introduo ao Uso de Structs
Uma estrutura (tambm chamada de registro) agrupa vrias variveis numa s. Funciona como
uma ficha pessoal que tenha nome, telefone e endereo. A ficha seria uma estrutura. A
estrutura, ento, serve para agrupar um conjunto de dados no similares, formando um novo
tipo de dados.
Podemos definir dado como um elemento sobre o qual sero efetuadas operaes e tipo
de dado o conjunto de valores ao qual pertence um dado. Exemplos de tipos de dados
so inteiro, real, lgico, etc.
Como j vimos, podemos usar estruturas como Vetores ou Matrizes para compor
grupos de dados do mesmo tipo. Dizemos ento que Vetores e Matrizes so tipos de
dados homogneos porque todos os seus elementos so do mesmo tipo. Por exemplo,
um Vetor ou Matriz pode ser de inteiros.
Mas h outras formas de agrupar dados. Podemos ter um conjunto de dados
heterogneo. Neste tipo de conjunto, podemos agrupar dados que so de tipos
diferentes.
Em C, compomos agregados heterogneos usando estruturas de registros ou
estruturas.
Registros ou Estruturas (Structs) so colees de dados heterogneos agrupados em
uma mesma estrutura de dados. Cada elemento do registro denominado CAMPO.
5.2 Definio de Tipos
Para criar uma estrutura usa-se o comando struct.
Para podermos criar variveis do tipo estrutura temos que definir o seu tipo atravs da forma
geral:
struct nome_do_tipo_da_estrutura
{
tipo_1 nome_1; //primeiro campo
tipo_2 nome_2; //segundo campo
...
tipo_n nome_n; // n-simo campo
};
O nome_do_tipo_da_estrutura o nome para a estrutura. Vamos sempre declarar o tipo da
estrutura na parte inicial do programa (abaixo dos cabealhos stdlib.h e stdio.h).

5.3 Declarando variveis do tipo estrutura


Depois de definir o tipo poderemos declarar variveis do tipo desta estrutura no programa
principal ou nos mdulos do nosso programa.

58

Programao de Computadores II

Prof. Erlon Pinheiro

Ex. 1: Armazenar as coordenadas (x,y) de um ponto:


struct tp_ponto define um novo tipo de dado:
struct tp_ponto
{

(x, y)
int x;
int y;

};
main( )
{
struct tp_ponto p1, p2;
//Restante do qualquer de cdigo
}
a estrutura contm dois campos inteiros, x e y;
p1 e p2 so duas variveis tipo struct contendo duas coordenadas cada.
Acesso aos dados: Para acessar os campos de uma estrutura usamos referncia nominal, isto ,
basta escrever o nome da varivel tipo registro seguida de um ponto e o nome do campo
desejado.
Ex:
p1.x = 10;
/*atribuio */
p2.y = 15;
if (p1.x >= p2.x) &&
(p1.y >= p2.y) ...
Exemplo 2: Vamos criar uma estrutura um pouco mais sofisticada para armazenar os dados de
endereo:

struct tp_endereco
{
char rua [50];
int numero;
char bairro [20];
char cidade [30];
char sigla_estado [3];

59

Programao de Computadores II

Prof. Erlon Pinheiro

char CEP[10];
};
Vamos agora criar uma estrutura chamada tp_ficha_pessoal com os dados pessoais de uma
pessoa:
struct tp_ficha_pessoal
{
char nome [50];
char telefone[12];
struct tp_endereco endereco;
};
Vemos, pelos exemplos acima, que uma estrutura pode fazer parte de outra ( a struct
tipo_endereco usada pela struct tp_ficha_pessoal).
Vamos agora utilizar as estruturas declaradas anteriormennte para escrever um programa que
preencha uma ficha.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tp_endereco
{
char rua [50];
int numero;
char bairro [20];
char cidade [30];
char sigla_estado [3];
char CEP[10];
};
struct tp_ficha_pessoal
{
char nome [50];
char telefone[12];
struct tp_endereco endereco;
};
main ()
{
struct tp_ficha_pessoal ficha;
//
//
//

strcpy (ficha.nome,"Luiz Osvaldo Silva");


printf(Digite o nome: );
gets(ficha.nome);
scanf( %[^\n], ficha.nome);
strcpy(ficha.telefone,3492-1234);
strcpy (ficha.endereco.rua,"Rua das Flores");
60

Programao de Computadores II

Prof. Erlon Pinheiro

ficha.endereco.numero=10;
strcpy (ficha.endereco.bairro,"Cidade Velha");
strcpy (ficha.endereco.cidade,"Belo Horizonte");
strcpy (ficha.endereco.sigla_estado,"MG");
strcpy(ficha.endereco.CEP,31340-230);
//Sada de dados
printf(Dados pessoais:\n\n);
printf(%s.\n\n,ficha.nome);
printf(%s.\n\n,ficha.telefone);
printf(%s.\n\n,ficha.endereco.rua);
printf(%d.\n\n,ficha.endereco.numero);//etc
system(pause);
}
O programa declara uma varivel ficha do tipo ficha_pessoal 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:
strcpy(ficha.telefone,3492-1234);
Como a struct ficha pessoal possui um campo, endereco, que tambm uma struct, podemos
fazer acesso aos campos desta struct interna da seguinte maneira:
ficha.endereco.numero = 10;
strcpy(ficha.endereco.CEP,31340-230);
Desta forma, estamos acessando, primeiramente, o campo endereco da struct ficha e, dentro
deste campo, estamos acessando o campo numero e o campo CEP.

Exerccio de Fixao
Complete o exemplo anterior para mostrar os dados na tela do computador.
5.4 - Vetores de estruturas
Uma estrutura como qualquer outro tipo de dado no C. Podemos, portanto, criar vetores de
estruturas. Vamos ver como ficaria a declarao de um vetor de 100 fichas pessoais:
struct tp_ficha_pessoal fichas [100];
Poderamos ento acessar a segunda letra da sigla de estado da dcima terceira ficha fazendo:
fichas[12].endereco.sigla_estado[1];
Analise atentamente como isto est sendo feito ...

61

Programao de Computadores II

Prof. Erlon Pinheiro

AUTO AVALIAO
Escreva um programa fazendo o uso de struct's. Voc dever criar uma struct chamada
tp_ponto, contendo apenas a posio x e y (reais) do ponto. Declare 2 pontos, leia a posio
(coordenadas x e y) de cada um e calcule a distncia entre eles. Apresente no final a distncia
entre os dois pontos.
5.5 - Atribuio entre estruturas do mesmo tipo
Podemos atribuir duas estruturas que sejam do mesmo tipo. O C ir, neste caso, copiar uma
estrutura, campo por campo, na outra. Veja o programa abaixo:
struct est1
{
int i;
float f;
};
main( )
{
struct est1 primeira, segunda; /* Declara primeira e segunda como structs do tipo est1 */
primeira.i = 10;
primeira.f = 3.1415;
segunda = primeira; /* A segunda struct e' agora igual a primeira */
printf(" Os valores armazenados na segunda struct sao : %d e %.4f ", segunda.i , segunda.f);
system(pause);
}
So declaradas duas estruturas do tipo est1, uma chamada primeira e outra chamada segunda.
Atribuem-se valores aos dois campos da struct primeira. Os valores de primeira so copiados
em segunda apenas com a expresso de atribuio:
segunda = primeira;
Todos os campos de primeira sero copiados na segunda. Note que isto diferente do que
acontecia em vetores, onde, para fazer a cpia dos elementos de um vetor em outro, tnhamos
que copiar elemento por elemento do vetor. Nas structs muito mais fcil!
Inicializao de uma estrutura:
struct tp_ponto p1 = { 220, 110 };

62

Programao de Computadores II

Prof. Erlon Pinheiro

Composio de Estruturas:
struct tp_retangulo
{
struct tp_ponto inicio;
struct tp_ponto fim;
};
struct tp_retangulo r = { {10,20}, {30,40} };

Acesso aos dados:


r.inicio.x += 10;
r.inicio.y -= 10;
5.6 - Passando uma estrutura para funes
No exemplo apresentado no tem usando, vimos o seguinte comando:
strcpy (ficha.nome,"Luiz Osvaldo Silva");
Neste comando um elemento de uma estrutura passado para uma funo. Este tipo de
operao pode ser realizada sem maiores consideraes.

Podemos tambm passar para uma funo uma estrutura inteira. Veja a seguinte funo:
void PreencheFicha (struct ficha_pessoal ficha)
{
...
}
Como vemos acima fcil passar a estrutura como um todo para a funo. Devemos observar
que, como em qualquer outra funo no C, a passagem da estrutura feita por valor. A
estrutura que est sendo passada, vai ser copiada, campo por campo, em uma varivel local da
funo PreencheFicha. Isto significa que alteraes na estrutura dentro da funo no tero
efeito na varivel fora da funo. Mais uma vez podemos contornar este pormenor usando
ponteiros e passando para a funo um ponteiro para a estrutura.

63

Programao de Computadores II

Prof. Erlon Pinheiro

5.7 Ponteiros e Estruturas


Podemos ter um ponteiro para uma estrutura. Vamos ver como poderia ser declarado um
ponteiro para as estruturas de ficha que estamos usando nestas sees:
struct tp_ficha_pessoal *p;
Os ponteiros para uma estrutura funcionam como os ponteiros para qualquer outro tipo de
dados no C. Para us-lo, haveria duas possibilidades. A primeira apont-lo para uma varivel
struct j existente, da seguinte maneira:
struct tp_ficha_pessoal ficha;
struct tp_ficha_pessoal *p;
p = &ficha;
H mais um detalhe a ser considerado. Se apontarmos o ponteiro p para uma estrutura
qualquer (como fizemos em p = &ficha; ) e quisermos acessar um elemento da estrutura
poderamos fazer:
(*p).nome
Os parnteses so necessrios, porque o operador . tem precedncia maior que o operador * .
Porm, este formato no muito usado. O que comum de se fazer acessar o elemento nome
atravs do operador seta, que formado por um sinal de "menos" (-) seguido por um sinal de
"maior que" (>), isto : -> . Assim faremos:
p->nome
A declarao acima muito mais fcil e concisa. Para acessarmos o elemento CEP dentro de
endereco faramos:
p->endereco.CEP
Fcil, no?
AUTO-AVALIAO
Seja a seguinte struct que utilizada para descrever os produtos que esto no estoque de uma
loja:
struct tp_produto
{
char nome[30]; // Nome do produto
int codigo;
// Cdigo do produto
float preco;
// Preo do produto
};

64

Programao de Computadores II

Prof. Erlon Pinheiro

a) Escreva uma instruo que declare um vetor de produtos com 10 itens de produtos;
Resposta:
const int TAM = 10;
struct tp_produto

estoque[TAM];

b) Atribua os valores "Pe de Moleque", 13205 e R$0,20 aos campos da posio 0 e os valores
"Cocada Baiana", 15202 e R$0,50 aos campos da posio 1 do vetor anterior;
Resposta:
strcpy(estoque[0].nome,Pe de Moleque);
estoque[0].codigo = 13205;
estoque[0].preco = 0.2;
strcpy(estoque[1].nome,Cocada Baiana);
estoque[1].codigo = 13202;
estoque[1].preco = 0.5;
c) Escreva as instrues para imprimir os campos que foram atribudos na letra b.
Resposta:
printf(Nome do produto: %s\n, estoque[0].nome);
printf(Codigo: %d\n, estoque[0].codigo);
printf(Preco: R$ %.2f\n, estoque[0].preco);
// Faa o mesmo para estoque[1]!
d) Faa um programa C modularizado que leia os dados do vetor e mostre na tela um relatrio
com os dados de cada produto.

65

Programao de Computadores II

Prof. Erlon Pinheiro

Exerccios Complementares 5
1 Faa um programa C modularizado que leia e mostre na tela um registro com o seguinte
formato:
Registro Funcionrio
Nome
Endereo
Rua
Nmero
Bairro
Data de Nascimento
Dia
Ms
Ano
Salrio
Os campos endereco e data de nascimento devem ser do tipo registro.
2 Faa um programa C que leia os dados de 200 funcionrios: nome, cargo e salrio. Calcule a
mdia salarial. Imprima os nomes dos funcionrios com salrio acima da mdia.
3 Faa um programa C que leia uma agenda telefnica com a estrutura abaixo e imprima os
nomes dos aniversariantes do ms desejado. Assuma que a agenda possua no mximo 100
cadastros. Caso no haja aniversariantes no ms desejado imprima uma mensagem informando
tal fato, por exemplo: No h aniversariantes em outubro.
Cadastro
Nome
Telefone
nascimento
Dia
Ms
Ano
4 Faa um programa C que leia uma tabela do seguinte tipo (no necessariamente com estes
dados):
cdigo profisso
1
001
Administrador
2
002
Advogado
:
:
:
.
.
.
10 010
Veterinrio
Em seguida leia diversos cdigos e informe o nome da profisso correspondente. Caso seja lido
um cdigo que no esteja presente na tabela mostre a seguinte frase: profisso no
cadastrada.. A cada novo cdigo lido pergunte ao usurio se deseja ler novo cdigo.
5 O diagrama abaixo representa o ptio de uma empresa de material de construo. No ptio
esto armazenados os seguintes produtos: cimento, areia, tubos, lajotas, madeira, cal e saibro.
30 | cimento

00 | vazio

80 | saibro

40 | madeira

66

Programao de Computadores II
00 | vazio
00 | vazio
53 | tubos

23 | lajotas
00 | vazio
15 | tubos

Prof. Erlon Pinheiro


00 | vazio
30 | areia
45 | tubos

10 | cimento
00 | vazio
10 | saibro

Em cada espao do depsito acima esto colocados a quantidade e o nome do material


armazenado. Assim, 30 cimento indica que naquele local existem 30 unidades de cimento.
Observe que pode haver mais de um local com o mesmo material, materiais sem estoque, ou
seja, locais vazios.
Faa um programa que conte quantas unidades de cada produto existe no ptio e imprima um
relatrio com o seguinte formato:
Produto Quantidade
Areia
xxxxxxx
Cal
xxxxxxx
Cimento xxxxxxx ...
Utilize uma matriz de registros como estrutura de dados do programa. Cada registro contm os
campos quantidade e nome do material.
6 Uma empresa faz a folha mensal de pagamentos de seus empregados utilizando uma
estrutura de dados como a mostrada abaixo:
cadastro
1

matrcula

nome

categoria

horas
normais

horas
extras

2
3
:
:
n
Faa um programa que processe a tabela e emita, para cada funcionrio, seu contracheque, cujo
formato dado a seguir:
Nmero de Matrcula: xxxxxxxxx
Nome: xxxxxxxxxxxxxxxxx
Salrio referente as horas normais trabalhadas: R$ xxxxxxxx.xx
Salrio referente as horas extras trabalhadas: R$ xxxxxxxx.xx
Deduo do Sindicato: R$ xxxxxxxx.xx
Salrio Lquido: R$ xxxxxxxx.xx
Para o clculo do salrio mensal dos funcionrios considere as seguintes regras:
o valor do salrio de referncia lido
existem duas classes de funcionrios, categoria 1, cujo salrio 1 vez o salrio de referncia,
e categoria 2, cujo salrio 1,5 vez o salrio de referncia.
o salrio referente as horas normais = salrio referncia x categoria x n o horas normais
o salrio referente as horas extras calculado acrescentando 30% ao salrio de referncia
o desconto do sindicato de 0,5% do salrio bruto

67

Programao de Computadores II

Prof. Erlon Pinheiro

7 Construa um programa capaz de armazenar um registro de informaes sobre todas as


passagens rodovirias vendidas em um nibus de 44 lugares. A estrutura de dados usada ser do
seguinte tipo:
nibus
1
2
3
:

Poltrona:
Passageiro:
Origem:

Ocupada (s/n):
Sexo:
Destino:

44
O programa deve ser capaz de:
- informar a taxa de ocupao do nibus;
- informar o nmero de passageiros do sexo feminino
8 Faa um programa que leia um cadastro de funcionrios de uma empresa e imprima o nome
de todos os funcionrios de nvel superior com salrio abaixo de 1500 reais.
Utilize um vetor para armazenar o cadastro de funcionrios. Cada registro do cadastro tem
a seguinte estrutura:
Matricula
Nome
Departamento
Nvel de escolaridade
Data de Nascimento
Dia
Ms
Ano
Salrio
Ordene os funcionrios pelo salrio e depois pesquise um salrio lido do teclado.
9 Uma pequena empresa de taxi est montando sua frota, composta por no mximo 15 carros,
utilizando a seguinte estrutura:
frota
0
1
2
:

Nmero:
Tipo:
Combustvel:

Em uso (S/N):
Ano:
Placa:

14
Faa um programa que utilize o seguinte menu:
Frota de Taxi Tabajara
[1] Cadastrar frota de Carros;
[2] Inserir novo carro a frota;

68

Programao de Computadores II

Prof. Erlon Pinheiro

[3] Encontrar e marcar um carro disponvel de acordo com o tipo e ano;


[4] Finalizar utilizao do carro pela placa;
[5] Fechar o programa
Escolha uma das opes:
Obs.:
a) A opo 1 deve ler os dados de um ou mais veculos, a menos do campo EM USO. Este
campo (EM USO) de todos os carros cadastrados deve ser preenchido com o caractere N.
O tipo do veculo pode ser simples, executivo ou luxo. O usurio deve entrar com os
dados de quantos carros ele quiser ( isto vai servir para o programa funcionar com um
numero de carros menor ou igual a 15). O combustvel poder ser lcool (A), gasolina (G)
ou flex (F) utilize estes caracteres e faa o tratamento de erro;
b) A opo 2 deve ser utilizada para simular a situao de compra de um novo carro. E, a
partir da, o numero total de carros cadastrados deve ser atualizado;
c) A opo 3 ser utilizada para simular chamadas de clientes para a locao de veculos. A
cada chamada o cliente informa o tipo e o ano do veculo que quer locar. Se um carro do
tipo e ano pedido estiver disponvel preencha o campo EM USO com S e mostre os dados
do carro, caso contrrio informe que a alocao no possvel no momento.
d) Na opo 4 o programa deve achar o carro em uso pela placa e finalizar a utilizao
deste carro, ou seja, trocar o campo EM USO para N;
e) O programa s deve terminar se a opo 5 for escolhida. Uma mensagem de erro deve
ser apresentada caso a opo escolhida for invlida e o menu deve ser apresentado
novamente na sequencia.
10 - Uma professora do pr-primrio mantm um cadastro dos seus 40 alunos usando a ficha:
Nome:
Turma:
Notas:
Observe que cada aluninho possui 10 notas.
Faa um programa que, utilizando uma estrutura de dados adequada, leia as 40 fichas da
professora e construa um relatrio informando o nome, a turma e a mdia de cada aluninho.

11 - Considere a ltima auto-avaliao deste captulo (captulo V ) e complete aquele programa


da seguinte forma:
a) Incremente o programa do item d para ordenar o vetor de produtos pelo cdigo,
usando o mtodo da bolha; ou seja, deve-se fazer o mdulo da bolha adaptado para
um vetor de registro.

(Dica: Estudar a seo 5.5 - Atribuio entre estruturas do mesmo tipo)


b) Finalize o programa implementando a pesquisa binria para encontrar um produto de
determinado cdigo e apresentar todas as suas informaes. (Faa dois mdulos: um

69

Programao de Computadores II

Prof. Erlon Pinheiro

para chamar a pesquisa binria e mostrar os resultados, e o outro que faz a pesquisa
binria)

70

Programao de Computadores II

Prof. Erlon Pinheiro

Unidade 6: Arquivos
6.1 Introduo: Definies e uso de Arquivos
Um arquivo uma coleo homognea de itens que reside em disco. Arquivos so semelhantes a
vetores, diferindo apenas em dois aspectos:
1o vetores residem na memria RAM, enquanto arquivos residem em disco.
2o vetores tm tamanho fixo e predefinido, enquanto arquivos no.
A vantagem no uso de arquivos que, diferentemente do que ocorre com um vetor, os dados
no so perdidos entre uma execuo e outra. A desvantagem que o acesso a disco muito
mais lento do que o acesso memria e, conseqentemente, o uso de arquivos torna a execuo
do programa mais lenta.
Para melhorar a eficincia, o sistema operacional usa uma rea de memria denominada buffer.
Os dados gravados pelo programa so temporariamente armazenados no buffer; quando ele fica
cheio, o sistema o descarrega de uma s vez no disco. Analogamente, durante a leitura, o
sistema se encarrega encher o buffer toda vez que ele fica vazio. Isso diminui o nmero de
acessos a disco e, portanto, aumenta a velocidade de execuo do programa.
Um arquivo pode ser aberto em modo texto ou em modo binrio. Arquivos do tipo texto podem
ser criados e modificados por um editor de textos do tipo Bloco de notas, enquanto que um
arquivo binrio s pode ser acessado via criao de um programa C para tal finalidade.
6.2 - Abrindo e Fechando um Arquivo
O sistema de entrada e sada do ANSI C composto por uma srie de funes, cujos prottipos
esto reunidos em stdio.h . Todas estas funes trabalham com o conceito de "ponteiro de
arquivo". Esta definio tambm est no arquivo stdio.h. Podemos declarar um ponteiro de
arquivo da seguinte maneira:
FILE *p;
p ser ento um ponteiro para um arquivo. usando este tipo de ponteiro que vamos poder
manipular arquivos no C.
- fopen
Esta a funo de abertura de arquivos. Seu prottipo :
FILE *fopen (char *nome_do_arquivo,char *modo);
O nome_do_arquivo determina qual arquivo dever ser aberto. Este nome deve ser vlido no
sistema operacional que estiver sendo utilizado. Quando ocorre algum erro na abertura do

71

Programao de Computadores II

Prof. Erlon Pinheiro

arquivo a funo fopen retorna zero. O modo de abertura diz funo fopen() que tipo de uso
voc vai fazer do arquivo. A tabela abaixo mostra os valores de modo vlidos:
Modo
"r"
"w"
"a"

Significado
Abre um arquivo texto para leitura. O arquivo deve existir antes de ser
aberto.
Abrir um arquivo texto para gravao. Se o arquivo no existir, ele ser
criado. Se j existir, o contedo anterior ser destrudo.
Abrir um arquivo texto para gravao. Os dados sero adicionados no fim do
arquivo ("append"), se ele j existir, ou um novo arquivo ser criado, no caso
de arquivo no existente anteriormente.

- fclose
Quando acabamos de usar um arquivo que abrimos, devemos fech-lo. Para tanto usamos a
funo fclose():
int fclose (FILE *fp);
O ponteiro fp passado funo fclose() determina o arquivo a ser fechado. A funo retorna
zero no caso de sucesso.
Fechar um arquivo faz com que qualquer caractere que tenha permanecido no "buffer"
associado ao fluxo de sada seja gravado. Mas, o que este "buffer"? Quando voc envia
caracteres para serem gravados em um arquivo, estes caracteres so armazenados
temporariamente em uma rea de memria (o "buffer") em vez de serem escritos em disco
imediatamente. Quando o "buffer" estiver cheio, seu contedo escrito no disco de uma vez. A
razo para se fazer isto tem a ver com a eficincia nas leituras e gravaes de arquivos. Se, para
cada caractere que fossemos gravar, tivssemos que posicionar a cabea de gravao em um
ponto especfico do disco, apenas para gravar aquele caractere, as gravaes seriam muito
lentas. Assim estas gravaes s sero efetuadas quando houver um volume razovel de
informaes a serem gravadas ou quando o arquivo for fechado.

6.3 Finalizando a execuo de um programa


Comando exit
Aqui abrimos um parnteses para explicar a funo exit() cujo prottipo :
void exit (int codigo_de_retorno);
Esta funo est no cabealho stdlib.h. A funo exit() aborta a execuo do programa. Pode ser
chamada de qualquer ponto no programa e faz com que o programa termine e retorne, para o
sistema operacional, o cdigo_de_retorno. A conveno mais usada que um programa retorne
zero no caso de um trmino normal e retorne um nmero no nulo no caso tenha ocorrido um
problema. A funo exit() se torna importante em casos como abertura de arquivos pois, se o
programa no conseguir a memria necessria ou abrir o arquivo, a melhor sada pode ser

72

Programao de Computadores II

Prof. Erlon Pinheiro

terminar a execuo do programa. Pode-se escrever o seguinte exemplo usando a funo exit()
para garantir que o programa no deixar de abrir o arquivo:
// Exemplo 1
#include <stdio.h>
#include <stdlib.h> /* Para a funo exit() */
main ( )
{
FILE *fp;
...
fp=fopen ("exemplo.txt","w");//Retorna zero se ocorrer erro de abertura
if (fp==0)//fp==0 ou fp == NULL ou !fp
{
printf ("Erro na abertura do arquivo. Fim de programa.");
system(pause);
exit (1);//Informa fim prematuro da main
}
...
fclose(fp);
system(pause);
}
A funo exit( ) fecha todos os arquivos que um programa tiver aberto.

6.4 - Lendo e Escrevendo Caracteres em Arquivos


Funo putc
A funo putc a primeira funo de escrita de arquivo que veremos. Seu prottipo :
int putc (char ch,FILE *fp);
Escreve um caractere no arquivo.
O programa a seguir l uma string do teclado e escreve-a, caractere por caractere em um
arquivo em disco (o arquivo exemplo.txt, que ser aberto no diretrio corrente).
// Exemplo 2
#include <stdio.h>
#include <stdlib.h>
main( )
{
FILE *fp;
char string[100];
int i;
fp = fopen("exemplo.txt","w"); /* Arquivo ASCII, para escrita */
if(fp==0)
{
73

Programao de Computadores II

Prof. Erlon Pinheiro

printf( "Erro na abertura do arquivo");


system(pause);
exit(1);
}
printf("Entre com a string a ser gravada no arquivo:");
gets(string);
for(i=0; string[i] !=\0;i++)
putc(string[i], fp); /* Grava a string, caractere a caractere */
fclose(fp);
system(pause);
}
Depois de executar este programa, verifique o contedo do arquivo arquivo.txt (voc pode usar
qualquer editor de textos). Voc ver que a string que voc digitou est armazenada nele.
Funo getc
Retorna um caractere lido do arquivo. Prottipo:
int getc (FILE *fp);
Uma forma de se verificar se o final do arquivo foi atingido comparar o caractere lido por getc
com EOF( que uma constante indicativa de fim de arquivo). O programa a seguir abre um
arquivo j existente e o l, caractere por caractere, at que o final do arquivo seja atingido. Os
caracteres lidos so apresentados na tela:
// Exemplo 3
#include <stdio.h>
#include <stdlib.h>
main( )
{
FILE *fp;
char c;
fp = fopen("exemplo.txt","r"); /* Arquivo ASCII, para leitura */
if(fp==0)
{
printf( "Erro na abertura do arquivo\n\n");
system(pause);
exit(1);
}
c = getc(fp);//Lendo o primeiro caractere do arquivo
while( c != EOF) /* Enquanto no chegar ao final do arquivo */
{
printf("%c", c);
/* imprime o caractere lido */
74

Programao de Computadores II

Prof. Erlon Pinheiro

c = getc(fp);//Lendo o prximo caractere do arquivo


}
fclose(fp);
system(pause);
}
A seguir apresentado um programa onde vrias operaes com arquivos so realizadas,
usando as funes estudadas. Primeiro o arquivo aberto para a escrita, e imprime-se algo
nele. Em seguida, o arquivo fechado e novamente aberto para a leitura. Verifique o exemplo.
// Exemplo 4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main( )
{
FILE *p;
char c, str[30], frase[80] = "Este e um arquivo chamado: ";
int i;
/* L um nome para o arquivo a ser aberto: */
printf("\n\n Entre com um nome para o arquivo:\n");
gets(str);
p = fopen(str,"w");
if ( p==0) /* Caso ocorra algum erro na abertura do arquivo..*/
{
/* o programa termina automaticamente */
printf("Erro! Impossvel abrir o arquivo!\n");
system(pause);
exit(1);
}
/* Se no houve erro, imprime no arquivo e o fecha ...*/
strcat(frase, str);
for (i=0; frase[i]!=\0; i++)
putc(frase[i],p);
fclose(p);
/* Abre novamente para leitura */
p = fopen(str,"r");
if ( p==0) /* Caso ocorra algum erro na abertura do arquivo..*/
{
/* o programa termina automaticamente */
printf("Erro! Impossvel abrir o arquivo!\n");
system(pause);
exit(1);
}
c = getc(p);
/* L o primeiro caractere */
while (c!=EOF)/*Enquanto no se chegar no final do arquivo */
{
75

Programao de Computadores II

Prof. Erlon Pinheiro

printf("%c",c); /* Imprime o caractere na tela */


c = getc(p); /* L um novo caractere no arquivo */
}
fclose(p);
/* Fecha o arquivo */
printf("\n\n");
system("pause");
}
AUTO-AVALIAO
Veja como voc est: escreva um programa que abra um arquivo texto e conte o nmero de
caracteres presentes nele. Imprima o nmero de caracteres na tela.
6.5 - Outros Comandos de Acesso a Arquivos
Funo fgets
Para ler uma string num arquivo podemos usar fgets() cujo prottipo :
char *fgets (char *str, int tamanho,FILE *fp);

A funo recebe 3 argumentos: a string a ser lida, o limite mximo de caracteres a serem lidos e
o ponteiro para FILE, que est associado ao arquivo de onde a string ser lida. A funo l a
string at que um caractere de nova linha seja lido ou tamanho-1 caracteres tenham sido lidos.
Se o caractere de nova linha ('\n') for lido, ele far parte da string, o que no acontecia com
gets. A string resultante sempre terminar com '\0' (por isto somente tamanho-1 caracteres, no
mximo, sero lidos).

A funo fgets semelhante funo gets(), porm, alm dela poder fazer a leitura a partir de
um arquivo de dados e incluir o caractere de nova linha na string, ela ainda especifica o
tamanho mximo da string de entrada. Como vimos, a funo gets no tinha este controle, o
que poderia acarretar erros de "estouro de buffer".
Funo fputs
Prottipo:
char *fputs (char *str,FILE *fp);
Escreve uma string num arquivo.
Fluxos Padro
Os fluxos padro em arquivos permitem ao programador ler e escrever em arquivos da
maneira padro com a qual o j lamos e escrevamos na tela.
76

Programao de Computadores II

Prof. Erlon Pinheiro

Funo fprintf
A funo fprintf() funciona como a funo printf(). A diferena que a sada de
fprintf() um arquivo e no a tela do computador. Prottipo:
int fprintf (FILE *fp,char *str,...);
Como j poderamos esperar, a nica diferena do prottipo de fprintf() para o de
printf() a especificao do arquivo destino atravs do ponteiro de arquivo.
Funo fscanf
A funo fscanf() funciona como a funo scanf(). A diferena que fscanf() l de um arquivo e
no do teclado do computador. Prottipo:
int fscanf (FILE *fp,char *str,...);
Como j poderamos esperar, a nica diferena do prottipo de fscanf() para o de scanf() a
especificao do arquivo destino atravs do ponteiro de arquivo.

Usando fprintf () e fscanf():


// Exemplo 5
#include <stdio.h>
#include <stdlib.h>
main( )
{
FILE *p;
char nome_arq[80],c;
/* Le um nome para o arquivo a ser aberto: */
printf("\n\n Entre com um nome para o arquivo:\n");
gets(nome_arq);
p = fopen(nome_arq,"w");
if (p==0) /* Caso ocorra algum erro na abertura do arquivo..*/
{
/* o programa aborta automaticamente */
printf("Erro! Impossivel abrir o arquivo!\n");
system(pause);
exit(1);
}
/* Se nao houve erro, imprime no arquivo, fecha ...*/
fprintf(p,"Este e um arquivo chamado:\n%s\n", nome_arq);
fclose(p);
/* abre novamente para a leitura */
p = fopen(nome_arq,"r");
77

Programao de Computadores II

Prof. Erlon Pinheiro

if (p==0) /* Caso ocorra algum erro na abertura do arquivo..*/


{
/* o programa aborta automaticamente */
printf("Erro! Impossivel abrir o arquivo!\n");
system(pause);
exit(1);
}
fscanf(p,"%c",&c);
while ( ! feof(p))
{
printf("%c",c);
fscanf(p,"%c",&c);
}
fclose(p);
printf(\n\n\n);
system(pause);
}
AUTO AVALIAO
Veja como voc est. Escreva um programa que leia uma lista de nomes e idades de um arquivo
texto. Prepare um arquivo para ser lido com nomes e idades. Apresente os dados lidos em forma de
tabela na tela. Use as funes de sua preferncia, mas faa pelo menos duas verses do programa
usando funes de leitura diferentes.

Exerccios Complementares 6
1) Faa um programa que conte quantas vogais existem em um arquivo texto. O programa
dever ler o nome do arquivo texto e exibir o total de vogais encontradas no arquivo.
2) Faa um programa que codifique um determinado texto gravado em um
chamado texto.txt, a partir da seguinte tabela de substituio de caracteres:
CARACTER EXISTENTE

arquivo

CARACTER A SER SUBSTITUDO

Faa duas verses: (a) Imprima o texto codificado na tela; (b) Imprima o texto codificado no
arquivo texto_cod.txt.

78

Programao de Computadores II

Prof. Erlon Pinheiro

3) Faa um programa C que dever solicitar e armazenar nomes de pessoas. Este programa
dever conter um menu contendo quatro opes:
[1] - Criar arquivo
[2] - Cadastrar nome
[3] - Exibir nomes cadastrados
[4] - Finalizar o programa
Opo: __
O programa deve mostrar uma mensagem de erro caso o usurio escolha uma opo invlida.
Note que o programa s deve terminar quando o usurio escolher a opo 4. Observe tambm
que as opes 2 e 3 s podem funcionar se o arquivo foi criado.
4)
Faa um programa que crie uma cpia de um arquivo texto existente. O nome do
arquivo deve ser lido do teclado (Apenas o nome, sem a extenso .txt). Por exemplo: Se o
arquivo original se chamar texto.txt o arquivo de cpia deve se chamar texto_cop.txt.
5)
Faa um programa C que crie uma cpia do arquivo com todos os caracteres em
maisculo.

79

Programao de Computadores II

Prof. Erlon Pinheiro

Referncias Bibliogrficas
1. Apostila: Curso de Linguagem C UFMG. Acessado em 01/09/2010 http://www.slideshare.net/edigleyg3/curso-de-linguagem-c?
src=related_normal&rel=1920092
2. CELES, W., CERQUEIRA, R., RANGEL, J. L. Introduo a Estruturas de Dados com tcnicas
de programao em C, Rio de Janeiro: Elsevier, 2004.
3. Mizrahi, V. V. Treinamento em Linguagem C, Mdulo 1, So Paulo: Pearson Makron
Books, 1990.
4.

SENNE, E. L. F. Primeiro Curso de Programao em C, Santa Catarina: Visual Books, 2003.

5.
FORBELLONE, A. L. V., et al. Lgica de Programao. 2.ed. So Paulo: Makron Books,
2000.
6.
JAMSA, K., KLANDER, L. Programando em C/C++: a Bblia, So Paulo: Makron Books,
1999.
7.

MANZANO, J.A. Estudo Dirigido de Linguagem C, 2 edio, So Paulo: rica, 1998.

8.
MANZANO, J. A. N. G., et al. Algoritmos: lgica para desenvolvimento de programao.
7.ed. So Paulo: rica, 1999.
9.
MANZANO, J. A. N. G., et al Algoritmos: estudo dirigido algoritmos. 3.ed. So Paulo: rica,
1998.
10. SCHILDT, H. C Completo e Total, 3a edio, So Paulo: Makron Books, 1997.

80