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.

Ver los 7 temas

Otras convocatorias de 2022

Juny (2022) · Juny (2022)