• Nenhum resultado encontrado

Imprimindo sequˆ encias de n´ umeros na tela

No documento Algoritmos e Estruturas de Dados I (páginas 40-44)

Nesta se¸c˜ao usaremos como apoio um problema muito simples. Apesar disto, a dis-cuss˜ao ser´a bastante rica em conceitos de algoritmos.

Problema: Imprimir todos os n´umeros entre 1 e 5.

Provavelmente um humano escreveria algo assim:

1. imprima o n´umero 1;

2. imprima o n´umero 2;

3. imprima o n´umero 3;

4. imprima o n´umero 4;

5. imprima o n´umero 5;

Este algoritmo pode ser codificado em Pascal tal como ´e ilustrado na figura 5.4, usando-se o comando de sa´ıda apresentado anteriormente.

5.4. IMPRIMINDO SEQU ˆENCIAS DE N ´UMEROS NA TELA 41

Figura 5.4: Primeira solu¸c˜ao para contar de 1 a 5.

Ap´os compilado e executado, os n´umeros 1, 2, 3, 4 e 5 aparecem na tela, atendendo ao enunciado. Mas, `a luz das discuss˜oes do cap´ıtulo 2, ´e f´acil ver que ela n˜ao ´e muito boa, pois n˜ao permite uma reimplementa¸c˜ao simples de problemas similares. Por exemplo, se o enunciado fosse “Imprimir todos os n´umeros entre 1 e 20” no lugar de

“todos entre 1 e 5”, ter´ıamos que escrever um c´odigo como o ilustrado na figura 5.5.

program contar ;

Figura 5.5: Primeira solu¸c˜ao modificada para n´umeros de 1 a 30.

Extrapolando o enunciado do problema, se fosse para imprimir n´umeros entre 1 e 30.000 ou entre 1 e 100.000.000, o programa ficaria com 30 mil ou 100 milh˜oes de linhas de c´odigo extremamente repetitivo e de dif´ıcil e custosa edi¸c˜ao.

A simplicidade do racioc´ınio inicial resultou em uma tarefa t˜ao exaustiva que o computador deixou de ajudar, ele passou a atrapalhar!

Felizmente, h´a algoritmos melhores!

O computador ´e, conforme vimos, uma m´aquina com pouqu´ıssimos recursos, mas que, se bem explorados, permite-nos escrever programas fant´asticos. O racioc´ınio deve ser ent˜ao desenvolvido de tal maneira que o trabalho fique com o computador e n˜ao com o programador.

Primeira li¸c˜ao: n˜ao ´e perda de tempo pensar mais antes de escrever c´odigo!

As opera¸c˜oes elementares da m´aquina s˜ao, basicamente, colocar e consultar dados da mem´oria ou fazer contas com bastante rapidez. As opera¸c˜oes s˜ao executadas uma por uma, em ordem, visualmente de cima para baixo.

Como explorar isto? Se pelo menos consegu´ıssemos uma vers˜ao em que o copi-ar/colar fosse vi´avel, j´a ajudaria. A figura 5.6 ilustra uma solu¸c˜ao em que isto ´e poss´ıvel.

program contar ; var i : integer; begin

i := 1;

write ( i ) ; i := i + 1;

write ( i ) ; i := i + 1;

write ( i ) ; i := i + 1;

write ( i ) ; i := i + 1;

write ( i ) ; i := i + 1;

end.

Figura 5.6: Segunda solu¸c˜ao.

A express˜aoi:= 1´e mais um exemplo de umcomando de atribui¸c˜ao. O resultado da execu¸c˜ao do comando ´e que a express˜ao `a direita do s´ımbolo :=, no caso o 1, ´e colocado na posi¸c˜ao de mem´oria acessada pela vari´avel i.

A express˜ao i + 1 ´e mais um exemplo de uma express˜ao aritm´etica, que ´e cons-titu´ıda conforme as regras do compilador. Uma express˜ao aritm´etica resulta em um valor num´erico, no caso deste exemplo do mesmo tipo da vari´avel i, que ´e integer.

