Você está na página 1de 50

AEDsI – Aula 03

Comandos Condicionais

Universidade Federal de Minas Gerais

2017

DCC

1
Baseado nas aulas do professor Jefersson dos Santos
AEDsI — Aula 03

Roteiro

1 Expressões relacionais

2 Expressões lógicas

3 Comandos condicionais

4 Teste de Mesa

5 Decisão simples e decisão múltipla

6 O comando switch

2 / 50
AEDsI — Aula 03

Expressão

Já vimos que constantes, variáveis e endereços de variáveis são


expressões.

Exemplo
a = 10;
a = b;
endereco = &a;

Vimos também que operações aritméticas também são expressões.

Exemplo
a = 2 + 2;
a = 10 / (float) 3;
a = a + 1;

3 / 50
AEDsI — Aula 03
Expressões relacionais

Expressões relacionais

Expressões relacionais são aquelas que realizam uma comparação entre


duas expressões e retornam
1 Zero (0), se o resultado é falso
2 Um (1), ou qualquer outro número diferente de zero, se o resultado é
verdadeiro.

4 / 50
AEDsI — Aula 03
Expressões relacionais

Expressões relacionais

Para não esquecer os valores possı́veis de uma expressão relacional, use:

S1M NÃ0

5 / 50
AEDsI — Aula 03
Expressões relacionais

Expressões relacionais

< expressao > == < expressao >: Retorna verdadeiro quando as


expressões forem iguais.
Ex: a == b
< expressao > != < expressao >: Retorna verdadeiro quando as
expressões forem diferentes.
Ex: a != b

6 / 50
AEDsI — Aula 03
Expressões relacionais

Expressões relacionais

< expressao > > < expressao >: Retorna verdadeiro quando a
expressão da esquerda tiver valor maior que a expressão da direita.
Ex: a > b
< expressao > < < expressao >: Retorna verdadeiro quando a
expressão da esquerda tiver valor menor que a expressão da direita.
Ex: a < b

7 / 50
AEDsI — Aula 03
Expressões relacionais

Expressões relacionais

< expressao > >= < expressao >: Retorna verdadeiro quando a
expressão da esquerda tiver valor maior ou igual que a expressão da
direita.
Ex: a >= b
< expressao > <= < expressao >: Retorna verdadeiro quando a
expressão da esquerda tiver valor menor ou igual que a expressão da
direita.
Ex: a <= b

8 / 50
AEDsI — Aula 03
Expressões lógicas

Expressões lógicas

Expressões lógicas são aquelas que realizam uma operação lógica (ou, e,
não, etc...) e retornam verdadeiro ou falso (como as expressões relacionais).

9 / 50
AEDsI — Aula 03
Expressões lógicas

Expressões lógicas

< expressao > && < expressao >: Retorna verdadeiro quando ambas
as expressões são verdadeiras. Sua tabela verdade é:

Op1 Op2 Ret


V V V
V F F
F V F
F F F

Exemplo
a == 0 && b == 0

10 / 50
AEDsI — Aula 03
Expressões lógicas

Expressões lógicas

< expressao > || < expressao >: Retorna verdadeiro quando pelo
menos uma das expressões é verdadeiras. Sua tabela verdade é:

Op1 Op2 Ret


V V V
V F V
F V V
F F F

Exemplo
a == 0 || b == 0

11 / 50
AEDsI — Aula 03
Expressões lógicas

Expressões lógicas

! < expressao >: Retorna verdadeiro quando a expressão é falsa e


vice-versa. Sua tabela verdade é:

Op1 Ret
V F
F V

Exemplo
!(a == 0)

12 / 50
AEDsI — Aula 03
Expressões lógicas

Simplificações úteis

!(a == b) é equivalente a a != b
!(a != b) é equivalente a a == b
!(a > b) é equivalente a a <= b
!(a < b) é equivalente a a >= b
!(a >= b) é equivalente a a < b
!(a <= b) é equivalente a a > b

13 / 50
AEDsI — Aula 03
Expressões lógicas

Lei de De Morgan 1

!a && !b é equivalente a !(a || b)

a b a||b !(a||b) !a !b !a&&!b


V V V F F F F
V F V F F V F
F V V F V F F
F F F V V V V

14 / 50
AEDsI — Aula 03
Expressões lógicas

Lei de De Morgan 2

!a || !b é equivalente a !(a && b)

a b a&&b !(a&&b) !a !b !a||!b


V V V F F F F
V F F V F V V
F V F V V F V
F F F V V V V

15 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais
Um comando condicional é aquele que permite decidir se um determinado
bloco de comandos deve ou não ser executado, a partir do resultado de uma
expressão relacional ou lógica.

16 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

O principal comando condicional da linguagem C é o if, cuja sintaxe é:


