![]() |
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.
- programa {
- funcao inicio () {
- real nota1,nota2,MediaFinal
- enquanto(verdadeiro){
- escreva("\nDigite a nota1: ")
- leia(nota1)
- escreva("Digite a nota2: ")
- leia(nota2)
- MediaFinal=(nota1+nota2)/2
- escreva("A média final: "+MediaFinal)
- se (MediaFinal>=5){
- escreva("\nAprovado")
- }
- senao{
- escreva("\nReprovado")
- }
- }
- }
- }
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 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:
- programa {
- funcao inicio () {
- caracter resposta
- real nota1,nota2,MediaFinal
- enquanto(verdadeiro){
- escreva("\nDigite a nota1: ")
- leia(nota1)
- escreva("Digite a nota2: ")
- leia(nota2)
- MediaFinal=(nota1+nota2)/2
- escreva("A média final: "+MediaFinal)
- se (MediaFinal>=5){
- escreva("\nAprovado")
- }
- senao{
- escreva("\nReprovado")
- }
- escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
- leia(resposta)
- se(resposta=='s'){
- pare
- }
- }
- }
- }
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:
- programa {
- funcao inicio () {
- caracter resposta
- real nota1,nota2,MediaFinal
- enquanto(verdadeiro){
- escreva("\nDigite a nota1: ")
- leia(nota1)
- escreva("Digite a nota2: ")
- leia(nota2)
- MediaFinal=(nota1+nota2)/2
- escreva("A média final: "+MediaFinal)
- se (MediaFinal>=5){
- escreva("\nAprovado")
- }
- senao{
- escreva("\nReprovado")
- }
- escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
- leia(resposta)
- se(resposta=='s' ou resposta=='S'){
- pare
- }
- }
- }
- }
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:
- programa {
- funcao inicio () {
- caracter resposta
- inteiro frequencia
- real nota1,nota2,MediaFinal
- enquanto(verdadeiro){
- escreva("\nDigite a nota1: ")
- leia(nota1)
- escreva("Digite a nota2: ")
- leia(nota2)
- escreva("Digite a Frequência: ")
- leia(frequencia)
- MediaFinal=(nota1+nota2)/2
- escreva("A média final: "+MediaFinal)
- se (MediaFinal>=5 e frequencia>=75){
- escreva("\nAprovado")
- }
- senao{
- escreva("\nReprovado")
- }
- escreva("\nDigite s para sair ou apenas ENTER para continuar: ")
- leia(resposta)
- se(resposta=='s' ou resposta=='S'){
- pare
- }
- }
- }
- }
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.
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.