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% del total). Comprensión y modificación de algoritmos de gestión de clientes
A continuación se facilita el código de un algoritmo que efectúa la gestión de clientes y pólizas de un servicio:
1 const
2 MIN_CUSTOMERS: integer = 1; { Mínimo número de clientes admisible }
3 MAX_CUSTOMERS: integer = 10; { Máximo número de clientes admisible }
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 { Bloque 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 { Fase de inicialización }
31 averageInsurancePremium:= 0.0;
32 auxSum:= 0.0;
33 customerTable.numCustomers:= 0;
34 numPolicyHolders:= 0;
35
36 { Petición de volumen de clientes }
37 writeString("INPUT DATA");
38 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
39 totalCustomers:= readInteger();
40 { Filtro de validación de rango }
41
42 while totalCustomers < MIN_CUSTOMERS or totalCustomers > MAX_CUSTOMERS do
43 writeString("INVALID DATA, TRY AGAIN!");
44 writeString("NUMBER OF CUSTOMERS? (1-10) >>");
45 totalCustomers:= readInteger();
46 end while
47
48 for i:= 1 to totalCustomers do
49 writeString("CUSTOMER #");
50 writeInteger(i);
51 writeString("ID? (AN INTEGER) >>");
52 customerTable.customers[i].customerId:= readInteger();
53 writeString("IS POLICY HOLDER? (FALSE, TRUE) >>");
54 customerTable.customers[i].isPolicyHolder:= readBoolean();
55 writeString("INSURANCE PREMIUM [EUR]? (A REAL) >>");
56 customerTable.customers[i].insurancePremium:= readReal();
57 customerTable.numCustomers:= customerTable.numCustomers + 1;
58 end for
59
60 { Cómputo de la suma de primas de titulares }
61 for i:= 1 to customerTable.numCustomers do
62 if customerTable.customers[i].isPolicyHolder then
63 auxSum:= auxSum + customerTable.customers[i].insurancePremium;
64 numPolicyHolders:= numPolicyHolders + 1;
65 end if;
66 end for
67
68 { Obtención del promedio de las pólizas }
69 if numPolicyHolders > 0 then
70 averageInsurancePremium:= auxSum / integerToReal(numPolicyHolders);
71 end if;
72
73 { Impresión de métricas finales }
74 writeString("RESULTS");
75 writeString("AVERAGE INSURANCE PREMIUM [EUR]:");
76 writeReal(averageInsurancePremium);
77 end algorithm
Se solicita especificar las modificaciones puntuales imprescindibles en las líneas del algoritmo para dotarlo de las siguientes prestaciones auxiliares:
a.
Computar el número de ocasiones en que el operario suministra una cantidad de clientes fuera de rango al validar la entrada, mostrando este acumulador por la salida estándar con anterioridad a la presentación del promedio económico.
b.
Obtener el porcentaje de clientes que figuran como titulares de póliza sobre la cifra global de clientes procesados. Este índice debe comunicarse por pantalla acompañado de un texto descriptivo e impreso con representación decimal.

Solución
Según los criterios oficiales de corrección
a. Computar el número de ocasiones en que el operario suministra una cantidad de clientes fuera de rango al validar la entrada, mostrando este acumulador por la salida estándar con anterioridad a la presentación del promedio económico.
Solución: ```pseudocode { Incorporar a continuación de la línea 27: } failedInputsCount: integer; { Contador de lecturas no válidas } { Añadir tras la línea 34: } failedInputsCount := 0; { Incorporar en el cuerpo del bucle de validación, por ejemplo tras la línea 44: } failedInputsCount := failedInputsCount + 1; { Inserción tras la línea 74 (con anterioridad al promedio económico): } writeString("NUMBER OF INCORRECT ATTEMPTS:"); writeInteger(failedInputsCount); ```
b. Obtener el porcentaje de clientes que figuran como titulares de póliza sobre la cifra global de clientes procesados. Este índice debe comunicarse por pantalla acompañado de un texto descriptivo e impreso con representación decimal.
Solución: ```pseudocode { Incorporar a continuación de la línea 27: } policyHoldersRatio: real; { Porcentaje de clientes con póliza } { Añadir tras la línea 34: } policyHoldersRatio := 0.0; { Insertar tras la finalización del cómputo de titulares, tras la línea 71: } policyHoldersRatio := (integerToReal(numPolicyHolders) / integerToReal(customerTable.numCustomers)) * 100.0; { Inserción tras la línea 76: } writeString("PERCENTAGE CLIENT WITH POLICY (%):"); writeReal(policyHoldersRatio); ```
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.