Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
alesw99 opened this issue Feb 21, 2024 · 0 comments
Open

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

alesw99 opened this issue Feb 21, 2024 · 0 comments

Comments

@alesw99
Copy link

alesw99 commented Feb 21, 2024

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++
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant