Examen de Fundamentos de Programación UOC 2022 · Juny

Examen de Fundamentos de Programación de la UOC (Grado en Ingeniería Informática) 2022, Juny: 5 problemas con solución. Con corrección al momento.

Temas del examen: Expresiones, tipos básicos y corrección semántica de sentencias · Comprensión de algoritmos: describir qué hace un fragmento · Esquemas de recorrido y búsqueda sobre tablas · Detección y corrección de errores en algoritmos · Modificación y ampliación de un algoritmo completo

Ejercicio 1 · Expresiones, tipos básicos y corrección semántica de sentencias

Ejercicio 1 (15% del total). Expresiones y llamadas a subprogramas

Considérense las siguientes definiciones y cabeceras de constantes, subprogramas y variables en notación algorítmica:

const

VAL_NUM1: integer = 3;

VAL_NUM2: integer = 7;

end const

function function1(x: real, y: real): integer

{ bloque interno de la función }

end function

action action1(in x: integer, inout y: integer, out z: real)

{ bloque interno de la acción }

end action

algorithm algorithm1

var

x, y: integer;

a, b: real;

isB: boolean;

end var

x:= 57;

y:= 25;

a:= 0.5;

b:= 10.0;

isB:= true;

{ -----> INSERCIÓN EN LÍNEA X <----- }

end algorithm

Valora si cada una de las siguientes tres instrucciones resulta semántica y sintácticamente válida al ser insertada en la posición LÍNEA X. Justifica pormenorizadamente cada dictamen:

a.

isB:= x = function1(a, b);

b.

action1(VAL_NUM1, VAL_NUM2, a);

c.

b:= integerToReal(function1(integerToReal(x), integerToReal(y)));

Ejercicio 2.a - Comprensión de algoritmos · Comprensión de algoritmos: describir qué hace un fragmento

Ejercicio 2 (20% del total). Lectura y diseño de algoritmos sobre tablas y registros

Se dispone de las siguientes estructuras de datos y de la definición del subprograma mysteryAction:

const

MAX_VIDEOGAMES: integer = 100;

end const

type

tAgeCategories = {AGE3, AGE12, AGE18}

{ Rangos: AGE3 (3 a 11 años), AGE12 (12 a 17 años) y AGE18 (18 o más años) }

tVideoGame = record

title: string;

price: real; { importe en euros }

recommendedAge: tAgeCategories;

end record

tVideoGamesTable = record

nVideoGames: integer;

vGamesSummary: vector[MAX_VIDEOGAMES] of tVideoGame;

end record

end type

action mysteryAction(in games: tVideoGamesTable,

out res1: integer, out res2: integer, out res3: integer)

var

i: integer;

end var

res1:= 0;

res2:= 0;

res3:= 0;

for i:= 1 to games.nVideoGames do

if games.vGamesSummary[i].recommendedAge = AGE3 then

res1:= res1 + 1;

else

if games.vGamesSummary[i].recommendedAge = AGE12 then

res2:= res2 + 1;

else

res3:= res3 + 1;

end if;

end if;

end for

end action

a.

Describe con claridad la finalidad y el comportamiento funcional que desempeña la acción mysteryAction.

Ejercicio 2.b - Esquemas de recorrido y búsqueda · Esquemas de recorrido y búsqueda sobre tablas

Ejercicio 2 (20% del total). Lectura y diseño de algoritmos sobre tablas y registros

Se dispone de las siguientes estructuras de datos y de la definición del subprograma mysteryAction:

const

MAX_VIDEOGAMES: integer = 100;

end const

type

tAgeCategories = {AGE3, AGE12, AGE18}

{ Rangos: AGE3 (3 a 11 años), AGE12 (12 a 17 años) y AGE18 (18 o más años) }

tVideoGame = record

title: string;

price: real; { importe en euros }

recommendedAge: tAgeCategories;

end record

tVideoGamesTable = record

nVideoGames: integer;

vGamesSummary: vector[MAX_VIDEOGAMES] of tVideoGame;

end record

end type

action mysteryAction(in games: tVideoGamesTable,

out res1: integer, out res2: integer, out res3: integer)

var

i: integer;

end var

res1:= 0;

res2:= 0;

res3:= 0;

for i:= 1 to games.nVideoGames do

if games.vGamesSummary[i].recommendedAge = AGE3 then

res1:= res1 + 1;

else

if games.vGamesSummary[i].recommendedAge = AGE12 then

res2:= res2 + 1;

else

res3:= res3 + 1;

end if;

end if;

end for

end action

b.

Modifica el cuerpo de la acción para que, conservando el cálculo de las categorías, determine e imprima en la salida estándar el nombre o título del artículo que posea el coste económico más alto.

Si coincidieran varios títulos con el mismo precio tope, debe presentarse el primero que figure en el vector. Se puede dar por sentado que la estructura de entrada contiene como mínimo un registro de videojuego.

Ejercicio 3 · Detección y corrección de errores en algoritmos

Ejercicio 3 (15% del total). Corrección de errores en cálculo del promedio de ventas

A partir del modelo de datos de gestión mensual de tíquets de caja de un supermercado:

const

MAX_NUM_TICKETS: integer = 150;

end const

type

tTicket = record

ticketId: integer;

numItems: integer;

price: real;

date: integer; { notación yyyymmdd }

end record

tTicketsTable = record

tickets: vector[MAX_NUM_TICKETS] of tTicket;

numTickets: integer;

end record

end type

