#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
class Persona {
private:
string nombre;
int edad;
string INE;
char sexo; // 'H' o 'M'
double peso;
double altura;
public:
static const int BAJO_PESO = -1;
static const int PESO_IDEAL = 0;
static const int SOBREPESO = 1;
Persona() {
nombre = "";
edad = 0;
sexo = 'H';
peso = 0.0;
altura = 0.0;
INE = generaINE();
}
Persona(string nombre, int edad, char sexo) {
this->nombre = nombre;
this->edad = edad;
this->sexo = comprobarSexo(sexo);
this->peso = 0.0;
this->altura = 0.0;
this->INE = generaINE();
Persona(string nombre, int edad, char sexo, double peso, double altura) {
this->nombre = nombre;
this->edad = edad;
this->sexo = comprobarSexo(sexo);
this->peso = peso;
this->altura = altura;
this->INE = generaINE();
int calcularIMC() const {
if (altura <= 0) return 0;
double imc = peso / (altura * altura);
if (imc < 20) return BAJO_PESO;
else if (imc <= 25) return PESO_IDEAL;
else return SOBREPESO;
bool esMayorDeEdad() const {
return edad >= 18;
}
char comprobarSexo(char sexo) const {
if (sexo == 'H' || sexo == 'M') return sexo;
return 'H';
string generaINE() const {
int numero = rand() % 90000000 + 10000000; // 8 cifras
char letra = 'A' + (numero % 26);
return to_string(numero) + letra;
void setNombre(string nombre) { this->nombre = nombre; }
void setEdad(int edad) { this->edad = edad; }
void setSexo(char sexo) { this->sexo = comprobarSexo(sexo); }
void setPeso(double peso) { this->peso = peso; }
void setAltura(double altura) { this->altura = altura; }
string getNombre() const { return nombre; }
int getEdad() const { return edad; }
string getINE() const { return INE; }
char getSexo() const { return sexo; }
double getPeso() const { return peso; }
double getAltura() const { return altura; }
virtual string toString() const {
string texto = "Persona [Nombre=" + nombre +
", Edad=" + to_string(edad) +
", INE=" + INE +
", Sexo=" + string(1, sexo) +
", Peso=" + to_string(peso) +
" kg, Altura=" + to_string(altura) + " m]";
return texto;
};
class Empleado : public Persona {
private:
string cargo;
string departamento;
int horasTrabajadas;
double pagoPorHora;
public:
Empleado() : Persona() {
cargo = "";
departamento = "";
horasTrabajadas = 0;
pagoPorHora = 0.0;
Empleado(string nombre, int edad, char sexo, double peso, double altura,
string cargo, string departamento, int horas, double pago)
: Persona(nombre, edad, sexo, peso, altura) {
this->cargo = cargo;
this->departamento = departamento;
this->horasTrabajadas = horas;
this->pagoPorHora = pago;
double calcularSueldo() const {
return horasTrabajadas * pagoPorHora;
string toString() const override {
string texto = Persona::toString() + "\nEmpleado [Cargo=" + cargo +
", Departamento=" + departamento +
", Horas trabajadas=" + to_string(horasTrabajadas) +
", Pago por hora=" + to_string(pagoPorHora) +
", Sueldo=" + to_string(calcularSueldo()) + "]";
return texto;
};
class Estudiante : public Persona {
private:
string colegio;
int semestre;
public:
Estudiante() : Persona() {
colegio = "";
semestre = 0;
Estudiante(string nombre, int edad, char sexo, double peso, double altura,
string colegio, int semestre)
: Persona(nombre, edad, sexo, peso, altura) {
this->colegio = colegio;
this->semestre = semestre;
string toString() const override {
string texto = Persona::toString() +
"\nEstudiante [Colegio=" + colegio +
", Semestre=" + to_string(semestre) + "]";
return texto;
};
int main() {
srand(time(0));
string nombre;
int edad;
char sexo;
double peso, altura;
cout << "Ingrese los datos de la persona:\n";
cout << "Nombre: ";
getline(cin, nombre);
cout << "Edad: ";
cin >> edad;
cout << "Sexo (H/M): ";
cin >> sexo;
cout << "Peso (kg): ";
cin >> peso;
cout << "Altura (m): ";
cin >> altura;
Persona p1(nombre, edad, sexo, peso, altura);
Persona p2("Carlos", 30, 'H', 80, 1.75);
Persona p3;
[Link]("Lucia");
[Link](22);
[Link]('M');
[Link](55);
[Link](1.65);
string nombreE, cargo, dep;
int edadE, horas;
char sexoE;
double pesoE, alturaE, pago;
cout << "\nIngrese los datos del empleado:\n";
[Link]();
cout << "Nombre: ";
getline(cin, nombreE);
cout << "Edad: ";
cin >> edadE;
cout << "Sexo (H/M): ";
cin >> sexoE;
cout << "Peso (kg): ";
cin >> pesoE;
cout << "Altura (m): ";
cin >> alturaE;
[Link]();
cout << "Cargo: ";
getline(cin, cargo);
cout << "Departamento: ";
getline(cin, dep);
cout << "Horas trabajadas: ";
cin >> horas;
cout << "Pago por hora: ";
cin >> pago;
Empleado emp(nombreE, edadE, sexoE, pesoE, alturaE, cargo, dep, horas, pago);
Estudiante est("Andrea", 19, 'M', 48, 1.60, "Preparatoria Central", 3);
Persona* personas[5] = { &p1, &p2, &p3, &emp, &est };
for (int i = 0; i < 5; i++) {
cout << "\n-------------------------\n";
cout << personas[i]->toString() << endl;
int imc = personas[i]->calcularIMC();
if (dynamic_cast<Estudiante*>(personas[i])) {
if (imc == Persona::SOBREPESO)
cout << "El estudiante debe iniciar un programa de entrenamiento.\n";
else if (imc == Persona::BAJO_PESO)
cout << "El estudiante debe asistir con el nutriólogo.\n";
else
cout << "El estudiante tiene peso ideal.\n";
else if (dynamic_cast<Empleado*>(personas[i])) {
if (imc != Persona::PESO_IDEAL)
cout << "El empleado debe asistir a pláticas de salud.\n";
else
cout << "El empleado tiene peso ideal.\n";
else {
if (imc == Persona::SOBREPESO)
cout << "Tiene sobrepeso.\n";
else if (imc == Persona::BAJO_PESO)
cout << "Está por debajo del peso ideal.\n";
else
cout << "Tiene peso ideal.\n";
if (personas[i]->esMayorDeEdad())
cout << "Es mayor de edad.\n";
else
cout << "Es menor de edad.\n";
return 0;