Examen de Prácticas de programación UOC 2023 · síntesis. (Enero 2023)

Examen de Prácticas de programación de la UOC (Grado en Ingeniería Informática) 2023, síntesis. (Enero 2023): 5 problemas con solución. Gratis.

Temas del examen: Especificación: precondiciones y postcondiciones · Diseño descendente sobre vectores de registros en lenguaje algorítmico · Comprensión y traza de algoritmos recursivos · Transformación entre versión recursiva e iterativa en C · Análisis de complejidad y eficiencia

Pregunta 1.a · Especificación: precondiciones y postcondiciones

En el marco del software desarrollado para la administración de entidades sin ánimo de lucro (ONG), considérense exclusivamente las siguientes estructuras de datos:

type

tPerson = record

document: string;

name: string;

surname: string;

email: string;

address: string;

city: string;

birthday: tDate;

end record

tStaff = record

elems: pointer to tPerson;

count: integer;

end record

tAvailability = record

person: tPerson;

start: tDate;

end: tDate;

end record

tAvailabilityData = record

elems: pointer to tAvailability;

count: integer;

end record

tONG = record

code: string;

name: string;

projects: tProjectData;

staff: tStaff;

campaigns: tCampaignData;

staffAvailability: tAvailabilityData;

end record

end type

Se plantea la especificación de la siguiente operación:

function available_people_city (ong: tONG, city: string): integer

Su cometido es contabilizar cuántos integrantes adscritos a ong residen en la localidad indicada por city y cuentan, además, con algún registro de disponibilidad.

a)

[10%] Redacta formalmente las precondiciones que debe satisfacer la rutina. Se parte de la premisa de que la plantilla no se encuentra vacía y que a cada uno de sus miembros le corresponde como mínimo un intervalo de disponibilidad registrado en el sistema. Acompaña la expresión formal con una breve aclaración explicativa (1 o 2 líneas).

Pregunta 1.b · Diseño descendente sobre vectores de registros en lenguaje algorítmico

En el marco del software desarrollado para la administración de entidades sin ánimo de lucro (ONG), considérense exclusivamente las siguientes estructuras de datos:

type

tPerson = record

document: string;

name: string;

surname: string;

email: string;

address: string;

city: string;

birthday: tDate;

end record

tStaff = record

elems: pointer to tPerson;

count: integer;

end record

tAvailability = record

person: tPerson;

start: tDate;

end: tDate;

end record

tAvailabilityData = record

elems: pointer to tAvailability;

count: integer;

end record

tONG = record

code: string;

name: string;

projects: tProjectData;

staff: tStaff;

campaigns: tCampaignData;

staffAvailability: tAvailabilityData;

end record

end type

Se plantea la especificación de la siguiente operación:

function available_people_city (ong: tONG, city: string): integer

Su cometido es contabilizar cuántos integrantes adscritos a ong residen en la localidad indicada por city y cuentan, además, con algún registro de disponibilidad.

b. [40%] Desarrolla la solución en lenguaje algorítmico empleando una estrategia de diseño modular descendente. Descompón el problema en los subalgoritmos que consideres precisos y documenta cada módulo con un conciso comentario sobre su propósito funcional (1 o 2 líneas por procedimiento o función).

Pregunta 2.a-b · Comprensión y traza de algoritmos recursivos

Pregunta 2 (50%). Análisis y desarrollo de método recursivo e iterativo

Se facilita el código siguiente escrito en lenguaje C correspondiente a una función denominada mystery. Cabe recordar que el operador de división / aplicado entre cantidades enteras calcula la división truncada (cociente entero):

void mystery (int x)

{

int res;

assert(x >= 0); // (1)

if (x >= 2) // (2)

res = 1 + mystery(x / 2); // (3)

else // (4)

res = 1; // (5)

return res; // (6)

} Nota: Aunque la firma original indica void, la rutina incluye sentencias return res; devolviendo un entero.

a)

[10%] Describe la labor computacional que efectúa mystery. Detalla adicionalmente el árbol o pila de llamadas paso a paso empleando un esquema gráfico de marcos/cajas con los parámetros y valores de retorno para la invocación:

mystery(25);

b)

[5%] Razona qué efecto provocaría sustituir la aserción de la línea (1) por la siguiente instrucción condicional:

if (x < 0) x = -x;

Pregunta 2.c · Transformación entre versión recursiva e iterativa en C

Pregunta 2 (50%). Análisis y desarrollo de método recursivo e iterativo

Se facilita el código siguiente escrito en lenguaje C correspondiente a una función denominada mystery. Cabe recordar que el operador de división / aplicado entre cantidades enteras calcula la división truncada (cociente entero):

void mystery (int x)

{

int res;

assert(x >= 0); // (1)

if (x >= 2) // (2)

res = 1 + mystery(x / 2); // (3)

else // (4)

res = 1; // (5)

return res; // (6)

} Nota: Aunque la firma original indica void, la rutina incluye sentencias return res; devolviendo un entero.

c)

[20%] Reescribe el algoritmo en C bajo un enfoque no recursivo (iterativo). Añade una explicación sintética del mecanismo empleado en tu versión.

Pregunta 2.d · Análisis de complejidad y eficiencia

Pregunta 2 (50%). Análisis y desarrollo de método recursivo e iterativo

Se facilita el código siguiente escrito en lenguaje C correspondiente a una función denominada mystery. Cabe recordar que el operador de división / aplicado entre cantidades enteras calcula la división truncada (cociente entero):

void mystery (int x)

{

int res;

assert(x >= 0); // (1)

if (x >= 2) // (2)

res = 1 + mystery(x / 2); // (3)

else // (4)

res = 1; // (5)

return res; // (6)

} Nota: Aunque la firma original indica void, la rutina incluye sentencias return res; devolviendo un entero.

d)

[15%] Evalúa el coste temporal en el peor caso del procedimiento original recursivo, justificando con rigor analítico la formulación matemática de la recurrencia y su deducción.

También puedes estudiar por temas

Practica un tema con ejercicios de los exámenes de todos los años, mezclados.

Ver los 5 temas

Otras convocatorias de 2023

Examen Prueba de síntesis enero 2023 (2023) · Prueba de síntesis de Prácticas de programación (Enero de 2023) (2023)