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

Algorithme ↔ Python : traduire une instruction, donner son résultat et son type (chaînes, conversions, aléa) — préparation à l'épreuve pratique

Idée directrice

Préparation à l'épreuve pratique, pas une question de l'écrit national. Les devoirs et séries de terminale demandent de passer d'une instruction algorithmique à son équivalent Python, d'en donner le résultat et le type (entier, réel, chaîne, booléen), puis de traduire un court algorithme complet. Tout repose sur une table de correspondance — Long → len, Sous_chaine(ch, d, f) → ch[d:f], Pos → find, Estnum → isdigit, Valeur → int, Convch → str, Majus → upper, Aléa(a, b) → randint(a, b) — et sur trois réflexes : les indices d'une chaîne partent de 0, la borne droite d'une tranche est exclue, et ce que rend input() est toujours une chaîne.

Ce qui aide à reconnaître la démarche

« Implémenter les expressions algorithmiques en Python et les évaluer » ; « Instruction en algorithme / Instruction en Python / Résultat / Type » ; « mettre une croix devant la ou les bonnes réponses » ; « Implémenter cet algorithme en Python »

Besoin d’un point de départ ? Voir la méthode
  • Apprendre la table de correspondance dans les deux sens : Long/len, Sous_chaine/tranche, Pos/find, Estnum/isdigit, Valeur/int, Convch/str, Majus/upper, Aléa/randint.
  • Tranche ch[d:f] : de l'indice d inclus à f exclu, soit f - d caractères ; ch[:f] part de 0.
  • Type du résultat : len, find, int, randint donnent un entier ; isdigit un booléen ; une tranche, str, upper une chaîne ; / et sqrt un réel, même appliqués à des entiers.
  • Répéter … Jusqu'à (C) : valide = False puis while not valide: ; Pour i de a à b : for i in range(a, b + 1).
  • Ce que rend input() est une chaîne : la convertir avec int() avant tout calcul.
Les pièges à vérifier dans ta démarche

Compter les indices à partir de 1 : ch[9] n'est pas le neuvième caractère. Inclure la borne droite d'une tranche ; croire que find ignore la casse ; écrire le résultat de str(n) sans guillemets alors que c'est une chaîne ; oublier from random import randint ; traduire Pour i de 0 à n - 1 par range(n - 1), qui s'arrête à n - 2.

Sujet principal

Exercice — traduire, évaluer, implémenter (séries de préparation à l'épreuve pratique)

8 questionsCorrigé masqué

On considère la chaîne ch qui contient "Examen 2026" ; ses indices commencent à 0.

1. Recopier et compléter le tableau suivant en écrivant l'instruction Python équivalente, le résultat obtenu et son type.

Instruction algorithmiqueInstruction PythonRésultatType
L ← Long(ch)
s ← Sous_chaine(ch, 0, 6)
p ← Pos("2", ch)
e ← Estnum(Sous_chaine(ch, 7, 11))
n ← Valeur(Sous_chaine(ch, 7, 11)) + 1
c ← Convch(n)
m ← Majus(ch)
x ← Aléa(1, 6)

2. Pour la même chaîne ch, choisir la ou les bonnes réponses.

  • a) ch.find("e") donne : l'entier 0 ; l'entier 4 ; l'entier -1.
  • b) Pour copier "Examen", on peut écrire : ch[0:6] ; ch[:6] ; ch[1:6].
  • c) int(ch[9]) donne : l'entier 2 ; le caractère "2" ; l'entier 6.
  • d) print(ch[0] * 3) affiche : E*3 ; EEE ; un message d'erreur.
  • e) Sachant que Ord("a") = 97 et Ord("z") = 122, chr(randint(97, 122)) retourne : un entier aléatoire ; une lettre minuscule ; une lettre majuscule.

3. On donne l'algorithme suivant :

Algorithme Chiffres
DEBUT
  Répéter
    Ecrire("Donner un code : ")
    Lire(ch)
  Jusqu'à (Long(ch) ≥ 6) ET (Long(ch) ≤ 12)
  nb ← 0
  Pour i de 0 à Long(ch) - 1 Faire
    Si ch[i] ∈ ["0".."9"] Alors
      nb ← nb + 1
    FinSi
  Fin Pour
  Ecrire("Nombre de chiffres : ", nb)
FIN
  • a) Dresser le tableau de déclaration des objets de cet algorithme.
  • b) Implémenter cet algorithme en Python.
  • c) Qu'affiche le programme pour le code "Bac2026ok" ? Que se passe-t-il si l'utilisateur tape d'abord "ab12" ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : numéroter les caractères à partir de 0 — "E" en 0, l'espace en 6, puis "2", "0", "2", "6" aux indices 7 à 10 — et se rappeler que la borne droite d'une tranche est exclue.

Instruction algorithmiqueInstruction PythonRésultatType
L ← Long(ch)L = len(ch)11entier (int)
s ← Sous_chaine(ch, 0, 6)s = ch[0:6]"Examen"chaîne (str)
p ← Pos("2", ch)p = ch.find("2")7entier
e ← Estnum(Sous_chaine(ch, 7, 11))e = ch[7:11].isdigit()Truebooléen (bool)
n ← Valeur(Sous_chaine(ch, 7, 11)) + 1n = int(ch[7:11]) + 12027entier
c ← Convch(n)c = str(n)"2027"chaîne
m ← Majus(ch)m = ch.upper()"EXAMEN 2026"chaîne
x ← Aléa(1, 6)x = randint(1, 6)un entier de 1 à 6entier

randint exige from random import randint ; ses deux bornes sont comprises, comme celles d'Aléa(1, 6).

2. a) L'entier 4 : find distingue majuscules et minuscules ; le E d'indice 0 est majuscule, le premier e minuscule est à l'indice 4. b) ch[0:6] et ch[:6] : la borne 6 est exclue, alors que ch[1:6] donne "xamen". c) L'entier 2 : ch[9] est le caractère "2" (le second 2 de 2026), que int convertit. d) EEE : multiplier une chaîne par 3 la répète trois fois. e) Une lettre minuscule : randint(97, 122) tire un code de 97 à 122, bornes comprises, que chr convertit en une lettre de "a" à "z".

3. a) Tableau de déclaration des objets : ch — chaîne — code saisi ; nb — entier — nombre de chiffres ; i — entier — compteur de la boucle.

b) Idée : Répéter … Jusqu'à (C) devient une boucle while qui tourne tant que C est fausse ; le booléen valide, initialisé à False, force le premier passage comme le test final de Répéter. Pour i de 0 à Long(ch) - 1 devient for i in range(len(ch)), car la borne de range est exclue.

valide = False
while not valide:
    ch = input("Donner un code : ")
    valide = 6 <= len(ch) <= 12
nb = 0
for i in range(len(ch)):
    if "0" <= ch[i] <= "9":
        nb = nb + 1
print("Nombre de chiffres :", nb)

