Registros
Introducción
En P1 (C) usabas struct para agrupar datos relacionados (registros).
En P2 (C++) hacemos lo mismo, pero con mejoras típicas:
structsigue existiendo (en C++structyclassson muy parecidos).- Podemos usar
std::stringen vez dechar[]. - Es habitual pasar por referencia (
T&) en vez de puntero (T*) cuando el parámetro es obligatorio.
En este tema usamos 3 ejemplos clave y un ejemplo final de modelado de datos.
1) Definir un robot y mostrarlo por pantalla
Define un tipo TRobot con id, modelo (cadena corta) y bateria (0–100).
Declara dos robots, inicializa uno por orden y otro por campos, y muéstralos.
P1 — C
#include <stdio.h>#include <string.h>
#define TAM_MODELO 16
typedef struct { int id; char modelo[TAM_MODELO]; int bateria; // 0..100} TRobot;
void mostrar(TRobot);
int main() { TRobot r1 = {1, "Scout-A", 80}; TRobot r2 = {.id = 2, .bateria = 60}; strcpy(r2.modelo, "Scout-B");
mostrar(r1); mostrar(r2); return 0;}
void mostrar(TRobot r) { printf("[id:%d, modelo:%s, bateria:%d%%]\n", r.id, r.modelo, r.bateria);}P2 — C++
#include <iostream>#include <string>
struct Robot { int id; std::string modelo; int bateria; // 0..100};
void mostrar(const Robot& r);
int main() { Robot r1{1, "Scout-A", 80};
Robot r2{}; r2.id = 2; r2.bateria = 60; r2.modelo = "Scout-B";
mostrar(r1); mostrar(r2); return 0;}
void mostrar(const Robot& r) { std::cout << "[id:" << r.id << ", modelo:" << r.modelo << ", bateria:" << r.bateria << "%]\n";}2) Struct + funciones: cargar batería con límite
Robot con id y bateria.
Función para cargar con incremento fijo hasta un máximo y otra para consultar el nivel.
P1 — C
#include <stdio.h>
#define MAX_BAT 100#define DELTA 15
typedef struct { int id; int bateria;} TRobot;
void cargar(TRobot*);int nivel(TRobot);
int main() { TRobot r = {1, 0};
cargar(&r); cargar(&r); cargar(&r);
printf("Nivel: %d%%\n", nivel(r)); return 0;}
void cargar(TRobot* r) { int nuevo = r->bateria + DELTA; r->bateria = (nuevo > MAX_BAT) ? MAX_BAT : nuevo;}
int nivel(TRobot r) { return r.bateria;}P2 — C++
#include <iostream>
constexpr int MAX_BAT = 100;constexpr int DELTA = 15;
struct Robot { int id; int bateria;};
void cargar(Robot& r); // referencia: el parámetro es obligatorioint nivel(const Robot& r); // const referencia: no copiamos el struct
int main() { Robot r{1, 0};
cargar(r); cargar(r); cargar(r);
std::cout << "Nivel: " << nivel(r) << "%\n"; return 0;}
void cargar(Robot& r) { int nuevo = r.bateria + DELTA; r.bateria = (nuevo > MAX_BAT) ? MAX_BAT : nuevo;}
int nivel(const Robot& r) { return r.bateria;}3) Structs anidados + colección encapsulada: sensor con diario de mediciones
Un sensor guarda mediciones (fecha y valor). Encapsulamos el diario (array + tamaño real), registramos mediciones y calculamos la media.
P1 — C
#include <stdio.h>
#define MAX_MED 100
typedef struct { int dia; int mes; int anyo;} TFecha;
typedef struct { TFecha fecha; float valor;} TMedicion;
typedef struct { TMedicion v[MAX_MED]; int n;} TDiario;
typedef struct { char codigo[6]; char tipo[10]; TDiario diario;} TSensor;
void registrarMedicion(TSensor*, TMedicion);float media(TSensor);
int main() { TSensor s = {"T01", "TEMP", {.n = 0}}; TMedicion m1 = {{3, 11, 2025}, 21.3f}; TMedicion m2 = {{4, 11, 2025}, 22.1f};
registrarMedicion(&s, m1); registrarMedicion(&s, m2);
printf("Media: %.2f\n", media(s)); return 0;}
void registrarMedicion(TSensor* s, TMedicion m) { if (s->diario.n < MAX_MED) { s->diario.v[s->diario.n] = m; s->diario.n++; }}
float media(TSensor s) { float resultado = 0.0f; float suma = 0.0f;
if (s.diario.n > 0) { for (int i = 0; i < s.diario.n; i++) { suma += s.diario.v[i].valor; } resultado = suma / s.diario.n; }
return resultado;}P2 — C++
#include <iostream>#include <string>#include <vector>#include <iomanip>
struct Fecha { int dia, mes, anyo;};
struct Medicion { Fecha fecha; double valor;};
struct Sensor { std::string codigo; std::string tipo; std::vector<Medicion> diario;};
void registrarMedicion(Sensor& s, const Medicion& m);double media(const Sensor& s);
int main() { Sensor s{"T01", "TEMP", {}};
Medicion m1{{3, 11, 2025}, 21.3}; Medicion m2{{4, 11, 2025}, 22.1};
registrarMedicion(s, m1); registrarMedicion(s, m2);
std::cout << std::fixed << std::setprecision(2); std::cout << "Media: " << media(s) << "\n"; return 0;}
void registrarMedicion(Sensor& s, const Medicion& m) { s.diario.push_back(m);}
double media(const Sensor& s) { if (s.diario.empty()) return 0.0;
double suma = 0.0; for (const auto& med : s.diario) { suma += med.valor; } return suma / static_cast<double>(s.diario.size());}Recordatorio
-
Un struct agrupa datos que “van juntos”.
-
Si repites lógica (mostrar, añadir, calcular…), crea funciones.
-
En C++ es muy habitual:
-
std::string en lugar de char[]
-
std::vector en lugar de “array + n” (
nsería el tamaño del array) -
pasar por referencia (
&) para no hacer una copia y añadir const si no se va a modificar
-