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.

Ver los 7 temas

Otras convocatorias de 2022

Juny (2022) · Juny (2022)