640 likes | 778 Views
BC-0505 Processamento da Informação. BC & T Universidade Federal do ABC. Estruturas de Repetição. Estruturas de repetição estão divididas em três tipos: Estrutura enquanto ( while ) Estrutura repita ( do while ) Estrutura para ( for ) .
E N D
BC-0505 Processamento da Informação BC & T Universidade Federal do ABC
Estruturas de Repetição • Estruturas de repetição estão divididas em três tipos: • Estrutura enquanto (while) • Estrutura repita (do while) • Estrutura para (for)
Estruturas de Repetição • Quando uma seqüência de comandos deve ser executada repetidas vezes usamos uma estrutura de repetição. • A estrutura de repetição, assim como a de decisão, envolve sempre a avaliação de uma condição. • Também conhecidas como laços de repetição ou loops. bloco
Ex.1 – Quantidade de Alunos Aprovados Um arquivo chamado resultado.txt armazena o resultado final da disciplina de modo que cada linha tem duas colunas, a primeira tem o número de matrícula de todos os alunos e a segunda coluna a situação final do aluno: aprovado ou reprovado. Queremos determinar a quantidade de alunos aprovados. 01222 aprovado 03440 reprovado 01999 aprovado 02113 aprovado 01110 reprovado 12345 aprovado 01010 aprovado 02900 aprovado
Ex.1 – Quantidade de Alunos Aprovados Um arquivo chamado resultado.txt armazena o resultado final da disciplina de modo que cada linha tem duas colunas, a primeira tem o número de matrícula de todos os alunos e a segunda coluna a situação final do aluno: aprovado ou reprovado. Queremos determinar a quantidade de alunos aprovados. Um solução: • 1. Se não é fim do arquivo, leia uma linha do arquivo; • 2. se a linha corresponde a um aluno aprovado • então incremente o contador de alunos aprovados • senão, volte para o passo 1.
Estrutura de Repetição ENQUANTO • A estrutura de repetição enquanto permite especificar instruções que devem ser repetida enquanto determinada condição for verdadeira • Exemplo: enquanto não terminar o arquivo, leia linha e incremente contador de aprovados se for o caso. • O corpo da estrutura enquanto pode ser uma instrução ou um bloco de execução bloco
Estrutura de Repetição ENQUANTO • Quando a condição da estrutura enquanto se tornar falsa, a ação (ou bloco de ações) da estrutura será pulada. • O programa continuará com a ação imediatamente após a estrutura enquanto. • IMPORTANTE: você deve sempre prever o comando, ou ação, que tornará falsa a condição do comando enquanto, caso contrário, seu programa entrará em loop infinito. bloco
Estrutura de Repetição ENQUANTO bloco condição ? início V F Pseudolinguagem enquanto <condição> faça <bloco_de_execução>
Ex. 2 – Números de Fibonacci Leonardo de Pisa (ou Fibonacci, 1170 - 1250) descreveu o crescimento de uma população de coelhos por uma sequência de números que agora é conhecida por sequência de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Essa sequência é definida por F(1) = F(2) = 1 e se n > 2 então F(n) = F(n-1) + F(n-2). Dado um inteiro n>0, obter F(n), o n-ésimo número de Fibonacci.
Ex. 2 – Números de Fibonacci – Algoritmo Esboço de uma solução: 1. Dado n; 2. se n=1 ou n=2, então responda “F(n)=1”; 3. senão, tome i igual a 2 e faça 3.2. i ← i+1; 3.3. F(i) ← F(i-1) + F(i-2); 3.4. se i<n então volte para 3.2; 4. responda “F(n)=” F(i). Obs: A linha 3.1 é executada apenas uma vez e a linha 3.3 aumenta o valor da variável i até que i=n e, nesse caso, o laço termina pois a condição na linha 3.4 torna-se falsa. Exercício: Resolver usando enquanto.
Ex. 2 – Números de Fibonacci – Pseudocódigo Algoritmo Fibonacci inicio inteiro n, a, b, prox, cont; leia (n); a ← b ← 1; se ( n=1 n=2 ) entao inicio escreva (b); fimentao senao
Ex. 2 – Números de Fibonacci – Pseudocódigo inicio cont ← 2; enquanto ( cont <> n ) faça inicio prox ← a + b; a ← b; b ← prox; cont ← cont + 1; fimenquanto fimsenao escreva(b); fimalgoritmo.
Ex. 3 – ENQUANTO aninhado Sabe-se que um número inteiro positivo da forma n³ é a soma de n números ímpares conscutivos. Por exemplo, 1^3 = 1 2^3 = 3+5 3^3 = 7+9+11 4^3 = 13+15+17+19, ... n^3 = k + (k+2) + (k+4) + ... + (k+2(n -1)), para algum k ímpar. Dado um inteiro n>0, determinar k tal que n³ pode ser escrito como soma de n ímpares consecutivos como descrito acima.
Ex. 3 – ENQUANTO aninhado Esboço de uma solução: 1. leia(n) 2. k=1; 3. soma = k + (k+2) + (k+4)+ ... + (k + 2(n -1)), para algum k; 4. se (soma = n³) então achou, responda k; 5. senão incrementa k de 2 e volta pra linha 3. Problema: Como avaliar k + (k+2) + (k+4)+ ... + (k + 2(n -1))?
Ex. 3 – ENQUANTO aninhado Como avaliar k + (k+2) + ... + (k + 2(n -1))? Outro laço: 1. dado k, dado n e inicializadas com 0 as variáveis i e soma; 2. enquanto i <= 2(n-1) faça 2.1. soma ← soma + (k + i); 2.2. i← i+2;
Ex. 3 – Pseudocódigo Algoritmo Cubo como soma de ímpares consecutivos início inteiro: n, soma, k, i; lógico: achou; leia ( n ); // n>=1 achou ← falso; k ← 1; enquanto ( ~achou ) faça
Ex. 3 – Pseudocódigo inicio i ← soma ← 0; enquanto ( i < 2*n ) faça inicio soma ← soma + (k + i); i ← i + 2; fimenquanto se ( soma = n^3 ) entao inicio achou ← verdadeiro; fimentao senao inicio k ← k + 2; fimsenao
Ex. 3 – Pseudocódigo fimenquanto escreva(k); fimalgoritmo
Estrutura de Repetição ENQUANTO • Características de funcionamento: • Não é necessário o conhecimento prévio do número de repetições • Executa a repetição enquanto a condição for verdadeira, testando-a desde seu início • Os comandos do loop podem não ser executados instruções Validação inicial enquanto <condição> faça <bloco> fimenquanto
Estrutura de Repetição ENQUANTO Controlada por Contador • O que indica quantas vezes uma repetição será realizada? • A estrutura enquanto não oferece este recurso. • Solução: uso de um contador, ou variável contadora, que tem um certo valor inicial (atribuído fora do laço) e é incrementada a cada repetição. • Exemplo de contador: inteiro cont; // declaração do contador cont 0; // inicialização do contador cont cont + 1; // incrementa contador em uma unidade
Estrutura de Repetição ENQUANTO Controlada por Contador • O que indica quantas vezes uma repetição será realizada? • A estrutura enquanto não oferece este recurso. • Solução: uso de um contador, ou variável contadora, que tem um certo valor inicial (atribuído fora do laço) e é incrementada a cada repetição. • Exemplo de contador: Associado ao CONTADOR, devemos ter: 1 – Atribuição de Valor Inicial 2 – Definição de Condição de Continuidade ou Parada do Laço de Repetição 3 – Definição de Passo (Incremento/Aumento ou Decremento/Diminuição) do Valor do Contador Os três itens devem ser construídos de forma a permitir que o Laço de Repetição realize o que se pede. Isto é responsabilidade do programador!!! inteiro cont; // declaração do contador cont 0; // inicialização do contador cont cont + 1; // incrementa contador em uma unidade
Exemplos de Contador Usamos i no exemplo 3: i ← 0; enquanto ( i < 2*n ) faça inicio soma ← soma + (k + i); i ← i + 2; fimenquanto Usamos cont no exemplo 2: cont ← 2; enquanto ( cont <> n ) faça inicio prox ← a + b; a ← b; b ← prox; cont ← cont + 1; fimenquanto
Estrutura de Repetição ENQUANTO Controlada por Sentinela • Valor de sentinela (finalizador, de sinal ou de flag) – valor especial que indica o final de entrada de dados. • Usado pelo usuário para indicar final do laço de repetição. • Exemplo: se a entrada de um problema é um sequência de inteiros positivos podemos usar -1 como sinal de fim da entrada.
Exercício Resolvido Uso do sentinela para indicar o fim da entrada de dados: Escreva um algoritmo que determine se números inteiros e positivos são pares, ou ímpares. Utilize a estrutura enquanto para permitir a entrada da seqüência de números. O último número, que não será considerado na análise, deve assumir o valor –1 (sentinela).
Exercício Resolvido Pseudocódigo Algoritmo ParImpar início inteiro: valor, resto; string: mensagem; leia ( valor );
Exercício Resolvido Pseudocódigo enquanto ( valor –1 ) faça resto valor mod 2; se ( resto=0 ) então inicio mensagem “Número par”; fimentao senão inicio mensagem “Número ímpar”; fimsenao escreva( mensagem); leia ( valor ); fimenquanto fimalgoritmo
Estrutura de Repetição ENQUANTO Controlada por Sentinela • Outro exemplo: em computação EOF é uma condição que indica fim-de-arquivo (End-Of-File). Concretamente, é um flag cujo valor de fato depende do sistema operacional e que não corresponde a um carater válido, usualmente é -1.
Ex. 1 – Uma Solução em Pseudocódigo Um arquivo chamado resultado.txt armazena o resultado final da disciplina de modo que cada linha tem duas colunas, a primeira tem o número de matrícula de todos os alunos e a segunda coluna a situação final do aluno: aprovado ou reprovado. Queremos determinar a quantidade de alunos aprovados. 01222 aprovado 03440 reprovado 01999 aprovado 02113 aprovado 01110 reprovado 12345 aprovado 01010 aprovado 02900 aprovado
Ex. 1 – Uma Solução em Pseudocódigo String: linha; inteiro: aprovados; aprovados ← 0; enquanto (~EOF(resultado.txt)) faça inicio leia (linha); se (linha termina em “aprovado”) inicio aprovados ← aprovados + 1; fimse fimenquanto escreva(aprovados); fimalgoritmo Obs.: EOF = “End Of File” = “Fim de Arquivo”
Estrutura de Repetição ENQUANTO em Java JAVA // Não é padrão while <condição> <comando>; Pseudolinguagem enquanto <condição> faça <bloco> // Padrão com {} while <condição> { <comandos> }
Observação: Novos Operadores em Java • Algumas linguagens (Ex.: Java, C#, C++, C) contém operadores especiais para simplificar a atribuição de valores às variáveis • As Estruturas de Repetição demandam o uso frequente de operadores associados às variáveis de controle • Portanto, recomenda-se usar os seguintes operadores em Java (seja i uma variával): • i++; ou ++i;: • Se colocado sozinho em uma linha, equivale ao comando: i = i + 1; • No caso de contador: adiciona 1 ao valor do contador • i--; ou --i;: • Se colocado sozinho em uma linha, equivale ao comando: i = i - 1; • No caso de contador: subtrai 1 do valor do contador • Para o caso de existir mais de um comando na mesma linha em que estes operadores, a colocação de “++” (ou “--”) antes ou depois da variável define a ordem em que as operações serão executadas. Em laços de repetição, deve-se usar “i++” ou “i—”.
Observação: Novos Operadores em Java • Existem ainda operadores em Java para outras operações aritméticas (sejam i e b duas variáveis): • i+=b; • Equivale ao comando: i = i + b; • i-=b; • Equivale ao comando: i = i - b; • i*=b; • Equivale ao comando: i = i * b; • i/=b; • Equivale ao comando: i = i / b; • Estes operadores são menos utilizados, mas i++; e i--; são muito comuns na programação em Java!
Ex. 1 – Solução em Java import java.io.*; import java.util.*; public class resultado { public static void main(String[] args) throws FileNotFoundException { String linha, arquivo="resultado.txt"; Scanner sc = new Scanner(new File(arquivo)); int aprovados = 0, total = 0; while ( sc.hasNext() ) { total = total + 1; //computa o numero de alunos linha = sc.nextLine() ; if ( linha.endsWith("aprovado") ){ aprovados = aprovados + 1; } }
Ex. 1 – Solução em Java System.out.println("número de alunos matriculados: " + total); System.out.println("número de alunos aprovados: " + aprovados); System.out.println("número de alunos reprovados: " + (total-aprovados)); }//fim do main }//fim da classe
Ex. 2 – Solução em Java import java.util.*; public class fibonacci { public static void main (String[] args) { Scanner s = new Scanner(System.in); int n=0, a=1, b=1, cont=2, prox=0; System.out.print("Entre n: "); n = s.nextInt(); if ( n==1 || n==2 ) System.out.println( "F("+n+")="+b ); else { while ( cont != n ) { prox = a + b; a = b; b = prox; cont = cont + 1; } }
Ex. 2 – Solução em Java System.out.println("F("+n+")="+b); }//fim do main }// fim da classe
Ex. 3 – Solução em Java import java.util.*; public class cuboXsoma { public static void main (String[] args) { Scanner s = new Scanner(System.in); int n, soma, k, i; boolean achou=false; // achou o valor de k? System.out.print("Entre n: "); n = s.nextInt(); int cubo = n*n*n; //soma == cubo economiza operações comparado com //soma == n*n*n no condicional abaixo
Ex. 3 – Solução em Java k=1; //primero ímpar while ( !achou ) {// enquanto não achou i=0; soma = 0; while ( i < 2*n ) { // avalia k + (k+2) + ...+(k + 2(n-1)) soma = soma + ( k + i ); i = i+2; } if (soma == cubo) { achou = true;} else {k = k+2;} // tome o próximo ímpar } System.out.println("k = " + k); }//fim do main }fim da classe
Exercício Resolvido Jogo de Dados Implemente um jogo de dados que: • O jogador inicie o jogo com R$ 100,00 • A cada jogada, o jogador jogue dois dados • Se a soma dos números dos dados for 7 ou 11, o jogador recebe o dobro do que tenha apostado no momento • Se a soma dos números não for 7 ou 11, o jogador perde R$ 20,00 • O jogo acaba quando o saldo do jogador for menor ou igual a zero. Ou então quando o jogador decidir parar • Ao final, escreva o total de dinheiro que o jogador tem, e quantas vezes ele ganhou e quantas vezes perdeu no jogo
Exercício Resolvido Jogo de Dados – Pseudocódigo Algoritmo JogoDeDados início real: dinheiro, aposta; inteiro: dado1, dado2, soma, numVitoria, numDerrota; string: continua; dinheiro 100,00; numVitoria = 0; numDerrota = 0; escreva( “Deseja jogar?” ); leia ( continua );
Exercício Resolvido Jogo de Dados – Pseudocódigo enquanto ( (continua = “S”) (dinheiro > 0) ) faça leia ( aposta ); dado1 randomico(1..6); dado2randomico(1..6); soma dado1 + dado2; se ( (soma = 7) (soma = 11) ) então numVitoria numVitoria + 1; dinheiro dinheiro + 2*aposta; senão numDerrota numDerrota + 1; dinheiro dinheiro - 20; escreva( “Deseja jogar?” ); leia ( continua ); fimenquanto
Exercício Resolvido Jogo de Dados – Pseudocódigo escreva( numVitoria ); escreva( numDerrota ); escreva( dinheiro ); fimalgoritmo
Exercício Resolvido Jogo de Dados – Solução em Java import java.util.*; public class JogoDados { public static void main(String[] args) { double dinheiro, aposta; int dado1, dado2, soma, numVitoria, numDerrota; String continua = null; dinheiro = 100.00; numVitoria = 0; numDerrota = 0; Scanner s = new Scanner(System.in); Scanner n = new Scanner(System.in); System.out.print("Deseja jogar? (s/n)"); continua = s.nextLine();
Exercício Resolvido Jogo de Dados – Solução em Java while ( continua.equals("s") && dinheiro > 0 ) { System.out.print("Digite sua aposta: "); aposta = n.nextDouble(); Random num = new Random(); dado1 = num.nextInt( 5 ) + 1; dado2 = num.nextInt( 5 ) + 1; soma = dado1 + dado2; System.out.print(" Dado 1 = " + dado1); System.out.println(" Dado 2 = " + dado2);
Exercício Resolvido Jogo de Dados – Solução em Java if ( soma == 7 || soma == 11 ){ numVitoria = numVitoria + 1; dinheiro = dinheiro + 2*aposta; System.out.println("Vitorias = " + numVitoria); System.out.println(" Dinheiro = " + dinheiro); }// fim if else{ numDerrota = numDerrota + 1; dinheiro = dinheiro - 20; System.out.println("Derrotas = " + numDerrota); System.out.println("Dinheiro="+dinheiro); }//fim else System.out.print("Deseja jogar? (s/n)"); continua = s.nextLine(); } //fim while } // fim método } // fim da classe
Estruturas de Repetição • Estruturas de repetição: • Estrutura enquanto (while) • Estrutura repita (do while) • Estrutura para (for)
Estrutura de Repetição REPITA • Para realizar a repetição com teste no final deve ser utilizado a estrutura repita, que permite uma ação (ou bloco) ser executada enquanto uma determina condição seja verdadeira. • Exemplo: soma nota, enquanto número de notas for menor que 10. • O corpo da estrutura repita pode ser uma instrução única, ou um bloco de comandos Repita bloco V F
Bloco deExecução Estrutura de Repetição REPITA repita Pseudocódigo repita <bloco> enquanto <condição>; enquanto condição ? V F
Ex. 1 – Números de Fibonacci Reescrevendo a solução para números de Fibonacci 1. Dado n; 2. se n=1 ou n=2, então responda “F(n)=1”; 3. senão, tome i igual a 2 e faça 3.2. i ← i+1; 3.3. F(i) ← F(i-1) + F(i-2); 3.4. se i<n então volte para 3.2; 4. responda “F(n)=” F(i). Obs: Se n>2 então as linhas 3.2, 3.3 e 3.4 serão executadas pelo menos uma vez.
Ex. 1 – Números de Fibonacci – Pseudocódigo Algoritmo Fibonacci_v2 inicio inteiro n, a, b, prox, cont; leia (n); a ← b ← 1; se ( n=1 n=2 ) entao inicio escreva (b); fimentao senao