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-NStructures de données et modularité

Fonctions prédéfinies : remplacer chaque séquence par un appel équivalent, écrire l'instruction qui donne une valeur finale

Idée directrice

Le bac donne une séquence écrite avec une boucle, ou une valeur finale à obtenir, et demande l'appel d'une fonction prédéfinie qui produit exactement le même résultat. On lit ce que fait la séquence sur un petit exemple, on reconnaît le module (Sous_chaine, Pos, Effacer, Estnum, Majus, Ent, Valeur, Convch, Long), puis on écrit l'appel avec les paramètres dans le bon ordre et au bon type. Le barème retire des points pour un paramètre mal placé ou un type faux ; la notation en vigueur fixe le sens des paramètres (indice de fin exclu, −1 quand Pos ne trouve rien).

Ce qui aide à reconnaître la démarche

« Compléter la deuxième colonne du tableau ci-après par l'appel d'une fonction prédéfinie » ; « Chaque instruction d'appel doit retourner le même résultat décrit par la séquence algorithmique correspondante » ; « une expression équivalente utilisant un ou plusieurs modules prédéfinis » ; « Compléter la colonne Instruction à exécuter … permettant d'aboutir aux valeurs finales indiquées » ; « Écrire une séquence algorithmique équivalente … sans utiliser une structure itérative »

Besoin d’un point de départ ? Voir la méthode
  • Exécuter la séquence sur un exemple de 4 à 6 caractères et noter ce qu'elle rend : une portion (Sous_chaine), une position ou −1 (Pos), une chaîne raccourcie (Effacer), un booléen (Estnum), une conversion (Majus, Valeur, Convch, Ent).
  • Vérifier le type : l'appel doit retourner le type de la variable placée à gauche de ←.
  • Bornes : une boucle Pour i de a à b − 1 qui recopie ch[i] correspond à Sous_chaine(ch, a, b) ; supprimer ces caractères correspond à Effacer(ch, a, b).
  • Valeurs finales imposées : repérer les indices dans la chaîne initiale (séparateur, fin), puis ordonner les instructions pour qu'une modification n'altère pas une ligne suivante.
  • Séquence « sans structure itérative » sur les chiffres d'un entier : passer par la chaîne Convch(x).
Les pièges à vérifier dans ta démarche

Écrire Sous_chaine(ch, a, b − a) en pensant « position, longueur » : en notation actuelle le troisième paramètre est l'indice de fin, exclu. Inverser les paramètres de Pos (la chaîne cherchée vient en premier). Tester Pos(…) > 0 pour « trouvé » alors qu'une occurrence à l'indice 0 est valide et que l'absence vaut −1. Appeler Valeur sur une chaîne non numérique. Utiliser une fonction absente de la liste imposée, ou sa forme de procédure des sujets 2016–2019 (Valeur(ch, R, e), Convch(x, ch)).

Sujet principal

Exercice 2 (5 points) — dans l'esprit des sessions principales 2017, 2018, 2019 et 2023

3 questionsCorrigé masqué

Soit le tableau de déclaration des objets suivant : x, nb, d, a, b, i, k, q, e : Entier ; r : Réel ; ch, ch1, ch2, s : Chaîne de caractères ; R : Booléen. Les caractères d'une chaîne sont indicés à partir de 0.

Séquence S1 (0 ≤ a ≤ b ≤ Long(ch)) :

s ← ""
Pour i de a à b - 1 Faire
    s ← s + ch[i]
Fin Pour

Séquence S2 (ch1 non vide) :

k ← -1
i ← 0
Tant que (i ≤ Long(ch) - Long(ch1))
         Et (k = -1) Faire
    Si Sous_chaine(ch, i, i + Long(ch1)) = ch1
    Alors k ← i
    Sinon i ← i + 1
    FinSi
Fin Tant que

Séquence S3 (0 ≤ k ≤ Long(ch)) :

Pour i de 1 à k Faire
    ch ← Sous_chaine(ch, 1, Long(ch))
Fin Pour

Séquence S4 :

R ← Long(ch) > 0
i ← 0
Tant que R Et (i < Long(ch)) Faire
    R ← ch[i] ∈ ["0".."9"]
    i ← i + 1
Fin Tant que

Séquence S5 :

s ← ""
Pour i de 0 à Long(ch) - 1 Faire
    Si ch[i] ∈ ["a".."z"] Alors
        s ← s + Chr(Ord(ch[i]) - 32)
    Sinon
        s ← s + ch[i]
    FinSi
Fin Pour

Séquence S6 (r ≥ 0) :

x ← 0
Tant que x + 1 ≤ r Faire
    x ← x + 1
Fin Tant que

Tableau T — initialisations : ch1 ← "Info", ch2 ← "2025/2026", r ← 17.83.

Instruction à exécuter | Valeur finale
……                     | ch contient "Info 2026"
……                     | q contient 17
……                     | e contient 18
……                     | a contient 2025
……                     | k contient 4
……                     | ch2 contient "2026"

Séquence S7 (x entier naturel) :

nb ← 0
Répéter
    d ← x
    x ← x Div 10
    nb ← nb + 1
Jusqu'à x = 0
  1. Pour chacune des séquences S1 à S6, écrire l'appel d'une fonction prédéfinie de la liste Effacer, Ent, Estnum, Majus, Pos, Sous_chaine qui retourne le même résultat que la séquence, en précisant les paramètres d'appel (chaque fonction de la liste est utilisée une fois).
  2. Compléter la colonne « Instruction à exécuter » du tableau T par les instructions permettant d'aboutir aux valeurs finales indiquées. Les instructions doivent utiliser les variables ci-dessus et tenir compte de leur initialisation ; elles sont exécutées dans l'ordre du tableau.
  3. Concernant la séquence S7 :
    1. Donner les valeurs finales de nb et de d pour x = 5070 et pour x = 8, en présentant pour x = 5070 les valeurs successives de d, x et nb.
    2. Donner le rôle de cette séquence.
    3. Écrire une séquence algorithmique équivalente, sans structure itérative, qui donne les mêmes valeurs finales de nb et d, en utilisant les fonctions Convch, Long, Sous_chaine et Valeur.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : exécuter chaque séquence sur un petit exemple, reconnaître ce qu'elle rend, puis écrire l'appel au bon type ; pour Sous_chaine et Effacer, le troisième paramètre est l'indice qui suit le dernier caractère concerné.

  • S1 recopie les caractères d'indices a à b − 1 : s ← Sous_chaine(ch, a, b), et non Sous_chaine(ch, a, b − a) : b est l'indice de fin exclu, pas une longueur.
  • S2 cherche le premier indice où ch1 apparaît dans ch et laisse −1 sinon : k ← Pos(ch1, ch), la chaîne cherchée en premier. Pour ch = "le bac" et ch1 = "ba", la boucle s'arrête à i = 3 et Pos("ba", "le bac") = 3.
  • S3 supprime k fois le caractère d'indice 0, c'est-à-dire les caractères d'indices 0 à k − 1 : ch ← Effacer(ch, 0, k). Sous_chaine(ch, k, Long(ch)) rend la même chaîne, mais Sous_chaine est réservée à S1, qu'aucun appel unique d'Effacer ne peut produire.
  • S4 laisse R vrai tant que les caractères sont des chiffres, et donne faux pour une chaîne vide : R ← Estnum(ch).
  • S5 remplace chaque minuscule par la majuscule correspondante (Ord("a") − Ord("A") = 32) et recopie les autres caractères : s ← Majus(ch).
  • S6 donne le plus grand entier x tel que x ≤ r : x ← Ent(r).

2. Idée : chaque ligne part des valeurs laissées par les lignes précédentes ; la dernière modifie ch2, elle vient donc après toutes celles qui lisent ch2.

ch ← ch1 + " " + Sous_chaine(ch2, 5, 9)
q ← Ent(r)
e ← Arrondi(r)
a ← Valeur(Sous_chaine(ch2, 0, 4))
k ← Pos("/", ch2)
ch2 ← Effacer(ch2, 0, 5)

Dans "2025/2026", le / est à l'indice 4 et "2026" occupe les indices 5 à 8, d'où Sous_chaine(ch2, 5, 9) (Long(ch2) peut remplacer 9). Ent(17.83) = 17 et Arrondi(17.83) = 18 ; Valeur convertit la chaîne "2025" en entier ; Effacer(ch2, 0, 5) supprime les indices 0 à 4, soit "2025/". Placée plus haut, cette dernière instruction fausserait les lignes qui lisent ch2 : Pos("/", ch2) vaudrait −1. D'autres instructions correctes sont acceptées, par exemple ch2 ← Sous_chaine(ch2, 5, 9) pour la dernière ligne.

3.a Valeurs successives pour x = 5070 :

  d      x     nb
 5070   507    1
  507    50    2
   50     5    3
    5     0    4

Pour x = 5070 : nb=4, d=5\boxed{nb=4,\ d=5} ; pour x = 8, un seul passage : nb=1, d=8\boxed{nb=1,\ d=8}.

3.b Cette séquence permet de déterminer le nombre de chiffres nb de l'entier x et son chiffre de gauche d.

3.c Idée : l'écriture décimale de x est une chaîne ; sa longueur est le nombre de chiffres, son caractère d'indice 0 le chiffre de gauche.

ch ← Convch(x)
nb ← Long(ch)
d ← Valeur(Sous_chaine(ch, 0, 1))

Pour x = 0, la boucle Répéter s'exécute une fois (nb = 1, d = 0) et Convch(0) = "0" donne les mêmes valeurs : l'équivalence vaut pour tout entier naturel.

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 : blocs de boucle à remplacer par Sous-chaîne et Concat, puis module prédéfini jouant le même rôle, Insère (principale 2017) ; instructions donnant des valeurs finales à partir d'initialisations imposées, avec Concat, Tronc, Valeur et Effacer (principale 2018) ; séquence équivalente sans itération pour le nombre de chiffres, Convch puis Long (principale 2019) ; cinq séquences à remplacer par Abs, Sous_Chaine, Pos, Effacer et Estnum, liste imposée (principale 2023) ; citer une procédure prédéfinie parmi les éléments d'un algorithme (principale 2016). Aucune occurrence dans les sessions 2024 à 2026.

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

1 Drill SD-N.1 — Sous_chaine(ch, d, f) et Effacer(ch, d, f) : f est un indice, pas une longueur
Entraînement 01 / 03

Drill SD-N.1 — Sous_chaine(ch, d, f) et Effacer(ch, d, f) : f est un indice, pas une longueur

4 questionsCorrigé masqué

On adopte la notation algorithmique en vigueur : les caractères d'une chaîne sont indicés à partir de 0, Sous_chaine(ch, d, f) retourne les caractères d'indices d à f − 1, et Effacer(ch, d, f) retourne la chaîne ch privée de ces mêmes caractères. On donne ch ← "programmation".

  1. Donner la valeur de : Sous_chaine(ch, 3, 7) ; Effacer(ch, 3, 7) ; Effacer(ch, 7, Long(ch)) ; Sous_chaine(ch, 0, Long(ch)).
  2. Pour obtenir "mat", un élève a écrit Sous_chaine(ch, 7, 3), en pensant « à partir de l'indice 7, 3 caractères ». Que retourne cet appel ? Corriger l'appel.
  3. Soient c1 ← "BAC 2026", c2 ← "juin " et p ← 4. Écrire une seule instruction, sans structure itérative, qui insère c2 dans c1 à partir de l'indice p, de façon à obtenir "BAC juin 2026".
  4. Écrire une instruction qui supprime le dernier caractère d'une chaîne c1 non vide.
Voir la correction commentéeAprès avoir posé votre démarche

1. Indices de "programmation" (Long(ch) = 13) :

p r o g r a m m a t i o  n
0 1 2 3 4 5 6 7 8 9 10 11 12
  • Sous_chaine(ch, 3, 7) : indices 3 à 6, "gram"\boxed{\text{"gram"}}.
  • Effacer(ch, 3, 7) : on retire gram, "promation"\boxed{\text{"promation"}}.
  • Effacer(ch, 7, 13) : on retire les indices 7 à 12, "program"\boxed{\text{"program"}}.
  • Sous_chaine(ch, 0, 13) : la chaîne entière, "programmation".

2. Idée : le troisième paramètre est l'indice qui suit le dernier caractère voulu. Ici f = 3 est inférieur à d = 7 : aucun indice i ne vérifie 7 ≤ i < 3, l'appel retourne la chaîne vide (comme ch[7:3] en Python). "mat" occupe les indices 7, 8 et 9 : il faut écrire Sous_chaine(ch, 7, 10), c'est-à-dire Sous_chaine(ch, 7, 7 + 3) ; pour n caractères à partir de d, on prend f = d + n.

3. On garde les indices 0 à p − 1, on ajoute c2, puis on reprend à l'indice p :

c1 ← Sous_chaine(c1, 0, p) + c2
     + Sous_chaine(c1, p, Long(c1))

soit "BAC " + "juin " + "2026".

4. c1 ← Effacer(c1, Long(c1) - 1, Long(c1)), ou encore c1 ← Sous_chaine(c1, 0, Long(c1) - 1).

2 Drill SD-N.2 — Pos retourne −1 : tester l'absence, extraire, chercher la deuxième occurrence
Entraînement 02 / 03

Drill SD-N.2 — Pos retourne −1 : tester l'absence, extraire, chercher la deuxième occurrence

4 questionsCorrigé masqué

En notation algorithmique actuelle, Pos(ch1, ch2) retourne l'indice de la première occurrence de ch1 dans ch2 (les indices commencent à 0), et −1 si ch1 n'apparaît pas dans ch2. Soit adr ← "sami.b@edu.tn".

  1. Donner la valeur de Pos("@", adr), de Pos("s", adr) et de Pos("@", "sami.edu.tn").
  2. Pour afficher « présent » quand un caractère c figure dans une chaîne ch, un élève a écrit Si Pos(c, ch) > 0 Alors Ecrire("présent") FinSi. Donner un exemple de c et de ch pour lequel cette instruction ne convient pas, puis la corriger.
  3. Écrire une fonction Domaine(adr) qui retourne la partie de adr située après le caractère @, ou la chaîne vide si adr ne contient pas @.
  4. Écrire une fonction Deuxieme(c, ch) qui retourne l'indice de la deuxième occurrence du caractère c dans ch, ou −1 si c apparaît moins de deux fois, en utilisant Pos et Effacer. Donner Deuxieme(".", adr) et Deuxieme("@", adr).

N.B. Effacer(ch, d, f) retourne ch privée des caractères d'indices d à f − 1.

Voir la correction commentéeAprès avoir posé votre démarche

1. Pos("@", adr) = 6 ; Pos("s", adr) = 0, car s est le caractère d'indice 0 ; Pos("@", "sami.edu.tn") = -1.

2. Avec c = "s" et ch = adr, Pos vaut 0 : la condition > 0 est fausse alors que s est présent. La correction teste l'absence telle que la notation la code : Si Pos(c, ch) ≠ -1 Alors Ecrire("présent") FinSi. L'habitude « > 0 » vient de l'ancienne notation, où les positions commençaient à 1 et où l'absence valait 0.

3.

Fonction Domaine (adr : Chaîne) : Chaîne
DEBUT
    p ← Pos("@", adr)
    Si p = -1 Alors
        r ← ""
    Sinon
        r ← Sous_chaine(adr, p+1, Long(adr))
    FinSi
    Retourner r
FIN

Domaine(adr) retourne "edu.tn" et Domaine("sami.edu.tn") la chaîne vide.

4. Idée : effacer tout jusqu'à la première occurrence incluse, chercher à nouveau, puis décaler l'indice trouvé de p1 + 1 — sauf si la seconde recherche échoue.

Fonction Deuxieme (c : Caractère,
                   ch : Chaîne) : Entier
DEBUT
    r ← -1
    p1 ← Pos(c, ch)
    Si p1 ≠ -1 Alors
        p2 ← Pos(c, Effacer(ch, 0, p1+1))
        Si p2 ≠ -1 Alors
            r ← p1 + 1 + p2
        FinSi
    FinSi
    Retourner r
FIN

Pour "." : p1 = 4, Effacer(adr, 0, 5) = "b@edu.tn", p2 = 5, d'où 10\boxed{10}. Pour "@" : p1 = 6, "edu.tn" ne contient pas @, p2 = -1, d'où −1\boxed{-1}. Sans le test sur p2, on retournerait −1 + 6 + 1 = 6, l'indice de la première occurrence : −1 ne doit jamais entrer dans un calcul d'indice.

3 Drill SD-N.3 — Valeur exige une chaîne numérique : contrôler avec Estnum avant de convertir
Entraînement 03 / 03

Drill SD-N.3 — Valeur exige une chaîne numérique : contrôler avec Estnum avant de convertir

3 questionsCorrigé masqué

En notation actuelle, Valeur(ch) retourne la valeur numérique de la chaîne ch à condition que ch soit convertible, et Estnum(ch) retourne Vrai si ch est formée de chiffres. On donne c1 ← "2026", c2 ← "20a6" et n de type Entier.

  1. Parmi les instructions suivantes, lesquelles sont correctes ? Justifier : n ← Valeur(c1) + 1 ; n ← Valeur(c2) ; n ← c1 + 1 ; c2 ← Convch(Valeur(c1) + 1).
  2. Écrire une procédure SaisirAnnee(@an) qui lit une année sous forme de chaîne jusqu'à obtenir exactement 4 chiffres, puis la convertit en entier dans an.
  3. Écrire une fonction SommeChiffres(ch) qui retourne la somme des chiffres de ch si tous les caractères de ch sont des chiffres, et −1 sinon. Donner SommeChiffres("4071") et SommeChiffres("40a1").
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : Valeur ne s'applique qu'à une chaîne convertible, et + n'additionne pas une chaîne et un entier.

  • n ← Valeur(c1) + 1 : correcte, n reçoit 2027.
  • n ← Valeur(c2) : incorrecte, "20a6" n'est pas convertible (Estnum(c2) vaut Faux).
  • n ← c1 + 1 : incorrecte, c1 est une chaîne ; il faut d'abord la convertir.
  • c2 ← Convch(Valeur(c1) + 1) : correcte, c2 reçoit la chaîne "2027".

2. Idée : la conversion vient après la boucle : quand on y arrive, Estnum(ch) est vrai et Valeur(ch) est sûre.

Procédure SaisirAnnee (@an : Entier)
DEBUT
    Répéter
        Ecrire("Année : ")
        Lire(ch)
    Jusqu'à (Long(ch) = 4) Et Estnum(ch)
    an ← Valeur(ch)
FIN

Objet local : ch (Chaîne), l'année saisie.

3.

Fonction SommeChiffres (ch : Chaîne) : Entier
DEBUT
    Si Non(Estnum(ch)) Alors
        s ← -1
    Sinon
        s ← 0
        Pour i de 0 à Long(ch)-1 Faire
            s ← s + Valeur(ch[i])
        Fin Pour
    FinSi
    Retourner s
FIN

Le test Estnum protège chaque appel Valeur(ch[i]) : dans la branche Sinon, chaque caractère est un chiffre. SommeChiffres("4071") retourne 4+0+7+1=124+0+7+1=\boxed{12} et SommeChiffres("40a1") retourne −1\boxed{-1}.

Relier ce raisonnement au bac

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