Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
SD-KStructures de données et modularité

Problème modulaire forme 2025–2026 : tableau aléatoire, séquences d'éléments adjacents vérifiant une propriété, code par concaténation recommencé jusqu'à une longueur minimale

Idée directrice

Le problème final de l'épreuve commune (10 à 13 points) a changé de forme dans les deux dernières sessions : les données ne sont plus saisies mais générées aléatoirement, une propriété définie par l'énoncé sélectionne des éléments, on compte des séquences d'éléments adjacents (au moins deux), on construit une chaîne par concaténation, et tout recommence tant que le résultat n'a pas la longueur voulue. Le travail demandé reste celui de toujours : un programme principal fait d'appels de modules, un algorithme par module et les tableaux de déclaration. La décision centrale est de séparer ce qui est fait une fois (la saisie de N) de ce qui est répété (les étapes 2 à 5).

Ce qui aide à reconnaître la démarche

« Écrire un algorithme du programme principal, solution à ce problème, en le décomposant en modules » ; « Générer aléatoirement un tableau » ; « Une séquence se compose d'au moins deux … adjacents » ; « Répéter les étapes de 2 à 5 jusqu'à obtenir un code »

Besoin d’un point de départ ? Voir la méthode
  • Lire les étapes numérotées comme un cahier des charges : une étape donne un module ; « répéter les étapes 2 à 5 » devient la boucle Répéter … Jusqu'à du programme principal, la saisie restant avant la boucle.
  • Une séquence (au moins deux éléments adjacents) se compte avec une longueur courante remise à 0 à chaque rupture, et se clôt aussi après la boucle : la dernière peut finir au dernier indice.
  • Garder les concaténations de nombres en chaînes (Convch) et tester leur longueur par Long.
  • Un module qui produit plusieurs résultats est une procédure à paramètres @ ; un test de propriété est une fonction booléenne.
  • TDNT pour le type tableau, TDOG pour les objets et les modules du programme principal, un T.D.O.L par module.
Les pièges à vérifier dans ta démarche

Placer la saisie de N dans la boucle Répéter : l'utilisateur ressaisit N à chaque tirage. Oublier de clore la dernière séquence après la boucle, ce qui perd une séquence finissant à l'indice N − 1 — dans l'exemple, la séquence 12 à 13. Compter l'entier isolé comme une séquence. Confondre « élément d'indice pair » et « élément pair ». Construire CODE comme un entier par multiplications : le nombre de chiffres de NE et des éléments varie.

Sujet principal

Problème (11 points) — dans l'esprit des sessions principales 2025 et 2026

9 questionsFigure fournieCorrigé masqué

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 N tel que 14 ≤ N ≤ 40.
  • Étape 2 : remplir aléatoirement un tableau T par N entiers compris entre 1 et 99.
  • Étape 3 : déterminer le nombre NS de séquences formées d'entiers impair-chiffres adjacents contenus dans T, et le nombre NE d'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 E en concaténant, selon leur ordre d'apparition, les éléments des séquences qui occupent un indice pair.
  • Étape 5 : construire CODE par la concaténation, de gauche à droite, de NS, NE et E.
  • Étape 6 : répéter les étapes 2 à 5 jusqu'à obtenir un CODE d'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é :

  1. Écrire un algorithme du programme principal, solution à ce problème, en le décomposant en modules.
  2. Écrire un algorithme de chaque module envisagé.
  3. 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)
FIN

2. Modules

Procédure SaisirN (@N : Entier)
DEBUT
    Répéter
        Ecrire("N = ")
        Lire(N)
    Jusqu'à (N ≥ 14) Et (N ≤ 40)
FIN
Procédure Remplir (@T : TAB, N : Entier)
DEBUT
    Pour i de 0 à N-1 Faire
        T[i] ← Aléa(1, 99)
    Fin Pour
FIN
Fonction 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
FIN

Idé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
FIN
Procé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)
FIN

