← Voltar para Disciplinas

tds-lp

Estrutura de Dados — Vetores

Objetivos da aula

Ao final desta aula, o estudante deverá ser capaz de:


1 — O que é um vetor?

Um vetor, também chamado de array, é uma variável composta homogênea de uma dimensão.

Isso significa que um vetor:

Podemos imaginar um vetor como uma gaveta dividida em vários compartimentos numerados. Cada compartimento pode armazenar um valor.

Exemplo

Considere cinco idades:

18, 20, 17, 22, 19

Em vez de declarar cinco variáveis diferentes:

idade1: inteiro
idade2: inteiro
idade3: inteiro
idade4: inteiro
idade5: inteiro

Podemos declarar apenas um vetor:

idades: vetor[1..5] de inteiro

Cada idade será armazenada em uma posição:

Índice12345
Valor1820172219

Assim:

idades[1]

representa o valor 18.

Enquanto:

idades[4]

representa o valor 22.


Características de um vetor


Por que o vetor é uma estrutura de dados?

Porque permite organizar e armazenar um conjunto de informações relacionadas de maneira ordenada.

Sem o vetor, seria necessário criar uma variável diferente para cada informação.

Por exemplo, para armazenar dez notas:

nota1: real
nota2: real
nota3: real
nota4: real
nota5: real
nota6: real
nota7: real
nota8: real
nota9: real
nota10: real

Com um vetor:

notas: vetor[1..10] de real

2 — Diferença entre variável simples e vetor

Variável simplesVetor
Armazena apenas um valorArmazena vários valores
Não utiliza índiceUtiliza índice
Possui apenas uma posiçãoPossui várias posições
Exemplo: idade: inteiroExemplo: idades: vetor[1..5] de inteiro

Exemplo

var
   idade: inteiro
   idades: vetor[1..5] de inteiro

A variável idade armazena apenas um valor.

O vetor idades pode armazenar cinco valores inteiros.


3 — Declaração de um vetor

Para declarar um vetor, precisamos definir:

  1. o nome do vetor;
  2. o intervalo de índices;
  3. o tipo dos valores armazenados.

Sintaxe no VisualG

nomeVetor: vetor[indiceInicial..indiceFinal] de tipo

Exemplos

notas: vetor[1..10] de real
nomes: vetor[1..5] de caractere
idades: vetor[1..20] de inteiro
respostas: vetor[1..10] de logico

No primeiro exemplo:

notas: vetor[1..10] de real

temos:


4 — Índices e posições

Cada elemento do vetor é identificado por um índice.

O índice informa qual posição está sendo acessada.

Exemplo

notas[1] <- 8.5
notas[2] <- 7.0
notas[3] <- 9.5

Nesse caso:

Representação

Índice123
Valor8.57.09.5

Atenção

O índice não é o valor armazenado.

Na instrução:

notas[2] <- 7.0

5 — Limites do vetor

Ao declarar:

numeros: vetor[1..5] de inteiro

as posições válidas são:

1, 2, 3, 4 e 5

Portanto:

numeros[1]
numeros[2]
numeros[5]

são acessos válidos.

Enquanto:

numeros[0]
numeros[6]

são acessos inválidos.

Observação importante

No VisualG, o programador define o índice inicial e final na declaração.

Portanto, é possível declarar:

numeros: vetor[0..4] de inteiro

Nesse caso, as posições válidas seriam:

0, 1, 2, 3 e 4

Nesta disciplina, utilizaremos normalmente vetores iniciados na posição 1.


6 — Atribuição direta de valores

Podemos armazenar um valor diretamente em uma posição.

numeros[1] <- 10
numeros[2] <- 25
numeros[3] <- 8

Também podemos alterar um valor já armazenado:

numeros[2] <- 30

O valor anterior da posição 2 será substituído.

Antes

Índice123
Valor10258

Depois

Índice123
Valor10308

7 — Leitura de valores em um vetor

Normalmente utilizamos uma estrutura de repetição para preencher um vetor.

