apostila
259 pág.

apostila


DisciplinaAlgoritmos e Estrutura de Dados I674 materiais7.931 seguidores
Pré-visualização50 páginas
DENTRO DE REPETIC¸O\u2dcES 59
positivos, ignorando os negativos ou nulos.
Se o enunciado fosse simplesmente para ler e imprimir 30 nu´meros, como far´\u131amos?
Provavelmente como ilustrado na figura 6.6. Observamos que este problema e´ muito
similar a outros ja´ estudados no cap´\u131tulo anterior. Trata-se de um lac¸o que precisa de
um contador para se determinar a sa´\u131da.
program lereimprimir ;
var i , a : integer ; (\u2217 i serve para contar quantos numeros foram lidos \u2217)
begin
i := 1;
while i <= 30 do
begin
read (a) ;
writeln (a) ;
i := i + 1;
end;
end.
Figura 6.6: Lendo e imprimindo 30 nu´meros.
O problema e´ que na\u2dco queremos imprimir todos os nu´meros lidos, mas apenas
aqueles que sa\u2dco positivos: se o nu´mero lido for positivo, enta\u2dco queremos imprimir,
sena\u2dco na\u2dco. Conforme ja´ visto, o comando if faz exatamente isto, testa uma expressa\u2dco
booleana que, caso satisfeita, executa o comando subsequente, sena\u2dco o pula, passando
diretamente para o seguinte, tal como ilustrado na figura 6.7.
program lereimprimir ;
var i , a : integer ;
begin
i := 1;
while i <= 30 do
begin
read (a) ;
i f a > 0 then
writeln (a) ; (\u2217 so eh executado quando a eh positivo \u2217)
i := i + 1;
end;
end.
Figura 6.7: Lendo e imprimindo os positivos apenas.
Relembrando, o comando de desvio condicional tambe´m permite executar exclu-
sivamente uma ac¸a\u2dco alternativa, caso o teste da expressa\u2dco booleana resulte em falso.
Por exemplo, se o enunciado fosse \u201cler 30 nu´meros e imprimir os que sa\u2dco pares mas
imprimir o quadrado dos que na\u2dco sa\u2dco, incluindo o zero\u201d.
60 CAPI´TULO 6. TE´CNICAS ELEMENTARES
Do ponto de vista lo´gico, seria o mesmo que dizer o seguinte: \u201cse o nu´mero lido for
positivo, imprim\u131´-lo, caso contra´rio ele e´ zero ou negativo, enta\u2dco imprimir o quadrado
dele\u201d. Isto pode ser visto na figura 6.8. Destacamos mais uma vez que a estrutura
de controle do lac¸o na\u2dco mudou, apenas os comandos que sa\u2dco executados no lac¸o
mudaram, caracterizando-se dois subproblemas: um para controlar o lac¸o, outro para
se decidir se o nu´mero e´ positivo ou na\u2dco e o que fazer com ele.
program lereimprimir ;
var i , a : integer ;
begin
i := 1;
while i <= 30 do
begin
read (a) ;
i f a > 0 then
writeln (a) (\u2217 so eh executado quando a for positivo \u2217)
else
writeln (a\u2217a) ; (\u2217 so eh executado quando a <= 0 \u2217)
i := i + 1;
end;
end.
Figura 6.8: Lendo e imprimindo os positivos e os quadrados dos \u131´mpares.
Agora, o comando que imprime a so´ e´ executado quando a > 0. Se isto na\u2dco for
verdade, o que e´ impresso e´ o quadrado de a. Em ambos os casos o valor de i e´
incrementado.
Este u´ltimo programa pode facilmente ser modificado para se resolver o problema
de se contar quantos nu´meros lidos sa\u2dco positivos e quantos na\u2dco sa\u2dco. Basta, ao inve´s
de imprimir, contar, ou em outras palavras, acumular.
Para isto sa\u2dco necessa´rias duas varia´veis adicionais, que iniciam em zero e que sa\u2dco
incrementadas a cada vez que um nu´mero e´ identificado como positivo ou na\u2dco. Esta
ideia pode ser vista na figura 6.9. Importante notar a similaridade das duas soluc¸o\u2dces.
Os problemas sa\u2dco ligeiramente diferentes, eles diferem em um dos subproblemas ape-
nas: um deve imprimir, o outro deve acumular. Os outros problemas tais como o
controle do lac¸o e a leitura dos dados sa\u2dco exatamente os mesmos problemas.
Podemos usar o mesmo racioc´\u131nio para resolver toda uma classe de problemas
similares, isto e´, imprimir a soma de nu´meros que satisfazem alguma propriedade.
No caso do problema anterior, a propriedade era \u201cser negativo\u201d ou \u201cser positivo\u201d.
Mas poderia ser qualquer outra coisa, como por exemplo \u201cser diferente de zero\u201d, \u201cser
primo\u201d, \u201cser mu´ltiplo de 50\u201d ou algo mais complexo como \u201cter saldo positivo nos
u´ltimos 12 meses e na\u2dco estar devendo para o imposto de renda\u201d.
Vejamos um problema similar para uma propriedade simples, cuja soluc¸a\u2dco pode
ser facilmente adaptada do algoritmo anterior.
6.3. DESVIOS CONDICIONAIS DENTRO DE REPETIC¸O\u2dcES 61
program contar ;
var i , (\u2217 serve para contar ate 30 \u2217)
conta positivos , (\u2217 serve para contar os positivos \u2217)
conta outros , (\u2217 serve para contar os nao positivos \u2217)
a: integer ; (\u2217 numeros lidos na entrada \u2217)
begin
conta positivos:= 0; (\u2217 eh preciso inicializar a variavel \u2217)
conta outros:= 0;
i := 1;
while i <= 30 do
begin
read (a) ;
i f a > 0 then
conta positivos:= conta positivos + 1
else
conta outros:= conta outros + 1;
i:= i + 1;
end;
writeln (\u2019A quantidade de positivos lidos eh \u2019 , conta positivos) ;
writeln (\u2019A quantidade de nao positivos lidos eh \u2019 , conta outros) ;
end.
Figura 6.9: Contando os positivos e os negativos e nulos.
6.3.2 Somando pares e \u131´mpares
Problema: Ler uma seque\u2c6ncia de nu´meros e imprimir separadamente a soma dos
que sa\u2dco pares e a soma dos que sa\u2dco \u131´mpares. O programa deve terminar quando o
nu´mero lido for o zero. Este u´ltimo nu´mero tambe´m deve ser ignorado.
No programa ilustrado na figura 6.10, basicamente foi colocado no lugar do if
x > 0 then a traduc¸a\u2dco da expressa\u2dco if \u201cx e´ par\u201d then, traduc¸a\u2dco esta que envolve o uso
da operac¸a\u2dco de resto de divisa\u2dco inteira. Todo nu´mero que, dividido por 2, resulta em
resto 0 so´ pode ser par. Caso contra´rio e´ \u131´mpar. Tambe´m foi feita uma mudanc¸a no
nome das varia´veis para facilitar a compreensa\u2dco do co´digo.
A propriedade pode ser ta\u2dco complexa quanto se queira, mas e´ importante observar
que o co´digo de base na\u2dco muda muito. Observe que ha´ uma leitura, o teste, algum
processamento e, por u´ltimo, a leitura do pro´ximo valor, repetindo-se o co´digo.
Problema: Ler nu´meros do teclado, ate´ ler um zero, e imprimir apenas os que sa\u2dco
ao mesmo tempo mu´ltiplos de 7 mas na\u2dco sa\u2dco mu´ltiplos de 2.
Soluc¸a\u2dco similar (apresentada na figura 6.11). Um lac¸o controla o te´rmino da
repetic¸a\u2dco, e um desvio condicional verifica a propriedade e algum co´digo e´ executado
em seguida (no caso uma simples impressa\u2dco na tela).
62 CAPI´TULO 6. TE´CNICAS ELEMENTARES
program somapareseimpares ;
var x, somapares , somaimpares: integer ;
begin
somapares:= 0;
somaimpares:= 0;
read (x) ;
while x <> 0 do
begin
if x mod 2 = 0 then (\u2217 verdadeiro quando x eh par \u2217)
somapares:= somapares + x
else
somaimpares:= somaimpares + x;
read (x) ;
end;
writeln (somapares , somaimpares) ;
end.
Figura 6.10: Soma pares e \u131´mpares.
program somaquadradosperfeitos ;
var a: integer ;
begin
read (a) ;
while a <> 0 do
begin
if (a mod 7 = 0) AND (a mod 2 <> 0) then
writeln (a) ;
read (a) ;
end;
end.
Figura 6.11: Imprime os mu´ltiplos de 7 que na\u2dco sa\u2dco mu´ltiplos de 2.
Um terceiro problema similar e´ apresentado a seguir.
Problema: Ler nu´meros do teclado, ate´ ler um zero, e imprimir apenas os que forem
mu´ltiplos de 3 maiores do que 50 e menores ou iguais a 201.
Novamente, mesmo racioc´\u131nio (soluc¸a\u2dco na figura 6.12). Apenas a propriedade a
ser satisfeita e´ mais complexa, envolve uma expressa\u2dco booleana contendo conectivos
de conjunc¸a\u2dco. E´ importante para o estudante comparar os tre\u2c6s u´ltimos co´digos e
perceber a enorme similaridade entre eles.
6.3.3 Convertendo para bina´rio
Este problema e´ um desafio que pode ser resolvido com a mesma ideia de se aninhar
um desvio condicional sob o escopo de uma repetic¸a\u2dco, combinada com o uso dos
6.3. DESVIOS CONDICIONAIS DENTRO DE REPETIC¸O\u2dcES 63
program somaquadradosperfeitos ;
var a: integer ;
begin
read (a) ;
while a <> 0 do
begin
if (a mod 3 = 0) AND (a > 50) AND (a <= 201) then
writeln (a) ;
read (a) ;
end;
end.
Figura 6.12: Imprime os mu´ltiplos de 3 lidos entre 51 e 201.
acumuladores.
Problema: Dado um nu´mero inteiro entre 0 e 255 imprimir este nu´mero em seu
formato bina´rio.
Este e´ um exemplo cla´ssico em que o estudante esquece da teoria. Tradicional-
mente, o professor apresenta a definic¸a\u2dco de nu´meros bina´rios,