Escolar Documentos
Profissional Documentos
Cultura Documentos
Ciclos
Pedro Vasconcelos, DCC/FCUP
Outubro 2019
Ciclos
Um ciclo é uma instrução que executa várias vezes outras instruções (o corpo do ciclo)
Os ciclos em C são controlados por uma expressão
A expressão é avaliada a cada iteração
se o seu valor for zero o ciclo termina
se for diferente de zero, o ciclo continua
Instruções de ciclos
while
é usado para ciclos em que a expressão é testada antes de executar o corpo do ciclo
do...while
for
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 1/17
16/10/23, 12:48 Ciclos
Instrução while
while ( expressão ) instrução
Execução:
i = 1;
while (i < 10) /* expressão de controlo */
i = i * 2; /* corpo do ciclo */
i = 1;
i = i * 2 = 2
i = i * 2 = 4
i = i * 2 = 8
i = i * 2 = 16
No final: i = 16.
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 2/17
16/10/23, 12:48 Ciclos
Instrução while
O corpo pode ser um bloco de instruções em vez de uma só:
i = 1;
while (i < 10) {
printf("%d\n", i);
i = i * 2;
}
i = 1;
while (i < 10) {
i = i * 2;
}
Terminação
O ciclo while termina quando o valor da expressão for 0 (falso)
e.g., se a expressão for i < 10 então o ciclo termina quando i ≥ 10
while (1) {
... /* ciclo infinito */
}
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 3/17
16/10/23, 12:48 Ciclos
Exemplo 1
Um programa para imprimir uma tabela de quadrados
O utilizador introduz o limite superior
Limite superior: 5
1 1
2 4
3 9
4 16
5 25
/*
quadrados.c
Imprimir uma tabela de quadrados
*/
#include <stdio.h>
int main(void) {
int i, n;
Exemplo 2
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 4/17
16/10/23, 12:48 Ciclos
/*
somar.c
Somar uma sequência de números
*/
#include <stdio.h>
int main(void) {
int n, soma = 0;
printf("Introduza valores; 0 termina.\n");
scanf("%d", &n); // primeiro valor
while (n != 0) { // enquanto não terminou
soma += n; // acumular
scanf("%d", &n); // ler próximo valor
}
printf("A soma é: %d\n", soma);
return 0;
}
Instrução do...while
do instrução while ( expressão );
Execução:
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 5/17
16/10/23, 12:48 Ciclos
Exemplo
Vamos re-escrever o programa para somar números usando um ciclo do.
/*
somar2.c
Somar uma sequência de números (alternativa)
*/
#include <stdio.h>
int main(void) {
int n, soma = 0;
printf("Introduza valores; 0 termina.\n");
do {
scanf("%d", &n); // próximo valor
soma += n; // acumular
} while (n != 0); // enquanto não terminou
printf("A soma é: %d\n", soma);
return 0;
}
Observações
Como a condição é testada depois da execução não necessitamos de ler o primeiro valor
fora do ciclo
Somar zero não altera o resultado: podemos sempre acumular o valor lido
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 6/17
16/10/23, 12:48 Ciclos
Exemplo 3
Calcular o número de algarismos de um inteiro positivo:
/* algarismos.c
Contar algarismos de um inteiro positivo
*/
#include <stdio.h>
int main(void) {
int digits = 0, n;
printf("Inteiro positivo: ");
scanf("%d", &n);
do {
n /= 10; // quociente divisão por 10
digits ++; // mais um algarismo
} while (n > 0);
printf("%d algarismo(s)\n", digits);
return 0;
}
Instrução for
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 7/17
16/10/23, 12:48 Ciclos
expr1 é a inicialização
expr2 é a condição de repetição
expr3 é a atualização após cada iteração
instrução é o corpo do ciclo
Exemplo:
Instrução for
O for é conveniente para ciclos que necessitam de contar de um valor inicial até um
valor final
Poderiamos usar o while em vez do for, mas o for é mais claro
Instrução for
Exemplo:
é equivalente a
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 8/17
16/10/23, 12:48 Ciclos
i = 0;
while (i < 10) {
printf("%d\n", i);
i++;
}
Instrução for
A forma geral
é equivalente a:
expr1;
while ( expr2 ) {
instrução
expr3;
}
Instrução for
Exemplo: qual o efeito de usar ++i em vez de i++ no ciclo seguinte?
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 9/17
16/10/23, 12:48 Ciclos
i = 0;
while (i < 10) {
printf("%d\n", i);
++i; // alternativa: i++;
}
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 10/17
16/10/23, 12:48 Ciclos
Omitir a inicialização:
int i = 10;
for (; i > 0; i--)
printf("%d\n", i)
Omitir a atualização:
int i;
for (i = 10; i > 0;)
printf("%d\n", i--)
int i = 10;
for (; i > 0;)
printf("%d\n", i--)
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 11/17
16/10/23, 12:48 Ciclos
int i = 10;
while (i > 0)
printf("%d\n", i--)
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 12/17
16/10/23, 12:48 Ciclos
A variável não tem de ser declarada antes e tem âmbito limitado ao ciclo
Instrução break
Usualmente um ciclo termina apenas quando a condição é testada
Instrução break
Exemplo: procurar o primeiro divisor próprio de um número n (isto é, um divisor entre 2 e
n − 1 ):
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 13/17
16/10/23, 12:48 Ciclos
int i, n;
... /* obter valor de `n' */
for (i = 2; i < n; i++) {
if (n%i == 0) break;
}
Instrução break
No final do ciclo podemos determinar a causa de terminação com um teste simples:
int i, n;
... /* obter valor de `n' */
for (i = 2; i < n; i++) {
if (n%i == 0) break;
}
if (i < n)
printf("Encontrou divisor: %d\n", i);
else
printf("Não tem divisores próprios\n");
Instrução break
A instrução break é útil para escrever um ciclo com um teste de terminação a meio
Exemplo: ler uma sequência de valores e terminar com um valor especial
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 14/17
16/10/23, 12:48 Ciclos
for(;;) {
scanf("%d", &n);
if (n == 0) // se for zero
break; // terminar o ciclo
... // se não: processar o valor
}
Instrução continue
A instrução continue transfere a execução para o ponto imediatamente antes do fim
do corpo
Enquanto que break termina o ciclo, continue continua no ciclo
Exemplo
Ler e acumular 10 inteiros não-negativos.
int i = 0, n, soma = 0;
while (i < 10) {
scanf("%d", &n);
if (n < 0)
continue;
soma += n;
i ++;
/* continue salta para aqui */
}
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 15/17
16/10/23, 12:48 Ciclos
Exemplo
Por vezes é mais simples evitar o continue colocando instruções dentro de um if
A condição é invertida: n >= 0 em vez de n < 0
int i = 0, n, soma = 0;
while (i < 10) {
scanf("%d", &n);
if (n >= 0) {
soma += n;
i ++;
}
}
Instrução vazia
Uma instrução pode ser vazia, isto é, apenas um ponto-e-vírgula sem mais símbolos:
Uma instrução vazia não faz nada; é útil apenas para escrever um ciclo cujo corpo é vazio.
Instrução vazia
Considere o ciclo para procurar divisores:
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 16/17
16/10/23, 12:48 Ciclos
Para evitar confusão, devemos escrever a instrução vazia numa linha separada.
https://www.dcc.fc.up.pt/~pbv/aulas/progimp/teoricas/teorica06.html 17/17