Estruturas Condicionais Lógica de Programação Prof. Kleber Rezende
Considerações Iniciais Nos capítulos anteriores foram apresentados alguns conceitos básicos sobre as estruturas e comandos que são utilizados para construir um algoritmo simples. Como visto, podemos solicitar valores de ENTRADA aos usuários do sistema utilizando o comando LEIA, e podemos ainda enviar valores de saída do sistema por meio do comando ESCREVA.
Considerações Iniciais Entretanto, as possibilidades de construção de algoritmos que temos até o presente momento são bastante limitadas, pois ainda não estamos aptos a tomar decisões durante o tempo de execução do algoritmo, ou até mesmo de classificar determinados valores de variáveis.
Considerações Iniciais Por exemplo, considere que precisamos desenvolver um algoritmo que classifique uma determinada pessoa entre MAIOR DE IDADE ou MENOR DE IDADE. Para esse problema sabemos que precisamos avaliar a IDADE da pessoa, e que SE essa idade for maior (ou igual) que 18 anos a pessoa é considerada MAIOR DE IDADE. Para resolver esse tipo de situação, onde um determinado valor é avaliado para, a partir do resultado dessa avaliação, executarmos alguma ação, utilizamos as ESTRUTURAS DE CONDIÇÃO.
Estrutura de condição SE ENTAO A principal estrutura de condição utilizada é a SE ENTAO; Ela é utilizada da seguinte forma: SE <EXPRESSÃO LÓGICA> ENTAO FIMSE COMANDO
Estrutura de condição SE ENTAO Onde, 1) A EXPRESSÃO LÓGICA é uma expressão que deverá retornar um valor VERDADEIRO ou FALSO, e caso o resultado dessa EXPRESSÃO seja VERDADEIRO, será executado o COMANDO que está dentro da ESTRUTURA. Alguns exemplos de expressões lógicas já foram vistos anteriormente, a seguir temos mais alguns exemplos: 18 > 20, cujo resultado será FALSO 45 = 45, cujo resultado será VERDADEIRO MEDIA > 7, cujo resultado dependerá do valor da variável MEDIA
Estrutura de condição SE ENTAO Onde, 2) O COMANDO é uma linha (ou sequência) de código que será executado somente quando o resultado da EXPRESSÃO LÓGICA for VERDADEIRO 3) FIMSE indica que a ESTRUTRA SE ENTAO chegou ao final.
Estrutura de condição SE ENTAO Em C, teríamos: if (<EXPRESSÃO LÓGICA>) { COMANDO }
Estrutura de condição SE ENTAO Voltando ao nosso problema de classificar uma pessoa como MAIOR ou MENOR de IDADE, podemos utilizar a estrutura de condição SE ENTAO da seguinte maneira: algoritmo "condicao" variável inteiro idade inicio escreva("digite a sua idade") leia(idade) se idade >= 18 entao escreva("voce é maior de idade") fimse Fimalgoritmo
Estrutura de condição SE ENTAO Em C... main() { int idade; printf( Digite sua idade: ); scanf ( %d, &idade); } if (idade >= 18) { printf( Você é maior de idade! ); }
SE ENTAO - Fluxograma Início Leia Idade Idade >= 18? Verdadeiro Falso Escreva Você é maior de idade Fim
Estrutura de condição SE ENTAO SENAO O algoritmo anterior resolve o nosso problema quando a pessoa é MAIOR DE IDADE, porém não nos dá nenhum retorno para quando a mesma for MENOR DE IDADE. Para contornar esse tipo de situação, a ESTRUTURA DE CONDIÇÃO SE ENTAO, oferece a possibilidade de executarmos uma determinada ação ou comando, se o resultado da EXPRESSÃO LÓGICA for VERDADEIRO e de executarmos uma ação diferente se o resultado da EXPRESSÃO LÓGICA for FALSO. Para essas situações é utilizado o comando SENAO.
SE ENTAO SENAO - Fluxograma Início Leia Idade Idade >= 18? Verdadeiro Falso Escreva Você é maior de idade Escreva Você é menor de idade Fim
SE ENTAO SENAO - Algoritmo algoritmo "condicao" variável inteiro idade inicio escreva("digite a sua idade") leia(idade) se idade >= 18 entao escreva("você é MAIOR de idade") senao escreva("você é MENOR de idade") fimse Fimalgoritmo
SE ENTAO SENAO C main() { int idade; printf( Digite sua idade: ); scanf ( %d, &idade); } if (idade >= 18) { printf( Você é MAIOR de idade! ); } else { printf( Você é MENOR de idade! ); }
Utilizando variáveis Em todos os exemplos vistos até o presente momento, o resultado que é enviado para a tela (a saída do sistema) é escrito logo após a verificação da EXPRESSÃO LÓGICA e dentro da ESTRUTURA DE CONDIÇÃO; Mas isso não é uma regra, podemos simplesmente armazenar informações em variáveis e escrever o resultado obtido somente no final.
Utilizando variáveis Por exemplo, no algoritmo que avalia se uma determinada pessoa é MAIOR DE IDADE ou se é MENOR DE IDADE, poderíamos criar uma variável que pudesse receber a situação em que a pessoa se encontra e depois simplesmente escrever o valor dessa variável.
Utilizando variáveis Veja como ficaria: algoritmo "condicao" variável inteiro idade cadeia maioridade inicio escreva("digite a sua idade") leia(idade) se idade >= 18 entao maioridade "MAIOR" senao maioridade "MENOR" fimse escreva( você é, maioridade, de idade ) Fimalgoritmo
Utilizando variáveis C main() { int idade; char maioridade[6]; printf( Digite sua idade: ); scanf ( %d, &idade); } if (idade >= 18) { strcpy (maioridade, MAIOR ); //strcpy = string copy função que copia o conteúdo da //segunda string (cadeia de caracteres) para a primeira. //Equivale a uma atribuição maioridade = MAIOR } else strcpy (maioridade, MENOR ); printf( Você é %s de idade!, maioridade);
Utilizando variáveis - Fluxograma Início Leia Idade Verdadeiro Idade >= 18? Falso maioridade MAIOR maioridade MENOR Escreva Você é + maioridade + de idade Fim
Exemplos de Aplicação Vamos reconsiderar agora o exercício feito na última aula: ---------------------------------------------------------------------- Elabore um algoritmo que leia dois números inteiros e imprima a seguinte saída: Dividendo: Divisor: Quociente: Resto: Para a resolução desse algoritmo utilize os comandos MOD(%) e DIV(/) para o cálculo do resto e do quociente da divisão. ----------------------------------------------------------------------
Análise do Problema Entrada: Nosso programa necessitará que o usuário informe dois valores inteiros (O Dividendo e o Divisor) Processamento: O programa deverá calcular o quociente e o resto da divisão inteira do dividendo pelo divisor;
Análise do Problema Saída: O programa deverá escrever as informações conforme especificação feita no enunciado do problema. Dividendo: <valor informado pelo usuário> Divisor: <valor informado pelo usuário> Quociente: <valor calculado na fase de processamento> Resto: <valor calculado na fase de processamento>
Refinando a fase de processamento Para calcular o quociente, pode-se usar a seguinte expressão: quociente dividendo div divisor ou, em C... quociente = dividendo / divisor;
Refinando a fase de processamento Para calcular o resto, pode-se usar a seguinte expressão: resto dividendo mod divisor ou, em C... resto = dividendo % divisor;
Refinando a fase de processamento Pergunta 1: E se o usuário informar (digitar) valor zero (0) para a variável divisor? Resposta 1: Teremos um problema com a matemática (divisão por zero) e, consequentemente, com nosso programa (ele será abortado)!
Refinando a fase de processamento Pergunta 2: O que fazer diante desta possibilidade? Resposta 2: Teremos de acrescentar um comando condicional antes da realização dos cálculos.
Refinando a fase de processamento Início Leia Dividendo Leia Divisor Antes, tínhamos: Calcule Quociente Calcule Resto Imprima Resultados Fim
Refinando a fase de processamento Início Leia Dividendo Leia Divisor Verdadeiro Calcule Quociente Divisor!= 0? Falso Calcule Resto Imprima Resultados Fim
Refinando a fase de processamento Início Leia Dividendo Leia Divisor Verdadeiro Calcule Quociente Calcule Resto Imprima Resultados Divisor!= 0? Fim Falso Imprima Mensagem de Erro
Expressões Lógicas Compostas Como vimos anteriormente, é possível compor expressões lógicas utilizando operadores relacionais como (<, >,!=, ==,<=, >=) É possível também compor expressões lógicas utilizando os operadores E (&&), OU ( ) e NÃO (!).
Expressões Lógicas Compostas Nesse sentido, a expressão lógica que será avaliada na estrutura de condição SE ENTAO também pode ser formada por uma expressão lógica composta. Por exemplo, considere a situação de um determinado aluno em uma disciplina.
Expressões Lógicas Compostas Sabe-se que para ser aprovado, é necessário que um aluno tenha: NOTA >= 7.0 E FREQUENCIA >= 75 %.
Expressões Lógicas Compostas Veja que para avaliar essa situação necessitaremos utilizar o operador lógico E da seguinte forma: SE (nota >= 7) E (freqüência >= 0.75) ENTAO ESCREVA( O aluno está aprovado ) SENAO ESCREVA( O aluno está reprovado ) FIMSE
Expressões Lógicas Compostas algoritmo "aluno" variavel real nota, frequencia início escreva("digite a nota do aluno") leia(nota) escreva("digite a frequencia do aluno") leia(frequencia) se (nota >= 7) E (frequencia >= 0.75) entao escreva("o aluno está aprovado") senao escreva("o aluno está reprovado") fimse Fimalgoritmo
Se Entao Senao ANINHADAS Dentro de uma estrutura SE ENTAO SENAO é perfeitamente possível utilizarmos mais de uma linha de COMANDO, ou até mesmo outras estruturas SE ENTAO SENAO. Existem situações em que os caminhos para a tomada de uma decisão acabam formando uma espécie de árvore com diversas ramificações.
Se Entao Senao ANINHADAS Nesses casos, podemos recorrer à utilização de várias estruturas SE ENTAO SENAO embutidas umas dentro das outras, comumente chamadas de NINHOS.
Se Entao Senao ANINHADAS Por exemplo, suponha que desejemos refinar um pouco mais o problema referente às médias dos alunos de uma dada disciplina. Sabemos que um aluno é APROVADO caso apresente MÉDIA maior ou igual a 7.0 e FREQUENCIA maior ou igual a 75%.
Se Entao Senao ANINHADAS Se o aluno obtiver a FREQUENCIA mínima exigida e uma MÉDIA entre 4 e 7, o mesmo ainda teria direito a uma última avaliação de RECUPERAÇÃO. Como faríamos para resolver o problema em questão utilizando apenas estruturas de condição SE ENTAO SENAO?
Se Entao Senao ANINHADAS Poderíamos começar avaliando a FREQUENCIA do aluno, e se a mesma for menor que 75% o aluno já estaria REPROVADO; Porém, caso a FREQUENCIA respeite o mínimo exigido, teremos que avaliar a MÉDIA para saber se o mesmo está APROVADO, em RECUPERAÇÃO ou REPROVADO.
Se Entao Senao ANINHADAS Início Leia Média Leia Frequência Verdadeiro Frequência < 0.75? Falso Escreva Você está reprovado por faltas! Avalie a Média Fim
Se Entao Senao ANINHADAS No momento em que é verificado que a FREQUENCIA é menor que 0.75 (75%) o aluno já está imediatamente REPROVADO; Caso a FREQUENCIA seja maior ou igual a esse valor, devemos continuar com o algoritmo para avaliar em que situação que o aluno se encontra;
Se Entao Senao ANINHADAS Enfim, agora é necessário avaliar a MEDIA do mesmo, verificando se está acima de 7.0 (APROVADO), entre 4 e 7.0 (RECUPERACAO), ou abaixo de 4.0 (REPROVADO).
Refinando o passo Avalie a Média Verdadeiro Média >= 7.0? Falso Escreva Você está aprovado! Verdadeiro Média >= 4.0? Falso Escreva Você está em Recuperação! Escreva Você está reprovado por Média! Fim
Refinando o passo Avalie a Média Início Leia Média Leia Frequência Frequência < 0.75? Falso Verdadeiro Verdadeiro Média >= 7.0? Falso Escreva Você está reprovado por faltas! Escreva Você está aprovado! Média >= 4.0? Escreva Você está em Recuperação! Verdadeiro Falso Escreva Você está reprovado por Média! Fim
Se Entao Senao ANINHADAS algoritmo "aluno" variavel real media, frequencia início escreva("digite a media e a frequencia") leia(media, frequencia) se frequencia < 0.75 entao escreva("voce esta reprovado por FALTAS") senao se media >= 7 entao escreva("voce esta APROVADO") senao se media >= 4 entao escreva("voce esta em RECUPERACAO") senao escreva("voce esta REPROVADO POR MEDIA") fimse fimse fimse Fimalgoritmo
Comando Escolha (Switch) Na aula de hoje, vamos considerar seguinte problema: ---------------------------------------------------------------------- Elabore um algoritmo que leia um número inteiro entre 1 e 12 e imprima o nome do mês correspondente. Caso seja digitado um valor fora desse intervalo, deverá ser exibida uma mensagem informando que não existe mês com esse número. ---------------------------------------------------------------------- A seguir, podemos visualizar algumas possíveis soluções para o problema:
Comando Escolha (Switch) algoritmo MesDoAno" variavel inteiro mes início escreva("digite um número entre 1 e 12") leia(mes) se (mes < 1) OU (mes > 12) entao escreva( Mês INEXISTENTE") senão se mes = 1 entao escreva( Mês de Janeiro!") fimse se mes = 2 entao escreva( Mês de Fevereiro!") fimse... se mes = 12 entao escreva( Mês de Dezembro!") fimse fimse Fimalgoritmo
Comando Escolha (Switch) algoritmo MesDoAno"... leia(mes) se (mes < 1) OU (mes > 12) entao escreva( Mês INEXISTENTE") senão se mes = 1 entao escreva( Mês de Janeiro!") senão se mes = 2 entao escreva( Mês de Fevereiro!") senão... se mes = 12 entao escreva( Mês de Dezembro!") fimse fimse fimse fimse Fimalgoritmo
Comando Escolha (Switch) A segunda solução é mais eficiente que a primeira, pois realiza um número médio de comparações menor; Porém, o código fica mais extenso e, às vezes, confuso; Será possível criarmos um código enxuto e eficiente ao mesmo tempo?
Comando Escolha (Switch) A resposta é sim. Com a estrutura Escolha... Caso (Switch... Case, em C); Nessa estrutura, o valor de uma determinada variável é avaliado e CASO esse valor coincida com um valor pré-estabelecido, um COMANDO (ou grupo de comandos) é executado.
Comando Escolha (Switch) A estrutura de condição ESCOLHA CASO é utilizada da seguinte forma: Escolha <nome da variável> Caso <valor1> COMANDO Caso <valor2> COMANDO FimEscolha
Comando Escolha (Switch) Exemplo No exemplo a seguir, a variável n do tipo inteiro é testada, e CASO a mesma tenha valor 1 é escrito na tela um, CASO a mesma tenha valor 2 é escrito na tela dois algoritmo "teste" variavel inteiro n inicio escreva("digite n") leia(n) escolha n caso 1 escreva("um") caso 2 escreva("dois") fimescolha Fimalgoritmo
Comando Escolha (Switch) Exemplo Em C main() { int n; printf("digite n: "); scanf ( %d, &n); switch (n) { case 1: printf("um"); break; case 2: printf("dois"); break; } }
Comando Escolha (Switch) Da mesma maneira que a estrutura de condição SE ENTAO SENAO possibilita que executemos algum comando quando a expressão avaliada não é VERDADEIRA, a estrutura de condição ESCOLHA CASO também nos oferece essa opção
Comando Escolha (Switch) A sintaxe para utilizarmos essa opção é mostrada a seguir: Escolha <nome da variável> Caso <valor1> COMANDO Caso <valor2> COMANDO Outrocaso COMANDO FimEscolha
Comando Escolha (Switch) Exemplo Trabalhando com o nosso exemplo anterior, agora a variável n do tipo inteiro é testada, e CASO a mesma tenha valor 1 é escrito na tela um, CASO a mesma tenha valor 2 é escrito na tela dois, e CASO não tenha nenhum desses valores será escrito na tela outro valor : algoritmo "teste" variavel inteiro n inicio escreva("digite n") leia(n) escolha n caso 1 escreva("um") caso 2 escreva("dois") outrocaso escreva( outro valor") fimescolha Fimalgoritmo
Comando Escolha (Switch) Exemplo Em C main() { int n; printf("digite n: "); scanf ( %d, &n); switch (n) { case 1: printf("um"); break; case 2: printf("dois"); break; default: printf("outro valor"); break; } }
Comando Escolha (Switch) Voltando ao Problema Inicial algoritmo MesDoAno" variavel inteiro mes início escreva("digite um número entre 1 e 12") leia(mes) escolha mês caso 1: escreva( Mês de Janeiro!") caso 2: escreva( Mês de Fevereiro!") caso 3: escreva( Mês de Março!") caso 4: escreva( Mês de Abril!") caso 5: escreva( Mês de Maio!") caso 6: escreva( Mês de Junho!") caso 7: escreva( Mês de Julho!") caso 8: escreva( Mês de Agosto!") caso 9: escreva( Mês de Setembro!") caso 10: escreva( Mês de Outubro!") caso 11: escreva( Mês de Novembro!") caso 12: escreva( Mês de Dezembro!") outrocaso: escreva( Mês INEXISTENTE") fimescolha Fimalgoritmo
Comando Escolha (Switch) Exercício Criar um algoritmo que leia dois números inteiros, e que solicite ao usuário qual a operação que o mesmo deseja realizar entre esses números. Caso o usuário digitar o caractere * será realizada uma multiplicação; Caso seja digitado o caractere / será realizada uma divisão; Caso seja digitado o caractere + será realizado uma adição entre os números; Caso seja digitado o caractere - será realizada uma subtração.