CES10 INTRODUO COMPUTAO Captulo IV Comandos de Controle

  • Slides: 46
Download presentation
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo IV Comandos de Controle de Fluxo

CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo IV Comandos de Controle de Fluxo

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4. 2 – Comandos condicionais 4. 3 – Expressões condicionais 4. 4 – Comandos repetitivos 4. 5 – Comandos de escape 4. 6 – Comandos de seleção 4. 7 – Introdução à metodologia top-down

4. 1 – Comandos Compostos 4. 1. 1 – Definição n Comando composto: sequência

4. 1 – Comandos Compostos 4. 1. 1 – Definição n Comando composto: sequência linear de comandos delimitada por abre e fecha-chaves (‘{’ e ‘}’) n Muitas vezes o escopo de um comando condicional ou repetitivo é um comando composto

4. 1. 2 – Descrições sintáticas informais de comandos tradicionais n Cmd. Composto →

4. 1. 2 – Descrições sintáticas informais de comandos tradicionais n Cmd. Composto → { Comando. . . Comando } n Comando → Cmd. Composto | Cmd. Condicional | Cmd. Repetitivo | Cmd. Seleção | Cmd. Atribuição | Cmd. Entrada | Cmd. Saída | Cmd. Escape | Chamada. Função | Cmd. Return | Cmd. Vazio n Cmd. Atribuição → Variável = Expressão ; n Cmd. Vazio → ; As descrições de Cmd. Condicional, Cmd. Repetivo e outros serão vistas oportunamente

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4. 2 – Comandos condicionais 4. 3 – Expressões condicionais 4. 4 – Comandos repetitivos 4. 5 – Comandos de escape 4. 6 – Comandos de seleção 4. 7 – Introdução à metodologia top-down

4. 2 – Comandos Condicionais 4. 2. 1 – Descrição sintática n Cmd. Condicional

4. 2 – Comandos Condicionais 4. 2. 1 – Descrição sintática n Cmd. Condicional → if ( Expressão ) Comando | if ( Expressão ) Comando else Comando

4. 2. 2 – Fluxogramas F Expressão n if ( Expressão ) Comando V

4. 2. 2 – Fluxogramas F Expressão n if ( Expressão ) Comando V Comandos n if ( Expressão ) Comando else Comando V Comando Expressão F Comando

4. 2. 3 – Ambiguidade n O seguinte esqueleto tem dupla interpretação: if (

4. 2. 3 – Ambiguidade n O seguinte esqueleto tem dupla interpretação: if ( Expr 1 ) if (Expr 2) Comando else Comando A qual dos dois if’s corresponde o else?

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 O

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 O else corresponde ao 1º if Fluxogramas alternativos F Expr 1 V V Expr 2 F V F F Expr 2 Cmd 2 V Cmd 1 O else corresponde ao 2º if Cmd 2 Cmd 1

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 Regra

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 Regra desambiguificadora: F Expr 1 V V Cmd 1 Expr 2 F Cmd 2 O ‘else’ deve corresponder ao último ‘if’ if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 Para

if ( Expr 1 ) if (Expr 2) Cmd 1 else Cmd 2 Para que o ‘else’ corresponda ao primeiro ‘if’: Expr 1 if (Expr 1) { if (Expr 2) Cmd 1 } else Cmd 2 F V F Expr 2 Cmd 2 V Cmd 1

Exercícios 4. 2: 1. Fazer um programa que ao ler a quantidade de segundos

Exercícios 4. 2: 1. Fazer um programa que ao ler a quantidade de segundos de um dia, apresente o resultado na forma hh: mm: ss. Por exemplo, para 34247 s deve ser impresso 09: 30: 47. Deve haver uma mensagem de erro caso a quantidade de segundos seja maior que aqueles correspondentes às 24 horas do dia.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4. 2 – Comandos condicionais 4. 3 – Expressões condicionais 4. 4 – Comandos repetitivos 4. 5 – Comandos de escape 4. 6 – Comandos de seleção 4. 7 – Introdução à metodologia top-down

4. 3 – Expressões Condicionais n São expressões especiais da Linguagem C n Forma:

4. 3 – Expressões Condicionais n São expressões especiais da Linguagem C n Forma: Expr 1 ? Expr 2 : Expr 3 n Calcula-se Expr 1 n Se Expr 1 ≠ 0 (True), calcula-se o valor de Expr 2, que será o valor da expressão condicional n Se Expr 1 = 0 (False), calcula-se o valor de Expr 3, que será o valor da expressão condicional

Exemplo: seja o programa: #include <stdio. h> #include <stdlib. h> int main () {

Exemplo: seja o programa: #include <stdio. h> #include <stdlib. h> int main () { int a, b, x; a = 2; b = 3; x = a > b ? a + b : b - a; printf ("a = %d; b = %d; x = %d; ", a, b, x); printf ("nn"); system ("pause"); return 0; } Resultado: a = 2; b = 3; x = 1; Pressione. . .

n Alguns comandos if-else simples podem ser substituídos por expressões condicionais a = 2;

n Alguns comandos if-else simples podem ser substituídos por expressões condicionais a = 2; b = 3; a > b ? (a = 5, b = 15) : (a = 50, b = 100); printf ("a = %d; b = %d; n", a, b); a = 2; b = 3; if (a > b) {a = 5; b = 15; } else {a = 50; b = 100; } printf ("a = %d; b = %d; n", a, b); Trechos equivalentes

Exercícios 4. 3: 1. Sabe-se que a operação matemática min (x, y) pode ser

Exercícios 4. 3: 1. Sabe-se que a operação matemática min (x, y) pode ser implementada pela seguinte expressão condicional: (x < y) ? x : y De modo similar, usando somente expressões condicionais, implementar as seguintes operações matemáticas: min (x, y, z) e max (x, y, z, w)

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4. 2 – Comandos condicionais 4. 3 – Expressões condicionais 4. 4 – Comandos repetitivos 4. 5 – Comandos de escape 4. 6 – Comandos de seleção 4. 7 – Introdução à metodologia top-down

4. 4 – Comandos Repetitivos 4. 4. 1 – Descrição sintática n Cmd. Repetitivo

4. 4 – Comandos Repetitivos 4. 4. 1 – Descrição sintática n Cmd. Repetitivo → Cmd. While | Cmd. Do. While | Cmd. For n Cmd. While → while ( Expressão ) Comando n Cmd. Do. While → do Comando while ( Expressão ) ; n Cmd. For: visto mais adiante

4. 4. 2 – Comandos while e do-while n while ( Expressão ) Comando

4. 4. 2 – Comandos while e do-while n while ( Expressão ) Comando F Expressão V Comando n do Comando while ( Expressão ) ; Comando V Expressão F

4. 4. 3 – Comando for Sejam os seguintes comandos: Eles podem ser escritos

4. 4. 3 – Comando for Sejam os seguintes comandos: Eles podem ser escritos usando-se o comando for: int n, i, soma; scanf (“%d”, &n); i = 1; soma = 0; while (i <= n) { scanf (“%d”, &num); soma += num; i++; } printf (“soma = %d”, soma) ; scanf (“%d”, &n); for (i = 1, soma = 0; i <= n; i++) { scanf (“%d”, &num); soma += num; } ou: for (scanf (“%d”, &n), i = 1, soma = 0; i <= n; soma += num, i++) scanf (“%d”, &num);

4. 4. 3 – Comando for Sejam os seguintes comandos: int n, i, soma;

4. 4. 3 – Comando for Sejam os seguintes comandos: int n, i, soma; scanf (“%d”, &n); i = 1; soma = 0; while (i <= n) { scanf (“%d”, &num); soma += num; i++; } printf (“soma = %d”, soma) ; Ou for (scanf (“%d”, &n), i = 1, soma = 0; i <= n; scanf (“%d”, &num), soma += num, i++) ; Ou até: scanf (“%d”, &n); i = 1; soma = 0; for ( ; i <= n ; ) { scanf (“%d”, &num); soma += num; i++; }

Descrição sintática do comando for: n Cmd. For → for ( Inicializações ; Expressão

Descrição sintática do comando for: n Cmd. For → for ( Inicializações ; Expressão ; Atualizações ) Comando n Inicializações e Atualizações: - Listas de zero ou mais Cmd. Atribuição’s, Cmd. Entrada’s, Cmd. Saída’s ou Chamada. Função’s - Separados por vírgula e não por ponto e vírgula Inicializações while ( Expressão ) { n O Cmd. For acima equivale a Comando Atualizações }

Fluxograma do comando for: n for ( Inicializações ; Expressão ; Atualizações ) Comando

Fluxograma do comando for: n for ( Inicializações ; Expressão ; Atualizações ) Comando

#include <stdio. h> Exemplo: uso do “for” no programa da soma da PA #include

#include <stdio. h> Exemplo: uso do “for” no programa da soma da PA #include <stdlib. h> int main () { Seja o programa já visto int a 1, r, n, soma, aq, i; printf (“PROGRESSAO ARITMETICA”); com “while” printf (“nnt. Digite o primeiro termo, o n. o de termos e a razao: ”); scanf (“%d%d%d”, &a 1, &n, &r); soma = 0; aq = a 1; i = 1; O trecho em amarelo while (i <= n) { pode usar o comando for soma += aq; aq += r; i++; } printf (“n. Progressao aritmetica: nn. Primeiro termo: %d”, a 1); printf (“n. Razao: %dn. Numero de termos: %d”, r, n); printf (“nn. Soma: %d”, soma); printf (“nn”); system (“pause”); return 0;

#include <stdio. h> #include <stdlib. h> int main () { int a 1, r,

#include <stdio. h> #include <stdlib. h> int main () { int a 1, r, n, soma, aq, i; printf ("PROGRESSAO ARITMETICA"); printf ("nnt. Digite o primeiro termo, o n. o de termos e a razao: "); scanf ("%d%d%d", &a 1, &n, &r); for (soma = 0, aq = a 1, i = 1; i <= n; i++) { soma += aq; aq += r; } printf ("n. Progressao aritmetica: nn. Primeiro termo: %d", a 1); printf ("n. Razao: %dn. Numero de termos: %d", r, n); printf ("nn. Soma: %d", soma); printf ("nn"); system ("pause"); return 0; O trecho marcado ainda pode ser substituído por: } for (scanf ("%d%d%d", &a 1, &n, &r), soma = 0, aq = a 1, i = 1; i <= n; soma += aq, aq += r, i++); (o escopo do for ficou vazio)

Exemplo: cálculo do MDC de vários pares de nos lidos n Método: ilustrado com

Exemplo: cálculo do MDC de vários pares de nos lidos n Método: ilustrado com o cálculo de MDC(-48, 64) Para números negativos, toma-se o módulo; então MDC(-48, 64) = MDC(48, 64) a 48 64 48 16 16 b 64 48 16 0 a%b 48 16 0

a = abs(a); b = abs(b); while (b > 0) { resto = a

a = abs(a); b = abs(b); while (b > 0) { resto = a % b; a = b; b = resto; } printf ("MDC: %d", a); MDC(-48, 64) = MDC(48, 64) a 48 64 48 16 b 64 48 16 0 a%b 48 16 0

#include <stdio. h> #include <stdlib. h> Esqueleto para #include <math. h> vários pares de

#include <stdio. h> #include <stdlib. h> Esqueleto para #include <math. h> vários pares de int main () { números int a, b, resto; char c, lixo; printf ("Calculo de MDC ? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nn. Par de numeros: "); scanf("%d%d%c", &a, &b, &lixo); Calculo do MDC e sua escrita; printf ("Calculo de MDC ? (s/n) "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; } Substitui-se a frase em amarelo pelo trecho já estabelecido anteriormente

#include <stdio. h> #include <stdlib. h> Usando a #include <math. h> seguir o int

#include <stdio. h> #include <stdlib. h> Usando a #include <math. h> seguir o int main () { comando for int a, b, resto; char c, lixo; printf ("Calculo de MDC ? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nn. Par de numeros: "); scanf("%d%d%c", &a, &b, &lixo); a = abs(a); b = abs(b); while (b > 0) { resto = a % b; a = b; b = resto; } printf ("MDC: %d", a); printf ("Calculo de MDC ? (s/n) "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; }

#include <stdio. h> #include <stdlib. h> #include <math. h> int main () { int

#include <stdio. h> #include <stdlib. h> #include <math. h> int main () { int a, b, resto; char c, lixo; printf ("Calculo de MDC ? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nn. Par de numeros: "); scanf("%d%d%c", &a, &b, &lixo); for (a = abs(a), b = abs(b); b > 0; b = resto) { resto = a % b; a = b; } printf ("MDC: %d", a); printf ("Calculo de MDC ? (s/n) "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; }

Exemplo: inversão dos dígitos de um no inteiro num aux n Método: ilustrado com

Exemplo: inversão dos dígitos de um no inteiro num aux n Método: ilustrado com a inversão do número 48728 10 48728 para 82784 8 inv 0 4872 10 2 487 10 7 48 10 8 4 10 4 0 aux * 10 + 8 8 * 10 + 2 82 aux = num; inv = 0; while (aux != 0) { inv = 10 * inv + aux % 10; aux = aux/10; } * 10 + 7 827 * 10 + 8 8278 inv * 10 + 4 82784

#include <stdio. h> #include <stdlib. h> Esqueleto para int main () { vários números

#include <stdio. h> #include <stdlib. h> Esqueleto para int main () { vários números int num, aux, inv; char c, lixo; printf ("Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nnt. Numero: "); scanf("%d%c", &num, &lixo); Obter o inverso de num; printf ("nt%d invertido torna-se %d", num, inv); printf ("nn. Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; } Substitui-se a frase em amarelo pelo trecho já estabelecido anteriormente

#include <stdio. h> #include <stdlib. h> Usando a int main () { seguir o

#include <stdio. h> #include <stdlib. h> Usando a int main () { seguir o int num, aux, inv; char c, lixo; comando for printf ("Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nnt. Numero: "); scanf("%d%c", &num, &lixo); aux = num; inv = 0; while (aux != 0) { inv = 10 * inv + aux % 10; aux = aux/10; } printf ("nt%d invertido torna-se %d", num, inv); printf ("nn. Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; }

#include <stdio. h> #include <stdlib. h> int main () { int num, aux, inv;

#include <stdio. h> #include <stdlib. h> int main () { int num, aux, inv; char c, lixo; printf ("Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); while (c == 's') { printf ("nnt. Numero: "); scanf("%d%c", &num, &lixo); for (aux = num, inv = 0; aux != 0; aux = aux/10) inv = 10 * inv + aux % 10; printf ("nt%d invertido torna-se %d", num, inv); printf ("nn. Inverter numero? (s/n): "); do scanf ("%c", &c); while (c != 's' && c != 'n'); } printf ("nn"); system ("pause"); return 0; }

Exercícios 4. 4: 1. Considerando o programa da figura do próximo slide: a) Determinar

Exercícios 4. 4: 1. Considerando o programa da figura do próximo slide: a) Determinar qual será a sua saída, se a entrada for 1325 b) Trocar o comando “for” desse programa por um trecho equivalente contendo um comando “while”, sem alterar a funcionalidade do programa c) Trocar o comando “do-while” desse programa por um trecho equivalente contendo um comando “while”, sem alterar a funcionalidade do programa

#include <stdio> int main () { long a, b, c, d, e, f, g;

#include <stdio> int main () { long a, b, c, d, e, f, g; scanf("%d", &a); b = 0; g = 0; do { f = a / 10; e = a; for (c=0, d=0; d<10; d=d+1, e=e-f) {c = c + b; } b = e + c; a = f; g = g + e; printf("%dt%dn", e, g); } while (a != 0); printf("%dn", b); printf ("nn"); system ("pause"); return 0; }

2. Seja a equação Ax + By + Cz + D = 0, onde

2. Seja a equação Ax + By + Cz + D = 0, onde A, B, C e D são números inteiros. Fazer um programa para encontrar todas as soluções inteiras [x, y, z] dessa equação, que obedecem às restrições 0 x n, 0 y n e 0 z n, onde n é inteiro e n > 0. O programa deve ter um aninhamento de menor número possível de comandos repetitivos. Os valores de A, B, C, D e de n devem ser digitados durante a execução. 3. Palíndromo é um número tal que, invertendo-se a ordem de seus dígitos, o número obtido é igual ao original. Escrever um programa para ler vários números inteiros e verificar se cada um é palíndromo

4. Escrever um programa para ler vários números inteiros e dizer se cada um

4. Escrever um programa para ler vários números inteiros e dizer se cada um é primo 5. Escrever um programa em C para ler um número inteiro, positivo e guardá-lo na variável n e depois, calcular e imprimir o valor do seguinte somatório: 6. Fazer um programa para calcular o seno e o cosseno de vários ângulos dados em graus, usando séries de Mac. Laurin. Quando um ângulo é dado em radianos as Séries de Mac. Laurin são:

7. Um distribuidor de brinquedos fez um acordo de compra de vários brinquedos pequenos,

7. Um distribuidor de brinquedos fez um acordo de compra de vários brinquedos pequenos, embalados em caixas de formato de paralelepípedo de tamanhos variados. Ele pretende colocar essas caixas em embalagens esféricas de plástico, coloridas, e revendê-las como pacotes surpresa. As esferas são fornecidas em 4 diâmetros internos diferentes: 10, 15, 20 e 25 centímetros. Para pedir as esferas, ele precisa saber quantas de cada diâmetro ele necessita. Para dimensioná-las, ele precisa determinar a maior medida de cada caixa, que é a sua diagonal, usando as dimensões de cada caixa (comprimento, largura e altura). Fazer um programa para ler o número de brinquedos e as dimensões de cada caixa, determinar e imprimir o número de esferas de cada tamanho necessárias para embalar as caixas de brinquedos, bem como o número de caixas que não cabem na esfera de maior dimensão. Observação: uma caixa que cabe numa esfera de tamanho x

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4.

Capítulo IV – Comandos de Controle de Fluxo 4. 1 – Comandos compostos 4. 2 – Comandos condicionais 4. 3 – Expressões condicionais 4. 4 – Comandos repetitivos 4. 5 – Comandos de escape 4. 6 – Comandos de seleção 4. 7 – Introdução à metodologia top-down

