Problème (11 points) — dans l'esprit des sessions principales 2025 et 2026
Une application de réservation attribue à chaque client un code de contrôle CODE obtenu à partir d'un tableau d'entiers générés au hasard. On dit qu'un entier est impair-chiffres si tous ses chiffres sont impairs (exemples : 7, 31, 59 ; contre-exemples : 24, 70, 81). Le code est construit selon les étapes suivantes :
- Étape 1 : saisir un entier
Ntel que 14 ≤ N ≤ 40. - Étape 2 : remplir aléatoirement un tableau
TparNentiers compris entre 1 et 99. - Étape 3 : déterminer le nombre
NSde séquences formées d'entiers impair-chiffres adjacents contenus dansT, et le nombreNEd'entiers figurant dans ces séquences. N.B. Une séquence se compose d'au moins deux entiers impair-chiffres adjacents ; un entier impair-chiffres isolé n'en fait pas partie. - Étape 4 : former la chaîne
Een concaténant, selon leur ordre d'apparition, les éléments des séquences qui occupent un indice pair. - Étape 5 : construire
CODEpar la concaténation, de gauche à droite, deNS,NEetE. - Étape 6 : répéter les étapes 2 à 5 jusqu'à obtenir un
CODEd'au moins 7 chiffres, puis l'afficher.
Exemple. Pour N = 14, supposons que le remplissage aléatoire donne T = [24, 31, 57, 14, 80, 7, 46, 19, 75, 93, 11, 62, 35, 53] (indices 0 à 13).
Les séquences occupent les indices 1 à 2, 7 à 10 et 12 à 13 ; l'entier 7, à l'indice 5, est isolé. On obtient NS = 3, NE = 8, E = "57751135" (éléments d'indices 2, 8, 10 et 12) et CODE = "3857751135", qui compte 10 chiffres : il est affiché.
Travail demandé :
- Écrire un algorithme du programme principal, solution à ce problème, en le décomposant en modules.
- Écrire un algorithme de chaque module envisagé.
- Dresser les tableaux de déclaration des nouveaux types et des objets, globaux et locaux.
N.B. On dispose de la fonction Aléa(a, b), qui retourne un entier aléatoire compris entre a et b (bornes incluses), et de Convch(x), qui retourne la chaîne formée des chiffres de l'entier x.
Voir la correction commentéeAprès avoir posé votre démarche
Analyse. Idée : l'étape 1 est faite une seule fois ; seules les étapes 2 à 5 sont dans la boucle Répéter. On isole la saisie contrôlée de N (SaisirN), le remplissage aléatoire (Remplir), le test de la propriété (ImpChiffres, fonction booléenne) et le parcours qui produit à la fois NS, NE et E (Extraire, aidé de Retenir, qui clôt une séquence). E et CODE restent des chaînes : une concaténation de nombres peut dépasser la capacité d'un entier, et c'est le nombre de chiffres qui est testé.
1. Programme principal
Algorithme CodeControle
DEBUT
SaisirN(N)
Répéter
Remplir(T, N)
Extraire(T, N, NS, NE, E)
CODE ← Convch(NS) + Convch(NE) + E
Jusqu'à Long(CODE) ≥ 7
Ecrire(CODE)
FIN2. Modules
Procédure SaisirN (@N : Entier)
DEBUT
Répéter
Ecrire("N = ")
Lire(N)
Jusqu'à (N ≥ 14) Et (N ≤ 40)
FINProcédure Remplir (@T : TAB, N : Entier)
DEBUT
Pour i de 0 à N-1 Faire
T[i] ← Aléa(1, 99)
Fin Pour
FINFonction ImpChiffres (x : Entier) : Booléen
DEBUT
Répéter
c ← x Mod 10
x ← x Div 10
Jusqu'à (c Mod 2 = 0) Ou (x = 0)
Retourner c Mod 2 = 1
FINIdée : on examine les chiffres de droite à gauche et on s'arrête au premier chiffre pair ; si l'on sort parce que x = 0, le dernier chiffre examiné décide. Pour 31 : c = 1, puis c = 3 avec x = 0, d'où Vrai ; pour 24 : c = 4, d'où Faux ; pour 7 : c = 7 avec x = 0, d'où Vrai.
Procédure Retenir (T : TAB, fin, lg : Entier,
@NS, @NE : Entier, @E : Chaîne)
DEBUT
Si lg ≥ 2 Alors
NS ← NS + 1
NE ← NE + lg
Pour j de fin-lg+1 à fin Faire
Si j Mod 2 = 0 Alors
E ← E + Convch(T[j])
FinSi
Fin Pour
FinSi
FINProcédure Extraire (T : TAB, N : Entier,
@NS, @NE : Entier, @E : Chaîne)
DEBUT
NS ← 0
NE ← 0
E ← ""
lg ← 0
Pour i de 0 à N-1 Faire
Si ImpChiffres(T[i]) Alors
lg ← lg + 1
Sinon
Retenir(T, i-1, lg, NS, NE, E)
lg ← 0
FinSi
Fin Pour
Retenir(T, N-1, lg, NS, NE, E)
FINIdée : lg est la longueur de la suite d'entiers impair-chiffres en cours ; elle est examinée à chaque rupture, et une dernière fois après la boucle, car une séquence peut finir à l'indice N − 1. Sur l'exemple : la rupture en 3 clôt la suite 1..2 (NS = 1, NE = 2, E = "57") ; la rupture en 6 examine la suite réduite à l'indice 5, de longueur 1, ignorée ; la rupture en 11 clôt 7..10 (NS = 2, NE = 6, E = "577511") ; l'appel après la boucle clôt 12..13 (NS = 3, NE = 8, E = "57751135").
3. Tableaux de déclaration
TDNT : TAB = Tableau de 40 entiers.
TDOG :
N,NS,NE— Type/Nature : Entier — taille du tableau, nombre de séquences, nombre d'entiers qu'elles contiennentT— Type/Nature : TAB — tableau généréE,CODE— Type/Nature : Chaîne — concaténations de chiffresSaisirN,Remplir,Extraire— Type/Nature : Procédure — modules appelés par le programme principal
TDOL :
Remplir:i— Entier — compteur.ImpChiffres:c— Entier — chiffre examiné.Retenir:j— Entier — indice parcourant la séquence.Extraire:i,lg— Entier — compteur et longueur de la suite en cours ;ImpChiffres— Fonction ;Retenir— Procédure.
Le nombre de répétitions de la boucle dépend du hasard et l'énoncé ne fixe pas de maximum ; pour les petites valeurs de N, plusieurs remplissages sont souvent nécessaires.