Escolar Documentos
Profissional Documentos
Cultura Documentos
Capítulo
6 Estruturas de Repetição
“ O que me preocupa não é nem o grito dos corruptos, dos violentos, dos sem carácter, dos desonestos,
dos sem ética... O que de facto me preocupa é o silêncio dos bons. "
Estrutura de Repetição 65
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Versão 1
1- ler um número inteiro;
Estrutura de Repetição 66
Fundamentos de Programação em C: Uma Abordagem Algorítmica
int n;
Versão 2
1- declarar n;
2- ler(n);
3- imprimir os números inteiros de 1 até n;
Versão 3
1- declarar i, n;
2- ler (n);
3- para i de 1 até n passo 1 faça
4- imprimir(i);
Estrutura de Repetição 67
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Não fazem parte das boas practicas de programação alterar o valor final da
variável de controlo no interior de um comando de repetição.
Exemplo 5: dado uma turma com n estudantes, para n > 0, ler as notas de
frequência de cada estudante, calcular a sua média, e enviar uma mensagem de
erro a mostrar a sua situação académica.
Versão 1
1- ler o número de estudantes da turma;
2- para cada estudante da turma faça;
3- inicio
4- ler as notas das provas de frequencias;
5- calcular a media;
6- imprimir a media e a mensagem;
7- fim
Estrutura de Repetição 68
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Versão 2
1- declarar nAlunos, nota1, nota2, nota3;
2- declarar mediaAluno;
3- ler (nAlunos);
4- para cada aluno da turma faça
5- inicio
6- ler (nota1, nota2, nota3);
7- calcular a média do aluno;
8- imprimir a média do aluno;
9- imprimir a mensagem
10- fim
Versão 3
1- declarar nAlunos, nota1, nota2, nota3, i;
2- declarar mediaAluno;
3- ler (nAlunos);
4- para i de 1 até nAlunos passo 1 faça
5- inicio
6- ler (nota1, nota2, nota3);
7- calcular a média do aluno;
8- imprimir a media do aluno;
9- imprimir a mensagem;
10- fim
Versão 4
1- declarar nAlunos, nota1, nota2, nota3, i;
2- declarar mediaAluno;
3- ler (nAlunos);
4- para i de 1 até nAlunos passo 1 faça
5- inicio
6- ler (nota1, nota2, nota3);
7- calcular mediaAluno = (nota1 + nota2 + nota3) / 3;
8- imprimir (mediaAluno);
Estrutura de Repetição 69
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Fazem parte das boas prática programação escrever numa única linha o todas
as instruções do comando for.
Versão 1
1- ler um número inteiro;
2- calcular a soma dos n primeiros inteiros positivos;
3- imprimir a soma;
Estrutura de Repetição 70
Fundamentos de Programação em C: Uma Abordagem Algorítmica
int n, soma;
Versão 2
1- declarar n, soma;
2- ler(n);
3- calcular a soma dos n primeiros inteiros positivos;
4- imprimir(soma);
No próximo passo, vamos expandir a acção para calcular a soma dos n primeiros
inteiros positivos. Para realizar essa acção, necessitaremos de uma variável que
vai percorrer esse intervalo. Seja i o nome dessa variável.
Versão 3
1- declarar n, i, soma;
2- ler (n);
3- para i de 1 até n passo 1 faça
4- Armazenar a soma dos números percorridos;
6- imprimir (soma);
Versão 3
1- declarar n, i, soma;
2- ler (n);
3- para i de 1 até n passo 1 faça
4- Acumular a soma dos números percorridos;
6- imprimir (soma);
1, 3, 6, 10, 15, ……
Estrutura de Repetição 71
Fundamentos de Programação em C: Uma Abordagem Algorítmica
s1= 1;
s2= 3 = 1 + 2 = s1 + 2;
s3 = 6 = 3 + 3 = s2 + 3
…..
sn = sn-1 + n
Com isso, estamos a dizer que o valor da n-éssina iteração pode ser obtido pela
adição do valor da (n-1)-éssima iteração mais n.
Com base nesse raciocínio vamos provar que s1 = 1. Pela formula anterior, s1 =
s0 + 1, então, s0 + 1 = 1, o que nos permite concluir que s0 = 0.
Isso mostra que o acumulador deve receber o valor zero, antes de iniciarmos o
processo de repetição.
Versão 4
1- declarar n, i, soma;
2- ler (n);
3- inicializar soma com zeros;
4- para i de 1 até n passo 1 faça
5- calcular soma = soma + i;
6- imprimir (soma);
Estrutura de Repetição 72
Fundamentos de Programação em C: Uma Abordagem Algorítmica
system("PAUSE");
return 0;
}
1 𝑠𝑒 𝑛 = 0
𝑛! = {
1𝑥2𝑥 … 𝑥 𝑛 𝑠𝑒 𝑛 > 0
Numa primeira abordagem, a solução para este problema pode ser descrita
pelos seguintes passos:
Versão 1
1- ler o valor de n;
2- cálcular o fatorial de n;
3- imprimir o resultado;
Pelo enunciado, fazem parte dos dados de entrada, um número inteiro não
negativo, e da informação de saída, o factorial desse número. Vamos relacionar
esses dados às respectivas variáveis e aos seus dominios.
int n, fat;
Versão 2
1- declarar n, fat;
2- ler (n);
2- cálcular o fatorial de n;
3- imprimir (fat);
No próximo passo vamos descrever com mais rigor, uma acção para calcular o
factorial de n. Por definição, se n for igual à zero, o factorial de n é igual à um.
Logo, essa acção consiste em inicializar a variável fat com o valor um. Mas, se
n for maior do que zero, esse valor será determinado pela multiplicação
Estrutura de Repetição 73
Fundamentos de Programação em C: Uma Abordagem Algorítmica
sucessiva dos números inteiros que vão de 1 a n. Isso quer dizer, que essa acção
pode ser modelada por um contador que irá percorrer esse intervalo. Vamos
modelar o comportamento desse contador, com base na seguinte sucessão
numérica.
1ª iteração 1! = 1
= 0! X 1
2ª iteração 2! = 1x 2
= 1!x 2
= 2
n! = (n-1)! x n ∀ n > 1.
Isso que dizer que o factorial de n, para n > 1, pode ser obtido pelo calculo do
factorial de (n-1) multiplicado pelo valor de n.
Versão 4
1- declarar n, fat, i;
2- ler (n);
3- inicializar fat com 1;
4- para i de 1 até n passo 1 faça
5- cálcular fat = fat * i;
6- imprimir (fat);
Como todas as linhas deste algoritmo estão claras e não possuem qualquer
ambiguidade, podemos converte-lo para um programa em C.
Estrutura de Repetição 74
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Estrutura de Repetição 75
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Estrutura de Repetição 76
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Vimos que o comando while, deve ser utilizado quando não conhecemos o
número de dados que iremos processar. Como garantir que chegamos ao
término desse conjunto de dados? A estratégia mais usual consiste em utilizar
um sentinela.
10 1.75 1.60 1.82 1.59 1.87 1.58 1.62 1.77 1.92 1.54
↑
sentinela
Versão 1
1- ler o SENTINELA;
2- imprimir os números inteiros de 1 até o SENTINELA;
Pelo enunciado, temos como sentinela um número inteiro que indica quantos
números iremos processar. Seja n uma variável que armazena esse número.
Vamos relacionar essa variável ao seu tipo de dados.
int n;
Versão 2
1- declarar n;
2- ler (n);
3- imprimir os números inteiros de 1 até n;
No próximo passo vamos descrever com mais rigor a acção que mostra na tela
os números inteiros de 1 até n. Para isso, basta declarar um contador que
Estrutura de Repetição 77
Fundamentos de Programação em C: Uma Abordagem Algorítmica
versão 3
1- declarar n, i;
2- ler (n)
3- inicializar i com 1;
4- enquanto i ≤ n faça
5- inicio
6- imprimir (i);
7- adicionar uma unidade a i;
8- fim
1.75 1.60 1.82 1.59 1.87 1.58 1.62 1.77 1.92 1.54 0.0
↑
Estrutura de Repetição 78
Fundamentos de Programação em C: Uma Abordagem Algorítmica
sentinela
Não escolha como sentinela um valor que possa estar contido no conjunto de
dados que vamos processar.
Numa primeira abordagem, a solução deste problema pode ser descrita pelos
seguintes passos:
Versão 1
1- declarar SENTINELA = 0;
2- ler o primeiro número;
3- enquanto número for diferente do SENTINELA faça
4- calcular o maior elemento;
5 - imprimir resultado;
Versão 2
1- declarar SENTINELA = 0;
2- declarar dado, maior;
3- ler (dado);
4- enquanto dado ≠ SENTINELA faça
3- calcular o maior elemento;
4 - imprimir ( maior);
Estrutura de Repetição 79
Fundamentos de Programação em C: Uma Abordagem Algorítmica
No próximo passo vamos tornar o processo iterativo finito, com a leitura dos
próximos números inteiros. Observe que na versão anterior lemos apenas o
primeiro dado do conjunto.
Versão 3
1 - declarar SENTINELA = 0;
2- declarar dado, maior;
3- ler (dado);
4- enquanto dado ≠ SENTINELA faça
5- inicio
6- calcular o maior elemento;
7- ler (dado);
8- fim
9- imprimir (maior);
Versão 4
1 - declarar SENTINELA = 0;
2- declarar dado, maior;
3- ler (dado);
4- enquanto dado ≠ SENTINELA faça
5- inicio
6- se dado <= 0 então
7- imprimir ("Erro: Numero não positivo");
8- senão
9- calcular o maior elemento;
10- ler (dado);
11- fim
12- imprimir (maior);
Versão 4
1- declarar SENTINELA = 0;
2- declarar dado, maior;
3- inicializar maior com zeros;
3- ler (dado);
4- enquanto dado ≠ SENTINELA faça
5- inicio
Estrutura de Repetição 80
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Como todas as linhas deste algoritmo estão claras e não possuem qualquer
ambiguidade, podemos traduzi-lo para um programa em C.
Iteração maior dado maior < dado sentinela dado > sentinela
0 0 10 0 1
1 10 15 1 1
2 15 11 1 1
3 23 0 1
4 23 17 1 1
5 18 0 1
6 22 0 1
7 0 0
Estrutura de Repetição 81
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Será que esse programa devolve os valores que esperamos? Para responder a
essa questão, vamos fazer uma simulação do programa com dados reias.
56 72 -21 45 -8
5 56 72 -21 45 - 8
↑
sentinela
Resolução : vamos mais uma vês, vamos analisar os dados do problema. Como
não conhecemos a quantidade de números que iremos processar, e como todos
Estrutura de Repetição 83
Fundamentos de Programação em C: Uma Abordagem Algorítmica
os números são positivos, faz sentido utilizar um sentinela de fim de leitura com
o valor zero.
Estrutura de Repetição 84
Fundamentos de Programação em C: Uma Abordagem Algorítmica
else
}
if (dado <= 0)
printf ("Erro: Numero não positivo");
else if (maior < dado)
maior = dado;
printf (" \n Entre com outro numero positivo: ");
}
}
printf (" \n Maior valor sequencia =%d \n ",maior);
system("PAUSE");
return 0;
}
break;
abandonar;
}
system("PAUSE");
return 0;
}
A instrução while (1) gera um loop infinito, e pode ser traduzida para a linguagem
algorítmica, pela seguinte sentença:
repetir infinitamente
Estrutura de Repetição 86
Fundamentos de Programação em C: Uma Abordagem Algorítmica
}
mediaClasse = totalMediaAlunos/totalAlunos;
printf ("\n Media da classe %.2f ", mediaClasse);
system ("PAUSE");
return 0;
}
Observe que apôs a linha que contêm o comando break, não é necessário
utilizar a instrução else. Quando essa linha for activada, o fluxo do programa
será desviado para a primeira linha que estiver depois do delimitador de blocos,
e o programa calculará em seguida, a média da classe, mostrará essa media na
tela, e será encerrado.
num = num + 1;
num ++;
ou para
++num;
x = n++;
consiste em
x = n;
n = n+1;
x = ++n;
consiste em
n = n+1;
x = n;
x = ( i + 1) ++ ;
é inválida.
#define PI 3.1415
.
.
printf (" Calculo da area:");
.
.
x = PI * raio*raio;
#define PI 3.1415
...
Estrutura de Repetição 88
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Estrutura de Repetição 89
Fundamentos de Programação em C: Uma Abordagem Algorítmica
i = i + 2;
i +=2;
Por analogia essa propriedade pode ser aplicada aos seguintes operadores: -=,
*=, /= e %=.
6 = 1 + 2 + 3.
28 = 1 + 2 + 4 + 7 + 14.
Estrutura de Repetição 90
Fundamentos de Programação em C: Uma Abordagem Algorítmica
if ( soma == n ) if ( soma == n )
printf (" Numero perfeito "); printf ("Numero perfeito ");
else else
printf (" Numero nao perfeito "); printf (" Numero nao perfeito ");
system ("PAUSE"); system ("PAUSE");
return 0; return 0;
} }
pos = 0, ind = 1;
é equivalente à
pos = 0;
ind = 1;
Estrutura de Repetição 91
Fundamentos de Programação em C: Uma Abordagem Algorítmica
1 se i = 1
Fi = { 1 se i = 2
Fi−1 + Fi−2 se i > 2
para y = 0 , 20 = 1
para y = 1 , 21= 2
=1x2
= 20 x 2
=2
para y = 2 , 22 = 2 x 2
= 21x 2
=4
2n = 2(n -1) x 2
1 se y = 0
xy = {
x (y−1) x se y > 0
Estrutura de Repetição 92
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Versão 1
1- ler os números inteiros x e y;
2- calcular a potençia de x elevado a y;
3- imprimir o resultado;
Pelo enunciado temos como dados de entrada dois números inteiros e como
informação de saída, o valor da potênçia desses números. Vamos relaciona-los
às respectivas variáveis e aos seus domínios.
int x, y, pot;
Versão 2
1- declarar x, y, pot;
2- ler (x, y);
3- calcular a potência de x elevado a y;
4- imprimir (pot);
Versão 3
1- declarar x, y, pot;
2- ler (x, y)
3- inicializar pot com 1;
4- percorrer os numeros de 1 até y
5- calcular a potênçia desse número;
6- imprimir(pot);
No próximo passo vamos descrever com mais rigor a acção para percorrer os
números inteiros de 1 até y e calcular o valor da sua potencia. Essa acção
consiste em declarar um contador que irá percorrer esse intervalo. Em cada
iteração, multiplicar o valor da iteração anterior, que está na variável pot, pelo
valor de x (base da potência).
Versão 4
1- declarar x, y, pot, i;
2- ler (x, y)
3- inicializar pot com 1;
4- para i de 1 até y passo 1 faça
5- calcular pot = pot * x;
6- imprimir(pot);
Estrutura de Repetição 93
Fundamentos de Programação em C: Uma Abordagem Algorítmica
Exemplo 2:
Peso
-1
Idade do 2º grupo
Peso
…
Peso
Estrutura de Repetição 94
Fundamentos de Programação em C: Uma Abordagem Algorítmica
-1
…
Idade do último grupo
Peso
….
Peso
Numa primeira abordagem, a solução para este problema pode ser descrita
pelos seguintes passos:
Versão 1
1- ler a idade do grupo;
2- enquanto mesmo grupo faça
3- inicio
4- calcular a média da idade;
5- imprimir a idade do grupo e seu peso médio;
6- fim
Pelo enunciado, temos como dados de entrada, idade do grupo e o peso das
pessoas desse grupo. Como informação de saída temos a média dos pesos das
pessoas de cada grupo e a idade do grupo. Mas, para calcular a média dos pesos
das pessoas de um grupo, devemos dividir o total do peso das pessoas desse
grupo pelo número de pessoas existentes no grupo. Isto permite-nos declarar as
seguintes variáveis:
Pela forma de organização dos dados, facilmente percebemos que temos duas
estruturas de repetição aninhadas. A mais externa, processa todos os grupos,
enquanto a mais interna, processa as pessoas do mesmo grupo. Vamos refinar
a versão anterior, com a declaração das variáveis, constantes e detalhar o
funcionamento da estrutura de repetição mais externa.
Versão 2
1- declarar SENTINELAIDADE 999;
2- declarar SENTINELAPESO -1;
Estrutura de Repetição 95
Fundamentos de Programação em C: Uma Abordagem Algorítmica
No próximo passo vamos escrever com mais detalhe as acções para calcular a
idade média do grupo. Calcular a idade média consiste em dividir a soma dos
pesos das pessoas do mesmo grupo pela quantidade de pessoas desse grupo.
Isso quer dizer que necessitamos de processar, todas as pessoas do mesmo
grupo, e com essa acção, descrever o funcionamento da estrutura de repetição
mais interna.
Versão 3
1- declarar SENTINELAIDADE 999;
2- declarar SENTINELAPESO -1;
3- declarar idade, peso, pesoTotalGrupo, totalPessoasGrupo;
4- ler (idade);
5- enquanto (idade < SENTINELAIDADE) faça
6- inicio
7- enquanto pessoas da mesma idade faça
8- inicio
9- contar o número de pessoas;
10- calcular o peso total;
11- fim
12- imprimir a idade e o peso médio desse Grupo;
13- ler (idade);
14- fim
Versão 4
1- declarar SENTINELAIDADE 999;
2- declarar SENTINELAPESO -1;
3- declarar idade, peso, pesoTotal, totalPessoas;
4- ler (idade);
5- enquanto (idade < SENTINELAIDADE) faça
6- inicio
7- ler peso da primeira pessoa do grupo;
8- enquanto (peso ≠ SENTINELAPESO) faça
9- inicio
10- contar o número de pessoas;
11- calcular o peso total;
12- ler peso da próxima pessoa do grupo;
Estrutura de Repetição 96
Fundamentos de Programação em C: Uma Abordagem Algorítmica
13- fim
14- imprimir a idade e o peso médio desse grupo;
15- ler (idade);
16- fim
No próximo passo vamos definir com mais rigor as acções para contar o número
de pessoas, calcular o peso total e o peso medio de um grupo. Essas acções
serão obtidas pelo contador que retrata o total de pessoas do mesmo grupo, o
acumulador que retrata o total do peso das pessoas desse grupo, e a fórmula
matemática para apurar o peso médio desse grupo.
Versão 5
1- declarar SENTINELAIDADE 999;
2- declarar SENTINELAPESO -1;
3- declarar idade, peso, pesoTotalGrupo, totalPessoasGrupo, pesoMedio;
4- ler (idade);
5- enquanto (idade < SENTINELAIDADE) faça
6- inicio
7- ler (peso);
8- armazenar em totalPessoasGrupo o valor 0;
9- armazenar em pesoTotalGrupo o valor 0;
10- enquanto (peso ≠ SENTINELAPESO) faça
11- inicio
12- adicionar ao totalPessoasGrupo uma unidade;
13- adicionar ao pesoTotalGrupo o peso da pessoa;
14- ler(peso);
15- fim
16- calcular pesoMedio = pesoTotalGrupo/totalPessoasGrupo;
17- imprimir ( idade, pesoMedio);
18- ler (idade);
19- fim
Como todas as linhas deste algoritmo estão claras e não possuem qualquer
ambiguidade, podemos traduzi-lo para um programa em C.
Estrutura de Repetição 97
Fundamentos de Programação em C: Uma Abordagem Algorítmica
{
totalPessoasGrupo ++;
pesoTotalGrupo += peso;
printf (" \n Entre com o peso da proxima pessoa:");
scanf (" %d ", &peso);
}
printf (" \n Idade do Grupo: %d “, idade);
printf (" Peso medio: %.2f ",pesoTotalGrupo/totalPessoasGrupo);
printf (" \n Entre com a idade do grupo: ");
scanf (" %d ", &idade);
}
system("PAUSE");
return 0;
}
Estrutura de Repetição 98