39

Comando iterativo for - INF01202

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Comando iterativo for - INF01202

Comando iterativo for

INF01202

Prof. Lucas Mello Schnorr

1 / 35

Page 2: Comando iterativo for - INF01202

Sumário

Laços iterativos (loops)

I Motivação com exemplos

I O comando for

I Estudos de caso

2 / 35

Page 3: Comando iterativo for - INF01202

Motivação com enunciado (1 aluno)

Slide 6 INF 01202

Seja o problema:

Faça um programa que leia a média de um aluno e, baseado no valor obtido, informe se o aluno está aprovado ou reprovado.

Considerar como aprovado o aluno que obtiver média ≥ 6,0.

Cortesia: Prof. Claudio Jung

3 / 35

Page 4: Comando iterativo for - INF01202

Possível solução

5

Ex: a partir da média de um aluno, informar se foi aprovado ou reprovado

Algoritmo UmConceito{ Informa se um aluno foi ou não aprovado, sendo dada a sua média }entrada: médiasaída: ‘Aprovado’ ou ‘Reprovado’1. Ler média2. Se média >= 6,0 escrever ‘Aprovado’ senão escrever ‘Reprovado’3. Terminar.

Cortesia: Prof. Mara Abel

4 / 35

Page 5: Comando iterativo for - INF01202

Motivação com enunciado (turma de 5 alunos)

Slide 9 INF 01202

Seja o problema:

Faça um programa que leia o número de chamada e a média obtida de todos os alunos de uma turma e, baseado neste valor, informe se o aluno está aprovado ou reprovado (cada um dos alunos).

Considerar como aprovado o aluno que obtiver média ≥ 6,0.

Supor uma turma de 5 alunos.

Cortesia: Prof. Claudio Jung

5 / 35

Page 6: Comando iterativo for - INF01202

Possível solução

6

Ex: a partir da média dos alunos de uma turma, informar se foram aprovados ou reprovadosAlgoritmo AprovadoReprovado

{ Informa se os alunos foram ou não aprovados, sendo dadas suas médias } { supor 5 alunos na turma }entrada: n1, n2, n3, n4, n5, med1, med2, med3, med4, med5 {numeros/médias}saída: para cada aluno, numero e ‘Aprovado’ ou ‘Reprovado’1. Ler n1, med1, n2, med2, n3, med3, n4, med4, n5, med52. Se med1 >= 6,0 escrever n1, ‘Aprovado’ senão escrever n1, ‘Reprovado’4. Se med2 >= 6,0 escrever n2, ‘Aprovado’ senão escrever n2, ‘Reprovado’6. Se med3 >= 6,0 escrever n3, ‘Aprovado’ senão escrever n3, ‘Reprovado’8. Se med4 >= 6,0 escrever n4, ‘Aprovado’ senão escrever n4, ‘Reprovado’10. Se med5 >= 6,0 escrever n5, ‘Aprovado’ senão escrever n5, ‘Reprovado’11. Terminar.

Cortesia: Prof. Mara Abel

6 / 35

Page 7: Comando iterativo for - INF01202

Uma versão melhorada com menos variáveis

25 INF 01202 - Prof. Edison – Aula 07

Algoritmo AprovadoReprovado /* Informa se os 5 alunos foram ou não aprovados, a partir de suas médias*/ entrada: numero, media //números/médias saída: para cada aluno, numero e ‘Aprovado’ ou ‘Reprovado’ 1. início 2. ler numero, media // lê o que vai ser processado 3. se media >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’ 4. ler numero, media 5. se media >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’ 6. ler numero, media 7. se media >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’ 8. ler numero, media 9. se media >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’ 10. ler numero, media 11. se media >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’ 12. fim

Algoritmo para a Solução do Problema – 2 variáveis

Cortesia: Prof. Edison Pignaton de Freitas

7 / 35

Page 8: Comando iterativo for - INF01202

Uma versão ainda melhor, com menos código!

8

Algoritmo AprovadoReprovadoentradas : numeros, médiassaídas: para cada aluno, numero e ‘Aprovado’ ou ‘Reprovado’