c) "Bac2026ok" contient 9 caractères, il est accepté ; ses chiffres sont 2, 0, 2 et 6 : le programme affiche Nombre de chiffres : 4. "ab12" ne contient que 4 caractères : valide reste False et la saisie est redemandée.

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 (devoirs et séries, jamais posées à l'écrit national) : propositions Vrai/Faux sur la syntaxe Python (print, casse des identificateurs) ; évaluation d'une expression numérique mêlant Arrondi, Abs, Div et RacineCarré ; séquence Si … Sinon Si à écrire en Python avec l'affichage obtenu ; jeu « deviner un nombre » avec randint, à corriger et compléter.

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

1 Drill SD-P.1 — chaîne ou nombre ? le type décide de ce que font +, * et len
Entraînement 01 / 03

Drill SD-P.1 — chaîne ou nombre ? le type décide de ce que font +, * et len

4 questionsCorrigé masqué

On exécute, dans l'ordre, les instructions Python suivantes :

a = "12"
b = "7"
x = a + b
y = int(a) + int(b)
z = a * 2
w = str(int(a) * 2)
v = len(x + "0")
  1. Pour chaque variable x, y, z, w et v, donner sa valeur et son type (entier, réel ou chaîne), ainsi qu'une instruction algorithmique équivalente utilisant les fonctions prédéfinies Valeur, Convch et Long.
  2. Que produit l'instruction print("Total : " + y) ? Proposer deux écritures correctes.
  3. Un programme lit deux entiers avec a = input("a = ") et b = input("b = "), puis affiche a + b. Qu'affiche-t-il si l'utilisateur tape 12 puis 7 ? Corriger la lecture.
  4. Donner la valeur et le type de float("7.5") + 1. Que se passe-t-il avec int("7.5") ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : + entre deux chaînes concatène, entre deux entiers additionne ; * entre une chaîne et un entier répète la chaîne. Le type des opérandes, pas leur aspect, décide du résultat.

VariableValeurTypeInstruction algorithmique
x"127"chaînex ← a + b
y19entiery ← Valeur(a) + Valeur(b)
z"1212"chaînez ← a + a
w"24"chaînew ← Convch(Valeur(a) * 2)
v4entierv ← Long(x + "0")

Pour v : x + "0" vaut "1270", chaîne de 4 caractères.

2. On ne peut pas concaténer une chaîne et un entier : l'instruction provoque une erreur de type (TypeError). Écritures correctes : print("Total : " + str(y)), où str joue le rôle de Convch, ou print("Total :", y), où print sépare ses arguments par une espace.

3. input() rend des chaînes : le programme affiche 127. Il faut convertir à la lecture : a = int(input("a = ")) et b = int(input("b = ")) ; il affiche alors 19.

4. float("7.5") + 1 vaut 8.5, un réel. int("7.5") provoque une erreur (ValueError) : int n'accepte qu'une chaîne qui représente un entier, comme "7" ou "-3" ; pour une chaîne qui représente un réel, il faut float.

2 Drill SD-P.2 — classer un caractère : traduire « Si … Sinon Si … Sinon » et contrôler la saisie
Entraînement 02 / 03

Drill SD-P.2 — classer un caractère : traduire « Si … Sinon Si … Sinon » et contrôler la saisie

4 questionsCorrigé masqué

On donne la séquence algorithmique suivante, où c est un caractère saisi au clavier :

Ecrire("Donner un caractère : ")
Lire(c)
Si c ∈ ["A".."Z"] Alors
  Ecrire(c, " est une lettre majuscule")
Sinon Si c ∈ ["a".."z"] Alors
  Ecrire(c, " est une lettre minuscule, sa majuscule est ", Majus(c))
Sinon Si c ∈ ["0".."9"] Alors
  Ecrire(c, " est un chiffre, son double est ", Valeur(c) * 2)
Sinon
  Ecrire(c, " est un autre caractère")
FinSi
  1. Écrire cette séquence en Python.
  2. Donner l'affichage obtenu lorsque l'utilisateur tape G, q, 7 puis ?.
  3. L'utilisateur tape la chaîne Bac, de trois caractères. Qu'affiche le programme Python ? Expliquer ce résultat.
  4. Ajouter en Python un contrôle de saisie qui redemande c tant que l'utilisateur ne tape pas exactement un caractère.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : Sinon Si devient elif ; l'appartenance c ∈ ["A".."Z"] devient la double comparaison "A" <= c <= "Z" ; Majus devient upper() et Valeur devient int. print sépare déjà ses arguments par une espace.

c = input("Donner un caractère : ")
if "A" <= c <= "Z":
    print(c, "est une lettre majuscule")
elif "a" <= c <= "z":
    print(c, "est une lettre minuscule, sa majuscule est", c.upper())
elif "0" <= c <= "9":
    print(c, "est un chiffre, son double est", int(c) * 2)
else:
    print(c, "est un autre caractère")

2. G : G est une lettre majuscule. q : q est une lettre minuscule, sa majuscule est Q. 7 : 7 est un chiffre, son double est 14. ? : ? est un autre caractère.

3. Le programme affiche Bac est une lettre majuscule. Python compare les chaînes caractère par caractère : "Bac" est après "A" et avant "Z", car son premier caractère B est entre les deux. La double comparaison ne vérifie donc pas qu'il y a un seul caractère.

4. Idée : Répéter … Jusqu'à (Long(c) = 1) devient une boucle while pilotée par un booléen ; elle remplace la première ligne c = input(…), avant le if.

valide = False
while not valide:
    c = input("Donner un caractère : ")
    valide = len(c) == 1
3 Drill SD-P.3 — tirage de lettres au hasard dans un tableau : Aléa, Chr et la boucle Pour en Python
Entraînement 03 / 03

Drill SD-P.3 — tirage de lettres au hasard dans un tableau : Aléa, Chr et la boucle Pour en Python

4 questionsCorrigé masqué

On donne l'algorithme suivant :

Algorithme Tirage
DEBUT
  Répéter
    Ecrire("Nombre de lettres : ")
    Lire(n)
  Jusqu'à (n ≥ 5) ET (n ≤ 26)
  Pour i de 0 à n - 1 Faire
    T[i] ← Chr(Aléa(65, 90))
  Fin Pour
  Ecrire("Lettre cherchée : ")
  Lire(c)
  nb ← 0
  Pour i de 0 à n - 1 Faire
    Si T[i] = c Alors
      nb ← nb + 1
    FinSi
  Fin Pour
  Ecrire(c, " apparaît ", nb, " fois")
FIN
  1. Dresser le tableau de déclaration des nouveaux types et celui des objets.
  2. Implémenter cet algorithme en Python ; le tableau sera créé avec array du module numpy.
  3. Pourquoi écrit-on randint(65, 90) alors que range(65, 90) s'arrêterait à 89 ?
  4. Après le remplissage, on obtient pour n = 6 : T = ["K", "B", "K", "Z", "A", "K"]. Qu'affiche le programme si l'utilisateur tape K ? Et s'il tape k ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Nouveaux types : Tab = tableau de 26 caractères. Objets : T — Tab ; n, i, nb — entier ; c — caractère.

2. Idée : le tableau est créé une fois à sa taille maximale ; chaque Pour i de 0 à n - 1 devient for i in range(n), et Chr(Aléa(65, 90)) devient chr(randint(65, 90)).

from numpy import array
from random import randint

T = array([str()] * 26)
valide = False
while not valide:
    n = int(input("Nombre de lettres : "))
    valide = 5 <= n <= 26
for i in range(n):
    T[i] = chr(randint(65, 90))
c = input("Lettre cherchée : ")
nb = 0
for i in range(n):
    if T[i] == c:
        nb = nb + 1
print(c, "apparaît", nb, "fois")

3. randint(a, b) inclut ses deux bornes, comme Aléa(a, b) : randint(65, 90) peut rendre 90, code de "Z". C'est range(a, b) qui exclut sa borne droite ; les deux conventions ne sont pas les mêmes.

4. Avec K, le programme compte les cases d'indices 0, 2 et 5 et affiche K apparaît 3 fois. Avec k, la comparaison T[i] == c distingue majuscules et minuscules : il affiche k apparaît 0 fois.

Relier ce raisonnement au bac

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