Controle de Fluxo - Condicionais
1
INF1005 – Programação I
Prof. Hélio Lopes
lopes@inf.puc-rio.br
sala 408 RDC
controle de fluxo - condicionais
tópicos
if
if…else
if…else if…else
expressões booleanas
operadores relacionais e lógicos
switch
referência
Capítulo 4 da apostila
tomada de
decisão
3
condicionais (tomada de decisão) - if
if ( expressao booleana ) /* se expressao for verdadeira... */
{
bloco de comandos 1 /* ... executa o bloco de comandos 1, */
}
próximo comando... /* prossegue para próximo comando após if */
if ( nota < 5.0 ) /* se expressao for verdadeira... */
{
printf("Reprovado"); /* ... executa o bloco de comandos 1, */
}
printf("\nfim"); /* prossegue para próximo comando após if */
exemplo
condicionais (tomada de decisão) – if...else
if ( expressao booleana ) /* se expressao for verdadeira,... */
{
bloco de comandos 1 /* ... executa o bloco de comandos 1, */
} else {
bloco de comandos 2 /* ... senão, executa o bloco de comandos 2 */
}
próximo comando... /* depois prossegue para próximo comando após if */
verdadeiro: expressao != 0 falso: expressao == 0 5 if ( media >= 6.0 ) { printf("Aprovado\n"); } else {
printf("Em prova final\n"); } printf("\nfim");
exemplo
exemplo
#include <stdio.h>int main (void) {
float media;
printf("Digite sua media: "); scanf("%f", &media); if (media >= 6) { printf("Aprovado\n"); } else {
printf("Em prova final\n"); } return 0; } #include <stdio.h>
int main (void) {
float media;
printf("Digite sua media: "); scanf("%f", &media);
if (media >= 6)
printf("Aprovado\n"); else
printf("Em prova final\n");
return 0; }
Quando só tem um comando, não precisa marcar como bloco entre { e }
05_01_cond_media.c
tomada de decisão
exemplo: qualificando a temperatura
casos de teste:
5°C 15°C 25°C 35°C
quente agradável frio20°C
30°C
muito frio10°C
7Cuidado!
/* temperatura (versao 1 -‐ INCORRETA) */ #include <stdio.h>
int main (void) {
int temp;
printf("Digite a temperatura: "); scanf("%d", &temp); if (temp < 30) if (temp > 20) printf("Temperatura agradavel \n"); else printf("Temperatura quente \n"); return 0; } Em C, um else está associado ao último if "sem else".
O que acontece quando a temperatura for: • 5oC ?
• 15oC ?
• 25oC ?
Cuidado!
/* temperatura (versao 1 -‐ INCORRETA) */ #include <stdio.h>
int main (void) {
int temp;
printf("Digite a temperatura: "); scanf("%d", &temp); if (temp < 30) if (temp > 20) printf("Temperatura agradavel \n"); else printf("Temperatura quente \n"); return 0; }
O que acontece quando a temperatura for: • 5oC ? • 15oC ? • 25oC ? • 35oC ? 9
ainda incompleto
/* temperatura (versao 2 -‐ INCOMPLETA) */ #include <stdio.h>int main (void) {
int temp;
printf("Digite a temperatura: "); scanf("%d", &temp); if (temp < 30) { if (temp > 20) printf("Temperatura agradavel \n"); } else printf("Temperatura quente \n"); return 0; }
O que acontece quando a temperatura for: • 5oC ? • 15oC ? • 25oC ? • 35oC ? 05_05_temp_erro2.c 10
versão correta
/* temperatura (versao 3 -‐ correta) */
#include <stdio.h> int main (void) {
int temp;
printf("Digite a temperatura: "); scanf("%d", &temp);
if (temp < 10)
printf("Temperatura muito fria \n"); else if (temp < 20)
printf("Temperatura fria \n"); else if (temp < 30)
printf("Temperatura agradavel \n"); else
printf("Temperatura quente \n");
return 0; }
O que acontece quando a temperatura for: • 5oC ? • 15oC ? • 25oC ? • 35oC ? 05_07_temp_ok.c 11
encadeamento de if...else
/* encadeamento if... else */
if ( expressao1 ) {
bloco de comandos 1
}
else if ( expressao2 ) {
bloco de comandos 2
}
else if ( expressao3 ) {
bloco de comandos 3
}
else
{
bloco de comandos n /* executado quando todas as expressões são falsas */
}
/* próximo comando */
/* exemplo anterior */
if (temp < 10)
printf("Temperatura muito fria \n");
else if (temp < 20)
printf("Temperatura fria \n");
else if (temp < 30)
printf("Temperatura agradavel \n");
else
exercício
Escreva um programa em C que leia uma média e exiba o status do aluno:
AP se o aluno está aprovado (média final >= 6) RM se o aluno está reprovado (média final < 3) PF se ou em prova final (caso contrário)
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
EX. 01 13
exercício
Escreva um programa em C que leia uma média e exiba o status do aluno:
AP se o aluno está aprovado (média final >= 6) RM se o aluno está reprovado (média final < 3) PF se ou em prova final (caso contrário)
#include <stdio.h>
int main (void) {
float media;
printf("Digite a media: "); scanf("%f", &media);
if (media >= 6) printf("AP"); else if (media < 3) printf("RM"); else printf("PF"); return 0; } EX. 01 05_exerc_cond_media_if.c 14
dúvidas?
15
O que tem de errado com esse código?
if ( media >= 6.0 ){
printf("Aprovado\n"); }
else if ( media < 6.0 ) {
printf("Em prova final\n"); }
printf("\nfim");
Isso é conceitualmente ruim. Por quê?
if ( media >= 6.0 ) { printf("Aprovado\n"); } else {
printf("Em prova final\n"); }
expressão booleana
quando avaliada resulta no valor
falso ou
verdadeiro
em C:
0 significa falso
qualquer outro valor significa
verdadeiro
por convenção, utiliza-se geralmente o valor
1
para representar
verdadeiro
17
operadores relacionais
> < <= >= == !=
numa expressão booleana, a comparação de
dois operandos resulta em
0
, caso a expressão seja
falsa
, ou
1
, caso a expressão seja
verdadeira
Exemplo:
int a=10, b=10, c=5;
a > b
resulta em 0 (falso)
b > c
resulta em 1 (verdadeiro)
a == b resulta em 1 (verdadeiro)
b != c
resulta em 1 (verdadeiro)
03_15_op_rel.coperadores lógicos
combinam expressões ou valores booleanos
conjunção (and)
(operador binário)
&&
a && b
disjunção (or)
(operador binário)
||
a || b
negação (not)
(operador unário)
!
!a
19
operadores lógicos – conjunção
&& (and)
|| (or) ! (not)
true && true resulta em true true && false resulta em false false && true resulta em false false && false resulta em false
exemplos
(1 > 0) && (2 > 0) é avaliada como 1 && 1, e resulta em 1 (verdadeiro) (1 > 0) && (2 < 0) é avaliada como 1 && 0, e resulta em 0 (falso) (2 < 0) && (1 > 0) resulta em 0 (false)
operadores lógicos – conjunção – exemplo
21
if ( media >= 5.0 && nota1 >= 3.0 && nota2 >= 3.0 && nota3 >= 3.0) {
printf("Aprovado\n"); }
operadores lógicos – disjunção
&& (and)
|| (or)
! (not)
true || true resulta em true true || false resulta em true false || true resulta em true false || false resulta em false
exemplos
(1 > 0) || (2 > 0) resulta em 1 (verdadeiro) (1 > 0) || (2 < 0) resulta em 1 (verdadeiro)
(2 < 0) || (1 > 0) é avaliada como 0 || 1, e resulta em 1 (verdadeiro) (1 < 0) || (2 < 0) é avaliada como 0 || 0, e resulta em 0 (falso)
operadores lógicos – disjunção – exemplo
23
if ( media < 5.0 || nota1 < 3.0 || nota2 < 3.0 || nota3 < 3.0) {
printf("Em prova final\n"); }
operadores lógicos - negação
&& (and) || (or)
! (not)
!true resulta em false !false resulta em true
exemplos
!(1 > 0) é avaliada como !1, e resulta em 0 (falso) !(1 < 0) é avaliada como !0, e resulta em 1 (verdadeiro)
operadores lógicos – negação – exemplo
25
if ( !( media < 5.0 || nota1 < 3.0 || nota2 < 3.0 || nota3 < 3.0) ) { printf("Aprovado\n"); }
dúvidas?
26 /* conjunção */if ( media >= 5.0 && nota1 >= 3.0 && nota2 >= 3.0 && nota3 >= 3.0) {
printf("Aprovado\n"); }
/* disjunção */
if ( media < 5.0 || nota1 < 3.0 || nota2 < 3.0 || nota3 < 3.0) {
printf("Em prova final\n"); }
/* negação (e disjunção) */
if ( !( media < 5.0 || nota1 < 3.0 || nota2 < 3.0 || nota3 < 3.0) ) {
printf("Aprovado\n"); }
operadores lógicos
Seja:
int a = 2, b = 4, c = 5, d = 7;
Avalie:
(a < b) && (c < d)
03_17_op_log.c 27 2 < 4 1 5 < 7 1 && 1 && 1 && 11 ambas expressões são avaliadas
EX. 02
operadores lógicos
Seja:
int a = 2, b = 4, c = 5, d = 7;
Avalie:
(a > b) && (c < d)
2 > 4 00 não importa o que vem depois, pois a expressão combinada
sempre será falsa
&&
as expressões combinadas com && são avaliadas até que uma seja falsa (retornando 0) ou todas sejam verdadeiras (retornando 1)
operadores lógicos
Seja:
int a = 2, b = 4, c = 5, d = 7;
Avalie:
(a > b) || (c > d)
03_17_op_log.c 29 2 > 4 0 5 > 7 0 || 0 || 0 || 00 ambas expressões são avaliadas
EX. 04
operadores lógicos
Seja:
int a = 2, b = 4, c = 5, d = 7;
Avalie:
(a < b) || (d > c)
03_17_op_log.c 30 2 < 4 11 não importa o que vem depois, pois a expressão combinada
sempre será verdadeira
||
as expressões combinadas com || são avaliadas até que uma seja verdadeira (retornando 1) ou todas sejam falsas (retornando 0)
dúvidas?
31
exemplo – conversão de nota em conceito
Leia uma nota de 0 a 10 e escreva o conceito
equivalente, conforme a seguinte tabela:
notas conceitos 9.0 a 10.0 A 8.0 a 8.9 B 7.0 a 7.9 C 5.0 a 6.9 D menor que 5.0 F
exemplo – conversão de nota em conceito (1)
33
#include <stdio.h> int main (void) {
float nota;
printf("Entre com a nota: "); scanf("%f",¬a);
if (nota >= 9.0) { printf("A"); }
if (nota >= 8.0 && nota < 9.0) { printf("B");
}
if (nota >= 7.0 && nota < 8.0) { printf("C");
}
if (nota >= 5.0 && nota < 7.0) { printf("D"); } if (nota < 5.0) { printf("F"); } return 0; }
Esta solução é boa?
Por quê?
Por que não?
notas conceitos 9.0 a 10.0 A 8.0 a 8.9 B 7.0 a 7.9 C 5.0 a 6.9 D menor que 5.0 F
exemplo – conversão de nota em conceito (2)
34
#include <stdio.h> int main (void) {
float nota;
printf("Entre com a nota: "); scanf("%f",¬a);
if (nota >= 9.0) { printf("A"); }
else if (nota >= 8.0) { printf("B"); }
else if (nota >= 7.0) { printf("C"); }
else if (nota >= 5.0) { printf("D"); } else { printf("F"); } return 0; } notas conceitos 9.0 a 10.0 A 8.0 a 8.9 B 7.0 a 7.9 C 5.0 a 6.9 D menor que 5.0 F
exemplo – conversão de nota em conceito (3)
35
#include <stdio.h> int main (void) {
float nota;
printf("Entre com a nota: "); scanf("%f",¬a);
if (nota >= 9.0) printf("A"); else if (nota >= 8.0) printf("B"); else if (nota >= 7.0) printf("C"); else if (nota >= 5.0) printf("D"); else
printf("F"); return 0; }
O que mudou nesta
solução?
notas conceitos 9.0 a 10.0 A 8.0 a 8.9 B 7.0 a 7.9 C 5.0 a 6.9 D menor que 5.0 Fdúvidas?
raízes de equações do segundo grau
As raízes da equação
são:
Escreva um programa que leia os coeficientes
a
,
b
,
c
e
exiba as raízes reais da equação, se houver.
Utilize a função
double sqrt(double)
da biblioteca
math.h
para calcular a raiz quadrada de um número.
37 EX. 06
!=−#±√#↑2 −4'( /2'
'!↑2 +#!+(=0
cálculo de volume
Escreva um programa que:
1. apresente um menu para o usuário com as opções:
1 – caixa, 2 – esfera, 3 – cilindro e 4 – cone 2. leia do teclado a opção desejada
3. leia as dimensões do objeto selecionado
4. calcule e escreva o volume do objeto
Lembre-se que:
38 EX. 07
*('+!'(',#,()='#(
*(+,+-./0(/,ℎ)= 4/↑2 ℎ
dúvidas?
39
seleção – comando
switch
seleciona um dentre vários casos
(op
kdeve ser um inteiro ou caractere)
switch ( expr ) {
case op1: bloco de comandos 1; break;
case op2: bloco de comandos 2; break;
...
default: bloco de comandos default; break; }
...
O switch seleciona apenas o ponto de entrada. O comando break é necessário para prosseguir a partir do comando que sucede o switch, pulando os cases seguintes.
/* calculadora de quatro operações */
#include <stdio.h>
int main (void) {
float num1, num2; char op;
printf("Digite uma expressao: numero operador numero\n"); scanf ("%f %c %f", &num1, &op, &num2);
switch (op) {
case '+': printf(" = %f\n", num1 + num2); break; case '-‐': printf(" = %f\n", num1 -‐ num2); break; case '*': printf(" = %f\n", num1 * num2); break; case '/': printf(" = %f\n", num1 / num2); break; default : printf("Operador invalido!\n"); break; } return 0; }
exemplo - calculadora
05_09_calc.c 41dúvidas?
42condicao
?
expressao1
:
expressao2
;
caso contrário, resulta no valor da expressao2
condicionais if e ?
maximo = a > b ? a : b ;if (
a > b
)
maximo = a;
else
maximo = b;
se condicao for verdadeira, resulta no valor da expressao1
condicao é avaliada
condição é avaliada
se condição for verdadeira, executa esse comando
se condição for falsa, executa esse comando
43
exercício
No código do exercício anterior, substitua todos os if's pelo
operador condicional
?
EX. 06
#include <stdio.h>
int main (void) {
float media;
printf("Digite a media: "); scanf("%f", &media);
if (media >= 6)
printf("AP");
else if (media < 3)
printf("RM"); else printf("PF"); return 0; }
exercício
No código do exercício anterior, substitua todos os if's pelo
operador condicional
?
#include <stdio.h>
int main (void) {
float media;
printf("Digite a media: "); scanf("%f", &media);
printf((media >= 6)? "AP" : (media < 3) ? "RM" : "PF"); return 0; } EX. 06 05_exerc_cond_media_noif.c 45
Nem sempre o código fica mais legível ou melhor utilizando o operador condicional.
dúvidas?
Prof. Hélio Lopes lopes@inf.puc-rio.br sala 408 RDC