Aula 8 - Para e Vetores

Estrutura de controle de fluxo de execução com laços contados, Para .. faça, e estrura de dados homogênea, do tipo Vetor, capaz de armazenar vários valores.

1 - Laços Contados ( Para ... faça )

Os laços contados são úteis quando se conhece previamente o número exato de vezes que se deseja executar um determinado conjunto de comandos. Então, este tipo de laço, nada mais é que uma estrutura dotada de mecanismos para contar o número de vezes que o corpo do laço (ou seja, o comando composto em seu interior), é executado.

No diagrama de blocos, a estrutura para instrução Para é representado pela imagem:

Esta estrutura repete uma sequência de comandos um determinado número de vezes, e é representada pela seguinte sintaxe no VisuAlg:

para [variável] de [valor-inicial] ate [valor-limite] [passo incremento] faca

sequência-de-comandos

fimpara

[variável]: É a variável contadora que controla o número de repetições do laço. Na versão atual, deve ser necessariamente uma variável do tipo inteiro, como todas as expressões deste comando.

[valor-inicial]: É uma expressão que especifica o valor de inicialização da variável contadora antes da primeira repetição do laço.

[valor-limite]: É uma expressão que especifica o valor máximo que a variável contadora pode alcançar.

[incremento]: É opcional. Quando presente, precedida pela palavra passo, é uma expressão que especifica o incremento que será acrescentado à variável contadora em cada repetição do laço. Quando esta opção não é utilizada, o valor padrão de incremento é 1.

Vale a pena ter em conta, que também é possível especificar valores negativos para o incremento. Por outro lado, se a avaliação da expressão incremento resultar em valor nulo, a execução do algoritmo será interrompida, com a impressão de uma mensagem de erro.

Fimpara: Indica o fim da sequência de comandos a serem repetidos. Cada vez que o programa chega neste ponto, é acrescentado à variável contadora o valor de incremento, e comparado a valor-limite. Se for menor ou igual (ou maior ou igual, quando incremento for negativo), a sequência de comandos será executada mais uma vez; caso contrário, a execução prosseguirá a partir do primeiro comando que esteja após o fimpara.

A semântica do laço contado é a seguinte: no início da execução da construção o valor início é atribuído à variável var. A seguir, o valor da variável var é comparado com o valor final. Se var for maior que final, então o comando composto não é executado e a execução do algoritmo prossegue pelo primeiro comando seguinte ao comando_único ou à palavra-reservada fimpara, que delimita o final da construção.

Por outro lado, se o valor de var for menor ou igual a final, então o comando composto no interior da construção é executado e, ao final do mesmo a variável var é incrementada em 1 (uma) unidade.

Feito isso, retorna-se à comparação entre var e final e repete-se o processo até que var tenha um valor maior que final, quando o laço é finalizado e a execução do algoritmo prossegue pela instrução imediatamente seguinte à construção.

Exemplo 1:

Observe e execute no VisuAlg o algoritmo que escreve a tabuada de um número específico até 10 vezes:

algoritmo "Tabuada_PARA"
var

i, tab : inteiro

inicio

escreval ("Tabuada")
escreval ("digite o número da tabuada")
leia (tab)
para i de 1 ate 10 faca

escreval (i, " X ", tab, " = ", i*tab)

fimpara

fimalgoritmo

Veja uma possível saída do algoritmo:

Observe no seguinte GIF, o loop acontecendo dentro do para..fimpara um número determinado de vezes que no caso é 10. Note também a variável contadora i sendo incrementada a cada vez que o algoritmo passa pelo para até que chegue em 11 (não cumprindo a condição de execução ou entrada), e termine a sua execução.

Escute essa aula: Laços Contados ( Para ... faça )

Exemplo 2:

Caso queira controlar o número de laços que o algoritmo irá realizar é só utilizar uma variável e atualizá-la dentro do programa.

Observe e execute no VisuAlg o algoritmo que escreve a tabuada de um número específico um determinado número de vezes:

algoritmo "Tabuada_PARA2"

var

i, tab, num : inteiro

inicio

escreval ("Tabuada")
escreval ("digite o número da tabuada")
leia (tab)
escreval ("deseja executar a tabuada de ", tab, " até quantas vezes?")
leia (num)
para i de 1 ate num faca

escreval (i, " X ", tab, " = ", i*tab)

fimpara

fimalgoritmo

Veja uma possível saída do algoritmo:

Observe que neste exemplo, o para foi executado de 1 até o valor armazenado na variável num, que neste caso foi 15.

Escute essa aula: Laços Contados ( Para ... faça ) Exemplo 2

