Problème — gestion d'un club de lecture
Un club de lecture souhaite gérer les discussions de ses adhérents. On se propose d'écrire un programme permettant d'afficher à l'administrateur :
- la liste des adhérents inactifs (aucun commentaire envoyé) ;
- la liste des adhérents qui ont envoyé un même commentaire donné.
Pour cela, le programme doit :
- Remplir un tableau `A` par les noms d'utilisateurs des `na` adhérents, avec . Un nom est une chaîne de caractères unique, de longueur , commençant par une lettre majuscule.
- Remplir un tableau `M` par les `nm` commentaires () au format `NumE#texte`, où `NumE` est l'indice de l'émetteur dans `A` et `texte` est le message. On tiendra aussi un tableau d'entiers `Occ` : nombre de messages par adhérent.
- Afficher les adhérents inactifs (`Occ[i] = 0`), puis, après saisie d'un commentaire, afficher les émetteurs correspondants (extraction de la sous-chaîne après `#` et lecture de l'indice avant `#`).
Exemple. Pour `na = 4`, `nm = 5`, `A = ["Lina", "Omar", "Sami", "Ines"]` et `M = ["1#Bonjour", "3#Algo", "1#Bonjour", "2#Relecture", "3#Bonjour"]` : le commentaire `"Bonjour"` est envoyé par Lina, Sami ; la liste des inactifs est : Ines.
Travail demandé :
- Analyser le problème en le décomposant en modules (procédures / paramètres : remplissage de `A`, remplissage de `M` et de `Occ`, affichage des inactifs, recherche des émetteurs d'un commentaire).
- Écrire les algorithmes et les tableaux de déclaration des objets relatifs aux modules envisagés (TDNT, TDOG, TDOL). Les contrôles de saisie doivent apparaître explicitement.
Voir la correction commentéeAprès avoir posé votre démarche
1. Analyse du programme principal
```
Nom : ClubLecture
A, na = PROC RemplirA(A, na)
M, nm, Occ = PROC RemplirM(A, M, Occ, na, nm)
PROC Inactifs(Occ, A, na)
PROC Recherche(M, A, na, nm)
Fin ClubLecture
```
TDNT
```
Tab1 = Tableau [1..100] de chaîne de caractères
Tab2 = Tableau [1..100] d'entiers
```
TDOG
- `A` : Tab1 — noms des adhérents
- `M` : Tab1 — messages au format `NumE#texte`
- `Occ` : Tab2 — nombre de messages par adhérent
- `na`, `nm` : entiers — effectifs
- `RemplirA`, `RemplirM`, `Inactifs`, `Recherche` : procédures
2. Algorithmes des modules
a) RemplirA — saisie contrôlée des noms.
```
DEF PROC RemplirA(var A:Tab1 ; var na:entier)
1) Répéter
Écrire("Donner le nombre d'adhérents :")
Lire(na)
Jusqu'à (na dans [5..50])
2) Pour i de 1 à na faire
Répéter
Écrire("Nom de l'adhérent n°", i, " : ")
Lire(A[i])
Jusqu'à (A[i][1] dans ["A".."Z"]) ET (Long(A[i]) ≥ 3)
ET (i=1 OU NON Existe(A[i], A, i-1))
FinPour
3) Fin RemplirA
```
TDOL : `i` entier (compteur) ; `Existe` fonction (unicité dans le préfixe de `A`).
```
DEF FN Existe(ch:chaîne ; t:Tab1 ; indice:entier):booléen
1) i ← 0
2) Répéter
i ← i + 1
Jusqu'à (t[i]=ch) OU (i=indice)
3) Existe ← (t[i]=ch)
4) Fin Existe
```
b) RemplirM — commentaires + comptage.
```
DEF PROC RemplirM(A:Tab1 ; var M:Tab1 ; var Occ:Tab2 ; na:entier ; var nm:entier)
1) Répéter
Écrire("Donner le nombre de commentaires :")
Lire(nm)
Jusqu'à (nm dans [3..100])
2) Pour i de 1 à na faire Occ[i] ← 0 FinPour
3) Pour i de 1 à nm faire
Écrire("Donner le commentaire :") ; Lire(message)
Répéter
Écrire("Donner le numéro de l'émetteur :") ; Lire(NumE)
Jusqu'à (NumE dans [1..na])
Convch(NumE, ch)
M[i] ← Concat(ch, "#", message)
Occ[NumE] ← Occ[NumE] + 1
FinPour
4) Fin RemplirM
```
TDOL : `NumE`, `i` entiers ; `message`, `ch` chaînes.
c) Inactifs — dépend de `Occ` produit par RemplirM.
```
DEF PROC Inactifs(Occ:Tab2 ; A:Tab1 ; na:entier)
1) Écrire("Adhérents inactifs :")
2) Pour i de 1 à na faire
Si Occ[i] = 0 alors Écrire(A[i]) FinSi
FinPour
3) Fin Inactifs
```
d) Recherche — dépend de `M` et `A` ; dernière question du problème.
```
DEF PROC Recherche(M,A:Tab1 ; na,nm:entier)
1) Écrire("Commentaire à chercher :") ; Lire(msg)
2) Pour i de 1 à nm faire
Si Sous-chaine(M[i], Pos("#",M[i])+1, Long(M[i])-Pos("#",M[i])) = msg alors
Valeur(Sous-chaine(M[i],1,Pos("#",M[i])-1), Nume, e)
Écrire(A[Nume])
FinSi
FinPour
3) Fin Recherche
```
TDOL : `i`, `Nume`, `e` entiers ; `msg` chaîne.