Capítulo 13: Vetores I: Arrays Unidimensionais (Indexação Base Zero)

🎯 Objetivo da Aula

Até agora, cada variável guardava apenas um único valor. Se precisássemos armazenar as placas de 50 caminhões no pátio, teríamos que declarar 50 variáveis diferentes (placa1, placa2, …, placa50), tornando o código inviável e impossível de automatizar com laços para.

Nesta aula, você aprenderá a:

  1. Compreender o conceito de Vetor (Array 1D).
  2. Dominar a sintaxe de declaração: tipo nomeVetor[tamanho].
  3. Dominar a Regra de Ouro da Indexação Base Zero (0 até tamanho - 1).
  4. Integrar Vetores com Laços para para preenchimento e listagem automatizada de dados em massa.

📥 Material de Apoio e Código-Fonte da Aula:


🏢 O Cenário Prático (Seu Desafio)

Situação: O pátio de triagem da FastLog possui 5 Vagas de Espera numeradas de 0 a 4. Conforme os caminhões chegam da rodovia, o conferente precisa registrar a placa de cada veículo em sua respectiva vaga e emitir o Relatório Geral de Ocupação de Pátio para a torre de controle.

Missão: Construir o Gerenciador de Vagas de Pátio, criando um vetor de strings (cadeia vagas[5]), preenchendo as placas via teclado e imprimindo o mapa de ocupação formatado.


🧠 Fundamentos: A Estrutura de um Vetor Base Zero

1. O que é um Vetor?

Um Vetor (Array) é uma sequência contígua de posições de memória RAM identificadas por um Índice Numérico de Posição:

graph LR
    subgraph Vetor_Vagas ["Vetor: cadeia vagas[5]"]
        P0["vagas[0]<br/>'ABC-1234'"]
        P1["vagas[1]<br/>'BRA-2E19'"]
        P2["vagas[2]<br/>'XYZ-9000'"]
        P3["vagas[3]<br/>'KML-4433'"]
        P4["vagas[4]<br/>'JHG-7711'"]
    end
    
    style P0 fill:#2980b9,stroke:#fff,color:#fff
    style P1 fill:#2980b9,stroke:#fff,color:#fff
    style P2 fill:#2980b9,stroke:#fff,color:#fff
    style P3 fill:#2980b9,stroke:#fff,color:#fff
    style P4 fill:#2980b9,stroke:#fff,color:#fff

2. A Regra de Ouro da Indexação Base Zero (0..N-1)

Em C, Java, JavaScript, Python e Portugol Studio:
O primeiro elemento de um vetor com 5 posições está no índice 0 e o último elemento está no índice 4 (5 - 1). Se você tentar acessar vagas[5], o programa travará com erro de estouro de limites de memória (Array Index Out of Bounds)!


3. A Sintaxe de Declaração no Portugol Studio

1
2
3
cadeia vagas[5] // Vetor de 5 textos (índices 0, 1, 2, 3, 4)
real faturamentoTrimestral[4] // Vetor de 4 números reais (0 a 3)
inteiro notas[10] // Vetor de 10 inteiros (0 a 9)

Além de declarar o vetor vazio e preenchê-lo depois (como acima), você pode inicializá-lo diretamente com os valores já entre chaves { }, separados por vírgula, na mesma linha da declaração:

1
2
cadeia motoristas[3] = {"Carlos Silva", "Beatriz Rocha", "Tiago Ramos"}
real quilometragem[3] = {4200.0, 3800.5, 5100.0}

O Portugol Studio associa cada valor da lista à posição correspondente, na ordem em que aparecem: motoristas[0] recebe "Carlos Silva", motoristas[1] recebe "Beatriz Rocha", e assim por diante. A quantidade de valores entre chaves deve bater exatamente com o tamanho declarado do vetor.


4. Vetores + Laço para (A Combinação Perfeita)

1
2
3
4
5
6
// Preenchimento Automático
para (inteiro i = 0; i < 5; i++) 
{
	escreva("Digite a placa para a vaga [", i, "]: ")
	leia(vagas[i])
}

📖 Exemplo Guiado: Controle de Vagas do Pátio

Código do Programa:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
programa 
{
	funcao inicio() 
	{
		cadeia vagas[5] // Vetor com 5 posições (0 a 4)

		escreva("==========================================\n")
		escreva("       FASTLOG - GESTÃO DE PÁTIO          \n")
		escreva("==========================================\n")
		escreva("Cadastre as placas dos caminhões nas vagas:\n\n")

		// 1. Entrada de Dados no Vetor
		para (inteiro i = 0; i < 5; i++) 
		{
			escreva("Informe a placa na Vaga [", i, "]: ")
			leia(vagas[i])
		}

		// 2. Saída e Varredura do Vetor
		escreva("\n============ MAPA DE OCUPAÇÃO ============\n")
		escreva(" VAGA  |  PLACA DO VEÍCULO ESTACIONADO    \n")
		escreva("-------+----------------------------------\n")
		para (inteiro i = 0; i < 5; i++) 
		{
			escreva(" [ ", i, " ] |  ", vagas[i], "\n")
		}
		escreva("==========================================\n")
	}
}

✅ Exemplo de Execução no Console (Shift + F6):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
==========================================
       FASTLOG - GESTÃO DE PÁTIO          
==========================================
Cadastre as placas dos caminhões nas vagas:

Informe a placa na Vaga [0]: ABC-1234
Informe a placa na Vaga [1]: BRA-2E19
Informe a placa na Vaga [2]: XYZ-9000
Informe a placa na Vaga [3]: KML-4433
Informe a placa na Vaga [4]: JHG-7711

============ MAPA DE OCUPAÇÃO ============
 VAGA  |  PLACA DO VEÍCULO ESTACIONADO    
-------+----------------------------------
 [ 0 ] |  ABC-1234
 [ 1 ] |  BRA-2E19
 [ 2 ] |  XYZ-9000
 [ 3 ] |  KML-4433
 [ 4 ] |  JHG-7711
==========================================

🛠️ Prática Obrigatória 1: Faturamento Anual por Trimestre

Passo 1: O Desafio

Crie um programa faturamento_trimestral.por que utilize um vetor de real com 4 posições (real trimestres[4]):

  1. Receba os 4 faturamentos trimestrais pelo teclado.
  2. Em um segundo laço para, calcule a Soma Total Anual e a Média Trimestral de Vendas.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
7
Faturamento T1 (R$): 150000.00
Faturamento T2 (R$): 180000.00
Faturamento T3 (R$): 220000.00
Faturamento T4 (R$): 310000.00

FATURAMENTO ANUAL CONSOLIDADO: R$ 860000.0
MÉDIA POR TRIMESTRE          : R$ 215000.0

🛠️ Prática Obrigatória 2: Catálogo de SKUs de Almoxarifado

Crie um programa catalogo_sku.por que declare um vetor de 6 posições de cadeia (cadeia catalogo[6]) para armazenar os códigos de produtos do galpão (ex: "LOG-01", "LOG-02"…). Após cadastrar os 6 códigos, exiba a lista de inventário completa numerada de 0 a 5.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_SeuNome_SeuSobrenome.por.
  2. Verifique se os laços para utilizam estritamente o intervalo de 0 até < tamanho.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 13 - Vetores Unidimensionais”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar Alocação de Memória Contígua e Complexidade $O(1)$. Quando você acessa vagas[3], o computador não precisa procurar na memória: ele multiplica o índice 3 pelo tamanho em bytes do elemento e pula direto para o endereço físico exato instantaneamente.


🔥 Desafio de Fixação: Inversão de Ordem de Vetor

Crie um programa que leia 5 números inteiros em um vetor e, em seguida, utilize um laço para (inteiro i = 4; i >= 0; i--) para exibir os elementos na ordem inversa daquela em que foram digitados.


🔑 Gabarito de Código Completo

Prática 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
programa {
	funcao inicio() {
		real trimestres[4], totalAnual = 0.0, mediaTrimestre

		escreva("=== APURAÇÃO CONTÁBIL TRIMESTRAL ===\n")
		para (inteiro i = 0; i < 4; i++) {
			escreva("Faturamento Trimestre ", i+1, " (R$): ")
			leia(trimestres[i])
			totalAnual += trimestres[i]
		}

		mediaTrimestre = totalAnual / 4.0

		escreva("\n=============================================\n")
		escreva("FATURAMENTO ANUAL CONSOLIDADO: R$ ", totalAnual, "\n")
		escreva("MÉDIA POR TRIMESTRE          : R$ ", mediaTrimestre, "\n")
		escreva("=============================================\n")
	}
}

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
programa {
	funcao inicio() {
		cadeia catalogo[6]

		escreva("=== CADASTRO DE SKUs DE ALMOXARIFADO ===\n")
		para (inteiro i = 0; i < 6; i++) {
			escreva("Código do SKU [", i, "]: ")
			leia(catalogo[i])
		}

		escreva("\n============ INVENTÁRIO ATIVO ============\n")
		para (inteiro i = 0; i < 6; i++) {
			escreva("Posição #", i, " -> Código: ", catalogo[i], "\n")
		}
		escreva("==========================================\n")
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
programa {
	funcao inicio() {
		inteiro numeros[5]

		escreva("Digite 5 números inteiros:\n")
		para (inteiro i = 0; i < 5; i++) {
			escreva("Elemento [", i, "]: ")
			leia(numeros[i])
		}

		escreva("\n--- EXIBIÇÃO NA ORDEM INVERSA ---\n")
		para (inteiro i = 4; i >= 0; i--) {
			escreva("Posição [", i, "] = ", numeros[i], "\n")
		}
	}
}

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. O que é um Vetor (Array), segundo a definição apresentada nos Fundamentos deste capítulo?
  2. Qual é a sintaxe de declaração de um vetor no Portugol Studio? Dê um exemplo de um vetor de 5 posições do tipo cadeia.
  3. Explique a Regra de Ouro da Indexação Base Zero: em um vetor de 5 posições, qual é o índice do primeiro elemento e qual é o índice do último?
  4. O que acontece se você tentar acessar a posição vagas[5] em um vetor declarado como cadeia vagas[5]?
  5. No Exemplo Guiado (Controle de Vagas do Pátio), quantas vagas tem o pátio de triagem da FastLog e qual é o índice da última vaga?
  6. Na Prática Obrigatória 1 (Faturamento Anual por Trimestre), quais dois valores devem ser calculados a partir do vetor de 4 posições, após a leitura dos faturamentos?
  7. Na Prática Obrigatória 2 (Catálogo de SKUs de Almoxarifado), quantas posições tem o vetor de catálogo e de que tipo de dado ele é declarado?
  8. Segundo o Checkpoint de Lógica & Engenharia de Software, por que o acesso a um elemento de vetor pelo índice (como vagas[3]) é considerado instantâneo, de complexidade O(1)?
  9. Qual condição de laço para deve ser usada para percorrer corretamente todas as posições de um vetor de tamanho N, do primeiro ao último elemento, sem ultrapassar os limites da memória?
  10. Dê um exemplo do dia a dia em que dados poderiam ser organizados de forma sequencial e numerada, de modo parecido com o vetor de vagas de pátio da FastLog.