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

Problème modulaire — cartes d'accès (IDENT / DATE / CODE)

Idée directrice

Forme calquée sur le problème 2019 (session principale) : automatisation d'accès par cartes, trois tableaux de chaînes parallèles (identifiants, dates, codes), contrôles de saisie stricts, module de codage dépendant des dates, affichage final. L'entrée attendue est encore l'analyse modulaire puis les algorithmes (TDNT/TDOG/TDOL).

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

« Analyser le problème en le décomposant en modules » ; « tableaux IDENT, DATE, CODE » ; « contrôles de saisie » ; « TDNT / TDOG / TDOL »

Sujet principal

Problème — cartes d'accès d'une médiathèque

6 questionsCorrigé masqué

Une médiathèque automatise l'accès à ses services via des cartes. Chaque carte est caractérisée par un identifiant unique, une date de création et un code d'accès. On propose d'écrire un programme permettant de :

  1. Stocker les identifiants de `n` cartes dans un tableau `IDENT` (3n503 \le n \le 50), chaque identifiant étant une chaîne formée de 8 chiffres.
  2. Stocker les dates de création dans un tableau `DATE` : chaîne `J/M` avec `J` entier dans [1..31][1..31] et `M` entier dans [1..12][1..12] (contrôles de saisie obligatoires).
  3. Déterminer dans un tableau `CODE` les `n` codes (chaînes de 4 chiffres) à partir de `DATE` selon le principe suivant : concaténer `J` et `M` pour former un nombre ; le multiplier par un entier aléatoire `X` dans [5..64][5..64] pour obtenir `Y` ; former le code de 4 chiffres — si `Y` a 4 chiffres, déplacer le chiffre des milliers à droite ; si `Y < 1000`, compléter par des `0` à droite ; si `Y > 9999`, additionner le bloc des 4 chiffres de gauche au reste jusqu'à obtenir 4 chiffres.
  4. Afficher pour chaque carte : `identifiant : date : code`.

Exemple. Pour `n = 3`, `IDENT = ["12345678", "23456789", "34567891"]`, `DATE = ["8/11", "2/1", "24/12"]` et en supposant les aléas `X ∈ {10, 32, 53}`, on obtient `CODE = ["1108", "6720", "1314"]` et l'affichage :

```
12345678 : 8/11 : 1108
23456789 : 2/1 : 6720
34567891 : 24/12 : 1314
```

NB : on ne demande pas de vérifier l'unicité des identifiants dans `IDENT`.

Travail demandé :

  1. Analyser le problème en le décomposant en modules (procédure de remplissage de `IDENT` et `DATE`, module de vérification qu'une chaîne est numérique, procédure de formation de `CODE`, procédure d'affichage).
  2. Écrire les algorithmes et les tableaux de déclaration des objets relatifs aux modules (TDNT, TDOG, TDOL).
Voir la correction commentéeAprès avoir posé votre démarche

1. Analyse du programme principal

```
Nom : Mediatheque
(IDENT, DATE, n) = PROC Remplir(IDENT, DATE, n)
PROC Coder(CODE, DATE, n)
PROC Afficher(IDENT, DATE, CODE, n)
Fin Mediatheque
```

TDNT — `tab = tableau de 50 chaînes`

TDOG

  • `IDENT` : tab — identifiants des cartes
  • `DATE` : tab — dates de création
  • `CODE` : tab — codes d'accès
  • `n` : entier — nombre de cartes
  • `Remplir`, `Coder`, `Afficher` : procédures ; `Verifnum` : module booléen de contrôle numérique

2. Algorithmes

Remplir — saisie de `n`, de chaque identifiant et de chaque date avec contrôles.

```
DEF PROC Remplir(var Id,D:tab ; var n:entier)
1) Répéter
Écrire("Donner le nombre de cartes :")
Lire(n)
Jusqu'à (n dans [3..50])
2) Pour i de 1 à n faire
Répéter
Écrire("Identifiant de la carte n°", i, " : ")
Lire(Id[i])
Jusqu'à (Long(Id[i])=8) ET Verifnum(Id[i])
Répéter
Écrire("Donner J :") ; Lire(j)
Jusqu'à (j dans [1..31])
Répéter
Écrire("Donner M :") ; Lire(m)
Jusqu'à (m dans [1..12])
Convch(j, jch) ; Convch(m, mch)
D[i] ← jch + "/" + mch
FinPour
3) Fin Remplir
```

TDOL : `i`, `j`, `m` entiers ; `jch`, `mch` chaînes ; `Verifnum` (contrôle « chaîne formée de chiffres »).

```
DEF FN Verifnum(ch:chaîne):booléen
1) k ← 0
Répéter
k ← k + 1
Jusqu'à (NON ch[k] dans ["0".."9"]) OU (k = Long(ch))
2) Verifnum ← ch[k] dans ["0".."9"]
3) Fin Verifnum
```

Coder — dépend entièrement de `DATE` déjà rempli.

```
DEF PROC Coder(var C:tab ; D:tab ; n:entier)
1) Pour i de 1 à n faire
ch ← D[i]
Effacer(ch, Pos("/", ch), 1)
Valeur(ch, r, e)
x ← 5 + Aléa(60)
nb ← r * x
Convch(nb, nbch)
Si Long(nbch) = 4 alors
C[i] ← Sous-chaine(nbch, 2, 3) + nbch[1]
Sinon Si Long(nbch) < 4 alors
Répéter nbch ← nbch + "0" Jusqu'à (Long(nbch) = 4)
C[i] ← nbch
Sinon
Valeur(Sous-chaine(nbch,1,4), nb1)
Valeur(Sous-chaine(nbch,5,Long(nbch)-4), nb2)
Convch(nb1+nb2, C[i])
FinSi
FinPour
2) Fin Coder
```

TDOL : `i`, `r`, `x`, `e`, `nb`, `nb1`, `nb2` entiers ; `ch`, `nbch` chaînes.

Afficher — parcourt simultanément les trois tableaux.

```
DEF PROC Afficher(Id,D,C:tab ; n:entier)
1) Pour i de 1 à n faire
Écrire(Id[i], " : ", D[i], " : ", C[i])
FinPour
2) Fin Afficher
```

Méthode / Automatismes
  • Dégager d'abord le résultat final (affichage des trois champs) puis remonter aux modules qui produisent chaque tableau.
  • Un seul module Remplir pour IDENT+DATE évite la redondance ; Coder ne lit que DATE.
  • Les contrôles (longueur 8, chiffres seuls, J/M bornés) sont une constante du problème 2019.
  • Traiter les trois cas de formation du code (4 chiffres / < 1000 / > 9999) séparément.
Pièges classiques

Oublier le contrôle « 8 chiffres » ; construire DATE sans convertir J et M en chaînes ; coder avant d'avoir rempli DATE ; n'afficher qu'un seul tableau.