Estructuras en C++ para Gestión Hospitalaria: Médicos, Departamentos y Medicamentos con Ejemplos Prácticos
Boletín 4: Estructuras de Datos en C/C++
1. Definición de constantes y tipos
En el fichero estructura.h se definen las constantes y los tipos de datos necesarios para la aplicación:
#define MAXCAR 256 // Longitud máxima de una cadena
#define MAXMEDICOS 25 // Número máximo de médicos por departamento
#define MAXDPTO 15 // Número máximo de departamentos
#define MAX 20 // Tamaño máximo genérico de tablas
typedef char Cadena[MAXCAR]; // Definición de tipo cadena de caracteres
typedef enum {residente, adjunto, interino} Categoria; // Tipo enumerado con las categorías profesionales
2. Estructura Médico
La estructura Medico agrupa los datos de un profesional sanitario:
typedef struct {
Cadena nombre;
Cadena apellidos;
int edad;
double horasSemanales;
// La categoría profesional se representa mediante un tipo enumerado (enum),
// ya que solo puede tomar tres valores: residente, adjunto o interino.
Categoria categoriaProf;
bool trabajaEnPrivada;
} Medico;
Además, se declara la función de lectura de un médico residente:
Medico LeeMedicoResidente();
3. Estructuras Departamento y Hospital
Un departamento contiene un nombre, una tabla de médicos y el número de médicos efectivos:
typedef Medico TablaMedicos[MAXMEDICOS];
typedef struct {
Cadena nombre;
TablaMedicos medicos;
int numMedicos;
} Departamento;
typedef Departamento TablaDepartamentos[MAXDPTO];
typedef struct {
Cadena direccion;
TablaDepartamentos departamentos;
int numDepartamentos;
} Hospital;
4. Estructuras Medicamento y Farmacia
Un medicamento incluye su código, precio, posología, principios activos y si requiere receta médica:
typedef Cadena TablaPrinpActiv[MAX];
typedef struct {
Cadena nombre;
int codigo;
double precio;
Cadena posologia;
TablaPrinpActiv pripActivos;
int numPActivo;
bool recetaMedica;
} Medicamento;
typedef Medicamento TablaMedicamentos[MAX];
typedef int TablaUnidades[MAX];
typedef struct {
Cadena direccion;
Cadena Identificador;
TablaMedicamentos medicamentos;
TablaUnidades unidadesMed;
int numMedicamentos;
} Farmacia;
5. Prototipos de funciones
Las cabeceras de las funciones se declaran en el mismo fichero de cabecera:
Medico LeeMedicoResidente();
int leeMedicosResidentes(TablaMedicos);
Departamento leeDepartamento();
Medico medicoEnDptoConMayorNumeroHora(Departamento);
int medicosNoTrabajanEnLaPrivada(Departamento, TablaMedicos);
int numMedicosConCategoria(Departamento, Categoria);
void mostrar(Medico);
Medicamento leeMedicamentoConReceta();
6. Programa de prueba (test_estructura.cpp)
El programa principal valida las funciones implementadas. Algunos bloques se han comentado para probar los ejercicios por separado:
#include
#include
using namespace std;
#include "estructura.h"
int main() {
cout << "INICIO DE PROGRAMA\n\n";
Medico m;
Medicamento me;
TablaMedicos tMed;
TablaMedicos tMNoPrivada;
int numMed;
Departamento dpto;
Medico medicosMasHoras;
int nmC;
int res;
Hospital h;
int i, numNoP;
/* EJERCICIO 1
m = LeeMedicoResidente();
printf("\tNombre: %s\n", m.nombre);
printf("\tApellidos: %s\n", m.apellidos);
printf("\tEdad: %d\n", m.edad);
printf("\tHoras semanales: %lf\n", m.horasSemanales);
printf("\tCategoría: %d\n", m.categoriaProf);
printf("\tTrabaja en privada: %d\n", m.trabajaEnPrivada);
EJERCICIO 2
numMed = leeMedicosResidentes(tMed);
for (i = 0; i < numMed; i++)
mostrar(tMed[i]);
EJERCICIO 3
dpto = leeDepartamento();
printf("El departamento es: ");
printf("\tNombre: %s", dpto.nombre);
printf("Número de médicos: %d", dpto.numMedicos);
for (i = 0; i < dpto.numMedicos; i++)
mostrar(dpto.medicos[i]);
EJERCICIO 4
medicosMasHoras = medicoEnDptoConMayorNumeroHora(dpto);
printf("El médico que trabaja más horas es: ");
mostrar(medicosMasHoras);
EJERCICIO 5
numNoP = medicosNoTrabajanEnLaPrivada(dpto, tMNoPrivada);
EJERCICIO 6
nmC = numMedicosConCategoria(dpto, interino);
EJERCICIO 8
// res = numDptoConMasDeNMed(h, 25);
// cout << "El resultado es: " << res << endl;
*/
// EJERCICIO 12
printf("----EJERCICIO 12----");
me = leeMedicamentoConReceta();
printf("\tNombre: %s\n", me.nombre);
printf("\tCódigo: %d\n", me.codigo);
printf("\tPrecio: %lf\n", me.precio);
printf("\tPosología: %s\n", me.posologia);
printf("\tPrincipio activo: %s\n", me.pripActivos);
cout << "\nFIN DE PROGRAMA\n";
return 0;
}
7. Implementación de funciones (estructura.cpp)
Ejercicio 1: Lectura de un médico residente
Medico LeeMedicoResidente() {
Medico res;
printf("\nLectura de datos de un médico.\n");
printf("Introduzca un nombre: ");
scanf("%s", res.nombre); // Las cadenas de caracteres no necesitan el operador &
printf("Introduzca un apellido: ");
scanf("%s", res.apellidos);
printf("Introduzca la edad: ");
scanf("%d", &res.edad);
printf("Introduzca las horas semanales: ");
scanf("%lf", &res.horasSemanales);
res.categoriaProf = residente;
res.trabajaEnPrivada = false;
return res;
}
Ejercicio 2: Lectura de un array de médicos residentes
int leeMedicosResidentes(TablaMedicos tm) {
int num;
int i;
Medico m;
cout << "Introduzca el número de médicos para la tabla: ";
cin >> num;
for (i = 0; i < num; i++) {
m = LeeMedicoResidente();
tm[i] = m;
}
return num;
}
Ejercicio 3: Lectura de un departamento
Departamento leeDepartamento() {
Departamento res;
printf("Introduzca el nombre del departamento: ");
scanf("%s", res.nombre); // Corregido: el formato debe ser "%s"
res.numMedicos = leeMedicosResidentes(res.medicos);
return res;
}
Ejercicio 4: Médico con mayor número de horas
Medico medicoEnDptoConMayorNumeroHora(Departamento d) {
Medico max = d.medicos[0]; // Inicializamos max con el primer médico
int i;
for (i = 1; i < d.numMedicos; i++) {
if (max.horasSemanales < d.medicos[i].horasSemanales) {
max = d.medicos[i];
}
}
return max;
}
Ejercicio 5: Médicos que no trabajan en la privada
int medicosNoTrabajanEnLaPrivada(Departamento d, TablaMedicos tm) {
// tm es un parámetro de salida: se inicia vacío y se rellena con los médicos
// que no trabajan en la privada
int numMed = 0;
int i;
for (i = 0; i < d.numMedicos; i++) {
if (d.medicos[i].trabajaEnPrivada == false) {
tm[numMed] = d.medicos[i];
numMed++;
}
}
return numMed;
}
Ejercicio 6: Número de médicos por categoría
int numMedicosConCategoria(Departamento d, Categoria c) {
int i, res = 0; // Contador
for (i = 0; i < d.numMedicos; i++) {
if (d.medicos[i].categoriaProf == c) {
res = res + 1; // Equivale a res++
}
}
return res;
}
Ejercicio 8: Departamentos con más de n médicos
int numDptoConMasDeNMed(Hospital h, int n) {
int i;
int cont = 0;
for (i = 0; i < h.numDepartamentos; i++) {
if (h.departamentos[i].numMedicos > n) {
cont++; // Equivale a cont = cont + 1
}
}
return cont;
}
Ejercicio 9: Media de horas y departamento con menor carga laboral
double mediaHoras(Departamento d) {
int i;
double m = 0;
for (i = 0; i < d.numMedicos; i++) {
m = m + d.medicos[i].horasSemanales;
}
m = m / d.numMedicos;
return m;
}
int dptoMenorCargaLaboral(Hospital h) {
int i;
double aux, mediaMin = mediaHoras(h.departamentos[0]);
int pos = 0;
for (i = 1; i < h.numDepartamentos; i++) {
aux = mediaHoras(h.departamentos[i]);
if (aux < mediaMin) {
mediaMin = aux;
pos = i;
}
}
return pos;
}
Ejercicio 10: Médicos que trabajan más de n horas en un departamento
int medicosTrabajanMas(Hospital h, Cadena nom, int n, TablaMedicos tm) {
int i, j;
int pos = 0;
for (i = 0; i < h.numDepartamentos; i++) {
if (strcmp(h.departamentos[i].nombre, nom) == 0) {
for (j = 0; j < h.departamentos[i].numMedicos; j++) {
if (h.departamentos[i].medicos[j].horasSemanales > n) {
tm[pos] = h.departamentos[i].medicos[j];
pos++;
}
}
break;
}
}
return pos;
}
Ejercicio 12: Lectura de un medicamento con receta
Medicamento leeMedicamentoConReceta() {
Medicamento m;
printf("Introduzca un nombre de medicamento: ");
scanf("%s", m.nombre);
printf("Introduzca el código: ");
scanf("%d", &m.codigo);
printf("Introduzca el precio: ");
scanf("%lf", &m.precio);
printf("Introduzca la posología: ");
scanf("%s", m.posologia);
printf("Introduzca los principios activos: ");
scanf("%s", m.pripActivos);
// m.numPActivo = leeMedicamentoConReceta(m.pripActivos);
m.recetaMedica = true;
return m;
}
int leePrincipiosActivos(TablaPrinpActiv l) {
int i, numElems;
printf("Introduzca el número de principios activos: ");
scanf("%d", &numElems);
for (i = 0; i < numElems; i++) {
printf("Introduzca el nombre del principio activo: ");
scanf("%s", l[i]);
}
return numElems;
}
Ejercicio 15: Medicamentos sin receta con unidades superiores a n
int medicamentosSinR(Farmacia f, int n, TablaMedicamentos tm) {
int i;
int pos = 0;
for (i = 0; i < f.numMedicamentos; i++) {
if (f.medicamentos[i].recetaMedica == false && f.unidadesMed[i] > n) {
tm[pos] = f.medicamentos[i];
pos++;
}
}
return pos;
}
8. Conceptos clave
- struct: permite agrupar datos de distinto tipo bajo un mismo nombre.
- enum: define un tipo con un conjunto finito de valores constantes.
- typedef: crea alias de tipos para mejorar la legibilidad del código.
- Paso de arrays a funciones: los arrays se pasan por referencia, por lo que los cambios realizados dentro de la función son visibles en el llamador.
- Prototipos: declaran la firma de una función antes de su implementación.