Mudanças entre as edições de "AULA de Introdução a Lógica de Programação - Comandos de Decisão"
(146 revisões intermediárias por 4 usuários não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
− | + | =Objetivos = | |
− | + | Após a aula o aluno deverá: | |
− | * | + | *Compreender condições para a tomada de decisão durante a execução dos algoritmos; |
− | |||
− | |||
− | + | *Compreender e utilizar os principais operadores relacionais e lógicos; | |
+ | |||
+ | *Identificar claramente dados de entrada e saída do algoritmo; | ||
+ | |||
+ | *Elaborar algoritmos simples usando fluxogramas e pseudocódigo com comandos de decisão e com aninhamento de comandos. | ||
+ | |||
+ | OBS: Toda a notação e semântica de operadores usada é baseada na Linguagem C para facilitar o estudo da Linguagem nas próximas aulas. | ||
+ | |||
+ | =Expressões com operadores relacionais= | ||
Na aula anterior estudamos como construir expressões usando operadores aritméticos e o operador de atribuição. Vamos continuar este tópico aumentando o poder das expressões através dos operadores relacionais e lógicos. | Na aula anterior estudamos como construir expressões usando operadores aritméticos e o operador de atribuição. Vamos continuar este tópico aumentando o poder das expressões através dos operadores relacionais e lógicos. | ||
Linha 30: | Linha 36: | ||
|- | |- | ||
|== | |== | ||
− | |igual a (se o operando a esquerda é | + | |igual a (se o operando a esquerda é igual ao da direita) |
|- | |- | ||
− | |!= | + | |!= ou ainda <> |
|diferente de (se o operando a esquerda é diferente do da direita) | |diferente de (se o operando a esquerda é diferente do da direita) | ||
|} | |} | ||
− | + | LEMBRETE: Os operadores mostrados são da linguagem C. Conferir os equivalentes na literatura. | |
− | Exemplo | + | Note que com operadores relacionais e lógicos podemos construir expressões tais como indicado no exemplo abaixo: |
+ | |||
+ | ==Exemplo== | ||
+ | |||
+ | O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue à variável X o resultado da comparação do primeiro com o segundo. | ||
Observe que a variável X é do tipo booleano. | Observe que a variável X é do tipo booleano. | ||
− | < | + | <syntaxhighlight lang=C> |
ALGORITMO exemplo | ALGORITMO exemplo | ||
VARIÁVEIS: | VARIÁVEIS: | ||
Linha 56: | Linha 66: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ==EXERCÍCIO== | |
− | = | + | Fazer um fluxograma para o algoritmo acima. |
+ | |||
+ | =Expressões com operadores lógicos= | ||
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo: | É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo: | ||
Linha 77: | Linha 89: | ||
− | Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira. | + | Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO (1 no caso do C) ou FALSO (0). Para manter a coerência com a linguagem C, qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira. |
− | Exemplo | + | ==Exemplo== |
− | < | + | Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro. |
+ | |||
+ | <syntaxhighlight lang=c> | ||
ALGORITMO exemplo | ALGORITMO exemplo | ||
VARIÁVEIS: | VARIÁVEIS: | ||
Linha 92: | Linha 106: | ||
LER B | LER B | ||
LER C | LER C | ||
− | X = A>B E A < C | + | X = (A>B) E (A < C) |
MOSTRAR "A expressão A>B E A<C é ", X | MOSTRAR "A expressão A>B E A<C é ", X | ||
FIM | FIM | ||
Linha 98: | Linha 112: | ||
− | EXERCÍCIO | + | ==EXERCÍCIO== |
Para cada uma das expressões abaixo determine se a expressão é verdadeira ou falsa. | Para cada uma das expressões abaixo determine se a expressão é verdadeira ou falsa. | ||
− | |||
Linha 114: | Linha 127: | ||
! Valor | ! Valor | ||
|- | |- | ||
− | | A>B E C>D | + | | (A>B) E (C>D) |
− | | | + | | 10 |
− | | | + | | 8 |
+ | | 20 | ||
+ | | 15 | ||
| | | | ||
|- | |- | ||
− | | A | + | | (A>B) E (C>D) |
− | | | + | | 10 |
− | | | + | | 12 |
+ | | 15 | ||
+ | | 15 | ||
| | | | ||
|- | |- | ||
− | | B | + | | (A<=B) OU (C>10) |
− | | | + | | 5 |
− | | | + | | 5 |
+ | | 3 | ||
+ | | 5 | ||
| | | | ||
|- | |- | ||
− | | C | + | | (A<=B) OU ((C==D) E (D<A)) |
− | | | + | | 3 |
− | | | + | | 10 |
+ | | 4 | ||
+ | | 4 | ||
| | | | ||
|- | |- | ||
− | | D | + | | (A==B) OU (C==D) |
− | | | + | | 3 |
− | | | + | | 1 |
+ | | 4 | ||
+ | | 4 | ||
| | | | ||
|- | |- | ||
− | | | + | | ((A==B) E (B<30)) OU (C>=D) |
− | | | + | | 5 |
− | | | + | | 5 |
+ | | 10 | ||
+ | | 5 | ||
| | | | ||
|} | |} | ||
− | = | + | =Controle do Fluxo de Execução: Estruturas de Decisão= |
− | |||
− | + | == Estruturas de Decisão== | |
− | + | Você deve ter observado que, no fluxograma, instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado. | |
− | + | Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. Esta expressão NORMALMENTE vai se utilizar de OPERADORES LÓGICOS e RELACIONAIS. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. | |
− | |||
− | |||
− | |||
− | Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. | ||
Seja o problema: | Seja o problema: | ||
− | ====Problema do Controle de Acesso==== | + | ====Exemplo: Problema do Controle de Acesso==== |
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema. | PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema. | ||
− | DADO DE ENTRADA: | + | DADO DE ENTRADA: a senha ( aser armazenada em variável alfanumérica) |
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE" | DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE" | ||
− | VARIÁVEIS: SENHA ( | + | VARIÁVEIS: SENHA (tipo alfanumérica) |
=====Algoritmo usando Fluxograma===== | =====Algoritmo usando Fluxograma===== | ||
[[imagem:FluxogramaControleAcessoI.jpg|450px]] | [[imagem:FluxogramaControleAcessoI.jpg|450px]] | ||
+ | [[imagem:ControleDeAcessoSimples.jpg|350px]] | ||
=====Algoritmo usando Pseudo-código===== | =====Algoritmo usando Pseudo-código===== | ||
− | < | + | <syntaxhighlight lang=C> |
ALGORITMO ControleAcesso | ALGORITMO ControleAcesso | ||
VARIÁVEIS | VARIÁVEIS | ||
SENHA: alfanumérica | SENHA: alfanumérica | ||
INICIO | INICIO | ||
+ | APRESENTAR "Entre com a SENHA" | ||
LER SENHA | LER SENHA | ||
SE SENHA=="alfa" ENTÃO | SE SENHA=="alfa" ENTÃO | ||
Linha 192: | Linha 214: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | ===Aninhamento de estruturas de decisão= | + | NOTA: Considera-se tempo de execução ZERO das instruções. Na prática, uma instrução pode levar nano, micro ou milisegundos. |
+ | |||
+ | ====EXERCÍCIO==== | ||
+ | |||
+ | Suponha que existe um sensor de porta aberta. Considere que este sensor é representado por uma VARIÁVEL BOOLEANA chamada SENSOR_PORTA e que é automaticamente setada para TRUE se a porta estiver fechada ou FALSE, caso contrário. O sistema de entrada de senha somente aceita abrir a porta se ela estiver fechada. Modifique o algoritmo acima, usando um fluxograma para prever esta situação. | ||
+ | |||
+ | =Outros Exemplos= | ||
+ | |||
+ | ==Exemplo 1 - Um Fluxograma para uma Calculadora== | ||
+ | |||
+ | PROBLEMA: Entrar com dois números e na sequência uma operação aritmética. O resultado da operação sobre os dois números deve ser mostrado. | ||
+ | |||
+ | DADOS DE ENTRADA: OPERANDO1(real), OPERANDO2 (real) e OPERADOR (caracter) | ||
+ | |||
+ | DADOS DE SAÍDA: RESULTADO (real) | ||
+ | |||
+ | Atenção: para fins de simplificação não são mostradas mensagens para as entradas de dados. | ||
+ | |||
+ | [[imagem:FluxogramaCalculadora.jpg|550px]] | ||
+ | |||
+ | ====EXERCÍCIO==== | ||
+ | |||
+ | Modificar o fluxograma acima para evitar a DIVISÃO por ZERO. | ||
+ | Em um computador, a divisão por zero pode levar a uma exceção e ao encerramento do programa. Evitar ou prever esta possibilidade é uma boa prática. | ||
+ | |||
+ | ==Exemplo 2 - Um Fluxograma para Cálculo de Juros Simples OU Composto ao MÊS== | ||
+ | |||
+ | Elaborar um fluxograma para calcular o capital acumulado em um dado período de meses, considerando JUROS SIMPLES ou COMPOSTOS mensais. O algoritmo deve testar esta condição. | ||
+ | |||
+ | DADOS DE ENTRADA: CapitalInicial (real), Modo ('s' - simples ou 'c' - composto), Juro, e Periodo (inteiro) em meses | ||
+ | |||
+ | DADOS DE SAÍDA: CapitalAcumulado | ||
+ | |||
+ | NOTA: Ver Juros Simples X Composto [https://pt.wikipedia.org/wiki/Juro#Juros_simples aqui]. | ||
+ | |||
+ | [[imagem:FluxogramaJuros.jpg|550px]] | ||
+ | |||
+ | ====EXERCÍCIO 1==== | ||
+ | |||
+ | O fluxograma acima NÃO testa a condição 's'. Modificá-lo para prever esta situação. Fornecer mensagem de erro e encerrar em caso de não ser nenhuma das condições. | ||
+ | |||
+ | =Aninhamento de estruturas de decisão= | ||
+ | |||
+ | Note que é possível aninhar estruturas de decisão. Se você resolveu o exercício da calculadora para evitar divisão por zero, este aninhamento já aconteceu. | ||
− | + | Seja o exemplo que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO. | |
− | < | + | <syntaxhighlight lang=C> |
− | ALGORITMO | + | ALGORITMO triangulo |
VARIAVEIS | VARIAVEIS | ||
lado1,lado2,lado3: real | lado1,lado2,lado3: real | ||
INICIO | INICIO | ||
+ | LER lado1 | ||
+ | LER lado2 | ||
+ | LER lado3 | ||
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO | SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO | ||
MOSTRAR "não é triângulo" | MOSTRAR "não é triângulo" | ||
Linha 211: | Linha 279: | ||
SENÃO | SENÃO | ||
MOSTRAR "escaleno" | MOSTRAR "escaleno" | ||
+ | FIMSE | ||
FIMSE | FIMSE | ||
FIMSE | FIMSE | ||
Linha 216: | Linha 285: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | ====EXERCÍCIO==== |
− | + | Construir um fluxograma para o algoritmo acima. | |
− | + | =Algumas considerações adicionais sobre a elaboração do Fluxograma/Pseudocódigo= | |
− | |||
− | + | *Um algoritmo deve resolver um determinado problema. Tenha ciência de qual problema pretende-se resolver... | |
+ | *Se coloque no lugar do "computador". Ele deve ler o algoritmo, instrução após instrução e executar uma após outra, na sequência. É isto que um microprocessador (CPU) faz, somente que em linguagem de máquina... | ||
+ | *Fique atento aos momentos de entrada de dados e a ordem no uso das variáveis. A qualquer momento pode ser realizada a entrada e a saída de dados. Analise o problema para verificar quando será necessário... | ||
+ | *Identifique claramente os dados de entrada e saída do algoritmo. Veja o algoritmo como uma sequência de instruções que transforma os dados de entrada nos dados de saída... | ||
+ | *Use nomes significativos para as variáveis. Tenha consciência que as variáveis e constantes são manipuladas pelos algoritmos; | ||
+ | *Uma variável é uma caixa de armazenamento (memória). Se colocar algo lá, tudo que estava armazenado nela é perdido. Uma caixa pode ter uma "sujeira" se não foi nada colocado nela... | ||
+ | *Estude o problema a ser resolvido. Identifique variáveis e constantes a serem usadas. Observe qual tipo de variável vai usar... | ||
+ | *Mudança na ordem de instruções pode acarretar em problemas... | ||
− | + | =Exercícios de Consolidação= | |
− | + | <ol> | |
− | a | + | <li>Para fazer um determinado tipo de iogurte, o leite deve estar entre 20 e 30 graus e depois deve-se acrescentar uma levedura. Faça um algoritmo para ler a temperatura do leite (poderia vir de um sensor) e informar se o leite está muito quente, muito frio ou se está pronto para que o iogurte seja confeccionado. |
+ | </li> | ||
+ | <li> | ||
+ | Implementar em pseudocódigo um algoritmo que realiza a leitura de dois números reais e imprime uma mensagem dizendo SE a média entre estes dois números é MAIOR que 5, IGUAL a 5 ou MENOR que 5. | ||
+ | {{collapse top|Solução - Exercicio 04}} | ||
+ | <!-- | ||
+ | [[imagem:Aula_02_Exercicio04_Prog1.jpg|400px]] | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
+ | </li> | ||
+ | <li> | ||
+ | Implementar um algoritmo em pseudocódigo para receber os 3 coeficientes de uma equação do segundo grau e então calcular as raízes indicando as três condições possíveis. Quantas variáveis foram usadas? ATENÇÃO: prever a condição a=0 e indicar que não seria uma equação do segundo grau. VER [https://pt.wikipedia.org/wiki/Equa%C3%A7%C3%A3o_quadr%C3%A1tica] | ||
− | + | {{collapse top|Solução}} | |
+ | <!-- | ||
+ | <syntaxhighlight lang=C> | ||
+ | ALGORITMO EQUACAO | ||
+ | a, b, c, delta, x1, x2 : real | ||
+ | INICIO | ||
+ | Ler a | ||
+ | Ler b | ||
+ | Ler c | ||
+ | SE a = 0 | ||
+ | MOSTRAR “O ‘a’ não pode ser igual a zero” | ||
+ | SENÃO | ||
+ | delta = (b*b) - 4*a*c | ||
+ | SE delta > 0 ENTÃO | ||
+ | x1 = (-b+SQRT(delta))/(2*a) | ||
+ | MOSTRAR "raiz 1 é x1" | ||
+ | x2 = (-b-SQRT(delta))/(2*a) | ||
+ | MOSTRAR "raiz 2 é x2" | ||
+ | SENÃO | ||
+ | SE delta < 0 ENTÃO | ||
+ | x_real = -b/(2*a) | ||
+ | x_imag = SQRT(-delta) | ||
+ | mostrar "parte real ", x_real | ||
+ | mostrar "parte imaginaria ", x_imag | ||
+ | SENAO | ||
+ | x = -b/(2*a) | ||
+ | FIMSE | ||
+ | FIMSE | ||
+ | FIMSE | ||
+ | FIM | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | {{collapse bottom}}</li> | ||
+ | <li> | ||
+ | Tente fazer uma solução para o exercício anterior usando o menor número possível de variáveis. Note que, como comentado em sala, trata-se de um exercício de treinamento. Em geral, não vale perder legibilidade do algoritmo para "economizar" variáveis. | ||
+ | </li> | ||
+ | <li> | ||
+ | Modifique o exercício de juros simples/composto (acima) para atender a seguinte situação. Um banco tem um fundo que proporciona juros simples (Fundo A) a uma taxa definida a cada mês e outro a juros composto (FUNDO B) que também permite a aplicação a JUROS COMPOSTO com uma taxa igual a metade do FUNDO A. | ||
− | Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado. A mudança | + | Faça um algoritmo que permite entrar com o CAPITAL INICIAL, A TAXA DE JURO mensal do FUNDO A e o período desejado. O algoritmo deve calcular o CAPITAL ACUMULADO para os dois fundos e compará-los informando qual o melhor fundo para o período em questão e qual a diferença entre os capitais acumulados. |
− | + | </li> | |
− | + | <li> | |
− | + | Implementar um algoritmo através de um fluxograma que recebe cinco números reais. O algoritmo deve mostrar a média destes números. Identifique (através de comentários ao lado do fluxograma) quem são os DADOS DE ENTRADA e DE SAÍDA. Qual o número de variáveis que estão sendo usadas no algoritmo? Quantas constantes? Seria possível reduzir o número de variáveis usadas? Qual seria o mínimo? | |
− | Implementar em | + | </li> |
+ | <li> | ||
+ | Implementar um algoritmo através de um fluxograma que recebe cinco números reais. O algoritmo deve mostrar a média e a quantidade de números (dentre estes cinco números) que estão acima da média. Identifique (através de comentários ao lado do fluxograma) quem são os DADOS DE ENTRADA e DE SAÍDA. Qual o número de variáveis que estão sendo usadas no algoritmo? Quantas constantes? | ||
+ | </li> | ||
+ | <li> | ||
+ | Considere o exercício anterior. Tente conceber uma versão do algoritmo que usa o menor número de variáveis possível. | ||
+ | </li> | ||
+ | <li> | ||
+ | Para o problema de controle de acesso descrito acima, conceber um procedimento para modificar a senha de acesso do USUÁRIO. Neste caso a senha deverá ser armazenada em uma variável.Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA (do USUÁRIO). | ||
+ | {{collapse top|Solução - Exercicio 01}} | ||
+ | <!-- | ||
+ | [[imagem:Prg1-ControleAcessoEx1.jpg|450px]] | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
+ | </li> | ||
+ | <li> | ||
+ | Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com | ||
+ | a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta". O administrador pode abrir a porta ou mudar a senha do UserId. Para tanto uma pergunta adicional deve ser feita. Solução com problema. | ||
+ | {{collapse top|Solução - Exercicio 02}} | ||
+ | <!-- | ||
+ | [[imagem:Aula_02_Exercicio02_Prog1.jpg|400px]] | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
+ | </li> | ||
+ | <li> | ||
+ | Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado. A mudança da senha deve desbloquear o usuário. | ||
+ | {{collapse top|Solução - Exercicio 03}} | ||
+ | <!-- | ||
+ | [[imagem:Aula_02_Exercicio03_Prog1.jpg|400px]] | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
+ | </li> | ||
+ | <li> | ||
+ | Implementar um algoritmo através de um pseudocódigo, que recebe as três cores de um resistor e informa em ohms o valor do mesmo. Identifique as entradas, saídas, constantes e variáveis envolvidas. | ||
+ | </li> | ||
+ | <li> | ||
+ | Implementar um algoritmo através de um fluxograma que recebe 3 números inteiros e imprime os números em ordem decrescente. | ||
+ | </li> | ||
+ | </ol> |
Edição atual tal como às 19h39min de 7 de agosto de 2023
Objetivos
Após a aula o aluno deverá:
- Compreender condições para a tomada de decisão durante a execução dos algoritmos;
- Compreender e utilizar os principais operadores relacionais e lógicos;
- Identificar claramente dados de entrada e saída do algoritmo;
- Elaborar algoritmos simples usando fluxogramas e pseudocódigo com comandos de decisão e com aninhamento de comandos.
OBS: Toda a notação e semântica de operadores usada é baseada na Linguagem C para facilitar o estudo da Linguagem nas próximas aulas.
Expressões com operadores relacionais
Na aula anterior estudamos como construir expressões usando operadores aritméticos e o operador de atribuição. Vamos continuar este tópico aumentando o poder das expressões através dos operadores relacionais e lógicos.
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:
Operador | Significado |
---|---|
> | maior que |
>= | maior ou igual que |
< | menor que |
<= | menor ou igual que |
== | igual a (se o operando a esquerda é igual ao da direita) |
!= ou ainda <> | diferente de (se o operando a esquerda é diferente do da direita) |
LEMBRETE: Os operadores mostrados são da linguagem C. Conferir os equivalentes na literatura.
Note que com operadores relacionais e lógicos podemos construir expressões tais como indicado no exemplo abaixo:
Exemplo
O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue à variável X o resultado da comparação do primeiro com o segundo. Observe que a variável X é do tipo booleano.
ALGORITMO exemplo
VARIÁVEIS:
A: inteiro
B: inteiro
X: booleana
INÍCIO
LER A
LER B
X = A>B
MOSTRAR "A condição A>B é ", X
FIM
EXERCÍCIO
Fazer um fluxograma para o algoritmo acima.
Expressões com operadores lógicos
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:
Operador | Significado |
---|---|
&& | AND (E) |
|| | OR (OU) |
! | NOT (NÃO) |
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO (1 no caso do C) ou FALSO (0). Para manter a coerência com a linguagem C, qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.
Exemplo
Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.
ALGORITMO exemplo
VARIÁVEIS:
A: inteiro
B: inteiro
C: inteiro
X: booleana
INÍCIO
LER A
LER B
LER C
X = (A>B) E (A < C)
MOSTRAR "A expressão A>B E A<C é ", X
FIM
EXERCÍCIO
Para cada uma das expressões abaixo determine se a expressão é verdadeira ou falsa.
Expressão | A | B | C | D | Valor |
---|---|---|---|---|---|
(A>B) E (C>D) | 10 | 8 | 20 | 15 | |
(A>B) E (C>D) | 10 | 12 | 15 | 15 | |
(A<=B) OU (C>10) | 5 | 5 | 3 | 5 | |
(A<=B) OU ((C==D) E (D<A)) | 3 | 10 | 4 | 4 | |
(A==B) OU (C==D) | 3 | 1 | 4 | 4 | |
((A==B) E (B<30)) OU (C>=D) | 5 | 5 | 10 | 5 |
Controle do Fluxo de Execução: Estruturas de Decisão
Estruturas de Decisão
Você deve ter observado que, no fluxograma, instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. Esta expressão NORMALMENTE vai se utilizar de OPERADORES LÓGICOS e RELACIONAIS. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada.
Seja o problema:
Exemplo: Problema do Controle de Acesso
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.
DADO DE ENTRADA: a senha ( aser armazenada em variável alfanumérica)
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"
VARIÁVEIS: SENHA (tipo alfanumérica)
Algoritmo usando Fluxograma
Algoritmo usando Pseudo-código
ALGORITMO ControleAcesso
VARIÁVEIS
SENHA: alfanumérica
INICIO
APRESENTAR "Entre com a SENHA"
LER SENHA
SE SENHA=="alfa" ENTÃO
"Abrir a porta"
SENÃO
"Senha não confere"
FIMSE
IR PARA INICIO
FIM
NOTA: Considera-se tempo de execução ZERO das instruções. Na prática, uma instrução pode levar nano, micro ou milisegundos.
EXERCÍCIO
Suponha que existe um sensor de porta aberta. Considere que este sensor é representado por uma VARIÁVEL BOOLEANA chamada SENSOR_PORTA e que é automaticamente setada para TRUE se a porta estiver fechada ou FALSE, caso contrário. O sistema de entrada de senha somente aceita abrir a porta se ela estiver fechada. Modifique o algoritmo acima, usando um fluxograma para prever esta situação.
Outros Exemplos
Exemplo 1 - Um Fluxograma para uma Calculadora
PROBLEMA: Entrar com dois números e na sequência uma operação aritmética. O resultado da operação sobre os dois números deve ser mostrado.
DADOS DE ENTRADA: OPERANDO1(real), OPERANDO2 (real) e OPERADOR (caracter)
DADOS DE SAÍDA: RESULTADO (real)
Atenção: para fins de simplificação não são mostradas mensagens para as entradas de dados.
EXERCÍCIO
Modificar o fluxograma acima para evitar a DIVISÃO por ZERO.
Em um computador, a divisão por zero pode levar a uma exceção e ao encerramento do programa. Evitar ou prever esta possibilidade é uma boa prática.
Exemplo 2 - Um Fluxograma para Cálculo de Juros Simples OU Composto ao MÊS
Elaborar um fluxograma para calcular o capital acumulado em um dado período de meses, considerando JUROS SIMPLES ou COMPOSTOS mensais. O algoritmo deve testar esta condição.
DADOS DE ENTRADA: CapitalInicial (real), Modo ('s' - simples ou 'c' - composto), Juro, e Periodo (inteiro) em meses
DADOS DE SAÍDA: CapitalAcumulado
NOTA: Ver Juros Simples X Composto aqui.
EXERCÍCIO 1
O fluxograma acima NÃO testa a condição 's'. Modificá-lo para prever esta situação. Fornecer mensagem de erro e encerrar em caso de não ser nenhuma das condições.
Aninhamento de estruturas de decisão
Note que é possível aninhar estruturas de decisão. Se você resolveu o exercício da calculadora para evitar divisão por zero, este aninhamento já aconteceu.
Seja o exemplo que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.
ALGORITMO triangulo
VARIAVEIS
lado1,lado2,lado3: real
INICIO
LER lado1
LER lado2
LER lado3
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO
MOSTRAR "não é triângulo"
SENÃO
SE lado1==lado2 E lado1==lado3 ENTÃO
MOSTRAR "equilatero"
SENAO
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO
MOSTRAR "isósceles"
SENÃO
MOSTRAR "escaleno"
FIMSE
FIMSE
FIMSE
FIM
EXERCÍCIO
Construir um fluxograma para o algoritmo acima.
Algumas considerações adicionais sobre a elaboração do Fluxograma/Pseudocódigo
- Um algoritmo deve resolver um determinado problema. Tenha ciência de qual problema pretende-se resolver...
- Se coloque no lugar do "computador". Ele deve ler o algoritmo, instrução após instrução e executar uma após outra, na sequência. É isto que um microprocessador (CPU) faz, somente que em linguagem de máquina...
- Fique atento aos momentos de entrada de dados e a ordem no uso das variáveis. A qualquer momento pode ser realizada a entrada e a saída de dados. Analise o problema para verificar quando será necessário...
- Identifique claramente os dados de entrada e saída do algoritmo. Veja o algoritmo como uma sequência de instruções que transforma os dados de entrada nos dados de saída...
- Use nomes significativos para as variáveis. Tenha consciência que as variáveis e constantes são manipuladas pelos algoritmos;
- Uma variável é uma caixa de armazenamento (memória). Se colocar algo lá, tudo que estava armazenado nela é perdido. Uma caixa pode ter uma "sujeira" se não foi nada colocado nela...
- Estude o problema a ser resolvido. Identifique variáveis e constantes a serem usadas. Observe qual tipo de variável vai usar...
- Mudança na ordem de instruções pode acarretar em problemas...
Exercícios de Consolidação
- Para fazer um determinado tipo de iogurte, o leite deve estar entre 20 e 30 graus e depois deve-se acrescentar uma levedura. Faça um algoritmo para ler a temperatura do leite (poderia vir de um sensor) e informar se o leite está muito quente, muito frio ou se está pronto para que o iogurte seja confeccionado.
-
Implementar em pseudocódigo um algoritmo que realiza a leitura de dois números reais e imprime uma mensagem dizendo SE a média entre estes dois números é MAIOR que 5, IGUAL a 5 ou MENOR que 5.
Solução - Exercicio 04 -
Implementar um algoritmo em pseudocódigo para receber os 3 coeficientes de uma equação do segundo grau e então calcular as raízes indicando as três condições possíveis. Quantas variáveis foram usadas? ATENÇÃO: prever a condição a=0 e indicar que não seria uma equação do segundo grau. VER [1]
Solução - Tente fazer uma solução para o exercício anterior usando o menor número possível de variáveis. Note que, como comentado em sala, trata-se de um exercício de treinamento. Em geral, não vale perder legibilidade do algoritmo para "economizar" variáveis.
- Modifique o exercício de juros simples/composto (acima) para atender a seguinte situação. Um banco tem um fundo que proporciona juros simples (Fundo A) a uma taxa definida a cada mês e outro a juros composto (FUNDO B) que também permite a aplicação a JUROS COMPOSTO com uma taxa igual a metade do FUNDO A. Faça um algoritmo que permite entrar com o CAPITAL INICIAL, A TAXA DE JURO mensal do FUNDO A e o período desejado. O algoritmo deve calcular o CAPITAL ACUMULADO para os dois fundos e compará-los informando qual o melhor fundo para o período em questão e qual a diferença entre os capitais acumulados.
- Implementar um algoritmo através de um fluxograma que recebe cinco números reais. O algoritmo deve mostrar a média destes números. Identifique (através de comentários ao lado do fluxograma) quem são os DADOS DE ENTRADA e DE SAÍDA. Qual o número de variáveis que estão sendo usadas no algoritmo? Quantas constantes? Seria possível reduzir o número de variáveis usadas? Qual seria o mínimo?
- Implementar um algoritmo através de um fluxograma que recebe cinco números reais. O algoritmo deve mostrar a média e a quantidade de números (dentre estes cinco números) que estão acima da média. Identifique (através de comentários ao lado do fluxograma) quem são os DADOS DE ENTRADA e DE SAÍDA. Qual o número de variáveis que estão sendo usadas no algoritmo? Quantas constantes?
- Considere o exercício anterior. Tente conceber uma versão do algoritmo que usa o menor número de variáveis possível.
-
Para o problema de controle de acesso descrito acima, conceber um procedimento para modificar a senha de acesso do USUÁRIO. Neste caso a senha deverá ser armazenada em uma variável.Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA (do USUÁRIO).
Solução - Exercicio 01 -
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta". O administrador pode abrir a porta ou mudar a senha do UserId. Para tanto uma pergunta adicional deve ser feita. Solução com problema.
Solução - Exercicio 02 -
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado. A mudança da senha deve desbloquear o usuário.
Solução - Exercicio 03 - Implementar um algoritmo através de um pseudocódigo, que recebe as três cores de um resistor e informa em ohms o valor do mesmo. Identifique as entradas, saídas, constantes e variáveis envolvidas.
- Implementar um algoritmo através de um fluxograma que recebe 3 números inteiros e imprime os números em ordem decrescente.