
AULA 26
Lógica e Linguagem de Programação
Laços de repetição
while, do-while e for: do Portugol Studio para C.
for (int i = 1; i <= 5; i++)
Prof. Vitor Hugo LopesCST em Sistemas para Internet · IFRS Campus Porto Alegre
00—Abertura
Repetir sem copiar e colar
contar.cC
printf("1\n");
printf("2\n");
printf("3\n");
printf("4\n");
printf("5\n");
Funciona para contar até 5.
E até 1000? E até um número que a pessoa digita?
Um laço de repetição executa o mesmo bloco várias vezes, enquanto uma condição for verdadeira.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS02 / 39
00—Abertura
O caminho de hoje
1ler texto
2as partes de um laço
3while
4do-while
5for
6qual laço usar
7contadores e acumuladores
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS03 / 39
01—Lendo texto
Texto em C: uma cadeia de caracteres
char nome[30];
Cada caixa guarda um char.
\0 marca o fim do texto. O C coloca sozinho.
[30] é o espaço total, contando o \0.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS04 / 39
01—Lendo texto
Lendo uma palavra
char nome[30];
printf("Seu nome: ");
scanf("%s", nome);
printf("Olá, %s!\n", nome);
execução
Seu nome: Ana
Olá, Ana!
execução
Seu nome: Ana Paula
Olá, Ana!
Formato %s e sem &: o nome do vetor já é o endereço.
O scanf para no primeiro espaço: só uma palavra.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS05 / 39
01—Lendo texto
Lendo uma frase inteira com fgets
char frase[100];
printf("Uma frase: ");
fgets(frase, 100, stdin);
printf("Você digitou: %s", frase);
execução
Uma frase: Hoje tem laço
Você digitou: Hoje tem laço
fgets(frase, 100, stdin);onde guardar · tamanho máximo · teclado
O fgets lê os espaços e guarda também o Enter no fim do texto. Por isso o último printf não precisa de \n.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS06 / 39
01—Lendo texto
Sua vez
Leia o nome de um filme (pode ter espaços) e mostre: Filme escolhido: ...
✓char filme[100];
✓fgets
✓%s no printf
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS07 / 39
02—Por que repetir
Todo laço tem quatro partes
O início acontece uma vez só.
Depois, a cada volta: testa a condição, executa o corpo e atualiza.
Quando a condição fica falsa, o laço termina.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS08 / 39
02—Por que repetir
O que vocês já sabem
faca-enquanto
faca {
...
} enquanto (i <= 5)
para
para (inteiro i = 1;
i <= 5; i++) {
...
}
Os três existem em C, com a mesma lógica.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS09 / 39
03—while
De enquanto para while
contar.porPortugol Studio
inteiro i = 1
enquanto (i <= 5) {
escreva(i, "\n")
i++
}
contar.cC
int i = 1;
while (i <= 5) {
printf("%d\n", i);
i++;
}
enquanto virou while. Como sempre em C: tipo int, printf com formato e ; no fim das instruções.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS10 / 39
03—while
Como o while executa
A condição é testada antes de cada volta.
Se ela já começa falsa, o corpo não executa nenhuma vez.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS11 / 39
03—while
Teste de mesa: volta a volta
int i = 1;
while (i <= 5) {
printf("%d\n", i);
i++;
}
Depois do laço, i vale 6: foi o valor que deixou a condição falsa.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS12 / 39
03—while
Esqueceu de atualizar?
int i = 1;
while (i <= 5) {
printf("%d\n", i);
}
não para nunca
1
1
1
1
1
...
Sem i++, i continua valendo 1 e a condição nunca fica falsa: é um laço infinito. Para interromper no terminal, use Ctrl + C.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS13 / 39
03—while
Lendo até um valor de parada
int numero;
int soma = 0;
printf("Número (0 para parar): ");
scanf("%d", &numero);
while (numero != 0) {
soma = soma + numero;
printf("Número (0 para parar): ");
scanf("%d", &numero);
}
printf("Soma: %d\n", soma);
execução
Número (0 para parar): 5
Número (0 para parar): 3
Número (0 para parar): 10
Número (0 para parar): 0
Soma: 18
Aqui não sabemos quantas vezes o laço vai rodar: depende do que a pessoa digita. O 0 é o valor de parada.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS14 / 39
03—while
Sua vez
Com while, faça uma contagem regressiva de 10 até 1, um número por linha. No fim, mostre Fogo!
✓começa em 10
✓condição com >=
✓i-- no corpo
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS15 / 39
04—do-while
De faca-enquanto para do-while
contar.porPortugol Studio
inteiro i = 1
faca {
escreva(i, "\n")
i++
} enquanto (i <= 5)
contar.cC
int i = 1;
do {
printf("%d\n", i);
i++;
} while (i <= 5);
faca virou do e enquanto virou while. Repare no ; depois do while (...).
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS16 / 39
04—do-while
Testa antes × testa depois
do-while
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS17 / 39
04—do-while
Pelo menos uma vez
int x = 10;
while (x < 5) {
printf("while: %d\n", x);
}
int x = 10;
do {
printf("do-while: %d\n", x);
} while (x < 5);
A condição x < 5 é falsa desde o começo. O while nem entra; o do-while executa o corpo uma vez antes de testar.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS18 / 39
04—do-while
Uso típico: validar o que foi digitado
float nota;
do {
printf("Nota (0 a 10): ");
scanf("%f", ¬a);
} while (nota < 0 || nota > 10);
printf("Nota registrada: %.1f\n", nota);
execução
Nota (0 a 10): 12
Nota (0 a 10): -1
Nota (0 a 10): 8.5
Nota registrada: 8.5
Precisamos perguntar pelo menos uma vez, e repetimos enquanto a nota for inválida.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS19 / 39
04—do-while
O ; do do-while
error: expected ';' after do/while statement
No do-while, o while (...) fica no fim e encerra a instrução: precisa de ;. No while comum, não se coloca ; depois da condição.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS20 / 39
04—do-while
Sua vez
Com do-while, peça uma senha numérica até a pessoa digitar 1234. No fim, mostre quantas tentativas foram feitas.
✓int senha;
✓um contador de tentativas
✓while (senha != 1234);
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS21 / 39
05—for
De para para for
contar.porPortugol Studio
para (inteiro i = 1; i <= 5; i++) {
escreva(i, "\n")
}
contar.cC
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}
para virou for e inteiro virou int. As três partes entre parênteses continuam separadas por ;.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS22 / 39
05—for
As três partes do for
for (int i = 1; i <= 5; i++)
1int i = 1
início: executa uma vez, antes de tudo
2i <= 5
condição: testada antes de cada volta
3i++
atualização: executa depois de cada volta
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS23 / 39
05—for
O for é um while organizado
com whileC
int i = 1;1
while (i <= 5) {2
printf("%d\n", i);
i++;3
}
=
com forC
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}
As mesmas partes: ① início, ② condição e ③ atualização. No for, elas ficam juntas na primeira linha, e fica mais difícil esquecer a atualização.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS24 / 39
05—for
Contando de outros jeitos
para trás
for (int i = 10; i >= 1; i--) {
printf("%d ", i);
}
saída
10 9 8 7 6 5 4 3 2 1
de 2 em 2
for (int i = 0; i <= 10; i += 2) {
printf("%d ", i);
}
Mudando o início, a condição e a atualização, o mesmo for conta como quisermos.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS25 / 39
05—for
Atalhos que aparecem nos laços
Atalho
Equivale a
Uso comum
i++
i = i + 1
contar para frente
i--
i = i - 1
contar para trás
i += 2
i = i + 2
pular de 2 em 2
soma += x
soma = soma + x
acumular valores
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS26 / 39
05—for
Acumulando: a soma de 1 a 100
int soma = 0;
for (int i = 1; i <= 100; i++) {
soma += i;
}
printf("Soma de 1 a 100: %d\n", soma);
Qual valor aparece?
saída
Soma de 1 a 100: 5050
Um acumulador começa em 0, fora do laço, e recebe um valor a mais em cada volta.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS27 / 39
05—for
Quantas vezes executa?
for (int i = 0; i < 10; i++)
for (int i = 0; i <= 10; i++)
for (int i = 1; i <= 10; i++)
Errar por uma volta é o erro mais comum com for. Confira o primeiro e o último valor de i.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS28 / 39
05—for
O ; que esvazia o laço
for (int i = 1; i <= 3; i++); {
printf("Olá\n");
}
warning: for loop has empty body
O ; encerra o for ali mesmo: o laço repete nada três vezes e o bloco executa uma vez só. É a mesma armadilha do if.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS29 / 39
05—for
Sua vez
Leia um número inteiro e mostre a tabuada dele de 1 a 10, no formato 7 x 3 = 21.
✓for de 1 a 10
✓n * i
✓três %d no printf
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS30 / 39
06—Qual laço usar
Qual laço usar?
for
sei quantas vezes vai repetir
tabuada, contar de 1 a 100
while
depende de uma condição, que pode já começar falsa
ler até digitar 0
do-while
precisa executar pelo menos uma vez
validar o que foi digitado
Qualquer um dos três resolve qualquer repetição. A escolha certa deixa o código mais fácil de ler.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS31 / 39
06—Qual laço usar
A mesma tarefa nos três laços
whileC
int i = 1;
while (i <= 3) {
printf("%d\n", i);
i++;
}
do-whileC
int i = 1;
do {
printf("%d\n", i);
i++;
} while (i <= 3);
forC
for (int i = 1; i <= 3; i++) {
printf("%d\n", i);
}
O for é o mais curto quando sabemos o número de voltas.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS32 / 39
07—Padrões com laços
Contador: quantos pares de 1 a 20?
int pares = 0;
for (int i = 1; i <= 20; i++) {
if (i % 2 == 0) {
pares++;
}
}
printf("Pares: %d\n", pares);
Laço e decisão juntos: o if fica dentro do for.
Um contador começa em 0 e soma 1 (pares++) cada vez que algo acontece.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS33 / 39
07—Padrões com laços
Média com valor de parada
float nota;
float soma = 0;
int quantidade = 0;
printf("Nota (-1 para encerrar): ");
scanf("%f", ¬a);
while (nota != -1) {
soma += nota;
quantidade++;
printf("Nota (-1 para encerrar): ");
scanf("%f", ¬a);
}
if (quantidade > 0) {
printf("Média: %.1f\n", soma / quantidade);
}
execução
Nota (-1 para encerrar): 7
Nota (-1 para encerrar): 8.5
Nota (-1 para encerrar): 6
Nota (-1 para encerrar): -1
Média: 7.2
Acumulador (soma) e contador (quantidade) no mesmo laço. O if evita dividir por zero quando nenhuma nota é digitada.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS34 / 39
07—Padrões com laços
Sua vez
Com for, leia 5 números inteiros. No fim, mostre quantos foram positivos e a soma de todos.
✓um contador
✓um acumulador
✓if dentro do for
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS35 / 39
08—Fechamento
Cinco perguntas rápidas
1Qual laço executa o corpo pelo menos uma vez?
2O que acontece se o i++ for esquecido num while?
3Quantas vezes executa for (int i = 1; i < 5; i++)?
4Onde um acumulador deve começar valendo 0?
5Em qual laço o while (...) termina com ;?
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS36 / 39
08—Fechamento
O mapa da tradução
Portugol Studio
C
enquanto (cond) { }
while (cond) { }
faca { } enquanto (cond)
do { } while (cond);
para (inteiro i = 1; ...)
for (int i = 1; ...)
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS37 / 39
08—Fechamento
Resumo
todo laço tem início, condição, corpo e atualização;
while testa antes; do-while testa depois;
for junta as três partes numa linha só;
contadores e acumuladores começam fora do laço;
a lógica é a mesma do Portugol Studio.
LÓGICA E LINGUAGEM DE PROGRAMAÇÃO · CST EM SISTEMAS PARA INTERNET · IFRS38 / 39


Obrigado
Dúvidas, críticas, sugestões?
vitor.silva@poa.ifrs.edu.br