Exemplo — Ler cinco números inteiros

Algoritmo "leitura_vetor"

Var
   numeros: vetor[1..5] de inteiro
   i: inteiro

Inicio

   // Percorre todas as posições do vetor
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

Fimalgoritmo

Explicação

O comando:

leia(numeros[i])

utiliza o valor de i para indicar a posição que será preenchida.

Durante a repetição:

i = 1 → numeros[1]
i = 2 → numeros[2]
i = 3 → numeros[3]
i = 4 → numeros[4]
i = 5 → numeros[5]

8 — Exibição dos valores

Depois de preencher o vetor, podemos utilizar outro laço para mostrar seus valores.

Algoritmo "exibir_vetor"

Var
   numeros: vetor[1..5] de inteiro
   i: inteiro

Inicio

   // Leitura dos valores
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   escreval("")
   escreval("Valores armazenados:")

   // Exibição dos valores
   para i de 1 ate 5 faca

      escreval("Posição ", i, ": ", numeros[i])

   fimpara

Fimalgoritmo

9 — Percurso em ordem normal e inversa

Um vetor pode ser percorrido em diferentes ordens.

Ordem normal

para i de 1 ate 5 faca
   escreval(numeros[i])
fimpara

Nesse caso, o percurso acontece da primeira até a última posição.

Ordem inversa

para i de 5 ate 1 passo -1 faca
   escreval(numeros[i])
fimpara

Nesse caso, o percurso começa na última posição e termina na primeira.

Exemplo completo

Algoritmo "ordem_normal_inversa"

Var
   numeros: vetor[1..5] de inteiro
   i: inteiro

Inicio

   // Preenchimento do vetor
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // Exibição em ordem normal
   escreval("")
   escreval("===== ORDEM NORMAL =====")

   para i de 1 ate 5 faca

      escreval("Posição ", i, ": ", numeros[i])

   fimpara

   // Exibição em ordem inversa
   escreval("")
   escreval("===== ORDEM INVERSA =====")

   para i de 5 ate 1 passo -1 faca

      escreval("Posição ", i, ": ", numeros[i])

   fimpara

Fimalgoritmo

10 — Soma dos valores de um vetor

Depois de armazenar os valores, podemos realizar cálculos.

Exemplo

Algoritmo "soma_vetor"

Var
   numeros: vetor[1..5] de inteiro
   i, soma: inteiro

Inicio

   soma <- 0

   // Leitura dos valores
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // Soma dos valores
   para i de 1 ate 5 faca

      soma <- soma + numeros[i]

   fimpara

   escreval("Soma dos valores: ", soma)

Fimalgoritmo

11 — Cálculo da média

Para calcular a média:

  1. somamos todos os valores;
  2. dividimos pela quantidade de elementos.
Algoritmo "media_vetor"

Var
   notas: vetor[1..5] de real
   i: inteiro
   soma, media: real

Inicio

   soma <- 0

   // Leitura das notas
   para i de 1 ate 5 faca

      escreva("Digite a ", i, "ª nota: ")
      leia(notas[i])

      soma <- soma + notas[i]

   fimpara

   // Cálculo da média
   media <- soma / 5

   escreval("Média das notas: ", media:4:2)

Fimalgoritmo

12 — Contagem de valores

Podemos utilizar uma condição para contar elementos que possuem determinada característica.

Exemplo — Contar números pares

Algoritmo "contar_pares"

Var
   numeros: vetor[1..5] de inteiro
   i, qtdPares: inteiro

Inicio

   qtdPares <- 0

   // Leitura dos valores
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // Contagem dos números pares
   para i de 1 ate 5 faca

      se numeros[i] % 2 = 0 entao
         qtdPares <- qtdPares + 1
      fimse

   fimpara

   escreval("Quantidade de números pares: ", qtdPares)

Fimalgoritmo

13 — Exibição de valores que atendem a uma condição

Além de contar, podemos mostrar somente os elementos desejados.

Exemplo — Mostrar números maiores que 10