if (expressão lógica)
comando; ou
if (expressão lógica) {
comandos
}
Os comandos são executados somente se a expressão lógica for
verdadeira.

17 / 50
AEDsI — Aula 03
Comandos condicionais

Bloco de comandos

É um conjunto de instruções agrupadas.


Limitada pelos caracteres { e }.
Declaração de variáveis “locais”:
Devem ser sempre declaradas antes de qualquer outro comando.
São válidas somente dentro do bloco.

Exemplo
main(void)
{ ←− Inı́cio do bloco de comandos
int a;
a=1;
} ←− Fim do bloco de comandos

18 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

O programa abaixo determina se um valor é ı́mpar.

main () {
int a;
scanf("%d", &a);
if (a % 2) {
printf ("O valor é ı́mpar.\n");
}
}

19 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

Uma variação do comando if é o if/else, cuja sintaxe é:


if (expressão lógica) {
comandos executados se a expressão é verdadeira
} else {
comandos executados se a expressão é falsa
}

20 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

if (cond1)
if (cond2)
comando1;
else
comando2;

Quando o comando2 é executado?

21 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

if (cond1)
if (cond2)
comando1;
else
comando2;

Quando o comando2 é executado?

22 / 50
AEDsI — Aula 03
Comandos condicionais

Comandos condicionais

if (cond1) {
if (cond2)
comando1;
} else
comando2;

Quando o comando2 é executado?

23 / 50
AEDsI — Aula 03
Comandos condicionais

Exercı́cios

Escreva um programa que calcule as raı́zes reais de uma equação de


segundo grau, ou emita uma mensagem caso as mesmas não existam.
Escreva um programa que ordene três números. Tente encontrar uma
versão com apenas 3 comandos if.

24 / 50
AEDsI — Aula 03
Comandos condicionais

Exercı́cios

Escreva um programa que, dado duas datas, determine qual delas


ocorreu cronologicamente antes em relação a outra. Cada data é
composta de 3 números inteiros, um representando o ano, outro o mês e
outro o dia.
Escreva um programa que, dado o comprimento de três segmentos de
reta, determine se eles formam um triângulo e, caso formem, diga se o
triângulo é equilátero, isóceles ou escaleno.

25 / 50
AEDsI — Aula 03
Teste de Mesa

Introdução

Às vezes, acontece de programarmos um código, porém ele não faz o


que esperávamos que fizesse.
Isso acontece por vários motivos, entre os quais destacam-se:
Erros de programação: instruções escritas erradas.
Erros da nossa lógica: o conjunto de passos pensados que parecia
resolver o problema na realidade não cobre todas as situações.
Eventualmente, simplesmente olhar o código pode não trazer a tona o
erro.
Por isso, utiliza-se uma técnica de simulação do código
Pode ser automatizada (utilizando um debugger )
Pode ser feita manualmente, utilizando papel e caneta.

26 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Bem simples: Existem apenas 2 passos.


“Alocação” dos espaços de variáveis
“Execução” de uma instrução de cada vez.
Alocação de memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
Após “executar” a linha 1
Tipo int int
Nome divisor dividendo
Valor ? ?

27 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Bem simples: Existem apenas 2 passos.


“Alocação” dos espaços de variáveis
“Execução” de uma instrução de cada vez.
Alocação de memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
Após “executar” a linha 2
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?

28 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado; ← Último executado
3. divisor=10; ← Próximo Comando
4. dividendo=13;
5. resultado = dividendo / divisor;
Após “executar” a linha 2
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?

29 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
3. divisor=10; ← Último executado
4. dividendo=13; ← Próximo Comando
5. resultado = dividendo / divisor;
Após “executar” a linha 3
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?
10

30 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
3. divisor=10;
4. dividendo=13; ← Último executado
5. resultado = dividendo / divisor; ← Próximo Comando
Após “executar” a linha 4
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?
10 13

31 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
3. divisor=10;
4. dividendo=13;
5. resultado = dividendo / divisor; ← Último executado
Após “executar” a linha 5
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?
10 13 1.0

32 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código:
1. int divisor,dividendo;
2. float resultado;
3. divisor=10;
4. dividendo=13;
5. resultado = dividendo / divisor; ← Último executado
Término da execução (não há mais comandos)
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?
10 13 1.0

33 / 50
AEDsI — Aula 03
Teste de Mesa

Simulação Manual

Execução em memória:
Ex. Suponha o código (corrigido):
1. int divisor,dividendo;
2. float resultado;
3. divisor=10;
4. dividendo=13;
5. resultado = (float)dividendo / (float)divisor;
Execução completa
Tipo int int float
Nome divisor dividendo resultado
Valor ? ? ?
10 13 1.3

34 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão simples e decisão múltipla

