Transcript
Algoritmos e Estruturas de Dados
Sumário ❖ Tópicos a serem abordados na aula ◗ Comandos de Condiç Condição
PORTUGOL Estruturas de Controle de Fluxo
Prof. Patrick Pedreira
Estruturas de Controle de Fluxo ❖ Os algoritmos desenvolvidos até o momento constituem uma seqüência de ações que sempre são executadas em sua totalidade indiferente de qual seja(m) o(s) valor(es) da(s) entrada(s). ❖ Contudo para a resolução de determinados problemas ou para a execução de determinadas tarefas é necessária a realização de um conjunto distinto de ações e este conjunto é definido com base em uma análise da(s) entrada(s).
Estruturas de Controle de Fluxo ❖ Um exemplo simples de uma destas situações é um algoritmo capaz de efetuar o cálculo do imposto de renda devido por um determinado contribuinte. Neste caso dependendo da quantidade de dependentes, do valor de sua renda e outras fatores o cálculo será feito de formas distintas. ❖ Em função do que foi mencionado foram criadas as estruturas de controle de fluxo, as quais são fundamentais para a construção de algoritmos complexos. Estas permitem que o programador especifique a seqüência de instruções que será executada.
1
Estruturas de Controle de Fluxo ❖ Comando se (Instrução condicional) ◗ O funcionamento do comando se é bastante intuitivo. Para um exemplo de compras poderíamos expressar o algoritmo como: ...
Estruturas de Controle de Fluxo ❖ Sintaxe: … se (
) então
Escolha o produto que quer comprar se tem dinheiro para comprá-lo então
…
Coloque no carrinho
senão Devolva para a prateleira Escolha um marca mais barata
...
Estruturas de Controle de Fluxo ❖ Pseudocódigo/Exercício – Construa o pseudocódigo de um algoritmo para obter o resultado da divisão de dois números inteiros quaisquer. Lembre-se que a divisão só pode ser feita caso o divisor seja diferente de zero
❖ A pode ser representada
por uma variável booleana, uma constante (V ou F) ou uma expressão cujo resultado seja um valor lógico.
Estruturas de Controle de Fluxo algoritmo divisao var n1, n2: inteiro; res: real; inicio escreva (“Digite o dividendo inteiro: ”); leia (n1); escreva (“Digite o divisor inteiro: ”); leia (n2); se (n2<>0) entao inicio res n1 / n2; escreva (“Resultado da divisão: ”, res); fim {fim do se} Se (n2=0) escreva (“Impossível dividir”);
fim {fim do algoritmo}
2
Estruturas de Controle de Fluxo ❖ Pseudocódigo/Exercício – Construa o pseudocódigo de um algoritmo que leia um número e identifique se o valor lido é 5. Caso seja, deve-se indicar que a condição é verdadeira e imprimir o valor lido.
Estruturas de Controle de Fluxo Algoritmo Verifica5_versao1
var a: inteiro; início escreva(“Entre com um valor: ”);
{1}
leia(a);
{2}
se (a=5) então
{3}
início escreva (“Condição Verdadeira”);
{4}
escreva (“O valor é ”, a);
{5}
fim escreva(“Fim do algoritmo”);
{6}
fim
Estruturas de Controle de Fluxo ❖ Vejamos o teste de mesa ❖ Usaremos mais uma coluna para indicar qual instrução está sendo executada ❖ Esse novo dado é interessante para se perceber que as instruções poderão ser executadas fora da ordem apresentada nas linhas
Estruturas de Controle de Fluxo ❖ Teste de mesa para a=5 Instruç Instrução
Linha
a
1
1
?
2
2
[5]
3
3
5
4
4
5
5
5
{5}
6
6
5
3
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
❖ Teste de mesa para a=2 (diferente de 5)
❖ Comando se ...senão ◗ A cláusula senão é opcional ao utilizarmos o se
Instruç Instrução
Linha
a
1
1
?
2
2
[2]
3
3
2
4
6
2
◗ O bloco de comandos que segue o senão será executado quando o valor booleano avaliado na condição for falso ◗ Sintaxe: … se () então
[senão
] ...
Estruturas de Controle de Fluxo ❖ Cláusula senão não precisa ser numerada nem representada no teste de mesa pois não tem custo computacional
Estruturas de Controle de Fluxo Algoritmo Verifica5_versao2 var a: inteiro; início escreva(“Entre com um valor: ”); {1} leia(a); {2} se (a=5) então {3} início escreva (“Condição Verdadeira”); {4} escreva (“O valor é ”, a); {5} fim senão início escreva(“Condição falsa”); {6} escreva (“O valor nao é 5 é ”, a); {7} fim escreva(“Fim do algoritmo”); {8} fim
4
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
❖ Teste de mesa para a=5
❖ Teste de mesa para a=2 (diferente de 5)
Instruç Instrução
Linha
a
Instruç Instrução
Linha
a
1
1
?
1
1
?
2
2
[5]
2
2
[2]
3
3
5
3
3
2
4
4
5
4
6
2
5
5
{5}
5
7
{2}
6
8
5
6
8
2
Estruturas de Controle de Fluxo ❖ Exercício ❖ Problema – Faça um algoritmo que leia a idade de uma pessoa e diga-lhe se é maior de idade ou não. Represente o valor que indica maior idade como uma constante que valerá 18.
Estruturas de Controle de Fluxo Algoritmo Maior_Idade constante LIMITE = 18; var idade: inteiro; maior: booleano; início escreva(“Entre com a idade: ”); leia(idade); se (idade>= LIMITE) então maior V; senão maior F; se (maior) então escreva(“É maior de idade.”); senão escreva(“É menor de idade.”); fim
{1} {2} {3} {4} {5} {6} {7} {8}
5
Estruturas de Controle de Fluxo ❖ O trecho se (maior) então poderia ser representado por se (maior = V) então. De qualquer forma, a condição booleana teria o mesmo resultado.
Estruturas de Controle de Fluxo ❖ Exercício - Faça o teste de mesa para o problema anterior
❖ Não delimitamos os blocos de instruções depois do se com início...fim, porque nesse caso só existe um único comando a ser executado ◗ Não é incorreta a delimitação, mas isso torna o código mais limpo
Estruturas de Controle de Fluxo ❖ Exercício ❖ Problema – Faça um algoritmo que leia dois números inteiros e determine qual dos dois é maior. Considere que os dois números serão diferentes.
Estruturas de Controle de Fluxo Algoritmo Maior_versao1 var n1, n2: inteiro; início escreva(“entre com o primeiro valor: ”); leia(n1); escreva(“entre com o segundo valor: ”); leia(n2); se (n1>n2) então escreva(“o valor maior é: ”, n1); senão escreva(“o valor maior é: ”, n2); fim
{1} {2} {3} {4} {5} {6} {7}
6
Estruturas de Controle de Fluxo ❖ Exercício - Faça dois testes de mesa para o problema anterior. No primeiro teste, considere que o primeiro número digitado pelo usuário é maior que o segundo. No segundo teste, considere que o segundo número digitado é maior que o primeiro
Estruturas de Controle de Fluxo Algoritmo Iguais_Diferentes_versao1 var n1, n2, n3: inteiro; início escreva(“entre com o primeiro valor: ”); leia(n1); escreva(“entre com o segundo valor: ”); leia(n2); escreva(“entre com o terceiro valor: ”); leia(n3); se (n1=n2 e n2=n3) então escreva(“Os três números são iguais”); se (n1<>n2 e n1<>n3 e n2<>n3) então escreva(“Não há valores iguais”); se (n1=n2 e n1<>n3) ou (n1=n3 e n1<>n2) ou (n2=n3 e n1<>n2) então escreva(“Há dois valores iguais e um diferente”); escreva(“Fim do programa”); fim
Estruturas de Controle de Fluxo ❖ Condições compostas ◗ As condições vistas até agora sempre foram únicas ◗ Entretanto, para problemas mais complexos, torna-se necessária a utilização de condições mais elaboradas.
❖ Por exemplo, suponha que tenhamos que criar um algoritmo que leia três números e determine quantos são iguais...
Estruturas de Controle de Fluxo ❖ Erros comuns ◗ Tentativa de fazer comparação com 3 elementos Se (n1 = n2 = n3) então {ERRADO}
◗ Sintaticamente está incorreta, devendo ser feita sempre por meio de conectivos lógicos se (n1=n2 e n1=n3 e n2=n3) então se (n1=n2 e n2=n3) então {melhor ainda que a de antes}
7
Estruturas de Controle de Fluxo ❖ Exercício proposto ◗ Faça três testes de mesa referentes ao algoritmo Iguais_Diferentes_versao1.
Estruturas de Controle de Fluxo ❖ Comandos de condição encadeados ◗ Vejamos novamente a estrutura do comando se: … se () então
Primeiro teste: três números diferentes
Segundo teste: primeiro e terceiro são iguais e segundo diferente
[senão
Terceiro teste: três números iguais
] ...
❖ As sequências de comandos podem conter qualquer tipo de instrução, inclusive comandos de decisão ❖ Quando as sequências de comando subordinadas ao se-senão contém outros comandos se-senão, temos o encadeamento (ou aninhamento) de comandos de decisão
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo ❖ Como a sequencia se-senão-se pode ser muito grande, a endentação pode deixar muito poluído. Neste caso, convenciona-se manter os comandos se na mesma coluna
8
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
❖ Esse tipo de construção é muito útil quando sabemos que em um conjunt de condições apenas uma delas será verdadeira. Vejamos a nova implementação para o problema de comparação de números...
Estruturas de Controle de Fluxo ❖ Observamos que: ◗ A última condição (dois números iguais e um diferente) não foi colocada Não há necessidade de se averiguar essa possibilidade porque as outras já foram testadas anteriormente
❖ Acompanhemos o teste de mesa para as duas versões, considerando os três valores iguais
Estruturas de Controle de Fluxo Algoritmo Iguais_Diferentes_versao1 var n1, n2, n3: inteiro; início escreva(“entre com o primeiro valor: ”); leia(n1); escreva(“entre com o segundo valor: ”); leia(n2); escreva(“entre com o terceiro valor: ”); leia(n3); se (n1=n2 e n2=n3) então escreva(“Os três números são iguais”); se (n1<>n2 e n1<>n3 e n2<>n3) então escreva(“Não há valores iguais”); se (n1=n2 e n1<>n3) ou (n1=n3 e n1<>n2) ou (n2=n3 e n1<>n2) então escreva(“Há dois valores iguais e um diferente”); escreva(“Fim do programa”); fim
9
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo ❖ Observaç Observações ◗ A condiç condição do primeiro comando se (linha 7) foi verdadeira, poré porém isso não evitou que as condiç condições das linhas 9 e 10 fossem testadas, apesar de não poderem ser verdadeiras, visto que os nú números eram iguais
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
10
Estruturas de Controle de Fluxo ❖ Observaç Observações ◗ O algoritmo executa menos instruç instruções (11 da primeira contra 9 da segunda versão) ◗ Condiç Condições não são testadas desnecessariamente
❖ Podemos determinar quantos nú números são iguais e diferentes de uma outra forma. Vejamos a seguir.
Estruturas de Controle de Fluxo ❖ Exercí Exercícios propostos ◗ Faç Faça dois testes de mesa referentes ao algoritmo Iguais_Diferentes_Versão2 Primeiro teste: dois dos três nú números são iguais
Estruturas de Controle de Fluxo ❖ Observaç Observações ◗ Não foram usadas condiç condições compostas ◗ Tivemos que usar uma sé série de comandos de decisão encadeados
Estruturas de Controle de Fluxo ❖ Comando de Seleção Múltipla (Comando caso) ◗ Em algumas situações ao chegarmos a uma determinada instrução de um algoritmo devemos selecionar um dentre alguns trechos a seguir, tendo como base para esta escolha um conjunto de valores.
Segundo teste: todos os nú números são diferentes
◗ Faç Faça o mesmo para o algoritmo Iguais_Diferentes_Versão3. Compare o nú número de instruç instruções executadas em cada versão ◗ Para lidar com casos deste tipo foi criado o comando de seleção múltipla. ◗ Comando caso, pode ser visto como uma especializaç especialização do se.
11
Estruturas de Controle de Fluxo ❖ Possuindo a sintaxe: ...
Estruturas de Controle de Fluxo ❖ O comando anterior equivale à sequência de comandos se
caso seja: : : ... default:
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
❖ Problema – Vejamos um algoritmo capaz de identificar se um nú número é igual a 1, 5 ou 10. Caso não seja nenhum desses valores ele retorna a mensagem: Valor invá inválido.
12
Estruturas de Controle de Fluxo
Estruturas de Controle de Fluxo
❖ Problema – Faç Faça um algoritmo capaz de identificar se um nú número é: 1. Par ou ímpar 2. Positivo, negativo ou zero 3. Um ano bissexto – considere que para ser bissexto basta que seja divisí divisível por 4 e não ser divisí divisível por 100. Faç Faça uma condiç condição composta que englobe todas as regras para a definiç definição de ano bissexto
◗
Caso não tenha nenhuma das opç opções anteriores o algoritmo deve retornar uma mensagem informando ao usuá usuário que a operaç operação solicitada não é válida
Estruturas de Controle de Fluxo ❖ Variações de sintaxe:
❖ Exemplo: ◗ O pseudocódigo a seguir informa com base no nome de um time fornecido, se este trata-se de um time carioca, paulista ou de outro estado.
13
Exercícios ❖ Exercí Exercícios da pá página 55
14