A estrutura ENQUANTO é muito útil quando precisamos fazer um teste e não sabemos quantas vezes exatamente esse teste precisa ser feito. Contudo, você deve ter percebido que nós repetimos a leitura da nota em nosso exemplo anterior. Lemos a nota uma vez para então testar se ela era válida ou não. Caso fosse uma nota inválida, então fizemos a leitura da nota novamente dentro da repetição, como a seguir:
escreva("\nDigite uma nota: ") leia(nota) enquanto(nota < 0 ou nota > 10){ escreva("Nota inválida!\nDigite uma nota entre 0 e 10: ") leia(nota) }
Perceba que nós repetimos exatamente a mesma leitura feita antes da estrutura ENQUANTO. Não há nenhum problema e está correto, porém, há uma forma mais eficiente de fazer isso.
A estrutura ENQUANTO inicia testando para só depois realizar uma ação. Na lógica do nosso exemplo é exatamente o contrário, perceba que primeiro queremos tomar uma ação (pedir e ler uma nota) para só depois testar se ela é válida ou não.
Nestes casos podemos lançar mão da estrutura de repetição FAÇA ENQUANTO e nosso exemplo fica assim:
faca{ escreva("Digite uma nota: ") leia(nota) enquanto(nota < 0 ou nota > 10)
Dessa forma, primeiro será executado o que está entre o par de chaves, pedindo e lendo uma nota, para só depois testar se é válida ou não. Se o teste for verdadeiro, ou seja, se a nota for inválida, será feito novamente o que está dentro do par de chaves, até que seja digitada uma nota válida, quebrando assim a repetição.
programa{ // calcular a média de 20 notas válidas funcao inicio(){ real nota, media, somaNotas = 0.0 inteiro contador // primeira versão *************************************** para(contador = 1; contador <= 20; contador += 1){ escreva("\nDigite uma nota: ") leia(nota) enquanto(nota < 0 ou nota > 10){ escreva("Nota inválida!\nDigite uma nota: ") leia(nota) } somaNotas = somaNotas + nota } media = somaNotas / 5 escreva("Média: ", media) // segunda versão *************************************** para(contador = 1; contador <= 20; contador += 1){ faca{ escreva("\nDigite a nota ", contador, ": ") leia(nota) }enquanto(nota < 0 ou nota > 10) somaNotas = somaNotas + nota } media = somaNotas / 5 escreva("Média: ", media) } }