Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tcnicas de Programao I
Algoritmos
http://www.satc.edu.br/gcascaes/
verso 1.05.111
2008/2009
Acontece que muito difcil inventar uma teoria que descreva o
universo de uma s vez. Pelo contrrio, decompomos o problema
em pedaos e inventamos vrias teorias parciais. Cada uma
dessas teorias parciais descreve e prev uma determinada e
limitada classe de observaes, desconsiderando os efeitos de
outras quantidades, ou representando-os por simples conjuntos
de nmeros. possvel que este enfoque esteja inteiramente
errado. Se tudo no universo depender de tudo o mais de uma
maneira fundamental, poderia ser impossvel chegar mais perto
de uma soluo completa atravs da investigao de partes
isoladas do problema. Ainda assim, foi desta maneira que
fizemos progresso no passado.
4
Listas de figuras
6
1 Introduo
Problema
Soluo
Algoritmo
7
representa a soluo do problema proposta pelo programador.
O objetivo desse curso a Lgica de Programao dando uma base terica e
prtica, suficientemente boa, para que, o aluno domine os algoritmos e esteja habilitado a
aprender uma linguagem de programao.
i) Descrio Narrativa;
ii) Fluxogramas;
iii) Pseudocdigo, tambm conhecido como Portugus Estruturado.
8
1.2.1 Descrio narrativa
Ler a prova;
Pegar a caneta;
Enquanto ((houver questo em branco) e (tempo no terminou)) faa
Se (souber a questo)
Resolv-la;
Seno
Pular para prxima;
Entregar a prova.
Exerccios propostos
9
Exerccio 1.1 Um homem precisa atravessar um rio com um barco que possui
capacidade de carregar apenas ele mesmo e mais uma de suas trs
cargas, que so: um lobo, um bode e um fardo de capim. O que o
homem deve fazer para conseguir atravessar o rio sem perder suas
cargas?
Exerccio 1.2 Construa a seqncia/soluo que mova trs discos de uma Torre de
Hani, que consiste em trs hastes (a-b-c), uma das quais serve de
suporte para trs discos de tamanhos diferentes (1-2-3), os menores
sobre os maiores. Pode-se mover um disco de cada vez para qualquer
haste, contanto que nunca seja colocado um disco maior sobre um
menor. O objetivo transferir os trs discos para outra haste.
a b c
Exerccio 1.3 Trs jesutas e trs canibais precisam atravessar um rio; para tal,
dispem de um barco com capacidade para duas pessoas. Por medidas
de segurana no se permite que em alguma margem a quantidade de
jesutas seja inferior de canibais. Qual a seqncia de passos que
permitiria a travessia com segurana?
1.2.2 Fluxogramas
10
Incio
Num
Triplo = Num * 3
Triplo
Fim
#incluir biblioteca
/* 1. Declarao das bibliotecas utilizadas */
11
/* 2. Declarao de constantes, entre outras */
principal () /* 3. Funo principal do algoritmo */
inicio /* 4. Incio do escopo / bloco principal */
/* 6. Iniciar as variveis */
/* 7. Solicitar a entrada de dados ao usurio */
/* 8. Entrada de dados */
/* 9. Processamento / Clculos */
/* 10. Sada de informaes */
/* 11. Retorno de erro ou Ok */
Exemplo 1.3 Algoritmo para calcular a mdia aritmtica simples de duas notas.
Inicialmente ser mostrado como algoritmo generalizado e em seguida,
como dever estar ao longo desta apostila. Usando a sintaxe da
linguagem C e o C Quietly.
12
Situao 1: Visto como algoritmo presente em vrios livros de estrutura de dados
e algoritmos:
Algoritmo Calculo_Media
Inicio
Leia(nota1, nota2);
Se (media >= 7)
Ento
Escreva (Aprovado)
Seno
Escreva (Reprovado);
Fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
leia("%d",¬a1);
leia("%d",¬a2);
retorno (0);
fim
13
Para escrever algoritmos preciso uma linguagem clara e que no deixe margem
a ambigidades, para isto, deve-se definir uma sintaxe e uma semntica, de forma a
permitir uma nica interpretao das instrues em um algoritmo. A sintaxe aqui
proposta, tende a uma maior proximidade com a linguagem C, mas ainda assim poder
ser convertida para outras linguagens como exemplo a linguagem Pascal.
14
2 Variveis, expresses, funes, atribuies, entrada e sada
2.1 Variveis
tipo_da_variavel nome_da_variavel ;
inteiro a;
real x;
char letra;
char nome[40]; /* Armazena at 40 caracteres */
15
iii) Os nomes das variveis escritas com letras maisculas so diferentes das
letras minsculas. Assim, nota1 diferente de NOTA1.
iv) Palavras chaves ou reservadas de cada linguagem tambm no podem ser
utilizadas, facilitando a converso do algoritmo para o cdigo fonte da
linguagem a ser utilizada.
Numricas
inteiro
16
inteiro a;
inteiro b;
ou
inteiro a,b;
real
real x;
real y;
ou
real x,y;
Caracteres
char
Lgicos
Tambm conhecido como tipo booleano. Pode representar apenas dois valores:
Verdadeiro ou Falso. Pode ser utilizado em algumas linguagens de programao com
17
outras denominaes, tais como Sim/No, True/False, 1/0, Verdadeiro/Falso.
Ao utilizarmos o C Quietly, e indiretamente a linguagem C, buscaremos outro
conceito antes de continuarmos com o tipo lgico: o conceito de constante simblica.
Constante simblica
#definir TAMANHO 50
#definir MAX 100
#definir VERDADEIRO 1
#definir FALSO 0
e/ou
#definir TRUE 1
#definir FALSE 0
#definir APROVADO 1
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro nota1, nota2, aluno;
real media;
leia("%d",¬a1);
leia("%d",¬a2);
se (aluno == APROVADO)
18
inicio
imprima ("Voce foi Aprovado\n");
fim
senao
inicio
imprima ("Voce foi Reprovado\n");
fim
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
dobro = num * 2;
Exerccio 2.1 - Quais as palavras abaixo possuem nomes vlidos para identificadores?
Vlido/Invlido
Salario_Real ( ) ( )
TotalEmDolares ( ) ( )
Real ( ) ( )
Nota GrauA ( ) ( )
@Home ( ) ( )
Web@Home ( ) ( )
web ( ) ( )
Salrio2006 ( ) ( )
Opo_Inicial ( ) ( )
Last ( ) ( )
4Ever ( ) ( )
19
2.3 Expresses
2.3.1 Aritmticas
Exemplo 2.5 - Algoritmo para somar dois nmeros, incluindo tambm outras operaes.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro a, b, r;
real r2;
20
r2 = (real) a / b;
imprima ("A Divisao de %d e %d = %0.2f\n",a,b,r2);
r = a - b;
imprima ("A subtracao de %d e %d = %d\n",a,b,r);
r = a * b;
imprima ("A multiplic de %d e %d = %d\n",a,b,r);
r = a / b;
imprima ("A Divisao int %d e %d = %d\n",a,b,r);
r = a resto b;
imprima ("O Resto Div de %d e %d = %d\n",a,b,r);
retorno (0);
fim
2.3.2 Relacionais
Exemplos:
A == B; A igual a B
C != D; C diferente de D
F >= E; F maior ou igual a E
J < H; J menor que H
X <= 5; X menor ou igual a 5
3 > W; 3 maior que o valor da varivel W
21
2.3.3 Lgicas
Suponha que uma empresa da regio esta fazendo uma entrevista com quatro
pessoas, para o preenchimento de uma vaga de programador snior. Cada pessoa ir
responder 1 se domina a linguagem e 0 caso no seja de seu domnio.
22
Tabela verdade do operador !
23
facilmente encontradas nas principais linguagens de programao. Veja (tab. 2.8)
algumas dessas funes a seguir.
#incluir <stdio.h>
#incluir <conio.h>
#incluir <math.h>
principal ()
inicio
Q1 = potencia(ladoA,2);
Q2 = quadrado(ladoB);
hipotenusa = raiz(Q1 + Q2);
retorno (0);
fim
2.5 Atribuies
24
Exemplo 2.7 Atribuio de um valor a uma varivel inteira.
y = 6;
y
6
z = y * x;
y x z
6 3 18
25
Exemplo 2.9 Trocando o contedo das variveis a e b com auxlio de uma varivel
temporria.
a = 2;
b = 3; /* Passo 1 */
temp = a;
a = b; /* Passo 2 */
b = temp; /* Passo 3 */
a = 5;
b = 7; /* Passo 1 */
a++; /* Passo 2 */
b--; /* Passo 3 */
a b a b a b
5 7 6 7 6 6
26
Os identificadores contidos na lista, devem estar separados por vrgula.
Considerando a unidade de sada padro, o monitor de vdeo, no algoritmo o
comando seria:
imprima ("texto");
ou
imprima ("texto %caractere",variavel);
ou
imprima ("texto %caractere",constante);
ou
imprima ("texto %caractere",expressao);
27
Com imprima o cursor permanece na mesma linha aps a execuo do
comando, utilizando-se o caractere de controle (\n) move-se o cursor para a prxima
linha.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro a, b;
a = 5;
b = 10;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro a, b;
real m;
a = 5;
b = 10;
m = (a + b)/2.0;
28
imprima ("Media = %.2f\n",m);
retorno (0);
fim
Memria (RAM)
a b m
5 10 7.5
Vdeo
A = 5 e B = 10
Media = 7.50000e+00
Media = 7.500000
Media = 7.50
pressione qualquer tecla...
Onde %conversao deve ser substitudo por um dos caracteres de controle (tab.
2.11) a seguir. Cada varivel ou lista de variveis deve vir precedida por um caractere &
29
(E comercial), que indica o fornecimento do endereo de memria representado pelo
identificador (nome da varivel).
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
leia ("%f%f%f",¬a1,¬a2,¬a3);
retorno (0);
fim
Vdeo
30
Assim, valor 3.5 ser armazenado na varivel nota1, o valor 7.8 em nota2
e o valor 8.4 em nota3.
Exemplo 2.14 Algoritmo que calcula a mdia aritmtica simples de trs notas com
mensagens indicando ao usurio quais dados fornecer.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
retorno (0);
fim
A seguir, v-se como seria a entrada das notas e a exibio da mdia aritmtica
simples aps seu clculo pelo computador.
Inicialmente mostrada a primeira mensagem Entre com a primeira
nota: e em seguida o programa fica aguardando at que o usurio fornea um nmero
(fracionrio ou inteiro) correspondente primeira nota do aluno, para ento prosseguir
com a instruo seguinte. De maneira semelhante acontece tambm com a leitura das
demais notas.
Memria (RAM)
31
Vdeo
Cada valor lido pelo comando leia e armazenado na memria. Para realizar o
clculo da mdia o computador acessa as posies de memria das notas e realiza a
soma das notas para ento dividir o resultado pela constante 3.0. O Resultado final
exibido logo depois. Para finalizar o programa pressione uma tecla.
Exerccio 2.3 Como podemos imprimir a mensagem Linha inicial, seguida de duas
linhas em branco e uma outra mensagem Linha final? possvel
realizar esta tarefa em um nico comando? D exemplos.
32
Exerccio 2.9 Em qual dos seguintes pares importante a ordem dos comandos?
Supor: x y z.
a) x = y; b) x = y; c) x = z; d) z = y;
y = z; z = x; x = y; x = y;
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
retorno (0);
fim
Exerccio 2.11 Escreva um algoritmo que leia um nmero inteiro positivo e exiba o
dobro do mesmo.
Exerccio 2.13 Escreva um algoritmo para ler uma temperatura dada na escala
Fahrenheit e exibir o equivalente em Celsius. (C = 5 (F 32))
9
Exerccio 2.14 Escreva um algoritmo para calcular e exibir a mdia ponderada de duas
notas dadas. (nota1 = peso 6 e nota2 = peso 4)
Exerccio 2.15 Escreva um algoritmo que leia duas variveis inteiras e troque o
contedo entre elas.
Exerccio 2.16 Escreva um algoritmo para calcular e exibir o valor de x y, sendo dados
a base (x) e o expoente (y).
33
ax2 + bx + c = 0
b2 4ac
Exerccio 2.18 - Qual o resultado das expresses aritmticas abaixo, sabendo-se que os
valores de X, Y e Z so, respectivamente, 1, 2 e 5 ?
a) Z resto Y / Y
b) X + Y + Z / 3
c) raiz( Z / Y + X * Y)
d) Z - abs (X potencia (Y,2))
a) abs (-4)
b) abs (5.2)
c) potencia (1.0,4)
d) potencia (10,2)
e) raiz (25)
f) raiz (9.0)
a b a && b a || b !a !b
TRUE TRUE
TRUE FALSE
FALSE TRUE
FALSE FALSE
Exerccio 2.22 - Qual o resultado das expresses lgicas abaixo, sabendo-se que os
valores de A e B so, respectivamente, TRUE e FALSE?
a) !A && B || A && !B
34
b) !(!(A || B) && (A || B))
c) A || B && !A || !B
d) (A || B) && (!A || !B)
Exerccio 2.24 - Faa um algoritmo que leia dois valores numricos inteiros para duas
variveis e que troque o contedo dessas variveis, visualizando o
valor das mesmas antes e depois da troca.
Exerccio 2.25 - Faa um algoritmo que leia dois nmeros reais e que calcule a soma,
produto e a mdia desses nmeros.
Exerccio 2.26 - Faa um algoritmo que determine o volume de uma esfera, sendo dado
o respectivo raio. (V = 4/3 x x r3) Repare que, em C, a diviso de 4
por 3 d um valor inteiro se no tomar medidas adequadas.
35
3 Comandos de controle de fluxo
Usada para executar comandos passo a passo, sabendo que todos eles sero
executados na ordem descrita, sem nenhum desvio. Uma seqncia ou bloco pode
possuir um ou vrios comandos, os quais devem ser delimitados pelos identificadores de
inicio e fim.
inicio
comando1;
...
comandon;
fim
Exemplo 3.1 Desenvolver um algoritmo para ler um nmero inteiro e escrever seu
sucessor e seu antecessor.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
suc = num + 1;
ant = num - 1;
36
imprima ("Antecessor = %d\n",ant);
retorno (0);
fim
Exemplo 3.2 Desenvolver um algoritmo para ler dois nmeros inteiros e escrever a
seguinte sada:
Dividendo: __
Divisor: __
Quociente: __
Resto: __
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
q = valor1 / valor2;
r = valor1 resto valor2;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
#incluir <math.h>
#definir PI 3.1415926
principal()
37
inicio
real angulo, rang;
imprima ("Entre com um ngulo em graus: ");
leia ("%f",&angulo);
retorno (0);
fim
3.2 Seleo
Sintaxe:
38
se (condicao)
inicio
comando ;
[ou sequencia1 ;]
fim
Fluxo
se
Sintaxe:
se (condicao)
inicio
comando ;
[ou sequencia1 ;]
fim
senao
inicio
comando ;
[ou sequencia2 ;]
fim
Exemplo 3.4 Desenvolver um algoritmo para ler um nmero inteiro e exibi-lo se for
positivo.
#incluir <stdio.h>
#incluir <conio.h>
39
principal ()
inicio
real n;
se (n > 0.0)
inicio
imprima ("%f eh positivo!\n",n);
fim
retorno (0);
fim
Fluxo
se
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
40
real n;
se (n > 0.0)
inicio
imprima ("%f eh maior que zero!\n",n);
fim
senao
inicio
imprima ("%f nao eh maior que zero!\n",n);
fim
retorno (0);
fim
Neste exemplo (ex. 3.5), a mensagem que ser exibida depender do resultado da
expresso lgica (n > 0.0). Se ela for verdadeira, ser executado o comando
imprima do bloco inicio e fim que se refere palavra se. Caso contrrio, ser
executado o comando imprima do bloco inicio e fim que se refere palavra
senao. Em nenhuma hiptese ser executado ambos os comandos imprima.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
real n;
41
imprima ("Entre com um numero: ");
leia ("%f",&n);
se (n > 0.0)
inicio
imprima ("%f eh maior que zero!\n",n);
fim
senao
inicio
se (n < 0.0)
inicio
imprima ("%f eh menor que zero!\n",n);
fim
senao
inicio
imprima ("%f eh igual a zero!\n",n);
fim
fim
retorno (0);
fim
Pode-se observar que diversas linhas deste algoritmo terminam sem o ponto-e-
vrgula, isto porque o ponto-e-vrgula s utilizado para separar comandos e/ou
estruturas.
Deve-se tomar cuidado quando da utilizao de ses aninhados, pois a clusula
senao sempre relacionada ao ltimo se. Se, dentro de algum algoritmo, necessitar-se
contornar este fato, pode-se faz-lo com uso dos delimitadores inicio e fim. Estes
tambm so utilizados em seqncias ou blocos.
Utilizada quando se deseja executar um entre vrios comandos (ou uma entre
vrias seqncias de comandos) dependendo do resultado de uma expresso. Mais de um
comando ou vrios comandos ou seqncias podem ser executados tambm, veja ainda
nesta seo.
A estrutura de seleo (deciso mltipla) chamada de escolha caso e em
linguagem C apresenta-se como comando de nome switch case, e obedece a seguinte
sintaxe.
Sintaxe:
escolha (expressao)
inicio
caso <constante1> : comando ;
comando ;
pare;
42
caso <constante2> : comando ;
comando ;
pare;
...
[padrao : comando ;
comando ;
pare ;]
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char op;
inteiro x,y;
imprima ("Digite o operador: ");
leia ("%c",&op);
imprima ("Entre com os operandos: ");
leia ("%d%d",&x,&y);
escolha (op)
inicio
caso + : imprima ("Soma = %d\n",x + y);
pare;
caso - : imprima ("Subtracao = %d\n",x - y);
43
pare;
caso * :
caso x :
caso X : imprima ("Produto = %d\n",x * y);
pare;
caso / : imprima ("Divisao = %d\n",x / y);
pare;
padrao : imprima ("Operador invalido!\n");
pare;
fim
retorno (0);
fim
Neste exemplo a mensagem que ser exibida, bem como a operao executada,
depender do contedo da varivel op. Se for igual a uma das constantes especificadas,
ser executado o comando imprima correspondente. Se nenhuma constante for igual
ao contedo de op, ser executado o imprima da clusula padrao.
Pode-se tambm escrever o mesmo programa anterior (ex. 3.7) sem utilizar a
estrutura escolha caso, apenas utilizando se's aninhados, como demonstra a
algoritmo seguinte.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char op;
inteiro x,y;
44
se (op == * || op == x || op == X)
inicio
imprima ("Produto = %d\n",x * y);
fim
senao
inicio
se (op == /)
inicio
imprima ("Divisao = %d\n",x / y);
fim
senao
inicio
imprima ("Operador invalido!\n");
fim
fim
fim
fim
retorno (0);
fim
45
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char digito;
escolha (digito)
inicio
caso 0 : imprima ("0");
caso 1 : imprima ("1");
caso 2 : imprima ("2");
caso 3 : imprima ("3");
caso 4 : imprima ("4");
caso 5 : imprima ("5");
caso 6 : imprima ("6");
caso 7 : imprima ("7");
caso 8 : imprima ("8");
caso 9 : imprima ("9");
pare;
fim
imprima ("\npressione qualquer tecla...");
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
escolha
caso :
pare;
caso :
caso :
pare;
46
Vdeo
Digite um caractere de 0 a 9
_4 <enter>
456789
pressione qualquer tecla...
Exerccio 3.1 Faa um algoritmo que leia um nmero inteiro e que determine o seu
mdulo sem usar nenhuma funo disponvel em C para essa
finalidade.
Exerccio 3.2 Faa um algoritmo que determine se um ano introduzido pelo usurio
ou no bissexto. Um ano bissexto se for mltiplo de 4 sem ser de 100
ou se for mltiplo de 400.
Exerccio 3.4 Escreva um algoritmo que leia um nmero inteiro e determine se ele
par ou mpar.
Exerccio 3.6 Escreva um algoritmo para ler trs nmeros inteiros distintos e
determinar o menor deles.
Exerccio 3.7 Faa um algoritmo que, dado as trs notas de um aluno, determine e
exiba a sua mdia final e o seu conceito, sabendo-se que:
47
Mdia Final Conceito
8,0 A
6,0 e < 8,0 B
< 6,0 C
Exerccio 3.8 Faa um algoritmo que leia a idade de uma pessoa. Para cada faixa de
idades escreva uma mensagem diferente, conforme indicado pela tabela
abaixo:
Exerccio 3.10 O Cricima Futebol Clube deseja aumentar o salrio de seus jogadores.
O reajuste deve obedecer a seguinte tabela:
48
b) O valor da diria determinado pela seguinte tabela:
49
imposto retido na fonte for positiva; caso contrrio, haver imposto a
restituir;
(i) a = b == c
(ii) se a == b
inicio
a = TRUE;
fim
senao
inicio
a = FALSE;
fim
...
se (L1)
inicio
imprima ('A')
fim
senao
inicio
se (L2)
inicio
se (L3)
inicio
imprima ('B')
fim
senao
inicio
imprima ('C');
imprima ('D');
fim
fim
senao
inicio
imprima ('E');
fim
fim
...
Agora, responda as seguintes questes:
50
3.5 Estruturas de repetio
Serve para efetuar um conjunto de aes repetidas vezes. Existem trs tipos
bsicos de repeties, sendo elas: enquanto, faca enquanto e para.
3.5.1 Enquanto
enquanto (expressao)
inicio
comando;
[ou seqncia;]
fim
enquanto
F V
51
O comando enquanto analisa a expressao e enquanto o seu resultado for
verdadeiro, o comando ou a seqncia de comandos executada. Esta estrutura
recomendada para um nmero de repeties desconhecidas, podendo repetir de
nenhuma vez at n vezes.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
enquanto (num != 0)
inicio
dobro = num * 2;
retorno (0);
fim
Uma outra maneira de fazer com que um conjunto de instrues seja executado
uma ou mais vezes, utilizar a estrutura faca enquanto, conhecido tambm como
repita at, em pseudocdigo. Sua forma geral mostrada a seguir.
Sintaxe:
faca
inicio
comando;
[ou seqncia;]
fim
enquanto (expressao) ;
52
enquanto.
A execuo da estrutura faca enquanto ocorre da seguinte forma: quando o
fluxo de execuo chega no incio da estrutura (faca), o comando ou seqncia de
comandos internos estrutura so executados. Quando o fluxo de execuo chega no
enquanto, a expressao avaliada. Se o resultado da avaliao for verdadeiro, a
execuo retorna ao faca e, novamente, os comandos ou seqncia de comandos so
executados. Porm se o resultado for falso, ento a execuo sair do ciclo (loop) e
passar para a primeira instruo imediatamente aps o enquanto. Os colchetes
[...] delimitam uma parte opcional da estrutura.
faca
enquanto
V
F
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
faca
53
inicio
imprima ("Digite um numero inteiro: ");
leia ("%d",&num);
dobro = num * 2;
fim
enquanto (num != 0);
retorno (0);
fim
3.5.3 Para
A estrutura para (fig. 3.6) executa uma seqncia ou um bloco, de uma ou mais
declaraes, um certo nmero de vezes. Em pseudocdigo, o comando para
corresponde estrutura de repetio para faa.
Sintaxe:
#incluir <stdio.h>
#incluir <conio.h>
54
principal ()
inicio
inteiro contador;
retorno (0);
fim
para inicializacao
teste
V
F
bloco
incremento
...
55
O incremento (ou decremento) pode tambm ser diferente de 1, como ilustra a
estrutura abaixo.
...
...
Exemplo 3.12 Criar um algoritmo que a cada nmero digitado pelo usurio seja
calculado o seu fatorial e exibido na tela o resultado.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro n, i, fatorial;
fatorial = 1;
56
Para se calcular o fatorial de um nmero, necessrio multiplic-lo pelos seus
predecessores at se chegar ao valor 1. Portanto, o fatorial de 5 5*4*3*2*1. Assim,
chega-se concluso de que uma estrutura para resolve o problema, visto que temos o
valor de inicializao e o ponto de parada (expresso na condio).
principal ()
inicio
inteiro base, expoente, resultado, i;
resultado = base;
se (expoente == 0)
inicio
resultado = 1;
fim
senao
inicio
se (base == 0)
inicio
resultado = 0;
fim
senao
inicio
para (i = 1; i < expoente; i++)
inicio
resultado = resultado * base;
fim
fim
fim
57
Montar a expresso fcil, mas em algoritmo necessrio mostrar todos os
passos para a mquina (computador), pois voc o est ensinando a fazer algo. Ento,
deve prever todas as situaes possveis. Por isso, testa-se a entrada do expoente 0 e da
base 0.
O trecho do cdigo acima poderia ser substitudo pelo trecho abaixo com a
seguinte construo:
inicializacao;
enquanto (condicao)
inicio
comando;
[ou seqncia;]
incremento;
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro contador;
retorno (0);
fim
A soluo a seguir, usando enquanto, equivalente ao exemplo acima com a
estrutura para.
#incluir <stdio.h>
#incluir <conio.h>
58
principal ()
inicio
inteiro contador;
contador = 1;
retorno (0);
fim
Exerccio 3.16 Faa um algoritmo para ver se um nmero primo ou no (um nmero
s primo se apenas for divisvel por 1 e por si prprio). Exemplo do
algoritmo ao ser executado:
Digite o raio: 3
A area 28.27
Digite o raio: 2.5
A area 19.63
Digite o raio: -2
Esse raio invlido
Digite o raio: 1
A area 3.14
Digite o raio: 0
A area 0.00
Ate logo.
59
Exerccio 3.18 Faa um algoritmo que escreve na tela uma tabela de converso de
graus Celcius para Fahrenheit. A tabela deve apresentar os graus
Celcius de 0 40 com intervalos de 2 em 2. Exemplo do algoritmo ao
ser executado:
Celcius Fahrenheit
0.0 32.0
2.0 35.6
4.0 39.2
6.0 42.8
... ...
40.0 104.0
Digite um numero: _9
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
9 x 10 = 90
Exerccio 3.20 Escreva um algoritmo que leia dois nmeros e exiba o maior deles.
Exerccio 3.21 Escreva um algoritmo que leia dois nmeros e exiba-os em ordem
crescente.
Exerccio 3.22 Faa um algoritmo que mostre todos os nmeros inteiros pares de 2
100.
Exerccio 3.24 Faa um algoritmo que leia um nmero N, some todos os nmeros
inteiros de 1 N, e mostre o resultado obtido.
Exerccio 3.25 Escreva um algoritmo que calcule o fatorial de um nmero inteiro lido,
sabendo-se que: N! = 1 x 2 x 3 x ... x N-1 x N e que
0! = 1.
Exerccio 3.26 Faa um algoritmo que leia 3 nmeros inteiros (N, X, Y) e mostre
todos os nmeros mltiplos de N entre X e Y.
60
Exerccio 3.27 Faa um algoritmo que leia dois valores inteiros (X e Y) e mostre
todos os nmeros primos entre X e Y.
Exerccio 3.29 Faa um algoritmo que leia a altura de um grupo de 20 pessoas, calcule
e exiba:
a maior altura do grupo;
a altura mdia;
o nmero de pessoas com altura superior 2
metros.
Exerccio 3.30 Em um frigorfico existem 90 bois. Cada boi traz preso em seu pescoo
um carto contendo seu nmero de identificao e seu peso. Faa um
algoritmo que escreva o nmero e o peso do boi mais gordo e do boi
mais magro (supondo que no haja empates).
Exerccio 3.31 Foi feita uma pesquisa de audincia de canal de TV em vrias casas de
uma certa cidade, num determinado dia. Para cada casa visitada
fornecido o nmero do canal (5, 7, 10 ou 12) e o nmero de pessoas
que estavam assistindo o canal naquela casa. Fazer um algoritmo que:
Leia um nmero indeterminado de dados, sendo que o flag
corresponde ao canal igual a 0 (zero);
61
acima de 5.000,00 0%
Exerccio 3.34 Uma certa firma fez uma pesquisa de mercado para saber se as pessoas
gostaram ou no de um novo produto lanado no mercado. Para isto,
forneceu o sexo do entrevistado (M-masculino ou F-feminino) e sua
resposta (S-sim ou N-no). Sabendo-se que foram entrevistadas 2.000
pessoas, fazer um algoritmo que calcule e escreva:
Exerccio 3.36 Faa um algoritmo que leia vrios cdigos do jogador (1 ou 2) que
ganhou o ponto em uma partida de pingue-pongue, e responda quem
ganha a partida. A partida chega ao final se um dos jogadores chega a
21 pontos e a diferena de pontos entre os jogadores maior ou igual
a dois. Caso contrrio, ganha aquele que, com mais de 21 pontos,
consiga colocar uma vantagem de dois pontos sobre o adversrio.
62
4 Modularizao
4.1 Funes
Sintaxe:
Comandos;
retorno (expressao);
fim
63
nenhum valor, sendo considerada de retorno vazio. Em algumas linguagens de
programao, tal como a linguagem Pascal este mtodo implementado na forma de
procedimentos.
O nome da funo dado pelo programador e precisa seguir as mesmas regras
utilizadas para nomear as variveis e as constantes.
Na lista de parmetros encontram-se as variveis que devem ser passadas a
funo no momento de sua chamada ou invocao. Esta lista apresenta-se da seguinte
maneira.
#incluir biblioteca
/* Declarao das bibliotecas utilizadas */
Comandos;
retorno (expressao);
fim
...
64
variavel = nome_da_funcao (variaveis) ;
/* Retorno de erro ou Ok */
fim /* Final do escopo / bloco principal */
Exemplo 4.1 - Criar um algoritmo com uma funo capaz de calcular o quadrado de um
nmero.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num,q;
q = quadrado (num);
Exemplo 4.2 - Tomando o exemplo anterior (ex. 4.1), crie um algoritmo que utilize uma
outra funo para calcular o cubo de um nmero.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
65
inteiro num,c;
c = cubo (num);
Exemplo 4.3 - Tomando os exemplos anteriores (ex. 4.1 e 4.2), crie um algoritmo que
utilize duas funes para calcular o cubo de um nmero. Se possvel
tambm calcule o quadrado no mesmo algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num,r;
r = quadrado (num);
imprima ("\nQuadrado do numero %d e = %d",num,r);
r = cubo (num);
imprima ("\nCubo do numero %d e = %d\n",num,r);
O comando retorno presente em cada funo a maneira que a funo tem para
devolver um valor ao algoritmo ou a outra funo que a tenha invocado. O comando
returno aparece nas funes da seguinte forma.
66
retorno(valor_de_retorno);
ou
retorno();
Suponha que uma funo est sendo executada. Quando se chega a uma
declarao retorno a funo encerrada imediatamente e, se o valor de retorno
informado, a funo devolve este valor. importante lembrar que o valor de retorno
fornecido tem que ser compatvel com o tipo de retorno declarado para a funo. Assim
como a varivel ou a expresso onde a funo est inserida deve ser capaz de armazenar
ou utilizar corretamente o valor recebido da funo.
Uma funo pode ter mais de uma declarao retorno. Uma vez que a funo
terminada quando o algoritmo chega primeira declarao retorno, podem-se ter
vrias declaraes de retorno em uma mesma funo sem no entanto comprometer
seu funcionamento lgico.
A seguir outro exemplo de uso do comando retorno.
Exemplo 4.4 - Criar um algoritmo que utilize uma funo para determinar se um nmero
fornecido pelo usurio par ou mpar.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num;
se (ePar(num))
inicio
imprima ("\nNumero %d e Par",num);
fim
senao
inicio
imprima ("\nNumero %d e Impar",num);
67
fim
imprima ("\npressione qualquer tecla...");
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
Exemplo 4.5 - Criar um algoritmo que utilize funes para calcular a seguinte seqncia.
2 3 n
S(x,n) = x/1! + x /2! + x /3! + ... + x /n!
#incluir <stdio.h>
#incluir <conio.h>
retorno (resultado);
fim
se (expo == 1)
inicio
retorno (base);
fim
retorno (resultado);
fim
68
real serie (real x, inteiro n)
inicio
inteiro i;
real resultado = 0.0;
retorno (resultado);
fim
principal ()
inicio
real x;
inteiro termos;
Exerccio 4.2 Faa um algoritmo que leia um nmero inteiro e crie uma funo que
devolva o seu mdulo sem usar nenhuma funo disponvel em C para
essa finalidade.
Exerccio 4.3 Faa um algoritmo que possua uma funo que determine se um ano
introduzido pelo usurio ou no bissexto. Um ano bissexto se for
mltiplo de 4 sem ser de 100 ou se for mltiplo de 400. A funo deve
retornar 1 se o ano bissexto e 0 (zero) caso contrrio.
Exerccio 4.4 - Criar um algoritmo com uma funo que verifica se um nmero
fornecido pelo usurio mpar.
Exerccio 4.5 - Desenvolver um algoritmo com uma funo que calcule a Hipotenusa
de um tringulo retngulo a partir da leitura de seus Catetos na parte
principal do algoritmo. Estes sero passados a funo por meio de
parmetros.
69
Exerccio 4.6 - Faa um algoritmo com uma funo que devolver 1 se o nmero
passado por parmetro for primo e 0 (zero) se no for.
Exerccio 4.7 Faa um algoritmo com uma funo que calcule o salrio semanal de
um funcionrio. Deve ser lido o nmero total de horas (valor inteiro)
de trabalho desse funcionrio durante a semana, o custo de uma hora
normal e o custo de uma hora extraordinria. Para calcular o salrio,
deve-se considerar como horas normais as 40 primeiras e como horas
extraordinrias (se existirem) as restantes horas de trabalho.
Exerccio 4.9 Escreva um algoritmo para ler trs nmeros inteiros distintos e com
uma funo para determinar o menor deles.
Exerccio 4.10 Faa um algoritmo que, dado as trs notas de um aluno, determine e
exiba a sua mdia final (uma funo) e o seu conceito (outra funo),
sabendo-se que: a mdia final calculada pela mdia aritmtica das 3
notas; o conceito determinado de com base na tabela abaixo:
Exerccio 4.11 - Desenvolver um algoritmo que leia dois valores e chame uma sub-
rotina (funo) que receba estas duas variveis e troque o seu
contedo, ou seja, esta rotina chamada passando duas variveis A e
B por exemplo, e aps a execuo da rotina A conter o valor de B e
B conter o valor de A. Lembre-se de utilizar a passagem de
parmetros por referncia.
Exerccio 4.12 - Crie uma funo fatorial, como dado em aula anterior. Testar essa
funo fazendo um algoritmo que calcule o fatorial de um nmero
fornecido pelo usurio.
Exerccio 4.13 - Utilizando a funo criada no exemplo anterior (ex. 4.4) faa um
programa que ir solicitar nmeros inteiros ao usurio at que este
introduza um nmero negativo. Para cada valor introduzido, o
programa deve indicar se o nmero par ou mpar.
Exerccio 4.14 - Faa uma funo que devolva nmeros aleatrios inteiros. A funo
70
dever receber um parmetro n que indique a gama de valores
pretendidos e, a cada vez que for chamada, devolva um nmero
aleatrio inteiro no intervalo [0 .. n-1].
Por exemplo, se a funo for chamada com o parmetro 6, dever devolver um nmero
aleatrio compreendido entre 0 e 5 (inclusive).
Exerccio 4.15 - Utilizar a funo que acabastes de criar no exerccio anterior para fazer
um programa que simule atirar uma moeda ao ar 1000 vezes. O
programa deve contar quantas vezes saram "cara" e quantas vezes
saram "coroa".
Exerccio 4.16 - Faa um algoritmo que gere 1000 nmeros reais aleatrios no intervalo
[0,1]. O programa deve contar quantos nmeros caem no intervalo
[0.0, 0.5], quantos caem no intervalo [0.5, 0.8] e quantos
caem no intervalo [0.8, 1.0].
Sintaxe:
71
vazio nome_da_funcao ([lista_de_parametros])
inicio
Comandos;
fim
nome_da_funcao (variaveis) ;
#incluir biblioteca
/* Declarao das bibliotecas utilizadas */
Comandos;
fim
...
72
principal( ) /* Funo principal do algoritmo */
inicio /* Inicio do escopo / bloco principal */
/* Declarao de variveis locais */
/* Comandos */
nome_da_funcao (variaveis) ;
/* Retorno de erro ou Ok */
Exemplo 4.6 - Faa um algoritmo que possua uma funo para mostrar mensagem
Aprendendo a programar com VAZIO na tela.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
mensagem();
V-se acima uma funo sem retorno e sem parmetros. Para que uma funo
retorne algo, deve-se usar a comando retorno, bem como especificar o seu tipo de
retorno. Para funes sem retorno, basta declarar a funo como tendo tipo de retorno
vazio.
Deve-se lembrar que a funo principal( ) uma funo e como tal deve-
se trat-la. O C Quietly e por conseqncia o compilador C assume que a funo
principal( ) deve retornar um valor inteiro. Isto d ao sistema operacional um
valor de retorno da funo principal( ). Deve-se lembrar da seguinte conveno:
se o algoritmo retornar 0 (zero), significa que ele terminou normalmente, e, se o
algoritmo retornar um valor diferente de zero, significa que o algoritmo teve um trmino
anormal. H ainda a possibilidade de a funo principal( ) no devolver nada ao
SO (Sistema Operacional) se este for o seu desejo, veja como proceder a seguir.
vazio principal(vazio)
73
inicio
/* Comandos */
fim
ou
principal(vazio)
inicio
/* Comandos */
retorno (0);
fim
Exerccio 4.17 - Criar uma funo sem parmetros que exiba na tela um menu com as
seguintes opes: Incluir, Remover, Alterar e Sair. Cada opo deve
estar em uma linha separada.
Exerccio 4.18 - Criar uma funo sem parmetros que desenhe uma moldura na tela do
microcomputador. Faa no algoritmo principal uma chamada a esta
funo, desenhando a moldura e aps escrevendo "Hello World"
da tela. Para desenhar a moldura use os caracteres especiais da tabela
ASCII estendida.
Exemplos:
Pressione a tecla ALT e ao mesmo tempo um dos seguintes nmeros
no teclado numrico - ALT + 200, ALT + 201, ALT + 205, ALT +
186, ALT + 187, ALT + 188.
Exerccio 4.20 - Altere o algoritmo anterior de maneira que quando o usurio apertar
uma tecla (tecla = getch()), seja escrito "Bye-Bye World
na tela. O programa deve terminar automaticamente aps um atraso
(sleep ou delay) de 5 segundos.
74
5 Estruturas e classes
5.1 Estruturas
estrutura nome
inicio
/* declaracao de componentes */
...
75
5.1.1 Definindo e declarando estruturas
#incluir <stdio.h>
#incluir <conio.h>
principal ( )
inicio
/* definio da estrutura */
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
76
principal()
inicio
estrutura coord
inicio
inteiro x;
inteiro y;
fim primeira, segunda;
O exemplo (ex. 5.2) define a estrutura chamada coord e declara duas estruturas,
primeira e segunda , do tipo coord. primeira e segunda so cada uma, uma
instncia do tipo coord. primeira contm dois membros inteiros chamados, x e y,
assim como segunda.
Este mtodo de declarao de estruturas combina a declarao com a definio.
O segundo mtodo consiste em declarar as variveis de estruturas em uma localizao
diferente no cdigo fonte da definio. O exemplo (ex. 5.3) a seguir tambm declara
duas instncias do tipo coord.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
/* definio da estrutura */
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
77
5.1.2 Acessando os membros de estruturas
Cada membro da estrutura pode ser utilizado como outras variveis do mesmo
tipo. Os membros da estrutura so acessados atravs do operador (.), tambm chamado
de operador ponto, entre o nome da varivel da estrutura e o nome de cada membro.
Para atribuir a varivel primeira as coordenadas x = 2 e y = 3, deve-se escrever o
cdigo a seguir.
primeira.x = 2;
primeira.y = 3;
segunda = primeira;
equivalente a
segunda.x = primeira.x;
segunda.y = primeira.y;
Exemplo 5.4 Criando as estruturas data e hora e definindo as variveis para sua
utilizao no algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
estrutura data
inicio
inteiro mes;
inteiro dia;
inteiro ano;
fim data_atual ;
78
estrutura hora
inicio
inteiro h;
inteiro min;
inteiro seg;
fim hora_do_nascimento = { 22, 20, 0 } ;
Exemplo 5.5 Criando as estruturas mais complexas e definindo as variveis para sua
utilizao no algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal( )
inicio
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim ;
79
estrutura retangulo caixa ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim caixa ;
caixa.infEsquerdo.x
caixa.infEsquerdo.x = 5;
caixa.infEsquerdo.y = 10;
caixa.supDireito.x = 50;
caixa.supDireito.y = 30
1
Considere um plano e duas retas perpendiculares, sendo uma delas horizontal e a outra vertical. A
horizontal ser denominada Eixo das Abscissas (eixo OX) e a Vertical ser denominada Eixo das
Ordenadas (eixo OY). Os pares ordenados de pontos do plano so indicados na forma P = (x,y) onde x
ser a abscissa do ponto P e y a ordenada do ponto P.
80
um retngulo a partir da solicitao de coordenadas ao usurio.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro compto, largura;
real area;
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim ;
81
5.1.4 Exerccios propostos
Exerccio 5.1 Faa um algoritmo que calcule a hipotenusa entre dois pontos a partir
das coordenadas da diagonal de tringulo retngulo.
Exerccio 5.2 Faa um algoritmo que calcule a rea de tringulo retngulo a partir
das coordenadas da diagonal de dois pontos.
5.2 Classes
principal(){
Algoritmo
dados
}
82
o algoritmo consiste de uma seqncia (fig. 5.3) de chamadas s funes e que facilita a
reutilizao do cdigo inclusive em outros algoritmos e a localizao e identificao de
erros em cada mdulo em separado. Cada mdulo pode possuir seus prprios dados,
tambm.
principal () {
dados
}
Algoritmo
Obejto1 Obejto3
dados1 dados3
Algoritmo
Obejto2
dados2
83
No C Quietly com a opo do compilador C/C++ (marcada) possvel
definio e declarao de classes. Uma instncia de uma classe chamada de objeto.
Para definir uma nova classe utiliza-se a palavra reservada classe seguida de um nome
(mesmas regras para nomes de variveis e constantes simblicas). inicio e fim
delimitam os dados (atributos) e funes (mtodos) da classe. publico, privado e
protegido caracterizam o tipo de acesso externo aos atributos e mtodos da
classe.Sintaxe a seguir.
classe nome_da_classe
inicio
/* declaraes de variveis e mtodos privados */;
publico:
/* declaraes de variveis e mtodos publicos */;
fim
Uma classe se parece com uma estrutura em termos de atributos ou dados, assim
como uma estrutura construda para agrupar algumas variveis em um mesmo local de
fcil acesso, tambm as classes permitem a abstrao de dados, por meio de variveis de
diversos tipos.
Em um programa que utiliza uma interface controladora de um motor eltrico
provavelmente definiria-se uma classe chamada motor. Os atributos desta classe seriam:
temperatura, velocidade, tenso_aplicada. Estes provavelmente seriam
representados na classe por tipos como real ou inteiro. As funes membro ou
mtodos desta classe seriam funes para alterar a velocidade, ler a temperatura, etc.
Outro programa de contas a pagar e contas a receber definiria-se a classe
conta_bancaria. Os atributos seriam: saldo, limite_de_saque,
taxa_de_juros, etc, representados como variveis do tipo real. Dentre as funes
membros desta classe estariam s funes para: efetuar saques, depsitos e computar
juros. Estes so alguns exemplos de abstraes de situaes encontradas no mundo real
por meio da definio classes para represent-los.
Objetos so instncias de uma classe. Quando um objeto criado ele precisa ser
inicializado, ou seja, para uma nica classe. A classe Estudante de graduao
pode ter vrios objetos em um mesmo algoritmo. Estudante de graduao Joo,
Matrcula 567418, Curso Engenharia Mecnica; Estudante de graduao
Mrcia, Matrcula 982349, Curso Engenharia Eltrica... A classe representa
somente o molde para a criao dos objetos, estes sim contm a informao.
#incluir <iostream.h>
classe Ponto
inicio
inteiro x, y;
publico:
84
vazio setaX (inteiro vx);
vazio setaY (inteiro vy);
inteiro obtemX ( );
inteiro obtemY ( );
fim;
principal ( )
inicio
retorno (0);
fim
Comandos;
retorno (expressao);
fim
Exemplo 5.8 Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe.
#incluir <iostream.h>
#incluir <conio.h>
classe Ponto
inicio
inteiro x, y;
publico:
vazio setaX (inteiro vx);
vazio setaY (inteiro vy);
inteiro obtemX ( ) inicio retorno (x); fim
inteiro obtemY ( ) inicio retorno (y); fim
fim;
vazio Ponto::setaX (inteiro vx)
inicio
x = vx;
fim
85
vazio Ponto::setaY (inteiro vy)
inicio
y = vy;
fim
principal ()
inicio
retorno (0);
fim
A diferena que como a funo membro est definida na classe, ela ganha
acesso direto aos dados membros ou atributos, sem precisar usar o "ponto", exemplo:
um_objeto.dadomembro
Ponto p; /* instanciacao */
p.x = 2; /* Erro! */
Exemplo 5.9 Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retngulo.
#incluir <iostream.h>
#incluir <conio.h>
classe Ponto
86
inicio
privado:
inteiro x;
inteiro y;
publico:
vazio setaX (inteiro vx) inicio x = vx; fim;
vazio setaY (inteiro vy) inicio y = vy; fim;
vazio coordXY (inteiro vx, inteiro vy);
inteiro obtemX( ) inicio retorno (x); fim
inteiro obtemY( ) inicio retorno (y); fim
vazio mostraXY ( );
fim;
vazio Ponto::mostraXY ( )
inicio
csaida << "X = " << x <<" , Y: " << y << "\n";
fim
principal ()
inicio
p1.setaX(2);
p1.setaY(3);
p2.coordXY (10,12);
p1.mostraXY();
p2.mostraXY();
getch();
retorno(0);
fim
Exemplo 5.10 Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retngulo e calcule sua
rea.
#incluir <iostream.h>
#incluir <conio.h>
classe Ponto
inicio
privado:
inteiro x;
87
inteiro y;
publico:
Ponto (inteiro vx, inteiro vy); /* construtor */
inteiro obtemX( ) inicio retorno (x); fim
inteiro obtemY( ) inicio retorno (y); fim
vazio mostraXY ( );
privado:
vazio setaX (inteiro vx) inicio x = vx; fim
vazio setaY (inteiro vy) inicio y = vy; fim
fim;
vazio Ponto::mostraXY ( )
inicio
csaida <<"X = "<< obtemX()<<",Y: "<<obtemY()<<"\n";
fim
principal()
inicio
inteiro area, comprimento, largura;
getch();
retorno(0);
fim
Exerccio 5.3 Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retngulo e a medida da
diagonal do mesmo a partir da origem (0,0).
Exerccio 5.4 Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retngulo e a medida da
diagonal do mesmo.
88
Exerccio 5.5 Uma representao para nmeros racionais (numerador, denominador)
que possua as operaes aritmticas bsicas.
89
6 Tipos de dados estruturados
6.1 Vetores
Sintaxe:
nome_do_vetor [indice] ;
Exemplo 6.1 - Criar um algoritmo que armazene nmeros inteiros em dois vetores com
trs elementos cada. Gerar e imprimir o vetor soma.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro vetor1[3], vetor2[3], vetorSoma[3];
90
/* Entrada de elementos do vetor2 */
retorno (0);
fim
Exemplo 6.2 - Criar um algoritmo que armazene nmeros inteiros em dois vetores com
dez elementos cada. Gerar e imprimir o vetor soma.
#incluir <stdio.h>
#incluir <conio.h>
#definir MAX 10
principal()
inicio
inteiro vet1[MAX], vet2[MAX];
inteiro vetSoma[MAX];
inteiro i;
91
leia ("%d",&vet2[i]);
fim
Exerccio 6.1 Faa um algoritmo que leia N (mximo 50) e uma lista de N nmeros e
mostre a soma de todos os nmeros da lista.
Exerccio 6.2 Escreva um algoritmo que leia um conjunto de 100 nmeros inteiros
positivos e determine o maior deles.
Exerccio 6.3 Escreva um algoritmo que leia um nmero inteiro N (mximo 500) e
uma lista de N nmeros inteiros positivos e determine o maior nmero
da lista.
Exerccio 6.5 Faa um algoritmo que leia uma lista de nmeros inteiros positivos
terminada pelo nmero 0 (zero) ou no mximo 1000 nmeros lidos.
Ao final, o algoritmo deve mostrar a mdia aritmtica de todos os
nmeros lidos (excluindo o zero).
Exerccio 6.6 Faa um algoritmo que leia uma lista (mximo 50) de letras terminada
pela letra z. Ao final, o algoritmo deve mostrar a quantidade lida de
cada vogal.
Exerccio 6.7 Faa um algoritmo que crie um vetor de inteiros de 100 posies, leia
os valores deste vetor e exiba o vetor na tela de trs para frente.
92
Exerccio 6.9 Faa um algoritmo que leia dois vetores de nmeros compostos por 5
elementos que so fornecidos de maneira ordenada (nmeros em
ordem crescente). Crie um terceiro vetor que a unio dos dois
primeiros vetores, sendo que este novo vetor de 10 elementos tambm
deve ser um vetor onde os seus elementos esto ordenados. Exiba a
soma total dos elementos contidos nos trs vetores.
Isto declara um vetor de caracteres (uma string) com nmero de posies igual a
TAMANHO. Como mostrado anteriormente necessrio reservar um caractere para ser o
terminador nulo, o que determina declarar o comprimento da varivel string como sendo,
no mnimo, um caractere a mais do que a maior cadeia de caracteres que se deseja
armazenar.
Ao declarar uma varivel chamada nome de 13 posies por meio de um vetor
de caracteres e inicializ-la com a palavra "Algoritmo", o programador utiliza a
seguinte sintaxe:
Memria (RAM)
A l g o r i t m o \0
93
programador realizar esta tarefa. Portanto as nicas clulas de memria que so
inicializadas so as que contm os caracteres A, l, g, o, r, i,
t, m, o e \0.
Para ler uma string fornecida pelo usurio pode-se utilizar a funo leia( ).
Um exemplo do uso desta funo apresentado logo a seguir. A funo leia( )
coloca o terminador nulo no final do texto da string, quando o usurio pressiona a tecla
<enter>.
Exemplo 6.3 - Criar um algoritmo que leia o primeiro nome e o ltimo sobrenome de um
aluno. Logo aps escrev-lo em ordem de: sobrenome, nome.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char nome[15],
sobrenome[15];
imprima("\nObrigado!\n");
imprima("Sr(a): %s, %s\n",&sobrenome, &nome);
nome [3] = a;
nome [6] = s;
94
Exemplo 6.4 - Criar um algoritmo com uma varivel chamada nome que contenha
inicialmente a palavra "Algoritmo" e em seguida altere o contedo da
mesma para "Algarismo", utilize o acesso a cada caractere (ndice).
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
char nome[15] = "Algoritmo";
nome [3] = a;
nome [6] = s;
95
o nmero inteiro 0). Veja o algoritmo (ex. 5.5) a seguir que serve para igualar duas
cadeias de caracteres (isto , copia os caracteres de uma string para o vetor da outra).
Exemplo 6.5 - Criar um algoritmo para copiar uma cadeia de caracteres em uma outra.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro i;
char nome[10], copia[10];
para (i = 0;nome[i];i++)
inicio
copia[i] = nome[i];
fim
copia[i] = \0;
Uma outra funo para a leitura de uma cadeia de caracteres, bem como uma
srie de funes que manipulam seqncias de caracteres ou strings, so apresentadas a
seguir.
leias()
leias ( nome_da_varivel_string ) ;
96
Exemplo 6.6 - Criar um algoritmo para copiar uma cadeia de caracteres em uma outra,
usando leias() para leitura da seqncia de caracteres.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro i;
char nome[40], copia[40];
para (i = 0;nome[i];i++)
inicio
copia[i] = nome[i];
fim
copia[i] = \0;
imprima("Esta e uma copia: %s\n",copia);
strcopia()
Exemplo 6.7 - Criar um algoritmo para copiar uma cadeia de caracteres em uma outra,
usando strcopia().
#incluir <stdio.h>
#incluir <conio.h>
97
principal()
inicio
char nome[40], copia[40], mensagem[20];
imprima("\n%s: %s\n",mensagem,copia);
strconcat()
Exemplo 6.8 - Criar um algoritmo que leia um nome e um sobrenome, logo a seguir unir
uma cadeia de caracteres a outra usando strconcat() e uma nova
varivel para armazen-la.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
char nome[15],
sobrenome[15],
nomecompleto[30] = "",
mensagem[20];
strconcat(nomecompleto, nome);
/* acrescenta nome em nomecompleto */
strconcat(nomecompleto, sobrenome);
/* acrescenta sobrenome em nomecompleto */
98
strcopia (mensagem, "Obrigado Sr(a)");
/* copia "Obrigado Sr(a)" em mensagem */
imprima("\n%s: %s\n",mensagem,nomecompleto);
strtam()
strtam ( string ) ;
Exemplo 6.9 - Criar um algoritmo que leia um nome e um sobrenome, una as cadeia de
caracteres usando strconcat() em uma nova varivel e encontre a
quantidade de caracteres (tamanho) esta varivel possui usando a funo
strtam().
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro tamanho;
char nome[15],
sobrenome[15],
nomecompleto[30] = "";
strconcat(nomecompleto, nome);
/* acrescenta nome em nomecompleto */
strconcat(nomecompleto, sobrenome);
/* acrescenta sobrenome em nomecompleto */
tamanho = strtam(nomecompleto);
99
retorno(0);
fim
strcomp()
Exemplo 6.10 - Criar um algoritmo que compare duas strings e mostre a mensagem
So Iguais ou So diferentes dependendo da condio da funo
strtam().
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
char str1[15], str2[15];
se (strcomp(str1, str2))
inicio
imprima("\nSao diferentes\n");
fim
senao
inicio
imprima("\nSao iguais\n");
fim
Exerccio 6.10 - Criar um algoritmo que leia um nome e um sobrenome, una as cadeia
de caracteres usando strconcat() em uma nova varivel,
certifique-se que o nome e sobrenome esteja separado corretamente
por espaos em branco. O algoritmo deve verificar a existncia do
espao em branco e caso este no esteja presente, deve ser acrescido
100
ao nome antes de exibir o nome completo.
Exerccio 6.11 - Faa um algoritmo 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
algoritmo.
Exerccio 6.12 - Crie um algoritmo que mostre o tamanho de cada varivel, inclindo a
varivel que armazena todas as palavras do exerccio anterior.
6.3 Matrizes
Sintaxe:
101
preenchendo-as com valores seqncias de 1 at 50.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro matriz[10][5];
inteiro i,j,valor = 1;
Exemplo 6.12 - Criar um algoritmo que leia os elementos de uma matriz inteira 6x6 e
escreva os elementos da diagonal principal.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro matriz[6][6];
inteiro i,j;
102
imprima ("\nM[%d,%d] = %d",i,i,matriz[i][i]);
fim
Sintaxe:
Pode ento surgir pergunta: como acessar cada string individual? Simples.
Utilizando apenas o primeiro ndice. Assim, para acessar uma determinada string faa:
nome_da_variavel [indice];
Exemplo 6.13 - Criar um algoritmo que leia uma lista de 5 nomes de alunos. Aps a
leitura apresent-lo em ordem inversa entrada.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
char nome[5][50];
inteiro i;
103
fim
Sintaxe:
104
string str ter o tamanho 39. Veja que o artifcio para realizar a inicializao sem
especificar o tamanho no especificar o tamanho.
Exerccio 6.14 Faa um algoritmo que crie uma matriz de inteiros de 5 linhas por 10
colunas. Leia os valores desta matriz linha aps linha e exiba a matriz
na tela coluna por coluna.
Exerccio 6.15 Faa um algoritmo que crie uma matriz 3x3x3 onde cada elemento da
matriz seja igual soma dos seus ndices. Obtenha a soma de todos
elementos da matriz, soma dos elementos cujos valores so pares e a
soma dos elementos cujos valores so mpares.
Exerccio 6.16 Faa um algoritmo que leia trs vetores independentes compostos por
5 nmeros reais que so fornecidos pelo usurio. Crie uma matriz que
rena estes trs vetores em uma nica estrutura. Exibir na tela o
contedo da matriz. Encontre o maior valor contido nesta matriz.
105
7 Mini Manual do C Quietly
106
Figura 7.2 Novo cdigo-fonte em linguagem C.
107
Figura 7.3 Compilando um cdigo-fonte.
108
Figura 7.5 Executando o programa.
109
Figura 7.7 Inserindo novas palavras-chave.
110
Bibliografia
111