Curso de scripvox - aula7 (Por Fabiano Ferreira)

Nesta aula, vamos falar sobre um assunto extremamente importante: blocos
de repetio.

Assim como a execusso condicional, que no scripvox  feita com
se/seno, e nas outras linguagens como if/else, os blocos de repetio
existem em qualquer linguagen e tm um papel fundamental na
construo de uma rotina.

    Sem eles, certos trabalhos se tornariam um tdio para o programador.
Quer ver um exemplo?
Como voc faria um script para escrever 100 vezes a frase "curso de
scripvox", somente com o que voc viu at agora?

Certamente algo parecido com isso:

Escreve "Curso de scripvox."
Escreve "Curso de scripvox"
Escreve "Curso de scripvox"
...
...
Escreve "Curso de scripvox",
at completar 100 linhas com o comando escreve.
Ou ento:

Seja x "Curso de scripvox"
escreve x
escreve x
escreve x
escreve x
....
at completar 100 linhas com o comando escreve.

Mas, se eu te disser que voc pode repetir, 100 vezes, ou at mais, a
frase curso de scripvox, escrevendo apenas 3 linhas de cdigo, qual
opo voc escolheria?
Acredito que a de escrever trs linhas, no ?
    Pois  exatamente isso que veremos nessa aula: como economizar
linhas de cdigo. E no s isso, vamos comear a nos preocupar mais com
as lgicas empregadas nas nossas rotinas e melhorarmos a escrita dos
nossos programas.
    Sabe o que isso significa? Que agora temos quase tudo que precisamos
para desenvolver um script realmente funcional e poderoso!

*****

    Blocos de repetio

    No scripvox, temos, basicamente, 2 comandos de repetio, a saber:

*Enquanto;
    Usado sempre quando no sabemos quantas vezes um trecho do programa
deve ser repetido.
    Forma de uso:
Enquanto, um espao e uma condio.
Abaixo, escrevemos a lista de comandos a serem repetidos, e
ao final, fechamos o bloco com  fim enquanto.
    Exemplo:

*Exemplo de utilizao do comando enquanto;
*Por Fabiano Ferreira;
*Em agosto de 2011;

Seja a 0
Seja b 0
Enquanto a<=500000
    Escreve "Digite o primeiro nmero:"
    L a
Escreve "Digite o segundo nmero:"
    L b
    Soma a b
Escreve "O resultado da soma  "a
Fim Enquanto
Escreve "Voc atingiu um valor maior que 500000!"
Termina mudo

    O exemplo acima realiza a soma de 2 valores, at que o resultado
seja um valor maior que 500000.
    Iniciamos o programa atribuindo o valor 0 para a e b.
Poderamos deixar de fazer isso, mas
quando trabalhamos com nmeros,  sempre bom inicializar a varivel
com um valor.
Isso pode evitar erros e melhora na lgica do programa.
    Abaixo iniciamos um bloco de repetio, onde a condio  'enquanto
a for menor ou igual a 500000'
    Nesse momento, o interpretador verifica: "a  menor ou igual a
500000? Sim!"
Ento ele entra no bloco e executa o que l est.
    No bloco temos:
O computador pedindo para que o usurio entre com um valor.
Em seguida o comando L permite o usurio fornecer via teclado um valor,
que  armazenado na varivel a.
Em seguida  pedido que digite um outro nmero.
O comando L vem abaixo para permitir que o usurio entre com um valor,
para ser armazenado na varivel b.
Em seguida  efetuada a soma e mostrado na tela o resultado.
    Aqui chegamos ao fim do bloco, pois temos o comando 'fim enquanto'.
Da, o interpretador volta no incio e verifica novamente a condisso:
"A   menor ou igual a 500000?"
Vai depender de quanto deu a minha soma.
Se a resposta for sim, ele executa mais uma vez os comandos do bloco.
O bloco chega ao fim e ele volta, para verificar novamente a condio.
O processo se repete at que a condio no seja mais verdadeira, no
nosso caso, at que a no seja menor ou igual a 500000.
    Na programao, esse processo de repetio  chamado loop, ou lao.
    Saindo do bloco, ele executa a linha imediatamente posterior.
No nosso exemplo,  uma mensagem do tipo "voc
j atingiu um valor maior que 500000.
E logo em seguida, o comando termina mudo enserra o programa.

    Assim como na execusso condicional, nos comandos  de
repetio, no so permitidos blocos aninhados.

    Podemos utilizar o operador 'no', como veremos no exemplo abaixo.
    Alm de exemplificarmos o uso do operador no, vamos aproveitar para
