Ejericio profesores Una aplicación informática de un centro universitario dispone de la siguiente información sobre una carrera: Por cada asignatura: a) código de asignatura (único); b) nombre de la asignatura; c) curso; d) créditos; e) dni del profesor que la imparte. Por cada profesor: a) nombre del profesor b) dni; c) fecha de ingreso en la Universidad; d) fecha de nacimiento; e) categoría (catedrático, titular, asociado o ayudante). Teniendo en cuenta que un profesor puede impartir más de una asignatura, diseñar las estructuras de datos apropiadas y los siguientes subprogramas: 1) ProfesorAsignatura. A partir de la(s) estructura(s) de datos adecuada y el código de la asignatura, obtener el nombre del profesor que imparte la asignatura si existe la asignatura y el profesor. Devolverá FALSO si no se puede obtener el nombre por cualquier circunstancia. 2) SueldoMedioAnual. A partir de la(s) estructura(s) de datos adecuada calcula el sueldo medio al año de los profesores del centro. El sueldo base anual depende de la categoría: a) Catedrático: 2000 euros b) Titular: 1500 euros c) Asociado: 1000 euros d) Ayudante: 800 euros Hay que tener en cuenta que si el profesor es numerario (catedrático o titular) el sueldo incluye un complemento que se calcula en función del número de años que el profesor ha trabajado en la Universidad, cobrando 90 euros mensuales por cada cinco años completos trabajados. Suponed que la fecha actual es el 31 de diciembre de 2002. Si el profesor es no numerario (asociado o ayudante) el sueldo no incluirá el complemento de quinquenios. CONST N MaxCadena = 256 N MaxProfesores = 250 N MaxAsignaturas = 250 TIPOS // Tipos básicos ENUM { Catedratico, Titular, Asociado, Ayudante } TCategoria ENUM { Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic } TMes REGISTRO TFecha N dia TMes mes N año FINREGISTRO C TCadena[0..MaxCadena] // Estructura de datos para los profesores de una carrera REGISTRO UnProfesor dni N dni dni dni TCadena nombre nombre nombre nombre TFecha f_ingreso ... ... f_ingreso ... TFecha f_nacim f_ingreso f_ingreso TCategoria puesto f_nacim B ejerce // FALSO para los huecos en array f_nacim f_nacim FINREGISTRO UnProfesor TProfesores[1..MaxProfesores] puesto puesto puesto ejerce // Estructura de datos para las asignaturas ejerce V ejerce REGISTRO UnaAsignatura F V TCadena nombre N codigo dni dni N curso dni nombre N creditos nombre ... nombre N dni_prof ... ... curso B impartida // FALSO para los huecos en array curso FINREGISTRO curso creditos UnaAsignatura TCarrera[1..MaxAsignaturas] creditos creditos dni_prof CONST dni_prof dni_prof // tabla de constantes impartid impartid R Salarios[Catedratico..Ayudante] = F impartid V { 2000, 1500, 1000, 800 } V R Complemento = 90 // E mensuales /* * Determina si profesor es numerario. */ ALGORITMO B EsNumerario(E UnProfesor profesor) INICIO DEVOLVER (profesor.puesto==Catedratico) O (profesor.puesto==Titular) FIN EsNumerario /* * Busca un profesor por el dni y si existe, se devuelve VERDADERO * y se pone la posición en pos. Si no se encuentra, se devuelve FALSO. */ ALGORITMO B ExisteProfesor(E TProfesores profesores; E N dni_buscado; S N pos) VAR N i=1; B encontrado=FALSO INICIO MIENTRAS i<=MaxProfesores Y NO encontrado HACER SI profesores[i].dni == dni_buscado ENTONCES encontrado = VERDADERO pos = i SINO i = i+1 FINSI FINMIENTRAS DEVOLVER encontrado FIN ExisteProfesor /* * Busca una asignatura por el codigo y si existe, se devuelve VERDADERO * y se pone la posición en pos. Si no se encuentra, se devuelve FALSO. */ ALGORITMO B ExisteAsignatura(E TCarrera asignaturas; E N codigo_asig; S N pos) VAR N i=1; B encontrada=FALSO INICIO MIENTRAS i<=MaxAsignaturas Y NO encontrada HACER SI asignaturas[i].codigo == codigo_asig ENTONCES encontrada = VERDADERO pos = i SINO i = i+1 FINSI FINMIENTRAS DEVOLVER encontrada FIN ExisteAsignatura /* * Busca una asignatura por el codigo y si existe, se devuelve VERDADERO y * el nombre de su profesor. Si no se encuentra la asignatura o el profesor, * se devuelve FALSO. */ ALGORITMO B ProfesorAsignatura(E TCarrera asignaturas; E TProfesores profesores; E N codigo_asig; S TCadena nombre_profesor) VAR N dni, pos; B encontrado=FALSO INICIO SI ExisteAsignatura(asignaturas, codigo_asig, pos) ENTONCES dni = asignaturas[pos].dni_prof SI ExisteProfesor(profesores, dni, pos) ENTONCES encontrado = VERDADERO nombre_profesor = profesores[pos].nombre // copia física FINSI FINSI DEVOLVER encontrado FIN ProfesorAsignatura /* * Devuelve el número de quinquenios que ha trabajado un profesor * hasta el 31 de diciembre de 2002. */ ALGORITMO N Quinquenios(E UnProfesor profesor) VAR N años INICIO años = 2002 – profesor.f_ingreso.año // restamos el año de ingreso a no ser que fuera el 1 de enero SI profesor.f_ingreso.dia!= 1 O profesor.f_ingreso.mes!=Ene ENTONCES años = años-1 FINSI DEVOLVER años DIV 5 FIN Quinquenios /* * Busca un profesor por el dni y si existe, se devuelve VERDADERO * y se pone la posición en pos. Si no se encuentra, se devuelve FALSO. */ ALGORITMO R SueldoMedioAnual(E TProfesores profesores) VAR N i, en_activo=0, nquin; R sueldo_prof, sueldos INICIO PARA i=1 HASTA MaxProfesores HACER SI profesores[i].ejerce ENTONCES sueldo_prof = Salarios[profesores[i].puesto] SI EsNumerario(profesores[i].puesto) ENTONCES nquin = Quinquenios(profesores[i]) sueldo_prof = sueldo_prof+nquin*12*Complemento FINSI sueldos = sueldos + sueldo_prof en_activo = en_activo+1 FINSI FINPARA DEVOLVER sueldos/en_activo FIN SueldoMedioAnual