Escolar Documentos
Profissional Documentos
Cultura Documentos
Programao de Computadores II
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
Programao de Computadores II
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:
Programao de Computadores II
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.
Programao de Computadores II
#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
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.
Programao de Computadores II
Programao de Computadores II
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
10
Programao de Computadores II
11
Programao de Computadores II
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
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=# /* Pega o endereo de num */
valor=*p;
/* Valor e igualado a num de uma
13
Programao de Computadores II
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=# /* 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
Programao de Computadores II
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
#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
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.
Modulo 2 - Subtrao
1.
2.
3.
4.
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
Programao de Computadores II
Programao de Computadores II
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
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
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
Programao de Computadores II
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
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
d) 10* - (*p)/(*q)+7
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
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
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
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
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;
29
Programao de Computadores II
Se o caractere \0 no fosse colocado, a funo printf seria executada de forma errada, pois no
conseguiria identificar o final da cadeia.
Programao de Computadores II
Programao de Computadores II
32
Programao de Computadores II
33
Programao de Computadores II
34
Programao de Computadores II
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
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
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
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
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
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
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
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
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
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.
Programao de Computadores II
-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
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
46
Programao de Computadores II
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
48
Programao de Computadores II
1
5
0
1
1
5
0
1
4
2
3
4
2
9
2
3
Vetor Final
1
5
0
1
9
3
2
2
4
9
5
1
3
2
4
0
Vetor Final
49
Programao de Computadores II
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
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
50
Programao de Computadores II
51
Programao de Computadores II
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
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
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
Programao de Computadores II
0
2
1
3
2
5
3
6
4
7
Inf
5
8
Meio
6
9
Sup
Programao de Computadores II
{
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
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
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).
58
Programao de Computadores II
(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
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;
//
//
//
Programao de Computadores II
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
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
Composio de Estruturas:
struct tp_retangulo
{
struct tp_ponto inicio;
struct tp_ponto fim;
};
struct tp_retangulo r = { {10,20}, {30,40} };
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
64
Programao de Computadores II
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
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
10 | cimento
00 | vazio
10 | saibro
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
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
69
Programao de Computadores II
para chamar a pesquisa binria e mostrar os resultados, e o outro que faz a pesquisa
binria)
70
Programao de Computadores II
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
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.
72
Programao de Computadores II
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.
Programao de Computadores II
Programao de Computadores II
Programao de Computadores II
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
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.
Programao de Computadores II
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
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
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
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.
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.
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