ICC Turma D - 2/04

Prática 10

1- Comandos de repetição

Na prática anterior, aprendemos a usar contadores. No jargão de programação, como visto, contador é uma variável empregada para contar repetições na execução de algum trecho de programa. Na aula teórica seguinte, vimos como contadores podem ser úteis para controlar a condição de saída do comando de repetição while, cuja sintaxe é
while( condição de saída )
{
    // cláusula de repetição
}
E cuja semântica é:
Se a expressão lógica na condição de saída do while resultar true, a cláusula de repetição é executada, após o que o fluxo de execução retorna  ao início do comando (formando um "laço" -- loop -- no fluxograma), para mais uma avaliação da condição de saída; se a condição de saída resultar false, a execução do while encerra.
Algum dado na condição de saída do while, portanto, precisa estar sujeito a alteração dentro da cláusula de repetição, para que a instância do while possa ser útil, sem entrar em loop infinito. Se a condição de saída estiver sendo controlada por um contador, esta alteração seria feita pelo comando que atualiza o contador. Se voce não se lembra, vimos que o loop infinito é a situação em que o fluxo de execução do programa nunca sai do laço.

Sempre que possível, a saída de um comando de repetição deve ser controlada por um contador, dado que esta é a forma mais simples de se evitar loop infinito durante a execução. Para os casos em que seja possível controlar a saída da repetição com um contador, vimos também como "juntar" o comando de repetição, a inicialização e a atualização do contador num só comando, o for, cuja sintaxe é

for( inicialização do contadorcondição de saída ; atualização do contador )
{
    // cláusula de repetição
}

Nesta prática, iremos nos concentrar em exemplos de programas que usam comandos de repetição.  Exemplos que progridam da banalidade à necessidade -- natural em linguagens de programação estruturadas -- de estrutura para o armazenamento interno dos dados. Para então conhecermos a estrutura de dados mais simples possível -- a das listas --  na forma como é implementada na maioria dessas linguagens -- javascript inclusive.


Exercício 10.1

Faça uma página web que:


2- A classe Array (vetores, listas)      

Quando um programador deseja que seu programa agrupe, enquanto executa, valores cujos significados guardam alguma relação entre si, a maneira mais simples para fazer isso será numa estrutura de dados que podemos chamar de lista (na metalinguagem, uma lista é às vezes também chamada de vetor). Em inglês, array. Nas linguagens de programação, uma lista será um agregado de dados ao qual estará associado um nome, diversos itens, também chamados elementos, e uma enumeração das posições que esses elementos ocupam neste agregado.

Em linguagens de programação baseadas no conceito de objetos, como o javascript, a criação de uma lista será feita por uma declaração que envolve uma espécie de molde. Na metalinguagem apropriada a linguagens orientada a objetos, este processo (de se construir algo baseado em um molde) é chamado instanciação. Esses moldes, por sua vez, são chamados classes, e as instâncias de uma determinada classe são chamadas objetos da classe. Dentre os exemplos de classes na linguagem javascript podemos citar Array(), que instancia listas, e Window(), que instancia janelas (do navegador).

Assim, um programador de javascript pode fazer com que seu script crie uma (nova) janela do navegador através de uma declaração que instancia a classe Window(). Da mesma forma que pode criar uma lista, instanciando a classe Array(). A vantagem dos objetos "pré-fabricados" em classes está em podermos aplicar-lhes métodos, isto é, qualquer função pré-definida para a sua classe.

A sintaxe para se instanciar classes, ou seja, para se declarar objetos em javascript, foi descrita na tabela-resumo do trabalho 6, e é a seguinte:

Declarando objetos

[var] ______ = new  ________(_________)
 
[ opcional ] 
nome da
variável (objeto)
nome
da classe
  parâmetros
para o objeto
Exemplo: declaração de uma lista (array):

[var] minha_primeira_lista = new Array( 30 )

Observe, atentamente, o seguinte:

Acessando elementos de um array

O método da classe array que permite acessar um dado elemento tem como sintaxe um par de colchetes, imediatamente após o nome do array. Entre os colchetes, se indica a posição do elemento desejado.

_________[__________]
 Acesso a um
elemento de um array
nome
do array
  posição do
elemento no array

A numeração das posições de um array é dada por um numeral, de tipo inteiro, não negativo. A primeira posição do array é indicada pelo numeral zero. As posições do array, numeradas a partir de zero, serão ocupadas por elementos conforme atribuições que forem sendo executadas, usando-se o método para acessar posições.  Um exemplo de trecho de código que segue as explicações acima poderia ser:

list = new Array( );
list[0] = 'Jose';
list[1] = 'Maria';
list[2] = 'João'
 
Importante: ao se tentar acessar uma posição ainda não preenchida, a ausência de dado ali contido será sinalizada pela constante javascript null

O uso de arrays em comandos de repetição controlados por contadores é uma combinação versátil e bastante útil na programação estruturada. Em seguida, faremos um exemplo bem simples, mas que está no cerne de praticamente qualquer aplicação de banco de dados.  Neste exemplo, faremos uso de um outro método da classe Array(), muito útil, explicado nos comentários do código fonte (em vermelho), abaixo.

2.1 Exemplo de script contendo for e array

Vamos completar um script apresentado no terceiro exemplo da aula passada. Digamos que  a página se destina a listar os nomes dos alunos da sua turma de ICC em ordem alfabética, independentemente da ordem em que os nomes forem fornecidos pelo usuário, que será solicitado a fornece-los através de prompts. O código a ser completado seria o seguinte:

<html>
<head><title>Listas em ordem alfabética</title></head>
<body>
<h2><center>Lista alfabética</center></h2>
<script language="javascript">

    var lista = new Array( );
    var x = prompt('Digite o primeiro nome da lista');
    for( n = 0 ; x != null ; n++ )
    {
        lista[n] = x;
        x = prompt('Novo nome, ou \'Cancel\' para encerrar lista
');
    }
    lista.sort(); 
// método .sort() ordena os elementos
   
               // de uma lista (em ordem alfabética)
    // Complete o script com comandos que façam os nomes
    // do vetor (já ordenado) aparecerem na página
</script>
</body>
</html>


Voce agora está pronto para fazer o


Exercício 10.2

Faça uma página web que:

       2.2 scripts contendo acumuladores

Outro uso versátil de variáveis em comandos de repetição é uma generalização do conceito de contador: são os acumuladores. A cada atualização, ao invés de adicionar 1 (ou um outro valor inteiro fixo), um acumulador adiciona, à soma dos termos anteriores, o termo seguinte cujo valor não é de antemão conhecido pelo programador.

Para acumular a soma dos números de uma lista que o usuário estaria fornecendo através de repetidas chamadas à função prompt(), por exemplo, enquanto esses dados vão sendo colocados em subsequentes posições de um array, a variável soma poderia ser usada como acumulador, conforme trecho de script abaixo

    ...  
    soma = 0;
    var x = prompt('Digite o primeiro número da lista');

    for( n = 0 ; x != null ; n++ )
    {
        lista[n] = x;
        soma = soma +
Number(x);
        x = prompt('Novo número, ou \'Cancel\' para encerrar');
    }
    ...

Oberve que, na codificação de dados textuais para funções que interagem diretamente com o sistema operacional (e não com o interpretador html), como a função prompt() no exemplo acima, a sequência de escape para caracteres especiais é formada pela barra invertida, seguida do caracter especial (no caso acima, o caracter que delimitaria o fim do literal, a aspa simples ' ).

Voce agora está pronto para fazer o


Exercício 10.2

Faça uma página web que: