Dando continuidade a nossa série, vamos falar hoje sobre execussão
condicional e blocos de repetição.

Achou complicado?

Continue lendo e você vai ver que é super simples, quando a gente
entende o que é e como usar.

Essa é, na minha opinião, a parte fundamental para quem deseja aprender
a programar.

Siga lendo...

****

Execussão condicional e blocos de repetição.

[0]Índice
1. Introdução a execução condicional.
2. Condicional simples
3. Condicional composta

4. Introdução aos blocos de repetição.
5. Blocos de repetição
5.1 Whille
5.2 Repeate/until
5.3 For

[1] Introdução a execução condicional

    Chamamos de execussão condicional o ato de executar uma rotina
mediante a uma ou mais condições serem falsas ou verdadeiras.
    Vamos imaginar a seguinte situação:
Em um determinado programa, ao pressionarmos a tecla esc, é perguntado
se desejamos realmente sair da aplicação.
Devemos responder sim, apertando a tecla s, ou não, apertando a tecla n.

Caso o usuário responda 's', o programa permanece aberto, mas se
responder 'n', o programa se fecha.
    O caso acima ilustra a verificação de uma condissão para a execussão
de uma rotina.
    Nesse exemplo, a condissão é a resposta do usuário.
    O programa vai verificar qual foi a resposta dada.
Se foi 's', o programa deve continuar, se for n, deve enserrar.

Agora que temos uma idéia de como funciona a execussão condicional,
vamos ver suas formas de uso nos próximos ítens desse texto.

[2] Condicional simples
Verifica se uma ou mais condições são verdadeiras.
Forma de uso:
if condicao then,
onde: condicao é a condição que se deseja verificar.
A palavra then significa então em inglês, e deve ser colocada sempre no fim
da condição a ser verificada.
Exemplo:
if j > 10 then
sintwriteln ('O número que você digitou é maior que 10');

O exemplo acima verifica se um valor guardado na variável j é maior que 10.
Se for, ele escreve a mensagem:
O número digitado é maior que 10.

Vejamos outras possibilidades de execussão condicional:

If i > 10 then
//Verifica se i é maior que 10

If i < 10 then
//Verifica se i é menor que 10.

If i = 10 then
//Verifica se i é igual a 10

if i <> 10 then
//Verifica se i é diferente de 10

if i >= 10 then
Verifica se i é maior ou igual a 10.
if i <= 10 then
//Verifica se i é menor ou igual a 10.

Além dos operadores de comparação que vimos agora
(maior, menor, igual, maior igual, menor igual e diferente),
temos também os operadores lógicos, que podem ser usados para ampliar ainda
mais a lista de condições a serem verificadas.
São eles:
And - operador lógico e.
Exemplo:
if (i > 10) and (p > 30) then
Verifica se i é maior que 10 e p é maior que 30.
Para a condição ser satisfeita, os dois casos devem ser verdade: i ser maior que 10 e p ser maior que 30.

Or - operador lógico ou.
Exemplo:
if (i > 10) or (p > 30) then
Verifica se i é maior que 10 ou p é maior que 30.
Para que a condição seja satisfeita, um dos dois casos devem ser verdade:
ou i deve ser maior que 10, ou p deve ser maior que 30.
Também é considerado verdadeiro se as duas condições forem verdade: i maior que 10 e p maior que 30.

Xor - operador ou exclusivo.
Xor significa exclusive or.
A diferença do xor para o or, é que, diferente do or, que retorna verdadeiro
no caso de todas as condições serem verdade, o xor só retorna verdadeiro se uma das
condições serem verdadeiras.
Por exemplo:
if (i > 10) xor (p > 30) then
Se i for maior que 10, mas p não for maior que 30, então é verdadeiro.
Se p for maior que 30, mas i não for maior que 10, também é verdadeiro.
Se i não for maior que 10, nem p for maior que 30, então é falso.
E se i for maior que 10 e p for maior que 30... falso!
Diferente do or, que retornaria verdadeiro.