Idé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 contiennent
  • T — Type/Nature : TAB — tableau généré
  • E, CODE — Type/Nature : Chaîne — concaténations de chiffres
  • SaisirN, 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.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Variantes rencontrées : séquences d'entiers premiers adjacents, éléments d'indice premier concaténés et code recalculé jusqu'à au moins 8 chiffres (principale 2026) ; filtrage d'un tableau par une propriété définie par l'énoncé (nombres de Keith) puis affichage regroupé par nombre de chiffres (principale 2025) ; code de quatre chiffres construit par concaténation et multiplication par un entier aléatoire (principale 2019).

Exercices d'entraînement — une nuance à la fois

1 Drill SD-K.1 — compter les séquences maximales d'éléments adjacents vérifiant une propriété, sans oublier la dernière
Entraînement 01 / 04

Drill SD-K.1 — compter les séquences maximales d'éléments adjacents vérifiant une propriété, sans oublier la dernière

3 questionsCorrigé masqué

Dans un tableau T de N entiers, on appelle séquence paire toute suite d'au moins deux éléments pairs adjacents, prolongée tant que les éléments restent pairs. Par exemple, pour N = 12 et T = [6, 8, 3, 10, 4, 12, 7, 2, 5, 14, 16, 9], il y a 3 séquences paires (indices 0 à 1, 3 à 5 et 9 à 10) regroupant 7 éléments ; l'élément 2, d'indice 7, est isolé.

  1. Écrire l'algorithme d'une procédure Sequences (T : TAB, N : Entier, @NS, @NE : Entier) qui détermine le nombre NS de séquences paires de T et le nombre NE d'éléments qui les composent.
  2. Dresser son T.D.O.L.
  3. Un élève écrit une version où une séquence n'est comptée qu'au moment où un élément impair l'interrompt. Quels résultats obtient-il pour N = 11 et T = [6, 8, 3, 10, 4, 12, 7, 2, 5, 14, 16] ? Quelle instruction doit-il ajouter ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : une longueur courante lg compte les éléments pairs consécutifs ; à chaque rupture, la suite est retenue si lg ≥ 2, puis lg repart de 0. La dernière suite est examinée après la boucle.

Procédure Sequences (T : TAB, N : Entier,
      @NS, @NE : Entier)
DEBUT
    NS ← 0
    NE ← 0
    lg ← 0
    Pour i de 0 à N-1 Faire
        Si T[i] Mod 2 = 0 Alors
            lg ← lg + 1
        Sinon
            Si lg ≥ 2 Alors
                NS ← NS + 1
                NE ← NE + lg
            FinSi
            lg ← 0
        FinSi
    Fin Pour
    Si lg ≥ 2 Alors
        NS ← NS + 1
        NE ← NE + lg
    FinSi
FIN

Sur l'exemple, les suites paires ont pour longueurs 2, 3, 1 et 2 ; celle de longueur 1 est ignorée : NS=3\boxed{NS=3} et NE=7\boxed{NE=7}.

2. T.D.O.L : i — Entier — compteur ; lg — Entier — longueur de la suite paire en cours.

3. La suite 14, 16 finit à l'indice 10 = N − 1 : aucun élément impair ne vient la clore, elle n'est jamais comptée. L'élève obtient NS = 2 et NE = 5 au lieu de 3 et 7. Il doit ajouter après la boucle le test Si lg ≥ 2 Alors NS ← NS + 1 ; NE ← NE + lg FinSi.

2 Drill SD-K.2 — concaténer des nombres dans une chaîne, puis tester sa longueur
Entraînement 02 / 04

Drill SD-K.2 — concaténer des nombres dans une chaîne, puis tester sa longueur

4 questionsCorrigé masqué

