Curso de scripvox - aula7 (Por Fabiano Ferreira)

Nesta aula, vamos falar sobre um assunto extremamente importante: blocos
de repetição.

Assim como a execussão condicional, que no scripvox é feita com
se/senão, e nas outras linguagens como if/else, os blocos de repetição
existem em qualquer linguagen e têm um papel fundamental na
construção de uma rotina.

    Sem eles, certos trabalhos se tornariam um tédio 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 então:

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 código, qual
opção você escolheria?
Acredito que a de escrever três linhas, não é?
    Pois é exatamente isso que veremos nessa aula: como economizar
linhas de código. E não só isso, vamos começar a nos preocupar mais com
as lógicas 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 repetição

    No scripvox, temos, basicamente, 2 comandos de repetição, a saber:

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

*Exemplo de utilização do comando enquanto;
*Por Fabiano Ferreira;
*Em agosto de 2011;

Seja a 0
Seja b 0
Enquanto a<=500000
    Escreve "Digite o primeiro número:"
    Lê a
Escreve "Digite o segundo número:"
    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.
Poderíamos deixar de fazer isso, mas
quando trabalhamos com números, é sempre bom inicializar a variável
com um valor.
Isso pode evitar erros e melhora na lógica do programa.
    Abaixo iniciamos um bloco de repetição, onde a condição é 'enquanto
a for menor ou igual a 500000'
    Nesse momento, o interpretador verifica: "a é menor ou igual a
500000? Sim!"
Então ele entra no bloco e executa o que lá está.
    No bloco temos:
O computador pedindo para que o usuário entre com um valor.
Em seguida o comando Lê permite o usuário fornecer via teclado um valor,
que é armazenado na variável a.
Em seguida é pedido que digite um outro número.
O comando Lê vem abaixo para permitir que o usuário entre com um valor,
para ser armazenado na variável 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 início e verifica novamente a condissão:
"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 condição.
O processo se repete até que a condição não seja mais verdadeira, no
nosso caso, até que a não seja menor ou igual a 500000.
    Na programação, esse processo de repetição é chamado loop, ou laço.
    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 execussão condicional, nos comandos  de
repetição, não são permitidos blocos aninhados.

    Podemos utilizar o operador 'não', como veremos no exemplo abaixo.
    Além de exemplificarmos o uso do operador não, vamos aproveitar para
ver um comando que não pôde ser abordado na aula5, por não termos visto
ainda os blocos de repetição:

*Exemplo de utilização do operador não no comando enquanto e do comando
observa teclado;
*Por Fabiano Ferreira;
*Em agosto de 2011;

Observa teclado t
Enquanto não 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 espaço e uma variável.
    Esse comando serve para que o interpretador execute uma tarefa até
que o usuário pressione uma tecla.
    A variável colocada após 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:
    Começamos com o comando observa teclado.
A variável utilizada como 'controladora' é a variável t.
    Abaixo um início de bloco de repetição:
Enquanto não t<>0
    Esta linha pode ser interpretada como: 'enquanto t não for diferente
de 0'.
    Suponhamos que o usuário não teclou nada. Então o bloco será
executado, pois
"é verdade que t não é 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
variável t como 'controladora'.
    Foi necessário repetir o comando para que o valor fosse atualizado.
    Explicando de uma maneira bem simples:
Se não repetíssemos o comando observa teclado, quando o interpretador
voltasse no início do bloco da condissão, caso o usuário tivesse
pressionado alguma tecla, o valor da variável t mudaria, mas o comando
observa teclado não seria 'avisado' dessa mudança.
Com isso, nosso programa travaria e nós teríamos que fechá-lo com
alt+f4.

    Resumindo: nosso programa fica emitindo clecs até que o usuário
pressione uma tecla qualquer.
Quando o usuário pressiona uma tecla, o bloco deixa de ser executado, e
o programa segue em frente.
O próximo comando após o fechamento do bloco é o comando lê, que permite
guardar na variável t a tecla pressionada.
E em seguida, o comando escreve, para exibir o que foi pressionado.

*Repete;
    Usado sempre que se conhece o número de vezes que uma rotina deve
ser executada.
Forma geral:
Repete, um espaço, uma variável 'controladora', um espaço e o número 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 início que era possível escrever 100 vezes a
frase 'curso de scripvox' gastando apenas três linhas de código, vamos
mostrar na prática como seria o algoritmo:

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

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

    Prático, não é?

O programa começa com a abertura de um bloco de repetição determinada,
indicada pela palavra repete.
A variável r, é a variável 'controladora' do número de repetições e o
número 100 é o número 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 variável
controladora.
O bloco se repete até que a variável atinja o valor especificado para a
repetição do bloco.
No nosso exemplo, o bloco será executado até que r atinja o valor 100.

    Assim terminamos nossa aula7.
    Na próxima aula, vamos ver algo muito usado no scripvox: execussão
externa e desvios.

Exercícios:

1 - Qual a diferença entre o comando enquanto e o comando repete?

2 - Um bloco de repetição determinada (comando repete), é executado
pelomenos uma vez.
Essa afirmação é verdadeira?

3 - Faça um programa com as seguintes características:
*permita que o usuário digite dois números;
*Realize a soma dos dois valores e exiba o resultado;
*execute esses passos, até que o usuário digite o valor 0 para a primeira parcela da soma;
*permita que o bloco de repetição não seja executado (para o caso do usuário digitar 0 logo da primeira vez que abrir o programa).

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

Boa sorte!
