Untitled
unknown
plain_text
2 years ago
13 kB
6
Indexable
#include <iostream> #include <string> #include <fstream> #include <vector> #include <sstream> #include <algorithm> using namespace std; // Clase Empleado class Empleado { protected: string nombre; string apellido; string direccion; string fechaNacimiento; string sexo; public: Empleado(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo) : nombre(nombre), apellido(apellido), direccion(direccion), fechaNacimiento(fechaNacimiento), sexo(sexo) {} virtual ~Empleado() {} virtual string getRol() const = 0; virtual double getSueldo() const = 0; const string& getNombre() const { return nombre; } const string& getApellido() const { return apellido; } const string& getDireccion() const { return direccion; } const string& getFechaNacimiento() const { return fechaNacimiento; } const string& getSexo() const { return sexo; } virtual double calcularSalarioConDescuentos() const = 0; }; // Clase Gerente class Gerente : public Empleado { private: static const double SUELDO_BASE; public: Gerente(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo) : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {} string getRol() const override { return "Gerente"; } double getSueldo() const override { return SUELDO_BASE; } double calcularSalarioConDescuentos() const override { double sueldo = getSueldo(); double descuentoISSS = sueldo * 0.075; double descuentoAFP = sueldo * 0.0775; double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP; return salarioConDescuentos; } }; const double Gerente::SUELDO_BASE = 5000.0; // Clase JefeArea class JefeArea : public Empleado { private: static const double SUELDO_BASE; public: JefeArea(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo) : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {} string getRol() const override { return "Jefe de Área"; } double getSueldo() const override { return SUELDO_BASE; } double calcularSalarioConDescuentos() const override { double sueldo = getSueldo(); double descuentoISSS = sueldo * 0.075; double descuentoAFP = sueldo * 0.0775; double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP; return salarioConDescuentos; } }; const double JefeArea::SUELDO_BASE = 1500.0; // Clase Supervisor class Supervisor : public Empleado { private: static const double SUELDO_BASE; public: Supervisor(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo) : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {} string getRol() const override { return "Supervisor"; } double getSueldo() const override { return SUELDO_BASE; } double calcularSalarioConDescuentos() const override { double sueldo = getSueldo(); double descuentoISSS = sueldo * 0.075; double descuentoAFP = sueldo * 0.0775; double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP; return salarioConDescuentos; } }; const double Supervisor::SUELDO_BASE = 750.0; // Clase Tecnico class Tecnico : public Empleado { private: static const double SUELDO_BASE; public: Tecnico(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo) : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {} string getRol() const override { return "Técnico"; } double getSueldo() const override { return SUELDO_BASE; } double calcularSalarioConDescuentos() const override { double sueldo = getSueldo(); double descuentoISSS = sueldo * 0.075; double descuentoAFP = sueldo * 0.0775; double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP; return salarioConDescuentos; } }; const double Tecnico::SUELDO_BASE = 350.0; // Clase ListaEmpleados class ListaEmpleados { private: vector<Empleado*> empleados; public: auto begin() const { return empleados.begin(); } auto end() const { return empleados.end(); } ~ListaEmpleados() { for (Empleado* empleado : empleados) { delete empleado; } } void agregarEmpleado(Empleado* empleado) { empleados.push_back(empleado); } void ordenarPorApellido() { sort(empleados.begin(), empleados.end(), [](const Empleado* empleado1, const Empleado* empleado2) { return empleado1->getApellido() < empleado2->getApellido(); }); } void ordenarPorSueldo(bool ascendente) { sort(empleados.begin(), empleados.end(), [ascendente](const Empleado* empleado1, const Empleado* empleado2) { double sueldo1 = empleado1->calcularSalarioConDescuentos(); double sueldo2 = empleado2->calcularSalarioConDescuentos(); return ascendente ? sueldo1 < sueldo2 : sueldo1 > sueldo2; }); } void mostrarCantidadPorRol() const { int gerentes = 0; int jefesArea = 0; int supervisores = 0; int tecnicos = 0; for (const Empleado* empleado : empleados) { if (dynamic_cast<const Gerente*>(empleado) != nullptr) { gerentes++; } else if (dynamic_cast<const JefeArea*>(empleado) != nullptr) { jefesArea++; } else if (dynamic_cast<const Supervisor*>(empleado) != nullptr) { supervisores++; } else if (dynamic_cast<const Tecnico*>(empleado) != nullptr) { tecnicos++; } } cout << "Cantidad de empleados por rol:" << endl; cout << "Gerentes: " << gerentes << endl; cout << "Jefes de Area: " << jefesArea << endl; cout << "Supervisores: " << supervisores << endl; cout << "Tecnicos: " << tecnicos << endl; } void imprimirLista() const { cout << "Lista de empleados:" << endl; for (const Empleado* empleado : empleados) { cout << "Nombre: " << empleado->getNombre() << " " << empleado->getApellido() << endl; cout << "Rol: " << empleado->getRol() << endl; cout << "Sueldo: $" << empleado->getSueldo() << endl; cout << "Salario con descuentos: $" << empleado->calcularSalarioConDescuentos() << endl; cout << "---------------------------" << endl; } } }; // Funciones auxiliares void mostrarMenu() { cout << "Menu de opciones:" << endl; cout << "1. Ordenar empleados por apellido" << endl; cout << "2. Ordenar empleados por sueldo" << endl; cout << "3. Mostrar cantidad de empleados por rol" << endl; cout << "4. Agregar nuevo empleado" << endl; cout << "5. Salir" << endl; cout << "Ingrese el número de la opción deseada: "; } void agregarEmpleadoPorConsola(ListaEmpleados& listaEmpleados) { cout << "Ingrese los datos del empleado:" << endl; string nombre, apellido, direccion, fechaNacimiento, sexo; int rol; cout << "Nombre: "<< endl; cin >> nombre; cout << "Apellido: "<< endl; cin >> apellido; cout << "Dirección: "<< endl; cin >> direccion; cout << "Fecha de Nacimiento: "<< endl; cin >> fechaNacimiento; cout << "Sexo: "<< endl; cin >> sexo; cout << "Rol (1: Gerente, 2: Jefe de Area, 3: Supervisor, 4: Tecnico): "<< endl; cin >> rol; Empleado* empleado = nullptr; switch (rol) { case 1: empleado = new Gerente(nombre, apellido, direccion, fechaNacimiento, sexo); break; case 2: empleado = new JefeArea(nombre, apellido, direccion, fechaNacimiento, sexo); break; case 3: empleado = new Supervisor(nombre, apellido, direccion, fechaNacimiento, sexo); break; case 4: empleado = new Tecnico(nombre, apellido, direccion, fechaNacimiento, sexo); break; default: cout << "Opcion invalida. No se agrego el empleado." << endl; return; } listaEmpleados.agregarEmpleado(empleado); cout << "Empleado agregado correctamente." << endl; } void escribirEmpleadosEnArchivo(const ListaEmpleados& listaEmpleados, const string& nombreArchivo) { ofstream archivo(nombreArchivo); if (!archivo) { cout << "Error al abrir el archivo." << endl; return; } for (const Empleado* empleado : listaEmpleados) { archivo << empleado->getRol() << "," << empleado->getNombre() << "," << empleado->getApellido() << "," << empleado->getDireccion() << "," << empleado->getFechaNacimiento() << "," << empleado->getSexo() << endl; } archivo.close(); cout << "Empleados guardados en el archivo correctamente." << endl; } //Función para leer empleados void leerEmpleadosDeArchivo(ListaEmpleados& listaEmpleados, const string& nombreArchivo) { ifstream archivo(nombreArchivo); if (!archivo) { cout << "Error al abrir el archivo." << endl; return; } string linea; while (getline(archivo, linea)) { stringstream ss(linea); string rol, nombre, apellido, direccion, fechaNacimiento, sexo; getline(ss, rol, ','); getline(ss, nombre, ','); getline(ss, apellido, ','); getline(ss, direccion, ','); getline(ss, fechaNacimiento, ','); getline(ss, sexo, ','); Empleado* empleado = nullptr; if (rol == "Gerente") { empleado = new Gerente(nombre, apellido, direccion, fechaNacimiento, sexo); } else if (rol == "Jefe de Area") { empleado = new JefeArea(nombre, apellido, direccion, fechaNacimiento, sexo); } else if (rol == "Supervisor") { empleado = new Supervisor(nombre, apellido, direccion, fechaNacimiento, sexo); } else if (rol == "Tecnico") { empleado = new Tecnico(nombre, apellido, direccion, fechaNacimiento, sexo); } else { cout << "Error al leer el archivo. Rol desconocido: " << rol << endl; continue; } listaEmpleados.agregarEmpleado(empleado); } archivo.close(); cout << "Empleados cargados desde el archivo correctamente." << endl; } int main() { //Creando el archivo de texto "empleados.txt" //ofstream archivoSalida("empleados.txt"); ListaEmpleados listaEmpleados; string nombreArchivo = "empleados.txt"; leerEmpleadosDeArchivo(listaEmpleados, nombreArchivo); int opcion; do { mostrarMenu(); cin >> opcion; switch (opcion) { case 1: listaEmpleados.ordenarPorApellido(); listaEmpleados.imprimirLista(); break; case 2: bool ascendente; cout << "Ordenar de menor a mayor (0) o de mayor a menor (1)? "; cin >> ascendente; listaEmpleados.ordenarPorSueldo(ascendente); listaEmpleados.imprimirLista(); break; case 3: listaEmpleados.mostrarCantidadPorRol(); break; case 4: agregarEmpleadoPorConsola(listaEmpleados); break; case 5: escribirEmpleadosEnArchivo(listaEmpleados, nombreArchivo); break; case 6: cout << "Vuelva pronto" << endl; break; default: cout << "Opcion invalida. Intente de nuevo." << endl; break; } } while (opcion != 6); return 0; }
Editor is loading...