Aller au contenu

Problème à résoudre⚓︎

Règle 1 : Il faut d'abord bien comprendre le problème, ses entrées et les sorties attendues.

Vous disposez d'un fichier prenom_nom.csv de mille lignes ou plus, listant les utilisateurs d'un réseau informatique, dont chaque ligne est au format numero, nom, prenom :

🐍 Script Python
1,Timothée,Gaillard
2,Zacharie,Lefort
3,Joseph,Lambert

Vous devez générer pour chaque utilisateur un login prenom.nom en minuscules, sans accents, ni cédilles et un mot de passe aléatoire respectant la politique suivante :

  • constitué de dix symboles choisis parmi les 4 classes suivantes : caractères alphabétiques minuscules, caractères majuscules, chiffres ou l'un des caractères spéciaux '?!$#'.
  • au moins un caractère de chaque classe

Ces identifiants de connexion devront être stockés (en clair certes ...) dans un fichier CSV dont chaque ligne sera au format numero, nom, prenom,login,mdp :

🐍 Script Python
1,Timothée,Gaillard,timothee.gaillard,AToKlBso4M
2,Zacharie,Lefort,zacharie.lefort,4E7hFZgXNt
3,Joseph,Lambert,joseph.lambert,G6PtmimT0J

Cahier des charges⚓︎

Règle 2 : On commence par réfléchir avec papier et crayon pour déterminer les étapes à réaliser et isoler les tâches élémentaires dans des fonctions.

Question 1⚓︎

Pour déterminer les étapes du cahier des charges, complétez la cart heuristique en lien : https://ladigitale.dev/digimindmap/#/m/64f60ee50975c

En programmation modulaire, on représente chaque tâche élémentaire par une fonction. Déterminez une liste de fonctions qu'on pourrait écrire pour répondre au cahier des charges.

Question 2⚓︎

Précisez pour chaque fonction ses paramètres avec leurs types et les valeurs renvoyées avec leurs types. Une fonction peut ne prendre aucun paramètre en entrée et ne renvoyer aucune valeur en sortie.

Un exemple :

🐍 Script Python
def generer_login(prenom, nom):
    """
    Génère un login de type prenom.nom
    à partir des valeurs de  prenom et de nom convertis en minuscules
    """

Vous travaillerez en binôme avec le pad collaboratif Digipad

Algorithmes et structures de données⚓︎

Règle 3 : Une fois qu'on a déterminé ce qu'on souhaiterait réaliser, on se pose la question du comment : de quelle façon (algorithmes) et avec quels outils : structures ou styles de programmation (boucles, conditions, programmation objet ou fonctionnelle) et structures de données (entier, chaîne de caractères, tableau, dictionnaire, arbre ...)

Question 3⚓︎

Dans ce projet, de quels types d'algorithmes pourriez-vous avoir besoin ?

  • balayage séquentiel : parcourir une structure de données élément par élément
  • recherche dichotomique : diviser un ensemble ordonné en deux et réduire la recherche à la première ou la seconde moitié comme dans le Juste prix
  • de tri : ordonner des information selon un certain critère

Question 4⚓︎

Parmi les types de données Python suivants, quels sont ceux qui pourraient être utiles dans ce projet ? Si oui pour quelle(s) fonction(s) ?

Type Nom Python Exemple de valeur
entier int 4
flottant float 3.14
booléen bool True ou False
chaîne de caractères str 'edgar'
tableau/liste list ['8', 'edgar', 'quinet']
dictionnaire dict {'nom': 'quinet', 'prenom': 'edgar'}

Question 5⚓︎

Dans cette question on explore quelques types de bases en Python utiles pour ce projet.

Question 5.a⚓︎

Dans ce projet vous aurez besoin de manipuler des séquences ordonnées d'éléments repérés par leur index dans la séquence. En Python il s'agit de tableaux dynamiques (on peut modifier leur taille) du type list. Voici quelques exemples de manipulation de tableaux dynamiques :

🐍 Script Python
>>> tab = [] # tableau vide
>>> tab.append(5)  # ajout d'un élément à la fin
>>> tab.append(6)
>>> tab
[5, 6]
>>> tab[0]  # les éléments sont repérés par leur index qui commence à 0
5
>>> tab[1]
6
>>> len(tab) # longueur du tableau
2
>>> tab[1] = 7
>>> tab
7
>>> for k in range(len(tab)): # parcours par index
        print(k, tab[k])
(0, 5)
(1, 6)
>>> for e in tab:  # parcours par élément
        print(e)
5
6
>>> t2 = [k ** 2 for k in range(1, 5)] # tableau généré en compréhension
>>> t2
[1, 4, 9, 16]

Donnez deux façons de construire un tableau contenant les cubes de tous les entiers successifs entre 15 et 20.

Question 5.b⚓︎

Dans ce projet vous aurez besoin de générer des chaînes de caractères de type str en Python. Voici quelques exemples de manipulations de chaînes de caractères :

🐍 Script Python
>>> chaine = 'amour'
>>> chaine[0]
'a'
>>> chaine[2]
'o'
>>> for c in chaine:
        print(c)
a
m
o
u
r
>>> chaine2 = chaine + 'rette'
>>> chaine2
'amourette'
>>> len(chaine2)
9

Écrire une fonction qui prend en paramètre une chaîne de caractères et qui renvoie la chaîne lue à l'envers.

Question 5.c⚓︎

Dans ce projet vous aurez besoin de générer des entiers aléatoires. Dans un IDE Python, importez le module random puis affichez la documentation de la fonction random.randint avec help(random.randint) dans la console.

Donnez une expression permettant de construire un tableau de dix entiers aléatoires entre 1 et 6.

Questions 5.d⚓︎

Dans ce projet vous aurez besoin d'accéder au contenu de fichiers textes en lecture ou en écriture.

Pour lire ligne par ligne un fichier 'fichier.txt' :

🐍 Script Python
reader = open('fichier.txt', mode='r') # ouverture
for ligne in reader:
    # traitement sur la ligne
reader.close() # fermeture

Pour écrire dans un fichier les chaînes de caractères contenues dans un tableau tab:

🐍 Script Python
writer= open('fichier.txt', mode='w') # ouverture
for element in tab:
    writer.write(element + '\n') # '\n' est le saut de ligne
writer.close() # fermeture

Comme exercice, ouvrez le fichier prenom_nom.csv fourni dans le matériel et recopiez ligne à ligne son contenu dans copie_prenom_nom.csv.

Développement et écriture du code⚓︎

Règle 4 : Après avoir découpé la réalisation du projet en fonctions et choisi pour chacune un ou des types de structures de données et un algorithme pour les traiter, il reste à les implémenter dans le langage de programmation choisi, Python pour vous. Si on sait prédire la sortie que doit générer une fonction pour un certaine entrée, on peut construire un jeu de tests afin de vérifier qu'elle fonctionne comme attendu sur quelques cas bien choisis. Cela ne prouvera cependant pas qu'elle est correcte.

Question 6⚓︎

Récupérez le lien avec l'archive contenant le matériel puis complétez les fonctions définies dans le cahier des charges. Le squelette de code contient au moins une fonction de test.

Question 7⚓︎

En pratique, on a besoin de construire des fichiers d'identifiants de connexion régulièrement. Il serait donc d'étendre notre programme avec une Interface Homme Machine. Dans le squelette de code, complétez la fonction d''interface textuelle puis celle d'interface graphique. Pour cette dernière vous utiliserez le module nsi_ui fourni dans le matériel. Une documentation est disponible page 52 du manuel Déclic de Première NSI.