Está en la página 1de 7

#include <iostream>

#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <limits>
using namespace std;

class Usuario {
public:
string nombre;
string fecha_nacimiento;
float peso;
float estatura;
};

class Cita {
public:
int dia;
int hora;
int indice_servicio;

Cita() : dia(0), hora(0), indice_servicio(0) {}


};

class Servicio {
public:
string nombre;
};

class NodoUsuario {
public:
Usuario usuario;
NodoUsuario* siguiente;
NodoUsuario* anterior;

NodoUsuario(const Usuario& usr) : usuario(usr), siguiente(nullptr), anterior(nullptr) {}


};

class ListaDobleUsuarios {
public:
NodoUsuario* cabeza;

ListaDobleUsuarios() : cabeza(nullptr) {}

void agregarUsuario(const Usuario& usr) {


NodoUsuario* nuevoNodo = new NodoUsuario(usr);
if (!cabeza) {
cabeza = nuevoNodo;
} else {
NodoUsuario* actual = cabeza;
while (actual->siguiente) {
actual = actual->siguiente;
}
actual->siguiente = nuevoNodo;
nuevoNodo->anterior = actual;
}
}
};

ListaDobleUsuarios listaUsuarios;
vector<Cita> citas;

void mostrar_servicios(const vector<Servicio>& servicios) {


cout << "Servicios disponibles:" << endl;
for (int i = 0; i < servicios.size(); i++) {
cout << i + 1 << ". " << servicios[i].nombre << endl;
}
}

void guardar_datos_usuarios(const ListaDobleUsuarios& listaUsuarios) {


ofstream archivo("usuarios.txt");

NodoUsuario* actual = listaUsuarios.cabeza;


while (actual) {
archivo << actual->usuario.nombre << "," << actual->usuario.fecha_nacimiento << ","
<< actual->usuario.peso << "," << actual->usuario.estatura << "\n";
actual = actual->siguiente;
}

archivo.close();
}

void guardar_datos_citas(const vector<Cita>& citas) {


ofstream archivo("citas.txt");

for (const auto& cita : citas) {


archivo << cita.dia << ", " << cita.hora << ", " << cita.indice_servicio << "\n";
}
archivo.close();
}

void cargar_datos_usuarios() {
ifstream archivo("usuarios.txt");
if (!archivo) {
cout << "No se encontro el archivo de usuarios. Puede ser la primera ejecucion del
programa.\n";
return;
}

listaUsuarios.cabeza = nullptr;

string linea;
while (getline(archivo, linea)) {
istringstream ss(linea);
Usuario usuario;
getline(ss, usuario.nombre, ',');
getline(ss, usuario.fecha_nacimiento, ',');
ss >> usuario.peso;
ss.ignore();
ss >> usuario.estatura;
listaUsuarios.agregarUsuario(usuario);
}

archivo.close();
}

void cargar_datos_citas() {
ifstream archivo("citas.txt");
if (!archivo) {
cout << "No se encontro el archivo de citas. Puede ser la primera ejecucion del
programa.\n";
return;
}

citas.clear();

string linea;
while (getline(archivo, linea)) {
istringstream ss(linea);
Cita cita;
ss >> cita.dia;
ss.ignore();
ss >> cita.hora;
ss.ignore();
ss >> cita.indice_servicio;
citas.push_back(cita);
}

archivo.close();
}

void guardar_datos(const ListaDobleUsuarios& listaUsuarios, const vector<Cita>& citas) {


guardar_datos_usuarios(listaUsuarios);
guardar_datos_citas(citas);
}

void cargar_datos() {
cargar_datos_usuarios();
cargar_datos_citas();
}

