Masar
Masar
Bac Tunisie
Entraîner la reconnaissance
SD-EStructures de données et modularité

Problème modulaire — club de lecture (tableaux de chaînes, inactifs, recherche)

Idée directrice

Forme calquée sur le problème 2018 (session principale) : un contexte applicatif (groupe / club), deux tableaux de chaînes liés par un indice d'émetteur, contrôles de saisie, puis affichages dépendants (inactifs + recherche d'un commentaire). L'attendu principal n'est pas un mini-exercice isolé : c'est l'analyse modulaire (programme principal, TDNT, TDOG) puis les algorithmes de chaque module avec TDOL.

Signature de reconnaissance — l'énoncé se trahit ainsi

« Analyser le problème en le décomposant en modules » ; « Écrire les algorithmes et les tableaux de déclaration (TDNT/TDOG/TDOL) » ; « contrôles de saisie » ; « tableaux de chaînes »

Sujet principal

Problème — gestion d'un club de lecture

7 questionsCorrigé masqué

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 5na505 \le na \le 50. Un nom est une chaîne de caractères unique, de longueur 3\ge 3, commençant par une lettre majuscule.
  • Remplir un tableau `M` par les `nm` commentaires (3nm1003 \le nm \le 100) 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é :

  1. 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).
  2. É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.

Méthode / Automatismes
  • Commencer par l'analyse (Nom, flux des appels, résultats) avant d'écrire une ligne d'algorithme.
  • TDNT pour les types tableaux ; TDOG pour objets globaux + modules ; TDOL par module.
  • Les contrôles de saisie (`Répéter` / `Jusqu'à … dans […]`) sont notés dans le barème du problème 2018.
  • Inactifs et Recherche ne se comprennent qu'après RemplirA / RemplirM : ne pas les traiter comme des exercices isolés.
Pièges classiques

Oublier l'unicité des noms ; écrire `M[i] ← message` sans le préfixe `NumE#` ; confondre l'indice dans `A` avec le rang dans `M` ; afficher les inactifs avant d'avoir rempli `Occ`.