Escolar Documentos
Profissional Documentos
Cultura Documentos
Computação
Unidade VII:
Comandos de Repetição
(parte II): for
loops aninhados
1
Escola Nacional de Ciências Estatísticas
Introdução
.
Dentre os recursos disponibilizados pelas linguagens de programação para a
manipulação de conjuntos de informações, os vetores destacam-se por sua simplicidade e
eficiência. Esta unidade tem como objetivo principal apresentar dois temas: os conceitos
básicos vetores (declaração, acesso aos elementos, atribuição, etc) e o comando for (outro
comando de repetição). A opção por “misturar” os dois temas é justificada pelo fato de que,
na maioria das situações práticas, torna-se necessário utilizar um comando de repetição
para trabalhar com um vetor (e o comando for é o mais utilizado para isso).
A estrutura FOR-DO é uma estrutura de repetição bastante simples. Ela serve para
executar um conjunto de comandos por um número fixo de vezes. Por exemplo: se você
escreve a linha for I:=1 to 15 do, você está instruindo o Pascal a executar por 15
vezes os comandos que forem colocados no bloco subordinado ao for. A Figura VII.1
ilustra o modelo de utilização do FOR-DO.
2
Escola Nacional de Ciências Estatísticas
program ProgComFor;
var NOTA, SOMA, MEDIA: real;
I: integer;
begin
SOMA :=0;
writeln(‘Digite 50 notas: ‘);
for I:=1 to 50 do
begin
readln(NOTA);
SOMA := SOMA + NOTA;
end;
MEDIA := SOMA / 50;
writeln(‘A media eh: ‘,MEDIA);
readln;
end.
Figura VII.2– Programa que calcula a média de 50 notas com o comando de repetição for.
program TesteDoFor_1;
var K: integer;
begin
for K:=1 to 15 do
begin
writeln('LINHA ',K);
end;
readln;
end.
Figura VII.3– Programa que imprime 15 linhas com o uso do comando for.
3
Escola Nacional de Ciências Estatísticas
• O comando for executa um laço por um número fixo de vezes. Para fazer isso,
basta especificar uma variável controladora, seu limite inferior e o seu limite
superior.
• Com o uso do for o programa nunca entra em loop infinito, pois ele será
repetido por um número fixo de vezes. O programa só corre risco de entrar em
loop infinito se o programador alterar de forma equivocada o valor da variável
de controle dentro dos comandos subordinados ao for (neste curso,
recomendamos que você não faça isso!).
4
Escola Nacional de Ciências Estatísticas
Tudo que é feito com a estrutura FOR-DO pode ser implementado com as
estruturas WHILE-DO e REPEAT-UNTIL. Mas a recíproca não é verdadeira: existem
certos tipos de laço que só podem ser implementados com WHILE-DO ou REPEAT-
UNTIL. Resumidamente, o que ocorre é o seguinte:
• Se você vai implementar um laço que será executado por um número previsível
(fixo) de vezes, você pode utilizar a estrutura FOR-DO (já que ela é mais
simples e não nos obriga a incrementar a variável de controle!). Alguns
exemplos de programas que podem ser implementados com o comando for:
A linguagem Pascal também permite que você monte um for “reverso”. Isto
significa criar um laço for onde o valor da variável de controle comece no limite superior e
seja decrementado em 1 a cada iteração até atingir o valor do limite inferior. Neste caso é
preciso utilizar a palavra chave downto. Observe as Figuras VII.5 e VII.6. Elas ilustram,
respectivamente, um exemplo simples de programa que utiliza a estrutura FOR-DOWNTO-
DO e a tela que apresenta o resultado de sua execução.
5
Escola Nacional de Ciências Estatísticas
program TesteDoFor_2;
var K: integer;
begin
for K:=15 downto 1 do
begin
writeln('LINHA ',K);
end;
readln;
end.
Figura VII.5– Programa que imprime 15 linhas com o uso da estrutura for-downto-do.
6
Escola Nacional de Ciências Estatísticas
program ProgTabuada;
var I, N: integer;
RESP: char;
begin
repeat
writeln('Digite um numero entre 1 em 10: ');
readln(N);
for I:=1 to 10 do
begin
writeln(N,'x',I,' = ',N*I);
writeln;
end;
writeln;
write('Deseja mais um numero (S=Sim, N=Nao)? ');
readln(RESP);
until (RESP = 'N') or (RESP = 'n');
writeln('OBRIGADO POR USAR O PROGRAMA TABUADA');
readln;
end.
Figura VII.7– Programa Tabuada – Exemplo de Loops Aninhados.
Esta seção apresenta uma série de exercícios resolvidos que exemplificam o uso do
comando for. Alguns conceitos novos serão apresentados na explicação de cada exercício.
EXEMPLO VII.1 Escreva um programa que imprima a palavra ‘ENCE’ 30 vezes na tela,
usando o comando FOR.
RESOLUÇÃO:
program EscreveENCE;
var I:integer;
begin
for I:=1 to 30 do
writeln('ENCE');
readln;
end.
7
Escola Nacional de Ciências Estatísticas
você quiser usar o BEGIN e END não tem problema! O programa também funcionará
normalmente, conforme ilustra a resolução abaixo.
program EscreveENCE2;
var I:integer;
begin
for I:=1 to 30 do
begin
writeln('ENCE');
end;
readln;
end.
EXEMPLO VII.2 Escreva um programa que receba a nota de 20 alunos como entrada e que
imprima qual delas é a maior.
RESOLUÇÃO:
program MaiorDe20;
const MAX = 20;
var I:integer;
N, MAIOR: real;
begin
writeln('Programa Maior Nota');
writeln('===================');
writeln('Digite ',MAX, ' Notas:');
MAIOR:=0;
for I:=1 to MAX do
begin
write('Nota ',I,': ');
readln(N);
if (N > MAIOR) then MAIOR := N;
end;
end.
Observe que neste programa utilizamos a constante MAX (de valor 20) como limite
superior do for. Desta maneira fica muito simples mudar o programa para que ele passe a
8
Escola Nacional de Ciências Estatísticas
aceitar como entrada 10 notas ou 50 notas (basta mexer no valor de MAX, especificado na
linha 2).
EXEMPLO VII.3 Construir um programa PASCAL que leia um número inteiro positivo N como
entrada e calcule e exiba na tela o valor de N! (ou seja, o fatorial de N).
program Fatorial;
var N, I: integer;
F: real;
begin
writeln('FATORIAL');
writeln('========');
write('Digite um numero inteiro positivo: ');
readln(N);
if (N < 0) then
writeln('O numero digitado nao e positivo.')
else
begin
F:=1;
for I:=1 to N do F:=F*I;
writeln(N,'! = ',F:5:0);
end;
readln;
end.
Neste exemplo, um laço montado com I variando entre 1 e N (número digitado pelo
usuário) é utilizado para o cálculo do fatorial. O resultado, embora inteiro, é armazenado
na variável real F, já que as variáveis reais possuem maior capacidade de armazenamento
(o fatorial geralmente resulta em um número muito grande).
EXEMPLO VII.4 Construir um programa PASCAL que leia um número inteiro positivo N como
entrada e determine se o número é primo ou não
Observações :
9
Escola Nacional de Ciências Estatísticas
program Primo_com_For;
var N, I: longint;
PRIMO: boolean;
FICAR: char;
begin
writeln('PROGRAMA PRIMO');
writeln('==============');
repeat
write('Digite um numero inteiro positivo: ');
readln(N);
if (N < 0) then
writeln('O número digitado não é positivo.')
else
begin
{aqui eu determino se N é primo!}
PRIMO:=TRUE;
for I:=2 to (N div 2) do
if (N MOD I) = 0 then PRIMO := FALSE;
{aqui eu já determinei! Rápido, não é?}
{imprime resultado}
if (PRIMO = true) then
writeln(N, ' eh primo')
else
writeln(N, ' nao eh primo');
end;
end.
Neste exemplo, um laço externo montado com o comando repeat mantém a rotina
que recebe N e determina se ele é primo em execução até que o usuário digite a tecla X
(tecla escolhida pelo programador para servir de flag de saída). Para determinar se N é
primo ou não, bastou usar 3 linhas de código.
10
Escola Nacional de Ciências Estatísticas
EXEMPLO VII.5 Construir um programa PASCAL com dois comandos for aninhados para
imprimir na tela a tabuada de 1,2,3,4,5,6,7,8,9 e 10.
program ProgTabuada;
var I, J: integer;
begin
for I:=1 to 10 do
begin
writeln('Tabuada de ',I);
for J:=1 to 10 do
writeln(I,'x',J,'=',I*J);
writeln;
end;
readln;
end.
11
Escola Nacional de Ciências Estatísticas
Onde:
Alguns exemplos:
Agora que sabemos declarar um vetor, vamos aprender como podemos armazenar e
recuperar informações armazenadas no mesmo. Para isto, considere o vetor VET_MEDIA,
cuja declaração foi especificada na Figura VII.8 (página 11). Este vetor é um vetor de
tamanho 10 do tipo real. Ele pode armazenar a média de 10 alunos. A Figura VII.9 ilustra
que este vetor (assim como qualquer outro) possui dois componentes:
12
Escola Nacional de Ciências Estatísticas
Na figura acima, tem-se que o índice (ou subscrito) 1 do vetor possui o valor 7.5
armazenado. O subscrito 2, por sua vez, possui o valor 5.5. Já o subscrito 3 possui o valor
10.0 e assim por diante. Para armazenar um valor em um determinado subscrito do vetor,
basta referenciar o subscrito em questão entre colchetes [] e utilizar normalmente o
comando readln ou o operador de atribuição ( := ).
Exemplos:
13
Escola Nacional de Ciências Estatísticas
VII.6.3 Um Exemplo
program Vetor;
{declaração do vetor}
var C: array[1..8] of integer;
begin
{atribuições}
C[1] := -45;
C[2] := 6;
C[3] := 0;
C[4] := 72;
C[5] := 1543;
C[6] := -89;
C[7] := 0;
C[8] := 62;
{impressão dos elementos de índice 1 e 5}
writeln('C[1] = ',C[1]);writeln('C[5] = ',C[5]);
{novas atribuições}
C[3] := C[3] + 1; {agora C[3] vale 1!}
C[7] := C[5]; {agora C[7] vale 1543}
{impressão dos elementos de índice 3 e 7}
writeln('C[3] = ',C[3]);writeln('C[7] = ',C[7]);
readln;
end.
Figura VII.10 – Atribuição e Acesso a Elementos de um Vetor
14
Escola Nacional de Ciências Estatísticas
Finalizando esta unidade, são apresentadas algumas das principais propriedades dos
vetores.
• É um erro tentar acessar um elemento que não esteja localizado entre os limites
inferior e superior do vetor. Fazer, por exemplo, VET_CARROS[7] := ‘FOX’,
gera um erro de compilação, pois o limite superior de VET_CARROS é 6.
15
Escola Nacional de Ciências Estatísticas
16
Escola Nacional de Ciências Estatísticas
• Por fim, observe a Figura VII.16. Ela ilustra exemplos de operações possíveis e
de operações que não podem ser realizadas com os vetores.
17
Escola Nacional de Ciências Estatísticas
EXEMPLO VII.6 Criar um programa que armazene cinco nomes em um vetor. Depois solicite
um número entre 1 e 5 e imprima o nome da pessoa que está armazenado no índice cujo
valor é igual a esse número.
program Vetor1;
var I: integer;
VET: array[1..5] of string;
begin
for I:=1 to 5 do
begin
write('Digite o nome ',I, ': ');
readln(VET[I]);
end;
readln;
end.
program VetorMedias;
const TAM = 30;
var I: integer;
MATRICULA: array[1..TAM] of string;
MEDIA: array[1..TAM] of real;
Begin
{parte 1 – lê os dados}
for I:=1 to TAM do
begin
write('Digite a matricula ',I, ': ');
readln(MATRICULA[I]);
write('Digite a media final ',I, ': ');
18
Escola Nacional de Ciências Estatísticas
readln(MEDIA[I]);
end;
readln;
end.
EXEMPLO VII.8 Faça um programa que leia dois vetores A e B, cada um com 10 posições de
números reais. A partir destes dois vetores, gere um terceiro vetor de reais C da seguinte
forma: o primeiro elemento de C deve ser obtido a partir a soma do primeiro elemento de A
com o último (décimo) de B. O segundo elemento de C deve representar a soma do segundo
elemento de A com o penúltimo de B, e assim por diante.
program VetorSoma;
const TAM = 10;
var I: integer;
A, B, C: array[1..TAM] of real;
begin
{parte 1 – lê os dados do vetor A}
for I:=1 to TAM do
begin
write('A[',I, ']: '); readln(A[I]);
end;
{parte 2 – lê os dados do vetor B}
for I:=1 to TAM do
begin
write('B[',I, ']: ');readln(B[I]);
end;
{parte 3 – gera C}
for I:=1 to TAM do
C[I] := A[I] + B[11-I];
readln;
end.
19
Escola Nacional de Ciências Estatísticas
EXEMPLO VII.9 Faça um programa que, inicialmente, leia 50 números inteiros e armazene
num vetor A. Em seguida, o programa deve determinar e imprimir o maior e o menor dos 50
números.
program MaiorMenor;
const TAM = 50;
var I, MAIOR, MENOR: integer;
A: array[1..TAM] of integer;
begin
{parte 1 – lê os dados do vetor A}
for I:=1 to TAM do
begin
write('A[',I, ']: '); readln(A[I]);
end;
readln;
end.
EXEMPLO VII.10 Criar um programa que leia um vetor A de 10 valores inteiros e construa
outro vetor B da seguinte forma.
Vetor A 3 8 4 2 ... 5
Vetor B 9 4 12 1 ... 15
20
Escola Nacional de Ciências Estatísticas
program GeraB;
const TAM = 10;
var j: integer;
A, B: array[1..TAM] of integer;
begin
{parte 1 – lê os dados do vetor A e, ao mesmo tempo, gera B}
for j:=1 to TAM do
begin
write('A[',j, ']: ');
readln(A[j]);
if (j MOD 2 = 0) then
B[j] := A[j] DIV 2
else
B[j] := A[j] * 3;
end;
readln;
end.
(1) Crie um programa que apresente a soma de todos os números ímpares menores do que
10.000.
P(n,r) = n! / (n – r)!
21
Escola Nacional de Ciências Estatísticas
(3) (Triplas Pitagóricas) Um triângulo retângulo pode ter lados que são todos inteiros. O conjunto
de três inteiros que representam os lados de um triângulo retângulo é chamado de tripla pitagórica.
Estes três lados devem satisfazer a relação de que a soma dos quadrados de dois dos lados é
igual ao quadrado da hipotenusa. Crie um programa que ache todas as triplas pitagóricas para
lado1, lado2 e hipotenusa, todos menores do que 500. Use um laço for triplamente aninhado
que testa todas as possibilidades. Este é um exemplo de calcular pela “força bruta” (você
aprenderá, ao longo do curso de Estatística, que existem muitos problemas interessantes para os
quais a única solução é testar todas as possibilidades!)
(4) Faça um programa que carregue um vetor com dez números reais (ou seja, que leia 10 valores
digitados pelo usuário e armazene num vetor).
Depois de carregar o vetor calcule e imprima a quantidade de números negativos e a soma dos
números positivos desse vetor.
(5) Faça um programa que leia 7 letras do teclado, uma de cada vez, e armazene as letras
digitadas num vetor do tipo char.
Em seguida exiba numa linha do vídeo o vetor na ordem direta (ou seja exiba primeiro o elemento
1, depois o 2, ..., até o 7) usando o comando write , para que as letras sejam exibidas uma do lado
da outra.
Na linha seguinte, exiba o vetor na ordem inversa (ou seja, valores do índice 7 ao 1), também
utilizando o comando write.
22
Escola Nacional de Ciências Estatísticas
(6) Uma escola deseja saber se existem alunos cursando, simultaneamente, as disciplinas
Programação PASCAL e Programação Java.
Coloque os números das matrículas dos alunos que cursam Programação Pascal em um vetor (no
máximo 20 alunos). Coloque os números das matrículas dos alunos que cursam Programação C
em outro vetor (no máximo 20 alunos). Gere, em seguida, um relatório que mostre o número das
matrículas que aparecem nos dois vetores.
(7) Crie um programa que leia 20 números inteiros e armazene em um vetor. Em seguida imprima
um relatório que apresente o número e o índice (posição no vetor) dos números que forem
múltiplos de seu índice.
(8) Crie um programa que leia 10 números inteiros e armazene em um vetor. Em seguida imprima
um relatório que exiba apenas os números que são quadrados perfeitos.
OBS: Um número é quadrado perfeito quando tem um número inteiro como raiz quadrada.
DICA: As funções TRUNC ou ROUND (Unidade 4) podem ser utilizadas na resolução deste
problema.
Em seguida, o programa deve calcular e exibir na tela o valor de π (mostre na tela com 20 casas
decimais).
(10) (Crivo de Eratóstenes) Um inteiro primo é qualquer número inteiro que só pode ser dividido
exatamente por si mesmo e por 1. O “Crivo de Eratóstenes” é um método fácil e prático de se
encontrar números primos até um certo valor limite. Esse método deverá ser utilizado nesta
questão, para que sejam determinados todos os números primos menores do que 1000. Para isto,
escreva um programa composto pelos 3 passos descritos a seguir:
(a) Crie um vetor de inteiros com 1000 posições. Depois atribua o valor 1 para todas as posições
deste vetor.
1 1 1 1 1 1 1 1 1 1 1 ... 1 1
1 2 3 4 5 6 7 8 9 10 11 ... 999 1000
(b) Em seguida, começando da posição 2 do vetor, sempre que for encontrado um elemento
com valor igual a 1, faça um laço pelo restante do vetor e defina como zero todos os elementos
cujo subscrito seja múltiplo do subscrito com valor 1.
23
Escola Nacional de Ciências Estatísticas
1 1 1 0 1 0 1 0 0 0 1 ... 0 0
1 2 3 4 5 6 7 8 9 10 11 ... 999 1000
(c) Continue o programa, criando uma rotina que percorra o vetor de 1000 elementos e imprima na
tela os números primos que existem entre 1 e 1000 (basta imprimir todos os subscritos dos
elementos que contêm o valor 1).
24