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% de la nota). Compatibilidad de tipos y evaluación de sentencias
Tomando como base las cabeceras de subprogramas y la declaración de variables del siguiente esquema algorítmico:
function function1(x: real, y: real): integer
{ Implementación interna omitida }
end function
function function2(x: integer, y: real): real
{ Implementación interna omitida }
end function
action action1(in x: integer, in y: boolean, out z: boolean)
{ Implementación interna omitida }
end action
algorithm evaluacionExpresiones
var
x, y: integer;
a, b: real;
isB: boolean;
end var
x:= 10;
y:= 50;
a:= 1.0;
b:= 10.0;
isB:= false;
{ <-- LINEA A EVALUAR --> }
end algorithm
Valora si resultaría válida o incorrecta la inserción individual de cada una de las siguientes tres instrucciones en la posición indicada. Justifica detalladamente el motivo:
a.
b:= x div y;
b.
x:= function1(function2(x, b), a);
c.
action1((x + y), (x < y), isB);
Ejercicio 2.a - Comprensión de algoritmos · Comprensión de algoritmos: describir qué hace un fragmento
Ejercicio 2 (20% de la nota). Interpretación y enriquecimiento de algoritmos sobre registros
A partir del repertorio de definiciones y el subprograma presentado a continuación:
const
MAX_VEHICLES: integer = 100;
end const
type
tEnergyCategories = {PETROL, DIESEL, HYBRID, ELECTRIC};
tVehicle = record
brand: string;
price: real; { Expresado en euros }
combustible: tEnergyCategories;
end record
tVehiclesTable = record
nVehicles: integer;
vVehiclesSummary: vector[MAX_VEHICLES] of tVehicle;
end record
end type
action mysteryAction(in vehicles: tVehiclesTable, in name: string, out res1: integer, out res2: integer)
var
i: integer;
end var
res1:= 0;
res2:= 0;
for i:= 1 to vehicles.nVehicles do
if vehicles.vVehiclesSummary[i].brand = name then
res1:= res1 + 1;
if vehicles.vVehiclesSummary[i].combustible = HYBRID then
res2:= res2 + 1;
end if
end if
end for
end action
Ejercicio 2
a.
Describe con precisión la finalidad y el comportamiento 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% de la nota). Interpretación y enriquecimiento de algoritmos sobre registros
A partir del repertorio de definiciones y el subprograma presentado a continuación:
const
MAX_VEHICLES: integer = 100;
end const
type
tEnergyCategories = {PETROL, DIESEL, HYBRID, ELECTRIC};
tVehicle = record
brand: string;
price: real; { Expresado en euros }
combustible: tEnergyCategories;
end record
tVehiclesTable = record
nVehicles: integer;
vVehiclesSummary: vector[MAX_VEHICLES] of tVehicle;
end record
end type
action mysteryAction(in vehicles: tVehiclesTable, in name: string, out res1: integer, out res2: integer)
var
i: integer;
end var
res1:= 0;
res2:= 0;
for i:= 1 to vehicles.nVehicles do
if vehicles.vVehiclesSummary[i].brand = name then
res1:= res1 + 1;
if vehicles.vVehiclesSummary[i].combustible = HYBRID then
res2:= res2 + 1;
end if
end if
end for
end action
Ejercicio 2
b.
Modifica el cuerpo de la acción para que, preservando su comportamiento original, calcule y escriba en el canal estándar de salida el coste medio de los automóviles con motorización eléctrica ( ELECTRIC) que figuren en vehicles. Si en el registro no existe ningún vehículo eléctrico, no debe emitir ninguna salida. Considera como premisa que la tabla siempre contendrá al menos un registro válido almacenado.
Ejercicio 3 · Detección y corrección de errores en algoritmos
3. Ejercicio 3 (15% de la nota). Detección y justificación de errores en algoritmos
Se dispone de las siguientes estructuras destinadas a administrar el catálogo de artículos de un almacén:
const
MAX_NUM_PRODUCTS: integer = 500;
end const
type
tProduct = record
productId: integer;
productName: string;
price: real;
expirationDate: integer; { Formato numérico: aaaammdd }
end record
tProductsTable = record
products: vector[MAX_NUM_PRODUCTS] of tProduct;
numProducts: integer;
end record
end type
Se requiere construir un subprograma que reduzca a la mitad (divida por dos) el importe de aquellos artículos cuya fecha de caducidad sea igual o previa a una fecha de corte suministrada, devolviendo al mismo tiempo la cantidad total de artículos afectados por el descuento. Se plantean a continuación dos alternativas que contienen diversos errores de diseño o sintaxis. Localiza y explica razonadamente cada una de las incorrecciones presentes en ambas propuestas (asume que la tabla recibida cuenta con todos sus datos debidamente inicializados):
a.
Alternativa A:
action applyDiscount(in productsTable: tProductsTable,
in date: integer, out numModified: integer)
var
i: integer;
end var
i:= 1;
numModified:= 0;
while i <= productsTable.numProducts do
if productsTable.products[i].expirationDate <= date then
productsTable.products[i].price:= productsTable.products[i].price / 2.0;
numModified:= numModified + 1;
i:= i + 1;
end if
end while
end action
b.
Alternativa B:
action applyDiscount(inout productsTable: tProductsTable,
in date: integer): integer
var
i: integer;
numModified: integer;
end var
i:= 0;
numModified:= 0;
for i:= 1 to productsTable.numProducts do
if productsTable.products[i].expirationDate <= date then
productsTable.products[i].price:= productsTable.products[i].price / 2.0;
numModified:= numModified + 1;
i:= i + 1;
end if
end for
return numModified;
end action
Ejercicio 4 · Modificación y ampliación de un algoritmo completo
Ejercicio 4 (50% de la nota). Adaptación y ampliación de un algoritmo completo
Considera el siguiente algoritmo que gestiona el registro de asegurados y calcula el coste medio de las primas suscritas por titulares de pólizas:
1 const
2 MIN_CUSTOMERS: integer = 1; { Min. Number of Customers }
3 MAX_CUSTOMERS: integer = 10; { Max. Number of Customers }
4 end const
5
6 type
7 tCustomer = record
8 customerId: integer;
9 isPolicyHolder: boolean;
10 insurancePremium: real;
11 end record
12
13 tCustomertTable = record
14 customers: vector[MAX_CUSTOMERS] of tCustomer;
15 numCustomers: integer;
16 end record
17 end type
18
19 algorithm RepairService
20 { Variable definition }
21 var
22 customerTable: tCustomertTable;
23 averageInsurancePremium: real;
24 totalCustomers: integer;
25 numPolicyHolders: integer;
26 i: integer;
27 auxSum: real;
28 end var
29
30 { Variable initialization }
31 averageInsurancePremium:= 0.0;
32 auxSum:= 0.0;
33 customerTable.numCustomers:= 0;
34 numPolicyHolders:= 0;
35
36 { Data input }
37 writeString("INPUT DATA");
38 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
39 totalCustomers:= readInteger();
40 { Data validation }
41
42 while totalCustomers < MIN_CUSTOMERS or
43 totalCustomers > MAX_CUSTOMERS do
44 writeString("INVALID DATA, TRY AGAIN!");
45 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
46 totalCustomers:= readInteger();
47 end while
48
49 for i:= 1 to totalCustomers do
50 writeString("CUSTOMER #");
51 writeInteger(i);
52 writeString("ID? (AN INTEGER) >>");
53 customerTable.customers[i].customerId:= readInteger();
54 writeString("IS POLICY HOLDER? (FALSE, TRUE) >>");
55 customerTable.customers[i].isPolicyHolder:= readBoolean();
56 writeString("INSURANCE PREMIUM [EUR]? (A REAL) >>");
57 customerTable.customers[i].insurancePremium:= readReal();
58 customerTable.numCustomers:= customerTable.numCustomers + 1;
59 end for
60
61 { Get values for average insurance premium calculation }
62 for i:= 1 to customerTable.numCustomers do
63 if customerTable.customers[i].isPolicyHolder then
64 auxSum:= auxSum + customerTable.customers[i].insurancePremium;
65 numPolicyHolders:= numPolicyHolders + 1;
66 end if
67 end for
68
69 { If recovered policy holders, then average insurance premium calculation }
70 if numPolicyHolders > 0 then
71 averageInsurancePremium:= auxSum / integerToReal(numPolicyHolders);
72 end if
73
74 { Data output }
75 writeString("RESULTS");
76 writeString("AVERAGE INSURANCE PREMIUM [EUR]:");
77 writeReal(averageInsurancePremium);
78
79 end algorithm
Se requiere adaptar el código para cumplir con dos nuevos requisitos:
a. Incorporar al registro tCustomer un nuevo campo para almacenar si la póliza está sujeta a franquicia ( deductible). Este dato únicamente se le debe solicitar y leer al usuario cuando el cliente sea efectivamente titular de la póliza ( isPolicyHolder = true). En caso de no ser titular, se registrará como falso.
b. Aplicar de forma inmediata una rebaja del 10% sobre el importe de la prima ( insurancePremium) en aquellas pólizas que cuenten con franquicia.
Indica de manera concisa y referenciando las líneas numéricas del código base las modificaciones mínimas precisas para llevar a cabo estos cambios sin tener que transcribir el algoritmo al completo.
a)
b)
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