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.

Enunciado: Pregunta 1.b · Prácticas de programación UOC 2023

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 ›

Más ejercicios de Diseño descendente sobre vectores de registros en lenguaje algorítmico