Professional Documents
Culture Documents
EXERCCIOS DE ALGORITMOS
Parte I
Santo Andr
2007
SUMRIO
1. PROBLEMAS ALGORTMICOS .................................................................................. 4
1.1.
1.2.
1.3.
1.4.
1.5.
2. CONCEITOS FUNDAMENTAIS................................................................................. 11
2.1. ORGANIZAO DOS COMPUTADORES ................................................................................................ 11
2.2. VARIVEIS ........................................................................................................................................ 12
2.2.1.
Tipo Inteiro............................................................................................................................... 12
2.2.2.
Tipo Real .................................................................................................................................. 12
2.2.3.
Tipo Caractere .......................................................................................................................... 12
2.2.4.
Tipo String................................................................................................................................ 14
2.2.5.
Tipo Data .................................................................................................................................. 14
2.2.6.
Tipo Booleano .......................................................................................................................... 14
2.3. REGRAS PARA IDENTIFICADORES ....................................................................................................... 14
2.4. EXPRESSES E HIERARQUIA DE OPERADORES ................................................................................... 14
2.5. FUNES PR-DEFINIDAS .................................................................................................................. 15
TERMMETRO ................................................................................................................................... 16
REA DO CRCULO ............................................................................................................................ 17
CRONMETRO ................................................................................................................................... 18
RATEIO .............................................................................................................................................. 20
ERRO COMUM (PARA INICIANTES) ..................................................................................................... 21
PROBLEMAS PROPOSTOS ................................................................................................................... 21
5.13.
5.14.
5.15.
5.16.
REFERNCIAS E BIBLIOGRAFIA................................................................................... 84
1.
PROBLEMAS ALGORTMICOS
1.1.
Baixa produtividade
Uma estria que ilustra o que so os algoritmos e como eles podem ser mais, ou
menos, eficientes a de um pintor que foi contratado para pintar uma faixa contnua em
uma estrada. Passados alguns dias, o supervisor chama o pintor e diz que a produtividade
dela tem diminudo muito, pois no 1 dia ela pintou 120 metros de faixa, no 2 pintou 60,
no 3, 45 e foi sempre diminuindo. O pintor respondeu:
Eu no estou trabalhando menos. A lata de tinta que est cada vez mais longe.
Moral da estria: No basta apenas funcionar. Os algoritmos tm de ser eficientes.
1.2.
Adivinhao
e assim por diante. Quando a pessoa responder sim, o mgico chegou na soluo.
Outro mgico utiliza a seguinte estratgia: A pessoa deve responder se o nmero
falado pelo mgico o nmero pensado ou se menor ou maior que o nmero pensado.
512
256
128
64
32
48
40
44
46
47 (nmero pensado)
1.3.
Num conjunto de 9 moedas, uma mais pesada que as demais. Usando uma balana
1
de 2 pratos , identificar a moeda mais pesada.
Uma estratgia dividir as moedas em 3 conjuntos de 3 moedas, colocar um
conjunto em cada prato e deixar um conjunto de fora:
1a Pesagem
Se houver equilbrio, a mais pesada estar entre
as que esto fora. Seno, estar no prato mais
baixo.
2a Pesagem
Do conjunto que contm a mais pesada, colocar
uma em cada prato. Se houver equilbrio, a que
ficou fora a mais pesada, seno, a mais pesada
ser aquela do prato mais baixo.
Trata-se de uma balana analgica, que no mostra o peso, como numa balana digital, mas se
uma coisa tem o mesmo peso que outra.
2 estratgia
1 Pesagem
2 Pesagem
3 Pesagem
4 Pesagem
5 Pesagem
1.4.
Caixa eletrnico
1.5.
Problemas propostos
a)
Ligao telefnica
Moeda diferente
Num grupo de oito moedas, uma delas diferente (mais leve ou mais pesada).
Usando uma balana de dois pratos, escreva um procedimento para descobrir qual.
c)
Moedas falsas
Travesia 1 (Canibais)
Trs maridos, com suas respectivas esposas, querem atravessar um rio. Acontece
que, no barco s cabem duas pessoas e os 3 maridos so muito ciumentos e no permitem
que sua esposa fique numa das margens com outro homem, sem que ele tambm esteja
presente. Como pode ser feita a travessia? (Barbosa, 1999).
f)
Problema do vinho
Existem trs jarras com capacidade para exatamente 8, 5 e 3 litros. A primeira jarra
est cheia de vinho. Como fazer para repartir esse contedo, em partes iguais, nas duas
jarras maiores. No existem graduaes nas jarras, nem permitido faze-las (Barbosa,
1999).
g)
No jogo da velha, quem comea pelo centro ganha com certeza, desde que o
adversrio responda com uma casa lateral. D a receita para ganhar (Barbosa, 1999).
10
h)
Torre de Hanoi
(ENADE Computao 2005) No famoso jogo da Torre de Hani, dada uma torre
com discos de raios diferentes, empilhados por tamanho decrescente em um dos trs pinos
dados, como ilustra a figura abaixo. O objetivo do jogo transportar-se toda a torre para
um dos outros pinos, de acordo com as seguintes regras: apenas um disco pode ser
deslocado por vez, e, em todo instante, todos os discos precisam estar em um dos trs
pinos; alm disso, em nenhum momento, um disco pode ser colocado sobre um disco de
raio menor que o dele; claro que o terceiro pino pode ser usado como local temporrio
para os discos.
Imaginando que se tenha uma situao em que a torre inicial tenha um conjunto de
5 discos, qual o nmero mnimo de movimentaes de discos que devero ser realizadas
para se atingir o objetivo do jogo?
A 25
B 28
C 31
D 34
E 38
11
2.
CONCEITOS FUNDAMENTAIS
Os computadores sabem,
desde pequenos, que
depois de executar uma
instruo, devem executar
a prxima.
2.1.
Uma mquina que queira ser chamada de computador deve conter os componentes
bsicos mostrados no diagrama a seguir:
CPU
Unidade de Controle
Entrada
(Input)
Unidade Lgica
Unidade Aritmtica
Memria
A B C
|5| |3| |8|
Soma
CA+B
Comando, instruo
Nome da Operao,
procedimento, mtodo.
Sada
(Output)
12
2.2.
Variveis
Segundo Sebesta (2000, p. 161), uma varivel pode ser caracterizada como um
sxtuplo de atributos: nome, endereo, valor, tipo, tempo de vida e escopo.
O tipo de uma varivel determina a faixa de valores que ela pode ter e o conjunto
de operaes definidas para os valores do tipo (SEBESTA, 2000, p.163).
2.2.1. Tipo Inteiro
utilizado para armazenar valores entre 32.768 e 32.767 (215 1), sem parte
decimal, usando 2 bytes, com as seguintes operaes possveis:
Operao
Adio
Subtrao
Multiplicao
Diviso inteira
Smbolo
+
*
\
quociente
mod resto
Exemplo
7+2=9
72=5
7 * 2 = 14
7\2=3
7 mod 2 = 1
13
Decimal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ASCII
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
Tabela ASCII
Decimal ASCII Decimal
32
Espao 64
33
!
65
34
66
35
#
67
36
$
68
37
%
69
38
&
70
39
71
40
(
72
41
)
73
42
*
74
43
+
75
44
,
76
45
77
46
.
78
47
/
79
48
0
80
49
1
81
50
2
82
51
3
83
52
4
84
53
5
85
54
6
86
55
7
87
56
8
88
57
9
89
58
:
90
59
;
91
60
<
92
61
=
93
62
>
94
63
?
95
ASCII
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
Decimal
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
ASCII
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
Em sua verso estendida, com 8 bits, o cdigo ASCII representa tambm caracteres
especiais, como os acentuados, em algumas lnguas.
Decimal
128
130
131
ASCII
Decimal
132
133
135
ASCII
Decimal
136
160
162
ASCII
Decimal
163
166
167
ASCII
14
2.3.
2.4.
15
* /
\
Mod
+ & +
Relacionais
Igual
Diferente
Maior
Menor
Maior ou igual
Menor ou igual
=
<>
>
<
>=
<=
Lgicos
No
E
OU
OU Exclusivo
NOT
AND
OR
XOR
Codificao
b 4ac
1+N
2
b^24*a*c
X=
2.5.
(1 + N ) / 2
X1 = ( b + Delta ^ 0.5 ) / ( 2 * a )
X2 = ( b Delta ^ (1/2)) / ( 2 * a )
b .
2a
Funes pr-definidas
O conceito de funo, em computao, o mesmo que em matemtica:
y = f( x)
Entrada (parmetro passado para a funo)
Processamento
Sada
Funo
Descrio
Exemplo (retorno da
funo)
int (Expr.Numrica) Parte inteira do nmero
int ( 2.4 ) = 2
Date ( )
Data de hoje
09/02/2000
Time ( )
Hora corrente
13:50:08
Abs (Expr.Numrica) Valor absoluto
abs (-5) = 5
rnd
Nmero aleatrio entre 0 e 1 0.564326
Sin (Expr.Numrica) Seno de um arco, dado em Sin (3.141592654/6) = 0.5
radianos
necessrio respeitar o tipo de parmetro da funo. No caso da funo seno, se
escrevermos sin (30), a resposta ser 0.988, que o seno de 30 radianos, e no de 30
graus.
16
3.
3.1.
Termmetro
17
Aps a leitura do
contedo de F
F
68
3.2.
Aps o clculo
dos graus Celsius
F
68
20
rea do Crculo
Dado o raio de um crculo, obter sua rea.
Uma soluo
O raio um dado do tipo real, que deve ser > 0. A rea do crculo do tipo real, e
2
obtida pela frmula: rea = * Raio
CIRCULO
Real Raio
// Raio do crculo
Real Area
// rea
Calc_Area ( )
Objetivo: Obter a rea do crculo, dado seu raio
Pr-condio: Raio > 0
Area 3.1416 * Raio ^ 2
18
3.3.
Cronmetro
100
Tempo
3800
Horas
0
Horas
Minutos
Segundos
40
Minutos
Segundos
20
Uma soluo
A quantidade de segundos um valor do tipo inteiro. A resposta do problema a
quantidade de Horas, Minutos e Segundos, tambm valores do tipo inteiro.
Para fazer converses de tempo, consideram-se as seguintes relaes:
1 minuto = 60 segundos; 1 hora = 60 minutos.
Dado um valor em segundos, pode-se calcular a quantidade de minutos existentes,
dividindo a quantidade de segundos por 60. O resto dessa diviso a quantidade de
segundos mesmo (no forma um minuto).
A quantidade de minutos obtida pode ser maior que 60. Para calcular a quantidade
de horas existentes, obtm-se o quociente da diviso dos minutos por 60.
Tempo
(Segundos)
3800
60
20
63
Quociente 1
(Minutos)
60
Resto 1
(Segundos)
Resto 2
(Minutos)
Quociente 2
(Horas)
19
3800
3600
1
Quociente 1
(Horas)
200
60
20
Quociente 2
(Minutos)
CRONMETRO
Inteiro Tempo
// Tempo em segundos
Inteiro H, M, S
// Horas, Minutos e Segundos, aps a converso
Conv_HMS_2 ( )
Objetivo: Converter tempo, em segundos, para Horas, Minutos e Segundos
Pr-condio: Tempo > 0
H Tempo \ 3600
S Tempo mod 3600
M S \ 60
S S mod 60
20
3.4.
Rateio
Dividir uma quantidade de alunos em 3 classes, de modo que a diferena entre elas
seja mnima (Oliveira, 2005).
Uma soluo
Trata-se de um problema tpico de Administrao Escolar: dividir uma quantidade
de alunos em um determinado nmero de classes, para que todas as classes fiquem com o
mesmo nmero de estudantes. Nem sempre a diviso por 3 resulta exata, e evidentemente a
quantidade de alunos por sala deve ser um nmero inteiro.
Ex: 46 / 3 = 15,33..., ou seja, Classe 1 = 15, Classe 2 = 15 e Classe 3 = 16
A idia inicial obter o quociente da diviso por 3 e atribuir esse valor Classe 1
(quantidade da menor sala, j que a parte fracionria perdida). A Classe 2 pode ter a
mesma quantidade da Classe 1. A Classe 3 obtida pela diferena entre a quantidade de
alunos inicial e os alunos j colocados nas duas primeiras classes.
ALUNOS
Inteiro Alunos, Classe1, Classe2, Classe3
Balanceamento ( )
Objetivo: Dividir uma quantidade de alunos em 3 salas, de forma balanceada
Classe1 Alunos \ 3
Classe2 Classe1
Classe3 Alunos Classe1 Classe2
Vamos verificar se o algoritmo est correto para 63, 64 e 65 alunos:
Classe
1
2
3
Clculo
Quantidade \ 3
= Classe 1
AlunosClasse1
Classe2
Quantidade de alunos
63
64
65
21=63 \ 3
21=64 \ 3
21=65 \ 3
21
21
21
21=632121 22=642121 23=652121
21
ALUNOS
Inteiro Alunos, Classe1, Classe2, Classe3
Balanceamento ( )
Objetivo: Dividir uma quantidade de alunos em 3 salas
Classe1 Alunos \ 3
Classe2 (Alunos Classe1) \ 2
Classe3 Alunos Classe1 Classe2
Neste caso, o algoritmo far a distribuio corretamente:
Classe
1
2
3
3.5.
Clculo
Quantidade \ 3
(AlunosClasse1) \ 2
AlunosClasse1
Classe2
Quantidade de alunos
63
64
65
21=63 \ 3
21=64 \ 3
21=65 \ 3
21
21
22
21=632121 22=642121 22=652121
Um erro comum para iniciantes achar que uma expresso, uma vez escrita, tornase uma verdade para o restante do programa:
Ex.: B A / 2
AA+1
Se o valor de A for alterado, o valor de B no ser alterado, como ocorre nas
planilhas eletrnicas.
3.6.
a)
Problemas Propostos
rea do tringulo
Dado um tringulo, definido pelos valores dos lados, calcular sua rea.
rea =
s (sa).(sb).(sc)
onde
s =a + b + c
2
22
b)
Dadas as coordenadas de 2 pontos num plano (X1, Y1) , (X2, Y2), calcular a
distncia entre esses pontos.
d =
( X2 X1 )
+ ( Y2 Y1 )
Juros Compostos
Dados o valor presente (VP), um n de perodos (n) e uma taxa de juros do perodo
(i, em decimais, ou seja, 5% = 0,05), calcular seu valor futuro (VF), a juros compostos.
n
VF = VP (1 + i )
Exemplo: Dado VP = R$ 1.000, 00, capitalizado em 12 meses, a uma taxa de 2% de
juros ao ms, o valor futuro ser = R$ 1.268,24 = (1 + 0.02) ^ 12.
d)
Separar dgitos
Dado um nmero inteiro, positivo, < 1000, obter a quantidade de centenas, dezenas
e unidades desse nmero.
Exemplo:
e)
Caixa eletrnico
Um caixa eletrnico trabalha com cdulas de 100, 50, 20, 10, 5, 2 e 1. Obter a
quantidade de cdulas de cada tipo, para efetuar um pagamento de uma quantia escolhida
pelo cliente, usando a menor quantidade de cdulas.
Exemplos:
f)
Dgitos centrais
Dado um nmero inteiro entre 1000 e 9999, mostrar a soma dos dgitos centrais (2
e 3 dgitos).
23
g)
h)
2
13
1
2
6
0
2
3
1
=11011
2
1
Simulao
Simular e determinar qual o objetivo do seguinte algoritmo.
Variveis
N, N1, N2, N3, N4, N5 (Inteiro)
Procedimento ( )
Objetivo: __________________________________________________________
N1 N \ 16
N2 (N mod 16) \ 8
N3 N mod 8) \ 4
N4 N mod 4) \ 2
N5 N mod 2
24
4.1.
Salrio Bruto
[Tipo = H]
[Seno]
Tipo = H ento
SBruto Salario * Horas Trab
Seno
SBruto Salario Faltas
Fim-se
25
4.2.
Verificar se par
Dado um nmero inteiro, positivo, verificar se ele par.
Uma soluo
Se o nmero dado for par, atribuir varivel Par, do tipo booleano, o valor
Verdadeiro, seno, atribuir o valor Falso.
Um nmero par divisvel por 2, ou seja, o resto da diviso por 2 igual a zero.
NMERO
Inteiro N
// Nmero inteiro dado
Booleano Par
// Informao se o nmero par
Verifica_Par( )
Objetivo: Verificar se um nmero inteiro positivo par
Se N mod 2 = 0 ento
Par Verdadeiro
Seno
Par Falso
Fim-Se
4.3.
Maior de 2 nmeros
Dados 2 nmeros distintos, obter o maior.
Uma soluo
A pr-condio que os nmeros so distintos.
26
4.4.
Maior de 3 nmeros
Dados 3 ns distintos, mostrar o maior.
Uma soluo
A>C?
No
A>B?
Sim
No
B>C?
No
O maior A
O maior C
O maior B
O maior C
As instrues esto numeradas para que seja feita, posteriormente, uma simulao
do algoritmo.
1
2
3
4
5
6
7
3 NMEROS
Inteiro A, B, C
// 3 nmeros dados
Inteiro Maior
// Cpia do maior dos 3 nmeros
Maior_de_3 ( )
Objetivo: Achar o maior de 3 nmeros
Pr-condio: A, B e C so distintos
Se A > B ento
Se A > C ento
Maior A
Seno
Maior C
Fim-Se
Seno
Se B > C ento
Maior B
Seno
Maior C
Fim-Se
Fim-Se
27
Simulao
Na simulao, o algoritmo executado para determinados valores (instncias),
sendo verificado se produz a resposta esperada.
Exemplo: supondo-se que os valores de A, B e C sejam 6, 8, 4, o algoritmo
executaria as seguintes instrues, produzindo o seguinte resultado:
Instruo
A
6
Variveis
B
C Maior
8
4
1
5
6
Teste
Resultado
do teste
A > B (6 > 8) ?
B > C (8 > 4) ?
F
V
28
Terceira estratgia
Outra estratgia descobrir se A o maior dos trs. Se no for, o maior estar entre
B e C. Para descobrir se A o maior, pode-se utilizar uma pergunta composta, ou seja, para
ser o maior, A deve ser maior que B e maior que C.
As proposies podem ser combinadas por meio de conectivos lgicos. O resultado
dessa combinao pode ser visualizado numa tabela-verdade.
A tabela-verdade para 2 proposies (p e q), com dois valores possveis para cada
uma (V ou F), tem 4 possibilidades. A tabela da negao tem 2 possibilidades.
p
F
V
F
V
F
F
V
V
Conjuno ( E )
p^q
F
F
F
V
Disjuno (OU)
pvq
F
V
V
V
p
V
F
Negao (NO)
~p
F
V
3 NMEROS
Inteiro A, B, C, Maior
// 3 nmeros dados e cpia do maior
Maior_de_3 ( )
Objetivo: Achar o maior de 3 nmeros
Pr-condio: A, B e C so distintos
Se A B e A C ento
Maior A
Seno
Se B C ento
Maior B
Seno
Maior C
Fim-Se
Fim-Se
Um erro comum, ao verificar se o maior A, a seguinte pergunta:
Se
A B e B C ento Maior A
29
e
e
e
e
A=C
BC
CB
CA
Como temos somente um caso vlido (A B C), melhor perguntar por ele,
deixando os casos de erro para o seno. A funo a seguir efetua essa verificao:
Funo Distintos (Real A, B, C) Booleano
Objetivo: Verificar se 3 nmeros so distintos
Distintos A B And B C And A C
A definio sobre a possibilidade de entrarem nmeros iguais, ou no, depende da
aplicao. Se for para escolher a melhor nota de prova entre trs, no h problema se
entrarem trs notas iguais. Se os trs valores so preos de compra, devemos utilizar outro
critrio de desempate (condies de pagamento, prazo de entrega, qualidade etc.)
30
4.5.
Ordem crescente
Dados 3 nmeros distintos, coloc-los em ordem crescente.
Uma soluo
B
6
Aux
8
Se A > B ento
Aux B
B
A
A
Aux
Fim-se
3 NMEROS
Real A, B, C
Ordenar3 ( )
Objetivo: Colocar 3 nmeros em ordem crescente
Se A > B ento
Trocar (A, B)
Fim-Se
Se B > C ento
Trocar (B, C)
Fim-Se
Se A > B ento
Trocar (A, B)
Fim-Se
Procedimento Trocar (X, Y)
// X e Y so passados por referncia.
Objetivo: Permutar o contedo de X com Y
Real Aux
Aux X
X Y
Y Aux
31
Segunda estratgia
Supondo que no precisssemos trocar o contedo das variveis, tendo apenas que
mostrar os nmeros em ordem. Se A < B, resta saber a posio de C, que pode estar antes
de A, entre A e B, ou depois de B.
A
C
B
C
CAB
ACB
ABC
C antes de A e B
C entre A e B
C depois de B
A
C
CBA
BCA
BAC
3 NMEROS
Real A, B, C
Ordenar3 ( )
Objetivo: Mostrar 3 nmeros em ordem crescente
Se A < B ento
// A antes de B
Se C < A ento
// C antes de A
Imprimir (C, A, B)
Seno
Se C < B ento
// C entre A e B
Imprimir (A, C, B)
Seno
Imprimir (A, B, C)
// C depois de B
Fim-Se
Fim-Se
Seno
// B antes de A
Se C < B ento
// C antes de B
Imprimir (C, B, A)
Seno
Se C < A ento
// C entre B e A
Imprimir (B, C, A)
Seno
Imprimir (B, A, C)
// C depois de A
Fim-Se
Fim-Se
Fim-Se
C antes de B e A
C entre B e A
C depois de A
32
4.6.
Contar Pares
Dados 3 ns inteiros e positivos, mostrar quantos so pares.
Uma soluo
O objetivo mostrar quantos so pares, e no quais. Uma das solues criar uma
varivel com a funo de contador. Essa varivel seria iniciada com zero e a cada vez que
ocorrer um n par, somado 1 no contador.
No final, o contador poder continuar com 0 (nenhum par), ou ter valor 1, 2 ou 3.
3 NMEROS
Inteiro A, B, C
// 3 nmeros
Inteiro QP
// Quantidade de pares
Conta_Pares ( )
Objetivo : Dados 3 ns inteiros, mostrar quantos so pares
QP 0
Se A mod 2 = 0 ento QP QP + 1
Se B mod 2 = 0 ento QP QP + 1
Se C mod 2 = 0 ento QP QP + 1
Estratgia 2 (Funo caracterstica)
Outra estratgia utilizar a funo caracterstica (seqncia de bits), representando
respectivamente casos de sim ou no. Como so 3 casos, usamos 3 variveis, com valor
inicial zero, e mudando-se para 1 se o valor correspondente for par. No final, soma-se as 3
variveis e o resultado a quantidade de pares.
3 NMEROS
Inteiro A, B, C, QP
// 3 nmeros e Quantidade de pares
Conta_Pares ( )
Objetivo : Dados 3 ns inteiros, mostrar quantos so pares
Inteiro Bit1, Bit2, Bit3
Bit1 0
Bit2 0
Bit3 0
Se A mod 2 = 0 ento Bit1 1
Se B mod 2 = 0 ento Bit2 1
Se C mod 2 = 0 ento Bit3 1
QP Bit1 + Bit2 + Bit3
33
4.7.
Quadrante
ordenadas ( Y )
II
I
origem
III
abscissas
(X)
IV
1 quadrante
2 quadrante
3 quadrante
4 quadrante
Se Y > 0
No 4 Quadrante
Se X > 0
Sim 2 Quadrante
No
Se Y > 0
No 3 Quadrante
34
PONTO NO PLANO
Real X, Y
// Abscissa e ordenada do ponto
String Loc
// Localizao do ponto
Localizar_Ponto ( )
Objetivo : Localizar ponto no plano cartesiano
Se X 0 e Y 0 ento
// Quadrante
Se X > 0 ento
// 1 ou 4 quadrantes
Se Y > 0 ento
Loc "1 Quadrante"
Seno
Loc "4 Quadrante"
Fim-se
Seno
// 2 ou 3 quadrantes
Se Y > 0 ento
Loc "2 Quadrante"
Seno
Loc "3 Quadrante"
Fim-se
Fim-se
Seno
// Eixo ou origem
Loc Eixo ou origem
Fim-Se
Pode-se inverter as aes do ento e do seno, negando a condio:
No ( X 0 e Y 0 )
Usando De Morgan, temos: X = 0 ou Y = 0
Estratgia 2
Pode-se, tambm, usar outra estratgia para determinao do quadrante,
perguntando por X * Y. Se X * Y for > 0, X e Y tm o mesmo sinal, que ocorre para pontos
do 1 ou 3 quadrantes. Se X * Y for < 0, ento os sinais so invertidos, que ocorre para
pontos do 2 ou 4 quadrantes. Se o ponto estiver no 1o ou 3o quadrante (sinais iguais), se X
for positivo, o ponto estar no 1o quadrante, seno, estar no 3o.
Nessa soluo ser refinada, tambm, a localizao do ponto quando este no
estiver em um dos quadrantes, ou seja, estive em um dos eixos ou na origem.
35
PONTO NO PLANO
Real X, Y
// Abscissa e ordenada do ponto
String Loc
// Localizao do ponto
Localizar_Ponto ( )
Objetivo: Localizar ponto no plano cartesiano
Se X = 0 ou Y = 0 ento
// Eixo
Se X = 0 ento
Se Y = 0 ento
Loc Origem
Seno
Loc Ordenada
Fim-se
Seno
Loc Abscissa
Fim-se
Seno
// Quadrante
Se X * Y > 0 ento
Se X > 0 ento
Loc "1 Quadrante"
Seno
Loc 3 Quadrante"
Fim-se
Seno
Se X > 0 ento
Loc "4 Quadrante"
Seno
Loc "2 Quadrante"
Fim-se
Fim-se
Fim-se
4.8.
Alunos
36
MF = M1 + M2
arredondada para o mais prximo inteiro ou 0.5.
2
Exemplo: 6.2 6.0
6.25 6.5
6.7 6.5
6.75 7.0
A situao do aluno obtida em funo da mdia final (MF):
Mdia Final (MF)
Abaixo de 3.0
De 3.0 at abaixo de 7.0
De 7.0 em diante
Situao
Reprovado
Exame
Aprovado
Uma soluo
O algoritmo ter as seguintes macro-instrues, que sero depois refinadas:
-
37
Aprovado
MF 7.0 ?
N
Exame
Reprovado
MF 3.0 ?
Quando se lida com faixas, melhor comear a perguntar pelos extremos (primeira
ou ltima faixa). Se a primeira pergunta for da faixa central ela seria mais complexa:
Se MF 3 e MF < 7 ento
Situao Exame
// Desse jeito, as perguntas no so compostas
ALUNO
Real P1, P2, A1, A2
// Notas de prova e atividade
Real MF
// Mdia final
String Situao
// Situao do aluno
CalcularSituao ( )
Objetivo: Determinar a mdia fina e a situao do aluno, dadas suas notas
Real Frac
// Parte fracionria da nota
M1 (P1 * 3 + A1 * 2) / 5
// Calcular mdias
M2 (P2 * 3 + A2 * 2) / 5
M1 Int ( (M1 + 0,05 ) * 10 ) / 10
// Arredondar mdias
M2 Int ( (M2 + 0,05 ) * 10 ) / 10
MF (M1 + M2 ) / 2
// Calcular mdia final
Frac MF int ( MF )
// Arredondar mdia final
Se Frac < 0.25 ento
MF int (MF)
Seno
Se Frac < 0.75 ento
MF int(MF) + 0.5
Seno
MF int (MF) + 1
Fim-se
Fim-se
Se MF 7 ento
// Obter situao do aluno
Situao Aprovado
Seno
Se MF 3.0 ento
Situao Exame
Seno
Situao Reprovado
Fim-se
Fim-se
38
4.9.
Melhores notas
Dadas 4 notas de provas de um aluno, obter a mdia das 2 maiores notas. Se houver
notas repetidas, considerar a primeira da seqncia.
Uma soluo
Uma estratgia iniciar as variveis Maior1 e Maior2 com os valores das duas
primeiras notas, a maior delas em Maior1 e a outra em Maior2.
Ento, coloca-se a 3 nota para brigar com os valores de Maior1 e Maior2. Se a 3
nota for > Maior1, desloca-se o contedo de Maior1 para Maior2 e substitu-se Maior1 pela
3 nota. Seno, ainda tem-se de comparar a 3 nota com Maior2. Se a 3a nota for > Maior2,
substitu-se Maior2 por ela. Seno, deixa-se como est, ou seja, a 3 nota perdeu as 2
brigas. Repete-se o mesmo processo para a 4 nota.
ALUNO
Real N1, N2, N3, N4, Mdia
// Notas de prova e mdia das duas maiores
MdiaMaiores ( )
Objetivo: Dadas 4 notas, calcular a mdia das 2 melhores notas
Real Maior1, Maior2
Se N1 > N2 ento
// Colocar N1 e N2 em Maior1 e Maior2,
Maior1 N1
// em ordem decrescente.
Maior2 N2
Seno
Maior1 N2
Maior2 N1
Fim-se
Se N3 > Maior1 ento
// Comparao da 3a nota ( N3)
Maior2 Maior1
// com Maior1 e Maior2
Maior1 N3
Seno
Se N3 > Maior2 ento
Maior2 N3
Fim-se
Fim-se
Se N4 > Maior1 ento
// Comparao da 4a nota ( N4 )
Maior2 Maior1
// com Maior1 e Maior2
Maior1 N4
Seno
Se N4 > Maior2 ento
Maior2 N4
Fim-se
Fim-se
Mdia (Maior1 + Maior2) / 2
// Mdia das maiores notas
Nessa estratgia, o cdigo aumenta 5 instrues para cada nota acrescentada.
39
Estratgia 2
Outra estratgia achar o maior das 6 somas de pares possveis de notas:
N1 + N2
N1 + N3
N1 + N4
N2 + N3
N2 + N4
N3 + N4.
Pode-se usar uma varivel para guardar a maior soma. Esta varivel iniciada com
o valor da soma do primeiro par (N1 + N2)
ALUNO
Real N1, N2, N3, N4
// Notas de prova
Real Mdia
// Mdia
MdiaMaiores ( )
Objetivo: Dadas 4 notas, calcular a mdia das 2 melhores notas
Real Maior
Maior N1 + N2
Se N1 + N3 > Maior ento Maior N1 + N3
Se N1 + N4 > Maior ento Maior N1 + N4
Se N2 + N3 > Maior ento Maior N2 + N3
Se N2 + N4 > Maior ento Maior N2 + N4
Se N3 + N4 > Maior ento Maior N3 + N4
Mdia Maior / 2
Neste caso, quando se acrescenta uma nota, a quantidade de pares sobe para 10. Se
forem mais duas notas, sobe para 15, mais 3, para 21, ...
Algumas perguntas podem induzir a erros, como por exemplo:
Se (N1 + N2) > (N3 + N4) ento Maior (N1 + N2) / 2
No exemplo anterior, pode ocorrer o seguinte:
N1 N2
N3 N4 ,
(9+3) >(7+ 4)
40
Produtos de 3
Quantia / 3
(Quantia 10) / 3
(Quantia 5 ) / 3
Produtos de 5
0
2
1
Baseado no problema dos selos, apresentado em Salvetti & Barbosa (1998, p. 57)
41
A < B < C
1000
2000
Uso incorreto do OU
Exemplo: A expresso A = 5 OU 6, ser sempre verdadeira.
A = 5
OU 6
V
OU
F
OU
42
Equao do 2 grau
Dados a, b e c, a 0, calcular as razes de ax2 + bx + c (equao do 2o grau).
Exemplo: Dados 1 -2 e 1
Dados 1 -3 e 2
Dados 1 1 e 2
b)
obter
obter
obter
X=1
X1 = 1 e X2 = 2
No existem razes reais
Tringulo (lados)
Dados 3 ns positivos, possveis lados de um tringulo, mostrar o tipo de tringulo.
Exemplo: Dados 3, 4 e 5
Obter Escaleno, pois os 3 lados so diferentes um do outro.
4
8
c)
Poltica de descontos
Uma loja utiliza a seguinte poltica de descontos sobre o valor calculado da venda
(quantidade vendida * preo unitrio):
Valor calculado da venda
At
$ 200,00
Acima de $ 200,00 at $ 1000,00
Acima de $ 1000,00
% de desconto
Sem desconto
5%
10%
43
d)
Substitutiva
Tringulo (ngulos)
Febre
Situao
Hipotermia
Normal
Estado febril
Febre
Dados a massa (Kg) e a altura (m) de uma pessoa, calcular seu IMC e mostrar sua
situao, de acordo com a seguinte tabela:
IMC = Massa
2
Altura
IMC
Abaixo de 20
De
20
Acima de 25
Acima de 30
Acima de 40
at
at
at
25
30
40
Situao
Desnutrio
Normal
Excesso de peso
Obesidade leve
Obesidade grave
44
h)
Nmero de 3 algarismos
Dado um n inteiro e positivo de 3 algarismos, obter:
quantos algarismos tm valor 5;
qual o menor algarismo;
se a soma dos valores dos algarismos par.
i)
Multas
Multa (R$)
0
120
520
Pontos
0
4
7
Objetivo
Descrever o objetivo do seguinte algoritmo:
PARA QUE SERVE?
Variveis
N1, N2, N3, N4, X (Real)
Algoritmo ( )
Objetivo: _________________________________________________________
X N1 + N2
Se N1 + N3 > X ento X N1 + N3
Se N1 + N4 > X ento X N1 + N4
Se N2 + N3 > X ento X N2 + N3
Se N2 + N4 > X ento X N2 + N4
Se N3 + N4 > X ento X N3 + N4
XX/2
45
k)
Senha
Dgito de controle
Cdigo da
faculdade
2
X
1
=
2 +
Nmero de
matrcula
1
X
2
=
2 +
6
X
1
=
6 +
1
X
2
=
2 +
0
X
1
=
0 +
8
X
2
=
1+6 = 19
ltimo dgito
do acumulado
46
m)
Folha de pagamento
Alquota (%)
Isento
15
27,5
Deduzir (R$)
150,00
400,00
Alquota (%)
7,65
8,65
9
11
Rodzio
Dado o final da placa de um automvel, obter qual o dia da semana que este veculo
est sujeito ao rodzio. Para o final de placa 1 e 2, o veculo no roda s segundas, para o
final 3 e 4, s teras, e assim por diante.
Exemplo: Dado o final 7, a sada ser Quinta
47
o)
Desconto
Escola de samba
Sobreposio
Paralelas
Dadas as coordenadas de dois pontos distintos (X1, Y1) e (X2, Y2), verificar que
tipo de reta passa por esses pontos: eixo, paralela a um eixo, no paralela a um eixo.
Exemplo: Dadas as coordenadas (3,2) e (6,2), a reta paralela ao eixo das abscissas.
Dadas as coordenadas (3,1) e (6,4), a reta no paralela a nenhum eixo.
48
5.
5.1.
N primeiros pares
Imprimir os N primeiros nmeros pares positivos.
Uma soluo
Podemos iniciar a varivel Par com o valor do primeiro par (2). Para calcular o
prximo par pode-se somar 2 na varivel Par, e repetir o processo para a quantidade de
pares a serem impressos.
Para contar as repeties (voltas do loop), podemos usar uma varivel (K, por
exemplo) que inicia com 1 e aumenta 1 a cada volta, como em uma catraca, usada para
contar pessoas que passam por ela. O controle das repeties feito comparando, a cada
volta, o valor de K com o limite (N). O loop termina quando K fica maior que N.
Par 2
K1
Teste: K N (Verdadeiro)
Imprime (Par)
1 par
Par Par + 2
prximo par
KK+1
Teste: K N (Verdadeiro)
Imprime (Par)
2 par
Par Par + 2
prximo par
KK+1
Teste: K N (Verdadeiro)
Imprime (Par)
3 par
Par Par + 2
prximo par
KK+1
Teste: K N (Falso. O loop termina)
Simulao para N = 3
N
3
K
1
Par
2
49
Par 2
Atribui valor
inicial
varivel de
controle (K)
K1
KN
S
Imprime (Par)
Par Par + 2
KK + 1
N
Testa
Limite
(N)
Incrementa o
passo ( + 1 ), e
volta a testar
limite
Fim
PARES
Inteiro N
// Quantidade de pares a serem impressos
Inteiro Par
// Nmeros pares
ImprimePares ( )
Objetivo: Imprimir os N primeiros pares positivos
Inteiro K
// Varivel de controle de repetio
Par
2
K
1
Enquanto K N faa
Sada (Par)
// Imprime um par
Par Par + 2
//Calcula o prximo par
KK+1
// Conta + 1 volta
Fim-Enquanto
3
Os problemas envolvendo iteraes podem ser resolvidos em duas etapas: 1) Identificar o que
deve ser repetido; 2) Quantas vezes ser repetido e como controlar a quantidade de repeties.
50
O controle de repetio pode ser efetuado por uma instruo especial para o caso de
se saber de antemo quantas voltas sero executadas (controle feito por varivel).
PARES
Inteiro N
// Quantidade de pares a serem impressos
Inteiro Par
// Nmeros pares
ImprimePares ( )
Objetivo: Imprimir os N primeiros pares positivos
Inteiro K
// Varivel de controle de repetio
Par
2
Para K de 1 at N [passo 1] repita
Sada (Par)
// Imprime um par
Par Par + 2
//Calcula o prximo par
Fim-Para
Nesse caso, o comando faz automaticamente a inicializao da varivel de controle
(K ), acumula o passo (=1, por default), e volta para fazer o teste.
Algumas linguagens utilizam uma forma de instruo de controle por varivel que
faz a atribuio do valor inicial, o teste de final de loop e o avano da varivel de controle
(passo), de forma explcita:
PARES
Inteiro N
// Quantidade de pares a serem impressos
Inteiro Par
// Nmeros pares
ImprimePares ( )
Objetivo: Imprimir os N primeiros pares positivos
Inteiro K
// Varivel de controle de repetio
Par
2
Para (K 1; K N; K K + 1) repita
Sada (Par)
// Imprime um par
Par Par + 2
//Calcula o prximo par
Fim-Para
Simulao
Antes de fazer a simulao, devemos numerar as instrues do algoritmo.
Instruo Algoritmo
ImprimePares ( )
Inteiro K
2
1 Par
2 Para K de 1 at N [passo 1] repita
Sada (Par)
3
Par Par + 2
4
Fim-Para
51
Instruo
1
2
3
4
2
3
4
2
3
4
2
N
3
3
3
3
3
3
3
3
3
3
3
3
Variveis
Par
K
2
2
2
4
4
4
6
6
6
8
8
1
1
1
2
2
2
3
3
3
4
Teste
KN
Sada
V (1 3)
2
V (2 3)
4
V (3 3)
6
F (4 > 3)
N
3
5.2.
Variveis
Par
K
2
4
1
6
2
8
3
4
Sada
2
4
6
Impares
Dado um nmero N, inteiro e positivo, obter a soma dos N primeiros mpares.
Uma soluo
52
(N vezes)
Soma
0 1 4
Impar
9 16 ...
1 3
7 ...
N impares, N somas
Zerar Soma
Determinar 1 Termo (= 1)
Repetir
(N vezes)
Finalizar
Imprimir Soma
IMPARES
Inteiro N
// Quantidade de mpares que sero acumulados
Inteiro Soma
// Acumulado dos N primeiros mpares
SomaImpares ( )
Objetivo: Imprimir a soma dos N primeiros mpares
Inteiro K
Soma 0
Impar 1
Para K de 1 at N repita
Soma Soma + Impar
// Acumula impar
Impar Impar + 2
// Calcula prximo impar
Fim-Para
O modo como est sendo gerada a seqncia dos nmeros mpares chamado de
relao de recorrncia, em que o clculo do prximo termo feito a partir de um ou mais
termos anteriores.
No caso dos nmeros mpares, cada novo nmero impar obtido somando-se 2 ao
impar anterior, sendo o primeiro impar = 1.
Impar1 = 1
Impar2 = Impar1 + 2 = 1 + 2 = 3
Impar3 = Impar2 + 2 = 3 + 2 = 5
A relao de recorrncia
53
Termo geral
Termo geral uma frmula usada para calcular qualquer elemento de uma
seqncia em funo de sua posio (ndice) na seqncia.
O termo geral dos nmeros mpares = 2 * K 1, para K = 1, 2, 3, ...
Neste exerccio, trata-se de obter a somatria dos nmeros com formato 2*K 1,
para K pertencente a N*
N
2 . K 1 = 1 + 3 + 5 + 7 + ... + 2N 1
K=1
O operador
2 . K 1 = 1 + 3 + 5 + 7 + 9 + 11 = 36
K=1
Quando o termo geral usado no necessrio definir um valor inicial para o termo
da seqncia, pois necessita-se apenas da posio do termo na seqncia. A posio do
termo dada pela varivel de controle da somatria (K).
Uma maneira de descobrir o termo geral listar os valores dos termos e as posies
que eles ocupam, procurando uma relao entre esses dois conjuntos:
Termo
Posio (K)
1
1
3
2
5
3
7
4
9
5
...
...
54
IMPARES
Inteiro N
// Quantidade de mpares que sero acumulados
Inteiro Soma
// Acumulado dos N primeiros mpares
SomaImpares ( )
Objetivo: Imprimir a soma dos N primeiros mpares
Inteiro K
Soma 0
Para K de 1 at N repita
Impar 2 * K 1
// Calcula impar
Soma Soma + Impar
// Acumula impar
Fim-Para
5.3.
P.A.
Imprimir os N primeiros termos de uma P.A. definida por a1 = 2 e razo = 3.
Uma soluo
Pode-se gerar os termos da P.A. pela relao de recorrncia e pelo termo geral.
Recorrncia
a1 = 2
a2 = a1 + 3 = 5
a3 = a2 + 3 = 8
a4 = a3 + 3 = 11
...
an = an 1 + r
Termo Geral
a1 = 2
a2 = a1 + 3 = 5
a3 = a1 + 6 = 8
a4 = a1 + 9 = 11
...
an = a1 + (n 1 ) r
Recorrncia
O primeiro termo = 2 e cada termo gerado somando-se a razo (=3) ao anterior.
P. A.
Inteiro N
// Quantidade de termos da P.A.
Termo
// Valor do termo
ImprimeTermos ( )
Objetivo: Imprimir os N primeiros termos da P.A. ( a1 = 2 e razo = 3).
Inteiro K
Termo 2
Para K de 1 at N repita
Imprime ( Termo )
Termo Termo + 3
// Termo anterior + razo
Fim-Para
55
Termo geral
Cada termo calculado em funo da posio do termo na seqncia. A posio do
termo na seqncia pode ser dada pela varivel de controle do loop (1 volta do loop = 1
termo da seqncia, e assim por diante). 4
P. A.
Inteiro N
// Quantidade de termos da P.A.
Termo
// Valor do termo
ImprimeTermos ( )
Objetivo: Imprimir os N primeiros termos da P.A. ( a1 = 2 e razo = 3).
Inteiro K
Para K de 1 at N repita
Termo 2 + (K 1) * 3
// ak a1 + (K 1 ) razo
Imprime (Termo)
Fim-Para
5.4.
Nmeros triangulares
1
1
1
1
2
2
3
3
3
+2
6
+3
10
+4
15
....
+5
Como o problema pede apenas o valor do N-simo termo, inicia-se o primeiro termo
com 1 e calcula-se mais (N 1) termos, alm do primeiro. A varivel de controle de
4
Johann Carl Friedrich Gauss, com 7 anos de idade, ao receber a tarefa de somar os
nmeros inteiros de 1 a 100, respondeu, imediatamente, que a soma era 5050 (50 pares de
nmeros, cada par somando 101).
56
repetio comea com 2 e vai at N (do 2 at o ltimo termo). O valor do termo aps a
ltima volta (N) o valor do N-simo termo.
NMEROS TRIANGULARES
Inteiro N
// Ordem do termo a ser calculado
Inteiro Termo
// Contedo do N-simo termo
Triangulares ( )
Objetivo: Obter o N-simo termo da seqncia dos nmeros triangulares
Inteiro K
Inteiro A
// Acrscimo
Termo 1
A2
// Valor do primeiro acrscimo
Para K de 2 at N repita
Termo Termo + A
AA+1
// Prximo acrscimo, na prxima volta
Fim-Para
Nota-se que a varivel A (acrscimo) tem o mesmo comportamento da varivel K,
usada para controle do loop. Assim, pode-se utilizar apenas uma delas, de acordo com a
descrio a seguir:
NMEROS TRIANGULARES
Inteiro N
// Ordem do termo a ser calculado
Inteiro Termo
// Contedo do N-simo termo
Triangulares ( )
Objetivo: Obter o N-simo termo da seqncia dos nmeros triangulares
Inteiro K
Termo 1
Para K de 2 at N repita
Termo Termo + K
Fim-Para
Usando a relao de recorrncia, tem-se:
T1 = 1
T2 = T1 + 2 = 1 + 2 = 3
T3 = T2 + 3 = 3 + 3 = 6
T4 = T3 + 4 = 6 + 4 = 10
A relao de recorrncia : Tk+1 = Tk + (k + 1), k = 1, 2, 3 ... , T1 = 1, ou
Tk = Tk 1 + k , k = 2, 3, 4 ... , T1 = 1
O clculo do termo seguinte dado pelo seguinte comando de atribuio, a partir da
relao de recorrncia Termo Termo + K, no qual K a ordem do termo que est sendo
calculado.
57
5.5.
Fatorial
Dado um nmero inteiro e positivo N, calcular N!
Uma soluo
N
A funo fatorial definida por:
N! =
para todo N 0.
k=1
Por exemplo: 5! = 1 . 2 . 3 . 4 . 5 = 120
Por se tratar de um produtrio, inicia-se a resposta (varivel Fatorial) com 1
(elemento neutro na multiplicao). Em seguida, multiplica-se Fatorial pelos
inteiros at N. Pode-se comear a multiplicar por 2, pois a multiplicao por 1 no
altera o resultado.
NMERO INTEIRO
Inteiro N
Inteiro Fatorial
Triangulares ( )
Objetivo: Calcular N!
Inteiro Fator
Fatorial 1
Para Fator de 2 at N repita
Fatorial Fatorial * Fator
Fim-Para
O clculo pode ser feito com a seqncia de fatores na ordem inversa, ou seja:
5! = 5 . 4 . 3 . 2 . 1 = 120. A varivel Fator inicia com 5 e vai at 2, de 1 em 1.
Para isso, usa-se o comando de repetio com passo negativo.
NMERO INTEIRO
Inteiro N
// Fatorial a ser calculado
Inteiro Fatorial
// N!
Triangulares ( )
Objetivo: Calcular N!
Inteiro Fator
Fatorial 1
Para Fator de N at 2 passo 1 repita
Fatorial Fatorial * Fator
Fim-Para
58
5.6.
MDC
Novo A
Resto
20
12
35
12
11
11
Novo B
4
MDC
1
MDC
A
20
8
12 8
4
12
MDC
Resto
59
Para que o teste no fique no meio do loop pode-se repetir o clculo do resto antes
de retornar para o teste.
Resto A mod B
Resto 0 ? No: Sai do loop e MDC B
Sim: A B
B Resto
Resto A mod B
No caso do MDC, no se sabe de antemo quantas vezes o loop ser executado.
Utiliza-se, ento, um tipo de loop que permite a repetio de um bloco de instrues
enquanto uma determinada condio for verdadeira.
2 NMEROS INTEIROS
Inteiro A, B, MDC
CalcMDC ( )
Objetivo: Calcular o MDC de 2 nmeros inteiros
Inteiro Resto
Resto A mod B
Enquanto Resto 0 faa
A
B
B
Resto
Resto A mod B
Fim-Enquanto
MDC B
Se a condio for verdadeira, o bloco de instrues ser executado at o fim e voltase para o incio do ciclo, para testar novamente a condio. Se a condio continuar
verdadeira, executa-se novamente o bloco e assim por diante. Se a condio tornar-se falsa,
o programa prossegue aps o fim da estrutura de repetio (Fim-Enquanto).
Nesse construtor de repetio necessrio iniciar a varivel de controle do loop e
incrementar o contador de iteraes. Sempre que for possvel determinar o nmero de
voltas de um loop, melhor utilizar o controle de repetio por varivel, no por
condio.
Observa-se que se A mltiplo de B o loop no executado e o MDC = B.
Observa-se, tambm, que se o usurio informar A < B, o prprio algoritmo corrige a
inverso.
12
12
20
8
12
...
60
5.7.
Seqncia Oscilante
3
2
5
4
7
6
...
61
Uma variao dessa estratgia, baseada tambm na ordem da volta, utiliza a prpria
varivel de controle, nas voltas pares como par negativo ( K ) e nas voltas mpares como
impar positivo ( K ).
SEQNCIA OSCILANTE
Inteiro N, Termo
GerarSeq ( )
Objetivo: Gerar seqncia oscilante
Inteiro K
Para K de 1 at N repita
Se K mod 2 = 0
Termo K
Seno
Termo K
Fim-se
Imprima (Termo)
Fim-Para
Estratgia 2: Nmeros naturais multiplicados por oscilao de sinal.
1
62
Estratgia 3: Pndulo
Termos
Incremento
2
-3
3
+5
-7
+9
6
11
Nota-se que a seqncia se comporta como um pndulo, indo para trs 3 e para
frente 5, para trs 7 e para frente 9, sendo que cada oscilao segue um padro, dado pela
seqncia dos mpares, a partir do-3.
GerarSeq ( )
Inteiro K, Sinal, Termo
Sinal 1
Termo 1
Para K de 1 at N repita
Imprima (Termo)
Termo Termo + Sinal * (2 * K + 1)
Sinal Sinal
Fim-Para
Estratgia 4: Termo Geral
Quando se tem o termo geral da seqncia, simples ger-la, bastando aplicar na
frmula do termo geral, o valor da varivel de controle do loop ( K = 1 at N ).
Posio do Valor do
Termo ( K ) Termo
1
2
3
4
5
1
2
3
4
5
K
1
2
3
4
5
* -1
*
*
*
*
*
(K+1)
GerarSeq ( )
Inteiro K
Para K de 1 at N repita
Termo ( 1) ^ ( K + 1 ) * K
Imprima (Termo)
Fim-Para
1
1
1
1
1
1
ou
(K 1)
*K
*K
63
5.8.
Wallis
1
2
3
4
5
6
7
8
Valor do
termo
1
1/3
1/5
1/7
1/9
1 / 11
1 / 13
1 / 15
Valor
acumulado
1
0.6667
0.8667
0.7238
0.8349
0.7440
0.8209
0.7543
1,2
1
Valor de PI / 4
Termo
0,8
0,6
0,4
0,2
0
1
9 10 11 12 13 14 15
N de iteraes
64
5.9.
Fibonacci
1
0
1
1
2
3
5
8
13
21
34
55
Casais adultos
(reprodutivos)
0
1
1
2
3
5
8
13
21
34
55
89
Total de casais
1
1
2
3
5
8
13
21
34
55
89
144
A
1
B
1
Termo
2
65
FIBONACCI
Inteiro N
// Quantidade de termos
Inteiro Termo
// Termos da seqncia
GerarSeq ( )
Pr Condio N > 2
Objetivo: Gerar os termos da seqncia de Fibonacci
Inteiro K, A, B, C
A 1
K inicia com 3, pois 2 termos j foram
B 1
impressos, e o programa pede N termos
Imprima (A, B)
Para K de 3 at N repita
Termo A + B
Imprima (Termo)
AB
B Termo
Fim-Para
A soluo a seguir, mais criativa, usa uma varivel a menos.
FIBONACCI
Inteiro N, Termo
GerarSeq ( )
Inteiro K, A
Termo 1
A0
Para K de 1 at N repita
Imprima (Termo)
Termo Termo + A
A Termo A
Fim-Para
Termo
1
1
2
3
5
8
13
21
34
55
89
Razo entre
2 termos
1
2
1,5
1,6667
1,6
1,625
1,6153
1,6190
1,6176
1,6181
2
A razo urea encontrada na natureza na distribuio das
sementes de girassol e do cacto, que regida pela espiral
logartmica do nmero ureo. O girassol possui 55 espirais
orientadas no sentido horrio, sobrepostas a 34 ou 89 espirais
em sentido anti-horrio
66
No corpo humano podemos descobrir o significado metafsico do tal como expresso pelo
aforismo de Herclito: O homem a medida de todas as coisas. As medidas da figura
humana se ajustam ao antigo smbolo biomtrico do corpo dividido em dois pelos rgos
sexuais ou em pelo umbigo (Lawlor, 1996:59).
1
As fraes contnuas fornecem a seguinte frmula: = 1 +
1+
1
1+
1
1 + ...
Zerar Soma
Zerar contador de termos (quantidade de voltas)
Repetir
(at que Soma > 100)
Finalizar
A estrutura de repetio usada nessa soluo com o teste no final, ou seja, o bloco
de repetio feito pelo menos uma vez, e ser repetido at que a condio seja verdadeira.
67
PROGRESSO ARITMTICA
Inteiro A1, Razo
// Definio da P.A.
Inteiro N
// Quantidade de termos
Triangulares ( )
Objetivo: Obter a quantidade de termos para que a soma de uma PA seja > 100
Inteiro Termo
Soma 0
N
0
Repita
N
N+1
Termo A1 + (N 1) * Razo
Soma Soma + Termo
At que Soma > 100
Imprima (N)
5.12. Alfabeto
Imprimir as letras maisculas do alfabeto.
Uma soluo
Podemos imprimir cada uma das letras, uma por uma, o que no parece uma boa
soluo.
Pode-se, tambm, utilizar operadores/funes para tratamento de caracteres e
strings (cadeias de caracteres), para gerar uma letra a partir do valor da anterior.
5
68
DESCRIO
EXPRESSO
VALOR
Concatenao
Valor numrico do
string
Converte nmeros
em string
Tamanho de um
string
Parte do string,
comeando em N1,
com tamanho N2
Caractere referente
ao nmero
Cdigo ASCII do
caractere
AB + C
Val (45.3)
ABC
45.3
Str (45.3)
45.3
Len (TESTE)
SubStr (TESTE,3, 2) ST
Chr (67)
Asc (F)
70
A letra A tem o cdigo 65 na tabela ASCII. B tem o cdigo 66, e assim por
diante. Assim, podemos iniciar uma varivel com 65 e, usando a funo CHR, gerar a letra
A, mudar esta varivel para 66 e gerar B, at o valor 90, equivalente letra Z.
ALFABETO
Caractere Letra
GerarAlfa ( )
Objetivo: Imprimir alfabeto maisculo
Inteiro L
Para L de 65 at 90 repita
Letra Chr ( L )
Imprimir (Letra)
Fim-Para
Pode-se, tambm, iniciar uma varivel com o valor A, e calcular as prximas
somando 1 no valor da letra na tabela ASCII e converter esse valor novamente em
caractere.
ALFABETO
Caractere Letra
GerarAlfa ( )
Objetivo: Imprimir alfabeto maisculo
Letra A
Enquanto Letra Z faa
Imprimir (Letra)
Letra Chr(Asc(Letra) + 1)
Fim-Enquanto
// Prxima letra
69
C A B
0 3 1 6
C A B
0 3 1 7
C A B
9 9 9 9
C A C
0 0 0 1
No se pode somar 1 direto num dado do tipo string. A idia separar a parte
numrica da placa, somar 1 e junt-la novamente com as letras. Quando a parte numrica
ficar > 9999, voltamos para 0001 e avana-se a terceira letra. Quando a terceira ou a
segunda letra ficar > Z, volta-se essa posio para A e avana-se a letra anterior.
AUTOMVEL
String Placa, Prox
// Placa atual e placa seguinte
Proxima_Placa( )
Objetivo: Calcular a prxima placa de automvel
String Letra1, Letra2, Letra3, Num
Inteiro Valor
Letra1 SubStr (Placa, 1 , 1)
Letra2 SubStr (Placa, 2 , 1)
Letra3 SubStr (Placa, 3 , 1)
Num SubStr (Placa, 5 , 4)
// Parte numrica da placa (tipo string)
Valor Val (Num) + 1
// Valor numrico de Num, + 1
Se Valor > 9999 ento
Valor 1
Letra3 Chr (Asc (Letra3) + 1)
// Prxima letra
Se Letra3 > Z ento
Letra3 A
Letra2 Chr (Asc (Letra2) + 1)
Se Letra2 > Z ento
Letra2 A
Letra1 Chr (Asc (Letra1) + 1)
Se Letra1 > Z ento
Letra1 A
// Voltar ao incio: ZZZ para AAA
Fim-se
Fim-se
Fim-se
Fim-se
Num Str (Valor)
Prox Letra1 + Letra2 + Letra3 + SubStr (000, 1, 4 len ( Num)) + Num
70
5.14. Engrenagem
Obter nmeros de 0 a 999, separados em Centenas, Dezenas e Unidades.
Uma soluo
As Centenas, Dezenas e Unidades se comportam como engrenagens, ou seja, a cada
10 giros da unidade a dezena gira uma vez (vai um) e a cada 10 giros da dezena a centena
gira uma vez. Nota-se que a engrenagem da unidade trabalha mais que a dezena, que
trabalha mais que a da centena.
A estrutura que implementa esse mecanismo um loop dentro do outro, tendo a
unidade como o loop mais interno. A quantidade de voltas 10 X 10 X 10 = 1000.
Pode-se usar uma varivel para cada posio e vari-la de 0 a 9.
ENGRENAGEM
Inteiro C, D, U
GerarNmeros ( )
Objetivo : Obter nmeros de 0 a 999 no formato Centena, Dezena e Unidade
Para C de 0 at 9
Para D de 0 at 9
Para U de 0 at 9
Imprima (C, D, U)
Fim-Para
Fim-Para
Fim-Para
5.15. Prestaes
Dada a data inicial de uma prestao e um n inteiro N, representando uma
quantidade de meses, calcular os prximos N 1 vencimentos mensais, sempre no mesmo
dia.
Uma soluo
Ex.: Data inicial = 16/11/03 , N = 4
As prximas datas seriam: 16/12/03, 16/01/04, 16/02/04
Uma estratgia seria:
Existe um problema para datas com dia > 28, pois fevereiro pode no ter 29 dias nos
anos no bissextos, e muito menos 30 ou 31 dias. Tambm, nem todos os meses tm 31
dias. Podemos testar as excees, que so os meses de Abril, Junho, Setembro e Novembro,
que tm 30 dias, e o ms de fevereiro que, se for ano bissexto tem 29 dias e se no, tem 28.
71
Um ano bissexto for mltiplo de 4 e no for mltiplo de 100, exceto quando for
mltiplo de 400 (1600 e 2000 foram bissextos; 1900 no foi).
Quando se lida com o tipo data, pode-se contar com algumas funes de
manipulao de datas, tais como:
Dia (data )
Ms (data )
Ano (data )
Data ( dia, ms, ano)
CONTRATO
Data DataInicial
// Data da 1 prestao
Inteiro N
// Quantidade de prestaes
Data DataPrest
// Datas de vencimento das prximas prestaes
CalcularDatas ( )
Inteiro D1, D2, M, A
D1 Dia ( DataInicial )
M Ms ( DataInicial )
A Ano ( DataInicial )
Para K de 1 at N 1
// Calcular as prximas N - 1 datas
MM+1
Se M = 13 ento
M1
AA+1
Fim-se
Se (M = 4 ou M = 6 ou M = 9 ou M = 11) e D1 = 31 ento
D2 30
Seno
Se M = 2 ento
Se D1 > 28 ento
Se A mod 4 = 0 e (A mod 100 0 ou A mod 400 = 0)
D2 29
// ano bissexto
Seno
D2 28
Fim-se
Fim-se
Fim-se
Seno
D2 D1
Fim-se
DataPrest Data ( D2, M, A )
Imprima (DataPrest)
Fim-Para
72
Loops
b)
Para I de 2 at 20
Para K de 8 at 2 passo -1
Para J de 1 at 10 passo 2
Para I de 10 at 2
Para K de 3 at N / 2
Para J de 10 at 3 passo 3
Para K de N at 2 passo 2
Simulaes
Mostrar, na forma de uma tabela, a evoluo das variveis usadas nos algoritmos
deste captulo.
c)
Seqncias
Dado um nmero N, inteiro e positivo, obter os N primeiros termos das seguintes
seqncias:
16
...
10
13
...
1
2
3
4
5
6
7
8
16 ...
11 ...
1 ...
73
11
21 43 ...
13
21
...
10
YK+1 = 2. YK + 1, Y1 = 1, K = 1, 2, 3, ...
YK+1 = YK + K, Y1 = 1, K = 1, 2, 3, ...
...
...
11 ...
Dado um nmero N, inteiro e positivo, obter a soma dos N primeiros termo das
seguintes seqncias:
d)
24
...
15
31
11
23
47
95
11
18
27
YK = (K + 1) K, K = 1, 2, 3, ...
2
...
Soma de dgitos
Obter todos os nmeros inteiros, maiores que 100 e menores que 1000, cuja soma
de dgitos seja maior que 10.
Exemplo: Os primeiros nmeros obtidos seriam: {119, 128, 129, 137, 138, 139, ...}
e)
Quantidade de dgitos
Desenvolver um algoritmo iterativo para obter quantos dgitos tem um nmero
inteiro dado.
Exemplo: Dado 31762, obter 5.
74
f)
Dados 2 ns, pertencentes a N*, calcular o MDC pelo mtodo das subtraes
sucessivas do maior.
Exemplo: Dados A = 20 e B = 12
A
20
12
A>B
B>A
A>B
A=B
A B = 20 12 = 8
B A = 12 8 = 4
AB=8 4 =4
MDC = 4
Simulao
Verificar se o algoritmo abaixo cumpre seu objetivo, para N 1
SEQNCIA
Inteiro N, Termo
GerarSeqncia ( )
Objetivo: Obter os N primeiros termos da seqncia 0 2 6 12 20 ...
Inteiro A, B, C, K
A0
B2
Imprima (A, B)
Para K de 3 at N repita
AA+2
BB*2
Termo A + B
Imprima (Termo)
Fim-Para
h)
Sries convergentes
Dado um nmero N, inteiro e positivo, calcular o valor das seguintes sries, com N
termos:
1
2
+ 1
4
+ 1 + 1 + ...
8
16
* 4 * 4 * 6
3
5
5
2
3
2
X + X
2
3
X
4
+...
(1 )
* 6 * 8 ... ( )
7
7
2
( ln (1 + X), X > 1 )
75
i)
X
3!
+ X X
5!
7!
4
X
2!
X X
2!
+
6
+...
...
( e )
+ X X
4!
6!
2
+ X
4!
Primo
MMC
Mltiplos
Camundongos 6
Divisores
Dado um nmero N, inteiro e positivo, obter todos os divisores pares de N.
Exemplo: Dado o nmero 36, obter {2, 4, 6, 12, 18, 36}
Baseado no problema das populaes, apresentado em Salvetti & Barbosa (1998, p. 32)
76
n)
CGC / CPF
Calcular o dgito de controle do CGC e CPF, de acordo com as seguintes instrues:
1.
2
X
1
=
2
3
X
2
=
6
4
X
1
=
4
5
X
2
=
10
6
X
1
=
6
7
X
2
=
14
77
2
X
4
=
8
3
X
3
=
9
4
X
2
=
8
5
X
9
=
45
6
X
8
=
48
7
X
7
=
49
4
X
6
=
24
/ 1
X
5
=
5
2
X
4
=
8
3
X
3
=
9
4
X
2
=
8
resto
6.
Logo C1 = 11 6 = 5
1.5. Clculo de C2
O valor de C2 obtido tendo por base os 13 algarismos anteriores, correspondentes ao
CGC do estabelecimento e do primeiro dos dgitos de controle (C1).
O procedimento de clculo idntico ao de C1, iniciando a partir da direita, a
multiplicao de cada algarismo por 2, 3, 4, at 9, retornando o multiplicador a 2, e
somando depois os produtos obtidos.
Exemplo: Seja o CGC do estabelecimento 12345674 / 1234
1
X
6
=
6
2
X
5
=
10
3
X
4
=
12
4
X
3
=
12
5
X
2
=
10
6
X
9
=
54
7
X
8
=
56
4
X
7
=
28
/ 1
X
6
=
6
2
X
5
=
10
3
X
4
=
12
4
X
3
=
12
- 5
X
2
=
10
78
2
X
9
=
18
3
X
8
=
24
4
X
7
=
28
5
X
6
=
30
6
X
5
=
30
7
X
4
=
28
8
X
3
=
24
5
X
2
=
10
79
2
X
10
=
20
3
X
9
=
27
4
X
8
=
32
5
X
7
=
35
6
X
6
=
36
7
X
5
=
35
8
X
4
=
32
5
X
3
=
15
- 7
X
2
=
14
Imposto
Repeties
Fatorao
Dado um nmero inteiro e positivo, obter sua decomposio em fatores primos.
Ex.
Dado: 84 , obter
2
2
3
7
3
5
5
Alterar o programa anterior, para mostrar o fator primo e seu respectivo expoente:
Ex.
Dado: 84 , obter
2
3
7
2
1
1
3 1
5 2
80
r)
Calculadora financeira
Fazer um projeto para simular as funes de uma calculadora financeira.
As variveis envolvidas nos clculos financeiros so:
PMT
PV
n
FV
i
=
=
=
=
=
Se uma das variveis no estiver preenchida o programa deve calcular seu valor.
Deve, tambm, refazer o clculo para a ltima alterao de uma das variveis. Deve prever
tambm uma funo para limpar tudo.
As frmulas a seguir so para pagamento no final do perodo de amortizao ou
capitalizao.
n1
FV
= PMT [ (1 + i )
i
PV
= PMT [ 1 (1 + i )
i
PMT = i . PV [ ( 1 + i )
]
n1
(1+ i )
n
= log (1 i PV
)
PMT_____
)
log (
1
1+i
O clculo da taxa ( i ) feito por interpolao, a partir de uma taxa inicial sugerida e
um intervalo para pesquisa da taxa aproximada.
Exemplo: Seja n = 12, PV = 1000 e PMT = 106,55
Usando a frmula para clculo de PV temos que encontrar duas taxas, uma acima e
outra abaixo da taxa procurada, que aproxime o valor de PV / PMT. Comeamos por uma
taxa que achamos ser prxima do valor procurado.
PV = [ 1 (1 + i ) n
PMT
i
No exemplo temos:
PV = 1000 = 9,38527
PMT
106,55
81
9,954
9,38527
8,86325
=
i 0,03
0,05 0,03
9,38527 9,954
8,86325 9,954
i = 4,04 %
Tabela de amortizao
Dado uma quantidade de perodos, uma dvida original e uma taxa de juros,
preencher a tabela de amortizao dessa dvida.
Perodo
1
2
t)
Capital
amortizado
(CA)
PMT J
Depreciao
Calcular a depreciao anual de um bem, dado o valor de compra e sua vida til,
para os seguintes mtodos: Linear, Progressiva, Soma dos dgitos.
Ex.: Calcular as depreciaes anuais de um bem comprado por $10.000, com vida
til de 10 anos.
Linear
Depreciao anual = Valor original = 10.000 = 1.000 por ano
Vida til
10
O valor da depreciao constante
82
Progressiva
O valor da depreciao de cada perodo obtido aplicando-se um fator sobre o valor
do bem no incio do perodo, j descontadas as depreciaes dos perodos anteriores. O
fator pode ser, por exemplo, 2 / Vida til = 2 / 10 = 0.2
Ano
1o
2o
3o
Depreciao
10.000 x 0.2 = 2.000
8.000 x 0.2 = 1.600
6.400 x 0.2 = 1.280
Depreciao
10.000 x 10 / 55 = 1.818,18
10.000 x 9 / 55 = 1.636,36
10.000 x 8 / 55 = 1.454,55
Domin
Criar uma lista com os valores das 28 peas do jogo de domin:
0 0, 0 1, 0 2, 0 3, 0 4, 0 5, 0 6, 1 1, 1 2, ..., 5 6, 6 6.
w)
Placas de automvel
Obter uma lista de placas de automvel, de acordo com a solicitao, por faixa, ou
por quantidade.
Este tipo de programa pode ser utilizado para emisso de etiquetas de placas em
despachantes, cdigos de contas correntes, nmeros de matrcula etc.
83
x)
(Malba Tahan, 1966) Dois nmeros inteiros e positivos so amigos entre si quando
a soma dos divisores prprios do primeiro nmero for igual ao segundo, e a soma dos
divisores prprios do segundo for igual ao primeiro. Dados dois nmeros, verificar se so
amigos entre si.
Ex.: 220 tem como divisores prprios: 1, 2, 4, 5 ,10, 11, 20, 22, 44, 55 e 110, cuja
soma 284
284 tem como divisores prprios: 1, 2, 4, 71, 142, cuja soma 220
Portanto, 220 e 284 so amigos entre si.
Verificar o programa para os nmeros (18416 e 17296 ) e ( 9.434.056 e 9.363.584).
Alguns nmeros so amigos de si prprio: 6 = 1 + 2 + 3; 28 = 1 + 2 + 4 + 7 + 14
y)
Planilha eletrnica
Criar uma lista com os cdigos de uma faixa de colunas de uma planilha eletrnica,
de AA at IV, ou seja: {AA, AB, AC, ...., AZ, BA, BB, BC, ..., IV)
z)
Gros de trigo
(Malba Tahan, 1966) Conta-se que um poderoso rei da ndia resolveu dar uma rica
recompensa ao inventor do jogo de xadrez, tal foi seu encanto pelo jogo. O inventor pediu
que o pagamento fosse feito em gros de trigo, um gro como prmio pela 1a casa, dois pela
2a , 4 pela 3a, e sempre assim, dobrando a cada casa, at a 64a.
Escrever um algoritmo para calcular a quantidade de gros, considerando que o
resultado, que possui 20 dgitos, no pode ser armazenado em uma nica varivel, por falta
de suporte para esta quantidade de dgitos (preciso).
84
REFERNCIAS E BIBLIOGRAFIA
BAASE, Sara, GELDER, Allen Van. Computer Algorithms: Introduction to Design and
Analysis. 3. ed., Addison-Wesley, 2000.
BARBOSA, Lisbete Madsen. Ensino de algoritmos em cursos de computao. Dissertao
de mestrado. PUC So Paulo. 1999.
BOYER, Carl. Histria da Matemtica. So Paulo: Edgar Blcher e Ed. da USP, 1974.
FARRER, H. et alli. Algoritmos estruturados. Rio de Janeiro: Ed. Guanabara, 1989.
GARDNER, Martin. Ah, Descobri!. Lisboa: Gadiva, 1990.
KNUTH, Donald E. The art of computer programming. Massachusetts: Addison-Wesley.
Volume 1 Fundamental Algorithms; Volume 3 Sorting and Searching. 1973.
LAWLOR, Robert. Geometria Sagrada. Madri: Edies del Prado, 1996.
MALBA TAHAN. Diabruras da Matemtica. 2.ed. So Paulo: Saraiva, 1966.
MEC/SESu/CEEInf Diretrizes Curriculares de Cursos da rea de Computao e
Informtica. Disponvel em http://www.mec.gov.br/sesu. Acesso em 30/01/2006.
OLIVEIRA, Ariovaldo Dias de. Notas de aula da disciplina de Algoritmos. Fundao Santo
Andr, 2005.
SALVETTI, Dirceu Douglas, BARBOSA, Lisbete Madsen. Algoritmos. So Paulo: Makron
Books, 1998.
SEBESTA, Robert W. Conceitos de linguagens de programao. 4. ed. Porto Alegre:
Bookman, 2000.
SETUBAL, Joo Carlos. Uma proposta de Plano Pedaggico para a matria de
Computao e Algoritmos, in. Qualidade de cursos de graduao da rea de Computao
e Informtica. SBC WEI 2000 Curitiba: Ed. Universitria Champagnat, 2000
TREMBLAY, J., BUNT, R. Introduo cincia dos computadores - Uma abordagem
algortmica. So Paulo: McGraw-Hill, 1983.
VELOSO, Paulo, et. alli . Estruturas de dados. Rio de Janeiro: Campus. 1983.
WIRTH, Niklaus. Programao sistemtica em Pascal. 6 ed. Rio de Janeiro:
Campus,1987.