Es de Frankel no? me tomó uno parecido sobre traductores, si querés después lo busco.
Me parece que vos vas a tener todo en memoria y recién vas a crear el archivo cuando te envién 'F'.
Las estructuras van a ser estas:
Vector de 20 registros (uno por empleado, la posición se corresponde con su código) con los siguientes campos:
disponible:boolean (1b) //Esto es para saber si está ocupado o no
clientesAtendidos: ^tNodoCliente (4b) //Un puntero a una lista de clientes atendidos por ese empleado, los nodos deben insertarse ordenados por apellido.
Esto nos da un total de 20 registros de 5bytes = 100bytes
tNodoCliente
De cada cliente nos interesa guardarnos el tipo (si es urgente o no), el apellido, y la horas de llegada y la demora
urgente:boolean (1b)
apellido: string[17] (18b)
llegada::word (2b) //Hora de llegada en formato HHMM
demora: byte (1b)
siguiente:^tNodoCliente (4b)
1+18+2+1+4 = 26 bytes Ahora mismo no se me ocurre como hacerlo con 25 bytes, debe ser un truco loco para guardar dos números en uno sólo, pensé en combinar demora con llegada pero no me alcanzan las cifras.
tNodoUrgente
apellido: string[17] (18b)
llegada::word (2b) //Hora de llegada en formato HHMM
nroEmpleado:byte(1b)
Estrategia
Además de las listas del array vamos a tener dos colas, una de espera y otra de esperaUrgentes, usamos colas porque nos importa el orden de llegada. Primero inicializamos todo, ponemos los punteros en NIL y los boolean del array en true porque todos los empleados empiezan estando disponibles.
El programa va a tener un menú, que le pide al usuario que ingrese A U L o F, este menú va a aparecer siempre después de cada operación a menos que se seleccione F, cuando el usuario hace eso se imprime la lista, se crea el archivo URGENTES y se cierra todo, así que por ahora tendríamos esto:
begin
inicializar(vectorEmpleados,colaEspera,colaEsperaUrgentes);
pedirOpcion(opcion);
while(opcion <> 'F') do begin
atenderOpcion(opcion,vectorEmpleados,colaEspera,colaEsperaUrgentes);
pedirOpcion(opcion);
end;
imprimirListadoYCrearArchivo(vectorEmpleados);
end.
En atenderOpción tendríamos un
case of para las opciones 'A' 'U' y 'L'
A-
Solicitud de atención
1) Pedimos el apellido
2) Calculamos la hora de llegada
3) Revisamos el vector de empleados, hay dos posibilidades:
a) Encontramos un empleado disponible:
- Insertamos un nuevo nodo en la lista de ese empleado(ordenado por apellido), su demora es 99.
- Ponemos disponible en false
b) No hay empleados disponibles:
- Insertamos el nodo cliente en la colaEspera
U-
Solicitud para atención URGENTE
Lo mismo que en el anterior, pero si no hay empleados disponibles se interta el nodo en la colaEsperaUrgente.
L -
Liberación empleado
1) Leemos el código de empleado.
2) Revisamos las dos colas de espera:
a) Si las dos colas de espera están vacías ponemos
disponible en true.
b) Si hay clientes en espera:
- Comparamos el primer nodo de cada cola y tomamos el que tenga HHMM de llegada menor, si llegaron al mismo tiempo tomamos el que sea de la colaEsperaUrgente (lo eliminamos de la cola)
- Calculamos la demora.
- Insertamos el nodo en la cola del empleado que se había liberado.
Cuando salimos del while (o sea, cuando eligieron 'F'
Fin de la operación del día) recorremos el vector en orden con un for. Por cada iteración imprimimos el número (que se corresponde con el número de empleado) y comenzamos a eliminar nodos de la lista e imprimirlos, si es URGENTE los insertamos ordenados por apellido en una lista de urgentes. Cuando terminamos de imprimir el listado grabamos en el archivo lo que tenemos en la lista de urgentes.