apostila
259 pág.

apostila


DisciplinaAlgoritmos e Estrutura de Dados I674 materiais7.931 seguidores
Pré-visualização50 páginas
a 110 e os sala´rios variam de zero a 19.000,00 unidades
da moeda local (sala´rio do seu dirigente ma´ximo).
As faixas salariais de interesse sa\u2dco as seguintes:
\u2022 de 0 a 3 sala´rios m\u131´nimos
\u2022 de 4 a 9 sala´rios m\u131´nimos
\u2022 de 10 a 20 sala´rios m\u131´nimos
\u2022 acima de 20 sala´rios m\u131´nimos.
Sendo o sala´rio m\u131´nimo igual a 450,00 unidades da moeda local.
Fac¸a um programa em Pascal que leia o arquivo de entrada e produza como
sa´\u131da os percentuais da populac¸a\u2dco para cada faixa salarial de interesse.
29. Aqui temos uma forma peculiar de realizar uma multiplicac¸a\u2dco entre dois nu´meros:
multiplique o primeiro por 2 e divida o segundo por 2 ate´ que o primeiro seja
reduzido a 1. Toda vez que o primeiro for impar, lembre-se do segundo. Na\u2dco
considere qualquer frac¸a\u2dco durante o processo. O produto dos dois nu´meros e´
igual a soma dos nu´meros que foram lembrados. Exemplo: 53× 26 =
53 26 13 6 3 1
26 52 104 208 416 832
26 + 104 + 416 + 832 = 1378
Fac¸a uma func¸a\u2dco em Pascal que receba dois reais e retorne a multiplicac¸a\u2dco dos
dois, do modo como foi especificado acima. Na\u2dco e´ permitido uso de array.
30. Fac¸a um programa em Pascal que some duas horas. A entrada deve ser feita da
seguinte maneira:
12 52
7 13
A sa´\u131da deve ser assim:
12:52 + 7:13 = 20:05
Cap´\u131tulo 6
Te´cnicas elementares
O objetivo deste cap´\u131tulo e´ o dom\u131´nio por parte do estudante das principais estruturas
de controle de fluxo, em particular quando usadas de maneira combinada: atribuic¸a\u2dco;
entrada e sa´\u131da; desvio condicional e repetic¸a\u2dco, ale´m do uso de expresso\u2dces.
6.1 Atribuic¸o\u2dces dentro de repetic¸o\u2dces
Nesta sec¸a\u2dco veremos exemplos de problemas cujas soluc¸o\u2dces algor´\u131tmicas requerem o
uso de atribuic¸o\u2dces aninhadas em repetic¸o\u2dces.
6.1.1 Somando nu´meros
O problema abaixo servira´ para discutirmos va´rias maneiras de se resolver um mesmo
problema ate´ chegarmos na maneira mais elegante. Aproveitamos para discutir a
te´cnica dos acumuladores.
Problema: Ler 5 nu´meros positivos do teclado e imprimir a soma deles.
A primeira e mais simples soluc¸a\u2dco consiste em ler os 5 nu´meros do teclado e
em seguida imprimir a soma deles. O programa da figura 6.1 mostra o algoritmo
implementado para esta primeira proposta.
program soma valores ;
var
a1, a2, a3 , a4, a5: integer ;
begin
read (a1, a2, a3, a4, a5) ;
writeln (a1 + a2 + a3 + a4 + a5) ;
end.
Figura 6.1: Primeira soluc¸a\u2dco.
55
56 CAPI´TULO 6. TE´CNICAS ELEMENTARES
O programa funciona e atende ao requisitado no enunciado. Mas a soluc¸a\u2dco na\u2dco e´
boa. Imagine que fosse pedido a soma na\u2dco de 5 nu´meros, mas de 50. Para manter
a mesma ideia do algoritmo anterior, ter´\u131amos que escrever algo como ilustrado na
figura 6.2.
program soma valores 50 ;
var
a1, a2, a3 , a4, a5, a6, a7, a8 , a9, a10, a11, a12, a13, a14, a15, a16, a17,
a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32,
a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47,
a48, a49, a50: integer ;
begin
read (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28,
a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41,
a42, a43, a44, a45, a46, a47, a48, a49, a50) ;
writeln (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 +
a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21 + a22 + a23 +
a24 + a25 + a26 + a27 + a28 + a29 + a30 + a31 + a32 + a33 + a34 +
a35 + a36 + a37 + a38 + a39 + a40 + a41 + a42 + a43 + a44 + a45 +
a46 + a47 + a48 + a49 + a50) ;
end.
Figura 6.2: Imprimindo a soma de 50 nu´meros lidos no teclado.
E´ o´bvio que esta te´cnica na\u2dco e´ adequada. Ale´m disto, so´ pode ser usada quando
se sabe quantos nu´meros sera\u2dco fornecidos. Para o problema abaixo, o algoritmo na\u2dco
pode ser usado.
Problema: Ler uma seque\u2c6ncia de nu´meros positivos do teclado e imprimir a soma
deles. O programa deve terminar quando o nu´mero lido do teclado for zero.
Como usar uma varia´vel para cada valor lido? Uma vez que na\u2dco se sabe, a
princ´\u131pio, quantos nu´meros sera\u2dco digitados, na\u2dco ha´ como fazer isto. Logo, a te´cnica
de soluc¸a\u2dco na\u2dco pode ser esta.
O algoritmo apresentado na figura 6.3 faz uso de uma te´cnica elementar em pro-
gramac¸a\u2dco que e´ o uso de acumuladores.
Conve´m observar que a parte do algoritmo relativa a entrada de dados controlada
pelo lac¸o ja´ foi estudada no cap´\u131tulo anterior. Desta forma, se eliminarmos todas
as linhas que conte´m a varia´vel soma o que teremos e´ um programa que le\u2c6 va´rios
nu´meros do teclado ate´ que seja lido um zero. O programa na\u2dco faria nada com os
nu´meros lidos.
Usa-se uma varia´vel (soma) cujo papel e´ acumular valores, isto e´, a varia´vel e´
inicializada com um valor nulo e na seque\u2c6ncia, ela e´ atualizada para os outros valores
a` medida em que eles sa\u2dco lidos do teclado.
A inicializac¸a\u2dco do acumulador com o valor zero deve-se ao fato deste ser o elemento
6.2. DESVIOS CONDICIONAIS ANINHADOS 57
neutro da adic¸a\u2dco. Se fosse uma multiplicac¸a\u2dco de va´rios nu´meros, o acumulador deveria
ser inicializado com o elemento neutro da multiplicac¸a\u2dco, isto e´, o 1.
program soma valores ;
var
numero, soma: integer ;
begin
soma:= 0; (\u2217 inicializa o acumulador \u2217)
read (numero) ;
while numero <> 0 do
begin
soma:= soma + numero; (\u2217 atualiza o acumulador \u2217)
read (numero) ;
end;
end.
Figura 6.3: Te´cnica do acumulador.
Na figura 6.4 mostra-se como resolver o problema inicial usando a te´cnica dos
acumuladores. Notem que a soluc¸a\u2dco explora um comando de atribuic¸a\u2dco sob o escopo
de um comando de repetic¸a\u2dco.
Trocando-se o valor da constante MAX de 5 para 50, tem-se a soluc¸a\u2dco para o
problema 2. E´ fa´cil perceber que esta maneira e´ gene´rica, resolve problemas similares
para qualquer tamanho de entrada, bastando-se trocar o valor da constante MAX.
program soma valores ;
const max=5;
var
numero, i , soma: integer ;
begin
soma:= 0;
i:= 1;
while i <= max do
begin
read (numero) ;
soma:= soma + numero;
end;
end.
Figura 6.4: Soluc¸a\u2dco para o primeiro problema com acumuladores.
6.2 Desvios condicionais aninhados
O problema a seguir nos permitira´ apresentar um algoritmo que o resolve de maneira
elegante atrave´s do uso de estruturas contendo aninhamentos de desvios condicionais.
58 CAPI´TULO 6. TE´CNICAS ELEMENTARES
6.2.1 O menor de tre\u2c6s
Problema: Apo´s ler tre\u2c6s nu´meros no teclado, imprimir o menor deles.
A soluc¸a\u2dco para este problema (figura 6.5) envolve uma se´rie de tomada de deciso\u2dces
com diversos fluxos alternativos de co´digo.
Quando um comando esta´ sob o controle de outro, diz-se que o comando mais
interno esta´ sob o escopo do mais externo. Neste caso, vamos usar um desvio condici-
onal que controla outro. No jarga\u2dco dos programadores, se diz que os comandos nesta
forma esta\u2dco aninhados.
program imprime menor;
var
a, b, c : integer ;
begin
write(\u2019entre com tres numeros inteiros: \u2019) ;
read(a , b, c) ;
i f a < b then
if a < c then
writeln (\u2019o menor dos tres eh \u2019 ,a)
else
writeln (\u2019o menor dos tres eh \u2019 ,c)
else
if b < c then
writeln (\u2019o menor dos tres eh \u2019 ,b)
else
writeln (\u2019o menor dos tres eh \u2019 ,c)
end.
Figura 6.5: Imprimir o menor dentre 3 nu´meros lidos.
6.3 Desvios condicionais dentro de repetic¸o\u2dces
Nesta sec¸a\u2dco veremos exemplos de problemas cujas soluc¸o\u2dces algor´\u131tmicas requerem o
uso de atribuic¸o\u2dces aninhadas em repetic¸o\u2dces.
6.3.1 Imprimir apenas nu´meros positivos
Neste problema estudaremos como aninhar um comando de desvio condicional dentro
do escopo de um comando de repetic¸a\u2dco. Tambe´m aproveitaremos para iniciar o estudo
sobre como pensar no problema global e nos poss´\u131veis subproblemas existentes.
Problema: Ler do teclado 30 nu´meros inteiros e imprimir na tela aqueles que sa\u2dco
6.3. DESVIOS CONDICIONAIS