Un site génère un jeton d'accès à partir d'un tableau T de N entiers positifs : le jeton J est la chaîne obtenue en concaténant, de gauche à droite, les éléments de T d'indice impair. Le jeton est accepté s'il comporte au moins 6 chiffres. Exemple : pour N = 7 et T = [5, 41, 7, 308, 12, 9, 60], on obtient J = "413089" (6 chiffres) : le jeton est accepté.

  1. Écrire l'algorithme d'une fonction Jeton (T : TAB, N : Entier) : Chaîne qui retourne le jeton, et dresser son T.D.O.L.
  2. Écrire la séquence qui appelle Jeton, puis affiche « jeton accepté » ou « jeton refusé ».
  3. Donner le jeton et la décision pour N = 6 et T = [5, 4, 7, 38, 12, 9].
  4. Un élève construit un entier v par l'instruction v ← v * 100 + T[i] au lieu d'une chaîne. Quelle valeur obtient-il pour le premier exemple ? Pourquoi sa méthode est-elle fausse ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : les indices impairs sont 1, 3, 5… ; chaque élément est converti par Convch puis ajouté à droite de la chaîne.

Fonction Jeton (T : TAB, N : Entier) : Chaîne
DEBUT
    J ← ""
    i ← 1
    Tant que i ≤ N-1 Faire
        J ← J + Convch(T[i])
        i ← i + 2
    Fin Tant que
    Retourner J
FIN

T.D.O.L : J — Chaîne — jeton en construction ; i — Entier — indice impair courant.

2.

J ← Jeton(T, N)
Si Long(J) ≥ 6 Alors
    Ecrire("jeton accepté")
Sinon
    Ecrire("jeton refusé")
FinSi

3. Indices 1, 3 et 5 : 4, 38 et 9, d'où J = "4389", qui n'a que 4 chiffres : jeton refusé.

4. v vaut 41, puis 41 × 100 + 308 = 4408, puis 4408 × 100 + 9 = 440809, alors que le jeton est « 413089 ». Multiplier par 100 suppose que chaque élément a exactement deux chiffres ; 308 en a trois et 9 un seul. La chaîne, elle, garde tous les chiffres dans l'ordre, et sa longueur se lit directement par Long.

3 Drill SD-K.3 — boucle Répéter autour d'un remplissage aléatoire : ce qui est répété et ce qui ne l'est pas
Entraînement 03 / 04

Drill SD-K.3 — boucle Répéter autour d'un remplissage aléatoire : ce qui est répété et ce qui ne l'est pas

4 questionsCorrigé masqué

On veut saisir un entier N (8 ≤ N ≤ 30), puis remplir un tableau T par N entiers aléatoires compris entre 2 et 100, en recommençant le remplissage tant que T contient moins de 3 multiples de 7. On dispose de la fonction Aléa(a, b), qui retourne un entier aléatoire de l'intervalle [a, b], et des modules SaisirN(N), Remplir(T, N) et Compter(T, N), cette dernière fonction retournant le nombre de multiples de 7 de T. Trois programmes principaux sont proposés :

Proposition 1

DEBUT
    Répéter
        SaisirN(N)
        Remplir(T, N)
    Jusqu'à Compter(T, N) ≥ 3
FIN

Proposition 2

DEBUT
    SaisirN(N)
    Remplir(T, N)
    Répéter
        k ← Compter(T, N)
    Jusqu'à k ≥ 3
FIN

Proposition 3

DEBUT
    SaisirN(N)
    Répéter
        Remplir(T, N)
    Jusqu'à Compter(T, N) ≥ 3
FIN
  1. Écrire l'instruction qui affecte à T[i] un entier aléatoire de [2, 100], puis la même instruction avec l'ancienne fonction Aléa(n), qui retourne un entier de 0 à n − 1.
  2. Valider chacune des trois propositions par V (correcte) ou F (incorrecte), en justifiant.
  3. Écrire l'algorithme de la fonction Compter (T : TAB, N : Entier) : Entier, puis donner sa valeur pour N = 8 et T = [14, 9, 70, 33, 49, 2, 91, 50].
  4. Dresser le tableau de déclaration des nouveaux types et celui des objets globaux du programme principal retenu.
Voir la correction commentéeAprès avoir posé votre démarche

