UTNianos

Versión completa: Ayuda (Algoritmos - Parcial)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola gente, que tal. Les comento que estoy estudiando para esta materia y me cruce con este parcial que me resulto bastante raro...quería ver si alguien de ustedes me podia dar una mano, ya que no se me ocurre como generar ese archivo URGENTE ordenado por apellido. Gracias!

[Imagen: sinttulo1sls.jpg][attachment=2546]
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.
Gracias loco! Lo planteé muy parecido, solo que hice 3 listas en vez de 1 lista y 2 colas. Fue un parcial raro porque no tenía ningún archivo y todo era ingreso por teclado.

Muchas gracias!
URLs de referencia