DS — Python pratique (BTS SIO 1re année, Bloc B3)
Durée: 2 heures
Thème: Centre de sauvegarde des renards (FoxShelter) — conditions, boucles, fonctions
Contraintes: Ne pas utiliser les listes ni les tuples. Utiliser uniquement chaînes, nombres, conditions, boucles, fonctions.
La rigueur, la rédaction et le soin sont évalués sur 2 points.
Rappels autorisés
int(...),str(...),input(...),print(...)- Concaténation de chaînes:
"bonjour" + " monde"→"bonjour monde","A" + "B"→"AB","B" + "A"→"BA" - Pour obtenir la taille d'une chaîne de caractères, on peut utiliser
len(chaine) - Pour tester qu’un caractère appartient à un ensemble (chiffres, lettres, spéciaux), parcourir une chaîne de référence avec une boucle et comparer les caractères (sans listes).
Partie A — Code à compléter (50 min)
Exercice A1
Compléter la fonction nb_occurrences(texte, lettre) qui prend une chaîne texte et un caractère lettre, et renvoie le nombre d’occurrences de lettre dans texte.
Entête typée obligatoire.
def nb_occurrences(texte: str, lettre: str) -> int:
compteur = 0
for c in texte:
# Compléter la condition d'égalité
if ...:
compteur = compteur + 1
return ...
Exercice A2
Compléter la fonction nb_chiffres(code_cage) qui prend une chaîne code_cage (ex: "R-23-A") et renvoie le nombre de chiffres présents.
Entête typée obligatoire.
def nb_chiffres(code_cage: str) -> int:
compteur = 0
digits = "0123456789"
for c in code_cage:
i = 0
trouve = False
while i < len(digits):
if ...:
trouve = True
i = i + 1
if ...:
compteur = compteur + 1
return ...
Exercice A3
Compléter contient_majuscule(nom) qui renvoie True si nom contient au moins une majuscule (A–Z), False sinon.
Entête typée obligatoire.
def contient_majuscule(nom: str) -> bool:
maj = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for c in nom:
k = 0
while k < len(maj):
if ...:
return True
k = k + 1
return ...
Exercice A4
Compléter contient_symbole(identifiant) qui renvoie True si identifiant contient au moins un symbole parmi - et _, sinon False.
Entête typée obligatoire.
def contient_symbole(identifiant: str) -> bool:
specials = "-_"
for c in identifiant:
i = 0
while i < len(specials):
if ...:
return True
i = i + 1
return ...
Exercice A5
Compléter contient_deux_types(identifiant) qui renvoie True si identifiant contient au moins deux catégories différentes parmi: lettre, chiffre, symbole; sinon False, en utilisant les fonctions précédentes (nb_occurrences pour une lettre, nb_chiffres, contient_symbole) et une chaîne de l'alphabet.
Entête typée obligatoire.
def contient_deux_types(identifiant: str) -> bool:
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# au moins une lettre ?
a_lettre = False
j = 0
while j < len(alphabet):
if nb_occurrences(identifiant, alphabet[j]) > ...:
a_lettre = True
j = j + 1
a_chiffre = nb_chiffres(identifiant) > ...
a_symbole = contient_symbole(...)
if (a_lettre and a_chiffre) or (a_lettre and a_symbole) or (a_chiffre and a_symbole):
return True
return ...
Exercice A6
Compléter score_identifiant(identifiant) qui calcule un score simple:
- +2 si longueur ≥ 6
- +2 si contient_deux_types est vrai
- +2 si contient_majuscule est vrai
- +2 si contient_symbole est vrai
- +2 si nb_chiffres(identifiant) ≥ 1
Entête typée obligatoire.
def score_identifiant(identifiant: str) -> int:
score = 0
if len(identifiant) >= ...:
score = score + ...
if contient_deux_types(...):
score = score + ...
if contient_majuscule(...):
score = score + ...
if contient_symbole(...):
score = score + ...
if nb_chiffres(...) >= ...:
score = score + ...
return ...
Partie B — Fonctions à écrire (1h10)
Exercice B1
Écrire une fonction repeter_caractere(c, n) qui prend en paramètre un caractère c et un entier n, et qui renvoie une chaîne contenant c répété n fois (sans listes ni *).
Exemple: repeter_caractere('X', 5) → 'XXXXX'
Exercice B2
Écrire une fonction masquer_nom(nom) qui renvoie une nouvelle chaîne où seules la première et la dernière lettre restent visibles et où toutes les autres positions sont remplacées par *.
Si la longueur est ≤ 2, renvoyer la chaîne telle quelle.
Exemple: masquer_nom("Renard") → R*****d
Exercice B3
Écrire une fonction contient_trois_identiques(chaine) qui prend en paramètre une chaîne chaine et renvoie True si la chaîne contient au moins 3 fois le même caractère d'affilée (ex: aaa, 111, @@@), sinon False.
Contraintes: utiliser une boucle, comparer chaque caractère au précédent, compter les répétitions consécutives, réinitialiser quand le caractère change, retourner True dès que le compteur atteint 3.
Exercice B4
Écrire une fonction calcul_ration(age, poids) qui prend en paramètre l’age (entier, années) et le poids (flottant, kilogrammes) et renvoie la ration journalière (entier, grammes) selon:
- Si age <= 1: poids * 6
- Si 2 <= age <= 6: poids * 5
- Si age >= 7: poids * 4
Ne pas utiliser de listes. Arrondir à l’entier inférieur en convertissant simplement le résultat avec int(...).
Exercice B5
Écrire une fonction conseil_identifiant(identifiant) qui renvoie une chaîne explicative avec 2 à 3 conseils personnalisés (simples phrases concaténées) si score_identifiant(identifiant) < 6.
Exemples de conseils: « ajouter une majuscule », « allonger à 6+ », « mettre un chiffre », « ajouter un symbole - ou _ ».