Pular para o conteúdo

Vetores no Portugol

Quando começamos a programar, é comum guardar um valor por vez em variáveis simples, como idade, nota ou nome.

Isso funciona bem quando temos poucos dados. Mas, quando precisamos guardar vários valores parecidos, usar uma variável diferente para cada um deles começa a deixar o programa mais confuso.

É exatamente nesse tipo de situação que os vetores se tornam úteis.

Um vetor é uma estrutura que permite armazenar vários valores do mesmo tipo usando um único nome.

Em vez de criar variáveis como nota1, nota2, nota3 e nota4, podemos criar um vetor chamado notas.

Cada valor fica guardado em uma posição desse vetor.

Veja a ideia:

nota1 = 7
nota2 = 8
nota3 = 6
nota4 = 9

Com vetor, podemos organizar assim:

notas[0] = 7
notas[1] = 8
notas[2] = 6
notas[3] = 9

Perceba que o nome continua sendo notas, mas agora usamos uma posição para indicar qual valor queremos acessar.

Usamos vetores quando precisamos trabalhar com vários dados do mesmo tipo e que pertencem ao mesmo conjunto.

Alguns exemplos:

  • notas de uma turma
  • pontuações de várias partidas
  • temperaturas medidas em vários dias
  • quantidade de passos registrada durante a semana

Sem vetor, o programa pode ficar assim:

inteiro nota1
inteiro nota2
inteiro nota3
inteiro nota4

Com vetor, a organização melhora:

inteiro notas[4]

Isso facilita tanto a leitura do programa quanto o uso de repetições para percorrer todos os valores.

No Portugol, declaramos um vetor informando:

  1. o tipo dos valores
  2. o nome do vetor
  3. a quantidade de posições entre colchetes

Exemplos:

inteiro idades[5]
real notas[4]
cadeia nomes[10]

Nesses exemplos:

  • idades guarda 5 números inteiros
  • notas guarda 4 números reais
  • nomes guarda 10 cadeias de texto

Todos os valores dentro de um mesmo vetor devem ser do mesmo tipo.

Cada valor do vetor fica em uma posição.

No nosso material, vamos usar a regra mais comum em programação:

a primeira posição de um vetor é a posição 0

Por isso, um vetor com 5 elementos possui estas posições:

0, 1, 2, 3 e 4

Veja um exemplo:

inteiro fases[5]
fases[0] = 12
fases[1] = 15
fases[2] = 18
fases[3] = 10
fases[4] = 20

Podemos visualizar assim:

PosiçãoValor
012
115
218
310
420

Perceba que a quantidade de elementos é 5, mas a última posição é 4.

Quando ainda estamos aprendendo vetores, é importante entender que cada posição pode receber um valor de forma manual.

Veja este exemplo:

programa
{
funcao inicio()
{
inteiro pontos[4]
pontos[0] = 120
pontos[1] = 90
pontos[2] = 150
pontos[3] = 110
}
}

Nesse caso, o programa guarda um valor em cada posição do vetor pontos.

Também podemos fazer isso com leia:

programa
{
funcao inicio()
{
inteiro idades[3]
escreva("Digite a primeira idade: ")
leia(idades[0])
escreva("Digite a segunda idade: ")
leia(idades[1])
escreva("Digite a terceira idade: ")
leia(idades[2])
}
}

Esse tipo de preenchimento ajuda a entender como o acesso por posição funciona.

Depois de preencher o vetor, também podemos mostrar cada valor manualmente.

programa
{
funcao inicio()
{
inteiro notas[4]
notas[0] = 7
notas[1] = 8
notas[2] = 6
notas[3] = 9
escreva("Nota 1: ", notas[0], "\n")
escreva("Nota 2: ", notas[1], "\n")
escreva("Nota 3: ", notas[2], "\n")
escreva("Nota 4: ", notas[3], "\n")
}
}

Isso mostra que podemos usar o valor de cada posição como usamos qualquer outra variável.

Quando o vetor possui muitas posições, preencher manualmente cada uma delas dá muito trabalho.

Nesses casos, usamos para para repetir a leitura.

programa
{
funcao inicio()
{
inteiro numeros[5]
para (inteiro i = 0; i < 5; i++) {
escreva("Digite o número da posição ", i, ": ")
leia(numeros[i])
}
}
}

Vamos analisar com calma:

  • i = 0 faz o contador começar na primeira posição
  • i < 5 faz o laço repetir enquanto ainda houver posições válidas
  • i++ avança para a próxima posição

Dentro do laço, usamos numeros[i], ou seja, a posição atual do vetor.

Percorrer um vetor significa passar por todas as suas posições, uma por uma.

Isso pode ser feito com para.

programa
{
funcao inicio()
{
inteiro numeros[5]
numeros[0] = 10
numeros[1] = 20
numeros[2] = 30
numeros[3] = 40
numeros[4] = 50
para (inteiro i = 0; i < 5; i++) {
escreva("Posição ", i, ": ", numeros[i], "\n")
}
}
}

Nesse exemplo, o programa visita todas as posições do vetor e mostra o valor guardado em cada uma delas.

Agora vamos usar vetores para resolver problemas comuns.

Quando queremos somar todos os valores de um vetor, usamos uma variável acumuladora.

Ela costuma começar com 0 e vai recebendo cada valor do vetor ao longo do percurso.

programa
{
funcao inicio()
{
inteiro pontos[4]
inteiro soma = 0
pontos[0] = 100
pontos[1] = 80
pontos[2] = 120
pontos[3] = 90
para (inteiro i = 0; i < 4; i++) {
soma = soma + pontos[i]
}
escreva("Soma total: ", soma)
}
}

Nesse caso, a variável soma vai recebendo:

  1. 0 + 100
  2. depois 100 + 80
  3. depois 180 + 120
  4. depois 300 + 90

No final, ela guarda o total.

Para calcular a média, primeiro somamos todos os valores. Depois, dividimos essa soma pela quantidade de elementos.

programa
{
funcao inicio()
{
real notas[4]
real soma = 0
real media
notas[0] = 7.5
notas[1] = 8.0
notas[2] = 6.5
notas[3] = 9.0
para (inteiro i = 0; i < 4; i++) {
soma = soma + notas[i]
}
media = soma / 4
escreva("Média: ", media)
}
}

Perceba que usamos 4 porque esse vetor possui quatro elementos.

Também podemos usar se e senao enquanto percorremos o vetor.

Isso serve para fazer contagens, comparações e verificações.

Veja um exemplo que conta quantos números são positivos:

programa
{
funcao inicio()
{
inteiro numeros[5]
inteiro positivos = 0
numeros[0] = 3
numeros[1] = -2
numeros[2] = 7
numeros[3] = 0
numeros[4] = 5
para (inteiro i = 0; i < 5; i++) {
se (numeros[i] > 0) {
positivos = positivos + 1
}
}
escreva("Quantidade de positivos: ", positivos)
}
}

Agora veja um exemplo para descobrir o maior valor:

programa
{
funcao inicio()
{
inteiro numeros[5]
inteiro maior
numeros[0] = 12
numeros[1] = 8
numeros[2] = 25
numeros[3] = 10
numeros[4] = 17
maior = numeros[0]
para (inteiro i = 1; i < 5; i++) {
se (numeros[i] > maior) {
maior = numeros[i]
}
}
escreva("Maior valor: ", maior)
}
}

Perceba a ideia importante:

  • primeiro assumimos que o maior valor é o da primeira posição
  • depois comparamos os demais elementos com ele
  • se encontrarmos um valor maior, atualizamos a variável maior

Também podemos fazer classificações simples, como verificar se um número é par ou ímpar:

programa
{
funcao inicio()
{
inteiro numeros[4]
numeros[0] = 6
numeros[1] = 9
numeros[2] = 12
numeros[3] = 7
para (inteiro i = 0; i < 4; i++) {
se (numeros[i] % 2 == 0) {
escreva(numeros[i], " é par\n")
} senao {
escreva(numeros[i], " é ímpar\n")
}
}
}
}

Ao trabalhar com vetores, alguns erros aparecem com muita frequência.

Se um vetor tem 5 elementos, as posições vão de 0 até 4.

Ou seja, a quantidade é 5, mas a última posição não é 5.

Quando usamos para, o mais comum é começar assim:

para (inteiro i = 0; i < 5; i++) {

Se você começar no 1, a posição 0 fica sem ser usada.

Se o vetor tem 4 elementos, tentar acessar vetor[4] estará fora do limite.

Isso acontece porque as posições válidas seriam:

0, 1, 2 e 3

Quando vamos somar valores, a variável acumuladora deve começar com 0.

inteiro soma = 0

Se isso não for feito, o resultado da soma pode ficar incorreto.

Antes de mostrar, somar ou comparar elementos, o vetor precisa estar preenchido.

Por isso, normalmente o programa segue esta ordem:

  1. declara o vetor
  2. preenche as posições
  3. percorre o vetor para mostrar, somar ou comparar

Dentro de um percurso, é importante usar sempre a posição atual do vetor.

Por exemplo:

soma = soma + numeros[i]

Se você esquecer o [i], o programa não estará trabalhando com o elemento esperado em cada volta do laço.