/* */

24 de agosto de 2007

Programacion Canal TV

.
Enunciado
Un canal de televisión por cable desea confeccionar la programación de peliculas para un mes determinado. Para ello cuenta con los siguientes archivos:

PELICULAS.dat - Sin orden, con un registro por cada película que tiene disponible el canal. Máximo 5000 registros, con el siguiente diseño.

  • codPel - 5 caracteres
  • titulo - 30 caracteres
  • actores - 30 caracteres
  • director - 20 caracteres
  • duracion - (en minutos, entre 1 y 240)
  • categoria - 1 a 4
Las categorías están clasificadas según la siguiente tabla:



SELECCION.dat - Sin ningún orden con un registro por dcada uno de los títulos seleccionados para emitir. Una misma película puede emitirse hasta 4 veces en el mismo mes, en diferentes días o en el mismo día en diferente horario.
  • codPel
  • dia - 1 a 31
  • horaInic - 0 a 23
  • minInic - 0 a 59

Se pide

1 - desarrollar un programa que imprima la programación del mes con el siguiente diseño:



Se debe tener en cuenta que no necesariamente los archivos son consistentes. Es decir: puede haber películas seleccionadas en el archivo SELECCION.dat que no existen en el archivo PELICULAS.dat. También puede haber peliculas planificadas fuera de la franja horaria permitida según su categoría y puede haber superposición con la película anterior y/o con la película siguiente. Dentro del mísmo día o con el día anterior o posterior.

Por lo tanto en el listado solo de deben considerar las películas planificadas correctamente, es decir: aquellas que existen, que están en horario y que no se superponen.

2 - Grabar en un archivo los horarios sin programación asignada, con un registro por cada intervalo disponible, con el siguiente formato de registro:
  • dia
  • horaDesde
  • minDesde
  • horaHasta
  • minHasta
En caso de habere días enteros sin programación entonces solo se debe grabar un único registro por día con los campos horaDesde, minDesde, horaHasta, minHasta en cero.

Restricciones
  • Memoria para estructuras dinámicas - nodos de 14 bytes
  • Memoria para arrays - 124 bytes


Análisis
En este problema tenemos un archivo de consultas: PELICULAS.dat y un archivo de movimientos: SELECCION.dat.

Por cada película seleccionada para emitir tenemos que averiguar su categoría ya que con ese dato podemos determinar si la película está planificada a una hora permitida o no. También necesitaremos averiguar su duración para evaluar si existe superposición o no con la siguiente programación. Estos datos se encuentran en el archivo de películas.

La estrategia será recorrer el archivo de movimientos (SELECCION.dat) y por película seleccionada para emitir consultar estos datos en el archivo de consultas (PELICULAS.dat).

Ahora bien, para poder consultar de manera rápida y eficiente el archivo de consultas lo tendremos que indexar en una lista enlazada, donde cada nodo almacenará el codPel y la posición del registro.


Cada nodo de la lista tiene 12 bytes por lo que no excede las restricciones que impone el enunciado.

Como el archivo SELECCION.dat no tiene ningún orden no nos queda otra opción que procesarlo completamente antes de poder imprimir el listado y grabar el archivo de "baches" libres.

Para esto vamos a ir cargando su contenido


Este gráfico representa una estructura formada por un array de 31 punteros a nodos que contienen el código de película, el minuto desde y el minuto hasta que insumirá la esa programación.

El array insume 31 * 4 bytes = 124 bytes. Entra dentro lo previsto por las restricciones y cada nodo insume: codPel: 4bytes, minDD y minHH 2 bytes cada campo y el puntero al siguiente nodo 4 bytes. Total: 14 bytes.

Veamos la sección type.
 1:
2:type
3: // registro para PELICULAS.dat
4: RPelicula = record
5: codPel: string[5];
6: titulo: string[30];
7: actores: string[30];
8: director: string[20];
9: duracion: byte;
10: categoria: byte;
11: end;
12: FPelicula = file of RPelicula;
13:
14: // registro para SELECCION.dat
15: RSeleccion = record
16: codPel: string[5];
17: dia: byte;
18: horaInic: byte;
19: ninInic: byte;
20: end;
21: FSeleccion = file of RSeleccion;
22:
23: // nodo para Indice de Peliculas
24: PNIdxPel = ^NIdxPel;
25: NIdxPel = record
26: codPel: string[5];
27: pos: word;
28: sig: PNIdxPel;
29: end;
30:
31: // nodo Programacion de Peliculas
32: PNProg = ^NProg;
33: NProg = record
34: codPel: string[5];
35: minDD: word;
36: minHH: word;
37: sig: PNProg;
38: end;
39:

----------------



No hay comentarios: