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.
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.
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.
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.
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.
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.
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.
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
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.
Canal: Node Studio Treinamentos
Site: Manual do VisuAlg 3.0
Site: visualgo : Visualização de algoritmos de ordenação de vetores