Técnicas de Programação
Estruturas de Decisão Material Teórico Responsável pelo Conteúdo: Profa. Esp. Margarete Eliane da Silva Almendro Revisão Textual: Prof. Ms. Luciano Vieira Francisco
Estruturas de Decisão Introdução Estrutura Condicional Simples If Tabela Verdade Estrutura If-Else Estrutura If-Else Aninhada Estrutra Switch-Case Desenvolver a visão de algoritmos, bem como da análise de problemas de decisão e da formulação de algoritmos. Traduzir algoritmos em programas, especificamente na linguagem de programação Java. Estimular o pensamento de programação computacional. Caro(a) aluno(a), Nesta Unidade você terá uma visão do que vem a ser algoritmos de programação, assunto que lhe proporcionará uma metodologia de análise de problemas e formulação de algoritmos, utilizando os comandos básicos de atribuição e comparação. Ou seja, ajudando-o a traduzir os algoritmos em programas com uma linguagem de alto nível. Especificamente nesta Unidade, utilizaremos a linguagem Java. 5
Unidade: Estruturas de Decisão Contextualização Reflita sobre a seguinte situação: Você precisa desenvolver um programa que apresente a média da nota de um estudante de determinado centro de ensino. Ao programar, precisará também fazer constar se o aluno está aprovado ou reprovado, conforme a média obtida. Observe que será necessário analisar a média desse estudante para, então, tomar uma decisão. Assim, torna-se importante aprender os recursos de tomadas de decisão, os quais conhecidos como If, Else e Switch. 6
Introdução Em nosso dia a dia frequentemente encontramos situações de decisão. Usar o ônibus, o trem ou o carro particular? Quando tratamos de programação não é diferente, pois também nos deparamos com diversas situações de decisão, tais como mostrar o status final de uma disciplina, especificamente se o aluno foi aprovado ou se deverá fazer o exame? Tais estruturas são utilizadas para controlar o fluxo de execução dos programas, possibilitando que caminhos alternativos sejam seguidos de acordo com o resultado de uma condição ou mais condições. If é o comando que define os caminhos a serem seguidos pelo fluxo do algoritmo, permitindo que apenas valores booleanos sejam testados. Se o valor passado como parâmetro para o comando if for true verdadeiro o bloco if é executado; caso contrário, o bloco else é executado. Dito de outra forma, o parâmetro passado para o comando if deve ser um valor booleano, ou o código não compilará. O comando else e seu bloco são opcionais. Existem três tipos de estruturas de decisão, a saber: If; If-else; Switch-case. Nesta Unidade veremos cada uma, quais suas particularidades tanto em pseudocódigo, quanto em programação Java. 7
Unidade: Estruturas de Decisão Estrutura Condicional Simples If É chamada de estrutura de decisão única, pois seleciona uma única ação ou um grupo de ações. Quando temos tal situação, o caminho apenas será executado caso a decisão seja verdadeira. Como vimos, o comando de decisão somente se utilizará de um valor booleano. Pseudocódigo: se(condição) instruções fim_se se(altura >= 1.80) Exiba( Você é Alto ) fim se Java: if(condição){ instruções; if( altura >= 1.80){ JOptionPane.showMessageDialog(null, Você é Alto ); Onde: Executa as <instruções> se a condição for verdadeira, enquanto condição é uma expressão lógica e, portanto, deve resultar no valor lógico F ou V. Verifiquemos um exemplo completo do comando if simples. Escreva um algoritmo que solicite um número inteiro ao usuário e mostre-o caso seja par. Pseudocódigo: Algoritmo par inteiro num Inicio escreva Entre com um número inteiro leia num se (num%2==0) escreva O número: + num + é par fim-se fim. Nesses algoritmos notamos que existe um caminho que pode ou não ser executado, daí vem a decisão: caso o módulo do número por dois for igual a zero, esse seguirá o caminho de exibição, que é mostrar que o número digitado é par. Vamos agora implementar o nosso algoritmo em linguagem de programação Java. 8
Em Java: Figura 1 Importante! Note que esse exemplo é uma imagem, assim como os demais apresentados nesta Unidade. A ideia é tornar a linguagem mais próxima do programador fazendo um exercício de digitação pertinente ao seu aprendizado. Assim, ao fazê-lo, não esqueça de fechar as chaves e organizar a endentação organização de seu código. Note também que o alinhamento das chaves é fundamental para a leitura de qualquer pessoa que fizer uma possível manutenção. Vamos fazer um teste de mesa do último exemplo? Caso o usuário tenha atribuído o valor 55 para a variável num, qual mensagem deverá aparecer? Como temos a condição: if (num%2==0) Esta sentença será falsa, logo, não deverá aparecer a mensagem O número 55 é par. 9
Unidade: Estruturas de Decisão Tabela Verdade Abaixo temos a tabela verdade, a qual nos ajudará nos testes de mesa: Variável A Variável B Variável E, && V V V V F F F V F F F F Variável A Variável B Operador OU, ll V V V V F V F V V F F F A tabela verdade é uma regra que deve ser aplicada na construção de uma sentença de decisão. Em nosso caso, como o computador só entende 0 e 1 ou verdadeiro e falso, essa se encaixa para as sentenças de condicionais. Uma sentença condicional pode ter várias condições dentro de si, por exemplo: Se((A<B) e(a>c)) Note que esta sentença só poderá gerar uma resposta válida. Assim, testaremos tal sentença com os seguintes valores A = 10. B = 8. C = 12. Qual será o valor booleano que essa mostrará? Vamos por partes: Se ((A<B) e (A>C)) V e F F Testemos com outros valores: A = 10. B = 8. C = 8. 10
Eis o valor booleano que essa mostrará: Se ((A<B) e (A>C)) V e V V Testemos com outros valores: A = 10. B = 12. C = 8. Eis o valor booleano que essa mostrará: Se ((A<B) e (A>C)) F e V F Testemos com outros valores: A = 8. B = 9. C = 10. Eis o valor booleano que essa mostrará: Se ((A<B) e (A>C)) F e F F As demais estruturas deste material teórico deverão obedecer às regras da tabela verdade. Fique atento(a), pois segundo Pressman (2011), em programação e construção de algoritmos estima-se que 90% dos erros ocorrem nas estruturas de decisão. 11
Unidade: Estruturas de Decisão Estrutura If-Else Nesta estrutura temos a possibilidade de dois caminhos distintos, porém, um dos quais é obrigatório. Exemplo: é preciso ir ao trabalho! Deve-se então ir de carro ou de ônibus. Ou seja: você deverá ir ao trabalho de qualquer jeito, seja de carro ou de ônibus. Ainda que a decisão sobre o meio de transporte que será utilizado seja sua, não lhe é dada a possibilidade de não ir ao trabalho! Essa é chamada de estrutura condicional composta, pois seleciona entre duas ações ou diferentes grupos de ações. Pseudocódigo: se(condição) instruções 1 instruções 2 fim_se se(velocidade>60) inicio escreva( Velocidade acima do permitido ) fim inicio escreva( Velocidade controlada ) fim fim se Java: if (condição){ instruções 1 else { instruções 2 if(velocidade>60){ JOptionPane.showMessageDialog(null, Velocidade acima do permitido ); else { JOptionPane.showMessageDialog(null, Velocidade controlada ); Onde: Condição é uma expressão lógica e, portanto, deve resultar no valor lógico F ou V. Executa as <instruções 1> se a condição for verdadeira, se for falsa executa as <instruções 2>. Verifiquemos um exemplo completo do comando if-else: Implementar um programa em Java para determinar se uma pessoa é maior ou menor de idade. 12
Pseudocódigo: Algoritmo idade_maior int Idade Início escreva Digite sua idade leia Idade se (Idade >= 18) escreva Maior de idade escreva Menor de idade fim_se Fim Nesse algoritmo notamos dois caminhos. Lembre-se que nesse caso de se um dos caminhos obrigatoriamente será executado, seja a idade menor, igual ou superior a dezoito anos com a respectiva mensagem exibida. Implementemos agora nosso algoritmo em linguagem de programação Java: Figura 2 Além dos cuidados já mencionados sobre digitação, fechamento das chaves e alinhamento, perceba também que: Importante! A diretiva if deve ter suas expressões sempre contidas entre parênteses; O único argumento válido para if é uma expressão lógica ou variável booleana condição; Os sinais de comparação (==) inseridos em if, se não entendidos como tais, podem ser confundidos com operadores de atribuição (=); As chaves não são obrigatórias para blocos if, uma vez que possuem apenas uma instrução; todavia, tome cuidado com eventuais erros de endentação. 13
Unidade: Estruturas de Decisão Estrutura If-Else Aninhada A estrutura condicional aninhada é similar à estrutura condicional simples. Um comando sempre será executado, independentemente da condição. Dito de outra forma, caso a condição seja verdadeira, seus comandos serão executados, ou ainda os comandos da condição falsa o serão. É empregada quando várias condições devem ser testadas. Dentro de uma estrutura se-então- é perfeitamente possível utilizarmos mais de uma linha de comando, ou até mesmo outras estruturas se-então-. Há situações em que os caminhos para a tomada de uma decisão acabam formando uma espécie de árvore com diversas ramificações, onde cada caminho é um conjunto de ações. Nesses casos podemos recorrer à utilização de várias estruturas se-então-se não embutidas umas dentro das outras, comumente chamadas de ninhos. Pseudocódigo: se(condição1) instruções 1 se(condição2) instruções 2 instruções 3 fim_se fim_se se(velocidade>60) inicio escreva( Velocidade acima do permitido ) fim se(num_placa%2==0) inicio escreva( Placa final Par ) fim inicio escreva( Placa final Impar ) fim fim se fim se Java: if (condição1){ instruções 1 else{ if (condição2){ instruções 2 else{ instruções 3 if(velocidade>60){ JOptionPane.showMessageDialog(null, ( Velocidade acima do permitido ); else{ JOptionPane.showMessageDialog(null, ( Velocidade controlada ); if(num_placa%2==0){ JOptionPane.showMessageDialog(null, ( Placa final Par ); else{ JOptionPane.showMessageDialog(null, ( Placa final Par ); 14
Exemplo: A partir de três valores A, B, C, verifique se esses podem ser os comprimentos dos lados de um triângulo. Se forem, escreva uma mensagem, informando se se trata de um triângulo equilátero, isósceles ou escaleno. Observações: O comprimento de um lado do triângulo é sempre menor do que a soma dos outros dois lados; Equilátero = três lados iguais; Isósceles = dois lados iguais; Escaleno = três lados diferentes entre si. Algoritmo triangulo real a,b,c Inicio escreva Entre com o valor de a: leia a escreva Entre com o valor de b: leia b escreva Entre com o valor de c: leia c se ((a<b+c) e (b<a+c) e (c<a+b)) escreva Estes valores formam um triangulo se ((a=b) e (b=c)) escreva Triangulo Equilátero se ((a=b) ou (b=c) ou (a=c)) escreva Triângulo Isósceles escreva Triangulo Escaleno fim_se fim_se escreva Estes valores não formam um triângulo fim_se fim Em Java: Figura 3 Parte lógica apenas das estruturas de decisão. 15
Unidade: Estruturas de Decisão Importante! Somando-se aos aspectos já frisados, perceba que fechar todas as chaves { apenas implica no acerto da sintaxe da linguagem. Nesse sentido, tome muito cuidado, pois ao fechar um bloco no meio, você comprometerá toda a estrutura de seu algoritmo! A seguir temos outro exemplo do tipo de estrutura aninhada if-else: Caso determinado motorista mantenha seu veículo com velocidade abaixo de 60km/h, verificar-se-á apenas o final da placa para fins de rodízio. Todavia, se esse motorista mantiver velocidade acima de 60km/h, aparecerá uma mensagem de Velocidade acima do permitido e também será verificado o final da placa para fins de rodízio: Pseudocódigo: se(condição1) se(condição2) instrução1 instrução2 instrução4 se(condição3) instrução1 instrução2 fim se Fim_se se(velocidade<60) se(num_placa%2==0) inicio escreva( Placa final Par ) fim inicio escreva( Placa final Impar ) fim inicio escreva( Velocidade acima do permitido ) se(num_placa%2==0) inicio escreva( Placa final Par ) fim inicio escreva( Placa final Impar ) fim fim se fim se fim se Java: if (condição1){ if (condição2){ instruções1 else{ instruções2 else{ instrução 4 if (condição3){ instruções1 else{ instruções2 if(velocidade<60){ if(num_placa%2==0){ JOptionPane.showMessageDialog(null, Placa final Par ); else{ JOptionPane.showMessageDialog(null, Placa final Ímpar ); else{ JOptionPane.showMessageDialog(null, Velocidade acima do permitido ); if(num_placa%2==0){ JOptionPane.showMessageDialog(null, Placa final Par ); else{ JOptionPane.showMessageDialog(null, Placa final Ímpar ); 16
Vamos colocar em prática outra situação: Imagine que necessitamos desenvolver um algoritmo e um programa que atenda às seguintes necessidades: Ao saber das notas de n1 e n2, um aluno precisa verificar se está Aprovado, de Exame, ou ainda Reprovado. Para ser aprovado, esse estudante deve ter a nota média de n1 e n2 igual ou superior a 6.0; para realizar o exame sua média de n1 e n2 deve ser menor que 6.0 e maior ou igual a 3.0; finalmente, a reprovação se dará se a média for abaixo de 3.0. Observação: muito embora a tarefa de construir o algoritmo seja solitária e sem um teste tão eficaz dos possíveis casos, trata-se ainda da melhor forma de corrigir o pensamento lógico do fluxo de desenvolvimento desse algoritmo. Algoritmo media real n1,n2,media Inicio escreva Entre com a primeira nota leia n1 escreva Entre com a segunda nota leia n2 m=(n1+n2)/2 se (m>=6) escreva Aprovado se (m>=3) escreva Exame escreva Reprovado fim_se Fim Em Java: Figura 4. 17
Unidade: Estruturas de Decisão Estrutura Switch-Case É uma forma simples para se definir diversos desvios no código a partir de uma única variável. Utilizada quando há várias seleções com muitas alternativas. Os comandos if-else e switch são de tomada de decisão. Sem dúvida alguma o mais importante é o if, mas o comando switch possui aplicações valiosas. Mais uma vez vale lembrar que devemos usar o comando correto no local certo. Isto assegura um código limpo e de fácil entendimento. O comando switch é próprio para se testar uma variável em relação a diversos valores pré-estabelecidos. Pode-se testar somente o tipo char e todos os tipos inteiros, menos long. Pseudocódigo: escolha(variável) caso <valor1>: instruções 1; caso <valor2>: instruções 2; caso <valor n>: instruções n; padrão: instruções; Fim_escolha escolha(mes) caso<1> escreva( Janeiro ); caso<2> escreva( Fevereiro ); caso<3> escreva( Março ); caso<4> escreva( Abril ); caso<5> escreva( Maio ); caso<6> escreva( Junho ); caso<7> escreva( Julho ); caso<8> escreva( Agosto ); caso<9> escreva( Setembro ); caso<10> escreva( Outubro ); caso<11> escreva( Novembro ); caso<12> escreva( Dezembro ); 18
Em Java: switch (variável){ case <valor1>: instruções 1; case <valor2>: instruções 2; case <valor n>: instruções n; default: instruções; switch(mes){ case 1: JOptionPane.showMessageDialog (null, Janeiro ); case 2: JOptionPane.showMessageDialog (null, Fevereiro ); case 3: JOptionPane.showMessageDialog (null, Março ); case 4: JOptionPane.showMessageDialog (null, Abril ); case 5: JOptionPane.showMessageDialog (null, Maio ); case 6: JOptionPane.showMessageDialog (null, Junho ); case 7: JOptionPane.showMessageDialog (null, Julho ); case 8: JOptionPane.showMessageDialog (null, Agosto ); case 9: JOptionPane.showMessageDialog (null, Setembro ); case 10: JOptionPane.showMessageDialog (null, Outubro ); case 11: JOptionPane.showMessageDialog (null, Novembro ); case 12: JOptionPane.showMessageDialog (null, Dezembro ); default: JOptionPane.showMessageDialog(null, Mês inesistente ); 19
Unidade: Estruturas de Decisão Observação: todas as declarações case devem conter valores de um mesmo tipo. O tipo da variável deve ser compatível com os valores das declarações case. Em cases com valores duplicados será gerado um erro em tempo de compilação. A declaração default é opcional. Break faz um desvio para a linha posterior ao final do bloco. Não é obrigatório não dá erro em tempo de execução, porém, se for deixado de lado todos os outros cases serão testados e as instruções do default serão executadas. Exemplo: Criar um algoritmo que solicite ao usuário o valor total da compra e a quantidade de parcelas a financiar, de modo que o sistema imprima o valor de cada parcela de acordo com os juros do seguinte Quadro: Quadro 2. N.º de parcelas % de juros 2 3% 4 7% 6 9% 8 12% Algoritmo parcela real valor_parcelado, valor_compra, valor_final inteiro qtde_parcelas, juros Início escreva Entre com o valor da compra leia valor_compra escreva Entre com a qtde de parcelas leia qtde_parcelas escolha (qtde_parcelas) Caso 2: juros = 3 pare Caso 4: juros = 7 pare Caso 6: juros = 9 pare Caso 8: juros = 12 pare padrão juros = -1 fim_escolha se(juros == -1) escreva Número de Parcelas incorreto valor_final = valor_compra + valor_compra * juros / 100 valor_parcelado = valor_final/qtde_parcelas Escreva O valor de cada parcela é + valor_parcelado fim_se fim 20
Em Java: Figura 5. 21
Unidade: Estruturas de Decisão Material Complementar Vídeos: Livros: LÓGICA de programação operadores e expressões lógicas. v. 9. 5 abr. 2013. Disponível em: https://www.youtube.com/watch?v=g8haxi-egsc MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Programação com sequência. In: Estudo dirigido de algoritmos. São Paulo: Érica, 2010a.. Programação com decisão. In: Estudo dirigido de algoritmos. São Paulo: Érica, 2010b. WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: Livros Técnicos e Científicos, 1999. 22
Referências ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos da programação de computadores: algoritmos, Pascal, C/C e Java. 2. ed. São Paulo: Pearson, 2010. CHRISTOS, P.; UMESH, V. Algoritmos. Porto Alegre, RS: Grupo A, 2011. DEITEL, H. M. Java: como programar. 6. ed. Porto Alegre, RS: Bookman, 2003. EDELWEISS, N.; GALANTE, R. Estruturas de dados. Porto Alegre, RS: Grupo A, 2011. FARRER, H. Algoritmos estruturados. 3. ed. Rio de Janeiro: Livros Técnicos e Científicos, 1999. FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de algoritmos e estrutura de dados. 3. ed. São Paulo: Makron Books do Brasil, 2005. FURGERI, S. Java 6: ensino didático: desenvolvendo e implementando aplicações. 2. ed. São Paulo: Érica, 2009. GOODRICH M. T.; TAMASSIA R. Estruturas de dados e algoritmos em Java. Porto Alegre, RS: Grupo A, 2011. HORSTMANN, C. Conceitos de computação com Java. 5. ed. Porto Alegre, RS: Grupo A, 2009. MANZANO, J. A. N. G. Algoritmos: lógica para desenvolvimento de programação. 24. ed. São Paulo: Érica, 2010. OLIVEIRA, J. F.; MANZANO, J. A. N. G. Tipos de dados e instruções primitivas. In: Algoritmos lógica para desenvolvimento de programação de computadores. [S.l.: s.n., 20--]. PRESSMAN, R. S. Engenharia de software. [S.l.]: McGraw Hill Brasil, 2011. VILARIM, G. O. Algoritmos: programação para iniciantes. Rio de Janeiro: Ciência Moderna, 2004. 23
Unidade: Estruturas de Decisão Anotações 24