1. Repetir 5 vezes:

1.1 Ler numero, média 1.2. Se média >= 6,0 escrever numero, ‘Aprovado’ senão escrever numero, ‘Reprovado’

2. Terminar.

Estruturas de repetição

Cortesia: Prof. Mara Abel

8 / 35

Page 9: Comando iterativo for - INF01202

Repetir, repetir, repetir, . . . (aka laços de repetição)

27 INF 01202 - Prof. Edison – Aula 07

Objetivo: repetir comando (ou bloco de comandos) um número finito de vezes

Controle da repetição contagem:

• repetir um determinado número de vezes

teste: • repetir enquanto uma condição não for atingida • repetir até uma condição ser atingida

Comandos de repetição (loop)

Cortesia: Prof. Edison Pignaton de Freitas

9 / 35

Page 10: Comando iterativo for - INF01202

Plano da semana

9

Comandos iterativos

• para ...

• enquanto

• faça ... enquanto...

Cortesia: Prof. Mara Abel

10 / 35

Page 11: Comando iterativo for - INF01202

O comando for

Slide 15 INF 01202

Comando de repetição – número fixo de vezes

condição?

inicializações

V

F

comando

incremento

for (expressão 1; expressão 2;

expressão3) comando;

C Linguagem algorítmica

para (inicialização(ões); condição; incremento(s)/decremento(s))

comando

Cortesia: Prof. Claudio Jung

11 / 35

Page 12: Comando iterativo for - INF01202

Detalhamento

Slide 16 INF 01202

expressão 1: especificação do conteúdo inicial de uma ou mais variáveis de controle; executado apenas uma vez antes da primeira execução do comando. (SEMPRE!)

expressão 2: expressão de controle do loop (execução de comando), realizado antes cada iteração e incluindo as variáveis de controle inicializadas em expressão 1 e alteradas em expressão3, que determina se comando deve ser executado (resultado de expressão 2 igual a V ou com valor diferente de zero) ou se o for deve ser concluído (resultado de expressão 2 igual a F ou zero). (COMANDO PODE NÃO SER EXECUTADO NEM UMA VEZ!)

expressão 3: incrementos/decrementos de variáveis de controle, executados após cada execução do comando (APENAS APÓS A EXECUÇÃO DE COMANDO!).

Comando for

for ( expressão 1 ; expressão 2 ; expressão3 ) comando;

Cortesia: Prof. Claudio Jung

12 / 35

Page 13: Comando iterativo for - INF01202

SintaxeTodas as expressões do comando for são opcionais.

30 INF 01202 - Prof. Edison – Aula 07

Comando for : sintaxe

for (expressão 1; expressão 2; expressão3)

{

// comando(s) a serem repetidos

}

// comandos após o for

1. A(s) inicialização(ões) definida(s) na expressão 1 é (são) executada(s); 2. A condição definida em expressão 2 é avaliada: se verdadeira:

i-comando(s) do bloco subordinado é (são) executado(s); ii-incremento(s) e/ou decremento(s) em expressão 3 é(são) executado(s); iii-retorna ao ponto (2).

se falsa: i-encerra comando for.

Observação: A avaliação da condição do comando for ocorre antes do início do trecho a ser repetido: bloco subordinado pode não ser executado nenhuma vez!

ATENÇÃO: as chaves só são

obrigatórias quando mais de um comando for controlado pelo

for (laço de repetição).

Cortesia: Prof. Edison Pignaton de Freitas

13 / 35

Page 14: Comando iterativo for - INF01202

Voltando ao alg. do exemplo motivacional � Exemplo #1alg. = algoritmo

32 INF 01202 - Prof. Edison – Aula 07

Algoritmo AprovadoReprovado

entradas : numero, media

saídas: numero e ‘Aprovado’ ou ‘Reprovado’ (para cada aluno)

1. inicio 2. para (contador = 1; contador <=5 ; contador=contador+1) 2.1 início // comando composto 2.2 ler numero, media 2.3 se media >= 6,0 2.3.1 escrever numero, ‘Aprovado’ 2.3.2 senão 2.3.2.1 escrever numero, ‘Reprovado’ 2.4 fim 3. fim.

