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 · Tipos estructurados y modularidad: declaraciones, cabeceras y paso de parámetros · Detección y corrección de errores en algoritmos
Ejercicio 1 · Expresiones, tipos básicos y corrección semántica de sentencias
Ejercicio 1 (15 puntos). Validación de llamadas a subprogramas y expresiones
Considerad las siguientes declaraciones de tipos, subprogramas y variables en notación algorítmica:
function function1(x: real, y: real): integer
{ cuerpo de la función }
end function
action action1(in x: integer, inout y: integer)
{ cuerpo de la acción }
end action
algorithm algorithm1
var
x, y: integer;
a, b: real;
isB: boolean;
end var
x:= 7;
y:= 13;
a:= 0.0;
b:= 5.0;
isB:= false;
{ -----> LINEA X <----- }
end algorithm
Determinad de forma razonada si cada una de las siguientes instrucciones resultaría válida y correcta semánticamente si se situara en el punto LINEA X:
a.
action1(function1(a, b), x);
b.
action1(realToInteger(a), realToInteger(b));
c.
isB:= function1(b, a) < x;
Ejercicio 2.a · Comprensión de algoritmos: describir qué hace un fragmento
A partir de la definición de tipos y la acción que se presentan a continuación:
const
MAX_SALES: integer = 20;
end const
type
tSale = record
sellPrice: real; { importe de venta en euros }
costPrice: real; { importe de coste en euros }
end record
tSaleTable = record
nSales: integer; { total de ventas registradas }
salesSummary: vector[MAX_SALES] of tSale; { lista de ventas }
end record
end type
action mysteryAction(in sales: tSaleTable, out res1: integer, out res2: real)
var
i: integer;
end var
res1:= 0;
res2:= 0.0;
for i:= 1 to sales.nSales do
if sales.salesSummary[i].sellPrice < sales.salesSummary[i].costPrice then
res1:= res1 + 1;
res2:= res2 + (sales.salesSummary[i].costPrice - sales.salesSummary[i].sellPrice);
end if
end for
end action
a. Explicad detalladamente qué tarea realiza la acción mysteryAction, especificando qué información almacenan los parámetros de salida res1 y res2.
Ejercicio 2.b · Esquemas de recorrido y búsqueda sobre tablas
A partir de la definición de tipos y la acción que se presentan a continuación:
const
MAX_SALES: integer = 20;
end const
type
tSale = record
sellPrice: real; { importe de venta en euros }
costPrice: real; { importe de coste en euros }
end record
tSaleTable = record
nSales: integer; { total de ventas registradas }
salesSummary: vector[MAX_SALES] of tSale; { lista de ventas }
end record
end type
action mysteryAction(in sales: tSaleTable, out res1: integer, out res2: real)
var
i: integer;
end var
res1:= 0;
res2:= 0.0;
for i:= 1 to sales.nSales do
if sales.salesSummary[i].sellPrice < sales.salesSummary[i].costPrice then
res1:= res1 + 1;
res2:= res2 + (sales.salesSummary[i].costPrice - sales.salesSummary[i].sellPrice);
end if
end for
end action
b. Modificad las sentencias de mysteryAction para que, además de lo que ya realiza, obtenga el beneficio neto acumulado por el conjunto de todas las ventas recogidas en la tabla y muestre dicho valor final por pantalla. Se define el beneficio de una venta como la resta entre el precio de venta ( sellPrice) y el precio de coste ( costPrice). Podéis partir del supuesto de que el registro contiene como mínimo una venta.
Ejercicio 3 · Detección y corrección de errores en algoritmos
Ejercicio 3 (15 puntos). Detección de fallos en algoritmos de búsqueda y porcentaje
Se dispone de las siguientes estructuras para gestionar los datos de un conjunto de trenes de cercanías:
const
MAX_NUM_TRAINS: integer = 50;
end const
type
tTrain = record
trainId: integer;
origin: string;
destination: string;
schedule: integer; { hora en formato hhmm }
end record
tTrainsTable = record
trains: vector[MAX_NUM_TRAINS] of tTrain;
numTrains: integer;
end record
end type
Se quiere implementar una función encargada de calcular el porcentaje (con cifras decimales) de trenes que coinciden con un origen y un destino indicados. Se asume que la tabla está correctamente inicializada y no vacía. Para ello, se han redactado las dos alternativas siguientes, pero ambas contienen defectos lógicos o sintácticos:
Propuesta A:
function computePercentage(trainsTable: tTrainsTable, trainOrigin: string,
trainDestination: string): real
var
percentage: real;
i: integer;
totalTrains: integer;
end var
percentage:= 0.0;
totalTrains:= 0;
i:= 1;
while i <= trainsTable.numTrains do
if trainsTable.trains[i].origin = trainOrigin or
trainsTable.trains[i].destination = trainDestination then
totalTrains:= totalTrains + 1;
end if;
i:= i + 1;
end while
return totalTrains / integerToReal(trainsTable.numTrains) * 100.0;
end function
Propuesta B:
function computePercentage(trainsTable: tTrainsTable, trainOrigin: string,
trainDestination: string): real
var
percentage: real;
totalTrains: integer;
i: integer;
end var
percentage:= 0.0;
totalTrains:= 0;
for i:= 0 to trainsTable.numTrains do
if trainsTable[i].trains.origin = trainOrigin and
trainsTable[i].trains.destination = trainDestination then
totalTrains:= totalTrains + 1;
end if;
end for
return integerToReal(totalTrains) / integerToReal(trainsTable.numTrains) * 100.0;
end function
a)
(7,5 puntos) Explicad los errores que presenta la Propuesta A.
b)
(7,5 puntos) Explicad los errores que presenta la Propuesta B.
Ejercicio 4 · Tipos estructurados y modularidad: declaraciones, cabeceras y paso de parámetros
Ejercicio 4 (50 puntos). Modularización del cálculo de la prima media
Se dispone del siguiente algoritmo completo, el cual solicita y valida la cantidad de clientes a registrar (entre 1 y 10), recoge sus datos por teclado y calcula la prima media de los usuarios asegurados:
1 const
2 MIN_CUSTOMERS: integer = 1;
3 MAX_CUSTOMERS: integer = 10;
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 { Declaración 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 { Inicialización }
31 averageInsurancePremium:= 0.0;
32 auxSum:= 0.0;
33 customerTable.numCustomers:= 0;
34 numPolicyHolders:= 0;
35
36 { Entrada de datos y validación }
37 writeString("INPUT DATA");
38 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
39 totalCustomers:= readInteger();
40
41 while totalCustomers < MIN_CUSTOMERS or totalCustomers > MAX_CUSTOMERS do
42 writeString("INVALID DATA, TRY AGAIN!");
43 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
44 totalCustomers:= readInteger();
45 end while
46
47 for i:= 1 to totalCustomers do
48 writeString("CUSTOMER #");
49 writeInteger(i);
50 writeString("ID? (AN INTEGER) >>");
51 customerTable.customers[i].customerId:= readInteger();
52 writeString("IS POLICY HOLDER? (FALSE, TRUE) >>");
53 customerTable.customers[i].isPolicyHolder:= readBoolean();
54 writeString("INSURANCE PREMIUM [EUR]? (A REAL) >>");
55 customerTable.customers[i].insurancePremium:= readReal();
56 customerTable.numCustomers:= customerTable.numCustomers + 1;
57 end for
58
59 { Cálculo del valor medio de las pólizas }
60 for i:= 1 to customerTable.numCustomers do
61 if customerTable.customers[i].isPolicyHolder then
62 auxSum:= auxSum + customerTable.customers[i].insurancePremium;
63 numPolicyHolders:= numPolicyHolders + 1;
64 end if
65 end for
66
67 if numPolicyHolders > 0 then
68 averageInsurancePremium:= auxSum / integerToReal(numPolicyHolders);
69 end if
70
71 { Salida }
72 writeString("RESULTS");
73 writeString("AVERAGE INSURANCE PREMIUM [EUR]:");
74 writeReal(averageInsurancePremium);
75 end algorithm
Modificad el algoritmo para reemplazar el fragmento que computa el promedio de las pólizas por una llamada a una nueva función independiente. Para ello:
a)
Escribid la función encargada de efectuar dicho cálculo recibiendo la tabla de clientes como parámetro.
b)
Indicad de forma concisa qué modificaciones mínimas precisas deben aplicarse sobre las líneas del algoritmo principal (añadidos, eliminaciones o sustituciones referenciando los números de línea correspondientes).
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