-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgestion_mesas.cpp
214 lines (193 loc) · 5.87 KB
/
gestion_mesas.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
struct Mesas
{
int numero_mesa;
bool esta_libre;
int ganancias_acumuladas;
char nombreCliente[50]; // campo p guardar el nombre del cliente, sin esto no asignaba bien las mesas
};
struct NodoCliente
{
char nombre[50];
NodoCliente *siguiente;
};
//PROTOTIPO DE FUNCIONES
void cargarMesas(Mesas mesa[]);
void ingresaCliente(Mesas mesa[], NodoCliente *&frente, NodoCliente *&final);
void actualizarGanancia(Mesas mesa[]);
void liberarMesa(Mesas mesa[], NodoCliente *&frente, NodoCliente *&final);
void guardarMesas(Mesas mesa[]);
void encolar(NodoCliente *&frente, NodoCliente *&final, char nombre[50]);
void desencolar(NodoCliente *&frente, NodoCliente *&final, char nombre[50]);
int main()
{
Mesas mesa[15];
NodoCliente *frente = NULL;
NodoCliente *final = NULL;
cargarMesas(mesa);
int opcion;
do
{
cout << "\nMenu de opciones:\n";
cout << "1. Asignar cliente a una mesa\n";
cout << "2. Actualizar ganancia de una mesa\n";
cout << "3. Guardar cambios\n";
cout << "4. Liberar mesa\n";
cout << "5. Salir\n";
cout << "Elija una opcion: ";
cin >> opcion;
system("cls");
switch (opcion)
{
case 1:
ingresaCliente(mesa, frente, final);
break;
case 2:
actualizarGanancia(mesa);
break;
case 3:
guardarMesas(mesa);
break;
case 4:
liberarMesa(mesa, frente, final);
break;
case 5:
cout << "Saliendo del menu...\n";
break;
default:
cout << "Opcion invalida..\n";
}
} while (opcion != 5);
return 0;
}
//Funcion que carga las mesas iniciales desde el archivo
void cargarMesas(Mesas mesa[])
{
for (int i = 0; i < 15; i++)
{
mesa[i].numero_mesa = i + 1;
mesa[i].esta_libre = true;
mesa[i].ganancias_acumuladas = 0;
strcpy(mesa[i].nombreCliente, "");
}
FILE *archivo = fopen("mesas.dat", "wb");
if (archivo)
{
fwrite(mesa, sizeof(Mesas), 15, archivo);
fclose(archivo);
}
}
/*esto se encarga de asignar los clientes o a la mesa o a la cola d espera */
void ingresaCliente(Mesas mesa[], NodoCliente *&frente, NodoCliente *&final)
{
char nombre[50];
cout << "Ingrese el nombre del cliente: ";
cin >> nombre;
/*esta seccion busca la primera mesa libre y se la asigna*/
bool mesaAsignada = false;
for (int i = 0; i < 15; i++)
{
if (mesa[i].esta_libre)
{
mesa[i].esta_libre = false;
strcpy(mesa[i].nombreCliente, nombre);
cout << "La mesa nro: " << mesa[i].numero_mesa << " esta ahora ocupada por " << nombre << endl;
mesaAsignada = true;
break;
}
}
//En caso de que ya no haya mesas libres, encola al siguiente cliente que quiera sentarse
if (!mesaAsignada)
{
encolar(frente, final, nombre);
cout << "Cliente " << nombre << " agregado en la cola de espera.\n";
}
}
/*actualiza las ganancias d la mesa especifica q le digas: */
void actualizarGanancia(Mesas mesa[])
{
int numeroDeMesa, ganancia;
cout << "Ingrese el numero de mesa: ";
cin >> numeroDeMesa;
if (numeroDeMesa < 1 || numeroDeMesa > 15 || mesa[numeroDeMesa - 1].esta_libre)
{
cout << "La mesa no esta siendo ocupada por nadie.\n";
return;
}
cout << "Ingrese la ganancia a agregar: ";
cin >> ganancia;
mesa[numeroDeMesa - 1].ganancias_acumuladas += ganancia;
cout << "Ganancia actualizada. Ganancia acumulada de la mesa " << numeroDeMesa << " es: " << mesa[numeroDeMesa - 1].ganancias_acumuladas << endl;
}
//Funcion que se encarga de liberar la mesa elegida segun su numero
void liberarMesa(Mesas mesa[], NodoCliente *&frente, NodoCliente *&final)
{
int numeroDeMesa;
cout << "Ingrese el numero de mesa a liberar: ";
cin >> numeroDeMesa;
if (numeroDeMesa < 1 || numeroDeMesa > 15 || mesa[numeroDeMesa - 1].esta_libre)
{
cout << "Numero de mesa invalido o ya esta libre.\n";
return;
}
mesa[numeroDeMesa - 1].esta_libre = true;
strcpy(mesa[numeroDeMesa - 1].nombreCliente, "");
cout << "Mesa " << numeroDeMesa << " liberada.\n";
// si hay cola, asigna el primero a esta mesa:
if (frente != NULL)
{
char nombreCliente[50];
desencolar(frente, final, nombreCliente);
mesa[numeroDeMesa - 1].esta_libre = false;
strcpy(mesa[numeroDeMesa - 1].nombreCliente, nombreCliente);
cout << "Cliente " << nombreCliente << " asignado a la mesa " << numeroDeMesa << " desde la cola de espera.\n";
}
}
// este void guarda la info actual d las mesas en uso en el archivo:
void guardarMesas(Mesas mesa[])
{
FILE *archivo = fopen("mesas.dat", "wb");
if (archivo)
{
fwrite(mesa, sizeof(Mesas), 15, archivo);
fclose(archivo);
cout << "Datos de las mesas guardados en el archivo.\n";
}
else
{
cout << "Error al guardar en el archivo.\n";
}
}
// Funcion para encolar al cliente a una lista de espera
void encolar(NodoCliente *&frente, NodoCliente *&final, char nombre[50])
{
NodoCliente *nuevoCliente = new NodoCliente;
strcpy(nuevoCliente->nombre, nombre);
nuevoCliente->siguiente = NULL;
if (final != NULL)
{
final->siguiente = nuevoCliente;
}
else
{
frente = nuevoCliente;
}
final = nuevoCliente;
}
//Funcion para liberar los clientes que ocuapan el numero de una mesa
void desencolar(NodoCliente *&frente, NodoCliente *&final, char nombre[50])
{
if (frente == NULL)
return;
NodoCliente *aux = frente;
strcpy(nombre, frente->nombre);
frente = frente->siguiente;
if (frente == NULL)
{
final = NULL;
}
delete aux;
}