Pregunta 1.b · Prácticas de programación UOC 2023
Tema: Diseño descendente sobre vectores de registros en lenguaje algorítmico · Del examen Prueba de síntesis de Prácticas de programación (Enero de 2023) (2023)
Enunciado
Pregunta 1. Gestión de personal en campañas de una ONG
En el marco del sistema informático destinado a la administración de ONGs, se definen las siguientes constantes y estructuras de datos:
// Capacidad máxima permitida para los equipos de personal
const MAX_PEOPLE: integer = 100; end const;
// Ficha de una persona vinculada a la organización
type tPerson = record
document: string;
name: string;
surname: string;
email: string;
address: string;
city: string;
birthday: tDate;
end record;
// Conjunto de miembros que forman un equipo de trabajo
type tStaff = record
elems: vector [MAX_PEOPLE] of tPerson;
count: integer;
end record;
// Identificación y pertenencia de un proyecto
type tProject = record
code: string;
ongCode: string;
end record;
// Información relativa a una campaña concreta
type tCampaign = record
project: tProject;
detail: tProjectDetail;
staff: tStaff;
end record;
// Almacén dinámico con el registro de campañas
type tCampaignData = record
elems: pointer to tCampaign;
count: integer;
end record;
// Registro general representativo de la ONG
type tONG = record
code: string;
name: string;
projects: tProjectData;
staff: tStaff;
campaigns: tCampaignData;
staffAvailability: tAvailabilityData;
end record;
Se desea implementar la siguiente acción:
action delete_person_project(inout ong: tONG, in doc: string, in projCode: string)
Dicho subprograma debe dar de baja al voluntario o trabajador cuyo documento coincida con doc en todas aquellas campañas asociadas al código de proyecto projCode dentro de la ong indicada. Asimismo, cada vez que se suprima una persona del equipo de una campaña, el vector de personal correspondiente debe mantenerse debidamente compactado (sin huecos libres intermedios).
b.
[40%] Diseña e implementa la solución completa en lenguaje algorítmico aplicando la metodología de diseño descendente (descomposición modular en niveles). Deberás codificar todas las acciones o funciones auxiliares requeridas. Para cada módulo desarrollado, redacta una breve explicación de una o dos líneas sobre su cometido.

Solución
Según los criterios oficiales de corrección
Nivel 1: Acción principal y explicación
Solución: ```pseudocode // Descripción: Recorre las campañas registradas en la ONG; para aquellas pertenecientes al proyecto indicado, invoca la acción que retira a la persona del equipo de trabajo. action delete_person_project(inout organizacion: tONG, in idDoc: string, in codProyecto: string) var idxCamp: integer; end var begin for idxCamp := 1 to organizacion.campaigns.count do if campaign_inside_project(organizacion.campaigns.elems[idxCamp], codProyecto) then delete_person_staff(organizacion.campaigns.elems[idxCamp].staff, idDoc); end if; end for; end action ```
Nivel 2: Módulos auxiliares de comprobación y compactación y explicaciones
Solución: ```pseudocode // Descripción de campaign_inside_project: Evalúa si el identificador de proyecto vinculado a la campaña coincide con el código de referencia buscado. function campaign_inside_project(camp: tCampaign, codRef: string): boolean begin return (camp.project.code = codRef); end function // Descripción de delete_person_staff: Localiza al individuo en el personal de la campaña y, si figura en él, lo elimina desplazando a la izquierda los registros siguientes para conservar el vector compacto. action delete_person_staff(inout equipo: tStaff, in idDoc: string) var idx, posicion: integer; end var begin posicion := find_person(equipo, idDoc); if posicion > 0 then equipo.count := equipo.count - 1; for idx := posicion to equipo.count do equipo.elems[idx] := equipo.elems[idx + 1]; end for; end if; end action ```
Nivel 3: Algoritmo de localización lineal y explicación
Solución: ```pseudocode // Descripción de find_person: Efectúa una búsqueda secuencial dentro del vector de personal para devolver la posición donde coincide el documento, o bien -1 si no forma parte de la plantilla. function find_person(equipo: tStaff, idDoc: string): integer var k, resPos: integer; hallado: boolean; end var begin k := 1; resPos := -1; hallado := false; while (k <= equipo.count) and (not hallado) do if equipo.elems[k].document = idDoc then resPos := k; hallado := true; else k := k + 1; end if; end while; return resPos; end function ```
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.
‹ Pregunta 1.b - Diseño descendente en lenguaje alg… · 2023 · Pregunta 1.b · 2021 ›