Skip to content

terminate called after throwing an instance of 'std::bad_alloc #218

@alesw99

Description

@alesw99

Exercise information

#include
#include
#include
#include
#include
#include
#include

using namespace std;

struct Producto {
int id;
string nombre;
string descripcion;
int stock;
double precio;
};

struct Carrito {
int id_producto;
int cantidad;
};

struct Cliente {
int cedula;
string nombre;
string apellido;
string telefono;
vector carrito;
};

struct Factura {
int id_cliente;
double total;
vector detalles;
};

class Supermercado {
vector productos;
queue cola_clientes;
stack carrito_actual;
vector facturas;
int contador_clientes;
int contador_compras;
int contador_tiempo_excedido;

public:
Supermercado() : contador_clientes(0), contador_compras(0), contador_tiempo_excedido(0) {}

void cargar_productos() {
// Leer productos desde un archivo
ifstream archivo("productos.txt");
if (archivo.is_open()) {
while (!archivo.eof()) {
Producto producto;
archivo >> producto.id >> producto.nombre >> producto.descripcion >> producto.stock >> producto.precio;
productos.push_back(producto);
}
archivo.close();
} else {
cout << "Error al abrir el archivo de productos." << endl;
}
}

void agregar_cliente() {
Cliente cliente;
cliente.cedula = rand() % 10000000 + 10000000;
cout << "Ingrese el nombre del cliente: ";
cin >> cliente.nombre;
cout << "Ingrese el apellido del cliente: ";
cin >> cliente.apellido;
cout << "Ingrese el telefono del cliente: ";
cin >> cliente.telefono;
cola_clientes.push(cliente);
contador_clientes++;
}

void seleccionar_producto(int id_producto, int cantidad) {
if (carrito_actual.size() < 30) {
Carrito carrito;
carrito.id_producto = id_producto;
carrito.cantidad = cantidad;
carrito_actual.push(carrito);
} else {
cout << "El carrito no puede tener más de 30 artículos." << endl;
}
}

void procesar_compra() {
if (!cola_clientes.empty()) {
Cliente cliente = cola_clientes.front();
cola_clientes.pop();
time_t inicio = time(0);
while (!carrito_actual.empty() && time(0) - inicio < 600) {
Carrito carrito = carrito_actual.top();
carrito_actual.pop();
cliente.carrito.push_back(carrito);
}
if (time(0) - inicio >= 600) {
contador_tiempo_excedido++;
cout << "El cliente " << cliente.nombre << " " << cliente.apellido << " superó el máximo de tiempo para comprar." << endl;
} else {
contador_compras++;
Factura factura;
factura.id_cliente = cliente.cedula;
factura.total = 0;
for (Carrito carrito : cliente.carrito) {
Producto producto = productos[carrito.id_producto - 1];
factura.detalles.push_back(carrito);
factura.total += producto.precio * carrito.cantidad;
}
facturas.push_back(factura);
imprimir_ticket(factura);
}
} else {
cout << "No hay clientes en la cola." << endl;
}
}

Cliente cliente;

void imprimir_ticket(Factura factura) {
cout << "Datos del cliente:" << endl;
cout << "Cédula: " << factura.id_cliente << endl;
cout << "Nombre: " << cliente.nombre << endl;
cout << "Apellido: " << cliente.apellido << endl;
cout << "Teléfono: " << cliente.telefono << endl;
cout << "Contenido del carrito:" << endl;
int indice = 1;
for (Carrito carrito : factura.detalles) {
Producto producto = productos[carrito.id_producto - 1];
cout << indice++ << ". Referencia: " << producto.id << endl;
cout << "Nombre: " << producto.nombre << endl;
cout << "Precio unitario: " << producto.precio << endl;
cout << "Cantidad: " << carrito.cantidad << endl;
cout << "Precio: " << producto.precio * carrito.cantidad << endl;
}
cout << "Total: " << factura.total << endl;
}

void generar_reportes() {
cout << "Cantidad de clientes que se presentaron a comprar: " << contador_clientes << endl;
cout << "Cantidad de clientes con compras realizadas: " << contador_compras << endl;
cout << "Clientes que superaron el máximo de tiempo para comprar: " << contador_tiempo_excedido << endl;

// Calcular producto más vendido
int contador_productos[100] = {0};
for (Factura factura : facturas) {
for (Carrito carrito : factura.detalles) {
contador_productos[carrito.id_producto]++;
}
}
int id_producto_mas_vendido = 0;
int max_vendidos = 0;
for (int i = 1; i < 100; i++) {
if (contador_productos[i] > max_vendidos) {
id_producto_mas_vendido = i;
max_vendidos = contador_productos[i];
}
}
Producto producto_mas_vendido = productos[id_producto_mas_vendido - 1];
cout << "Producto más vendido: " << endl;
cout << "Referencia: " << producto_mas_vendido.id << endl;
cout << "Nombre: " << producto_mas_vendido.nombre << endl;
cout << "Cantidad vendida: " << max_vendidos << endl;

// Totales de ventas
double total_ventas = 0;
for (Factura factura : facturas) {
total_ventas += factura.total;
}
cout << "Totales de ventas: " << total_ventas << endl;

// Ultimas 10 facturas/tickets
cout << "Ultimas 10 facturas/tickets:" << endl;
for (int i = facturas.size() - 1; i >= 0 && i >= facturas.size() - 10; i--) {
imprimir_ticket(facturas[i]);
cout << endl;
}
}
};

int main() {
srand(time(0));
Supermercado hipermod;
hipermod.cargar_productos();

int opcion = 0;
while (opcion != 5) {
cout << "Menu principal:" << endl;
cout << "1. Agregar cliente" << endl;
cout << "2. Seleccionar producto" << endl;
cout << "3. Procesar compra" << endl;
cout << "4. Generar reportes" << endl;
cout << "5. Salir" << endl;
cin >> opcion;

switch (opcion) {
  case 1: hipermod.agregar_cliente();
    break;
  case 2:
    int id_producto;
    int cantidad;
    cout << "Ingrese el ID del producto: ";
    cin >> id_producto;
    cout << "Ingrese la cantidad: ";
    cin >> cantidad;
    hipermod.seleccionar_producto(id_producto, cantidad);
    break;
  case 3: hipermod.procesar_compra();
    break;
  case 4: hipermod.generar_reportes();
    break;
}

}
return 0;
}

Question or Bug

Your enviroment information

  • System: ❔ Windows 10
  • Compiler version/IDE: ❔ Dev-C++

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions