Necesito ayuda para encontrar el problema en mi código.

Iniciado por temporalEotw, 18 Febrero 2021, 15:32 PM

0 Miembros y 1 Visitante están viendo este tema.

temporalEotw

Buenos días/tardes/noches. Hago este post como último recurso para intentar encontrar un "bug" en mi código, el cual no deja que el programa se ejecute correctamente.

EXPLICACIÓN: Como dice el ejercicio en el código, necesito hacer un programa que almacene clientes de un banco en una cola para posteriormente mostrarlos de forma ordenada, en teoría ya tengo el código hecho pero, por alguna razón que desconozco al momento de ejecutar el programa este deja de funcionar...

Por favor, si no es molestia ayúdenme. De paso acepto consejos para mejorar y/o optimizar mi código, gracias!

CÓDIGO:

Código (cpp) [Seleccionar]
/*
    Hacer un programa que guarde datos de clientes de un banco, los almacene en cola, y
    por ultimo muestre los clientes en el orden correcto.
*/

#include <iostream>
#include <conio.h>

#define DEFAULT_BALANCE 500

/*******************************************************************************************************************************/

struct Account
{
double balance;
char name[60];
int id, age;
};

struct Node
{
Account account;
Node * next;
};

/*******************************************************************************************************************************/

void insert_into_queue(Node *&, Node *&, Account);
void create_account(Node *&, Node *&, int&);
void delete_queue(Node *&, Node *&, int&);
void show_accounts(Node *, Node *);
bool empty(Node * front);
int menu();

/*******************************************************************************************************************************/

int main()
{
Node * front, * back;
int option, amount = 0;

do
{
option = menu();

switch (option)
{
case 1: create_account(front, back, amount);
case 2: show_accounts(front, back);
case 3: delete_queue(front, back, amount);
case 4: exit(0);

default: break;
}
}  while (option != 4);

return 0;
}

/*******************************************************************************************************************************/

int menu()
{
int option;

do
{
system("cls");

std::cout << "\n\t> 1. Registrar una cuenta.";
std::cout << "\n\t> 2. Mostrar cuentas registradas.";
std::cout << "\n\t> 3. Eliminar las cuentas registradas.";
std::cout << "\n\t> 4. Salir del programa.";

std::cout << "\n\n\t> Opcion: ";
std::cin >> option;
std::cin.ignore(256, '\n');
} while (option < 1 || option > 4);

return option;
}
/*******************************************************************************************************************************/

bool empty(Node * front)
{
return (front == NULL) ? true : false;
}

/*******************************************************************************************************************************/

void create_account(Node *& front, Node *& back, int& amount)
{
system("cls");

Account account;

std::cout << "\n\t> Nombre Apellido: "; std::cin.getline(account.name, 60);
std::cout << "\t> Edad: "; std::cin >> account.age;
std::cin.ignore(256, '\n');

account.balance = DEFAULT_BALANCE;
account.id = amount;

amount++;
insert_into_queue(front, back, account);
}

/*******************************************************************************************************************************/

void insert_into_queue(Node *& front, Node *& back, Account account)
{
Node * new_node = new Node();

new_node->account = account
new_node->next = NULL;

if (empty(front))
front = new_node;
else
back->next = new_node;

back = new_node;

std::cout << "\n\t> Cuenta (identificador: " << account.id << ") registrada correctamente.";
_getch();
}

/*******************************************************************************************************************************/

void show_accounts(Node * front, Node * back)
{
system("cls");

if (!empty(front))
{
while (!empty(front))
{

Account account = front->account;

std::cout << "\n\t> Cuenta numero " << account.id << ".\n";

std::cout << "\n\t> Nombre Apellido: " << account.name << ".";
std::cout << "\n\t> Edad: " << account.age << ".";
std::cout << "\n\t> Balance: " << account.balance << ".";

if (front == back)
break;
else
front = front->next;

std::cout << "\n\t> Presione una tecla para ver la siguiente cuenta.";
}
}
else
std::cout << "\n\t> No hay cuentas registradas!";

_getch();
}

/*******************************************************************************************************************************/

void delete_queue(Node *& front, Node *& back, int& amount)
{
amount = 0;

if (!empty(front))
{
while (!empty(front))
{
Node * temp = front;

if (front == back)
{
front = NULL;
back = NULL;
}
else
front = front->next;

delete temp;
}

std::cout << "\n\t> Cuentas eliminadas correctamente.";
}
else
std::cout << "\n\t> No hay cuentas registradas!";

_getch();
}

