Mensaje: #2
RE: [Algoritmos][Final] 29 de Octubre de 2009
Yo lo hice hace tiempo, creo que era así:
Vos sabés que son 20 tipos de tramites en total, y en las restricciones te dice que tenés 20 nodos de 15bytes, así que es un nodo por trámite. Cada nodo tiene que tener los suficientes datos para poder hacer el listado con los porcentajes de cada medio, para sacar un porcentaje necesitas dos cosas, una cantidad y la cantidad total, el total es la suma de las tres cantidades, así que no necesitas guardarlo en un campo, simplemente sumas cuando es necesario, lo mismo con los porcentajes generales, se van acumulando mientras imprimis la tabla.
La estructura por ahora sería así:
Código de trámite (3caracteres = 4b) | Personal |Telefono| Web| Siguiente
En Personal, Telefono y Web vas sumando la cantidad de veces que aparece en el archivo el código de trámite, ¿Cuantos bytes ocupan? 2, porque te dice que los archivos no posen más de 1000 registros, así que si por ejemplo en teléfono todos los registros fueran de un solo trámite, la suma no pasaría el nro 1000, así que basta con que sean variables de tipo Word.
En la tabla te piden además que imprimas la descripcion del trámite, pesa demasiado como para guardarlos en un nodo. En las restricciones dice que se tiene un acceso directo a cada registro del archivo de trámites además del secuencial, así que podés guardar la posicion en la que está la descripcion, la estructura queda así:
Posicion(1b pues no son más de 20 registros ya que es uno por tramite)
Código de trámite (4b)
Personal (2b)
Teléfono(2b)
Web (2b)
Siguiente(4b)
1+4+2+2+2+4 = 15b justito.
La estrategia es la siguiente, primero leer el archivo de trámites para cargar las posiciones y códigos de trámite en la lista, además de poner en 0 los contadores.
Después ir leyendo cada archivo de medio, por cada lectura buscar el codigo de tramite en la lista y sumar 1 al contador correspondiente. Es igual para los tres archivos, por eso te pide que uses un procedimiento. Le envias como parámetro el archivo que vas a leer, la lista, y la señal que es la que le va a indicar a tu método en cual de los campos sumar 1.
Eso se hace con case o ifs anidados, sería así:
abrir archivo
while (not Eof(archivo))
leer (archivo,registro)
nodo <- BuscarNodo( lista, registro.nroDeTramite)
Si la señal es 'P' : nodo^.info.personal = nodo^.info.personal +1;
Si la señal es 'T' : nodo^.info.telefono = nodo^.info.telefono +1;
Si la señal es 'W' : nodo^.info.web = nodo^.info.web +1;
fin
cerrar archivo
Una vez cargadas todas las cantidades, se reordena la lista según la suma de los tres campos, para eso usas un InsertaNodo y vas pasando los nodos a otra lista para que queden ordenados, entonces para el listado irías sacando el primer nodo. Otra opción que quizá te guste más es ir recorriendo la lista secuencialmente y buscando el máximo, una vez encontrado lo eliminas de la lista y procesas ese nodo para el listado y seguis así hasta que la lista esté vacía.
Para imprimir el listado sólo tenés que imprimir el código de trámite, buscar la descripcion leyendo el archivo tramites.dat en la posición que guardaste, y calcular cada porcentaje usando regla de tres usando como total la suma de las 3 cantidades. Mientras tanto vas acumulando el totalWeb, totalTelefono y totalPersonal para calcular los porcentajes generales al final.
Cualquier duda o si querés que te desarrolle alguna parte en diagrama o pascal para entenderla mejor avisá.
|