Cabeçalho que controla a repetição

Comandos a serem repetidos

Cortesia: Prof. Edison Pignaton de Freitas

14 / 35

Page 15: Comando iterativo for - INF01202

Exemplo #1: Em C

Com comando de incremento

I Do valor 1 até menor igual que 5

// Determina se 5 alunos foram aprovados ou reprovados

#include <stdio.h>

int main() {

int contador, numaluno;

float media;

// Controle de repetição: executará 5 vezes

for(contador = 1; contador <= 5; contador++) {

// Comandos a serem repetidos

printf("Informe numero e nota do aluno %d: ", contador);

scanf("%d", &numaluno);

scanf("%f", &media);

if (media >=6)

printf("O aluno %d foi aprovado!\n", numaluno);

else

printf("O aluno %d for reprovado!\n", numaluno);

}

return 0;

}

15 / 35

Page 16: Comando iterativo for - INF01202

Exemplo #1: Em C (decremento)

Com comando de decremento

I Do valor 5 até o maior que 0

// Determina se 5 alunos foram aprovados ou reprovados

#include <stdio.h>

int main() {

int contador, numaluno;

float media;

// Controle de repetição: executará 5 vezes

for(contador = 5; contador > 0; contador--) {

// Comandos a serem repetidos

printf("Informe numero e nota do aluno %d: ", contador);

scanf("%d", &numaluno);

scanf("%f", &media);

if (media >=6)

printf("O aluno %d foi aprovado!\n", numaluno);

else

printf("O aluno %d for reprovado!\n", numaluno);

}

return 0;

}

16 / 35

Page 17: Comando iterativo for - INF01202

Exemplo #2 (enunciado)

Faça um programa que imprima, dentro de um

intervalo, todos os números pares.

Planejamento

I Entradas?I Validação da entrada

I Saídas?

I Processamento

17 / 35

Page 18: Comando iterativo for - INF01202

Exemplo #2 (enunciado)

Faça um programa que imprima, dentro de um

intervalo, todos os números pares.

Planejamento

I Entradas?I Validação da entrada

I Saídas?

I Processamento

17 / 35

Page 19: Comando iterativo for - INF01202

Exemplo #2 (código)

Perceba o incremento de 2 em 2.

// Imprime numeros pares de um intervalo dado

// garante que o primeiro nro é menor do que o segundo

#include <stdio.h>

int main() {

int val1, val2, inic, fim, controle;

printf("Informe 2 numeros naturais: ");

scanf("%d%d", &val1, &val2);

if (val1 > val2){

inic = val2; fim = val1;

}else{

inic = val1; fim = val2;

}

if (inic%2)

inic = inic + 1; // gera seq apenas com nros pares!

for ( controle = inic; controle <= fim; controle = controle+2)

printf("%d ", controle);

printf("\n");

return 0;

}

18 / 35

Page 20: Comando iterativo for - INF01202

Vocês lembram da tabela ASCII?

29 INF 01202 - Prof. Marcelo Walter – Aula 07

Tabela ASCII

Para uso no comando for com caracteres.O valor ASCII de cada caracter é utilizado nas comparações

American Standard Code for Information Interchange

Cortesia: Prof. Marcelo Walter

19 / 35

Page 21: Comando iterativo for - INF01202

Tabela ASCII (mais completa)

20 / 35

Page 22: Comando iterativo for - INF01202

Exemplo #3 (enunciado)

Faça um programa que imprima a tabela ASCII

de A até z, representando na saída o valor

em caractere e em bases octal, decimal e hexadecimal.

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

Qual o valor da variável �letra� antes no comando return 0;?

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