@XSStringManolo

Probaste a utilizar un debugger? gdb es bastante sencillo. Y/O haz una función que haga cout y la llamas tras cada linea del programa. debuggear("linea1") //hasta linea 1 funciona.

temporalEotw

#2
Ya pillé el error, gracias! Debía de inicializar las variables o bueno, punteros front y back en NULL, por eso obtenía el error.

Al final el código me quedó así:

Código (cpp) [Seleccionar]
/*
    Hacer un programa que guarde datos de clientes de un banco, los almacene en cola, y
    por ultimo muestre los clientes en el orden correcto.
*/

#include <iostream>
#include <conio.h>

#define DEFAULT_BALANCE 500

/*******************************************************************************************************************************/

struct Account
{
double balance;
char name[60];
int id, age;
};

struct Node
{
Account * account;
Node * next;
};

/*******************************************************************************************************************************/

void insert_into_queue(Node *&, Node *&, Account *);
void create_account(Node *&, Node *&, int&);
void delete_queue(Node *&, Node *&, int&);
void show_accounts(Node *, Node *);
bool empty(Node *);
int menu();

/*******************************************************************************************************************************/

int main()
{
Node * front = NULL, * back = NULL;
int option, amount = 0;

do
{
option = menu();

switch (option)
{
case 1: create_account(front, back, amount); break;
case 2: show_accounts(front, back); break;
case 3: delete_queue(front, back, amount); break;
case 4: exit(0);

default: break;
}
}  while (option != 4);

return 0;
}

/*******************************************************************************************************************************/

int menu()
{
int option;

do
{
system("cls");

std::cout << "\n\t> 1. Registrar una cuenta.";
std::cout << "\n\t> 2. Mostrar cuentas registradas.";
std::cout << "\n\t> 3. Eliminar las cuentas registradas.";
std::cout << "\n\t> 4. Salir del programa.";

std::cout << "\n\n\t> Opcion: ";
std::cin >> option;
std::cin.ignore(256, '\n');
} while (option < 1 || option > 4);

return option;
}
/*******************************************************************************************************************************/

bool empty(Node * front)
{
return (front == NULL) ? true : false;
}

/*******************************************************************************************************************************/

void create_account(Node *& front, Node *& back, int& amount)
{
system("cls");

Account * account = new Account();

std::cout << "\n\t> Nombre Apellido: "; std::cin.getline(account->name, 60);
std::cout << "\t> Edad: "; std::cin >> account->age;
std::cin.ignore(256, '\n');

account->balance = DEFAULT_BALANCE;
account->id = amount;

amount++;

insert_into_queue(front, back, account);
}

/*******************************************************************************************************************************/

void insert_into_queue(Node *& front, Node *& back, Account * account)
{
Node * new_node = new Node();

new_node->account = account;
new_node->next = NULL;

if (empty(front))
front = new_node;
else
back->next = new_node;

back = new_node;

std::cout << "\n\t> Cuenta (identificador: " << account->id << ") registrada correctamente.";
_getch();
}

/*******************************************************************************************************************************/

void show_accounts(Node * front, Node * back)
{
if (!empty(front))
{
while (!empty(front))
{
system("cls");
Account * account = front->account;

std::cout << "\n\t> Cuenta numero " << account->id << ".\n";

std::cout << "\n\t> Nombre Apellido: " << account->name << ".";
std::cout << "\n\t> Edad: " << account->age << ".";
std::cout << "\n\t> Balance: " << account->balance << ".";

if (front == back)
{
std::cout << "\n\n\t> Ultima cuenta, presione una tecla para volver al menu.";
break;
}
else
front = front->next;

std::cout << "\n\n\t> Presione una tecla para ver la siguiente cuenta.";
_getch();
}
}
else
std::cout << "\n\t> No hay cuentas registradas!";

_getch();
}

/*******************************************************************************************************************************/

void delete_queue(Node *& front, Node *& back, int& amount)
{
amount = 0;

if (!empty(front))
{
while (!empty(front))
{
Node * temp = front;

if (front == back)
{
front = NULL;
back = NULL;
}
else
front = front->next;

delete temp;
}

std::cout << "\n\t> Cuentas eliminadas correctamente.";
}
else
std::cout << "\n\t> No hay cuentas registradas!";

_getch();
}