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.
- Esquemas de recorrido y búsqueda sobre tablas · 4 problemas · 80 % de que salga
- Expresiones, tipos básicos y corrección semántica de sentencias · 3 problemas · 80 % de que salga
- Comprensión de algoritmos: describir qué hace un fragmento · 3 problemas · 80 % de que salga
- Detección y corrección de errores en algoritmos · 3 problemas · 80 % de que salga
- Modificación y ampliación de un algoritmo completo · 2 problemas · 70 % de que salga
- Tipos estructurados y modularidad: declaraciones, cabeceras y paso de parámetros · 3 problemas · 55 % de que salga