printf("O laço terminou. O valor da letra é:\n"

"[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

21 / 35

Page 23: Comando iterativo for - INF01202

Exemplo #3 (enunciado)

Faça um programa que imprima a tabela ASCII

de A até z, representando na saída o valor

em caractere e em bases octal, decimal e hexadecimal.

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

Qual o valor da variável �letra� antes no comando return 0;?

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

printf("O laço terminou. O valor da letra é:\n"

"[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

21 / 35

Page 24: Comando iterativo for - INF01202

Exemplo #3 (enunciado)

Faça um programa que imprima a tabela ASCII

de A até z, representando na saída o valor

em caractere e em bases octal, decimal e hexadecimal.

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

Qual o valor da variável �letra� antes no comando return 0;?

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

printf("O laço terminou. O valor da letra é:\n"

"[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

21 / 35

Page 25: Comando iterativo for - INF01202

Exemplo #3 (enunciado)

Faça um programa que imprima a tabela ASCII

de A até z, representando na saída o valor

em caractere e em bases octal, decimal e hexadecimal.

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

Qual o valor da variável �letra� antes no comando return 0;?

#include <stdio.h>

int main() {

char letra;

for (letra = 'A'; letra <= 'z'; letra++)

printf("[%c] %03o %03d %03x\n", letra, letra, letra, letra);

printf("O laço terminou. O valor da letra é:\n"

"[%c] %03o %03d %03x\n", letra, letra, letra, letra);

return 0;

}

21 / 35

Page 26: Comando iterativo for - INF01202

Variáveis de controle para o comando for

Slide 25 INF 01202

Variável (eis) de controle: tipo é usualmente int (mas pode ser char, que

está intimamemente relacionado com inteiro) pode(m) ser utilizada(s) no comando de

repetição; não deve(m) (embora possam) ser alterada(s)

no comando, seguindo apenas o incremento/decremento definido no cabeçalho do for.

Comando for : sintaxe em C

Cortesia: Prof. Claudio Jung

22 / 35

Page 27: Comando iterativo for - INF01202

Exemplo #4 (enunciado)

39 INF 01202 - Prof. Edison – Aula 07

Problema:

calcular a idade média de um grupo de pessoas.

Qual a idade média do público dos shows do U2? Ou da Maria Bethânia?

Cortesia: Prof. Edison Pignaton de Freitas

23 / 35

Page 28: Comando iterativo for - INF01202

Exemplo #4 (estratégia com acumulador)

40 INF 01202 - Prof. Edison – Aula 07

Variável acumulador

Variável que recebe um valor inicial, geralmente 0, e é incrementada periodicamente de um valor variável.

Cortesia: Prof. Edison Pignaton de Freitas

24 / 35

Page 29: Comando iterativo for - INF01202

Exemplo #4 (código)

// Calcula a idade média de 5 pessoas

# include <stdio.h>

int main () {

int soma_idades, idade, contador;

float media_idades;

soma_idades = 0; // inicializa acumulador em 0

for (contador = 1; contador <= 5; contador ++) {

printf("informe idade [%d]: ", contador); // utiliza contador

scanf ("%d", &idade);

// vai acumulando idades lidas

soma_idades = soma_idades + idade;

}

// cast, para resultado ser real

media_idades = (float) soma_idades / 5;

printf("A media das 5 idades lidas eh %.2f.\n", media_idades);

}

25 / 35

Page 30: Comando iterativo for - INF01202

Exemplo #5 (enunciado)

43 INF 01202 - Prof. Edison – Aula 07

Problema:

Calcular a idade média de um grupo de n

pessoas, onde n é conhecido, informando quantas

pessoas do grupo tem idade inferior a 18 anos

Cortesia: Prof. Edison Pignaton de Freitas

26 / 35

Page 31: Comando iterativo for - INF01202

Exemplo #5 (estratégia com contador)

44 INF 01202 - Prof. Edison – Aula 07

Variável contador

Variável que recebe um valor inicial, geralmente 0, e é periodicamente incrementada de um valor constante, geralmente 1.

Cortesia: Prof. Edison Pignaton de Freitas

27 / 35

Page 32: Comando iterativo for - INF01202

Exemplo #5 (código)

/* Calcula a idade média de 5 pessoas e conta menores de idade do grupo: */

# include <stdio.h>

int main () {

int soma_idades, idade, contador, conta_menos_de_18;

float media_idades;

soma_idades = 0; // inicializa acumulador em 0

conta_menos_de_18 = 0; // inicializa contador em 0

for (contador = 1; contador <= 5; contador ++) {

printf("informe idade [%d]: ", contador);

scanf ("%d", &idade);

if (idade < 18)

conta_menos_de_18++; // incrementa 1 no contador

// vai acumulando idades lidas

soma_idades = soma_idades + idade;

}

// cast, para resultado ser real

media_idades = (float) soma_idades/5;

printf("A media das 5 idades lidas eh %.2f.\n", media_idades);

printf("Existem %d pessoas menores de 18 anos.\n", conta_menos_de_18);

}

28 / 35

Page 33: Comando iterativo for - INF01202

Re�exão sobre valores �xos no código

47 INF 01202 - Prof. Edison – Aula 07

Nos problemas anteriores, o que temos que alterar no programa para a leitura de uma quantidade diferente de valores, ao invés de sempre 5?

Questão:

for (contador = 1; contador <= 5; contador ++) { printf("informe idade %d :", contador); scanf ("%d", &idade); if (idade < 18) conta_menos_de_18++; // incrementa 1 no contador // vai acumulando idades lidas soma_idades = soma_idades + idade; }

Iremos trocar este valor fixo por uma constante que pode ser facilmente modificada em todo o programa ao mesmo tempo

Cortesia: Prof. Edison Pignaton de Freitas

29 / 35

Page 34: Comando iterativo for - INF01202

Uso de #define (como já visto na aula sobre tipos)

49 INF 01202 - Prof. Edison – Aula 07

Declaração de constantes simbólicas com define

Sintaxe:

#define IDENTIFICADOR valor

Ação: • Na compilação, o identificador é substituído no programa pelo valor indicado.

Vantagens: • Flexibilidade de alteração de limites • Segurança contra enganos de digitação de valores

Importante: Recomenda-se fortemente escrever o identificador em MAIÚSCULAS!

ATENÇÃO: entre identificador e valor não colocar nada além de espaços !

Sintaxe:

#define IDENTIFICADOR valor

Exemplo:

#define NRALUNOS 10

Cortesia: Prof. Edison Pignaton de Freitas

30 / 35

Page 35: Comando iterativo for - INF01202

Exemplo #6 (código)

// Calcula a idade média de NUMPESSOAS pessoas

#include <stdio.h>

#define NUMPESSOAS 5

int main () {

int soma_idades, idade, contador;

float media_idades;

soma_idades = 0; // inicializa acumulador em 0

for (contador = 1; contador <= NUMPESSOAS; contador ++) {

printf("informe idade [%d]: ", contador); // utiliza contador

scanf ("%d", &idade);

// vai acumulando idades lidas

soma_idades = soma_idades + idade;

}

// cast, para resultado ser real

media_idades = (float) soma_idades / NUMPESSOAS;

printf("A media das %d idades lidas eh %.2f.\n", NUMPESSOAS, media_idades);

}

31 / 35

Page 36: Comando iterativo for - INF01202

Dúvidas?

Alguma dúvida?

Hora de ver coisas o�-the-record com o comando for.

32 / 35

Page 37: Comando iterativo for - INF01202

Exercício #1 (Fatorial)

53 INF 01202 - Prof. Edison – Aula 07

Exercício

• Utilizando o comando iterativo for, faça um algoritmo / programa em C que calcule o fatorial de um número inteiro positivo informado.

• Cálculo do Fatorial de um número: 0! = 1 n! = n x (n-1) x (n-2) x ... x 2 x 1

n! = n x (n-1)!, para n > 0

Cortesia: Prof. Edison Pignaton de Freitas

33 / 35

Page 38: Comando iterativo for - INF01202

Exercício #2 (Fibonacci)

Seja o problema:

Faça um algoritmo e o programa em C

correspondente que leia um valor inteiro e informe o número equivalente de termos da Série de Fibonacci.

30

Cortesia: Prof. Mara Abel

34 / 35

Page 39: Comando iterativo for - INF01202

Exercício #2 (Entendendo Fibonacci e Estratégia)

Sugestão de video

https://www.youtube.com/watch?v=eVbOxWVC_GY

Usar o comando for

35 / 35