Algoritmos Aula 08: Portugol Studio - Laços de Repetição com controles e condicionais aprimorados

Opção para abrir arquivos - Portugol Studio
Opção para abrir arquivos destacada em vermelho

Controlando o laço de repetição e aprimorando o uso de condicionais

    Na aula passada vimos como o Portugol Webstudio trabalho condicionais através dos comandos se(condição){instruções} e senao{instruções}, e também como ele faz um laço infinito com o comando enquanto(verdadeiro){instruções}No entanto existem outras situações de laço que não são infinitas que precisam ser abordadas.

    Para mostrar isso preciso que você recupere o último arquivo trabalhado, entrando no Portugol WebStudio, clicando na opção ABRIR ARQUIVO (foto acima) e dando um duplo click no arquivo media (1).por da sua pasta Downloads.

    Se tudo deu certo você deverá ter o seguinte programa na tela:
  1. programa {
  2.         funcao inicio () {
  3.                 real nota1,nota2,MediaFinal
  4.                 enquanto(verdadeiro){
  5.                 escreva("\nDigite a nota1:  ")
  6.                 leia(nota1)
  7.                 escreva("Digite a nota2:  ")
  8.                 leia(nota2)
  9.                 MediaFinal=(nota1+nota2)/2
  10.                 escreva("A média final: "+MediaFinal)
  11.                 se (MediaFinal>=5){
  12.                  escreva("\nAprovado")
  13.                 }
  14.                 senao{
  15.                  escreva("\nReprovado")
  16. }
  17.                 }
  18. }
    Se não tiver isso, talvez você tenha aberto o arquivo media.por ao invés de media (1).por, mas não tem importância. Selecione o código acima, depois copie e cole na tela do Portugol substituindo o código que você tiver nela. 

Limitando o laço de repetição

    Nesse último exemplo que você recuperou, o programa repetia indefinidamente as instruções situadas entre a linha 4 e 16 porque eles estavam entre o abre e fecha chaves {} da instrução enquanto(verdadeiro). Está lembrado?

    Nessa situação, ao invés de usar uma instrução enquanto(condição), usamos a expressão verdadeiro que forçou o enquanto() a fazer um loop infinito. Porém podemos inserir um controle para esse loop para que seja interrompido de acordo com uma resposta do usuário.

Mas como vou interromper o laço via código?

Fluxograma com laço e condicionais
Fluxograma com laço sendo interrompido por uma condição

    Eu posso introduzir um controle de fluxo condicional, perguntando ao usuário após o cálculo se ele deseja sair do programa. Em caso afirmativo podemos dar o comando PARE para interromper o laço. Examine o código abaixo prestando atenção às alterações em rosa:

  1. programa {
  2.         funcao inicio () {
  3.                 caracter resposta
  4.                 real nota1,nota2,MediaFinal
  5.                 enquanto(verdadeiro){
  6.                 escreva("\nDigite a nota1:  ")
  7.                 leia(nota1)
  8.                 escreva("Digite a nota2:  ")
  9.                 leia(nota2)
  10.                 MediaFinal=(nota1+nota2)/2
  11.                 escreva("A média final: "+MediaFinal)
  12.                 se (MediaFinal>=5){
  13.                  escreva("\nAprovado")
  14.                 }
  15.                 senao{
  16.                  escreva("\nReprovado")
  17. }
  18.                 escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
  19.                 leia(resposta)
  20.                 se(resposta=='s'){
  21.                         pare
  22.                 }
  23.                 }
  24. }

    Dessa vez eu criei uma variável do tipo caracter para armazenar uma letra chamada resposta. Mais abaixo na linha 18 eu solicitei ao usuário que entrasse com o valor dessa variável respondendo se deseja sair do programa com um 's'.

    Entre as linhas 20 e 22 eu coloquei o condicional se tendo como condição verdadeira resposta ser igual a 's'. Repare que desta vez utilizamos o operador de igualdade == , pois estamos testando o valor da variável. Isso não é a mesma coisa que resposta='s' que serve para atribuir um valor a variável. Se o usuário responder 's' para a pergunta, o comando pare é executado (linha 21). Rode e teste o programa.

    Outro detalhe é que, ao trabalhar com dados do tipo caracter é preferível que o usuário opte por usar o 'apostrofe' no lugar das "aspas" com os operadores comparativos e de atribuição. Na versão do Portugol Studio instalada, o uso de "aspas" com caracter pode dar erros de execução.

Testando mais de uma condição

   Se você testou exaustivamente o programa deve ter reparado que ele tem um "Bug". Em programação, Bug é um termo técnico para dizer que ele tem um defeito ou um problema. O defeito é que se o usuário responder utilizando um S maiúsculo, o programa não vai entender como SIM!

   Isso quer dizer que o condicional se deveria ter como condição resposta ser igual a 's' ou resposta ser igual a 'S' para ser considerado verdadeiro, mas como eu faço isso em Portugol? Nesse caso precisamos de um operador lógico ou que é usado para combinar duas ou mais condições. Se uma delas for verdadeira, a condição toda será considerada verdadeira.

    A estrutura do se com ou tendo mais de uma condição será assim:

se(condicão¹ ou condição² ou condição³ ... ou condição n){ ...  }

    Repare que todas as condições ficam dentro de um par de parenteses sendo separadas pelo OU. Então para o nosso problema temos que realizar a seguinte alteração:

  1. programa {
  2.         funcao inicio () {
  3.                 caracter resposta
  4.                 real nota1,nota2,MediaFinal
  5.                 enquanto(verdadeiro){
  6.                 escreva("\nDigite a nota1:  ")
  7.                 leia(nota1)
  8.                 escreva("Digite a nota2:  ")
  9.                 leia(nota2)
  10.                 MediaFinal=(nota1+nota2)/2
  11.                 escreva("A média final: "+MediaFinal)
  12.                 se (MediaFinal>=5){
  13.                  escreva("\nAprovado")
  14.                 }
  15.                 senao{
  16.                  escreva("\nReprovado")
  17. }
  18.                 escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
  19.                 leia(resposta)
  20.                 se(resposta=='s' ou resposta=='S'){
  21.                         pare
  22.                 }
  23.                 }
  24. }

    Altere o seu programa com o código acima e faça vários testes.

Outros operadores lógicos

    Além do OU o Portugol possui os operadores lógicos E e NAO que também poderão ser utilizados nas expressões lógicas das condições. Lembrando que seus nomes deverão ser escritos sempre em minúsculo. Exemplo: 

se(condicão¹ e condição² e condição³ ... e condição n){ ... }

    O operador E quando usado entre duas condições faz com que, se uma delas for falsa, toda a condição será falsa. Isso quer dizer que para uma condição dupla com o operador E ser verdadeira, as duas condições deverão ser satisfeita. Vamos a um exemplo prático:

    Na maioria das escolas, para ser aprovado um aluno precisa ter nota maior ou igual a 5, como também precisa ter uma frequência de aulas maior ou igual a 75%. Matematicamente isso seria escrito assim: 

MediaFinal>=5 E Frequencia>=75

    Se fossemos adaptar o nosso programa a essa nova situação, o que precisaria ser incluído? Pra começar precisaríamos criar uma variável para armazenar a frequência. Depois seria necessário providenciar que o usuário digitasse essa frequência. Posteriormente, testaríamos a frequência junto com a média para aprovar ou não o aluno. 

    Examine o código abaixo e repare nas alterações destacadas em rosa: 

  1. programa {
  2.         funcao inicio () {
  3.                 caracter resposta
  4.                 inteiro frequencia
  5.                 real nota1,nota2,MediaFinal
  6.                 enquanto(verdadeiro){
  7.                 escreva("\nDigite a nota1:  ")
  8.                 leia(nota1)
  9.                 escreva("Digite a nota2:  ")
  10.                 leia(nota2)
  11.                 escreva("Digite a Frequência:  ")
  12.                 leia(frequencia)
  13.                 MediaFinal=(nota1+nota2)/2
  14.                 escreva("A média final: "+MediaFinal)
  15.                 se (MediaFinal>=5 e frequencia>=75){
  16.                  escreva("\nAprovado")
  17.                 }
  18.                 senao{
  19.                  escreva("\nReprovado")
  20. }
  21.                 escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
  22.                 leia(resposta)
  23.                 se(resposta=='s' ou resposta=='S'){
  24.                         pare
  25.                 }
  26.                 }
  27. }

Te proponho um Desafio:    

    Digamos que eu queira incluir o nome do aluno antes de entrar com suas notas e depois de calcular a média quero que apareça "Fulano foi Aprovado" ou "Fulando foi reprovado". Tente fazer modificando o seu programa, rode e faça vários testes. Ao final salve o seu código conforme já ensinamos, que darei uma solução possível na próxima aula. 


Próxima Aula                                                                                                                        Aula Anterior

Referências

MANZANO, J. A. N. G. Portugol Studio: Programação de Computadores em Português. São Paulo: Propes Vivens, 2017. 86p

NOSCHANG, LUIZ et all. Portugol Studio: Uma IDE para Iniciantes em Programação. In: XXXIV Congresso da Sociedade Brasileira de Computação - CSBC, 34º, 2014, Brasília, Anais Eletrônicos do Congresso da Sociedade Brasileira de Computação, Brasília, 2014. p. 1287 - 1296. Disponível em: <https://sol.sbc.org.br/index.php/wei/article/view/10954/10824>. Acesso em: 4 ago. 2024.

PORTUGOL WEBSTUDIO. Ajuda. Disponível em: <https://portugol.dev/> Acesso em 05 ago. 2024.

PORTUGOL WEBSTUDIO. Dúvidas e Perguntas. Disponível em: <https://portugol.dev/> Acesso em 05 ago. 2024.