Baixe o app para aproveitar ainda mais
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!
Compartilhar