Ejercicio 4 · Fundamentos de Programación UOC Juny 2022
Tema: Modificación y ampliación de un algoritmo completo · Del examen Juny (2022)
Enunciado
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)

Solución
Según los criterios oficiales de corrección
a. Definición del porcentaje de descuento y ampliación del tipo de dato tCustomer
Solución: ```pseudocode Tras la línea 3: Incorporar la constante que fija el porcentaje de rebaja: DISCOUNT_RATE: integer = 10; Tras la línea 10: Agregar dentro del registro tCustomer el campo booleano indicador de franquicia: hasDeductible: boolean; ```
b. Entrada selectiva de datos y aplicación del descuento del 10%
Solución: ```pseudocode Tras la línea 57 (dentro del bucle de captura de datos de clientes): Insertar la lectura condicionada y el recálculo de la prima con descuento: if customerTable.customers[i].isPolicyHolder then writeString("HAS DEDUCTIBLE? (FALSE, TRUE) >>"); customerTable.customers[i].hasDeductible := readBoolean(); if customerTable.customers[i].hasDeductible then customerTable.customers[i].insurancePremium := customerTable.customers[i].insurancePremium * integerToReal(100 - DISCOUNT_RATE) / 100.0; end if else customerTable.customers[i].hasDeductible := false; end if ```
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.