Estruturas de repetição IF61A/IF71A - Computação 1 Prof. Leonelo Almeida Universidade Tecnológica Federal do Paraná
Até agora... Sabemos construir algoritmos que tenham: Variáveis Comandos sequenciais Entrada e saída de dados pelo dispositivo padrão Estruturas condicionais e de decisão
Exemplo Problema: Faça um algoritmo para imprimir todos os números inteiros de 1 até 4
Exemplo Problema: Faça um algoritmo para imprimir todos os números inteiros de 1 até 4 nome: imprimirde1a4 inicio imprima( 1 ); imprima( 2 ); imprima( 3 ); imprima( 4 ); fim
Um pouco mais de flexibilidade... Novo problema: Faça um algoritmo que imprima todos os números inteiros de 1 até 100 nome: imprimirde1a100 inicio imprima( 1 ); imprima( 2 ); imprima( 3 ); imprima( 4 );... imprima( 100 ); fim
Mais um pouco de flexibilidade... Novo problema: Faça um algoritmo que imprima todos os números inteiros de 1 até um número informado pelo usuário?
Solução 1 nome: imprimirde1ax inicio inteiro: num; imprima( Informe a quantidade de números: ); leia(num); fim se (num >= 1) então imprima( 1 ); fim se se (num >= 2) então imprima( 2 ); fim se... [até onde o programador conseguir escrever]
Solução 1 Limitada pelo número de comparações que o programador prever E sempre haverá um número maior do que ele previu O tamanho do programa será potencialmente grande A solução 1 não resolve completamente o problema proposto
Solução 2 Precisamos de estruturas de repetição nome: imprimirde1ax inicio inteiro: num, contador; imprima( Informe a quantidade de números: ); leia(num); para (contador<-1; contador<=num; 1) faça imprima(contador); fim para fim
Estruturas de repetição Permite a execução por repetidas vezes de um dado bloco de código Toda estrutura de repetição tem uma condição para finalização da repetição. Pode ser: Um dado número de repetições Uma condição booleana que deve ser atendida para continuar a repetição Sem uma condição de finalização o programa continuaria executando por tempo indeterminado
Tipos de repetição Repetição com teste no início enquanto (condição) faça Repetição com teste no fim repita... até (condição) Repetição com variável de controle para (variável de controle em um intervalo) faça
Repetição com teste no início Utilizado quando se deseja repetir um comando ou bloco de comandos enquanto uma certa condição for verdadeira enquanto (condição) faça comando ou {bloco de comandos} fim enquanto Dica: é indispensável que dentro do escopo do enquanto haja uma operação que, dada uma certa situação, torna a condição do enquanto falsa. Dessa maneira sabemos que a repetição será finalizada em algum momento
Passo-a-passo Sequência de execução enquanto (condição) faça comando ou {bloco de comandos} fim enquanto... outros comandos... Etapa 1: testa a condição. Se for verdadeira vai para a etapa 2; Senão, encerra a repetição e continua o programa a partir do fim enquanto Etapa 2: 1. executa comando ou bloco de comandos 2. volta para a Etapa 1
Repetição com teste no início Exemplos: repetição correta inicio real: valor; imprima( Informe o novo valor ou um valor negativo para encerrar: ); leia(valor); enquanto (valor >= 0) faça imprima( 10% de juros:, 1.1*valor); imprima( Informe o novo valor ou um valor negativo para encerrar: ); leia(valor); fim enquanto fim
Repetição com teste no início Exemplos: repetição com problema na condição de parada inicio logico: continuar; real: valor; continuar <- verdadeiro; enquanto (continuar) faça imprima( Informe o novo valor: ); leia(valor); imprima( 10% de juros:, 1.1*valor); fim enquanto fim
Atividade 1 Um certo cidadão A tem 1,5 m de altura e cresce 2 centímetros por ano, enquanto um outro cidadão B tem 1,10 m e cresce 3 centímetros por ano. Construa um algoritmo que calcule e imprima quantos anos serão necessários para que o cidadão B seja maior que o cidadão A.
Repetição com teste no fim Utilizado quando se deseja repetir um comando ou bloco de comandos enquanto uma certa condição for verdadeira (como no enquanto) A diferença é que o bloco de comandos do escopo do repita será executado pelo menos a primeira vez repita comando ou {bloco de comandos} até (condição) Dica: no repita, a condição define o critério de parada, já no enquanto a condição define o critério de continuação
Passo-a-passo Sequência de execução repita comando ou {bloco de comandos} até (condição)... outros comandos... Etapa 1: Executa comando ou bloco de comandos Etapa 2: testa a condição. Se for falsa vai para a etapa 1; Senão, encerra a repetição e continua o programa a partir do fim da repetição
Repetição com teste no fim Exemplo inicio real: valor; logico: continuar; repita imprima( Informe o novo valor: ); leia(valor); imprima( 10% de juros:, 1.1*valor); imprima( Deseja fazer outro cálculo? ); leia(continuar); até (não continuar) fim
Atividade 2 Um cinema possui capacidade de 100 lugares. Certo dia, cada expectador respondeu a um questionário no qual constava: Sua opinião sobre o filme 5 ÓTIMO 4 BOM 3 REGULAR 2 RUIM 1 PÉSSIMO Idade Fazer um algoritmo que receba estes dados como entrada e calcule e imprima: a porcentagem de respostas ótimo, bom, regular, ruim, péssimo a média de idades das pessoas que responderam ruim a maior idade das pessoas que responderam péssimo
Repetição com variável de controle Utilizado quando se deseja repetir um comando ou bloco de comandos, utilizando uma variável de controle, que tem seu valor aumentado/diminuído a cada repetição para (inicialização; condição; passo) faça comando ou {bloco de comandos} fim para Onde: Inicialização: variável e seu valor inicial. Ex. cont<-1 Condição: condição para repetir. Ex. cont<=10 Passo: aumento/diminuição a cada repetição. Ex. 2
Passo-a-passo para (inicialização; condição; passo) faça comando ou {bloco de comandos} fim para... outros comandos... Sequência de execução Etapa 1: executa os comandos da inicialização Etapa 2: testa a condição. Se for verdadeira vai para a etapa 3; Senão, encerra a repetição e continua o programa a partir do fim para Etapa 3: executa o comando ou bloco de comandos Etapa 4: Executa os comandos no passo Vai para a etapa 2
Repetição com variável de controle Exemplo: repetição correta nome: multiplosde5 início inteiro: cont, nummultiplos; imprima( Informe quantos múltiplos de 5 deseja conhecer: ); leia(nummultiplos); para (cont<-1; cont<=nummultiplos; 1) faça imprima(cont, x 5 =, cont*5); fim para fim
Atividade 3 Construa um algoritmo que imprima todos os expoentes em um intervalo, de um dado número. O usuário deve informa tanto número quanto o valor inicial e final do intervalo. Exemplo: Número 4 Início: 2 Fim: 5 4^2 é: 16 4^3 é: 64 4^4 é: 256 4^5 é: 1024
Atividade 3+ Agora altere o algoritmo anterior para que ele aceite que o início seja maior que o fim também. Exemplo: Número 4 Início: 5 Fim: 2 4^5 é: 1024 4^4 é: 256 4^3 é: 64 4^2 é: 16
Atividade 3++ Faça uma algoritmo que imprima uma matriz n x m, onde n e m são informados pelo usuário e o valor de cada célula é dado por: 0-1 -2-3 -4-1 -1-1 -1-1 -2-1 0 1 2-3 -1 1 3 5-4 -1 2 5 8
Exemplo comparativo Problema: Faça um algoritmo que calcule 2 n, sendo n um número inteiro maior que zero, informado pelo usuário. Restrição: não é permitido utilizar ^ ou **. Implemente o algoritmo em versões diferentes. Utilize: Versão 1 enquanto... faça Versão 2 repita... até Versão 3 para... faça
Versão 1 enquanto... faça nome: calcularpot2 início inteiro: contador, resultado, expoente; imprima( Informe o expoente: ); leia(expoente); contador <- 1; resultado <- 1; enquanto (contador <= expoente) faça resultado <- resultado*2; contador <- contador+1; fim enquanto imprima( Resultado:, resultado); fim
Versão 2 repita... até nome: calcularpot2 início inteiro: contador, resultado, expoente; imprima( Informe o expoente: ); leia(expoente); contador <- 1; resultado <- 1; repita resultado <- resultado*2; contador <- contador+1; até (contador > expoente) imprima( Resultado:, resultado); fim
Versão 3 para... faça nome: calcularpot2 início inteiro: contador, resultado, expoente; imprima( Informe o expoente: ); leia(expoente); resultado <- 1; para (contador<-1; contador<=expoente; 1 ) faça resultado <- resultado*2; fim para imprima( Resultado:, resultado); fim
Resumindo... Uso O para é mais apropriado quando já se sabe (através do usuário ou definindo-se o total através de uma constante) o número de iterações (repetições). O enquanto é mais apropriando quando a condição de parada é inesperada, isto é, não se sabe previamente o total de repetições. (Ex. Parar quando o usuário informar o valor -1 ) O repita também é mais apropriado quando a condição de parada é inesperada, mas o laço precisa ser executado ao menos 1 vez. Conversão entre estruturas Todo enquanto pode ser reescrito como um repita, e viceversa Todo para pode ser reescrito como um enquanto ou um repita, mas o contrário nem sempre é viável (não de uma maneira eficiente)
Exercícios 1. Faça um algoritmo que, dado um número inteiro positivo informado pelo usuário, calcule n! 2. A conversão de graus Fahrenheit para centígrados é obtida pela fórmula C = 5/9*(F-32). Escreva um algoritmo que calcule e imprima na tela uma tabela de graus centígrados em função de graus Fahrenheit sendo que os graus Fahrenheit variam de 50 a 150 de 1 em 1. 3. Modifique o algoritmo anterior para que imprima a conversão dos ímpares de 50 a 150.
Exercícios 4. Faca um programa que imprima um menu de 4 pratos na tela e uma quinta opção para sair do programa. O programa deve imprimir os ingredientes do prato solicitado. O programa deve terminar quando for escolhido a quinta opção. 5. Faca um algoritmo que lê dois números inteiros positivos a e b. Utilizando laços, o seu algoritmo deve calcular e imprimir o valor a b. 6. Faca um programa que lê um número n e que n compute e imprima o valor i=1 n OBS: Não use formulas como a da soma de uma P.A.