Para Decrescente:

Existe uma condição especial em que a contagem deve ser de forma decrescente, onde o valor da variável é decrementado em uma unidade.

Exemplo 3:

Observe e execute no VisuAlg o algoritmo que faz uma contagem regressiva:

algoritmo "Numeros de 10 a 1"

var

j: inteiro

inicio

para j de 10 ate 1 passo -1 faca

escreva (j:3)

fimpara

fimalgoritmo

Veja a saída do algoritmo:

Observe que para fazer o decremento é necessario utilizar o "passo -1" pois por padrão o para...faça utiliza um incremento de +1.

Veja no seguinte GIF o loop acontecendo e a variável j sendo decrementada de 10 até alcançar o valor de zero e o loop ser terminado.

Escute essa aula: Laços Contados ( Para ... faça ) Decrescente

2 - Vetores

Vetores são um tipo de Estruturas de dados homogêneas: As estruturas de dados homogêneas permitem agrupar diversas informações dentro de uma mesma variável. Este agrupamento ocorrerá obedecendo sempre ao mesmo tipo de dado, e é por esta razão que estas estruturas são chamadas homogêneas.

A utilização deste tipo de estrutura de dados recebe diversos nomes, como: variáveis indexadas, variáveis compostas, variáveis subscritas, arranjos, vetores, matrizes, tabelas em memória ou arrays. Os nomes mais usados e que utilizaremos para estruturas homogêneas são: matrizes e vetores (matriz de uma linha e várias colunas).

Vetores:

Este tipo de estrutura em particular é também denominado por profissionais da área como matrizes unidimensionais. Sua utilização mais comum está vinculada à criação de tabelas.

Caracteriza-se por ser definida uma única variável vinculada e dimensionada com um determinado tamanho. A dimensão de uma matriz é constituída por constantes inteiras e positivas. Os nomes dados às matrizes seguem as mesmas regras de nomes utilizados para indicar as variáveis simples.

A sintaxe do comando de definição/declaração de vetores no VisuAlg é a seguinte:

Var

Nome_do_vetor:vetor[coluna_inicial..coluna_final] de Tipo_de_dados

Exemplo:

Var

vet:vetor[1..5] de inteiro

Neste caso, estamos criando um vetor que possui 5 posições, imagine como se cada posição fosse um vagão de trem e cada vagão fosse capaz de armazenar um valor do tipo declarado, como se fosse uma variável normal.

Observe o seguinte GIF demostrando um vetor de 5 posições de inteiros, armazenando valores de inteiros em suas posições.

Escute essa aula: Vetores

Operações Básicas com Vetores

Do mesmo modo que acontece com variáveis simples, também é possível operar com variáveis indexadas (matrizes). Contudo, não é possível operar diretamente com o conjunto completo, mas com cada um de seus componentes isoladamente.

O acesso individual a cada componente de um vetor é realizado pela especificação de sua posição na mesma por meio do seu índice. No exemplo anterior foi definida uma variável vet capaz de armazenar 5 números inteiros. Para acessar um elemento deste vetor, deve-se fornecer o nome do mesmo e o índice do componente desejado do vetor (um número de 1 a 5, neste caso).

Por exemplo, vet[1] indica o primeiro elemento do vetor, vet[2] indica o segundo elemento do vetor e vet[5] indica o último elemento do vetor.

Portanto, não é possível operar diretamente sobre vetores como um todo, mas apenas sobre seus componentes, um por vez.

Por exemplo, para somar dois vetores é necessário somar cada um de seus componentes dois a dois. Da mesma forma, as operações de atribuição, leitura e escrita de vetores devem ser feitas elemento a elemento.

Atribuição de vetores:

Na aula sobre as instruções primitivas, o comando de atribuição foi definido como:

nome_da_variável := expressão

No caso de vetores (variáveis indexadas), além do nome da variável, deve-se, necessariamente fornecer também o índice do componente do vetor onde será armazenado o resultado da avaliação da expressão.

Exemplo:
vet[1]:= 15
vet[2]:= 150
vet[5]:= 10

Leitura de Dados de Vetores:

A leitura de um vetor é feita passo a passo, um de seus componentes por vez, usando a mesma sintaxe da instrução primitiva da entrada de dados, onde além do nome da variável, deve ser explicitada a posição do componente lido:

LEIA nome_da_variável [ índice ]

Exemplo:

Leia (vet[1])

Desta forma, seria custoso ler ou atribuir valores ou até mesmo imprimir o conteúdo de um vetor um a um.

Portanto, é utilizado dos laços contados (Para), a fim de efetuar a operação de leitura repetidas vezes, em cada uma delas lendo um determinado componente do vetor.

De fato, esta construção é muito comum quando se opera com vetores, devido à necessidade de se realizar uma mesma operação com os diversos componentes dos mesmos. Na verdade, são raras as situações que se deseja operar isoladamente com um único componente do vetor.

O algoritmo a seguir exemplifica a operação de leitura de um vetor:

Exemplo 1:

algoritmo "exemplo_leitura_de_vetor"

var

vet:vetor[1..10] de inteiro
i : inteiro

inicio

Para i de 1 até 10 faca

leia (vet[i])

fimpara

fimalgoritmo

Veja a saída do algoritmo.

Veja na área das variáveis que as posições do vetor foram preenchidas de acordo com o que foi lido a partir da entrada do usuário.

Observe no seguinte GIF, como as posições do vetor vão sendo preenchidas pelo usuário durante a execução.

Escute essa aula: Vetores - Leitura de Dados

Escrita de Dados de Vetores:

A escrita de um vetor obedece à mesma sintaxe da instrução primitiva de saída de dados, e também vale lembrar, que além do nome do vetor, deve-se também especificar por meio do índice o componente a ser escrito:

Escreva ( nome_da_variavel [ índice ])

O algoritmo a seguir exemplifica a operação de leitura e escrita de um vetor, utilizando a construção Para:

Exemplo 2:

algoritmo "exemplo_escrita_de_vetor"

var

vet:vetor[1..10] de inteiro
i : inteiro

inicio

Para i de 1 ate 10 faca

leia (vet[i])

fimpara
Para i de 1 até 10 faca

escreval(vet[i])

fimpara

fimalgoritmo

Veja que o primeiro para é responsável por fazer a leitura, (preencher) o vetor, o segundo para é responsável por imprimir o conteúdo deste vetor.

Escute essa aula: Vetores - Escrita de Dados

Um exemplo mais interessante é mostrado a seguir, onde um vetor de dez números é lido e guardado no vetor números. Paralelamente, a soma destes números é calculada e mantida na variável soma, que posteriormente é escrita. Este algoritmo foi escrito de maneira amigável para o usuário, pois mostra qual posição do vetor está sendo lida e escrita.

Exemplo 3:

algoritmo "soma_de_vetor"

var

vet:vetor[1..10] de inteiro
i,soma : inteiro

inicio

soma:= 0
Para i de 1 ate 10 faca

escreval ("digite o valor para a posicao: ",i)
leia (vet[i])
soma:= soma+vet[i]

fimpara
Para i de 1 ate 10 faca

escreval("o valor armazenado na posicao: ",i, " é: ",vet[i])

fimpara
escreval ("a soma dos valores do vetor é:", soma)

fimalgoritmo

Escute essa aula: Vetores Exemplo 3

Exemplos de Aplicação de Vetores:

O espectro de aplicação de vetores em algoritmos é muito extenso, mas normalmente os vetores são usados em duas tarefas muito importantes no processamento de dados: pesquisa e classificação.

A pesquisa consiste na verificação da existência de um valor dentro de um vetor. Trocando em miúdos, pesquisar um vetor consiste em procurar dentre seus componentes um determinado valor.

A classificação de um vetor consiste em arranjar seus componentes numa determinada ordem, segundo um critério específico. Por exemplo, este critério pode ser a ordem alfabética de um vetor de dados caractere, ou então, a ordem crescente ou decrescente para um vetor de dados numéricos. Há vários métodos de classificação como o SelectionSort, BubbleSort, MergeSort, InsertSort, dentre outros.

Observe no seguinte GIF um vetor com 10 posições sendo ordenado pelo metodo InsertSort:

O InsertSort se assemelha muito a forma como ordenamos cartas de baralho em nossas mãos: procuramos por uma carta de valor menor e colocamos ela a esquerda da mão.

Escute essa aula: Exemplos de Aplicação de Vetores:

Links Úteis

Canal: Node Studio Treinamentos

Site: Manual do VisuAlg 3.0

Site: visualgo : Visualização de algoritmos de ordenação de vetores

Referências

  • CORMEN, Thomas H. et al. Algoritmos: teoria e prática. Editora Campus, v. 2, p. 296, 2002.
  • FARRER, Harry; BECKER, Christiano Gonçalves. Algoritmos estruturados: programação estruturada de computadores. Rio de Janeiro: Guanabara, 2000.
  • NETO, Benedito; PEREIRA, Diego; FERNANDES, Sabrina. Apostila de Algoritmo - CEP - Centro De Educação Profissional "Tacredo Neves".
  • Manual do VisuAlg 3.0