void programar_cita(ListaDobleUsuarios& listaUsuarios, vector<Cita>& citas,


vector<Servicio>& servicios) {

Usuario usuario;
cout << "Ingrese su nombre: ";
getline(cin, usuario.nombre);
cout << "Ingrese su fecha de nacimiento (dd/mm/aaaa): ";
getline(cin, usuario.fecha_nacimiento);
cout << "Ingrese su peso (kg): ";
cin >> usuario.peso;
cout << "Ingrese su estatura (m): ";
cin >> usuario.estatura;
cin.ignore();

listaUsuarios.agregarUsuario(usuario);

guardar_datos_usuarios(listaUsuarios);

Cita cita;
bool cita_disponible = false;
do {
cout << "Ingrese el dia de la cita del mes actual (1-31): ";
cin >> cita.dia;
cout << "Ingrese la hora deseada de las 9-20 horas: ";
cin >> cita.hora;
if (cita.hora < 0 || cita.hora > 23) {
cout << "Hora invalida. Por favor, ingrese una hora entre 0 y 23." << endl;
} else {

bool cita_ocupada = false;


for (const auto& c : citas) {
if (c.dia == cita.dia && c.hora == cita.hora) {
cita_ocupada = true;
break;
}
}

if (cita_ocupada) {
cout << "Lo siento, esa hora ya esta ocupada. Por favor, elija otra hora." << endl;
} else {
cita_disponible = true;
}
}
} while (!cita_disponible);

mostrar_servicios(servicios);

int servicio;
cout << "Ingrese el numero del servicio deseado: ";
cin >> servicio;
if (servicio < 1 || servicio > servicios.size()) {
cout << "Servicio invalido. Por favor, ingrese un numero entre 1 y " << servicios.size()
<< "." << endl;
} else {

cita.indice_servicio = servicio - 1;
cout << "Ha programado una cita para el dia " << cita.dia << " a las " << cita.hora << "
horas para el servicio de " << servicios[cita.indice_servicio].nombre << "." << endl;

citas.push_back(cita);
}
}

void ver_citas_ocupadas(const vector<Cita>& citas, const vector<Servicio>& servicios) {


cout << "\nCitas ocupadas:\n";
for (const auto& cita : citas) {
cout << "Dia " << cita.dia << ", Hora " << cita.hora << ": ";
if (cita.indice_servicio >= 0 && cita.indice_servicio < servicios.size()) {
cout << "Servicio: " << servicios[cita.indice_servicio].nombre << endl;
} else {
cout << "Servicio: (No disponible)" << endl;
}
}
}

void ver_personas_registradas(const ListaDobleUsuarios& listaUsuarios) {

cout << "\nPersonas registradas para cita:\n";


NodoUsuario* actual = listaUsuarios.cabeza;
while (actual) {
cout << "Nombre: " << actual->usuario.nombre << ", ";
cout << "Fecha de nacimiento: " << actual->usuario.fecha_nacimiento << ", ";
cout << "Peso: " << actual->usuario.peso << ", ";
cout << "Estatura: " << actual->usuario.estatura << endl;
actual = actual->siguiente;
}
}

int main() {

vector<Servicio> servicios;
servicios.push_back({"Examenes dentales y diagnosticos"});
servicios.push_back({"Limpiezas y profilaxis dentales"});
servicios.push_back({"Tratamientos de caries y restauraciones dentales"});
servicios.push_back({"Extracciones de dientes"});
servicios.push_back({"Tratamientos de conducto"});
servicios.push_back({"Colocacion de protesis dentales"});
servicios.push_back({"Consulta general o chequeo rutinario"});
servicios.push_back({"Tratamientos ortodonticos"});

cargar_datos();

int opcion;
while (true) {
cout << "\nMenu:\n";
cout << "1. Programar una cita\n";
cout << "2. Ver citas ocupadas\n";
cout << "3. Ver personas registradas para cita\n";
cout << "4. Salir\n";
cout << "Ingrese su opcion: ";
while (!(cin >> opcion)) {
cout << "Entrada no válida. Por favor, ingrese un numero." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

cin.ignore(numeric_limits<streamsize>::max(), '\n');

switch (opcion) {
case 1:
programar_cita(listaUsuarios, citas, servicios);
break;
case 2:
ver_citas_ocupadas(citas, servicios);
break;
case 3:

cargar_datos_usuarios();
ver_personas_registradas(listaUsuarios);
break;
case 4:

guardar_datos(listaUsuarios, citas);
cout << "Saliendo del programa.\n";
return 0;
default:
cout << "Opcion invalida. Por favor, ingrese una opción valida.\n";
}
}

return 0;
}

También podría gustarte