Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação LP: Laboratório de Programação Apontamento 10 Prof. ISVega Abril de 2004 Controle de Execução: Iteração CONTEÚDO 10.1Repetição de Rotas.................. 1 10.2Repetição com Contador.............. 2 Exercícios.......................... 5 10.1 Repetição de Rotas A bifurcação de uma rota também pode ser utilizada para representar o caso onde um determinado trecho deve ser repetido. Duas estruturas de repetição de passos computacionais são comumente encontradas nos programas: repetição com contador e repetição com sentinela. Repetição com contador A estrutura de repetição com contador descreve um padrão de execução de rotas onde um determinado trecho é repetido n vezes. O valor de uma variável especial, conhecida por variável-contador, ou simplesmente contador, é sucessivamente comparado com n; quando o valor do contador se iguala a n, a repetição é encerrada. Desta forma, a condição de parada da repetição é denotada por uma expressão (lógica ou relacional) envolvendo o valor do contador. Repetição com sentinela A estrutura de repetição com sentinela descreve um padrão de execução de rotas onde a repetição de um trecho é controlada por uma 1
condição estabelecida sobre um valor-sentinela. A condição de parada da repetição é denotada por uma expressão (lógica ou relacional) envolvendo o sentinela. 10.2 Repetição com Contador Um típico mapa de execução representando a repetição de uma seqüência de passos de computação controlada por uma expressão envolvendo o valor de uma variávelcontador é mostrado na Figura 10.1. 1) Valor inicial do contador: i 0 c a i++ 3) Atualização do contador: b [ i < n ] 2) Condição de entrada no ciclo. Figura 10.1: Estrutura de um mapa de execução com repetição controlada por contador. O trecho do mapa correspondente à seqüência de passos a serem repetidos também é conhecido por ciclo. No caso da Figura 10.1, ocorrem dentro do ciclo: (i) a avaliação da condição de entrada no ciclo, envolvendo o valor do contador i; caso o valor do contador não tenha atingido o total de repetições: (ii) execução do passo de computação identificado por b, e (iii) atualização do valor do contador i. Em relação à variável-contador, três pontos importantes são destacados neste mapa: abbbbbbbbbbbbbbbbbbbbbbbbbbbc 1) Definição do valor inicial da variávelcontador i: neste caso, o valor inicial do contador i é definido como zero. 2) Condição de entrada no ciclo: valor do contador menor do que o valor limite (denotado por n). d 3) Atualização do contador i: neste caso, fgggggggggggggggggggggggggggh e incrementa-se o valor de i em uma unidade. Copyright c 1998-2004, Dr. Italo S. Vega 10-2
Java: frases de repetição com contador Uma implementação em Java deste mapa segue o padrão descrito pelo seguinte diagrama sintático: CmdFor for ( 1: ValorInicialContador ; 2: 3: CondicaoEntrada AtualizacaoContador ; ) { ComandosDoCiclo ValorInicial } DeclaracaoVariavelContador ExpressaoComando, Atualizacao ExpressaoComando, No caso do mapa proposto, tem-se: // trecho que passa por a for( int i = 0; i < n; i++ ) { // trecho que passa por b Copyright c 1998-2004, Dr. Italo S. Vega 10-3
} // trecho que passa por c Total de repetições do ciclo Em função destes elementos, pode-se determinar a quantidade de repetições do trecho que cruza o passo b. No caso deste mapa, supondo n >= 0, o trecho será repetido n vezes. Exemplo 10.1 A escrita do valor "b" no monitor do computador por três vezes, pode ser representada pelo mapa apresentado na Figura 10.2. 1) Valor inicial do contador: main i 0 i++ 3) Atualização do contador: [ i < 3 ] System.out.println( b ) 2) Condição de entrada no ciclo. Figura 10.2: Descrição de uma computação que mostra três vezes o valor "b" no monitor. Em termos de Java, o método poderia ser escrito como: public class Repetidor { public void repetirb { for( int i = 0; i < 3; i++ ) { System.out.println( "b" ); } } } Esta codificação faz uso da variável-contador i, que inicia o ciclo com valor 0. Quando o valor desta variável for igual a 3, o ciclo de passos é encerrado e a computação termina. O ciclo contém dois passos: (1) apresentação do valor b e (2) incremento do valor da variável-contador i. Copyright c 1998-2004, Dr. Italo S. Vega 10-4
EXERCÍCIOS 10.1 REPETIÇÃO SIMPLES Tarefa 10.1.1 Crie o projeto ex10.1. Tarefa 10.1.2 Crie a classe Repetidor, conforme mostrado no exemplo 10.2 SOMATÓRIA DE n NÚMEROS Considere o problema de calcular a soma dos primeiros n números, onde o valor de n é estabelecido pelo usuário no início da execução da computação: Σi : 1..n = 1 + 2 +... + n. Tarefa 10.2.1 Proponha um mapa contendo os passos de uma computação que resulte no cálculo desta somatória de números. Tarefa 10.2.2 Somatoria: Refaça o mapa proposto acrescentando os contextos Intervalo e Intervalo contém uma variável n que armazena o limite superior do intervalo. Somatoria oferece o método calcular():int, que retorna a somatória dos números do intervalo 1.. s.n, sendo s uma referência para um objeto da classe Intervalo. Tarefa 10.2.3 Crie o projeto ex10.2. Tarefa 10.2.4 Crie as classes Intervalo e Somatoria, conforme o mapa de execução elaborado anteriormente. Tarefa 10.2.5 Crie os objetos s:intervalo e f:somatoria. Faça f se referir ao objeto s. Envie a mensagem s.mudarsuperior(10) seguida da mensagem f.calcular(). O resultado corresponde Σi : 1..10 = 1 + 2 +... + 10? Tarefa 10.2.6 Preencha a seguinte tabela com a ajuda do programa: n 20 30 100 Somatória Tarefa 10.2.7 Qual o resultado da computação quando n = 10? Como você analisa tal situação? Tarefa 10.2.8 Altere o mapa de modo a mostrar, também, a média destes primeiros n números. Estes passos devem estar no contexto Somatoria. Tarefa 10.2.9 Altere a implementação em Java, de modo a obter-se o efeito descrito por este novo mapa. Quais os resultados da aplicação quando o usuário digita Copyright c 1998-2004, Dr. Italo S. Vega 10-5
10 para o valor de n? São os mesmos valores mostrados na execução da tarefa anterior? Tarefa 10.2.10 Qual mensagem é emitida pelo compilador sobre a variávelcontador i, caso o método de cálculo da média contenha: // Passos iniciais for( int i = 1; i <= s.n; i++ ) { // Acumulo a somatória do i-ésimo número // na variável "somatoria". } // Mostro o total da somatória System.out.println( "Media= " + (somatoria/i) ); // Passos complementares Qual alteração faria este trecho de código compilar e produzir o resultado correto? 10.3 SOMATÓRIA DOS NÚMEROS DE UM INTERVALO Considere o problema de calcular a soma dos números de um intervalo: Σi : inferior..superior = inferior + (inferior + 1)... + superior, supondo inferior superior. Tarefa 10.3.1 Proponha um mapa contendo os passos de uma computação que resulte no cálculo desta somatória de números. Tarefa 10.3.2 Somatoria: Refaça o mapa proposto acrescentando os contextos Intervalo e Intervalo armazena nas variáveis inferior:int e superior:int os limites do intervalo de inteiros a serem processados. Somatoria oferece o método calcular():int, que retorna a somatória dos números do intervalo s.inferior.. s.superior, sendo s uma referência para um objeto da classe Intervalo. Tarefa 10.3.3 Crie o projeto ex10.3. Tarefa 10.3.4 Crie as classes Intervalo e Somatoria, conforme o mapa de execução elaborado anteriormente. Tarefa 10.3.5 Crie os objetos s:intervalo e f:somatoria. Faça f se referir ao objeto s. Envie a mensagem s.mudarinferior(1), seguida de s.mudarsuperior(10), seguida da mensagem f.calcular(). O resultado corresponde Σi : 1..10 = 1 + 2 +... + 10? Tarefa 10.3.6 Preencha a seguinte tabela com a ajuda do programa: inferior superior Somatória 1 10 5 10 5 6 6 5 Copyright c 1998-2004, Dr. Italo S. Vega 10-6
Tarefa 10.3.7 Altere o mapa de modo a mostrar, também, a média dos números de um particular intervalo. Tarefa 10.3.8 Altere a implementação em Java, de modo a obter-se o efeito descrito por este novo mapa. Tarefa 10.3.9 Preencha a seguinte tabela com a ajuda do programa: inferior superior Média 1 10 5 10 5 6 10.4 INVESTIMENTO Um investidor fez um investimento de $1000,00, com retorno de 5% aa. O saldo do investimento no final do n-ésimo ano pode ser calculado por: onde: q é o saldo no final do ano n p é o investimento inicial i é a taxa de retorno anual n é o total de anos do investimento q = p(1 + i) n Tarefa 10.4.1 Assumindo que todo o retorno é reinvestido no final de cada ano, proponha um mapa de execução que calcule e mostre o saldo em conta no final de cada ano, durante os primeiros n anos. Tarefa 10.4.2 Refaça o mapa proposto acrescentando os contextos AplicacaoFinaceira e Investidor: Investidor armazena na variável p:double o valor do investimento, e na variável n, o total de anos do investimento. A armazenagem deve ser feita pela execução do método aplicar(novop:double, novon:double):void. AplicacaoFinaceira oferece o método calcular():double, que retorna o valor do saldo i.p ao final do i.n anos de investimento, supondo que i é uma referência para um objeto da classe Investidor. A taxa de retorno, necessária para o cálculo do saldo, deve ser armazenada na variável i:double. Tarefa 10.4.3 Crie o projeto ex10.4. Tarefa 10.4.4 Crie as classes Investidor e AplicacaoFinaceira, conforme o mapa de execução elaborado anteriormente. Copyright c 1998-2004, Dr. Italo S. Vega 10-7
OBS: x y pode ser calculado, em Java, com: Math.pow(x,y). Tarefa 10.4.5 Crie os objetos ze:investidor e a:aplicacaofinanceira. Faça a] se referir ao objeto [[ze. Envie a mensagem ze.aplicar(1000.00, 10), seguida de a.calcular(). Qual o resultado obtido? Tarefa 10.4.6 Preencha a seguinte tabela: p n i q $100.0 1 1% $1000.0 2 5% $ 100.0 1 1% $100.0 2 5% Faça uma análise dos resultados obtidos. 10.5 PADRÕES DE DESENHO Para cada um dos seguintes padrões de estrelas, proponha um mapa de execução, contextos de execução apropriados e a respectiva implementação em Java, de modo que os padrões sejam apresentados no monitor do computador. (Inspirado em Lewis & Loftus, Java Software Solutions: Foundations of Program Design, 2001, Addison-Wesley.) Tarefa 10.5.1 Tarefa 10.5.2 Tarefa 10.5.3 Copyright c 1998-2004, Dr. Italo S. Vega 10-8
10.6 PADRÕES DE DESENHO Para cada um dos seguintes padrões de estrelas, proponha um mapa de execução e a respectiva codificação, de modo que os padrões sejam apresentados no monitor do computador. (Inspirado em Lewis & Loftus, Java Software Solutions: Foundations of Program Design, 2001, Addison-Wesley.) Tarefa 10.6.1 Tarefa 10.6.2 Tarefa 10.6.3 Copyright c 1998-2004, Dr. Italo S. Vega 10-9
Copyright c 1998-2004, Dr. Italo S. Vega 10-10