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, permita determinar se ele deve
serrepetido 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".
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/167c77080c9c70c6e185e8f42c3079f1
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.
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
3)
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) Clique aqui
B) Clique aqui
C) Clique aqui
D) Clique aqui
E) Clique aqui
https://publica.sagah.com.br/publicador/objects/attachment/1897821297/A.pdf?v=1433709414
https://publica.sagah.com.br/publicador/objects/attachment/399801478/B.pdf?v=1873307033
https://publica.sagah.com.br/publicador/objects/attachment/2076120959/c.pdf?v=860780582
https://publica.sagah.com.br/publicador/objects/attachment/502105583/d.pdf?v=2021876475
https://publica.sagah.com.br/publicador/objects/attachment/551918446/E.pdf?v=1553486237
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 +
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Estruturas de Repetição (Loop) - ENQUANTO
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Estruturas de Repetição 1
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://www.youtube.com/embed/6BLB0fBqzlg
https://www.youtube.com/embed/U5PnCt58Q68