Dependendo do problema proposto, o programa pode ser formado por


um conjunto muito grande de comandos if e expressões lógicas.

Exemplo
Faça um programa que, dado um número de matrı́cula, emite uma
mensagem se o aluno estiver matriculado em uma turma de AEDsI.

35 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão simples

Para apenas um aluno, a solução seria:

main () {
int a;
scanf("%d", &a);
if (a == 10129) {
printf("O aluno %d está matriculado\n", a);
}
}

36 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão múltipla

Para dois alunos, a solução seria:

main () {
int a;
scanf("%d", &a);
if (a == 10129 || a == 16267) {
printf("O aluno %d está matriculado\n", a);
}
}

37 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão múltipla

Problema: cada turma de AEDsI possui entre 60 e 150 alunos temos


várias turmas neste semestre.
if (a == 2582 || a == 10129 ||
a == 16267 || ...
a = 962185) {
printf("O aluno %d está matriculado\n", a);
}

Terı́amos muitas condições a serem testadas.

38 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão simples e decisão múltipla

Exemplo 2
Faça um programa que, dado um número de matrı́cula, mostre o nome
desse aluno.

39 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão simples

Para apenas um aluno, a solução seria:

main () {
int a;
scanf("%d", &a);
if (a == 10129) {
printf("Maria Cândida Moreira Telles\n");
}
}

40 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão múltipla

main () {
int a;
scanf("%d", &a);
if (a == 10129)
printf("Maria Cândida Moreira Telles\n");
if (a == 33860)
printf("Larissa Garcia Alfonsi\n");
if (a == 33967)
printf("Leonardo Kozlowiski Kenupp\n");
}

41 / 50
AEDsI — Aula 03
Decisão simples e decisão múltipla

Decisão múltipla
Novamente, temos um conjunto muito grande de alunos.
Além disso, não podemos utilizar os operadores lógicos que utilizamos
anteriormente.
Podemos tentar diminuir o número de testes realizados?
Uma construção bem comum é o uso da seqüência if else if:

if (<condição1>)
<comando>
else if (<condição2>)
<comando>
...
else if (<condiçãoN>)
<comando>

42 / 50
AEDsI — Aula 03
O comando switch

O comando switch

O objetivo do comando switch é simplificar uma expressão onde uma


variável inteira ou caracter deve fazer diferentes operações dependendo
exclusivamente de seu valor.

Sintaxe
switch (variável inteira) {
case valor: comandos
break;
case valor: comandos
break;
}

43 / 50
AEDsI — Aula 03
O comando switch

O comando switch

switch(a) {
case 10129:
printf("Maria Cândida Moreira Telles\n");
break;
case 33860:
printf("Larissa Garcia Alfonsi\n");
break;
case 33967:
printf("Leonardo Kozlowiski Kenupp\n");
break;
}

44 / 50
AEDsI — Aula 03
O comando switch

O comando switch

Os comandos começam a ser executados a partir do ponto onde o valor


da variável corresponde ao valor antes dos dois pontos (:).
Executa todos os comandos até que encontre um comando break ou
que chegue ao final do bloco de comandos do switch

45 / 50
AEDsI — Aula 03
O comando switch

Valor padrão

Você pode utilizar, ao invés de um valor, o valor default. A execução


dos comandos inicia no comando default se nenhum outro valor for
correspondente ao valor da variável.

Sintaxe
switch (variável inteira) {
valor: comandos break;
default: comandos
}

46 / 50
AEDsI — Aula 03
O comando switch

Valor padrão

switch(a) {
case 10129:
printf("Maria Cândida Moreira Telles\n");
break;
case 33860:
printf("Larissa Garcia Alfonsi\n");
break;
default:
printf("O aluno não está matriculado\n");
}

47 / 50
AEDsI — Aula 03
O comando switch

Exercı́cios

Dada uma letra, escreva na tela se essa letra é ou não uma vogal (pode
considerar apenas letras minúsculas).
Dado um caracter, escreva na tela se esse caracter é uma letra
minúscula.

48 / 50
AEDsI — Aula 03
O comando switch

Exercı́cios

Escreva um programa que recebe um operando, um operador aritmético


e outro operando e calcule a operação indicada. As operações possı́veis
são soma(+), subtração(−), multiplicação(*) e divisão(/).

Exemplo
10 + 2
imprime 12 na tela.

49 / 50
AEDsI — Aula 03
O comando switch

Exercı́cios

Escreva um programa que mostre na tela um menu de pratos (pelo


menos 5), cada um associado a um número.
Prato 1 - Miojo
Prato 2 - Ensopado
Quando um número é selecionado, o programa deve exibir uma breve
descrição do prato. Por exemplo, ao digitar 1, o programa mostra:
“Macarrão instantâneo”

50 / 50