Destacamos ent˜ao que a linha de c´odigo contendo i:= i + 1tamb´em ´e uma atri-bui¸c˜ao e funciona assim: resolve-se o valor da express˜ao `a direita do s´ımbolo:=, isto ´e, o valor da vari´aveli, que na primeira vez ´e 1, ´e somando com a constante 1, resultando no n´umero 2. Em seguida, este valor por sua vez ´e colocado na posi¸c˜ao da vari´avel que aparece `a esquerda do s´ımbolo :=, casualmente a pr´opria vari´avel i, que passa a ter o valor 2.

5.4. IMPRIMINDO SEQU ˆENCIAS DE N ´UMEROS NA TELA 43 O que ocorre ´e que uma certa vari´avel i´e iniciada com o valor 1 e sucessivamente ent˜ao usa-se o comando de impress˜ao para exibir o valor deina tela, incrementando-se de 1 em 1 o valor da vari´avel, obtendo-se como resultado final a impress˜ao do valor 5 e sendo 6 o ´ultimo valor (n˜ao impresso) da vari´avel i.

O programa foi feito de maneira a ter blocos de comandos repetidos, pois ainda n˜ao sabemos mudar o fluxo de execu¸c˜ao de um programa, isto ´e, ele executa “de cima para baixo”, ent˜ao a solu¸c˜ao foi repetir os mesmos blocos 5 vezes.

E poss´ıvel for¸car a mudan¸ca do fluxo de execu¸c˜´ ao do programa? O que precisamos

´

e de uma estrutura que permita repetir um determinado trecho de c´odigo enquanto uma determinada condi¸c˜ao for verdadeira.

Isto ´e conseguido com o uso de comandos de repeti¸c˜ao. A linguagemPascal oferece trˆes maneiras de se fazer isto. Veremos apenas uma delas por enquanto. No decorrer do curso voltaremos `as outras formas. A figura 5.7 ilustra o uso deste conceito.

program contar ; var i : integer; begin

i := 1;

while i<= 30000 do begin

write ( i ) ; i := i + 1;

end;

end.

Figura 5.7: Sexta solu¸c˜ao.

O comando de repeti¸c˜ao executa os comandos aninhados no bloco entre obegin e o end; enquanto uma express˜ao booleana for verdadeira. No primeiro momento em que for falsa, o fluxo ´e alterado para depois do end.

A express˜ao i ≤ 30000 ´e uma express˜ao booleana, retorna verdadeiro ou falso apenas, dependendo da avalia¸c˜ao dos valores pelo computador. No caso, vai resultar falso apenas quando i for estritamente maior do que 30000.

Neste exemplo, a vari´avelifoi inicializada com o valor 1. Em seguida, os comandos de impress˜ao e incremento s˜ao executados enquanto o valor dei for menor ou igual a 30000. Desta forma, o n´umero 1 ´e impresso, i passa a valer 2, que ´e menor ou igual a 30000, ent˜ao 2 ´e impresso e i passa a valer 3, que por sua vez ainda ´e menor ou igual a 30000. Ent˜ao 3 ´e impresso na tela ei passa a valer 4, e assim por diante, at´e o momento em que ser´a impresso na tela o valor 30000. Neste pontoi passar´a a valer 30001, que n˜ao ´e menor ou igual a 30000, por isto o fluxo de execu¸c˜ao do programa vai para o comando que segue o bloco do comando while, isto ´e, o fim do programa.

Nesta se¸c˜ao mostramos o conceito de comando de repeti¸c˜ao (while/do) e um exem-plo de uso de uma express˜oes booleanas. A pr´oxima se¸c˜ao apresentar´a a ´ultima es-trutura b´asica que nos interessa.

No documento Algoritmos e Estruturas de Dados I (páginas 40-44)