Há também o operador not.
Not significa não em inglês.
Ele é chamado de operador de negação e serve para inverter os valores booleanos,
isso é,
falso passa a ser verdadeiro e verdadeiro passa a ser falso.
Confuso?
Vamos ver um exemplo simples:

program testando;
uses dvcrt, dvwin;
var i : integer;

begin
i := 50;
sintinic (0, '');

if not i > 30 then
sintetiza ('oioioi');
readln;
sintfim;
end.

O exemplo acima tem uma variável do tipo inteiro i.
É dada a essa variável o valor 50.
I := 50;

Depois, verificamos se i não é maior que 30.
Se não for, sintetiza a mensagem oioioi.
No caso, não vai ser sintetizado por que i é maior que 30.

Experimente esse exemplo com outros valores.
Retire o not, use os operadores lógicos, troque os operadores de comparação...

Outra forma de usar o if:
if condicao then
begin
instrucao1;
instrucao 2;
instrucao 3...
end;

Essa forma é usada quando há mais de uma tarefa a executar no caso da condição
ser satisfeita.
Por  exemplo:

if i > 10 then
begin
sintetiza('i é maior que 10');
sintetiza('Até a próxima');
end;

No exemplo acima, caso i seja maior que 10, tudo que está entre o begin e o end
será executado.

também se pode usar if dentro de if, assim:

if i > 10 then
begin
Sintwriteln ('Digite seu nome');
sintreadln (nome);
if nome = 'Pedro' then
sintwriteln ('Seu nome é pedro, nome de um amigo meu!');
end;

Note que no begin da primeira condição (i > 10)
tem outro if (if nome = 'Pedro');

O segundo if só vai ser executado se o primeiro for satisfeito.

Isso é o que chamamos de blocos aninhados e que não conseguíamos fazer antes
no scripvox 5.

[3] Condicional composta:
A condicional composta permite fazermos tudo que vimos até aqui.
A diferença é que além de verificar se uma condição ou as condições são verdadeiras
ou falsas, a condicional composta permite definirmos o que fazer no caso delas não serem verdadeiras
e de verificarmos outras possibilidades.
Vamos exemplificar:

if i > 10 then
sintwriteln ('O número é maior que 10')
else
if i > 5 then
sintwriteln ('O número é maior que 5')
else
sintwriteln ('O número é 5 ou está abaixo de 5');

Vamos entender o que aconteceu:
Primeiro verificamos se i é maior que 10.
No caso de ser verdade, escreveria a mensagem  o número é maior que 10.
Se não for, verifica a instrução abaixo do else ( Else significa senão em inglês).
No caso, se i é maior que 5.
Se for, escreve a mensagem o número é maior que 5.
E se não for,
escreve que o número é 5 ou está abaixo de 5.

Agora, duas curiosidades devem ter ficado:
1. Esqueceu dos ponto e vírgula?
Não. A linha antes do else não leva ponto e vírgula.
2. Como você afirmou que o número pode ser 5 ou menor que 5, se você não fez
essa verificação?
Pela negativa das anteriores.
Se a verificação de i ser maior que 10 deu falso e a de i ser maior que 5 também
deu falso, o que sobra é apenas a possibilidade de i ser 5.
*
Blocos de Repetição
[4]Introdução aos blocos de repetição;
Assim como a execussão condicional, que no scripvox é feita com
se/senão, e nas outras linguagens, como, no pascal por exemplo 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 programa para escrever 100 vezes a frase "Hoje é
domingo.", somente com o que você viu até agora?

Certamente algo parecido com isso:

SintWriteln ('Hoje é domingo.');
SintWriteln ('Hoje é domingo.');
SintWriteln ('Hoje é domingo.');
SintWriteln ('Hoje é domingo.');
SintWriteln ('Hoje é domingo.');
SintWriteln ('Hoje é domingo.');
..
até completar 100 linhas.
Ou então:

var x : string = 'Hoje é domingo';
begin
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
...
sintfim;
end.
até completar 100 linhas.