4. 5 – Comandos de Escape 4. 5. 1 – Descrição sintática n Cmd.

4. 5 – Comandos de Escape 4. 5. 1 – Descrição sintática n Cmd. Escape → Cmd. Goto | Cmd. Break | Cmd. Continue n Cmd. Goto → goto Rótulo ; n Cmd. Break → break ; n Cmd. Continue → continue ;

4. 5. 2 – Comando goto Rótulo ; n É um desvio incondicional para

4. 5. 2 – Comando goto Rótulo ; n É um desvio incondicional para um comando rotulado n Exemplo: i = 0; scanf (“%d”, &n); Rot 1: n--; if (i > n) goto Rot 2; else { i++; goto Rot 1; } Rot 2: printf (“i = %d; n = %d; ”, i, n); Quando usado sem critério, o comando goto desestrutura muito os programas Rótulos e goto não serão usados em CES -10

4. 5. 3 – Comando break ; n É uma saída anormal de um

4. 5. 3 – Comando break ; n É uma saída anormal de um comando repetitivo ou de seleção mais interno n Exemplo: O comando break só será usado em CES 10 para cooperar na boa estruturação dos comando de seleção (switch-case – Tópico 4. 6)

4. 5. 4 – Comando continue ; n Encerra a repetição corrente e inicia

4. 5. 4 – Comando continue ; n Encerra a repetição corrente e inicia a repetição seguinte n Exemplo: trechos equivalentes: for (Expr 1; Expr 2; Expr 3) { Comandos 1 if (. . . ) continue; Comandos 2 } O comando continue não será usado em CES-10 Expr 1; while (Expr 2) { Comandos 1 if (. . . ) goto next; Comandos 2 next: Expr 3; }

Exercícios 4. 5: 1. Reescrever os dois trechos de programa a seguir, eliminando e

Exercícios 4. 5: 1. Reescrever os dois trechos de programa a seguir, eliminando e evitando o uso dos comandos break, continue e goto: scanf (“%c%c”, &c, &lixo); cont = contdig = 0; while (c) { if (c == ‘E’) break; cont++; if (c >= ‘ 0’ && c <= ‘ 9’) contdig++; scanf (“%c%c”, &c, &lixo); } i = -5; n = 50; while (i < n) { i++; if (i == 0) continue; total += i; printf (“i = %d; total = %dn”, i, total); }