Problème — élection du projet primé par un jury
Problème (13 points) — dans l'esprit du problème de la session principale 2024
En fin d'année, un jury d'enseignants élit le meilleur projet parmi ceux soutenus par les élèves. Chaque enseignant classe trois projets par ordre de préférence : le premier choix rapporte 5 points, le deuxième 3 points, le troisième 1 point. Le projet totalisant le plus grand nombre de points est primé ; en cas d'égalité, tous les projets concernés le sont.
On veut écrire une solution algorithmique permettant :
- de remplir un tableau
TPparntitres de projets distincts, chaque titre étant une chaine de caracteres formée uniquement de lettres et d'espaces, avec5 ≤ n ≤ 40; - de déterminer, dans un tableau
TC, le cumul des points de chaque projet d'après les votes desmenseignants, avec3 ≤ m ≤ 60, sachant que chaque enseignant doit citer trois titres distincts et présents dansTP, et queTC[i]est le cumul du projet dont le titre estTP[i]; - d'afficher le score maximal, puis le titre de chaque projet ayant atteint ce score, au format :
Score maximal : valeurpuisProjet(s) primé(s) : titre1, titre2, ....
Exemple. Pour n = 5 et TP = ["Serre connectee", "Bras robotise", "Bus scolaire", "Tri des dechets", "Ruche numerique"], TC part de [0,0,0,0,0]. Après le vote d'un premier enseignant classant Bras robotise, Serre connectee, Ruche numerique, on obtient TC = [3,5,0,0,1]. Après un deuxième vote classant Serre connectee, Bras robotise, Bus scolaire, on obtient TC = [8,8,1,0,1]. L'affichage attendu est alors :
Score maximal : 8
Projet(s) prime(s) : Serre connectee, Bras robotise
Travail demandé :
- Analyser le problème en le décomposant en modules, et donner les tableaux de déclaration des nouveaux types et des objets globaux.
- Écrire l'algorithme du module de dépouillement des votes et celui du module d'affichage, avec leurs objets locaux.
N.B. On utilisera sans les développer les deux modules suivants : Alpha(ch), fonction booléenne vraie si la chaîne ch ne contient que des lettres et des espaces ; Rang(ch, T, k), fonction retournant l'indice de la case de T contenant ch parmi ses k premières cases, ou -1 si ch n'y figure pas.
Voir la correction commentéeAprès avoir posé votre démarche
1. Analyse du programme principal
Nom : Palmares
Resultat = PROC Afficher(TP, TC, n)
TC = PROC Depouiller(TP, TC, n, m)
(TP, n) = PROC Remplir(TP, n)
Fin Palmares
La décomposition suit les trois demandes de l'énoncé : un module de saisie contrôlée, un module de dépouillement qui alimente TC, un module d'affichage qui ne dépend que des deux tableaux remplis. Aucun module ne recalcule ce qu'un autre a déjà produit.
TDNT
TabCh = Tableau [1..40] de chaine de caractèresTabEnt = Tableau [1..40] d'entiers
TDOG
TP— Type/Nature : TabCh — Rôle : contenant les titres des projetsTC— Type/Nature : TabEnt — Rôle : contenant le cumul des points de chaque projetn— Type/Nature : entier — Rôle : le nombre de projetsm— Type/Nature : entier — Rôle : le nombre d'enseignants votantsRemplir— Type/Nature : procédure — Rôle : saisirnet les titres, chaque titre étant contrôlé et non déjà présentDepouiller— Type/Nature : procédure — Rôle : lire les votes et cumuler les points dansTCAfficher— Type/Nature : procédure — Rôle : afficher le score maximal puis tous les projets qui l'atteignent
2. Algorithme du module de dépouillement
DEF PROC Depouiller (TP : TabCh ; var TC : TabEnt ; n : entier ; var m : entier)
0) Pour i de 1 à n faire
TC[i] ← 0
FinPour
1) Répéter
Ecrire("Nombre d'enseignants : ") ; Lire(m)
Jusqu'à (m dans [3..60])
2) Pour j de 1 à m faire
C[1] ← 0 ; C[2] ← 0
Pour r de 1 à 3 faire
Répéter
Ecrire("Choix n° ", r, " de l'enseignant ", j, " : ") ; Lire(t)
p ← Rang(t, TP, n)
Jusqu'à (p ≠ -1) ET (p ≠ C[1]) ET (p ≠ C[2])
C[r] ← p
Si (r = 1) Alors TC[p] ← TC[p] + 5
Sinon Si (r = 2) Alors TC[p] ← TC[p] + 3
Sinon TC[p] ← TC[p] + 1
FinSi
FinSi
FinPour
FinPour
3) Fin Depouiller
TDOL de Depouiller : i, j, r, p entiers, p recevant l'indice rendu par Rang ; t chaîne, le titre saisi ; C tableau de 3 entiers, indices des projets déjà cités par l'enseignant en cours (remis à 0 à chaque enseignant ; un indice valant 0 ne correspond à aucun projet). La mise à jour passe toujours par p : c'est l'indice, et non le titre, qui relie TP à TC.
Algorithme du module d'affichage
DEF PROC Afficher (TP : TabCh ; TC : TabEnt ; n : entier)
1) max ← TC[1]
Pour i de 2 à n faire
Si (TC[i] > max) Alors max ← TC[i] FinSi
FinPour
2) Ecrire("Score maximal : ", max)
ch ← ""
Pour i de 1 à n faire
Si (TC[i] = max) Alors
Si (ch = "") Alors ch ← TP[i]
Sinon ch ← ch + ", " + TP[i]
FinSi
FinSi
FinPour
3) Ecrire("Projet(s) prime(s) : ", ch)
4) Fin Afficher
TDOL de Afficher : i entier ; max entier, le plus grand cumul ; ch chaîne, la liste en construction. Deux parcours sont nécessaires et non un seul : tant que le maximum n'est pas connu, on ne peut pas savoir quels projets l'atteignent, et un affichage au fil du premier parcours imprimerait des titres finalement battus.