Computadores Digitais 2
Prof. Rodrigo de Souza Couto
Linguagens de Programação – DEL-Poli/UFRJ
Prof. Miguel Campista
Aula de Hoje
• Controle de Fluxo
– Tomada de decisão
– Construções com laços
– Seleção
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
ATENÇÃO
• Esta apresentação foi baseada nos seguinte trabalhos:
– Notas de aula do Prof. Marco Casanova da PUC-Rio
• http://www.inf.puc-rio.br/~inf1620/material.html
– Waldemar Celes, Renato Cerqueira, José Lucas Rangel,
“Introdução a Estruturas de Dados”, Editora Campus,
2004
– Herbert Schildt, “C Completo e Total”, Makron Books,
3ª edição, 1997
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Parte 1
Programação (linguagem C)
Controle de fluxo
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Comando if
– Estrutura básica para tomada de decisões em C
if (expr) {
bloco de comandos 1
...
}
Se expr != 0, o “bloco
de comandos 1” será
executado
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Comando if
– Estrutura básica para tomada de decisões em C
if (expr) {
bloco de comandos 1
...
}
else {
bloco de comandos 2
}
Se expr != 0, o “bloco
de comandos 1” será
executado
Computadores Digitais II– DETEL-FEN/UERJ
Senão, o “bloco de
comandos 2” será
executado
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Exemplo
#include <stdio.h>
int main(void) {
int a;
printf(“Digite um numero inteiro\n”);
scanf(“%d”,&a);
if (a%2 == 0){
printf(“Par!\n”);
}
else {
printf(“Impar!\n”);
}
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Exemplo
#include <stdio.h>
int main(void) {
int a;
printf(“Digite um numero inteiro\n”);
scanf(“%d”,&a);
if (a%2 == 0){
printf(“Par!\n”);
Lembrem-se da
}
indentação!!
else {
Ela não é obrigatória
printf(“Impar!\n”);
mas deixa o código
}
mais claro!!!
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Exemplo
#include <stdio.h>
int main(void) {
int a;
printf(“Digite um numero inteiro\n”);
scanf(“%d”,&a);
if (a%2 == 0){
Péssima escolha de nome!
printf(“Par!\n”);
Nomes devem fazer sentido!
}
(aqui na aula serão utilizados
else {
nome assim para deixar o código
printf(“Impar!\n”);
mais conciso).
}
Sugestão de nome:
return 0;
numeroInserido
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Comandos if podem ser aninhados
#include <stdio.h>
int main(void) {
int a,b;
printf(“Digite dois números\n”);
scanf(“%d%d”,&a,&b);
if ((a >= 0) && (b >= 0)){
printf(“Os dois sao positivos ou zero!\n”);
if ((a == 0) || (b == 0)) {
printf(“Um deles eh zero!\n”);
}
}
else {
printf(“Um deles eh negativo !\n”);
}
return 0;
}
Tomada de Decisão
• Quando há apenas 1 comando associado ao if, não é
necessária a criação dos blocos ({...})
#include <stdio.h>
int main(void) {
int a;
printf(“Digite um numero inteiro ”);
scanf(“%d”,&a);
if (a%2 == 0)
printf(“Par!\n”);
else
printf(“Impar!\n”);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Tomada de Decisão
• Às vezes a ausência de blocos pode confundir!
• O que ocorre se a temperatura digitada for 5 ?
/*Decisao sobre a temperatura (versao 1 – incorreta)*/
#include <stdio.h>
Quando não há
int main(void) {
definição de blocos,
int temp;
um else é associado
printf(“Digite a temperatura: ”);
ao último if que não
scanf(“%d”,&temp);
tiver seu próprio else
if (temp < 30)
if (temp > 20)
printf(“Temperatura Agradavel!\n”);
else
printf(“Temperatura Muito Quente!\n”);
return 0;
}
Tomada de Decisão
• Às vezes a ausência de blocos pode confundir!
• O que ocorre se a temperatura digitada for 5 ?
/*Decisao sobre a temperatura (versao 1 – incorreta)*/
#include <stdio.h>
Para temp == 5,
int main(void) {
programa entrará no
int temp;
else
printf(“Digite a temperatura: ”);
scanf(“%d”,&temp);
if (temp < 30)
if (temp > 20)
printf(“Temperatura Agradavel!\n”);
else
printf(“Temperatura Muito Quente!\n”);
return 0;
}
Tomada de Decisão
• Recomenda-se o uso de bloco sempre quando a relação
entre if e else não está clara
/*Decisao sobre a temperatura (versao 2)*/
#include <stdio.h>
int main(void) {
Agora o programa se
comportará da forma
desejável!
int temp;
printf(“Digite a temperatura: ”);
scanf(“%d”,&temp);
if (temp < 30){
if (temp > 20)
printf(“Temperatura Agradavel!\n”);
}
else
printf(“Temperatura Muito Quente!\n”);
return 0;
}
Tomada de Decisão
• Escada if-else-if
/*Decisao sobre a temperatura (versao 3)*/
#include <stdio.h>
int main(void) {
int temp;
printf(“Digite a temperatura: \n”);
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 Muito Quente!\n”);
return 0;
}
Estruturas de Bloco
• Declarações de variáveis podem ocorrer no início do
corpo da função ou no início de um bloco
– Variável só existe dentro do bloco ou função
#include <stdio.h>
int main(void) {
Início de função
int temp;
printf(“Digite a temperatura: ”);
scanf(“%d”,&temp);
if (temp < 30){
Início de bloco
int teste;
teste = temp;
printf(“Temperatura Agradavel!\n”);
}
/*Variavel teste nao existe neste ponto do programa
temp += 1;
return 0;
}
Estruturas de Bloco
• Declarações de variáveis podem ocorrer no início do
corpo da função ou no início de um bloco
– Variável só existe dentro do bloco ou função
#include <stdio.h>
int main(void) {
Boa prática de
programação: declarar
variáveis o mais
próximas possível de
seus usos
int temp;
printf(“Digite a temperatura: ”);
scanf(“%d”,&temp);
if (temp < 30){
int teste;
teste = temp;
printf(“Temperatura Agradavel!\n”);
}
/*Variavel teste nao existe neste ponto do programa
temp += 1;
return 0;
}
Tomada de Decisão
• Operador Condicional
– Substitui construções if-else
– Forma geral
• condicao ? expressao1 : expressao2;
...
if (a > b) {
maximo = a;
}
else {
maximo = b;
}
...
Computadores Digitais II– DETEL-FEN/UERJ
maximo = a > b ? a : b;
Prof. Rodrigo de Souza Couto
Construções com laços
• Procedimentos iterativos são muito comuns em
programas computacionais
• Exemplo: Cálculo do fatorial n!
– n! = n x (n-1) x (n-2) x (n-3) … 3 x 2 x 1
– 0! = 1
Podemos fazer esse cálculo utilizando um laço
while
(podemos fazer também com recursividade, mas isso
é assunto para outra aula!)
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Laço while
– Bloco é executado se expr for diferente de zero
– Ao final do bloco, expr volta a ser avaliada
– Bloco é executado repetidamente até expr assumir
valor zero
while (expr) {
bloco de comandos
...
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Complete o programa abaixo para receber do usuário
um número inteiro ’n’ e imprimir seu fatorial
– Utilizando while
#include <stdio.h>
int main(void) {
...
int n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
/* calcula fatorial */
...
printf (“Fatorial = %d :\n”,fatorial);
return 0;
}
Construções com laços
#include <stdio.h>
int main(void) {
int i, n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
/* calcula fatorial */
fatorial = 1;
i = 1;
while ( i <= n ) {
fatorial *= i;
i++;
}
printf (“Fatorial = %d :\n”,fatorial);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Laço for
for (exprInicialização; exprCondição; exprIncremento){
bloco de comandos
...
}
exprInicialização
while (exprCondição) {
bloco de comandos
...
exprIncremento
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Como alterar o programa de cálculo de fatorial para
utilizar for ao invés de while?
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
#include <stdio.h>
int main(void) {
int i, n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
/* calcula fatorial */
for ( fatorial = 1 , i = 1 ; i <= n ; i++ ) {
fatorial *= i;
}
printf (“Fatorial = %d :\n”,fatorial);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
#include <stdio.h>
int main(void) {
int i, n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
}
/* calcula fatorial */
for ( fatorial = 1 , i = 1 ; i <= n ; i++ ) {
fatorial *= i;
}
printf (“Fatorial = %d :\n”,fatorial);
return 0;
Reparem que posso
usar a vírgula para
inicializar mais de uma
variável!
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
#include <stdio.h>
int main(void) {
int i, n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
}
/* calcula fatorial */
for ( fatorial = 1 , i = 1 ; i <= n ; i++ ) {
fatorial *= i;
}
printf (“Fatorial = %d :\n”,fatorial);
return 0;
Também poderia usar
a vírgula no
incremento. E na
condição?
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
#include <stdio.h>
int main(void) {
int i, n, fatorial;
printf(“Digite um numero inteiro nao negativo:”);
scanf(“%d”,&n);
/* calcula fatorial */
for ( fatorial = 1 , i = 1 ; i <= n ; i++ ) {
fatorial *= i;
}
printf (“Fatorial = %d :\n”,fatorial);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Na condição devo formar estruturas
com operadores lógicos
Ex: ((i <= n) && (j < 30))
Prof. Rodrigo de Souza Couto
Construções com laços
• Laço do-while
– Bloco é executado inicialmente independentemente das
condições
– Ao final do bloco, expr é avaliada
– Bloco é executado repetidamente até expr assumir
valor zero
do {
bloco de comandos
...
} while (expr)
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Interrupções com break e continue
– Interrupção antecipada de um laço
– break: interrompe e termina a execução do laço
#include <stdio.h>
int main(void) {
int i;
for ( i = 0 ; i < 10 ; i++ ) {
if (i == 5)
break;
printf (“%d ”,i);
}
printf (“fim \n”);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Saída:
0 1 2 3 4 fim
Prof. Rodrigo de Souza Couto
Construções com laços
• Interrupções com break e continue
– Interrupção antecipada de um laço
– continue: interrompe e termina a execução do laço e
passa para a próxima iteração
#include <stdio.h>
int main(void) {
int i;
for ( i = 0 ; i < 10 ; i++ ) {
if (i == 5)
continue;
printf (“%d ”,i);
}
Saída:
printf (“fim \n”);
0 1 2 3 4 6 7 8 9 fim
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Qual é a saída do programa abaixo?
#include <stdio.h>
int main(void) {
int i = 0;
while ( i < 10) {
if (i == 5)
continue;
printf (“%d ”,i);
i++;
}
printf (“fim \n”);
return 0;
}
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Qual é a saída do programa abaixo?
#include <stdio.h>
int main(void) {
int i = 0;
while ( i < 10) {
if (i == 5)
continue;
printf (“%d ”,i);
i++;
}
printf (“fim \n”);
return 0;
}
O programa nunca termina!
Use com cuidado o comando
continue
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Seleção com o comando switch
switch (expr)
case op1:
...
break;
case op2:
...
break;
case op3:
...
break;
default:
...
break;
...
}
{
/*Comandos executados se expr == op1*/
/*Comandos executados se expr == op2*/
/*Comandos executados se expr == op3*/
/*executado se expr for diferente de todos*/
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
Construções com laços
• Seleção com o comando switch
– op1, op2, op3, etc. devem ser números inteiros ou
caracteres
– Comandos seguintes ao caso verdadeiro são executados
até encontrar um break
– Bloco default é opcional e é executado se expr for
diferente de todos os casos enumerados
Computadores Digitais II– DETEL-FEN/UERJ
Prof. Rodrigo de Souza Couto
#include <stdio.h>
int main(void) {
float num1, num2;
char op;
printf (“Digite: numero op 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;
}
Download

Slides