ver um comando que no pde ser abordado na aula5, por no termos visto
ainda os blocos de repetio:

*Exemplo de utilizao do operador no no comando enquanto e do comando
observa teclado;
*Por Fabiano Ferreira;
*Em agosto de 2011;

Observa teclado t
Enquanto no t<>0
Bipa 1
observa teclado t
Fim enquanto
L t &
Escreve "Voc apertou "t". Tchau."
Termina mudo

    No exemplo acima, a primeira novidade que encontramos  o comando
observa teclado.
Forma geral:
Observa teclado, um espao e uma varivel.
    Esse comando serve para que o interpretador execute uma tarefa at
que o usurio pressione uma tecla.
    A varivel colocada aps o comando observa teclado pode receber dois
valores:
0 - significando que nada foi pressionado.
1 - significando que uma tecla foi pressionada.
    Agora que sabemos como o comando observa teclado funciona, vamos
entender como funciona nosso programa exemplo:
    Comeamos com o comando observa teclado.
A varivel utilizada como 'controladora'  a varivel t.
    Abaixo um incio de bloco de repetio:
Enquanto no t<>0
    Esta linha pode ser interpretada como: 'enquanto t no for diferente
de 0'.
    Suponhamos que o usurio no teclou nada. Ento o bloco ser
executado, pois
" verdade que t no  diferente de 0".
    Dentro do bloco temos:
O comando bipa 1, que emite um clec.
Abaixo temos novamente o comando observa teclado, usando novamente a
varivel t como 'controladora'.
    Foi necessrio repetir o comando para que o valor fosse atualizado.
    Explicando de uma maneira bem simples:
Se no repetssemos o comando observa teclado, quando o interpretador
voltasse no incio do bloco da condisso, caso o usurio tivesse
pressionado alguma tecla, o valor da varivel t mudaria, mas o comando
observa teclado no seria 'avisado' dessa mudana.
Com isso, nosso programa travaria e ns teramos que fech-lo com
alt+f4.

    Resumindo: nosso programa fica emitindo clecs at que o usurio
pressione uma tecla qualquer.
Quando o usurio pressiona uma tecla, o bloco deixa de ser executado, e
o programa segue em frente.
O prximo comando aps o fechamento do bloco  o comando l, que permite
guardar na varivel t a tecla pressionada.
E em seguida, o comando escreve, para exibir o que foi pressionado.

*Repete;
    Usado sempre que se conhece o nmero de vezes que uma rotina deve
ser executada.
Forma geral:
Repete, um espao, uma varivel 'controladora', um espao e o nmero de vezes que o
bloco vai ser executado.
Abaixo escrevemos a rotina que ser executada.
Para finalizar o bloco, utilizamos fim repete.

    J que dissemos no incio que era possvel escrever 100 vezes a
frase 'curso de scripvox' gastando apenas trs linhas de cdigo, vamos
mostrar na prtica como seria o algoritmo:

*Exemplo do comando repete;
*Por Fabiano Ferreira;
*Em agosto de 2011;

Repete r 100
    Escreve "Curso de scripvox"
Fim Repete.

    Prtico, no ?

O programa comea com a abertura de um bloco de repetio determinada,
indicada pela palavra repete.
A varivel r,  a varivel 'controladora' do nmero de repeties e o
nmero 100  o nmero de vezes que o bloco vai ser executado.
    Dentro temos apenas o comando escreve, para exibir a frase "curso de
scripvox".
    A cada vez que o bloco  executado,  somado mais 1 na varivel
controladora.
O bloco se repete at que a varivel atinja o valor especificado para a
repetio do bloco.
No nosso exemplo, o bloco ser executado at que r atinja o valor 100.

    Assim terminamos nossa aula7.
    Na prxima aula, vamos ver algo muito usado no scripvox: execusso
externa e desvios.

Exerccios:

1 - Qual a diferena entre o comando enquanto e o comando repete?

2 - Um bloco de repetio determinada (comando repete),  executado
pelomenos uma vez.
Essa afirmao  verdadeira?

3 - Faa um programa com as seguintes caractersticas:
*permita que o usurio digite dois nmeros;
*Realize a soma dos dois valores e exiba o resultado;
*execute esses passos, at que o usurio digite o valor 0 para a primeira parcela da soma;
*permita que o bloco de repetio no seja executado (para o caso do usurio digitar 0 logo da primeira vez que abrir o programa).

*Entregar as respostas at o dia 04/09, enviando para o seguinte
endereo:
qst-scripvox@sanfersite.com.br

Boa sorte!
