Untitled
unknown
plain_text
3 years ago
13 kB
9
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...