tds-lp
Estrutura de Dados — Vetores
Objetivos da aula
Ao final desta aula, o estudante deverá ser capaz de:
- compreender o conceito de vetor;
- diferenciar uma variável simples de uma variável composta;
- declarar vetores no VisualG;
- acessar, preencher e alterar posições de um vetor;
- percorrer vetores em ordem normal e inversa;
- realizar cálculos utilizando os valores armazenados;
- localizar elementos em um vetor;
- identificar erros comuns no uso de índices.
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:
- armazena vários valores;
- armazena valores do mesmo tipo;
- utiliza um único nome;
- organiza os valores em posições;
- identifica cada posição por meio de um índice.
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:
| Índice | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Valor | 18 | 20 | 17 | 22 | 19 |
Assim:
idades[1]
representa o valor 18.
Enquanto:
idades[4]
representa o valor 22.
Características de um vetor
- É uma estrutura de dados simples.
- Possui uma quantidade definida de posições.
- Armazena dados do mesmo tipo.
- Permite acesso direto a qualquer posição.
- Utiliza índices para identificar os elementos.
- É armazenado de forma sequencial na memória.
- Serve de base para estruturas mais complexas, como matrizes, listas, filas e pilhas.
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 simples | Vetor |
|---|---|
| Armazena apenas um valor | Armazena vários valores |
| Não utiliza índice | Utiliza índice |
| Possui apenas uma posição | Possui várias posições |
Exemplo: idade: inteiro | Exemplo: 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:
- o nome do vetor;
- o intervalo de índices;
- 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:
- nome do vetor:
notas; - índice inicial:
1; - índice final:
10; - quantidade de posições:
10; - tipo dos valores:
real.
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:
notas[1]representa a primeira posição;notas[2]representa a segunda posição;notas[3]representa a terceira posição.
Representação
| Índice | 1 | 2 | 3 |
|---|---|---|---|
| Valor | 8.5 | 7.0 | 9.5 |
Atenção
O índice não é o valor armazenado.
Na instrução:
notas[2] <- 7.0
2é o índice;7.0é o valor armazenado.
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
| Índice | 1 | 2 | 3 |
|---|---|---|---|
| Valor | 10 | 25 | 8 |
Depois
| Índice | 1 | 2 | 3 |
|---|---|---|---|
| Valor | 10 | 30 | 8 |
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:
- somamos todos os valores;
- 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:
- capacidade do vetor: 10;
- quantidade utilizada: valor de
qtd.
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.
| Índice | Nome | Nota |
|---|---|---|
| 1 | Ana | 8.5 |
| 2 | Carlos | 6.0 |
| 3 | Maria | 9.0 |
| 4 | João | 5.5 |
| 5 | Pedro | 7.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á:
- ler cinco notas;
- mostrar todas as notas;
- calcular a média;
- informar a maior nota;
- informar a menor nota;
- contar quantas notas estão acima da média;
- mostrar as notas em ordem inversa.
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:
3é a posição;20é o valor.
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:
- todos os números informados;
- somente os números pares;
- a quantidade de números pares.
Exercício 4 — Soma e média
Faça um algoritmo que leia seis números reais e apresente:
- a soma dos valores;
- a média;
- os valores maiores que a média.
Exercício 5 — Maior e menor
Faça um algoritmo que leia oito números inteiros e apresente:
- o maior número;
- a posição do maior número;
- o menor número;
- a posição do menor número.
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á:
- verificar se a posição é válida;
- substituir o valor da posição;
- apresentar o vetor atualizado.
Exercício 8 — Notas dos alunos
Faça um algoritmo que leia o nome e a nota de dez alunos utilizando dois vetores.
Apresente:
- o nome e a nota de todos os alunos;
- a média da turma;
- os alunos com nota maior ou igual a 60;
- a quantidade de alunos abaixo da média.
Exercício 9 — Temperaturas
Faça um algoritmo que armazene a temperatura registrada durante sete dias.
Apresente:
- a média das temperaturas;
- a maior temperatura;
- a menor temperatura;
- quantos dias tiveram temperatura acima da média.
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:
- todos os produtos cadastrados;
- o produto mais caro;
- o produto mais barato;
- a média dos preços;
- os produtos com preço abaixo da média.