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; }