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(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.