Ejericio profesores Una aplicación informática de un centro

Anuncio
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
Descargar