1. T[i] ← Aléa(2, 100). Avec l'ancienne notation, [2, 100] compte 100 − 2 + 1 = 99 valeurs : T[i] ← 2 + Aléa(99).

2. Idée : seul ce que l'énoncé demande de recommencer entre dans la boucle.

  • Proposition 1 : F — N est ressaisi à chaque nouveau remplissage, alors qu'il n'est saisi qu'une fois.
  • Proposition 2 : F — T n'est jamais rempli à nouveau dans la boucle ; si le premier remplissage contient moins de 3 multiples de 7, k ne change plus et la boucle ne s'arrête jamais.
  • Proposition 3 : V — saisie unique, puis remplissage recommencé jusqu'à la condition.

3.

Fonction Compter (T : TAB, N : Entier) : Entier
DEBUT
    k ← 0
    Pour i de 0 à N-1 Faire
        Si T[i] Mod 7 = 0 Alors
            k ← k + 1
        FinSi
    Fin Pour
    Retourner k
FIN

Pour le tableau donné, 14, 70, 49 et 91 sont multiples de 7 : Compter retourne 4\boxed{4}.

4. TDNT : TAB = Tableau de 30 entiers. TDOG : N — Entier — taille du tableau ; T — TAB — tableau rempli ; SaisirN, Remplir — Procédure ; Compter — Fonction — nombre de multiples de 7.

4 Drill SD-K.4 — programme principal seul : cohérence des appels avec les en-têtes des modules
Entraînement 04 / 04

Drill SD-K.4 — programme principal seul : cohérence des appels avec les en-têtes des modules

3 questionsCorrigé masqué

Pour un problème de codes, on a déjà écrit les modules dont voici les en-têtes :

Procédure Saisir (@N : Entier)
Procédure Remplir (@T : TAB, N : Entier)
Fonction Valide (x : Entier) : Booléen
Procédure Filtrer (T : TAB, N : Entier,
                   @R : TAB, @M : Entier)
Procédure Afficher (R : TAB, M : Entier)

Filtrer range dans R les M éléments de T pour lesquels Valide retourne Vrai. Un candidat propose le programme principal suivant :

Algorithme Codes
DEBUT
    Saisir(N)
    Remplir(N, T)
    Valide(T[0])
    Filtrer(T, N, R)
    M ← Afficher(R, M)
FIN
  1. Relever les quatre erreurs de ce programme principal et expliquer chacune d'elles.
  2. Écrire le programme principal corrigé.
  3. Dresser le tableau de déclaration des nouveaux types (tableaux de 50 entiers) et celui des objets globaux. Le module Valide doit-il figurer dans le second ? Justifier.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : comparer chaque appel à son en-tête — nombre, ordre et type des paramètres, procédure ou fonction.

  • Remplir(N, T) : les paramètres effectifs sont dans le mauvais ordre ; l'en-tête attend le tableau puis sa taille, d'où Remplir(T, N).
  • Valide(T[0]) : une fonction ne s'appelle pas comme une instruction, sa valeur doit être utilisée ; ici l'appel est de plus inutile, car Filtrer appelle déjà Valide : on le supprime.
  • Filtrer(T, N, R) : il manque le quatrième paramètre effectif, M, qui reçoit le nombre d'éléments retenus.
  • M ← Afficher(R, M) : une procédure ne retourne pas de valeur ; on écrit simplement Afficher(R, M).

2.

Algorithme Codes
DEBUT
    Saisir(N)
    Remplir(T, N)
    Filtrer(T, N, R, M)
    Afficher(R, M)
FIN

3. TDNT : TAB = Tableau de 50 entiers. TDOG :

  • N, M — Type/Nature : Entier — nombre d'éléments saisis, nombre d'éléments retenus
  • T, R — Type/Nature : TAB — tableau saisi, tableau des éléments retenus
  • Saisir, Remplir, Filtrer, Afficher — Type/Nature : Procédure — modules du programme principal

Valide n'est pas appelée par le programme principal : elle figure dans le T.D.O.L de Filtrer, avec la nature Fonction, et non dans le TDOG.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.