Accroche et situation-problème
« Une application reçoit un code d'inscription sous la forme d'une chaîne, par exemple "info-2026". On souhaite vérifier si le suffixe après le tiret "-" est bien composé uniquement de chiffres, mettre le préfixe en majuscules ("INFO"), convertir l'année en entier pour calculer l'année suivante, puis afficher le code mis à jour sous la forme "INFO-2027". »
Décomposition du traitement textuel :
-
1
Localisation du séparateur : Recherche de la position du tiret
"-"avecPos/.find(). -
2
Découpage préfixe / suffixe : Extraction sans boucle avec
Sous_chaine/ slicing[d:f]. -
3
Validation & Conversion de l'année : Vérification avec
Estnum/isdecimal(), conversion viaValeur/int()et incrémentation (+ 1). -
4
Recomposition du nouveau code : Majuscules avec
Majus/.upper(), conversion avecConvch/str()et concaténation+.
"info" → "INFO""-" (indice 4)"2026" → 2026 + 1 = 2027Questionnement oral (cliquez pour afficher la réponse didactique) :
Tableau de correspondance : Algorithmique ↔ Python
Mise au point sur les équivalences normatives officielles pour les caractères et les chaînes de caractères (Conventions 2024-2025) :
| Notion / Opération | Algorithmique (Norme) | Python (Conventions 2024-2025) |
|---|---|---|
| Longueur | Long(ch) |
len(ch) |
| Recherche de position | Pos(ch1, ch2) (retourne -1 si absent) |
ch2.find(ch1) |
| Extraction (slicing) | Sous_chaine(ch, d, f) position f exclue |
ch[d:f] |
| Suppression | Effacer(ch, d, f) |
ch = ch[:d] + ch[f:] |
| Passage en majuscules | Majus(ch) |
ch.upper() |
| Test numérique | Estnum(ch) |
ch.isdecimal() |
| Conversion en nombre | Valeur(ch) |
int(ch) ou float(ch) |
| Conversion en chaîne | Convch(x) |
str(x) |
| Code ASCII / Caractère | Ord(c)Chr(d) |
ord(c)chr(d) |
Rappels didactiques majeurs :
- Indiçage en base 0 : Le premier caractère d'une chaîne
Chest situé à l'indice 0 (notationCh[i]avec 0 ≤ i < Long(Ch)). - Borne finale exclue : Tant en algorithmique (
Sous_chaine(ch, d, f)) qu'en Python (ch[d:f]), le caractère à la position finale f est toujours exclu. - Type unique en Python : En Python, il n'existe pas de type caractère distinct : un caractère est simplement représenté comme une chaîne de longueur 1 de type
str.
Si la sous-chaîne n'est pas trouvée, Pos et .find() retournent impérativement -1 (et non 0).
"bac".find("x") == -1
L'extraction de d à f comporte f - d caractères.
"info"[1:3] == "nf"
En Python, les chaînes étant immuables, on découpe et concatène sans la tranche supprimée.
ch = ch[:0] + ch[4:]
Conception algorithmique & T.D.O. Standard
Élaboration collective de la solution au tableau : respect strict de la syntaxe officielle et des types de données.
ALGORITHME MajCode
DEBUT
Écrire("Donner le code (ex: info-2026) : ")
Lire(code)
p ← Pos("-", code)
prefixe ← Sous_chaine(code, 0, p)
suffixe ← Sous_chaine(code, p + 1, Long(code))
valide ← Estnum(suffixe)
annee ← Valeur(suffixe)
nouvelle_annee ← annee + 1
nouveau_code ← Majus(prefixe) + "-" + Convch(nouvelle_annee)
Écrire("Suffixe numérique valide : ", valide)
Écrire("Nouveau code : ", nouveau_code)
FIN
| Objet | Type / Nature |
|---|---|
| code, prefixe, suffixe, nouveau_code | Chaîne de caractères |
| p, annee, nouvelle_annee | Entier |
| valide | Booléen |
p: Position du tiret (Entier ≥ 0).valide: Booléen résultant deEstnum(suffixe).annee: Converti en Entier pour autoriser l'addition arithmétique+ 1.
Traduction, Exécution sur machine & Laboratoire
Saisie individuelle du script Python par les élèves dans leur environnement de travail (Thonny, VS Code ou IDLE) :
# Saisie du code initial
code = input("Donner le code (ex: info-2026) : ")
# Recherche du séparateur et extraction
p = code.find("-")
prefixe = code[0:p]
suffixe = code[p + 1:len(code)]
# Vérification et conversions
valide = suffixe.isdecimal()
annee = int(suffixe)
nouvelle_annee = annee + 1
# Formatage final
nouveau_code = prefixe.upper() + "-" + str(nouvelle_annee)
# Affichage
print("Suffixe numérique valide :", valide)
print("Nouveau code :", nouveau_code)
Vérifier l'expression
code[p + 1:len(code)] ou la forme équivalente code[p + 1:]. La position p (le tiret) doit être sautée (+ 1).
Veiller à ce que les élèves n'emploient aucune fonction non agréée : utiliser exclusivement
isdecimal() (et non pas isdigit()), et proscrire formellement la méthode .replace().
Rappeler l'intérêt majeur de
isdecimal() avant int() pour éviter une erreur fatale ValueError lors de la saisie d'un suffixe contenant des lettres.
Résultats des étapes :
len(code)) :
{{ cleanInput.length }} caractères
code.find("-")) :
{{ hasSep ? sepIndex : '-1 (absent)' }}
code[0:p]) :
"{{ prefixeExtrait }}" → "{{ prefixeExtrait.toUpperCase() }}"
code[p+1:]) :
"{{ suffixeExtrait }}"
isdecimal()) :
{{ isSuffixNumeric ? 'Vrai / True (chiffres uniquement)' : 'Faux / False' }}