Axe : Modularité 2 Sections : Sc. Expérimentales, Mathématiques & Sc. Techniques Conventions 2024-2025

Série N°6 : Modularité 2 — Les Procédures

Passage par valeur vs par variable (@), portée des identificateurs, T.D.O.L. et conventions Python (mot-clé global).

Série N°6 : Les Procédures

Exercice 1 : QCM Notions de base sur les Procédures

🟢 Facile
💡 Rappel de cours : La Procédure & les Modes de Passage
  • Une procédure est un sous-programme qui effectue des actions ou calcule plusieurs résultats sans renvoyer de valeur unique dans son nom. Elle ne comporte jamais de type de retour dans son en-tête ni d'instruction Retourner.
  • L'appel d'une procédure s'effectue comme une instruction autonome : NomProc(arg1, arg2).
  • Passage par valeur : transmet une copie de l'argument (paramètre d'entrée). La variable effective reste intacte.
  • Passage par variable / adresse (noté @ en algorithme) : transmet la référence directe de la variable (paramètre de sortie ou d'entrée-sortie). Toute modification est répercutée immédiatement sur la variable appelante.

Cochez la bonne réponse pour chacune des 10 questions suivantes :

Question 1

Quelle est la différence fondamentale entre une fonction et une procédure en algorithmique ?

  • Une procédure ne peut contenir aucune boucle
  • Une fonction renvoie un résultat unique à travers son nom, tandis qu'une procédure ne renvoie pas de résultat directement par son nom
  • Une procédure ne peut recevoir aucun paramètre
  • Une fonction s'exécute toujours plus rapidement qu'une procédure
Question 2

Quelle est la syntaxe correcte de l'en-tête d'une procédure affichant les diviseurs d'un entier ?

  • Procédure Afficher_Diviseurs(n : Entier)
  • Fonction Afficher_Diviseurs(n : Entier) : Vide
  • Procédure Afficher_Diviseurs(n : Entier) : Entier
  • Début Procédure Afficher_Diviseurs(n : Entier)
Question 3

Comment s'effectue l'appel d'une procédure Initialiser(x, y) dans le programme principal ?

  • res ← Initialiser(x, y)
  • Ecrire(Initialiser(x, y))
  • Initialiser(x, y) (comme une instruction autonome isolée)
  • Si Initialiser(x, y) Alors ...
Question 4

Dans l'en-tête Procédure Calcul(a : Entier, @b : Entier), quel est le mode de passage du paramètre b ?

  • Passage par valeur
  • Passage par variable (ou par adresse), indiqué par le symbole @
  • Passage par constante
  • Passage global automatique
Question 5

Lors d'un passage par valeur, si le sous-programme modifie le paramètre formel dans son corps :

  • Seule la copie locale est modifiée, la variable effective d'origine reste rigoureusement inchangée
  • La variable effective dans le programme principal est immédiatement modifiée
  • Une erreur d'exécution bloque le programme
  • La variable est supprimée de la mémoire
Question 6

Quel mode de passage doit obligatoirement être attribué à un paramètre qui doit transmettre un résultat calculé vers le programme appelant ?

  • Le passage par valeur
  • Le passage par constante
  • Le passage par variable (par adresse, noté @)
  • Le passage par chaîne
Question 7

Peut-on utiliser l'instruction Retourner val dans le corps d'une procédure algorithmique ?

  • Oui, c'est même obligatoire à la fin de chaque procédure
  • Non, l'instruction Retourner est strictement réservée aux fonctions
  • Oui, mais uniquement si val est de type entier
  • Oui, si la procédure comporte au moins deux paramètres
Question 8

Soit l'en-tête Procédure Incrementer(@x : Entier). Quel appel est illégal ?

  • Incrementer(5) (car 5 est une valeur constante, pas une variable capable de recevoir une modification)
  • Incrementer(compteur) (où compteur est une variable entière)
  • Incrementer(total) (où total est une variable entière)
  • Incrementer(n) (où n est un entier)
Question 9

Une variable déclarée dans le T.D.O.G. (Objets Globaux) du programme principal :

  • N'est accessible que dans le programme principal et interdite dans les procédures
  • Est détruite dès qu'un sous-programme commence à s'exécuter
  • Est accessible en lecture dans l'ensemble du programme et de ses sous-programmes
  • Doit obligatoirement être de type réel
Question 10

En Python 3, les types simples scalaires (int, float, str, bool) sont immuables (inchangeables en place). Pour qu'une procédure modifie directement une variable globale de type int selon les conventions officielles 2024-2025, on déclare dans la fonction :

  • local nom_var
  • global nom_var
  • pointer nom_var
  • static nom_var

Exercice 2 : QCM Analyse de Traces & Effets de Bord

🟠 Intermédiaire

Analysez rigoureusement les algorithmes et traces d'exécution suivants :

Question 1

Soit l'algorithme suivant :

Procédure Test(a : Entier, @b : Entier)
Début
  a ← a + 10
  b ← b + 10
Fin

// Dans le programme principal :
x ← 5
y ← 5
Test(x, y)

Quelles sont les valeurs finales de x et y après l'exécution de Test(x, y) ?

  • x = 5 et y = 15 (a est par valeur donc x est inchangé ; b est par variable @ donc y est modifié)
  • x = 15 et y = 15
  • x = 5 et y = 5
  • x = 15 et y = 5
Question 2

Un élève écrit la procédure de permutation suivante :

Procédure Permuter(x : Entier, y : Entier)
Début
  aux ← x
  x ← y
  y ← aux
Fin

Pourquoi les variables du programme appelant ne sont-elles pas échangées après l'appel Permuter(a, b) ?

  • Parce que la variable tampon aux est mal orthographiée
  • Parce que x et y sont passés par valeur : seule la copie locale a été permutée, sans affecter a et b
  • Parce que la permutation nécessite obligatoirement 3 paramètres
  • Parce qu'il manque l'instruction Retourner
Question 3

Pour corriger la procédure de l'exercice précédent et rendre la permutation effective en mémoire, il faut écrire :

  • Procédure Permuter(@x : Entier, y : Entier)
  • Procédure Permuter(x : Entier, @y : Entier)
  • Procédure Permuter(@x : Entier, @y : Entier)
  • Fonction Permuter(x : Entier, y : Entier) : Entier
Question 4

Soit une procédure de saisie sécurisée :

Procédure Saisie(@n : Entier)
Début
  Répéter
    Ecrire("Donner N (N > 0) : ")
    Lire(n)
  Jusqu'à n > 0
Fin

Pourquoi le symbole @ est-il strictement indispensable devant n ?

  • Pour que la boucle Répéter puisse s'exécuter
  • Pour transmettre la valeur lue au clavier à la variable effective du programme principal lors du retour
  • Pour empêcher la saisie de caractères alphabétiques
  • Pour convertir automatiquement n en réel
Question 5

Soit le script Python suivant avec variable globale :

compteur = 0

def incrementer():
    global compteur
    compteur += 1

incrementer()
incrementer()
print(compteur)

Quelle valeur est affichée à l'écran ?

  • 2
  • 0
  • 1
  • Une erreur UnboundLocalError
Question 6

En Python, si l'on omet l'instruction global compteur dans la fonction précédente lors d'une affectation compteur += 1 :

  • Python incrémente automatiquement la variable globale
  • Python crée une variable sans valeur
  • Une erreur UnboundLocalError: local variable 'compteur' referenced before assignment est levée
  • Le compteur prend la valeur None
Question 7

Peut-on appeler une fonction à l'intérieur du corps d'une procédure en algorithmique ?

  • Non, une procédure ne peut jamais faire appel à un autre sous-programme
  • Oui, une procédure peut librement appeler une fonction et utiliser sa valeur de retour dans ses calculs ou conditions
  • Uniquement si la fonction retourne obligatoirement une valeur entière
  • Non, seules les fonctions ont le droit d'appeler d'autres fonctions
Question 8

Soit la procédure suivante calculant simultanément le quotient entier et le reste de deux nombres :

Procédure Division_Euclidienne(a : Entier, b : Entier, @q : Entier, @r : Entier)
Début
  q ← a Div b
  r ← a Mod b
Fin

Quels sont respectivement les statuts des paramètres a, b, q, r ?

  • a et b sont des paramètres d'entrée (par valeur) ; q et r sont des paramètres de sortie (par variable @)
  • Tous les 4 sont des paramètres de sortie
  • a et b sont des paramètres de sortie ; q et r sont des paramètres d'entrée
  • Tous les 4 sont des paramètres d'entrée
Question 9

Qu'appelle-t-on le masquage d'une variable globale ?

  • L'effacement définitif de la variable du disque dur
  • La déclaration d'une variable locale portant le même identificateur qu'une variable globale, rendant la globale inaccessible dans ce sous-programme
  • La transformation d'un entier en chaîne secrète
  • L'utilisation de tirets bas dans le nom de la variable
Question 10

Dans quel cas de conception la structure Procédure est-elle incontournable ?

  • Lorsqu'on doit tester si un nombre est pair
  • Lorsqu'on effectue un simple calcul d'aire $S = L \times l$
  • Lorsqu'on doit réaliser un traitement produisant plusieurs résultats distincts ou modifiant des variables existantes (saisie, tri, remplissage, échange)
  • Lorsqu'on calcule une racine carrée

Exercice 3 : Horodatage & Décomposition Temporelle (Mixte Chronométrie)

🟢 Facile

Dans un système de chronométrage sportif ou de supervision réseau, les mesures de durée sont capturées sous la forme d'un nombre total de secondes écoulées (par exemple total_sec = 7543 secondes).
Pour restituer ce temps sous une forme humaine conventionnelle HH:MM:SS (par exemple "02:05:43"), on souhaite mettre en place une architecture modulaire collaborative combinant fonctions et procédures :

  • Une fonction Formater_2Chiffres(val : Entier) : Chaîne qui prend un entier compris entre 0 et 59 et retourne une chaîne de deux chiffres (en préfixant d'un zéro si nécessaire : $5 \to \text{"05"}$, $42 \to \text{"42"}$).
  • Une procédure Decomposer_Temps(total_sec : Entier, @h : Entier, @m : Entier, @s : Entier) qui extrait simultanément le nombre d'heures, de minutes et de secondes restantes à partir de la durée brute en secondes.
  • Une fonction Formater_Horloge(h : Entier, m : Entier, s : Entier) : Chaîne qui appelle Formater_2Chiffres pour construire et retourner la chaîne finale au format officiel "HH:MM:SS".
  • Une procédure Afficher_Bilan_Chrono(total_sec : Entier) qui appelle Decomposer_Temps et Formater_Horloge, puis affiche le temps formaté et son détail textuel.
Décomposition temporelle d'une durée en heures, minutes et secondes
Décomposition d'une durée brute en Heures ($h$), Minutes ($m$) et Secondes ($s$)
Travail demandé :
  1. Pourquoi le calcul des composantes temporelles est-il confié à une procédure (Decomposer_Temps) plutôt qu'à une simple fonction ?
  2. Justifier le mode de passage des paramètres dans Decomposer_Temps : passage par valeur pour total_sec, et passage par variable avec @ pour h, m et s.
  3. Rédiger l'algorithme de la fonction Formater_2Chiffres(val : Entier) : Chaîne.
  4. Dresser le Tableau de Déclaration des Objets Locaux (T.D.O.L.) et rédiger l'algorithme officiel de la procédure Decomposer_Temps.
  5. Rédiger l'algorithme de la fonction Formater_Horloge et de la procédure Afficher_Bilan_Chrono.
  6. Traduire ces sous-programmes en Python 3 selon les conventions officielles 2024-2025.
💡 Conseils méthodologiques & Indices
  • Pour décomposer le temps en secondes : $h \leftarrow total\_sec \text{ Div } 3600$, le reste intermédiaire $reste \leftarrow total\_sec \text{ Mod } 3600$, puis $m \leftarrow reste \text{ Div } 60$ et $s \leftarrow reste \text{ Mod } 60$.
  • Pour Formater_2Chiffres, utiliser la fonction standard ConvCh(val) : si $val < 10$, concaténer "0" + ConvCh(val), sinon retourner ConvCh(val).
  • Dans Decomposer_Temps, déclarer la variable intermédiaire reste dans le T.D.O.L. de la procédure.
  • En Python, pour simuler la modification de variables scalaires passées en argument, on utilise soit la réaffectation multiple par tuple (ex: h, m, s = decomposer_temps(total_sec)), soit le mot-clé global.
Jeux d'essais à vérifier :
• total_sec = 3661 → $h = 1, m = 1, s = 1$ → Horloge : "01:01:01".
• total_sec = 7543 → $h = 2, m = 5, s = 43$ → Horloge : "02:05:43".
• total_sec = 59 → $h = 0, m = 0, s = 59$ → Horloge : "00:00:59".

Exercice 4 : Sécurité Routière & Distance d'Arrêt (Mixte Cinématique & Diagnostic)

🟢 Facile

En sécurité routière et en physique appliquée, la distance totale d'arrêt d'un véhicule $D_a$ face à un obstacle imprévu se compose de deux phases successives :

  1. La distance de réaction ($D_r$) : parcourue à vitesse constante pendant le temps de réflexe du conducteur ($t_r$, estimé à $1.0\text{ s}$ pour un conducteur vigilant). En convertissant la vitesse de km/h en m/s ($v_{ms} = \frac{v}{3.6}$), on a : $D_r = v_{ms} \times t_r$.
  2. La distance de freinage ($D_f$) : décélération active des freins jusqu'à l'arrêt complet selon la pesanteur ($g = 9.81\text{ m/s}^2$) et l'adhérence $\mu$ : $$D_f = \frac{v_{ms}^2}{2 \times g \times \mu}$$ $\mu = 0.8$ sur route sèche ("Sec"), $\mu = 0.4$ sur route mouillée ("Mouille"), et $\mu = 0.1$ sur route verglacée ("Verglace").

La distance totale d'arrêt vaut la somme des deux distances : $D_a = D_r + D_f$. On souhaite concevoir un module embarqué combinant fonctions et procédures :

Cinématique de sécurité routière et distance totale d'arrêt
Distance de réaction ($D_r$), freinage ($D_f$) et arrêt sécurisé face à un obstacle
  • Une fonction Adherence_Route(etat : Chaîne) : Réel qui reçoit l'état textuel de la route et renvoie le coefficient de frottement $\mu$ correspondant ($0.8$, $0.4$, ou $0.1$ ; $0.5$ par défaut si non reconnu).
  • Une fonction Distance_Freinage(vitesse_kmh : Réel, coef_mu : Réel) : Réel qui calcule et retourne la distance de freinage physique $D_f$ en mètres.
  • Une procédure Calculer_Securite_Arret(vitesse_kmh : Réel, etat_route : Chaîne, temps_reac : Réel, @dist_reac : Réel, @dist_frein : Réel, @dist_arret : Réel) qui calcule simultanément les trois distances ($D_r$, $D_f$ et $D_a = D_r + D_f$) et les restitue via trois paramètres de sortie passés par variable (@).
  • Une fonction Tester_Collision(dist_arret : Réel, dist_obstacle : Réel) : Booléen qui renvoie Vrai si $dist\_arret > dist\_obstacle$ (choc inévitable), et Faux si le véhicule parvient à s'arrêter avant l'obstacle.
  • Une procédure Afficher_Diagnostic_Routier(vitesse_kmh : Réel, etat_route : Chaîne, dist_obstacle : Réel) qui coordonne l'appel aux sous-programmes (en fixant le temps de réaction à $1.0\text{ s}$), puis affiche un compte-rendu clair : distances décomposées, verdict de collision ou d'arrêt sécurisé, et marge restante ou distance manquante.
Travail demandé :
  1. Pourquoi le calcul simultané des trois composantes ($D_r$, $D_f$, $D_a$) nécessite-t-il l'emploi d'une procédure plutôt que d'une fonction unique ?
  2. Rédiger l'algorithme de la fonction Adherence_Route(etat : Chaîne) : Réel.
  3. Rédiger l'algorithme de la fonction Distance_Freinage(vitesse_kmh : Réel, coef_mu : Réel) : Réel.
  4. Dresser le T.D.O.L. et rédiger l'algorithme officiel de la procédure Calculer_Securite_Arret en mettant en œuvre le passage par variable (@).
  5. Rédiger l'algorithme de la fonction Tester_Collision et de la procédure Afficher_Diagnostic_Routier.
  6. Traduire l'ensemble de l'architecture en Python 3 selon les normes officielles.
💡 Conseils méthodologiques & Indices
  • Attention à la conversion d'unités : convertir impérativement la vitesse en mètres par seconde ($v_{ms} \leftarrow vitesse\_kmh / 3.6$) avant d'évaluer $D_r = v_{ms} \times temps\_reac$ et $D_f$.
  • Dans Calculer_Securite_Arret, déclarer les variables locales nécessaires ($v_{ms}$ et $mu$) dans le T.D.O.L. de la procédure. Appeler Adherence_Route pour obtenir $\mu$, puis calculer $dist\_frein \leftarrow Distance\_Freinage(vitesse\_kmh, mu)$, et enfin $dist\_arret \leftarrow dist\_reac + dist\_frein$.
  • Dans Afficher_Diagnostic_Routier, si Tester_Collision est Vrai, calculer l'excès de distance $dist\_arret - dist\_obstacle$ pour indiquer l'intensité du choc ; sinon calculer la marge de sécurité $dist\_obstacle - dist\_arret$.
Jeux d'essais à vérifier : ($t_r = 1.0\text{ s}$)
• En ville : $v = 50\text{ km/h}$, route "Sec", obstacle à $30.0\text{ m}$ :
  $D_r \approx 13.89\text{ m}$, $D_f \approx 12.29\text{ m}$ → $D_a \approx 26.18\text{ m}$ → Arrêt sécurisé (marge restante : $3.82\text{ m}$).
• Sur route : $v = 90\text{ km/h}$, route "Mouille", obstacle à $80.0\text{ m}$ :
  $D_r = 25.00\text{ m}$, $D_f \approx 79.64\text{ m}$ → $D_a \approx 104.64\text{ m}$ → Collision inévitable ! (dépassement de $24.64\text{ m}$).
• Même vitesse ($v = 90\text{ km/h}$), route "Sec", obstacle à $80.0\text{ m}$ :
  $D_r = 25.00\text{ m}$, $D_f \approx 39.82\text{ m}$ → $D_a \approx 64.82\text{ m}$ → Arrêt sécurisé (marge : $15.18\text{ m}$).

Exercice 5 : Nettoyage & Normalisation de Chaînes (Mixte Traitement de Texte)

🟠 Intermédiaire

Dans les formulaires d'inscription en ligne, les utilisateurs saisissent souvent des identités avec des espacements multiples anarchiques et une alternance désordonnée de majuscules et de minuscules (par exemple : ch = " mOhaMed aLi bEn sALEM ").
Avant archivage, le système doit normaliser cette chaîne sur place (sans utiliser de tableau) : éliminer les espaces superflus, compter le nombre effectif de mots et capitaliser chaque composante (première lettre en majuscule, les autres en minuscule : "Mohamed Ali Ben Salem").

Normalisation et assainissement d'une chaîne de caractères
Nettoyage des espaces superflus, casse et comptage des mots sans tableau

Le cahier des charges impose une décomposition modulaire mixte :

  • Une fonction Est_Espace(c : Caractère) : Booléen qui renvoie Vrai si le caractère c est un espace, et Faux sinon.
  • Une fonction En_Minuscule(c : Caractère) : Caractère qui convertit un caractère majuscule en minuscule en utilisant les codes ASCII (si "A" ≤ c ≤ "Z" renvoie Chr(Ord(c) + 32), sinon renvoie c).
  • Une procédure Purger_Espaces(@texte : Chaîne) qui modifie la chaîne texte directement par variable (@) pour supprimer les espaces de tête, les espaces de queue, et réduire toute séquence d'espaces consécutifs à un seul espace.
  • Une procédure Normaliser_Nom(@texte : Chaîne, @nb_mots : Entier) qui appelle Purger_Espaces(texte), puis parcourt la chaîne assainie pour mettre en majuscule la première lettre de chaque mot, convertir les autres lettres en minuscules, et compter le nombre total de mots (transmis par variable via @nb_mots).
  • Une procédure Afficher_Fiche_Identite(nom_brut : Chaîne) qui prend une chaîne brute, appelle Normaliser_Nom, puis affiche le nom propre épuré ainsi que le nombre de mots identifiés.
Travail demandé :
  1. Pourquoi le paramètre texte dans Purger_Espaces et Normaliser_Nom doit-il impérativement être déclaré avec le symbole @ ?
  2. Rédiger l'algorithme des fonctions auxiliaires Est_Espace et En_Minuscule.
  3. Dresser le T.D.O.L. et rédiger l'algorithme de la procédure Purger_Espaces(@texte : Chaîne).
  4. Rédiger l'algorithme officiel de la procédure Normaliser_Nom(@texte : Chaîne, @nb_mots : Entier).
  5. Rédiger l'algorithme de la procédure d'affichage Afficher_Fiche_Identite.
  6. Traduire la solution complète en Python 3 selon les normes officielles.
💡 Conseils méthodologiques & Indices
  • Pour Purger_Espaces, accumuler les caractères dans une variable locale propre ← "" : ignorer les espaces tant que propre est vide (élimination des espaces de début) ; pour les espaces suivants, n'ajouter l'espace que si le dernier caractère de propre n'est pas déjà un espace. En fin de parcours, si le dernier caractère de propre est un espace, l'éliminer. Terminer par l'affectation par variable : texte ← propre.
  • Dans Normaliser_Nom, un caractère texte[i] est l'initiale d'un mot si $i = 0$ ou si le caractère précédent est un espace (texte[i-1] = " "). Si c'est une initiale, le convertir en majuscule via Majus(texte[i]) ; sinon le convertir avec En_Minuscule(texte[i]).
  • Le nombre de mots d'une chaîne purgée et non vide est simplement égal au nombre d'espaces simples $+ 1$.
Jeux d'essais à vérifier :
• Pour nom_brut = " mOhaMed aLi bEn sALEM " :
  - Après Purger_Espaces : texte = "mOhaMed aLi bEn sALEM"
  - Après Normaliser_Nom : texte = "Mohamed Ali Ben Salem", nb_mots = 4.
• Pour nom_brut = " sara " → texte = "Sara", nb_mots = 1.

Exercice 6 : Cybersécurité — Audit & Renforcement de Mot de Passe (Mixte Avancé)

🔴 Avancé

La sécurité des accès informatiques repose sur la complexité des mots de passe. Un portail web souhaite intégrer un module autonome d'audit sans faire appel à des structures de tableaux :

  • Attribuer un score pondéré selon 4 catégories (minuscules, majuscules, chiffres, caractères spéciaux).
  • Examiner la chaîne en un seul parcours complet et renvoyer 5 indicateurs par variable (@).
  • Classifier le niveau de robustesse ("Très Faible", "Moyen", "Robuste", "Excellent").
  • Renforcer automatiquement le mot de passe sur place s'il est jugé vulnérable.
Audit de sécurité et renforcement automatique de mot de passe
Audit pondéré, multi-compteurs et renforcement actif d'un mot de passe

Le module se compose des sous-programmes suivants :

  • Une fonction Poids_Caractere(c : Caractère) : Entier qui attribue un score pondéré selon la catégorie du caractère :
    • Lettre minuscule ($'a' \le c \le 'z'$) : 1 point
    • Lettre majuscule ($'A' \le c \le 'Z'$) : 2 points
    • Chiffre décimal ($'0' \le c \le '9'$) : 3 points
    • Caractère spécial (parmi # @ ! $ % & * ?) : 5 points
    • Tout autre caractère : 0 point
  • Une procédure Evaluer_Mot_De_Passe(mdp : Chaîne, @score : Entier, @nb_maj : Entier, @nb_min : Entier, @nb_chiffres : Entier, @nb_speciaux : Entier) qui examine le mot de passe en un seul parcours complet de boucle, utilise Poids_Caractere pour cumuler le @score global et comptabilise simultanément les 4 catégories transmises par variable (@).
  • Une fonction Determiner_Niveau(score : Entier, lg : Entier) : Chaîne qui retourne l'appréciation textuelle :
    • Si $lg < 8$ ou $score < 15$ : "Très Faible"
    • Sinon si $score < 25$ : "Moyen"
    • Sinon si $score < 40$ : "Robuste"
    • Sinon : "Excellent"
  • Une procédure Renforcer_Mot_De_Passe(@mdp : Chaîne) qui modifie le mot de passe sur place par variable (@) pour corriger ses vulnérabilités :
    • S'il ne comporte aucune majuscule, convertit son premier caractère en majuscule.
    • S'il ne comporte aucun caractère spécial, lui ajoute le symbole "!" à la fin.
    • Si sa longueur finale reste strictement inférieure à 8 caractères, lui concatène le suffixe "2026".
  • Une procédure Auditer_Securite(mdp : Chaîne) qui appelle Evaluer_Mot_De_Passe, affiche la grille des statistiques et le diagnostic de robustesse. Si le niveau est "Très Faible" ou "Moyen", elle appelle Renforcer_Mot_De_Passe et affiche la proposition de mot de passe sécurisé.
Travail demandé :
  1. Pourquoi la procédure Evaluer_Mot_De_Passe comporte-t-elle 5 paramètres précédés du symbole @ ? Justifier pourquoi une fonction classique est inadaptée pour cette tâche.
  2. Rédiger l'algorithme de la fonction Poids_Caractere(c : Caractère) : Entier.
  3. Dresser le T.D.O.L. et rédiger l'algorithme officiel de la procédure Evaluer_Mot_De_Passe.
  4. Rédiger l'algorithme de la fonction Determiner_Niveau(score : Entier, lg : Entier) : Chaîne.
  5. Rédiger l'algorithme de la procédure Renforcer_Mot_De_Passe(@mdp : Chaîne).
  6. Rédiger l'algorithme de la procédure d'orchestration Auditer_Securite(mdp : Chaîne).
  7. Proposer la transcription intégrale en Python 3 de l'ensemble de l'architecture.
💡 Conseils méthodologiques & Indices
  • Pour tester si c est un caractère spécial, vérifier si sa position dans la chaîne modèle est non nulle : Pos(c, "#@!$%&*?") ≠ -1.
  • Dans Evaluer_Mot_De_Passe, réinitialiser impérativement les 5 paramètres formels à 0 avant la boucle : score ← 0, nb_maj ← 0, etc. Une unique boucle Pour i de 0 à Long(mdp) - 1 cumule le score et incrémente le compteur correspondant.
  • Dans Renforcer_Mot_De_Passe, utiliser Evaluer_Mot_De_Passe pour déterminer les manques, puis modifier @mdp successivement selon les 3 règles de renforcement.
Jeux d'essais à vérifier :
• Pour mdp = "secret" ($lg = 6$) :
  - Décompte : 6 minuscules, 0 majuscule, 0 chiffre, 0 spécial → $score = 6$ → Niveau : "Très Faible".
  - Après Renforcer_Mot_De_Passe : "Secret!2026" ($lg = 11$, 1 Maj, 1 Spécial, 4 Chiffres → "Robuste").
• Pour mdp = "Bac@2026" ($lg = 8$) :
  - Décompte : 2 min (2 pts), 1 Maj (2 pts), 4 chiffres (12 pts), 1 spécial (5 pts) → $score = 21$ → Niveau : "Moyen".
• Pour mdp = "Admin#Secure2026!" ($lg = 17$) : $score = 46$ → Niveau : "Excellent".