Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos Aula 6 - Estrutura de decisão Introdução Esta é a segunda parte das estruturas de decisão. Na primeira aula, vimos alguns conceitos básicos que são as estruturas iniciais para começarmos a tratar o assunto. Nesta aula, vamos mostrar as outras formas de tomar decisões e suas implementações em C++.Dessa forma, nosso repertório de comandos vai aumentar e você vai conseguir criar programas mais interessantes e completos em C++. Vamos lá? Recapitulando... No final da última aula, vimos a estrutura condicional de comando composto. Esta estrutura é a famosa “if-then-else”, porque trata o teste condicional de uma maneira completa: “se o teste for verdadeiro, então faça isso, senão faça aquilo”. Ela tem a seguinte forma, como vimos: Para lembrar a estrutura, observe o exemplo a seguir. Lembrou? O teste é feito na linha 10; caso verdadeiro, executa o bloco das linhas 10-12; senão, executa o bloco das linhas 13-15. Observe o teste da linha 10. Usamos o operador %, chamado mod. Este operador retorna como resultado o resto da divisão; no exemplo, do número n por 2. Se for zero, é um número par; senão, é um número ímpar. Mudando o teste... Para relaxar, vamos fazer uma brincadeira com C++. Se você quiser impressionar alguém e dizer que conhece bastante de programação, em vez de escrever as linhas 10 a 15, substitua-as apenas pela linha 10 deste código. O resultado é o mesmo que o código anterior. É uma forma que parece bem complicada, não é? Mas vamos explicar: trata-se de outro operador existente em C++ e em outras linguagens, chamado de operador ternário. Ele é uma alternativa para substituir o desvio condicional composto em algumas situações. Veja sua sintaxe: Como é um operador ternário, temos três operandos: Esse operador também é útil quando vamos atribuir um valor a uma variável como resultado de um if. Observe: if (x == 10) // Se x for igual a 10 y = 20; // então faço y receber 20 else y = 30; // senão faço y receber 30 Usando o operador condicional ternário, poderíamos escrever: y = (x == 10) ? 20 : 30; // y recebe, se x for igual a 10 então 20, senão 30. Colocando um if Dentro do Outro Colocar um if dentro do outro é mais comum do que você imagina. Esta forma é chamada de aninhamento ou encadeamento de ifs e é usada em várias linguagens de programação e também com outros comandos. Vamos nos concentrar nos ifs por enquanto. 1 #include <iostream> 2 using namespace std; 3 4 int main(void){ 5 int idade; 6 char sexo; 7 8 cout<<"Qual a sua idade?"<<endl; 9 cin>>idade; 10 cout<<"Digite (m)para Masculino, (f)para Feminino"<<endl; 11 cin>>sexo; 12 13 if (idade>=18){ 14 cout<<"Você pode dirigir"<<endl; 15 16 if (sexo=='m'){ 17cout<<"Você precisa ir no Serviço Militar"<<endl; 18 } 19 } 20 else { 21 if (idade>16){ 22 cout<<"Você já pode votar"<<endl; 23 } 24 else { 25 cout<<"Você não pode votar nem dirigir"<<endl; 26 } 27 } 28 return 0; 29 } Veja que temos um if dentro do outro: O if que começa na linha 13 vai até a linha 18, quando a condição (idade>=18) for verdadeira. ✓ Dentro deste if, temos um if simples aninhado entre as linhas 16 e 18. Caso a condição da linha 13 seja falsa, temos o else, que compreende as linhas de 20 a 27. ✓ Dentro do else, temos um if-then-else completo nas linhas 21 a 26. Como podemos ver, o aninhamento de ifs é muito útil e é mais comum do que pensa. Existem muitas situações que usam estruturas aninhadas, e nas próximas aulas esta estrutura ficará cada vez mais comum, e com outros comandos também. O Comando Switch Este comando é bastante útil. Veja um exemplo em que ele pode ser usado: imagine um programa no qual o usuário informa um mês, e o programa devolve se o mês tem 30 ou 31 dias. Como você faria esse programa? “Vou ter que ler o número do mês.” “Se for janeiro, tem 31 dias.” “Se for fevereiro, pode ter 28 ou 29 dias. Se o ano for bissexto, tem 29; senão, tem 28. Bem, mas acho que desta vez, eu vou considerar que tem 28 dias, só pra facilitar.” “Se for março, tem 31.” “Abril tem 30”, “maio tem 31.” “se for junho, então são 30...” “e se for dezembro, tem 31.” “Caramba, vai ser um monte de ifs!” Vamos ver o programa em execução Se fosse usar o comando if, o programa teria pelo menos 12 ifs. O comando switch facilita a nossa vida. Sua sintaxe é: switch (variável){ case constante1: Instruções; break; case constante2: Instruções; break; default Instruções; } Veja como o switch seria usado nesse caso: 1 #include <iostream> 2 using namespace std; 3 4 int main(int argc, char** argv) { 5 int mes,dias; 6 7 cout<<"Digite o número do mês:"<<endl; 8 cin>>mes; 9 10 switch (mes){ 11 case 1: 12 dias = 31; 13 break; 14 case 2: 15 dias = 28; 16 break; 17 case 3: 18 dias = 31; 19 break; 20 case 4: 21 dias = 30; 22 break; 23 case 5: 24 dias = 31; 25 break; 26 case 6: 27 dias = 30; 28 break; 29 case 7: 30 dias = 30; 31 break; 32 case 8: 33 dias = 31; 34 break; 35 case 9: 36 dias = 30; 37 break; 38 case 10: 39 dias = 31; 40 break; 41 case 11: 42 dias = 30; 43 break; 44 case 12: 45 dias = 31; 46 break; 47 default: 48 cout<<”Você digitou um mês inválido”<<endl; 49 break; 50 } 51 cout<<"O mês "<<mes<<" tem "<<dias<<" dias."; 52 return 0; 53 } Entendeu como este comando funciona? Ele é muito útil e pode ser usado quando temos vários ifs. É interessante usá-lo para substituir vários ifs e deixar o código mais legível. Também é bastante usado em estruturas de menu. Porém, temos uma limitação: o comando não pode ser usado para avaliar expressões relacionais. Ele só funciona quando comparamos com um valor constante e, quando a comparação é verdadeira, um bloco de comandos é executado. No caso do exemplo, a linha a seguir avalia o valor da variável mês e, dependendo do valor, um determinado case será executado: 10 switch (mes){ 11 case 1: 12 dias = 31; 13 break; É muito importante usar o comando break após cada bloco de execução do case. O comando break interrompe o switch e o programa volta ao fluxo de execução após o fechamento do comando switch. Lembre-se sempre de colocar a cláusula default, como mostram as linhas 47 a 50. Fonte: https://youtu.be/EAIyHInguQk Durante o vídeo, você percebeu que foram testados alguns valores corretos para os meses, porém na última execução foi inserido o mês 29 e o programa executou a cláusula default. Imagine se fizéssemos esse programa usando o if. Seriam vários ifs e, além disso, seria difícil ler o programa. O switch é muito bom para deixar o programa mais claro. Porém, a última execução do programa deixou uma “rebarba”. Veja que, se o usuário digitar um mês negativo ou outro valor que não esteja dentro das cláusulas case, o programa executa corretamente a cláusula default, mas imprime na tela a mensagem da linha 51. Seria melhor que essa linha não fosse impressa quando o valor for inválido. E agora? Agora, precisamos de uma forma de criar uma condição lógica. Para isso, entramos no próximo tópico desta aula. Operadores Lógicos Em C++, temos três operadores: No exemplo anterior, precisamos criar uma condição que não deixe que o programa aceite valores abaixode 1 E acima de 12. Se fosse nas aulas de Matemática, seria fácil: poderíamos criar uma expressão assim: 1<=mês<=12 Mas em C++, precisamos transformar essa condição de acordo com a sintaxe da linguagem. Atividades Durante a aula, fizemos um exemplo no qual o usuário digita um número entre 1 e 12, e o programa retorna a quantidade de dias do mês correspondente. Lá, vimos que existem várias formas de fazer validação dos dados de forma que o programa não aceite um número inválido. Tente resolver de outra forma. Porém, agora coloque uma instituição na cláusula default, para informar o usuário que o valor é inválido. GABARITO Sugestão de resposta: 1 #include <iostream> 2 using namespace std; 3 4 int main(int argc, char** argv) { 5 int mes,dias; 6 bool invalido = false; 7 8 cout<<"Digite o número do mês:"<<endl; 9 cin>>mes; 10 11 switch (mes){ 12 case 1: 13 dias = 31; 14 break; 15 case 2: 16 dias = 28; 17 break; 18 case 3: 19 dias = 31; 20 break; 21 case 4: 22 dias = 30; 23 break; 24 case 5: 25 dias = 31; 26 break; 27 case 6: 28 dias = 30; 29 break; 30 case 7: 31 dias = 30; 32 break; 33 case 8: 34 dias = 31; 35 break; 36 case 9: 37 dias = 30; 38 break; 39 case 10: 40 dias = 31; 41 break; 42 case 11: 43 dias = 30; 44 break; 45 case 12: 46 dias = 31; 47 break; 48 default: 49 cout<<"Você digitou um mês inválido"<<endl; 50 invalido = true; 51 break; 52 } 53 if(!invalido){ 54 cout<<"O mês "<<mes<<" tem "<<dias<<" dias."; 55 } 56 return 0; 57 } O que o seguinte programa imprime na tela? Suponha que: Nada. O programa está errado; 6; 7; • 8; 9. GABARITO Na linha 3, temos o operador ternário. Neste caso, a interpretação da linha é: “ o número é maior que 0? Se for, incremente-o; caso contrário, decremente-o. Logo, o programa imprimirá o número 8 na tela. A linguagem C++ oferece as seguintes estruturas de decisão: I. if II. if – else III. Switch IV. Operador ternário Qual é a alternativa correta? Somente I e II; Somente I, II e III; Somente I e III; Somente II, III e IV; • Todas estão corretas. GABARITO A linguagem C ++ oferece as quatro formas de estruturas de decisão. Observe o seguinte programa: O que o programa faz se digitarmos o caractere “A”? Nada, o programa possuiu erros e não será compilado; • Nada será impresso; Será impresso “a”; Será impresso “z”; Será impresso “ Você digitou certo!.” GABARITO O programa só imprimirá “Você digitou certo” se uma letra minúscula for digitada. Considere os pedaços de código abaixo: O resultado da execução dos fragmentos em I e II será, respectivamente: Perdeu o bônus e ganhou; Perdeu e ganhou o bônus; Ganhou e ganhou; Perdeu e perdeu; • Perdeu o bônus e ganhou o bônus. GABARITO Analisando as condições e valores, vemos que o exercício apenas coloca em uma linha o que aprendemos em várias linhas por questão de legibilidade.
Compartilhar