Arrays Unidimensionais
Até agora, cada variável do seu programa guardava um único valor: uma idade, uma nota, um preço. Mas imagine um programa que precisa guardar as cinco notas de uma turma pequena, calculando quanto cada uma difere da nota mais alta. Com variáveis comuns, você precisaria de cinco nomes diferentes, nota1 até nota5, e o problema piora rápido se a turma tiver cem alunos. Esta semana resolve isso: você conhece o array, uma estrutura que guarda vários valores do mesmo tipo sob um único nome, e aprende a percorrer, buscar e manipular esses valores usando os laços que já domina.
Base bibliográfica: este material segue as seções 5.1 (Introdução aos Vetores) e 5.3 (Programando com Vetores) de SAVITCH, C++ Absoluto (Pearson Addison Wesley, 2004).
1. O que é um array? Declaração e acesso
Um array é uma coleção de variáveis do mesmo tipo, guardadas sob um único nome, e acessadas por um número chamado índice.
int notas[5];
Essa declaração reserva espaço para cinco valores inteiros, todos chamados notas. O tipo declarado antes do nome, aqui int, vale para todas as posições do array: um array só guarda valores de um único tipo, nunca uma mistura.
Índices começam em zero
Cada posição do array é acessada por um índice entre colchetes. Em C++, os índices sempre começam em 0, nunca em 1. Num array de tamanho 5, os índices válidos vão de 0 a 4: não existe notas[5] nesse array.
notas[0] // primeira posição
notas[4] // última posição
Lendo e alterando um valor
Cada posição indexada funciona exatamente como uma variável comum:
notas[0] = 8;
notas[1] = 9;
cout << notas[0] << endl;
Inicializando um array
Um array pode ser inicializado na própria declaração, listando os valores entre chaves:
int notas[5] = {8, 9, 2, 10, 6};
Se a lista tiver menos valores que o tamanho do array, as posições restantes recebem 0 automaticamente. Mas essa garantia vale só na inicialização: um array declarado sem valores iniciais pode conter qualquer lixo de memória, até ser preenchido de verdade.
Exemplo adaptado de Savitch, seção 5.1.
Índice fora do intervalo
Usar um índice igual ou maior que o tamanho do array é um dos erros mais comuns, e mais silenciosos, de C++:
int notas[5];
notas[5] = 10; // índice inválido
O compilador não acusa esse erro. O programa compila, roda, e pode alterar um valor de memória que não pertence ao array, sem nenhum aviso. É por isso que revisar, com calma, se o maior índice usado num laço é mesmo o tamanho menos um, e não o próprio tamanho, evita um dos bugs mais traiçoeiros da linguagem.
Vale a pena declarar o tamanho do array com uma constante nomeada, em vez de um número solto no código:
const int QUANTIDADE = 5; int notas[QUANTIDADE];. Isso deixa claro o que aquele número representa, e evita alterar vários lugares do código se o tamanho mudar.
🎥 Vídeo 1 de 3: O que é um array? Declaração e acesso (~6 min)
2. Percorrendo arrays com laços
Acessar cada posição de um array uma por uma não escala, principalmente em arrays grandes. Como os índices são sempre números inteiros crescentes, de 0 até tamanho - 1, o for é a ferramenta natural para percorrer um array inteiro.
int notas[5];
for (int i = 0; i < 5; i++) {
cin >> notas[i];
}
O mesmo padrão serve para mostrar os valores guardados, trocando apenas o comando de dentro do bloco:
for (int i = 0; i < 5; i++) {
cout << notas[i] << endl;
}
Somando e contando elementos
O acumulador e o contador que você já usou em laços de repetição funcionam do mesmo jeito ao percorrer um array:
int soma = 0;
for (int i = 0; i < 5; i++) {
soma = soma + notas[i];
}
int contador = 0;
for (int i = 0; i < 5; i++) {
if (notas[i] >= 7) {
contador++;
}
}
No primeiro trecho, soma acumula o total de todas as posições. No segundo, contador só é incrementado quando a posição percorrida atende à condição do if: esse padrão, for por fora e if por dentro, decidindo o que fazer com cada posição, aparece bastante ao trabalhar com arrays.
Encontrando o maior valor
int maior = notas[0];
for (int i = 1; i < 5; i++) {
if (notas[i] > maior) {
maior = notas[i];
}
}
maior começa com o primeiro valor do array, e o laço começa em i = 1, já que a posição 0 foi usada como ponto de partida. A cada posição percorrida, se ela for maior que o valor guardado em maior, ele é atualizado. Ao final, maior guarda o maior valor do array inteiro.
🎥 Vídeo 2 de 3: Percorrendo arrays com laços (~6 min)
3. Busca e manipulação de arrays
Buscar um valor num array significa descobrir se ele está guardado ali, e em qual posição. A forma mais simples é a busca sequencial: percorrer o array do início ao fim, comparando cada posição com o valor procurado, até encontrar uma que bata, ou até chegar ao final sem achar nada.
int notas[5] = {8, 9, 2, 10, 6};
int alvo, i = 0;
bool encontrado = false;
cin >> alvo;
while (!encontrado && i < 5) {
if (notas[i] == alvo) {
encontrado = true;
} else {
i++;
}
}
A condição do while combina duas coisas: ainda não achei o valor, e ainda não saí do array. O laço para assim que uma das duas deixar de ser verdadeira. Se encontrado for true ao final, i guarda exatamente a posição onde o valor foi achado.
Exemplo adaptado de Savitch, seção 5.3.
Arrays parcialmente preenchidos
Nem sempre o programa sabe, de antemão, quantos valores vai receber. Uma solução comum é declarar o array com um tamanho máximo, e usar uma variável separada para controlar quantas posições estão realmente em uso:
const int MAXIMO = 10;
int valores[MAXIMO];
int quantidade = 0;
int numero;
cin >> numero;
while (numero != -1 && quantidade < MAXIMO) {
valores[quantidade] = numero;
quantidade++;
cin >> numero;
}
O laço lê valores até o usuário digitar -1, guardando cada um na próxima posição livre. A condição também para se o array encher antes disso, evitando um índice fora do intervalo. Depois de preenchido, qualquer laço que percorra esse array deve usar quantidade como limite, não MAXIMO: são só essas posições que têm, de fato, um valor válido guardado.
for (int i = 0; i < quantidade; i++) {
cout << valores[i] << endl;
}
Exemplo adaptado de Savitch, seção 5.3.
🎥 Vídeo 3 de 3: Busca e manipulação de arrays (~5 min)
Leitura da Semana 6 - Base: Savitch, C++ Absoluto, seções 5.1 e 5.3. Faça a lista de exercícios e traga suas dúvidas para o encontro síncrono.