PC-I © MAP’2019 Estruturas de seleção
Estruturas de seleção
94
Execução condicional
Etapa em um programa onde uma condição é avaliada e, dependendo do resultado, diferentes ações podem ser realizadas.
V F
PC-I © MAP’2019 Estruturas de seleção
Condicional simples
Uma ou mais ações serão executadas se,
e apenas se, uma determinada expressão
for verdadeira.
96
Números pares
Leia um número inteiro e, se o mesmo for divisível por 2, exiba a mensagem “O número digitado é par.”
∞
Leia os valores de A e B e, se B for diferente de zero, calcule a divisão de A por B.
F
V expressão
Condicional composta
Se uma determinada expressão for
verdadeira, algumas ações serão
executadas. Se a expressão for falsa,
outras ações serão executadas.
Números pares e ímpares
Leia um número inteiro e, se o mesmo for divisível por 2, exiba a mensagem “O número informado é par.” Caso contrário, exiba a mensagem “O número informado é ímpar”.
∞ (versão Tropa de Elite)
Leia os valores de A e B e, se B for diferente de zero, calcule a divisão de A por B. Caso contrário, exiba a mensagem “Pede pra sair!”
F expressão V
PC-I © MAP’2019 Estruturas de seleção
Condicional múltipla
A condição avaliada permite mais de 2 opções. 98 F V expressão F V expressão F V expressão
Expressões condicionais
• Estabelecem uma comparação entre os dados (constantes ou variáveis) de um programa.
• O resultado dessa comparação é interpretado pela linguagem como um valor lógico booleano (verdadeiro ou falso).
• As expressões condicionais podem envolver operadores aritméticos,
PC-I © MAP’2019 Estruturas de seleção
Operadores relacionais
Estabelecem relações entre os dados de um programa.
100
Operador relacional Significado Prioridade
== igual baixa != diferente baixa < menor alta <= menor ou igual alta > maior alta >= maior ou igual alta
Operadores relacionais tem prioridade mais baixa que os operadores aritméticos. a é menor do que b? a < b
a é maior do que a soma b + c? a > b + c
a é igual a zero? a == 0
a é diferente de zero? a != 0
Verdadeiro e Falso na linguagem C
A avaliação de uma expressão relacional produz um valor booleano (verdadeiro ou falso), que é convertido para um valor numérico:
• 0, se a expressão for avaliada como falsa.
• 1, se a expressão for avaliada como verdadeira.
Expressão relacional
Expressão envolvendo dados e/ou operadores aritméticos, e operadores relacionais.
5 == 5.0
1, pois não há diferença entre variáveis de tipos numéricos.
5 == '5'
0, pois o valor inteiro do caractere '5' é 53.
PC-I © MAP’2019 Estruturas de seleção
Operadores lógicos
Utilizados para testar mais de uma condição, simultaneamente.
102
Operador lógico Significado Prioridade
! NOT altíssima
&& AND alta
|| OR baixa
Operadores lógicos tem prioridade mais
baixa que os operadores relacionais (exceto o !).
||
expressão 11 0 expressão 2 1 1 1 0 1 0&&
expressão 11 0 expressão 2 1 1 0 0 0 0 expressão !expressão 1 0 0 1Verdadeiro e Falso na linguagem C
A avaliação de uma expressão lógica produz um valor booleano (verdadeiro ou falso), que é convertido para um valor numérico:
• 0, se a expressão for avaliada como falsa.
• 1, se a expressão for avaliada como verdadeira.
Expressão lógica
Expressão envolvendo dados e/ou operadores aritméticos e/ou operadores relacionais e/ ou operadores lógicos.
Generalizando...
• Qualquer valor ou expressão diferente de zero será considerada como verdadeira. • Qualquer valor ou expressão igual à zero será considerada como falsa.
PC-I © MAP’2019 Estruturas de seleção
Exemplo
Sendo a = 3, b = 1 e c = –1, determine o valor da seguinte expressão: ( ( (b + c <= a) + !(2*b) ) && c ) || (3 - !c + 1) Substituindo os valores de a, b e c: ( ( (1 + (-1) <= 3) + !(2*(1) ) && (-1) ) || (3 - !(-1) + 1) ( ( (0 <= 3) + !(2) ) && (-1) ) || (3 - 0 + 1) ( ( 1 + 0 ) && (-1) ) || 4 ( 1 && (-1) ) || 4 1 || 4 1 Portanto a expressão é verdadeira.
104
Estrutura condicional simples
if()
A sintaxe da estrutura if() é: if()
Estrutura utilizada para avaliar uma condição simples.
Atenção
Não se deve usar “;” após o if().
if (expressão)
{
// comandos a serem executados se a expressão for verdadeira.
PC-I © MAP’2019 Estruturas de seleção
A importância dos delimitadores de bloco { e }
As instruções que deverão ser executadas, no caso da expressão da
estrutura if() ser avaliada como verdadeira, deverão ser escritas
dentro de um bloco delimitado pelos símbolos { e }.
No caso da expressão da estrutura if() ser considerada falsa,
todo o bloco de comandos será ignorado e o programa prossegue a partir do primeiro comando após o bloco.
106
Dica importante
Para facilitar a visualização, os comandos dentro de um bloco também devem ser recuados.
Atenção!
Se os delimitadores de bloco { e } forem omitidos, a estrutura if() assume como bloco apenas o primeiro comando após o if().
Exemplo: bloco de comandos
Considere o seguinte trecho de código:
E se os delimitadores de bloco do primeiro if() forem removidos?
aprovado = 0; // aprovado vale FALSO if (media >= 5.0)
{
aprovado = 1; // aprovado vale VERDADEIRO
puts("PARABÉNS!!!"); }
if (aprovado == 0)
puts("Você foi reprovado!");
Se a expressão media >= 5.0 for verdadeira...
o aluno será considerado aprovado e será parabenizado.
Se a expressão media >= 5.0 for falsa...
PC-I © MAP’2019 Estruturas de seleção
Estrutura condicional simples
if()
Exemplo: Ler um número inteiro e informar se o mesmo é par.
108
#include <stdio.h>
int main()
{
int A;
printf("Digite um número inteiro: "); scanf("%d", &A);
if (A % 2 == 0) {
printf("O numero digitado é par.\n"); } return(0); } V Início Fim A A%2 == 0 “PAR” “A?” F
Estrutura condicional simples
if()
Exemplo: Ler os coeficientes da função de 2º grau f(x) = ax2 + bx + c
e calcular as raízes reais, caso existam. #include <stdio.h>
#include <math.h>
int main()
{
float a, b, c, delta, x1, x2;
printf("Digite os coeficientes da equacao ax^2 + bx + c = 0: "); scanf("%f %f %f", &a, &b, &c);
delta = b*b – 4*a*c;
if (delta >= 0) {
x1 = (-b + sqrt(delta))/(2*a); x2 = (-b – sqrt(delta))/(2*a);
printf("As raizes reais sao:\n x1 = %f\n x2 = %f\n", x1, x2); }
PC-I © MAP’2019 Estruturas de seleção
Estrutura condicional simples
if()
Exemplo: Ler 3 valores numéricos distintos e exibir o maior deles.
110 #include <stdio.h> int main() { float a, b, c; float maior;
printf("Digite 3 números distintos: "); scanf("%f %f %f", &a, &b, &c);
if ( a > b && a > c ) { maior = a; } if ( b > a && b > c ) { maior = b; } if ( c > a && c > b ) { maior = c; }
printf("O maior numero digitado é %f\n", maior);
return(0); }
Estrutura condicional simples
if()
Exemplo: Verificar se um número real x pertence ao intervalo [–1, 1].
#include <stdio.h>
int main()
{
float x;
printf("Digite um número: "); scanf("%f", &x); if (x >= -1 && x <= 1) { printf("Pertence.\n”); } return(0); } #include <stdio.h> int main() { float x;
printf("Digite um número: "); scanf("%f", &x); if ( !(x < -1 || x > 1) ) { printf("Pertence.\n”); } return(0); }
PC-I © MAP’2019 Estruturas de seleção
Estrutura condicional composta
if()-else
A sintaxe da estrutura if()-else é:
112
if()-else
Estrutura utilizada para avaliar uma condição composta.
Atenção
Não se deve usar “;” após o if(), nem após o else.
if (expressão)
{
// comandos a serem executados se a expressão for verdadeira.
}
else
{
// comandos a serem executados se a expressão for falsa.
}
Estrutura condicional composta
if()-else
Exemplo: Ler um número inteiro e informar se o mesmo é par ou ímpar.
#include <stdio.h>
int main()
{
int A;
printf("Digite um número inteiro: "); scanf("%d", &A);
if (A % 2 == 0) {
printf("O numero digitado é par.\n"); }
else {
printf("O numero digitado é impar.\n"); } return(0); } F Início Fim A A%2 == 0 “IMPAR” “A?” “PAR” V
PC-I © MAP’2019 Estruturas de seleção
Estrutura condicional composta
if()-else
114 #include <stdio.h> #include <math.h> int main() { float a, b, c, delta, x1, x2;
printf("Digite os coeficientes da equacao ax^2 + bx + c = 0: "); scanf("%f %f %f", &a, &b, &c);
delta = b*b – 4*a*c;
if (delta >= 0) {
x1 = (-b + sqrt(delta))/(2*a); x2 = (-b – sqrt(delta))/(2*a);
printf("As raizes reais sao:\n x1 = %f\n x2 = %f\n", x1, x2); }
else {
printf("Delta = %f\n", delta);
printf("A funcao nao possui raizes reais\n"); }
return(0); }
Estrutura condicional composta
if()-else
Exemplo: Para valores de a, b e c informados pelo usuário, verifique se a expressão abaixo é verdadeira ou falsa:
(!(2*b != c) == b && a – b >= !c) || (b - a == 4*c) #include <stdio.h>
int main()
{
float a, b, c;
printf("Informe os valores de a, b e c: "); scanf("%f %f %f", &a, &b, &c);
if ( (!(2*b != c) == b && a – b >= !c) || (b - a == 4*c) )
printf("A expressão é verdadeira.\n"); else
printf("A expressão é falsa.\n");
return(0); }
PC-I © MAP’2019 Estruturas de seleção
if()
×
if()-else
Neste exemplo, mesmo que a média M seja maior ou igual a 7.0 no primeiro teste, o programa ainda irá executar os outros 2 testes (desnecessário).
116
Média (versão Tropa de Elite)
Leia os valores das 4 notas e calcule a média aritmética M. Se M for maior ou igual a 7.0 exiba a mensagem “Aprovado”. Caso contrário, se M for maior ou igual a 5.0, exiba a mensagem “Realizar Prova P5”, senão exiba a mensagem “Vai voltar pro saco”.
if ( M >= 7.0 )
printf("Aprovado.\n");
if ( M >= 5.0 && M < 7.0 )
printf("Realizar Prova P5.\n");
if ( M < 5.0 )
printf("Vai voltar pro saco.\n");
Aninhamento
Técnica de seqüenciar os testes de modo a melhorar o desempenho do programa.
expressão1 V comandos executados se a expressão1 for verdadeira F expressão2 V comandos executados se a expressão2 for verdadeira F comandos executados se a expressão2 for falsa
PC-I © MAP’2019 Estruturas de seleção
Aninhamento
Se a média M for maior ou igual a 7.0, não há necessidade de realizar outros testes. 118 if ( M >= 7.0 ) printf("Aprovado.\n"); else if ( M >= 5.0 && M < 7.0 )
printf("Realizar Prova 5.\n");
else
printf("Vai voltar pro saco.\n");
Atenção
Uma cláusula else sempre pertence ao if imediatamente anterior. Caso isso não for desejável, deve-se utilizar os delimitadores de bloco { e }.
Aninhamento
Exemplo: Ler 2 números inteiros e exibir o maior deles. #include <stdio.h>
int main()
{
int a, b;
printf("Digite 2 numeros inteiros: "); scanf("%d %d", &a, &b);
if ( a > b )
printf("O maior número é: %d\n", a);
else
if ( b > a )
printf("O maior número é: %d\n", b); else
printf("Dããã! Você digitou 2 números iguais...\n");
return(0); }
PC-I © MAP’2019 Estruturas de seleção
Aninhamento
Exemplo: Ler 3 números inteiros distintos e exibi-los em ordem crescente.
120
printf("Digite 3 numeros inteiros distintos: "); scanf("%d %d %d", &a, &b, &c);
if ( a > b ) if ( a > c ) if ( b > c ) printf("%d %d %d\n", c, b, a); else printf("%d %d %d\n", b, c, a); else printf("%d %d %d\n", b, a, c); else if ( b > c ) if ( a > c ) printf("%d %d %d\n", c, a, b); else printf("%d %d %d\n", a, c, b); else printf("%d %d %d\n", a, b, c);
Aninhamento
Exemplo: Ler uma nota e exibir o conceito correspondente.
printf("Informe a nota: "); scanf("%f", ¬a);
if ( nota >= 9.0 )
printf("Conceito A.\n");
else if ( nota >= 7.5 ) printf("Conceito B.\n"); else if ( nota >= 5.0 ) printf("Conceito C.\n"); else if ( nota >= 3.0 ) printf("Conceito D.\n"); else
printf("Conceito E.\n");
PC-I © MAP’2019 Estruturas de seleção
Aninhamento: outra versão
O usuário poderá escolher qualquer operação, pressionando as respectivas teclas. A tecla selecionada pelo usuário será lida como um caractere.
122
Aninhamento: versão else-if()
Muda apenas a forma de organizar os comandos da estrutura if()-else.
char op; float a, b;
// comandos para apresentar o menu
scanf("%c", &op);
printf("Digite 2 valores nao-nulos: "); scanf("%f %f", &a, &b);
if ( op == '+' ) printf("Soma = %f\n", a + b); else if ( op == '-' ) printf("Diferenca = %f\n", a - b); else if ( op == '*' ) printf("Produto = %f\n", a * b); else if ( op == '/' ) printf("Quociente = %f\n", a / b); else
puts("Opcao invalida!");
PC-I © MAP’2019 Estruturas de seleção
A estrutura condicional múltipla switch()
O aninhamento de várias
estruturas compostas if()-else (ou else-if()) permite o
tratamento de expressões
condicionais que permitem mais de duas alternativas.
Se a expressão resultar em um valor do tipo int ou char, é possível utilizar a estrutura condicional múltipla switch().
124 switch(expressão) { case constante1: //comandos1 break; case constante2: //comandos2 break; ... case constanteN: //comandosN break; default: //comandos }
Funcionamento da estrutura switch()
1. A expressão é avaliada.
2. O fluxo de execução é desviado para o rótulo case cujo valor equivale ao da expressão. Serão executados todos os comandos até que seja encontrado o comando break.
3. A execução do comando break desvia o fluxo de execução para o
primeiro comando após a estrutura switch().
4. Se nenhum case corresponde ao valor da expressão, então o fluxo de execução será desviado para o rótulo default
PC-I © MAP’2019 Estruturas de seleção
Menu de opções: versão switch()
126
char op; float a, b;
puts("Selecione a operacao:\n"); puts(" [+] Adicao”); puts(" [-] Subtracao"); puts(" [*] Multiplicacao"); puts(" [/] Divisao"); printf("Opcao> "); scanf("%c", &op);
printf("Digite 2 valores: "); scanf("%f %f", &a, &b);
switch( op )
{
case '+': printf("Soma = %f\n", a + b); break; case ‘-': printf("Diferenca = %f\n", a - b); break;
case ‘*': printf("Produto = %f\n", a * b); break;
case ‘/': if (b != 0) printf("Quociente = %f\n", a / b); else puts("Divisao por zero!");
break;
default : puts("Opcao invalida!\n"); }
return(0);
O comando break
Cuidado!
A omissão do comando break causará a execução dos case’s subseqüentes.
int main()
{
int dd, mm, aaaa;
printf("Digite a data no formato dd-mm-aaaa: "); scanf("%d-%d-%d", &dd, &mm, &aaaa);
switch( mm ) {
case 4:
case 6:
case 9:
case 11: puts("Mes com 30 dias."); break;
case 2: puts("Este mes tem (geralmente) 28 dias."); break;
default: puts("Mes com 31 dias."); }
return(0); }