Dados, registros e estruturas
Programas transformam dados. Para fazer isso com clareza, primeiro damos tipo e significado aos valores, depois agrupamos campos relacionados em registros e finalmente organizamos muitos registros em uma estrutura de dados.
Primeiro nível
Um dado é um valor interpretado por um tipo e um contexto
O valor 19 sozinho não informa se representa idade, quantidade ou temperatura. O tipo determina quais valores e operações são válidos; o nome do campo oferece o significado usado pelo programa.
int matricula = 1042;1042 identifica um aluno.string nome = "Ana";Ana nomeia a pessoa.double media = 8.7;8.7 representa um resultado.bool aprovado = true;true representa uma condição.Segundo nível
Um registro reúne campos sobre a mesma entidade
Matrícula, nome, idade e média descrevem aspectos diferentes de um único aluno. Agrupá-los evita que essas informações circulem separadas e percam sua relação.
1042int"Ana"string19int8.7doubletrueboolCampos possuem nomes
O nome registra o papel de cada valor e evita depender da posição em que ele aparece.
Campos podem ter tipos diferentes
Um registro é uma estrutura heterogênea: combina inteiros, textos, decimais e outros tipos.
O conjunto representa uma entidade
Os cinco campos juntos formam um valor do tipo Aluno.
struct Aluno {
int matricula;
std::string nome;
int idade;
double media;
bool aprovado;
};
Aluno ana{1042, "Ana", 19, 8.7, true};
Terceiro nível
Uma estrutura organiza vários dados para permitir operações
Depois de modelar um aluno, precisamos guardar uma turma inteira. A estrutura define como os registros se relacionam e como o algoritmo irá inseri-los, percorrê-los, buscá-los ou removê-los.
Por que ela existe? Porque o custo de uma operação depende da organização. A mesma coleção pode ser rápida para busca por índice, busca por chave ou remoção em uma extremidade — mas dificilmente será a melhor em tudo ao mesmo tempo.
Decisão de projeto
A pergunta determina a estrutura
Antes de escolher uma estrutura, descubra qual operação será mais frequente. O mesmo conjunto de registros pode receber organizações diferentes.
vector<Aluno>
Registros contíguos e acesso direto por índice.
unordered_map
A matrícula funciona como chave para chegar ao registro.
queue<Aluno>
O primeiro registro inserido será o primeiro removido.
priority_queue
O registro de maior prioridade permanece acessível no topo.
Experimente
Do formulário ao vetor de registros
Preencha campos para criar um registro. Ao adicioná-lo, o registro passa a fazer parte da estrutura. Depois use operações sobre a coleção inteira.
A estrutura contém três registros do mesmo tipo.
Programa completo
Registro + estrutura + algoritmos em C++
O programa declara o formato de cada registro, cria uma coleção, insere um novo aluno, ordena por média e busca por matrícula.
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
// Um registro: campos relacionados descrevem um aluno.
struct Aluno {
int matricula;
std::string nome;
int idade;
double media;
};
// Busca um registro dentro da estrutura.
const Aluno* buscarPorMatricula(
const std::vector<Aluno>& turma,
int matricula
) {
auto encontrado = std::find_if(
turma.begin(), turma.end(),
[matricula](const Aluno& aluno) {
return aluno.matricula == matricula;
}
);
return encontrado == turma.end()
? nullptr
: &(*encontrado);
}
int main() {
// Uma estrutura: vários registros do tipo Aluno.
std::vector<Aluno> turma{
{101, "Ana", 19, 8.7},
{102, "Bia", 21, 9.2},
{103, "Caio", 18, 7.4}
};
turma.push_back({104, "Davi", 20, 7.9});
std::sort(turma.begin(), turma.end(),
[](const Aluno& a, const Aluno& b) {
return a.media > b.media;
}
);
std::cout << std::fixed << std::setprecision(1);
for (const Aluno& aluno : turma) {
std::cout << aluno.matricula << " | "
<< aluno.nome << " | "
<< aluno.media << '\n';
}
if (const Aluno* aluno = buscarPorMatricula(turma, 102)) {
std::cout << "Encontrada: " << aluno->nome << '\n';
}
}
struct Aluno define quais campos pertencem a cada registro.
vector<Aluno> organiza vários registros em uma coleção indexada.
push_back, sort e find_if realizam operações sobre a estrutura.
Fechamento
Do valor isolado ao programa organizado
8.7Um valor com tipo e significado.
Aluno{...}Campos relacionados sobre uma entidade.
vector<Aluno>Uma organização que permite operar sobre muitos registros.
Por que não guardar nomes, idades e médias em três vetores separados?
É possível, mas a relação entre os campos passa a depender de índices sincronizados. Um registro mantém os valores da mesma entidade juntos e reduz o risco de inconsistência.
Todo registro precisa estar dentro de um vetor?
Não. Um registro pode existir sozinho ou ser organizado por vetor, lista, tabela hash, árvore ou outra estrutura adequada às operações necessárias.
O que deve ser escolhido primeiro: o registro ou a estrutura?
Primeiro modele a entidade e seus campos. Depois observe as operações do problema para escolher como os registros serão organizados.
Pesquisa utilizada
Fontes acadêmicas
As definições e a progressão didática desta aula foram fundamentadas nas referências abaixo.