escreval("Números maiores que 10:")

para i de 1 ate 5 faca

   se numeros[i] > 10 entao
      escreval(numeros[i])
   fimse

fimpara

14 — Maior valor do vetor

Para encontrar o maior valor, utilizamos inicialmente o primeiro elemento do vetor.

maior <- numeros[1]

Depois, comparamos os outros elementos com o valor armazenado em maior.

Exemplo

Algoritmo "maior_valor"

Var
   numeros: vetor[1..5] de inteiro
   i, maior: inteiro

Inicio

   // Leitura dos valores
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // O primeiro elemento é inicialmente considerado o maior
   maior <- numeros[1]

   // Comparação com os demais elementos
   para i de 2 ate 5 faca

      se numeros[i] > maior entao
         maior <- numeros[i]
      fimse

   fimpara

   escreval("Maior valor: ", maior)

Fimalgoritmo

Por que não iniciar o maior com zero?

O seguinte comando pode causar problemas:

maior <- 0

Considere o vetor:

-5, -2, -10, -4, -8

O algoritmo informaria incorretamente que o maior valor é zero, mesmo que zero não esteja armazenado no vetor.

Por isso, é mais seguro utilizar:

maior <- numeros[1]

15 — Menor valor do vetor

O processo para encontrar o menor valor é semelhante.

Algoritmo "menor_valor"

Var
   numeros: vetor[1..5] de inteiro
   i, menor: inteiro

Inicio

   // Leitura dos valores
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   menor <- numeros[1]

   // Procura pelo menor valor
   para i de 2 ate 5 faca

      se numeros[i] < menor entao
         menor <- numeros[i]
      fimse

   fimpara

   escreval("Menor valor: ", menor)

Fimalgoritmo

16 — Maior e menor valor no mesmo algoritmo

Algoritmo "maior_menor"

Var
   numeros: vetor[1..5] de inteiro
   i, maior, menor: inteiro

Inicio

   // Preenchimento do vetor
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // Inicialização com o primeiro valor
   maior <- numeros[1]
   menor <- numeros[1]

   // Comparação com os demais valores
   para i de 2 ate 5 faca

      se numeros[i] > maior entao
         maior <- numeros[i]
      fimse

      se numeros[i] < menor entao
         menor <- numeros[i]
      fimse

   fimpara

   escreval("Maior valor: ", maior)
   escreval("Menor valor: ", menor)

Fimalgoritmo

17 — Localização da posição do maior valor

Também podemos guardar a posição em que o maior valor foi encontrado.

Algoritmo "posicao_maior"

Var
   numeros: vetor[1..5] de inteiro
   i, maior, posMaior: inteiro

Inicio

   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   maior <- numeros[1]
   posMaior <- 1

   para i de 2 ate 5 faca

      se numeros[i] > maior entao

         maior <- numeros[i]
         posMaior <- i

      fimse

   fimpara

   escreval("Maior valor: ", maior)
   escreval("Posição do maior valor: ", posMaior)

Fimalgoritmo

18 — Busca de um valor no vetor

A busca consiste em percorrer o vetor e verificar se determinado valor está armazenado.

Exemplo

Algoritmo "buscar_valor"

Var
   numeros: vetor[1..5] de inteiro
   i, procurado: inteiro
   encontrou: logico

Inicio

   // Preenchimento do vetor
   para i de 1 ate 5 faca

      escreva("Digite o ", i, "º número: ")
      leia(numeros[i])

   fimpara

   // Número que será procurado
   escreva("Digite o número que deseja procurar: ")
   leia(procurado)

   encontrou <- falso

   // Busca pelo número
   para i de 1 ate 5 faca

      se numeros[i] = procurado entao

         escreval("Número encontrado na posição ", i)
         encontrou <- verdadeiro

      fimse

   fimpara

   // Mensagem apresentada quando não houver ocorrência
   se encontrou = falso entao
      escreval("Número não encontrado.")
   fimse

Fimalgoritmo

