Prévia do material em texto
Estrutura de repetição enquanto.
(fluxograma)
APRESENTAÇÃO
Na construção de programas, muitas vezes é necessário executar o mesmo conjunto de
comandos mais de uma vez. Para isso, foram criadas as estruturas de repetição.
Nesta Unidade de Aprendizagem, estudaremos a estrutura de repetição "enquanto" (while, em
inglês), que executa um conjunto de comandos enquanto uma condição for verdadeira.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Identificar problemas que precisem de repetição (laços) para construção da solução
algorítmica.
•
Construir fluxogramas que utilizem a estrutura de repetição "enquanto".•
Resolver problemas através de sua especificação com algoritmos.•
DESAFIO
As estruturas de repetição são muito utilizadas em desenvolvimento de softwares. Entender
como funcionam é muito importante para resolver problemas que precisam executar tarefas
repetidas vezes. A estrutura de repetição “enquanto” inicia um processo que, primeiro, faz um
teste (<condição>); se o resultado for verdadeiro (SIM), executa o conjunto de comandos da
repetição e retorna o fluxo para antes da condição; se o resultado for falso (NÃO), sai da
repetição e continua o fluxo do programa. Veja o esquema de fluxo a seguir:
Suponha que você deseje construir um programa que escreva os números inteiros de 1 até um
número que você informe (limite). Qual pode ser o processo para resolver esse problema?
Primeiro, deve ser informado o valor limite; depois, você pode atribuir 1 (um) para uma
variável, mostrar o valor dessa variável, depois somar 1 (um) e repetir o processo enquanto o
valor da variável for menor ou igual ao limite. O fluxograma a seguir demonstra a solução desse
problema.
Agora é sua vez!
Você viajou para a Inglaterra nas suas férias e todos os termômetros apresentam a temperatura
em graus Fahrenheit. Essa escala foi criada em 1708 pelo físico alemão Daniel Gabriel
Fahrenheit. Comparando com a escala Celsius, tem-se a seguinte equivalência:
0°C = 32°F
100°C = 212°F
Para converter uma temperatura F em graus Fahrenheit, pode-se utilizar a seguinte expressão:
Celsius = (F – 32) / 8
Construa um fluxograma que gere uma tabela de equivalência entre as temperaturas em graus
Celsius e em graus Fahrenheit, para as temperaturas em graus Fahrenheit entre 0 e 212, com
intervalos de 1 grau.
INFOGRÁFICO
Para a construção de algoritmos, as estruturas básicas utilizadas são os comandos de entrada e
saída de dados, os comandos de decisão e os comandos para repetição. Esses últimos são o foco
desta Unidade, em especial a construção de fluxogramas que representem a lógica de
funcionamento do comando "enquanto".
CONTEÚDO DO LIVRO
É desafiante aprender a trabalhar com as estruturas de repetição. A compreensão de sua lógica é
o primeiro passo para a adequada utilização. Para saber um pouco mais sobre esse assunto, leia
um trecho da seguinte obra: EDELWEISS, N.; LIVI, M.A.C. Algoritmos e programação com
exemplos em Pascal e C - Vol. 23. Série Livros Didáticos Informática UFRGS. Porto Alegre:
Bookman, 2014. p. 125-127.
23
s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s
algoritmos
e programação
com exemplos em Pascal e C
nina edelweiss
maria aparecida castro livi
E22a Edelweiss, Nina.
Algoritmos e programação com exemplos em Pascal e C
[recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro
Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014.
Editado também como livro impresso em 2014.
ISBN 978-85-8260-190-7
1. Informática. 2. Algoritmos – Programação. I. Livi,
Maria Aparecida Castro. II. Título.
CDU 004.421
as autoras
Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni-
versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge-
nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora
do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três
livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais
e internacionais. Participou de diversos projetos de pesquisa financiados por agências de
fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e
desenvolvimento de software.
Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da
Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro-
fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na
carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para
alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de
interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial
quanto a distância.
Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052
Edelweiss_Iniciais_eletronica.indd ii 14/05/14 16:51
■ ■ Este capítulo apresenta
comandos de repetição utilizados
para implementar iterações
de conjuntos de comandos.
Após a introdução dos conceitos de laço
de repetição e de contador,
são apresentados e discutidos os
comandos de repetição por contagem,
de repetição condicional por
avaliação prévia de uma condição
e de repetição condicional
por avaliação posterior
de uma condição.
estruturas de repetição
capítulo 5
Edelweiss_05.indd 125 12/03/14 09:02
126 Algoritmos e Programação com Exemplos em Pascal e C
Nos algoritmos vistos nos capítulos anteriores, os comandos são executados em sequência,
um após o outro, uma única vez ou até mesmo nenhuma vez, dependendo de uma condição
especificada. Este capítulo introduz uma nova situação, bastante comum na programação:
sequências de comandos que são executados repetidas vezes. O número de repetições pode
ser conhecido a priori ou pode estar associado à ocorrência de uma condição que se verifique
ao longo do processamento.
No capítulo anterior, foi resolvido o problema do cálculo da média aritmética de três notas de
um aluno, com a determinação de sua aprovação ou reprovação, complementado ainda pelo
cálculo do conceito correspondente à média obtida. Com frequência, esse processo é repetido
para um número determinado de alunos de uma turma. Nesse caso, os dados de cada aluno
são obtidos, processados e informados de forma semelhante, porém de forma independente,
sendo esse processo repetido tantas vezes quantos forem os alunos da turma – um número
conhecido, utilizado como limite no controle das repetições.
Existem também situações em que o número de repetições de um conjunto de comandos não
pode ser estabelecido previamente. No exemplo de cálculo dos conceitos, mesmo conhecen-
do-se o número total de alunos da turma pode acontecer de não se ter as notas de todos eles,
porque um ou mais deixou de fazer as provas ou desistiu do curso. Quando não se desejar
processar os dados de todos os alunos, o final da entrada de dados pode ser limitado através,
por exemplo, do fornecimento de um conjunto de notas com valores nulos, ou do código
correspondente ao último aluno a ser analisado. Portanto, nos casos em que o número de re-
petições não é previamente conhecido, o encerramento das repetições é controlado por uma
condição que é verificada ao longo do processamento.
As sequências de comandos que são repetidas duas ou mais vezes são também chamadas de
laços de repetição. Para criar um laço de repetição, além da ação ou ações que nele devam
ser executadas, devem ser definidos:
1. uma forma para indicar o retorno a um ponto determinado do código, para repetir o laço
(o que, até este momento, não esteve disponível);
2. um recurso para registrar o número de vezes que o laço foi realizado, o que remete para
o uso de um contador a ser alterado cada vez que o laço for executado;
3. uma condição que, testada ao final da execução do laço, permitadeterminar se ele deve
ser repetido novamente ou não.
Os elementos acima são, em sua maioria, fornecidos nos comandos iterativos que permitem
implementar repetições. São eles: comando de repetição por contagem, comando de repe-
tição condicional por avaliação prévia de condição e comando de repetição condicional por
avaliação posterior de condição.
5.1 conceito de contador
O conceito de uma variável que atua como um contador está relacionado a repetições por
contagem. Esse é o caso, por exemplo, de uma roleta colocada na entrada de um centro de
Edelweiss_05.indd 126 12/03/14 09:02
Capítulo 5 Estruturas de Repetição 127
eventos com a finalidade de contar quantas pessoas entram no local. A roleta, inicialmente
zerada, soma uma unidade a cada pessoa que por ela passa. Essa informação permite inclu-
sive que a entrada de clientes seja encerrada quando o número registrado pela roleta atingir
a lotação máxima.
Dessa forma, uma variável do tipo contador pode ser utilizada tanto para contabilizar o nú-
mero de ocorrências de determinada ação como para determinar o seu encerramento. O
contador deve ser sempre:
1. inicializado, normalmente com o valor zero, antes de iniciar a contagem:
contador ← 0
2. incrementado, sempre que uma nova ocorrência do que está sendo contado for identi-
ficada ou processada. A forma de incrementar um contador é atribuindo a ele seu valor
atual, incrementado de uma unidade:
contador ← contador + 1
5.2 comando de repetição por contagem para/faça
O comando de repetição por contagem para/faça faz que a execução de uma ação,
ou grupo de ações, seja repetida um número predefinido de vezes. Isso é feito vinculando a
execução de um ou mais comandos ao valor de uma variável de controle, com funcionamento
análogo ao de um contador. O controle das repetições é definido através de um cabeçalho,
no qual são definidos o nome da variável de controle, seus valores inicial e final, e o valor do
incremento que a variável de controle deve receber após cada repetição.
A sintaxe do comando repetição por contagem para/faça é:
para <variável de controle> de <valor inicial> [ incr <valor do incre-
mento> ] até <valor final> faça
<comando>
Apenas variáveis ordinais simples podem ser utilizadas como variáveis de controle. Nesse tipo
de variável, os valores válidos integram um conjunto ordenado de valores discretos, ou seja,
se forem considerados três valores em sequência, entre o primeiro e o terceiro valor existi-
rá tão somente um valor. Variáveis inteiras e tipo caractere são exemplos de variáveis ordinais
simples.
Os valores inicial e final devem ser do mesmo tipo da variável de controle. Por exemplo, no
cabeçalho:
para i de 1 incr 1 até 10 faça
a variável de controle i deve ser inteira. Já no cabeçalho:
para letra de 'a' incr 1 até 'm' faça
a variável de controle letra deve ser do tipo caractere.
Edelweiss_05.indd 127 12/03/14 09:02
DICA DO PROFESSOR
Vamos compreender, utilizando fluxogramas, como são estruturados os comandos para construir
laços de repetição "enquanto...faça".
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) Considere o seguinte fluxograma:
Analise as afirmativas a seguir e escolha a FALSA:
A) O fluxograma possui um laço de repetição.
B) A estrutura de repetição enquanto...para está representada no fluxograma.
C) O fluxograma tem por objetivo escrever os números inteiros no intervalo [A,B],
escrevendo os números desde A até B, incluindo os limites.
D) O fluxograma não escreverá nada se for digitado um valor para A que seja maior que B.
E) Se for tirado do fluxograma o processo L = L + 1, a repetição nunca terminará e sempre
escreverá o mesmo número.
Analise o seguinte fluxograma:
2)
Analise as afirmativas a seguir e escolha a que descreve o objetivo desse fluxograma, ou
seja, o valor final de M (dado de saída) em função dos valores de entrada (A e B).
A) Calcula o resultado da expressão M = A * B.
B) O valor final de M é sempre 1, independentemente dos valores de entrada de A e B.
C) O valor final de M é correspondente ao logaritmo natural de (A * B), ou seja, M = ln (A *
B).
D) Calcula o resultado da expressão M = AB
E) Quando o valor de B for 1, o valor final de M sempre será 1, independentemente do valor
de A.
3) O setor de reprografia da faculdade precisa de um programa que auxilie a controlar
o total de cópias realizadas em cada período. Assim, solicitou um programa que fique
lendo a quantidade de cópias realizadas em cada serviço e, ao final do período,
informe quantos serviços foram realizados e o total de cópias feitas. Considere que
uma cópia se refere a uma folha copiada e que serviço é um conjunto de cópias
solicitadas por um cliente. Analise os fluxogramas das alternativas abaixo e selecione
aquela que representa a melhor solução para esse problema.
A)
B)
C)
D)
E)
Considere o seguinte fluxograma: 4)
Analise as alternativas a seguir e selecione a verdadeira.
A) O algoritmo irá escrever a seguinte série de números: 1, 1, 2, 3, 5, 8, 13, 21, 34.
B) O algoritmo irá escrever a seguinte série de números: 2, 3, 5, 8, 13, 21, 34.
C) O algoritmo irá escrever a seguinte série de números: 2, 3, 5, 8, 13, 21, 34, 55.
D) O algoritmo irá escrever a seguinte série de números: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55.
E) O algoritmo irá escrever a seguinte série de números: 1, 1, 2, 3, 5, 8, 13, 21.
O seguinte fluxograma realiza a decomposição de um número inteiro, que esteja no
intervalo entre [1,9999] e escreve a quantidade de milhares, centenas, dezenas e unidades
do número.
5)
Perceba que são utilizados dois operadores relacionados com a divisão entre números
inteiros:
• div, que calcula o quociente de uma divisão inteira entre dois números inteiros. Ex.: 7 div
2 = 3
• mod, que calcula o resto de uma divisão inteira entre dois números inteiros. Ex.: 7 mod 2
= 1
Analise as alternativas a seguir e selecione aquela que possui a melhor correspondência
entre o fluxograma apresentado acima e o pseudocódigo apresentado.
A) algoritmo "decomposicao"var numero, parte, decimal : inteiroinicio escreval("Digite um
numero: ") leia(numero) decimal <- 1000 enquanto (numero > 0) faca parte <- numero div
decimal escolha decimal caso 1000 escreval(parte," milhares") caso 100 escreval(parte,"
centenas") caso 10 escreval(parte," dezenas") caso 1 escreval(parte," unidades")
fimescolha numero <- numero mod decimal decimal <- decimal div 10
fimenquantofimalgoritmo
B) algoritmo "decomposicao"var numero, parte, decimal : inteiroinicio repita escreval("Digite
um numero: ") leia(numero) ate (numero > 0) e (numero <= 9999) decimal <- 1000 repita
parte <- numero div decimal escolha decimal caso 1000 escreval(parte," milhares") caso
100 escreval(parte," centenas") caso 10 escreval(parte," dezenas") caso 1 escreval(parte,"
unidades") fimescolha numero <- numero mod decimal decimal <- decimal div 10 ate
decimal = 0fimalgoritmo
C) algoritmo "decomposicao"var numero, parte, decimal : inteiroinicio repita escreval("Digite
um numero: ") leia(numero) ate (numero > 0) e (numero <= 9999) enquanto (decimal > 0)
faca parte <- numero div decimal escolha decimal caso 1000 escreval(parte," milhares")
caso 100 escreval(parte," centenas") caso 10 escreval(parte," dezenas") caso 1
escreval(parte," unidades") fimescolha numero <- numero mod decimal decimal <-
decimal div 10 fimenquantofimalgoritmo
D) algoritmo "decomposicao"var numero, parte, decimal : inteiroinicio repita escreval("Digite
um numero: ") leia(numero) ate (numero > 0) e (numero <= 9999) decimal <- 1000
enquanto (decimal > 0) faca parte <- numero div decimal escolha decimal caso 1000
escreval(parte," milhares") caso 100 escreval(parte," centenas") caso 10 escreval(parte,"
dezenas") caso 1 escreval(parte," unidades") fimescolha numero <- numero mod decimal
decimal <- decimal div 10 fimenquantofimalgoritmo
E)algoritmo "decomposicao"var numero, parte, decimal : inteiroinicio repita escreval("Digite
um numero: ") leia(numero) ate (numero > 0) e (numero <= 9999) decimal <- 1000
enquanto (decimal >= 0) faca parte <- numero div decimal se (decimal = 1000) entao
escreval(parte," milhares") fimse se (decimal = 100) entao escreval(parte," centenas")
fimse se (decimal = 10) entao escreval(parte," dezenas") fimse se (decimal = 1) entao
escreval(parte," unidades") fimse numero <- numero mod decimal decimal <- decimal div
10 fimenquantofimalgoritmo
NA PRÁTICA
Repetimos diversos processos na nossa rotina, muitas vezes sem nos darmos conta de que possui
etapas que são realizadas diversas vezes repetidamente. Por exemplo, para comermos um cacho
de uvas, qual o processo que realizamos?
Enquanto tiver uvas, comemos uma uva. O processo irá terminar quando não houver mais uvas.
Analise o fluxograma a seguir:
Se a condição “Tem Uva?” tem resultado SIM (indicando que ainda tem uva no cacho), realiza-
se o processo “Come Uva” e então se repete o processo, voltado à execução do teste (condição).
Quando a condição “Tem Uva?” tiver resultado NÃO (falso, indicado que não há mais uvas no
cacho), finaliza-se a repetição, seguindo o fluxo normal do programa. No caso desse exemplo, o
programa é finalizado. Assim, esse fluxograma representa a estrutura de repetição “Enquanto”,
nesse caso “Enquanto tiver uvas no cacho, coma uma uva”.
Perceba que processos repetitivos são muito comuns, principalmente se analisarmos problemas
matemáticos.
Por exemplo, verificarmos se um número é Primo. O que é um número Primo? É um número
inteiro que somente é divisível por um (todos os números são divisíveis por um) e por ele
mesmo (todos os números são divisíveis por si mesmos). Assim, números Primos são aqueles
que não possuem divisores além de um e ele mesmo. Como números Primos estão relacionados
com repetição? Para verificarmos se um número é Primo ou não, precisamos verificar se ele
possui divisores. Assim, temos que tentar dividir o número por divisores entre [2, numero-1],
verificando se é divisível. Se encontrarmos um divisor nesse conjunto, o número não é Primo.
Lembrando que um número inteiro é dito divisível por outro valor inteiro, se o resto da divisão
for zero (exemplo, 8 é divisível por 2, pois o quociente é 4 e o resto é 0, portanto, 2 é divisor de
8).
Na prática, vamos verificar se o número 7 é Primo?
Já sabemos que todos os números são divisíveis por 1 e por eles mesmos, não precisando testar
que esses são divisores. Portanto, precisamos testar se algum dos valores no intervalo entre [2,6]
é divisor de 7.
7 / 2 = 3 (resto 1) – Não é divisível
7 / 3 = 2 (resto 1) – Não é divisível
7 / 4 = 1 (resto 3) – Não é divisível
7 / 5 = 1 (resto 2) – Não é divisível
7 / 6 = 1 (resto 1) – Não é divisível
Assim, provamos que 7 é um número Primo, pois não possui divisores além do número 1 e de
ele mesmo.
Agora, vamos verificar se 35 é um número Primo. O processo é o mesmo, precisamos testar se
existe algum divisor de 35 no intervalo de valores [2,34].
35 / 2 = 17 (resto 1) – Não é divisível
35 / 3 = 11 (resto 2) – Não é divisível
35 / 4 = 8 (resto 3) – Não é divisível
35 / 5 = 7 (resto 0) – É DIVISÍVEL
35 / 6 = 5 (resto 5) – Não é divisível
35 / 7 = 5 (resto 0) – É DIVISÍVEL
35 / 8 = 4 (resto 3) - Não é divisível
35 / 9 = 3 (resto 8) - Não é divisível
35 / 10 = 3 (resto 5) - Não é divisível
... assim por diante. Perceba que, quando se encontra um divisor, já se pode concluir que o
número não é primo, não é necessário verificar todos os divisores, salvo que se deseje contar a
quantidade de divisores que o número possui. Portanto, 35 não é um número primo, pois possui
divisores, que são 5 e 7.
Considerando números pequenos, esse pode ser um processo relativamente simples. Mas, se
você tiver que verificar, por exemplo, se o número 4181 é Primo ou não, pode ser um processo
um pouco demorado realizar o teste de todas as divisões sucessivamente. Se realizar o processo
descrito acima, verificarás que ele tem dois divisores 37 e 113, mas, antes de encontrar o
primeiro divisor, será preciso realizar as divisões por 2, por 3, por 4, ... etc. Assim, o
computador pode nos auxiliar nesse processo, construindo um algoritmo que realize essa tarefa
repetitiva. A seguir, os passos em linguagem narrativa:
• Ler um número;
• inicializar o valor de divisor com 2, que é o primeiro divisor a ser testado;
• inicializar o contador de divisores com 0 (zero), indicando, inicialmente, que o número não
tem divisores;
• enquanto o valor do divisor for menor que o número faça (esse é o trecho da repetição):
- o verificar se o resto da divisão do número pelo divisor é igual a zero; se for, encontrou-se
um divisor, contar;
- o incrementar o divisor, gerando o próximo divisor a ser testado;
• ao final da repetição, verificar se o contador de divisores é igual a zero; se for, o número é
Primo.
A seguir, o mesmo processo representado através de um fluxograma:
E agora representado através de pseudocódigo:
algoritmo "primos"
var
numero, divisor, resto, conta : inteiro
inicio
escreval("Digite um numero: ")
leia(numero)
divisor <- 2
conta <- 0
enquanto (divisor < numero) faca
resto <- numero mod divisor
se resto = 0 entao
escreval("divisor: ", divisor)
conta <- conta + 1
fimse
divisor <- divisor + 1
fimenquanto
se conta = 0 entao
escreval("Numero Primo")
senao
escreval("Nao eh Primo")
fimse
fimalgoritmo
Perceba que, nesse algoritmo, é utilizada a função “mod”, que calcula o resto de uma divisão
inteira.
Curiosidade: pesquises sobre a importância dos números Primos para sistemas de criptografia.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Estruturas de Repetição (Loop) - ENQUANTO
Conteúdo interativo disponível na plataforma de ensino!
Estruturas de Repetição 1
Conteúdo interativo disponível na plataforma de ensino!