[
attachment=2505]
Aca adjunto una imagen del final.
Como se resuelve?
Tiene tres archivos: Inscrip.dat, Materias.dat, Carreras.dat
Hay que usar un Array [1..15] de registros que tengan codCar, nomCar y libro.
Tambien una lista con sublista...los campos de la lista son codCar, codMat, subList, sig
En la sublista los campos son legajo, nombre, siguiente.
-Lo que hay que hacer es recorrer secuencialmente el archivo de Carreras (ordenado de forma ascendente por codCar) e ir cargando los registros de archivo en el array, si quieren, para que sea mas eficiente, usen un LEN, porque dice que el maximo de carreras son 15, pero nunca asegura que en todas van a tomar final.
-Despues recorren secuencialmente el archivo de materias y van cargando la lista principal con los campos que antes explique!
ACA HAY DOS FORMAS DE HACERLO: EN EL FINAL PIDEN IMPRIMIR EL LISTA CON CODIGO DE CARRERA Y MATERIA ASCENDENTE, PERO EN EL ARCHIVO ESTA ORDENADO DESCENDENTE. PUEDEN INSERTAR ORDENADO O MEJOR TODAVIA UTILIZAR UNA PILA, ASI SE ASEGURAN QUE EL QUE PRIMERO SAQUEN PARA IMPRIMIR VA A SER EL ULTIMO DEL ARCHIVO (EL MENOR). LO MAS EFICIENTE ES USAR LA PILA.
- Lo que hacen despues es recorrer el archivo de Inscripciones. A medida que leen un registro usan la funcion buscarEnLista, le pasan la lista principal y el reg.mat, la funcion les devuelve el nodo correspondiente. Despues llaman a la funcion InsertaOrdenado, le pasan la sublista y reg. El InsertaOrdenado lo hacen por apellido ascendente, ya que el archivo de inscripciones no tiene orden.
-Bueno, en este momento tienen casi todo resuelto, con todas las estructuras cargadas. Ahora, aunq no parezca, lo mas dificil es imprimir el listado.
Presten atencion a lo que dice en el examen despues del Listado....el libro es uno por carrera (perfecto, ya esta en el array) pero el Folio empieza en 1 EN CADA CARRERA y aumenta cuando el ORDEN supera los veinte (el orden se reinicia a 1 si esto pasa) o cuando CAMBIA LA MATERIA.
Lo mejor para hacer aca es recorrer la lista con una especie de corte de control. Recuerden que tienen la lista ordenada ascendente por carrera y materia. Hacen corte de control por el campo lista^.codCar, asi que cada vez que el campo sea distinto al ultimo leido reinician el Folio a 1. Asi solucionamos el tema de que el folio sea 1 cada vez que se lea una carrera nueva.
Bueno, ahora viene lo mas jodido, desapilamos el primer nodo (conviene que desapilar devuelva el nodo desapilado y no el valor de algun campo). A eso nodo le llamamos por ejemplo "P". Entonces ahora hay que recorrer P^.sublst (donde estan cargados los alumnos) mientras sea distinto de NiL. Pero que pasa si hay mas de 20 alumnos..hay que tener cuidado con ORDEN y FOLIO.
Antes de entrar en el WHILE P^.SUBLST <> NIL conviene crear una variable booleana: por ejemplo finAlumnos y asignarle FALSE.
Entonces hacemos un WHILE NOT FINALUMNOS y debajo mostramos FOLIO, inicializamos ORDEN en 1 y despues si hacemos el while de la sublista, pero lo hacemos de esta manera WHILE P^.SUBLST <> NIL AND ORDEN<=20, entonces vamos mostrando los datos de los nodos de la sublista. En un momento el ciclo va a cortar, entonces afuera del ultimo while que explique pero dentro del WHILE NOT FINALUMNOS hacemos un IF ORDEN > 20, y en el lado izquierdo aumentamos en uno el folio, en el derecho ponemos en true a finAlumnos y aumentamos el folio en 1. ( Si sale por el lado derecho significa que el ciclo termino porque la sublista quedo vacia, por lo tanto va a cambiar de materia).
Asi se cierran los dos WHILE y luego avanzan la lista principal al nodo siguiente...y asi se resuelve.
Otra cosa, para imprimir el nombre de la carrera y el libro hacen BuscarEnArray y le pasan el lista^.codCar y el array.
Si tienen alguna duda pregunten!
Saludos y suerte!