Observação

Se o mesmo número aparecer mais de uma vez, o algoritmo mostrará todas as posições em que ele foi encontrado.


19 — Alteração de uma posição

Podemos solicitar ao usuário uma posição e substituir seu conteúdo.

Algoritmo "alterar_posicao"

Var
   numeros: vetor[1..5] de inteiro
   i, posicao, novoValor: inteiro

Inicio

   // Preenchimento do vetor
   para i de 1 ate 5 faca

      escreva("Digite o valor da posição ", i, ": ")
      leia(numeros[i])

   fimpara

   escreva("Informe a posição que deseja alterar: ")
   leia(posicao)

   // Validação da posição
   se posicao >= 1 e posicao <= 5 entao

      escreva("Informe o novo valor: ")
      leia(novoValor)

      numeros[posicao] <- novoValor

      escreval("Valor alterado com sucesso.")

   senao

      escreval("Posição inválida.")

   fimse

   // Exibição do vetor atualizado
   escreval("")
   escreval("Vetor atualizado:")

   para i de 1 ate 5 faca
      escreval("Posição ", i, ": ", numeros[i])
   fimpara

Fimalgoritmo

20 — Capacidade e quantidade preenchida

Um vetor pode possuir mais posições do que a quantidade de dados realmente utilizada.

Exemplo

nomes: vetor[1..10] de caractere
qtd: inteiro

O vetor possui capacidade para dez nomes. Entretanto, o usuário pode optar por informar apenas quatro.

escreva("Quantos nomes deseja cadastrar? ")
leia(qtd)

para i de 1 ate qtd faca

   escreva("Digite o ", i, "º nome: ")
   leia(nomes[i])

fimpara

Nesse caso:


21 — Vetores paralelos

Vetores paralelos são vetores diferentes cujas posições representam informações relacionadas.

Exemplo

nomes: vetor[1..5] de caractere
notas: vetor[1..5] de real

As posições correspondentes pertencem ao mesmo aluno.

ÍndiceNomeNota
1Ana8.5
2Carlos6.0
3Maria9.0
4João5.5
5Pedro7.5

Assim:

nomes[3]

e:

notas[3]

representam os dados do mesmo aluno.

Exemplo — Nome e nota dos alunos

Algoritmo "alunos_notas"

Var
   nomes: vetor[1..5] de caractere
   notas: vetor[1..5] de real
   i: inteiro

Inicio

   // Cadastro dos alunos
   para i de 1 ate 5 faca

      escreva("Digite o nome do ", i, "º aluno: ")
      leia(nomes[i])

      escreva("Digite a nota de ", nomes[i], ": ")
      leia(notas[i])

   fimpara

   // Apresentação dos dados
   escreval("")
   escreval("===== ALUNOS E NOTAS =====")

   para i de 1 ate 5 faca

      escreval("Aluno: ", nomes[i])
      escreval("Nota: ", notas[i])
      escreval("--------------------------")

   fimpara

Fimalgoritmo

22 — Exemplo completo

Ler cinco notas e apresentar os resultados

O algoritmo deverá:

Algoritmo "analise_notas"

Var
   notas: vetor[1..5] de real
   i, qtdAcima: inteiro
   soma, media, maior, menor: real

