Sie sind auf Seite 1von 15
grapa
grapa

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

        

75.555 13 01 18 PV

Espacio para la etiqueta identificativa con el código personal del estudiante. Prueba

!!!

Esta prueba sólo la pueden realizar los estudiantes que han aprobado la Evaluación Continua

Este enunciado corresponde también a las siguientes asignaturas:

81.578 - Prácticas de programación

Ficha técnica de la prueba

Comprueba que el código y el nombre de la asignatura corresponden a la asignatura de la cual estás matriculado.

Debes pegar una sola etiqueta de estudiante en el espacio de esta hoja destinado a ello.

No se puede añadir hojas adicionales.

No se puede realizar las pruebas a lápiz o rotulador.

Tiempo total: 1 h.

En el caso de que los estudiantes puedan consultar algún material durante la prueba, ¿cuál o cuáles pueden consultar?:      

Valor de cada pregunta:      

En el caso de que haya preguntas tipo test: ¿descuentan las respuestas erróneas? ¿Cuánto?      

NO

Indicaciones específicas para la realización de esta prueba:

      

Página 1 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Enunciados

Página 2 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Pregunta 1 [30%]

Continuando con el caso del hospital desarrollado en la PEC1, en este ejercicio se trabajará con los siguientes tipos:

const

NUM_ROOMS : integer := 200; end const

type

{ datos de la dosis de un medicamento } tDose = record idMed : integer; {el código del medicamento es un entero positivo diferente de cero}

units : integer; timesPerDay : integer; end record

{ datos del tratamiento con medicamentos de un paciente ingresado en el hospital } tTreatment = list (tDose);

{ datos del ingreso de un paciente en el hospital } tAdmission = record idPat : integer; room : integer; date : tDate; treatment : tTreatment; end record

{ datos de los pacientes, ingresos actuales y medicamentos en el hospital } tHospital = record patients : pointer to tPatient; numPat : integer; admissions : vector[NUM_ROOMS] of tAdmission; numAdm : integer; pharmacy : pointer to tMedicine; numMed : integer; end record end type

Observa que para almacenar las dosis de un tratamiento, se ha introducido una lista de la que se desconoce la implementación interna. Esto quiere decir que sólo puedes utilizar las operaciones del TAD lista para trabajar con ella.

Página 3 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Dada la función:

function number_patients_taking_medicament (h:tHospital; idMed:integer): integer

que devuelve el número de pacientes ingresados que tienen que tomar alguna dosis del medicamento con código idMed.

Se pide:

a) [10%] Indica las Pre-condiciones para esta función.

b) [20%] Implementa la función en lenguaje algorítmico aplicando la metodología de diseño descendiente. También hay que implementar todas las funciones que necesites crear en los diferentes niveles.

Solución:

a)

Pre: { idMed > 0 }

b)

Nivel 1:

function number_patients_taking_medicament (h:tHospital; idMed:integer): integer var

count, j: integer; end var

count := 0; for j:=1 to h.numAdm do if is_patient_taking_medicament (h.admissions[j], idMed) then count := count + 1;

end if

end for

return count;

end function

Nivel 2:

function is_patient_taking_medicament ( adm: tAdmission; idMed: integer) : boolean var

d : tDose; found : boolean; end var

found := FALSE;

Página 4 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

first(adm.treatment); while not end(adm.treatment) and not found do d := get(adm.treatment); if d.idMed = idMed then found := TRUE;

else

next(adm.treatment);

end if

end while

return found;

end function

Nivel 3 Las operaciones de la lista: first, end, get y next.

Página 5 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Pregunta 2 [70%] Dada la siguiente implementación de un método, donde el parámetro x es un número entero que cumple x > 0

int guess (int x)

{

int res; if (x < 2)

(1)

res = x;

(2)

else

(3)

res = x%2 + 10*guess (x/2);

(4)

return res;

(5)

}

a) [10%] Explica que hace este método. Asumiendo que la variable res ya está definida, muestra paso a paso el funcionamiento de la siguiente llamada:

res = guess (4);

Este método calcula el número equivalente a x (siendo x > 0) en el sistema binario y lo retorna.

guess(4) = 100 , donde la secuencia de llamadas es la siguiente:

guess(4) = 0 + 10·guess(2) = 10·10 = 100 guess(2) = 0 + 10·guess(1) = 10 guess(1) = 1

b) [30%] Transforma este método recursivo en un método iterativo en lenguaje C.

int guess (int x)

{

int res; res = 1; while (x >= 2) { res = x%2 + 10*res; x = x/2;

}

return res;

}

Página 6 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

c) [30%] Analiza la complejidad de la función guess.

Para analizar la complejidad computacional de esta función, hay que observar que a cada llamada recursiva el valor del parámetro x se reduce a la mitad.

El caso base (líneas 1 y 2) se limita a un condicional y una asignación. Al tratarse de dos operaciones elementales se agrupa su coste en una única constante (k 1 ).

Para calcular el caso recursivo, partimos de una asignación y 3 cálculos (línea 4) con costes constantes agrupados en k 2 , a los que tenemos que sumar el coste de la llamada recursiva.

Así pues, podemos definir la función de tiempo de la siguiente manera:

T(x) = k 1 T(x) = k 2 + T(x/2)

, si x = 1 , si x > 1

Se resuelve la recurrencia repitiendo la sustitución recursiva un total de i veces:

T(x)

= k 2 + T(x/2) =

= k 2 + (k 2 + T((x/2)/2) = 2·k 2 + T(x/4) =

= 2·k 2 + (k 2 + T((x/2)/4) = 3·k 2 + T(x/8) =

= =

= i·k 2 + T(x/2 i )

Calculamos el valor de la variable i que haga que se pueda usar la parte no recurrente de la definición de T(x):

x/2 i = 1 x = 2 i log(x) = i

Finalizamos el cálculo de T(x) con el valor calculado para la variable i :

T(x) = i·k 2 + T(x/2 i ) = log 2 (x)·k 2 + T(x/2 log 2 (x) ) = log 2 (x)·k 2 + T(x/x) = = log 2 (x)·k 2 + T(1) = log 2 (x)·k 2 + k 1

La conclusión es que la función tiene una complejidad logarítmica O(log(x)), donde x es el parámetro de entrada.

Página 7 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 8 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 9 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 10 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 11 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 12 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 13 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 14 de 15

Prueba de Síntesis 2017/18-1 Asignatura Código Fecha Hora inicio Prácticas de programación 75.555

Prueba de Síntesis 2017/18-1

Asignatura

Código

Fecha

Hora inicio

Prácticas de programación

75.555

13/01/2018

13:30

Página 15 de 15