Exercice 3 - Partie C · Bac Numérique et Sciences Informatiques Polynésie 2024 (jour 2)
Thème : Mise au point des programmes : bugs, assertions et tests · Tiré du sujet Jour 2 (2024)
Énoncé
EXERCICE 3 (8 points) ou (6 points en enlevant la partie A)
Cet exercice porte sur les protocoles réseau, les bases de données relationnelles et les requêtes SQL, l'algorithmique et la programmation en Python.
Cet exercice est composé de 3 parties indépendantes.
Partie A: Le réseau informatique d'un hôpital
Dans un hôpital, le service informatique a créé le réseau ci-dessous:
Partie C: la sécurité des mots de passe d'un médecin
Pour utiliser les ordinateurs de cet hôpital, tout le personnel doit saisir son identifiant puis son mot de passe. Pour davantage de sécurité, ce dernier doit être fort et changé régulièrement.
On appelle « mot de passe fort » une chaîne de caractères composée:
d'au minimum 12 caractères;
d'au moins 2 majuscules;
d'au moins 2 chiffres;
d'au moins 2 symboles parmi #@!?%<>=€$+_*/&.
Par exemple, un médecin utilise le mot de passe fort: @20!HôPiTaL&24#.
On dispose des méthodes:
isalpha qui permet de tester si un caractère est une lettre;
isupper qui permet de tester si un caractère est une majuscule;
isdigit qui permet de tester si un caractère est un chiffre.
>>> 'A'.isalpha()
True
>>> 'a'.isupper()
False
>>> '5'.isdigit()
True De plus, on affecte tous les symboles dans une variable globale liste_symboles de type str:
liste_symboles = '#@!?%<>=€$+_*/&' 9.
On considère une fonction mdp_fort qui prend en paramètre une chaîne de caractères mdp et qui renvoie True si mdp est un mot de passe fort et False sinon.
Compléter le script de cette fonction mdp_fort en recopiant les lignes 2, 10, 12 et 14:
1 def mdp_fort(mdp):
2 if...:
3 return False
4 majuscules = 0
5 chiffres = 0
6 symboles = 0
7 for caractere in mdp:
8 if caractere.isupper():
9 majuscules+=1
10 if...:
11 chiffres+=1
12 if...:
13 symboles+=1
14 if...:
15 return False
16 return True
10.
Pour aider le personnel, le service informatique a mis en place une fonction creation_mdp permettant de générer aléatoirement un mot de passe. Elle prend en paramètres quatre entiers de type int:
la longueur n du mot de passe;
le nombre nbr_m de majuscules qu'il doit contenir au minimum;
le nombre nbr_c de chiffres qu'il doit contenir au minimum;
le nombre nbr_s de symboles qu'il doit contenir au minimum.
Cette fonction renvoie une chaîne de caractères respectant les conditions précédentes.
Compléter le script de cette fonction creation_mdp en recopiant les lignes 9 et de 13 à 19:
1 def creation_mdp(n, nbr_m, nbr_c, nbr_s):
2 mdp = ''
3 caracteres='abcdefghijklmnopqrstuvwxyz' + \
4 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + \
5 '#@!?%<>=€$+_*/&'
6 majuscules = 0
7 chiffres = 0
8 symboles = 0
9 while...:
10 # la variable 'c' contient un caractère
11 # choisi aléatoirement dans la variable 'caracteres'
12 c = choice(caracteres)
13 if...:
14...
15 if...:
16...
17 if...:
18...
19 mdp =...
20 return mdp
Si un personnel n'utilise pas le générateur de mot de passe, il a tendance à y insérer des mots de la langue française. Par exemple, le mot de passe @20!HôPiTaL&24# est fort mais on y trouve le mot « hôpital ». Si un mot de passe ne contient pas de mots de 4 lettres ou plus de la langue française ou étrangère, on dit que c'est un « mot de passe extra fort ».
On dispose de la variable dicoFR (de type list) qui contient tous les mots de la langue française.
On dispose également de la fonction transforme qui prend en paramètre une chaîne de caractères et qui renvoie une nouvelle chaîne de caractère en transformant toutes les lettres majuscules en minuscules. Par exemple:
>>> transforme('@20!HôPiTaL&24#')
'@20!hôpital&24#' Pour simplifier, on suppose que les mots présents dans un mot de passe sont entiers (pas d'abréviation) et sont séparés par des chiffres ou des symboles.
On considère une fonction recherche_mot qui prend en paramètre un mot de passe mdp (de type str) et qui renvoie des mots présents (de type str) dans mdp. Exemple:
>>> recherche_mot('@20!NeUrO&24#')
['neuro']
>>> recherche_mot('Chef!14NeuroA@85!')
['chef', 'neuroa'] 11.
Compléter le script de cette fonction recherche_mot en recopiant les lignes 5, 6, 15, 16, 18:
1 def recherche_mot(mdp):
2 mot = transforme(mdp)
3 trouve = []
4 i = 0
5 while...:
6 if...: # si le caractère est un chiffre
7 i = i+1
8 elif mot[i] in liste_symboles:
9 i = i+1
10 else:
11 # si le caractère est une lettre, on prend les
12 # lettres qui la suivent jusqu'au moment où
13 # on trouve un chiffre ou un symbole
14 chaine = ''
15 while...:
16 chaine =...
17 i = i+1
18...
19 return trouve
12.
Écrire une fonction mdp_extra_fort qui prend en paramètre une chaîne de caractères mdp et qui renvoie True si mdp est un mot de passe extra fort et False sinon.

Corrigé
Corrigé proposé par AprenAI (non officiel)
9. Ligne 2 : condition après if
Réponse : ```python len(mdp) < 12 ```
9. Ligne 10 : condition après if
Réponse : ```python caractere.isdigit() ```
9. Ligne 12 : condition après if
Réponse : ```python caractere in liste_symboles ```
9. Ligne 14 : condition après if
Réponse : ```python majuscules < 2 or chiffres < 2 or symboles < 2 ```
10. Ligne 9 : condition while
Réponse : ```python len(mdp) < n or majuscules < nbr_m or chiffres < nbr_c or symboles < nbr_s ```
10. Lignes 13 à 19
Réponse : ```python if c.isupper(): majuscules += 1 if c.isdigit(): chiffres += 1 if c in liste_symboles: symboles += 1 mdp = mdp + c ```
Les réponses des 6 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.
‹ Exercice 3 - Mise au point des programmes · Polynésie 2025 (jour 1)