Inicio

   soma <- 0
   qtdAcima <- 0

   // Leitura das notas
   para i de 1 ate 5 faca

      escreva("Digite a ", i, "ª nota: ")
      leia(notas[i])

      soma <- soma + notas[i]

   fimpara

   // Cálculo da média
   media <- soma / 5

   // Inicialização do maior e do menor valor
   maior <- notas[1]
   menor <- notas[1]

   // Procura pelo maior e pelo menor valor
   para i de 2 ate 5 faca

      se notas[i] > maior entao
         maior <- notas[i]
      fimse

      se notas[i] < menor entao
         menor <- notas[i]
      fimse

   fimpara

   // Contagem das notas acima da média
   para i de 1 ate 5 faca

      se notas[i] > media entao
         qtdAcima <- qtdAcima + 1
      fimse

   fimpara

   // Apresentação das notas
   escreval("")
   escreval("===== NOTAS INFORMADAS =====")

   para i de 1 ate 5 faca
      escreval("Nota ", i, ": ", notas[i]:4:2)
   fimpara

   // Apresentação dos resultados
   escreval("")
   escreval("===== RESULTADOS =====")
   escreval("Média: ", media:4:2)
   escreval("Maior nota: ", maior:4:2)
   escreval("Menor nota: ", menor:4:2)
   escreval("Notas acima da média: ", qtdAcima)

   // Apresentação em ordem inversa
   escreval("")
   escreval("===== ORDEM INVERSA =====")

   para i de 5 ate 1 passo -1 faca
      escreval(notas[i]:4:2)
   fimpara

Fimalgoritmo

23 — Erros comuns no uso de vetores

1. Não utilizar o índice

Incorreto:

leia(numeros)

Correto:

leia(numeros[i])

2. Acessar uma posição inexistente

Declaração:

numeros: vetor[1..5] de inteiro

Incorreto:

numeros[6] <- 10

A posição 6 não existe nesse vetor.

3. Utilizar limites diferentes no laço

Declaração:

numeros: vetor[1..5] de inteiro

Incorreto:

para i de 1 ate 10 faca
   leia(numeros[i])
fimpara

Correto:

para i de 1 ate 5 faca
   leia(numeros[i])
fimpara

4. Confundir posição com valor

Considere:

numeros[3] <- 20

Nesse comando:

5. Não inicializar um acumulador

Incorreto:

soma <- soma + numeros[i]

sem antes fazer:

soma <- 0

6. Inicializar o maior valor com zero

Evite:

maior <- 0

Prefira:

maior <- numeros[1]

7. Utilizar nomes diferentes

Se o vetor foi declarado como:

numeros: vetor[1..5] de inteiro

deve-se utilizar:

numeros[i]

e não:

numero[i]

24 — Resumo da aula

Um vetor permite armazenar vários dados do mesmo tipo utilizando um único nome.

Declaração

numeros: vetor[1..5] de inteiro

Acesso

numeros[1]

Leitura

leia(numeros[i])

Exibição

escreval(numeros[i])

Percurso

para i de 1 ate 5 faca

Ordem inversa

para i de 5 ate 1 passo -1 faca

Soma

soma <- soma + numeros[i]

Comparação

se numeros[i] > maior entao

Busca

se numeros[i] = procurado entao

25 — Atividades de fixação

Exercício 1 — Leitura e apresentação

Faça um algoritmo que leia oito números inteiros, armazene-os em um vetor e apresente todos os valores na ordem em que foram informados.

Exercício 2 — Ordem inversa

Faça um algoritmo que leia dez números inteiros e apresente-os na ordem inversa à ordem de entrada.

Exercício 3 — Números pares

Faça um algoritmo que leia dez números inteiros e apresente:

Exercício 4 — Soma e média

Faça um algoritmo que leia seis números reais e apresente:

Exercício 5 — Maior e menor

Faça um algoritmo que leia oito números inteiros e apresente:

Exercício 6 — Busca de valor

Faça um algoritmo que leia dez números inteiros. Em seguida, solicite um número ao usuário e informe se ele está armazenado no vetor.

Caso esteja, mostre também sua posição.

Exercício 7 — Alteração de valor

Faça um algoritmo que leia cinco números inteiros. Depois, solicite uma posição e um novo valor.

O algoritmo deverá:

Exercício 8 — Notas dos alunos

Faça um algoritmo que leia o nome e a nota de dez alunos utilizando dois vetores.

Apresente:

Exercício 9 — Temperaturas

Faça um algoritmo que armazene a temperatura registrada durante sete dias.

Apresente:

Exercício 10 — Cadastro de produtos

Faça um algoritmo que leia o nome e o preço de cinco produtos utilizando vetores paralelos.

Apresente: