Estruturas de Decisao VisualG
Estruturas de Decisao VisualG
Estruturas de Decisao VisualG
LGICA DE PROGRAMAO
NESTE CAPTULO, ESTUDAREMOS A ESTRUTURA DE CONTROLE PARA TOMADA DE DECISES. SERO ABORDADOS OS SEGUINTES ASSUNTOS:
DESVIO CONDICIONAL SIMPLES, COMPOSTO E ENCADEADO OPERADORES RELACIONAIS OPERADORES LGICOS COMANDO DE SELEO MLTIPLA
Pgina 16
2.1.
TOMADA DE DECISES
At o momento estudamos como trabalhar com entradas, processamentos e sadas com a utilizao de variveis, constantes e operadores aritmticos. Apesar de j conseguir solucionar problemas e transform-los em programas, esses recursos so limitados. Imagine um programa que em determinado momento precisa tratar um dado para realizar um processamento mais adequado. Exemplo: Verificar se um aluno atingiu uma determinada mdia. Nesse caso, torna-se necessrio utilizar os recursos de tomada de deciso.
2.2.
se (condio a ser testada) entao //trecho de cdigo a ser executado caso a condio testada seja verdadeira fimse
Nesta instruo, se a condio estabelecida for verdadeira, sero executadas todas as instrues definidas entre se...entao e fimse e depois sero executadas todas as instrues existentes aps fimse. Se a condio for falsa, sero executadas as instrues que estiverem definidas aps a instruo fimse. Como exemplo, vamos considerar o seguinte problema: Ler dois valores numricos, efetuar a adio e apresentar o seu resultado caso o valor somado seja maior que 10. Os passos para a execuo deste problema seriam: 1. Ler dois valores (A e B) 2. Efetuar a soma dos valores A e B e armazenar o resultado da soma. 3. Exibir o resultado da soma caso seja maior que 10 No portugus estruturado representamos os passos acima atravs do seguinte algoritmo abaixo:
Pgina 17
algoritmo "Somar Numeros" var valor1, valor2, resultado_soma: inteiro inicio escreva ("Digite o valor do numero 1: ") leia (valor1) escreva ("Digite o valor do numero 2: ") leia (valor2) resultado_soma <- valor1 + valor2 se (resultado_soma > 10) entao escreva (" O resultado fimse fimalgoritmo No algoritmo acima, aps a definio dos nomes e tipos de variveis (bloco var), solicitada a leitura dos valores para as variveis valor1 e valor2 atravs do comando leia. Depois esses valores so implicados na varivel resultado soma, a qual possui o resultado da adio dos dois valores. Em seguida, questiona-se no programa uma condio que permitir imprimir o resultado da soma caso ela seja maior que 10, e no sendo, o programa encerrado sem apresentar a referida soma, uma vez que a condio falsa. 2.3. OPERADORES RELACIONAIS : ", resultado_soma)
Ao usar uma instruo de tomada de deciso, necessrio definir para ela uma condio, que o estabelecimento de uma relao lgica entre dois elementos, podendo ser: varivel X varivel ou varivel X constante. No exemplo anterior a relao lgica estabelecida foi se o valor armazenado na varivel resultado_soma maior que 10 (resultado_soma > 10). Para que uma relao lgica seja definida, passa a ser necessrio usar de um dos operadores relacionais existentes, os quais se encontram definidos na tabela a seguir: So seis os operadores lgicos presentes no portugus estruturado:
Pgina 18
SIGNIFICADO IGUAL MAIOR QUE MENOR QUE MAIOR OU IGUAL A MENOR OU IGUAL A DIFERENTE DE
Exemplos: A > B , valorA <> valorB, delta <= 0, X = -20 2.4. DESVIO CONDICIONAL COMPOSTO No desvio condicional composto utilizamos a instruo: se (condio a ser testada) entao //trecho de cdigo a ser executado caso a condio testada seja verdadeira senao //trecho de cdigo a ser executado caso a condio seja falsa fimse Nesta instruo, se a condio estabelecida for verdadeira, sero executadas todas as instrues definidas entre se...entao. Se a condio estabelecida for falsa, sero executadas todas as instrues que estiverem definidas entre senao e fimse. Somente aps a execuo de uma das possibilidades anteriores que o programa executar as instrues existentes aps fimse. Como exemplo da utilizao desta estrutura condicional, considere o seguinte problema: Ler dois valores numricos e efetuar a adio. Caso o valor somado seja maior ou igual a 10, deve ser apresentado somando a ele 5, caso o valor somado no seja maior ou igual a 10, deve ser apresentado subtrado dele 7 No portugus estruturado representamos os passos acima atravs do seguinte algoritmo abaixo:
Pgina 19
algoritmo "Somar Numeros" var A, B, R, T: inteiro inicio escreva ("Digite o valor de A: ") leia (A) escreva ("Digite o valor de B: ") leia (B) R <- A + B se (R > 10) entao T <- R + 5 senao T <- R 7 escreva (" O resultado da operao : ", T) fimse fimalgoritmo No algoritmo acima aps a definio das variveis, solicitada a leitura dos valores para as variveis A e B (leia(A) e leia(B)), em seguida a adio desses dois valores armazenada na varivel R (R <- A + B). Em seguida o programa testa uma condio que permitir imprimir o resultado da soma adicionando 5, caso ela seja maior ou igual a 10; e no sendo, o programa apresenta o resultado subtraindo 7. Vamos a outro exemplo: Construa um algoritmo que leia o preo de um produto (P) e apresente a mensagem: Em promoo, caso o preo seja maior ou igual a R$ 50,00. Caso contrrio, deve apresentar a mensagem: Preo Normal. algoritmo "PROMOO" var preco :real inicio escreva(DIGITE O PREO DO PRODUTO) leia(preco) se (preco >= 50) entao escreva(PROMOO) senao escreva(PREO NORMAL)
Pgina 20
fimse fimalgoritmo Para encerrar mais um exemplo: Num determinado Estado, para transferncias de veculos, o DETRAN cobra uma taxa de 1% para carros fabricados antes de 1990 e uma taxa de 1.5% para os fabricados de 1990 em diante, taxa esta incidindo sobre o valor de tabela do carro. O algoritmo abaixo l o ano e o preo do carro e a seguir calcula e imprime imposto a ser pago. algoritmo "Detran" var valorCarro,impostoPagar: real anoCarro: inteiro inicio escreva ("INFORME O ANO DO VECULO: ") leia (anoCarro) escreva ("INFORME O PRECO DO VECULO EM R$: ") leia (valorCarro) se (anoCarro < 1990) entao impostoPagar <- valorCarro * 0.01 senao impostoPagar <- valorCarro * 0.015 fimse escreval ("O VALOR DE IMPOSTO A PAGAR DE R$: ", impostoPagar) fimalgoritmo 2.5. DESVIO CONDICIONAL ANINHADO
Existem casos em que necessrio estabelecer algumas verificaes lgicas de condies definidas sucessivamente. A partir do momento em que uma determinada ao executada, ela pode tambm levar a outras condies, de forma que no haja limites. Dessa forma existe a possibilidade de usar uma condio dentro de outra condio, o que leva a uma estrutura de deciso encadeada ou aninhada. Podemos representar um desvio condicional aninhado no portugus estruturado da seguinte forma:
Pgina 21
se (condio 1 a ser testada) entao //trecho de cdigo a ser executado caso a condio testada seja verdadeira senao //trecho de cdigo a ser executado caso a condio seja falsa se (condio 2 a ser testada) entao //trecho de cdigo a ser executado caso condio 2 testada seja verdadeira senao //trecho de cdigo a ser executado caso a condio seja falsa fimse fimse
Observe que dentro da estrutura seno da primeira condio, existe uma outra estrutura se. Uma observao neste ponto que o programador dever encerrar as estruturas de condio uma de cada vez, neste caso primeiro colocamos o fimse da segunda condio e por ltimo o fimse da primeira condio. Considere o seguinte problema: Elaborar um programa que efetue o clculo do reajuste de salrio de um funcionrio. Considere que o funcionrio deve receber um reajuste de 15% caso seu salrio seja menor que 500. Se o salrio for maior ou igual a 500, mas menor ou igual a 1000, seu reajuste ser de 10%; caso seja ainda maior que 1000, o reajuste ser de 5%. No portugus estruturado representamos os passos acima atravs do seguinte algoritmo abaixo: algoritmo "Reajusta Salario" var salario,novo_salario: real inicio escreva ("Digite o salario atual do empregado: ") leia (salario) se (salario < 500) entao novo_salario <- salario * 1.15 senao se (salario <= 1000) entao novo_salario <- salario * 1.10
Pgina 22
senao novo_salario <- salario * 1.05 fimse fimse escreva ("O empregado teve o salario reajustado para: ", novo_salario) fimalgoritmo
Agora outro exemplo: Escreva um algoritmo que funcione como uma mquina de calcular operando da seguinte maneira: a) primeiro deve pedir os dois operandos; b) logo a seguir deve pedir o tipo de operao (+, -, * ou /) c) aps a escolha do operador, deve apresentar o resultado indicando que tipo de operao foi executado. Ex: a + b = 6; d) se o operador no for um dos especificados, mensagem deve informar o fato. algoritmo "Calculadora" var op1,op2: real operacao: caractere inicio escreva ("INFORME O OPERANDO 01: ") leia (op1) escreva ("INFORME O OPERANDO 02: ") leia (op2) escrevaL ("DIGITE: ") escrevaL (" + :PARA FAZER UMA OPERAO DE ADIO.") escrevaL (" - :PARA FAZER UMA OPERAO DE SUBTRAO") escrevaL (" * :PARA FAZER UMA OPERAO DE MULTIPLICAO") escrevaL (" / :PARA FAZER UMA OPERAO DE DIVISO") escreva ("OPERANDO: ")
Pgina 23
leia (operacao) se (operacao = "+") entao escreva("A ADIO DO OPERANDO 1 + OPERANDO 2 = ", op1 + op2) senao se (operacao = "-") entao escreva("A SUBTRAO DO OPERANDO 1 - OPERANDO 2 = ", op1 - op2) senao se (operacao = "*") entao escreva("A MULTIPLICAO DO OPERANDO 1 * OPERANDO 2 = ", op1 * op2) senao escreva("A DIVISO DO OPERANDO 1 / OPERANDO 2 = ", op1 / op2) fimse fimse fimse fimalgoritmo
2.6.
OPERADORES LGICOS
Em algum momento pode haver a necessidade de trabalhar com mais de uma condio dentro de uma nica deciso, e fazer alguns testes lgicos mltiplos. Quando houver a necessidade de utilizar mais de uma condio para uma mesma tomada de deciso deve ser utilizado um recurso denominado operador lgico. Os operadores lgicos mais comuns so: e (conjuno), ou (disjuno) e o no (negao) 2.6.1. OPERADOR E O operador lgico de conjuno e utilizado quando duas ou mais condies de uma determinada deciso necessitam ser verdadeiras para obter-se resultado lgico verdadeiro; caso contrrio, o resultado do valor lgico retornado ser falso. Se a primeira condio possui valor lgico falso, a segunda condio no precisa ser avaliada.
Pgina 24
Dessa forma o resultado lgico verdadeiro quando todas as condies envolvidas na deciso so verdadeiras. No portugus estruturado, este operador representado da seguinte forma:
se (condio1 a ser testada) e (condio2 a ser testada) entao //trecho de cdigo a ser executado caso a condio1 e a condio2 sejam verdadeira senao //trecho de cdigo a ser executado caso uma ou todas as condies sejam falsas fimse OBSERVAO: Para que o resultado lgico seja verdadeiro, todas as condies tm que ser verdadeiras. Considere o seguinte problema: A Justia Eleitoral de um municpio desenvolveu um programa para cadastramento de eleitores. Esse programa possui uma rotina para verificar se um eleitor obrigado a votar ou no. Consideremos que todos os eleitores so alfabetizados e o programa foi desenvolvido para a eleio de 2008. O programa solicita do eleitor o ano de seu nascimento e informa se ele est obrigado ou no a participar das eleies. No problema acima, o algoritmo dever calcular a idade do eleitor e verificar se sua idade est entre 18 e 70 anos. Com a utilizao do operador e, o exemplo mostra que somente ser apresentado que o eleitor obrigado a participar das eleies caso sua idade seja maior ou igual a dezoito e menor ou igual a 70 anos. Veja como fica agora a representao acima no portugus estruturado. algoritmo "VERIFICA ELEITOR var ano_nascimento, idade: inteiro inicio escreva ("Informe o ano de nascimento do eleitor: ") leia (ano_nascimento) idade <- 2008 - ano_nascimento
Pgina 25
se (idade >= 18) e (idade <= 70) entao escreva ("Eleitor obrigado a participar das eleies") senao escreva ("O eleitor no obrigado a participar das eleies") fimse fimalgoritmo 2.6.2. OPERADOR OU O operador lgico de disjuno ou utilizado quando pelo menos uma de duas ou mais condies de uma determinada deciso necessita ser verdadeiro para obter-se um resultado lgico verdadeiro, caso contrrio o valor do resultado lgico retornado ser falso. Dessa forma se a primeira condio possuir valor lgico verdadeiro a segunda condio no precisa ser avaliada. Sendo assim o resultado lgico verdadeiro quando pelo menos uma das condies envolvidas na deciso verdadeira. No portugus estruturado, este operador representado da seguinte forma:
se (condio1 a ser testada) ou (condio2 a ser testada) entao //trecho de cdigo a ser executado caso a condio1 ou a condio2 sejam verdadeira senao //trecho de cdigo a ser executado caso todas as condies sejam falsas fimse OBSERVAO: Para que o resultado lgico seja verdadeiro, apenas uma das condies tem que ser verdadeiras. Considere o seguinte exemplo: Em um programa de computador feito um teste para verificar se o usurio informou o seu estado civil de forma correta no sistema. O sistema apenas aceita os seguintes valores: solteiro e casado. Com a utilizao do operador lgico ou, o algoritmo verifica se um dos valores acima foi digitado. Caso um dos valores seja verdadeiro o sistema emite uma
Pgina 26
mensagem: Estado civil vlido; caso os dois valores sejam falsos mostrado uma mensagem informando que o estado civil invlido. Veja como fica a representao do problema acima no portugus estruturado.
algoritmo "VERIFICA ESTADO CIVIL" var estado_civil: caractere inicio escreva ("Informe o estado civil: ") leia (estado_civil) se (estado_civil = "Solteiro") ou "Casado") entao escreva ("Estado civil vlido") senao escreva ("Estado civil invlido") fimse fimalgoritmo (estado_civil =
2.6.3. OPERADOR NAO Por ltimo temos o operador lgico nao. Este operador faz com que seja executada uma determinada ao de uma deciso invertendo o seu resultado lgico. Se a condio for verdadeira e possuir a sua frente o operador nao, esta ser automaticamente considerada falsa, o inverso ocorrer para uma condio falsa que possua a sua frente o operador nao, que ser automaticamente considerada verdadeira. Resumindo, o operador nao faz com que seja executada uma determinada operao, invertendo o resultado lgico da condio. No portugus estruturado, este operador representado da seguinte forma:
Pgina 27
se nao (condio 1 a ser testada) entao // instrues executadas se a condio no for verdadeiras senao //trecho de cdigo a ser executado se a condio for verdareira fimse OBSERVAO: se nao diferente de senao O exemplo a seguir mostra a utilizao do operador no, que somente ser efetuado o clculo de C <- (A+B) * X, se o valor da varivel X no for maior que 5. Qualquer valor de 5 para baixo ser efetuado o clculo C <- (A + B) * X.
algoritmo "TESTE LGICO NO" var A,B,C,X : inteiro inicio leia (A, B, X) se nao (x > 5) entao C <- (A+B) * X senao C <- (A-B) * X fimse escreva (C)
2.6.4. PRIORIDADE DOS OPERADORES LGICOS Os operadores lgicos possibilitam o uso de mais de uma condio para a tomada de uma nica deciso. Para usar adequadamente os operadores lgicos, necessrio levar em conta sua ordem de prioridade. Veja na tabela abaixo a ordem padro de prioridade.
OPERADOR No E
PRIORIDADE 1 2
Pgina 28
Ou
Disjuno
Por exemplo, a expresso lgica: (A = B) e no (A > 5), deve ser avaliada a partir de no (A > 5) e somente depois de saber seu resultado que pode ser realizada avaliao do restante da expresso lgica. J a expresso (A = 1) ou (A >=4) e (A <=9) ser resolvida primeiro a parte da expresso submetida ao operador e para depois ser resolvida a parte da expresso submetida ao operador ou. Caso exista a necessidade de primeiro ser executada a avaliao lgica da expresso ou, neste caso a avaliao lgica deve ser definida entre parnteses como sendo: ((A = 1) ou (A >=4)) e (A <=9) Para testar o aprendizado, considere o exemplo a seguir: Sabendo que A=5, B=4 e C=3 e D=6, informe se as expresses abaixo so verdadeiras ou falsas. a) (A > C) e (C <= D) ( ) b) (A+B) > 10 ou (A + B ) = (C + D) ( ) c) (A >= C) e (D >= C) ( )
2.7.
Em algumas situaes ao chegarmos a uma determinada instruo de um algoritmo devemos selecionar um dentre alguns trechos a seguir, tendo como base para esta escolha um conjunto de valores. Exemplo: Testar o valor do estado civil de um determinado usurio (Solteiro,Casado,Divorciado,Vivo), Testar o tipo sanguneo (A,B,O,AB), entre outros exemplos.
Pgina 29
Para lidar com casos deste tipo foi criado o comando de seleo mltipla, que substitui as instrues de se...senao aninhandos. Em um determinado algoritmo necessrio escrever um cdigo para testar o tipo sanguneo informado pelo usurio. Poderamos resolver esse problema utilizando uma estrutura de tomada de deciso de forma aninhada, conforme o exemplo abaixo: se tipoSanguineo = A entao senao se tipoSanguineo = B entao senao se tipoSanguineo = AB entao senao fimse fimse fimse Como resolver esse problema utilizando Comandos de Seleo Mltipla? Este comando consiste de uma expresso (o seletor) e uma lista de comandos. Ou seja, caso o valor de uma varivel for igual ao que uma lista de alternativas testa, ento o comando desta varivel ser executado. Depois da execuo o controle vai para o prximo comando aps o CASO. Se no existir nenhum rtulo que satisfaa essa condio, o efeito do comando fica indefinido. O comando de seleo mltipla possui a seguinte representao no portugus estruturado: escolha (varivel) caso valor11, valor12, ..., valor1n //seqncia-de-comandos-1 caso valor21, valor22, ..., valor2m //seqncia-de-comandos-2 ... outrocaso //seqncia-de-comandos-extra fimescolha
O valor de expresso calculado e comparado seqencialmente com cada uma das opes valor1, valor2, etc.
Pgina 30
Se uma das opes for igual ao valor da expresso, a execuo continua a partir dos comandos associados a esse valor. Se nenhuma das opes for igual ao valor da expresso, a opo outrocaso ser selecionada e a execuo ir continuar a partir dos comandos associados mesma. Veja agora como ficaria o exemplo do Tipo Sanguneo: escolha tipoSanguineo caso "A" escreva ("A") caso "B" escreva ("B") caso "AB" escreva ("C") caso "O" escreva ("O") outrocaso escreva ("Tipo sanguneo invlido") fimescolha
2.8.
EXERCCIOS
QUESTO 01. Um usurio deseja um algoritmo onde possa escolher que tipo de mdia deseja calcular a partir de 3 notas. Faa um algoritmo que leia as notas, a opo escolhida pelo usurio e calcule a mdia. As opes podem ser: 1 - aritmtica 2 - ponderada (3, 3,4) QUESTO 02. Faa um algoritmo que leia um n inteiro e mostre uma mensagem indicando se este nmero par ou mpar, e se positivo ou negativo. QUESTO 03. A prefeitura de Eunpolis abriu uma linha de crdito para seus servidores. O valor mximo da prestao no poder ultrapassar 30% do salrio bruto. Atravs do salrio bruto e do valor da prestao, informar se o emprstimo pode ou no ser concedido.
Pgina 31
QUESTO 04. Escreva um programa em que calcule o valor a ser pago por produtos de uma loja, considerando o preo final da compra e a escolha da condio de pagamento. Os cdigos da tabela abaixo devem ser seguidos para ler qual a condio de pagamento escolhida e a efetuao do clculo.
QUESTO 05. Escreva um algoritmo que leia as idades de 2 homens e de 2 mulheres (considere que as idades dos homens sero sempre diferentes entre si, bem como as das mulheres). Calcule e escreva a soma das idades do homem mais velho com a mulher mais nova, e o produto das idades do homem mais novo com a mulher mais velha. QUESTO 06. Ler os valores de quatro notas escolares de um aluno. Calcular a mdia aritmtica e apresentar a mensagem Aprovada se a mdia obtida for maior ou igual a 7; caso contrrio, o programa deve solicitar a nota do exame de recuperao e calcular uma nova mdia aritmtica entre a nota de exame de recuperao e a primeira mdia aritmtica. Se o valor da nota da nova mdia for maior ou igual a sete, apresentar a mensagem Aprovada na Recuperao, caso contrrio apresentar a mensagem Reprovado. Informar junto com a mensagem o valor da mdia obtida.
QUESTO 07. Uma fruteira est vendendo frutas com a seguinte tabela de preos:
Se o cliente comprar mais de 8 Kg em frutas ou o valor total da compra ultrapassar R$ 25,00, receber ainda um desconto de 10% sobre este total. Escreva um programa para ler a quantidade (em Kg) de morangos e a quantidade (em Kg) de maas adquiridas e escreva o valor a ser pago pelo cliente. QUESTO 08. Determine o resultado das expresses lgicas (V ou F). Considere para as respostas os seguintes valores: X =1, A = 3, B = 5, C = 8, D = 7 a) no (X > 3) ( )
Pgina 32
b) c) d) e) f) g)
(X < 1) e no (B > D) ( ) no (X >3) ou (C < 7) ( ) (A > B) ou (C > B) ( ) (A > B) ou no (C > B) ( ) no (D > 3) ou no (B < 7) ( ) (D < 0) ou (C > 5) ( )
QUESTO 09. Ler trs valores para os lados de um tringulo, considerando lados como: A, B e C. Verificar se os lados formam um triangulo e se for verdadeiro, deve ser indicado qual tipo de tringulo foi formado: issceles, escaleno ou eqiltero. Obs.: um tringulo uma forma geomtrica composta de trs lados e o valor de cada lado deve ser menor que a soma dos valores dos outros dois lados.
QUESTO 10. Desenvolver um programa que leia um valor numrico inteiro e apresente-o caso seja divisvel por 4 e 5. No sendo divisvel por 4 e 5, o programa deve apresentar a mensagem: No divisvel por 4 e 5. Obs.: Para resolver esse problema necessria a utilizao do operador aritmtico mod que permite obter o resto da diviso de um valor por outro.
QUESTO 11. A OMS Organizao Mundial de Sade adotou o seguinte critrio de classificao para verificar se o peso das pessoas est dentro dos valores permitidos (normais) ou no.
Para obter estes valores da classificao a operao que se deve realizar peso dividido pela altura ao quadrado. O valor obtido desta operao deve ser aplicado tabela apresentada acima. Apresentar a situao de cada pessoa que est sendo consultada.
QUESTO 12. Calcular o valor do salrio e, o desconto de Imposto de Renda, com base na tabela abaixo.
Pgina 33
Apresentar o salrio bruto, o salrio liquido o valor de desconto de IR de cada funcionrio e, o total de reteno na fonte realizado por esta empresa.
QUESTO 13. Leia ms e ano do teclado e mostre o nmero de dias correspondente ao ms lido. QUESTO 14. Criar um programa para ler um nmero de 1 a 7 e informar o dia da semana correspondente, sendo domingo o dia de nmero 1. Se o nmero no corresponder a um dia da semana, mostrada uma mensagem de erro.
Pgina 34