Se requiere obtener el valor monetario medio facturado en los comprobantes correspondientes a una jornada particular fijada en dateToAnalyse. Se han redactado las dos tentativas de implementación mostradas abajo (Opción A y Opción B), pero ambas presentan fallos de programación. Identifica, razona y propone la enmienda para los errores detectados en cada alternativa (asumiendo que ticketsMonth contiene información válida y al menos un comprobante de la fecha buscada):

Propuesta A:

function computeAverage(ticketsMonth: tTicketsTable, dateToAnalyse: integer): real

var

totalPrice: real;

i: integer;

totalTickets: integer;

end var

totalPrice:= 0.0;

totalTickets:= 0;

i:= 1;

while i <= ticketsMonth.numTickets do

if ticketsMonth[i].date = dateToAnalyse then

totalPrice:= totalPrice + ticketsMonth[i].price;

totalTickets:= totalTickets + 1;

end if;

i:= i + 1;

end while

return totalPrice / integerToReal(ticketsMonth.numTickets);

end function

a)

Propuesta B:

function computeAverage(ticketsMonth: tTicketsTable, dateToAnalyse: integer): real

var

totalPrice: real;

i: integer;

totalTickets: integer;

end var

totalPrice:= 0.0;

totalTickets:= 0;

for i:= 1 to MAX_NUM_TICKETS do

if ticketsMonth.tickets[i].date = dateToAnalyse then

totalPrice:= totalPrice + ticketsMonth.tickets[i].price;

totalTickets:= totalTickets + 1;

end if;

i:= i + 1;

end for

return totalPrice / integerToReal(totalTickets);

end function

b)

Ejercicio 4 · Modificación y ampliación de un algoritmo completo

Ejercicio 4 (50% del total). Comprensión y modificación de algoritmos de gestión de clientes

A continuación se facilita el código de un algoritmo que efectúa la gestión de clientes y pólizas de un servicio:

1 const

2 MIN_CUSTOMERS: integer = 1; { Mínimo número de clientes admisible }

3 MAX_CUSTOMERS: integer = 10; { Máximo número de clientes admisible }

4 end const

5

6 type

7 tCustomer = record

8 customerId: integer;

9 isPolicyHolder: boolean;

10 insurancePremium: real;

11 end record

12

13 tCustomerTable = record

14 customers: vector[MAX_CUSTOMERS] of tCustomer;

15 numCustomers: integer;

16 end record

17 end type

18

19 algorithm UOCRepairService

20 { Bloque de variables }

21 var

22 customerTable: tCustomerTable;

23 averageInsurancePremium: real;

24 totalCustomers: integer;

25 numPolicyHolders: integer;

26 i: integer;

27 auxSum: real;

28 end var

29

30 { Fase de inicialización }

31 averageInsurancePremium:= 0.0;

32 auxSum:= 0.0;

33 customerTable.numCustomers:= 0;

34 numPolicyHolders:= 0;

35

36 { Petición de volumen de clientes }

37 writeString("INPUT DATA");

38 writeString("NUMBER OF CUSTOMERS? (1-10) >>");

39 totalCustomers:= readInteger();

40 { Filtro de validación de rango }

41

42 while totalCustomers < MIN_CUSTOMERS or totalCustomers > MAX_CUSTOMERS do

43 writeString("INVALID DATA, TRY AGAIN!");

44 writeString("NUMBER OF CUSTOMERS? (1-10) >>");

45 totalCustomers:= readInteger();

46 end while

47

48 for i:= 1 to totalCustomers do

49 writeString("CUSTOMER #");

50 writeInteger(i);

51 writeString("ID? (AN INTEGER) >>");

52 customerTable.customers[i].customerId:= readInteger();

53 writeString("IS POLICY HOLDER? (FALSE, TRUE) >>");

54 customerTable.customers[i].isPolicyHolder:= readBoolean();

55 writeString("INSURANCE PREMIUM [EUR]? (A REAL) >>");

56 customerTable.customers[i].insurancePremium:= readReal();

57 customerTable.numCustomers:= customerTable.numCustomers + 1;

58 end for

59

60 { Cómputo de la suma de primas de titulares }

61 for i:= 1 to customerTable.numCustomers do

62 if customerTable.customers[i].isPolicyHolder then

63 auxSum:= auxSum + customerTable.customers[i].insurancePremium;

64 numPolicyHolders:= numPolicyHolders + 1;

65 end if;

66 end for

67

68 { Obtención del promedio de las pólizas }

69 if numPolicyHolders > 0 then

70 averageInsurancePremium:= auxSum / integerToReal(numPolicyHolders);

71 end if;

72

73 { Impresión de métricas finales }

74 writeString("RESULTS");

75 writeString("AVERAGE INSURANCE PREMIUM [EUR]:");

76 writeReal(averageInsurancePremium);

77 end algorithm

Se solicita especificar las modificaciones puntuales imprescindibles en las líneas del algoritmo para dotarlo de las siguientes prestaciones auxiliares:

a.

Computar el número de ocasiones en que el operario suministra una cantidad de clientes fuera de rango al validar la entrada, mostrando este acumulador por la salida estándar con anterioridad a la presentación del promedio económico.

b.

Obtener el porcentaje de clientes que figuran como titulares de póliza sobre la cifra global de clientes procesados. Este índice debe comunicarse por pantalla acompañado de un texto descriptivo e impreso con representación decimal.

También puedes estudiar por temas

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

Ver los 7 temas

Otras convocatorias de 2022

Juny (2022) · Juny (2022)