Exercici 3.b - Classes contenidor amb arrays està… · Metodologia de la Programació UAB 2024
Tema: Classes contenidor amb arrays estàtics i composició · Del examen Examen Primer Parcial Curs 2024-2025 (2024)
Enunciado
Per gestionar l'organització d'un projecte i les persones assignades a cadascuna de les tasques es disposa de l'estructura de classes següent:
class Tasca {
private:
string m_nom;
int m_carregaTreball;
bool m_prioritatAlta;
string m_competenciesNecessaries[MAX_COMPETENCIES];
int m_nCompetencies;
string m_personaAssignada;
};
class Persona {
private:
string m_nom;
int m_valoracioCompetencies[MAX_COMPETENCIES];
int m_carregaMaxima;
int m_carregaActual;
string m_tasquesAssignades[MAX_TASQUES];
int m_nTasquesAssignades;
int competenciaToIndex(const string& competencia) const;
};
class Projecte {
private:
string m_nom;
Tasca m_tasques[MAX_TASQUES];
int m_nTasques;
Persona m_persones[MAX_PERSONES];
int m_nPersones;
};
Descripció de les dades:
Projecte emmagatzema el conjunt de tasques planificades i els recursos humans disponibles.
Tasca descriu la feina a fer: denominació, càrrega de treball (enter), indicador booleà de prioritat alta, array amb les habilitats requerides i el nom de la persona encarregada.
Persona manté la informació laboral: nom, array amb la qualificació (0 a 10) per cadascuna de les competències del sistema (totes han de tenir un valor assignat, per defecte 0), límit de càrrega de treball admissible, càrrega actual acumulada i registre de tasques que té assignades. El mètode privat competenciaToIndex tradueix el nom textual d'una competència a la seva posició dins l'array:
Competència
Índex array
Programació C++
0
Programació Python
1
Bases de Dades
2
Machine Learning
3
b. (5 punts) Mètode d'assignació d'una tasca:
Programeu a la classe Projecte el mètode encarregat d'assignar una persona a una tasca determinada. El mètode rep el nom de la tasca i retorna el nom de la persona triada (o la cadena buida "" si cap és vàlida).
Requisits de selecció: Capacitat de treball: La persona ha de disposar de prou marge per absorbir la càrrega de la tasca ( carregaActual + carregaTasca <= carregaMaxima). No obstant això, si la tasca és de prioritat alta, es permet superar la càrrega màxima en un 10% addicional ( carregaMaxima * 1.1).
Afinació de perfil: D'entre tots els candidats que tinguin capacitat disponible, s'escollirà aquell que calculi la puntuació total més elevada en la suma de valoracions de les competències exigides per la tasca.
Un cop trobat el candidat idoni, cal actualitzar la tasca (amb el nom del treballador) i la persona (afegint la tasca a la seva llista i sumant la nova càrrega a la seva càrrega actual).
Desenvolupeu tots els mètodes auxiliars que calguin a Projecte, Tasca o Persona respectant la modularitat i l'ús correcte de const.

Solución
Según los criterios oficiales de corrección
b. (5 punts) Mètode d'assignació d'una tasca i mètodes auxiliars
Solución: ```cpp // --- Mètodes auxiliars de Tasca --- string Tasca::getNom() const { return m_nom; } int Tasca::getCarrega() const { return m_carregaTreball; } bool Tasca::getPrioritat() const { return m_prioritatAlta; } void Tasca::setPersona(const string& p) { m_personaAssignada = p; } int Tasca::getCompetencies(string compDesti[MAX_COMPETENCIES]) const { for (int i = 0; i < m_nCompetencies; ++i) { compDesti[i] = m_competenciesNecessaries[i]; } return m_nCompetencies; } // --- Mètodes auxiliars de Persona --- string Persona::getNom() const { return m_nom; } // Comprova si la persona té marge horari per a la nova feina bool Persona::teCarregaDisponible(int carregaNova, bool prioritaria) const { double limit = m_carregaMaxima; if (prioritaria) { limit *= 1.1; // permès fins a un 10% addicional } return (m_carregaActual + carregaNova) <= limit; } // Calcula la puntuació acumulada de la persona per a les competències donades int Persona::sumaValoracions(const string compLlista[MAX_COMPETENCIES], int nComp) const { int acumulador = 0; for (int i = 0; i < nComp; ++i) { int pos = competenciaToIndex(compLlista[i]); if (pos >= 0 && pos < MAX_COMPETENCIES) { acumulador += m_valoracioCompetencies[pos]; } } return acumulador; } // Registra l'assignació d'una tasca sobre la persona void Persona::setTasca(const Tasca& t) { m_tasquesAssignades[m_nTasquesAssignades++] = t.getNom(); m_carregaActual += t.getCarrega(); } // --- Mètodes de Projecte --- int Projecte::cercaTasca(const string& nomTasca) const { int index = -1; int i = 0; while (index == -1 && i < m_nTasques) { if (m_tasques[i].getNom() == nomTasca) { index = i; } ++i; } return index; } string Projecte::assignarPersonaTasca(const string& nomTasca) { int posTasca = cercaTasca(nomTasca); if (posTasca == -1) { return ""; } int indexMillorCandidat = -1; int maxPuntuacio = -1; string reqCompetencies[MAX_COMPETENCIES]; int nReq = m_tasques[posTasca].getCompetencies(reqCompetencies); int carrega = m_tasques[posTasca].getCarrega(); bool prioritat = m_tasques[posTasca].getPrioritat(); // Recorregut per avaluar tots els perfils de l'equip for (int p = 0; p < m_nPersones; ++p) { if (m_persones[p].teCarregaDisponible(carrega, prioritat)) { int punts = m_persones[p].sumaValoracions(reqCompetencies, nReq); if (punts > maxPuntuacio) { maxPuntuacio = punts; indexMillorCandidat = p; } } } // Si s'ha trobat un candidat idoni, es consolida l'assignació if (indexMillorCandidat != -1) { string nomEscollit = m_persones[indexMillorCandidat].getNom(); m_tasques[posTasca].setPersona(nomEscollit); m_persones[indexMillorCandidat].setTasca(m_tasques[posTasca]); return nomEscollit; } return ""; } ```
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 3 - Classes contenidor amb arrays estàti… · 2018 ›