Académique Documents
Professionnel Documents
Culture Documents
Comandos de Repetio
No mundo real, comum a repetio de procedimentos para se realizar tarefas. Esses procedimentos no so repetidos eternamente, mas se encerram quando o objetivo atingido. Por exemplo, quando uma pessoa aperta um parafuso, ela gira a chave de fenda uma vez, duas vezes etc. at que o parafuso esteja apertado o suficiente. Durante esse processo, verificado, a cada volta, se o parafuso j est bem firme. Da mesma forma, podemos estruturar vrias atividades dirias como repetitivas. Durante a chamada feita por um professor, por exemplo, ele chama os nomes enquanto no terminar a lista. Outras repeties podem ser quantificadas com antecedncia. O aluno de castigo que precisa escrever 100 vezes no quadro negro: No vou fazer baguna nunca mais, executa a mesma instruo 100 vezes. Todas as repeties tm uma caracterstica comum: o fato de haver uma verificao de condio que pode ser representada por um valor lgico, para determinar se a repetio prossegue ou no. Essa a base para a implementao dos comandos de repetio em algoritmos. Em vez de fazermos um trabalho braal, escrevendo a mesma instruo vrias vezes, poderemos utilizar uma estrutura que indique que tal instruo ser executada quantas vezes for necessria.
60
61
feche as portas,
Na descida: desce cada andar, verificando se est em um andar selecionado dentro ou fora do elevador. Isso feito at chegar ao andar mais baixo selecionado dentro ou fora do elevador
enquanto no chegar ao andar mais baixo selecionado interna/externamente faa incio desa um andar, se o andar foi selecionado interna/externamente ento incio pare, abra as portas, feche as portas, fim fim
O comando enquanto caracteriza-se por uma verificao de encerramento de atividades antes de se iniciar (ou reiniciar) a execuo de seu bloco de instrues. Dessa forma, no algoritmo do elevador, antes de subir/descer um andar verificado se o andar atual o mais alto/baixo selecionado. Caso no seja, um conjunto de atividades executado (sobe/desce um andar, verifica se um andar selecionado e abre (ou no) as portas). Vejamos sua sintaxe:
enquanto <valor booleano> faa <continuao do algoritmo> <bloco de instrues>
Voltemos ao exemplo do aluno de castigo. Fazer um algoritmo que escrevesse para ele, cem vezes, No vou fazer mais baguna, antes deste captulo, seria uma tarefa inglria. O algoritmo seria semelhante ao descrito a seguir. Algoritmo Lio_Aluno_Verso1
incio escreva(No escreva(No escreva(No escreva(No ... fim vou vou vou vou fazer fazer fazer fazer mais mais mais mais baguna!); baguna!); baguna!); baguna!);
62
Algoritmos e Programao
Para que possamos utilizar o comando de repetio, precisaremos verificar, de alguma forma, se o comando j foi executado 100 vezes.
enquanto <no foi executado 100 vezes o prximo bloco > faa escreva(No vou fazer mais baguna!);
Bem, o problema reside em implementar essa verificao. Uma estratgia muito comum para esse tipo de situao acompanhar a execuo das repeties contando cada vez que o bloco executado. Cada execuo do bloco de instrues chamada iterao. O prprio comando de repetio em conjunto com seu bloco de instrues conhecido como loop ou lao. Para que tenhamos a informao de quantas iteraes j foram realizadas no lao, necessitaremos de uma varivel que far o papel de contador. Essa varivel conter o nmero de iteraes j realizadas, sendo atualizada a cada nova iterao.
4.1.1 Problema 11 Escrever 100 vezes "No vou fazer mais baguna"
Faa um algoritmo que escreva 100 vezes o texto: No vou fazer mais baguna, utilizando um comando de repetio. Algoritmo Lio_Aluno_Verso2
var contador: inteiro; incio contador 0; incio { Nenhuma iterao foi feita at aqui } { O bloco ser repetido 100 vezes }
fim fim
contador contador + 1;
1 2 3
enquanto (contador < 100) faa { O bloco ser repetido 100 vezes }
63
4 5 6 7
fim
contador contador + 1;
8 9 10
fim
escreva(Soma: , soma);
escreva(Mdia: , mdia);
interessante verificar o processo de acumulao de valores feito na varivel soma (linha 6). Seu valor atualizado a cada iterao, somando-se seu valor atual com o novo valor lido. Para que isso funcione, importante que o valor inicial da varivel seja definido antes da entrada do lao, para que um valor desconhecido no seja atribudo na primeira iterao do lao. Vejamos o teste de mesa para a melhor compreenso do processo. Para viabilizar a realizao do teste de mesa, consideremos o lao at 3 e no at 100, como est no algoritmo (Tabela 4.1). Entrada: 5, 4, 9 (ou seja, os valores que sero entrados pelo usurio sero 5, 4 e 9, nesta seqncia).
64
Algoritmos e Programao
Note que a condio de entrada/sada do lao est na linha 3. Esse teste executado nas instrues 3, 8, 13 e 18. Perceba tambm que o teste repetido sempre aps o bloco de instrues (linha 7) pertencente ao lao. Quando a condio verdadeira, a instruo a ser executada a do incio do bloco, na linha 4 (instrues 4, 9 e 14). Porm, na instruo 18, a condio falsa (no nosso teste, estamos considerando enquanto contador < 3) e a prxima instruo a ser executada (instruo 19) est na linha 8, aps o bloco de instrues pertencente ao comando enquanto.
Exerccio proposto
1. Adapte o algoritmo Soma_Mdia100 para que o nmero de valores a ser computado
seja determinado a partir de uma varivel de entrada e no como um valor fixo no programa, como fora definido.
1 2 3 4 5 6 7 8 9
escreva(Entre com o primeiro valor: ); leia(operando1); leia(operando2); incio escreva(Entre com o segundo valor: ); enquanto (contador < operando2) faa
resultado 0;
10
fim
Exerccios propostos
1. Faa trs testes de mesa para o algoritmo anterior com as seguintes entradas: 0, 3; 3, 6 e 6, 3.
65
2. Se voc fez o exerccio anterior, pode notar que o nmero de instrues a serem executadas para a segunda e a terceira entrada diferente, apesar de o resultado ser o mesmo. Isso porque sempre o operando1 ser somado e o operando2 determinar quantas vezes o lao ser repetido. Melhore o algoritmo para que o valor maior seja somado e o valor menor seja o determinante para o controle do lao, garantindo assim que o menor nmero de instrues seja executado para qualquer entrada, independentemente de sua ordem.
66
Algoritmos e Programao
Note que o valor inicial de fat 1 e no 0, como se poderia imaginar. Isso porque o elemento neutro na multiplicao o 1 e no o 0, como na adio, ou seja, qualquer nmero multiplicado por 1 ele prprio, assim como acontece com o 0 em relao adio. O fatorial de 1 ou 0 calculado implicitamente, j que nesses casos o lao no executado, pois a condio de controle do lao (n > 1) no satisfeita nenhuma vez e o valor do fatorial permanece em 1, como esperado. Esta situao ilustra o fato de que o bloco de instrues pertencente ao lao pode no ser executado nenhuma vez, caso a condio de controle no seja satisfeita na primeira passagem.
Exerccio proposto
1. Faa dois testes de mesa referentes ao algoritmo Fatorial para o clculo do fatorial dos nmeros 1 e 5.
{ Fim do bloco se }
incio
incio fim
seno
67
....
....
<continuao do algoritmo>
Na estrutura anterior temos comandos de deciso aninhados a comandos de repetio e vice-versa. Esse tipo de estrutura extremamente til para resolver problemas em diversas situaes. Vejamos a seguir alguns exemplos.
Como o algoritmo solicita a soma dos valores mpares dentro de uma faixa, teremos que fazer o acmulo do resultado apenas quando a condio mpar for atendida. Essa condio ser testada para todos os nmeros dentro da faixa, por meio de um lao. Algoritmo Soma_mpares_Verso1
var inferior, superior, num, soma: inteiro; incio soma 0;
escreva(Entre com o limite inferior: ); leia(inferior); leia(superior); escreva(Entre com o limite superior: );
enquanto (num <= superior) faa se (num resto 2 = 1) ento num num + 1; soma soma + num;
fim fim
escreva(Somatrio: , soma);
68
Algoritmos e Programao
Exerccios propostos
1. Faa o teste de mesa com intervalo definido entre 4 e 13. 2. Adapte o algoritmo Soma_mpares_Verso1 para obrigar o usurio a entrar com um valor para o limite inferior menor que o valor definido para o limite superior. Para isso, faa um lao que garanta a entrada de um intervalo vlido (inferior < superior). 3. Adapte o algoritmo Soma_mpares_Verso1. Substitua o teste em que verificamos se o nmero mpar dentro do lao para, ento, acumul-lo varivel soma pela seqncia: a. Faa um nico teste antes do lao. b. Determine se o nmero mpar e considere como limite inferior o prximo mpar (ou o prprio nmero caso este seja mpar). c. Faa o lao aumentando 2 a 2 seu valor para que apenas os nmeros mpares sejam calculados, sem a necessidade de novas verificaes. 4. Faa o teste de mesa dos algoritmo Soma_mpares_Verso1 adaptado no exerccio proposto 3, considerando os limites 4 e 13. Compare o nmero de instrues executadas com o teste de mesa do algoritmo Soma_mpares_Verso1 (visto no exerccio 1).
69
divisor divisor 1;
Apesar de o algoritmo Primo_Verso1 ser eficaz, visto que resolve o problema para o qual foi projetado, no se pode dizer que seja propriamente eficiente. Basta que analisemos com um pouco mais de profundidade que perceberemos que vrias otimizaes podem ser aplicadas ao raciocnio utilizado nesse algoritmo. Vejamos: 1. Nmeros pares (com exceo do 2) no podem ser primos, visto que so divisveis por 2. Se um nmero no for divisvel por 2, no ser divisvel por nenhum outro nmero par. Portanto, com exceo do nmero 2, s precisaremos testar nmeros mpares. 2. mais fcil que um nmero seja divisvel por um nmero pequeno do que por um nmero maior. Portanto, se iniciarmos a procura do divisor de baixo para cima, ao invs de cima para baixo, como foi implementado, teremos chance de encontrar o nmero muito antes. 3. Nenhum nmero pode ser divisvel por outro nmero maior que a metade dele. Portanto, no precisamos testar a divisibilidade dos nmero na faixa entre a metade e o prprio nmero. Se levarmos em conta tais consideraes, teremos um algoritmo muito mais eficiente que o anterior, pois executar muito menos instrues para responder a mesma questo. Algoritmo Primo_Verso2
var nmero, divisor: inteiro; incio divisvel: booleano;
leia(nmero);
70
incio se (nmero resto divisor = 0) ento seno fim divisvel V;
Algoritmos e Programao
divisor divisor + 2;
Um raciocnio mais sofisticado pode ainda nos dar uma otimizao final. Vejamos alguns exemplos para facilitar a compreenso deste ponto: 15 divisvel pelos nmeros 1, 3, 5 e 15 (1 * 15, 3 * 5, 5 * 3 e 15 * 1). 16 divisvel pelos nmeros 1, 2, 4, 8 e 16 (1 * 16, 2 * 8, 4 * 4, 8 * 2 e 16 * 1). 17 divisvel pelos nmeros 1 e 17 (1 * 17, e 17 * 1). 20 divisvel pelos nmeros 1, 2, 4, 5, 10 e 20 (1 * 20, 2 * 10, 4 * 5, 5 * 4, 10 * 2 e 20 * 1). 25 divisvel pelo nmeros 1, 5 e 25 (1 * 25, 5 * 5 e 25 * 1). 36 divisvel pelo nmeros 1, 2, 3, 4, 6, 9, 12, 18 e 36 (1 * 36, 2 * 18, 3 * 12, 4 * 9, 6 * 6, 9 * 4, 12 * 3, 18 * 2 e 36 * 1). Os exemplos anteriores so para ilustrar a seguinte propriedade da divisibilidade de um nmero: qualquer nmero que seja divisvel por outro ter como divisores dois nmeros ou fatores, e um ser maior que o outro, a no ser que tais nmeros sejam iguais (quando o nmero tem uma raiz quadrada exata). No caso de divisores diferentes, o nmero menor sempre ser menor que a raiz quadrada do resultado da multiplicao e o nmero maior, maior que a raiz quadrada do nmero em questo. Podemos perceber que quanto maior um dos fatores, menor o outro. A relao se inverte aps a linha da raiz quadrada, quando os nmeros se repetem em ordem inversa. Podemos, ento, concluir que se um nmero no for divisvel por um nmero menor ou igual sua raiz quadrada, no ter outro divisor que no ele prprio ou o 1. Ou seja, ser um nmero primo. Portanto, s precisamos testar a divisibilidade de um nmero por valores iguais ou inferiores sua raiz quadrada. Adaptando o algoritmo, teremos o que se v no exemplo a seguir. Algoritmo Primo_Verso3
var nmero, divisor: inteiro; divisvel: booleano;
71
Exerccio proposto
1. Faa dois testes de mesa referentes aos trs algoritmos que identificam um nmero primo. Verifique as seguintes entradas: 15 e 29. Verifique qual o nmero de instrues necessrio executar em cada uma delas e veja a diferena entre suas execues.
72
Algoritmos e Programao
De fato, podemos ter tantos laos encadeados quanto precisarmos. E ainda podemos t-los combinados com comandos de deciso e assim por diante. At agora, usamos os laos para fazer operaes sobre um conjunto de elementos. Por exemplo, no caso da soma dos nmeros primos, tnhamos que executar um bloco de condio para cada possvel divisor do nmero em questo. No caso da soma de 100 nmeros, os nmeros entrados eram acumulados dentro do lao, repetindo-se o processo para cada nmero. A utilizao de laos encadeados pode ser necessria quando precisamos fazer uma operao repetitiva para cada elemento dentro de um conjunto. Imaginemos que precisssemos calcular a mdia das notas de uma classe. At a, um nico lao seria suficiente. Porm, imaginemos agora que precisssemos calcular a mdia das notas de todas as turmas de uma escola. As turmas so um conjunto. As notas dos alunos dentro de cada turma so outro conjunto. Para cada conjunto, precisaramos de um lao, nesse caso, dois laos encadeados. E se precisssemos ainda fazer o clculo para todas as escolas de uma cidade. Nesse caso precisaramos de trs laos encadeados (escolas/turmas/alunos).
1 2 3 4 5 6 7
escreva(Entre com o nmero de alunos); leia(alunos); incio enquanto (cont < alunos) faa
73
10 11
fim
Agora, vamos resolver o que seria o clculo das mdias de uma escola, considerando que temos as mdias de cada turma j preparadas pelo usurio. Algoritmo Mdia_Escola_Verso1
var cont, turmas: inteiro; incio mdia_turma, soma, mdia_escola: real; cont 0; soma 0; { Nenhuma iterao foi feita at aqui }
1 2 3 4 5 6 7 8 9
escreva(Entre com o nmero de turmas: ); leia(turmas); incio enquanto (cont < turmas) faa
fim
10 11
fim
Bem, resolvemos as duas partes do algoritmo. Entretanto, a parte da mdia das escolas conta com uma situao que no temos: a mdia de cada turma no conhecida de antemo pelo usurios, a no ser que estes executassem o primeiro algoritmo, anotassem num papel o resultado de cada turma e executassem o segundo algoritmo para passar esses valores. claro que esta soluo no razovel. De fato, o que precisa ser feito substituir o trecho do segundo algoritmo em que o usurio entra com as mdias das turmas pelo primeiro algoritmo, que quem calcula a mdia de cada turma. Ateno especial deve ser dada ao possvel conflito de variveis. Por exemplo, os contadores utilizados nos dois algoritmos tratam de elementos diferentes (alunos e turmas, respectivamente) e devem ser tratados como variveis independentes. Algoritmo Mdia_Escola_Verso2
var cont_a, alunos, cont_t, turmas: inteiro; nota, mdia_turma, soma_turma, mdia_escola, soma_escola: real;
74
incio
Algoritmos e Programao
1 2 3 4 5 6 7 8 9 10 11 12 13 14
cont_t 0;
escreva(Entre com o nmero de turmas: ); leia(turmas); incio enquanto (cont_t < turmas) faa { Ser repetido para cada turma da escola } cont_a 0; { O lao interno, da turma, em que cada aluno ser contado } soma_turma 0; leia(alunos); incio escreva(Entre com o nmero de alunos da turma , cont_t + 1); enquanto (cont_a < alunos) faa { Ser repetido p/ cada aluno da turma } escreva(Entre com a nota do aluno: , cont_a + 1); soma_turma soma_turma + nota; cont_a cont_a + 1;
soma_escola 0;
leia(nota);
fim
15 16 17 18
fim
escreva(A mdia da turma , cont_t + 1, : , mdia_turma); soma_escola soma_escola + mdia_turma; cont_t cont_t + 1; { A cada iterao, mais uma turma }
19 20
fim
Para facilitar o teste, acompanhemos o teste de mesa considerando uma escola com duas turmas com 3 e 2 alunos cada uma (Tabela 4.2).
cont_t turmas
0 0 0 0 0 0 0 {0} 0 0 0 0 0 ? ? ? [2] 2 2 2 2 2 2 2 2 2
mdia_ turma
? ? ? ? ? ? ? ? ? ? ? ? ?
soma_ escola
? 0 0 0 0 0 0 0 0 0 0 0 0
10 11 12 13
75
cont_t turmas
0 0 0 0 0 0 0 0 0 0 0 0 0 {0} 0 1 1 1 1 {1} 1 1 1 1 1 1 1 1 1 1 1 1 1 {1} 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
mdia_ turma
? ? ? ? ? ? ? ? ? ? ? ? 6 {6} 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8,5 {8,5} 8,5 8,5 8,5 8,5 8,5
soma_ escola
0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 14,5 14,5 14,5 14,5 14,5
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
76
Algoritmos e Programao
As linhas identificadas com E so relativas ao lao externo e as marcadas com I so relativas ao lao interno. Note que o nmero de instrues executadas bastante grande. Isto ocorre em virtude do encadeamento dos laos, mesmo tendo usado entradas pequenas (duas turmas com 3 e 2 alunos). Os custos computacionais de laos encadeados no desempenho de algoritmos sero analisados com mais detalhes no captulo 12.
Exerccio proposto
1. Faa um algoritmo que calcule a mdia de todas as escolas de uma cidade. Cada escola tem diversas turmas. Considere como entrada o nmero de escolas, o nmero de turmas de cada escola e o nmero de alunos de cada turma. A mdia de cada escola deve ser apresentada, alm da mdia geral, que ser o resultado da mdia de todas as escolas da cidade.
<continuao do algoritmo>
Assim, podemos utilizar o comando repita sempre que tivermos certeza de que o bloco de instrues ser executado ao menos uma vez, sem a necessidade do teste na entrada do bloco. Vejamos um exemplo:
1 2 3 4
soma 0;
77
5 6 7
fim
8 9
fim
Pelo exemplo, podemos perceber que a condio do lao at (num > superior) diferente da similar no comando enquanto implementada no problema 15, enquanto (num <= superior). Isso ocorre porque, ao contrrio do comando enquanto, a sada de um lao repita ocorre quando a condio booleana se torna verdadeira. Nos laos enquanto, a sada do lao s ocorre quando a condio se torna falsa. Vejamos o teste de mesa considerando o limite superior como 4 (Tabela 4.3).
Notemos que a linha do comando repita no registrada na execuo. Isso ocorre porque na realidade o que executado apenas o teste de controle e o desvio do fluxo do algoritmo dependendo do resultado do teste.
78
Algoritmos e Programao
Exerccios propostos
1. Faa a multiplicao apenas por meio de somas (utilize o comando repita). 2. Faa um algoritmo que determine se um nmero primo (utilize o comando repita).
escreva(Entre com o limite superior: ); leia(superior); { Situao inicial, ou preparao para a entrada no lao } { Teste de entrada/sada }
num 1; incio
enquanto (num <= superior) faa se (num resto 2 > 0) ento num num + 1; soma soma + num;
{ Instruo utilizada para que a condio de controle seja atingida } fim fim
O comando para procura resumir essas trs caractersticas comuns maioria das implementaes de laos em uma s instruo, facilitando assim a construo tpica de laos. A sintaxe do comando para:
para (<instruo1 de preparao> [, <instruo2 de preparao> ...]; <condio1 de controle>[, <condio 2 de controle>...]; <passo para alcance da condio>) faa <continuao do algoritmo> <bloco de instrues>
79
Vale citar que, quando temos mais de uma instruo de preparao (primeira clusula), estas so separadas por vrgula e executadas na ordem em que se encontram no comando. Quando temos mais de uma condio de controle (segunda clusula), os testes tambm so realizados em ordem, e a condio toda Verdadeira apenas se todas as condies o forem. Ou seja, equivalente a uma condio lgica ligada pelo conectivo e. No h como representar composio de condies ou no comando para. Nesse caso, deve-se obrigatoriamente fazer uso dos comandos enquanto ou repita. Algumas linguagens de programao no implementam explicitamente a terceira clusula (passo), e esta tem, nesses casos, um comportamento implcito sempre igual. No caso da linguagem Pascal, por exemplo, o passo sempre o incremento/decremento em 1 varivel preparada na primeira clusula. Nesses casos, em geral, o para usado quase que exclusivamente em algoritmos com contadores. J a linguagem de programao C implementa todas as clusulas do comando para. O comando para executado da seguinte maneira: 1. Execute a instruo de preparao na primeira iterao do lao. 2. Execute o teste de controle. Caso seja Verdadeiro, passe para o item 3. Caso contrrio, passe para o item 6. 3. Execute o bloco de instrues. 4. Execute o passo para alcance da condio de controle. 5. Passe para o item 2. 6. Saia do lao e prossiga o algoritmo. O comando para equivalente seguinte estrutura:
<instruo de preparao> incio enquanto (<teste de controle>) faa <instrues> fim <passo>
Implementemos novamente o algoritmo Soma_mpares_Verso1 utilizando o comando para em vez do comando enquanto: Algoritmo Soma_mpares_Verso4
var superior, num, soma: inteiro; incio
1 2
soma 0;
80
3 4 5 6 7
fim leia(superior);
Algoritmos e Programao
para (num 1; num <= superior; num num + 1) faa se (num resto 2 > 0) ento soma soma + num;
O bloco de instrues do comando para s contm uma instruo (o comando se) e, por isso, no precisa ser delimitado pelo incio/m. Vejamos o teste de mesa considerando o limite superior como 4 (Tabela 4.4).
Tabela 4.4 Teste de mesa para Soma_mpares_Verso4 Instruo Linha num superior soma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 4 5 6 4 4 5 4 4 5 6 4 4 5 4 4 7 ? ? ? 1 1 1 1 2 2 2 3 3 3 3 4 4 4 5 5 5 ? ? [4] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 1 1 1 1 1 1 1 4 4 4 4 4 4 {4} Passo Teste de entrada/sada Passo Teste de entrada/sada Passo Teste de entrada/sada Passo Teste de entrada/sada Instruo inicial Teste de entrada/sada
Comentrios
Perceba que o nmero de instrues executadas praticamente igual ao nmero de instrues executadas na implementao do mesmo algoritmo utilizando o comando repita apresentado na seo 4.4, apesar de o nmero de linhas do algoritmo ser diferente. Podemos notar que a linha 4 (do comando para) contm mais de uma instruo, sendo representada separadamente no teste de mesa. Isso porque o comando para uma construo diferente no que diz respeito apenas ao estilo de programao, mas internamente seu funcionamento igual ao do comando enquanto ou repita, e no h ganho de
81
desempenho ou diminuio de instrues executadas pela sua utilizao. Temos apenas uma diminuio do nmero de linhas do algoritmo em virtude de seu estilo compacto, em que descrevemos trs instrues em apenas uma linha.
i=3
(5 * i + 2)
em que n definido pelo usurio. Esse tipo de frmula encaixa-se perfeitamente na estrutura do comando para. Podemos separar: Instruo de preparao: i = 3 Condio de sada: i = n Passo: i
i + 1
Algoritmo Somatrio
var i, n, somat: inteiro; incio
1 2 3 4 5 6
fim
i=3
(5 * i + 2)
Exerccios propostos
1. Faa o teste de mesa para o algoritmo Somatrio. Faa os prximos algoritmos utilizando o comando para. 2. Faa a multiplicao apenas por meio de somas. 3. Faa um algoritmo que determine se um nmero primo.
82
Algoritmos e Programao
83
7. Faa um novo algoritmo para o clculo do MMC de dois nmeros, mas que em vez de utilizar a fatorao, parta do seguinte princpio: "o MMC o menor nmero maior ou igual ao maior dos dois nmeros escolhidos e que divisvel pelos dois nmeros iniciais." Portanto, parta do maior dos dois nmeros e verifique, dentro do lao, se o nmero o MMC testando sua divisibilidade pelos dois nmeros. 8. Otimize o algoritmo do exerccio 7 considerando que os nmeros candidatos ao MMC devem ser mltiplos do maior dos dois nmeros. Portanto, teste apenas seus mltiplos (somando no 1, mas o valor do maior dos dois nmeros), dentro do lao para encontrar o MMC. 9. Faa o algoritmo para a resoluo do somatrio a seguir, sendo n definido pelo usurio e maior que 5:
i=5
(2 * i2+ 5 * i + 1)
10. Faa um algoritmo que encontre o n-simo termo da srie de Fibonacci. A srie de Fibonacci dada por: fib(n) = fib(n - 1) + fib(n - 2) para n > 1; Para n = 0 e n = 1, o valor dado por definio: fib(0) = 0 e fib(1) = 1. Exemplos: fib(0) = 0 fib(1) = 1 fib(2) = fib(1) + fib(0) = 1 + 0 = 1 fib(3) = fib(2) + fib(1) = 1 + 1 = 2 fib(4) = fib(3) + fib(2) = 2 + 1 = 3 fib(5) = fib(4) + fib(3) = 3 + 2 = 5 fib(6) = fib(5) + fib(4) = 5 + 3 = 8
84
Algoritmos e Programao
Arquivo Cap_04_10.pas
program Fibonacci(Input, Output); var n, fib_menos_1, fib_menos_2, fib_N, i: integer; write('Digite n, para calcular o n-simo termo da srie de Fibonacci: '); { O conectivo 'or' corresponde ao conectivo 'ou' } if (n = 0) or (n = 1) then else fib_N := n readln(n);
begin
{ O comando 'for' corresponde ao comando 'para'. { O comando a seguir equivale a 'para (i 2; i <= n; i i + 1)' } for i := 2 to n do begin Em Pascal, a clusula 'passo' implcita }
end; end.
end;
4.7.1.2 Ler 100 nmeros e retornar a soma e a mdia aritmtica desses valores (problema 12)
Faa um algoritmo que leia 100 nmeros e retorne a soma e a mdia aritmtica desses valores.
85
Arquivo Cap_04_prob12.pas
program Soma_media_100(Input, Output); var contador: integer;
begin
soma, media, valor: real; contador := 0; soma := 0; valor := 0; { Nenhuma iterao feita at aqui }
{ O comando 'while' corresponde ao comando 'enquanto' } while (contador < 100) do begin
end;
contador := contador + 1;
end.
4.7.1.3 Calcular a soma dos nmeros mpares entre 1 e um limite superior (problema 18)
Faa um algoritmo que calcule a soma dos nmeros mpares entre 1 e um limite superior definido pelo usurio.
Arquivo Cap_04_prob18.pas
program Soma_impares(Input, Output); var superior, num, soma: integer;
begin
soma := 0; { ainda no foi somado nenhum valor } write('Entre com o limite superior: '); readln(superior);
num := 1;
{ Em Pascal, o repeat no precisa da definio explcita do incio/fim do bloco } if num mod 2 > 0 then num := num + 1;
writeln('A soma dos nmeros mpares de 1 at ', superior, ' : ', soma);
86
Algoritmos e Programao
4.7.2 Programas em C
4.7.2.1 Encontrar o n-simo termo da srie de Fibonacci (exerccio 10)
Faa um algoritmo que encontre o n-simo termo da srie de Fibonacci. Para mais informaes sobre a srie de Fibonacci, veja o exerccio 10 na pgina 84.
Arquivo Cap_04_10.c
#include <stdio.h> int main() {
fib_menos_1 = 1;
fib_menos_2 = 0;
/* ltimo valor */
/* penltimo valor */
4.7.2.2 Ler 100 nmeros e retornar a soma e a mdia aritmtica desses valores (problema 12)
Faa um algoritmo que leia 100 nmeros e retorne a soma e a mdia aritmtica desses nmeros.
Arquivo Cap_04_prob12.c
#include <stdio.h> int main() { int contador; float soma, media, valor; contador = 0; /* nenhuma iterao feita at aqui */ soma = 0; /* ainda no foi somado nenhum valor */ valor = 0; printf("Digite 100 valores para calcular a mdia aritmtica.\n");
87
4.7.2.3 Calcular a soma dos nmeros mpares entre 1 e um limite superior (problema 18)
Faa um algoritmo que calcule a soma dos nmeros mpares entre 1 e um limite superior definido pelo usurio.
Arquivo Captulo_04_prob18.c
#include <stdio.h> int main() { int superior, num, soma; soma = 0; /* ainda no foi somado nenhum valor */ printf("Entre com o limite superior.\n"); scanf("%d", &superior); num = 0; do /* O comando do/while faz a mesma funo do comando repita/at */ { num = num + 1; /* se o nmero mpar */ if (num % 2 > 0) soma = soma + num; } while (num <= superior); printf("A soma dos nmeros mpares de 1 at %d : %d\n", superior, soma); return 0; }