Mas, se eu te disser que você pode repetir, 100 vezes, ou até mais, a
frase hoje é domingo, escrevendo muito menos linhas de código, qual
opção você escolheria?
Acredito que a de escrever menos, não é?
    Pois é exatamente isso que veremos nessa aula: como economizar
linhas de código.

Escrevendo menos, você torna seu programa mais legível, mais fácil de entender
e aproveita mais da linguagem escolhida para escrever seu projeto, no nosso caso,
pascal para dosvox.

[5]    Blocos de repetição;

[5.1] While
    Usado sempre quando não sabemos quantas vezes um trecho do programa
deve ser repetido.
While significa enquanto em inglês.
    Forma de uso:
Simples:
while condicao do
executa;
Ou então
while condicao do
begin
executa;
executa;
executa;
executa;
..
end;

Você também pode usar os operadores lógicos, como vimos no caso do if/else.
Por exemplo:
while (i<5) and (opcao=#$1b) do
begin
..
end;

Isso quer dizer: enquanto i for menor que 5  e opcao for a tecla esc.
inicia um bloco, faz o que está dentro dele e sai.
O programa vai verificar as condições:
i menor que 5 e opcao = esc.
Se for verdade, entra no bloco e faz o que está lá.
Chegando no end, volta no início, verifica novamente, e, sempre que for verdade,
vai fazer a mesma coisa:
entrar no bloco, realizar as tarefas até o end, voltar e verificar.

Assim que a condição estabelecida der falso, o bloco para de ser executado.

Uma coisa muito comum de acontecer é não haver no bloco uma forma de fazer com que a condição
mude, gerando asssim uma repetição sem fim.

No exemplo acima, eu preciso, dentro do meu bloco, fazer com que
a tecla possa ser diferente de esc e que o número seja maior que 5.
Caso contrário, meu programa irá travar nesse trecho, pois nunca minha condição
será diferente.

[5.2]Repeat/until;
    Usado sempre que se deseja executar o bloco ao menos uma vez.
Sintaxi:
repeat
instrucao1;
instrucao2;
..
until condicao;

A diferença do repeat para o while, é que no while, o bloco pode nunca ser executado,
e no repeat, ele será executado obrigatoriamente uma vez.
Em resumo:
no while, a condição é testada no início do bloco,
no repeat, é testada no final.

Exemplo:

repeat
sintwriteln('Qual sua opção?');
opcao := readkey;
until opcao = #27;

O exemplo acima repete a seguinte situação:
Pergunta ao usuário qual opção.
lê do teclado um caracter, com a função readkey, o que em scripvox
é o mesmo que o comando lê com o modificador e comercial ao fim da linha.
Faz isso até que o usuário aperte esc.

[5.3] For
Usado sempre que desejamos repetir um trecho um número determinado de vezes.

Para usar esse comando, precisamos declarar uma variável do tipo inteiro, que
servirá como controladora.
Sintaxe:
for valorinteiro := valorinicial to valor final do
condicao;
ou ainda:

for valorinteiro := valorinicial to valor final do
begin
instrucao1;
instrucao2;
instrucao3;
..
end;

Vamos ver o exemplo abaixo:

program hojeedomingo;
uses
dvcrt, dvwin;

var contadora : integer;

begin
sintinic (0, '');

For contadora := 1 to 100 do
sintwriteln ('Hoje é domingo');
sintfim;
end.

Temos acima um programa que vai escrever na tela 100 vezes a frase 'hoje é domingo'.

Primeiro, declaramos uma variável do tipo inteiro, que chamamos de contadora;
Depois, no corpo do programa, usamos o for:
for contadora := 1 to 100 do
Podemos traduzir como:
Para contadora de 1 até 100 faça
A linha abaixo então será repetida até que a variável contadora tenha o valor 100.
O valor inicial será 1.
A cada vez que a instrução é executada, a variável recebe mais 1.
Ao chegar em 100, a instrução não é mais executada.
