Post on 27-Jun-2022
Comando iterativo for
INF01202
Prof. Lucas Mello Schnorr
1 / 35
Sumário
Laços iterativos (loops)
I Motivação com exemplos
I O comando for
I Estudos de caso
2 / 35
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
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
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
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
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
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
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
Plano da semana
9
Comandos iterativos
• para ...
• enquanto
• faça ... enquanto...
Cortesia: Prof. Mara Abel
10 / 35
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
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
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
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
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
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
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
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
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
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
Tabela ASCII (mais completa)
20 / 35
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Dúvidas?
Alguma dúvida?
Hora de ver coisas o�-the-record com o comando for.
32 / 35
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
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
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