Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tc_info:tp2 [2018/09/27 09:08] – edauce | tc_info:tp2 [2020/12/18 11:50] (Version actuelle) – fschwander | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== TP6 : Lecture/ | ||
+ | Nous souhaitons dans cet exercice travailler en lecture et en écriture sur un fichier de clients. | ||
+ | |||
+ | Soit le fichier {{http:// | ||
+ | 2823 | ||
+ | Paul Henriot, 59 rue de l' | ||
+ | Daniel Da Cunha, 27 rue du Colonel Pierre Avia, 75508 Paris, France | ||
+ | Julie Young, 78934 Hillside Dr., 90003 Pasadena, USA | ||
+ | Julie Brown, 7734 Strong St., San Francisco, United States | ||
+ | ... | ||
+ | |||
+ | La première ligne contient le nombre de clients référencés. Chaque ligne suivante contient la description d'un client, ici le prénom, le nom ainsi que l' | ||
+ | |||
+ | Le but de l' | ||
+ | |||
+ | Dans un premier temps, regardez son contenu avec un éditeur de texte (geany, gedit ou autre…). | ||
+ | |||
+ | ===== 1. Préambule ===== | ||
+ | ==== 1.1 Tests unitaires ==== | ||
+ | Lancez le programme pycharm et {{https:// | ||
+ | <note important> | ||
+ | * Ouvrez un terminal et executez la commande '' | ||
+ | * Lors de la première ouverture, pensez à bien sélectionner python 3 comme interpréteur par défaut. | ||
+ | * [[public: | ||
+ | </ | ||
+ | |||
+ | Toutes les fonctions que vous écrirez doivent être correctement testées avant leur mise en œuvre. Commencez donc par lire et exécutez les exercices du **{{https:// | ||
+ | |||
+ | ==== 1.2 Structure du projet ==== | ||
+ | |||
+ | Vous devez maintenant dans votre projet {{https:// | ||
+ | * L' | ||
+ | <code python> | ||
+ | from gestion_clients import * | ||
+ | </ | ||
+ | * L' | ||
+ | <code python> | ||
+ | import os, sys | ||
+ | </ | ||
+ | * L' | ||
+ | <code python> | ||
+ | from gestion_clients import * | ||
+ | </ | ||
+ | Demandez à Pycharm d’exécuter '' | ||
+ | |||
+ | Copiez le fichier {{http:// | ||
+ | |||
+ | ==== 1.3 Premières fonctions ==== | ||
+ | |||
+ | Commencez par copier les fonctions suivantes dans '' | ||
+ | <code python> | ||
+ | def ouvre_fichier(nom_fic, | ||
+ | ''' | ||
+ | Attention : le fichier est ouvert en lecture/ | ||
+ | argument : | ||
+ | - le chemin d' | ||
+ | retourne : | ||
+ | - le descripteur du fichier ouvert''' | ||
+ | try: | ||
+ | assert os.path.isfile(nom_fic) | ||
+ | f = open(nom_fic, | ||
+ | if verbose : | ||
+ | print(" | ||
+ | return f | ||
+ | except: | ||
+ | if verbose: | ||
+ | print(" | ||
+ | sys.exit() | ||
+ | |||
+ | def lire_a_la_position(i, | ||
+ | ''' | ||
+ | et retourne le contenu de cette ligne | ||
+ | arguments : | ||
+ | - i : position des données dans la liste | ||
+ | - nom_fic : chemin d' | ||
+ | retourne : | ||
+ | - une chaîne de caractères (le contenu de la ligne)''' | ||
+ | with ouvre_fichier(nom_fic, | ||
+ | f.seek(i * 91) | ||
+ | return f.readline()[: | ||
+ | |||
+ | def ecrire_a_la_position(i, | ||
+ | ''' | ||
+ | argument : | ||
+ | - i : position dans la liste | ||
+ | - data : données à écrire | ||
+ | - nom_fic : chemin d' | ||
+ | with ouvre_fichier(nom_fic, | ||
+ | f.seek(i * 91) | ||
+ | if len(data) < 90: | ||
+ | f.write(data + ' ' * (90 - len(data)) + ' | ||
+ | else: | ||
+ | f.write(data[: | ||
+ | f.flush() | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===A faire :=== | ||
+ | |||
+ | * La première fonction sert simplement à ouvrir un fichier. Ajoutez la ligne suivante dans le programme principal: | ||
+ | <code python>f = ouvre_fichier(' | ||
+ | Exécutez le programme principal et vérifiez que la phrase | ||
+ | Connexion au fichier clients.txt OK. | ||
+ | s' | ||
+ | * le fichier possède en tout 2824 lignes. Utilisez la fonction '' | ||
+ | * Utilisez maintenant la fonction '' | ||
+ | |||
+ | ===== 2. Fonctions de recherche élémentaires ===== | ||
+ | ==== 2.1 Lire le nombre de clients ==== | ||
+ | Écrire une fonction qui lit le nombre de clients dans le fichier. Le nombre de clients référencés est inscrit sur la première ligne du fichier (d' | ||
+ | <code python> | ||
+ | def nombre_clients(nom_fic): | ||
+ | ... | ||
+ | </ | ||
+ | Cette fonction prend en argument le nom du fichier, ouvre le fichier, lit le contenu de la première ligne et retourne la valeur entière qui y est écrite. | ||
+ | <note important> | ||
+ | * La fonction ne lit que la première ligne et ne vérifie pas le nombre réel de clients enregistrés. Ce nombre doit donc être soigneusement maintenu lors de toute modification du fichier de clients. | ||
+ | * Faites appel à la fonction '' | ||
+ | </ | ||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_nombre_clients(): | ||
+ | assert type(nombre_clients(nom_fic)) is int | ||
+ | assert nombre_clients(nom_fic) >= 0 | ||
+ | </ | ||
+ | Cette fonction teste uniquement si la variable retournée est un entier positif. Elle ne vérifie pas le nombre // | ||
+ | </ | ||
+ | |||
+ | ==== 2.2 Recherche ==== | ||
+ | Comme dans le TD6, nous allons maintenant écrire une fonction de recherche qui prend en argument le nom d'un client et le nom du fichier et retourne: | ||
+ | * -1 si le client n'est pas dans le fichier | ||
+ | * La position de sa // | ||
+ | <code python> | ||
+ | def recherche(client, | ||
+ | ... | ||
+ | </ | ||
+ | La fonction ouvre le fichier, lit le nombre de clients enregistrés et initialise la réponse à -1. Puis, à l'aide d'un boucle sur le nombre de clients, la fonction lit les lignes une à une et copie le numéro de ligne dans la variable réponse si le client est présent dans cette ligne. La fonction retourne la réponse en sortie de boucle | ||
+ | <note important> | ||
+ | * Pour tester si '' | ||
+ | <code python> | ||
+ | if client in ligne: | ||
+ | ... | ||
+ | </ | ||
+ | * il est possible de faire la recherche uniquement avec le prénom et le nom | ||
+ | * Pour retourner la première occurrence du client (et non la dernière), il est important de sortir de la boucle dès que client est trouvé | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_recherche(): | ||
+ | assert type(recherche('', | ||
+ | assert -1 < recherche('', | ||
+ | </ | ||
+ | La fonction vérifie uniquement que l' | ||
+ | </ | ||
+ | |||
+ | ==== 2.3 Ajout d'un client ==== | ||
+ | Écrire une fonction qui ajoute un client dans le fichier. | ||
+ | Pour insérer un nouveau client, il suffit d' | ||
+ | |||
+ | Écrire une fonction: | ||
+ | <code python> | ||
+ | def ajoute(client, | ||
+ | ... | ||
+ | </ | ||
+ | qui prend en argument la chaîne de caractère client à insérer ainsi que le nom du fichier. | ||
+ | La fonction | ||
+ | * inscrit le nouveau client à la ligne N + 1 | ||
+ | * met à jour la valeur de N à la ligne 0 | ||
+ | |||
+ | La fonction ne retourne aucun résultat. Son effet est uniquement visible dans le fichier | ||
+ | Pensez à vérifier après chaque utilisation que le fichier '' | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_ajoute(): | ||
+ | N_avant_ajout = nombre_clients(nom_fic) | ||
+ | client_test = ' | ||
+ | ajoute(client_test, | ||
+ | N_apres_ajout = nombre_clients(nom_fic) | ||
+ | assert N_apres_ajout == N_avant_ajout + 1 | ||
+ | assert recherche(client_test, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== 2.4 Suppression d'un client ==== | ||
+ | Écrire une fonction qui supprime un client du fichier. | ||
+ | Pour supprimer un client de la liste, il faut commencer par vérifier que celui-ci est bien présent dans le fichier avec une recherche. Si le client est présent à la position '' | ||
+ | * Copie le contenu de la ligne '' | ||
+ | * Écrit la valeur '' | ||
+ | |||
+ | <code python> | ||
+ | def supprime(client, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | La fonction ne retourne aucun résultat. Son effet est uniquement visible dans le fichier '' | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_supprime(): | ||
+ | N_avant_suppression = nombre_clients(nom_fic) | ||
+ | client_test = ' | ||
+ | supprime(client_test, | ||
+ | N_apres_suppression = nombre_clients(nom_fic) | ||
+ | assert N_avant_suppression - 1 <= N_apres_suppression <= N_avant_suppression | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== 3. Gestion des doublons ===== | ||
+ | ==== 3.1 Recherche multiple ==== | ||
+ | |||
+ | Une fonction de recherche multiple recherche toutes les occurrences d'un certain client dans le fichier. | ||
+ | * si le client n'est pas présent, la recherche retourne une liste vide | ||
+ | * si le client est présent au moins une fois, la recherche retourne | ||
+ | |||
+ | <code python> | ||
+ | def recherche_multiple(client, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_recherche_multiple(): | ||
+ | assert type(recherche_multiple('', | ||
+ | assert min(recherche_multiple('', | ||
+ | assert max(recherche_multiple('', | ||
+ | assert len(recherche_multiple('', | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== 3.2 Ajout sans doublon ==== | ||
+ | |||
+ | Une fonction d' | ||
+ | * si le client n'est pas présent, faire une insertion normale | ||
+ | * sinon ne rien faire | ||
+ | |||
+ | <code python> | ||
+ | def ajoute_sans_doublons(client, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_ajoute_sans_doublons(): | ||
+ | N_avant_ajout = nombre_clients(nom_fic) | ||
+ | client_test = ' | ||
+ | ajoute_sans_doublons(client_test, | ||
+ | N_apres_ajout = nombre_clients(nom_fic) | ||
+ | assert N_avant_ajout <= N_apres_ajout <= N_avant_ajout + 1 | ||
+ | assert recherche(client_test, | ||
+ | assert len(recherche_multiple(client_test, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== 3.3 Suppression multiple ==== | ||
+ | |||
+ | Une fonction de suppression multiple supprime toutes les occurrences du client recherché dans le fichier. | ||
+ | |||
+ | Effectuer une recherche multiple et: | ||
+ | * si le client n'est pas présent, ne rien faire | ||
+ | * sinon supprimer chaque occurrence | ||
+ | |||
+ | <code python> | ||
+ | def supprime_multiple(client, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_supprime_multiple(): | ||
+ | N_avant_suppression = nombre_clients(nom_fic) | ||
+ | client_test = ' | ||
+ | nb_doublons = len(recherche_multiple(client_test, | ||
+ | supprime_multiple(client_test, | ||
+ | N_apres_suppression = nombre_clients(nom_fic) | ||
+ | assert N_apres_suppression == N_avant_suppression - nb_doublons | ||
+ | assert len(recherche_multiple(client_test, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== 4. Suppression des doublons ===== | ||
+ | |||
+ | Ecrire une fonction qui supprime tous les doublons du fichier de clients. | ||
+ | |||
+ | <code python> | ||
+ | def supprime_doublons(nom_fic): | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Pour tester le bon fonctionnement de cette fonction, vous utiliserez la fonction de test suivante: | ||
+ | <code python> | ||
+ | def test_supprime_doublons(): | ||
+ | supprime_doublons(nom_fic) | ||
+ | N = nombre_clients(nom_fic) | ||
+ | for i in range(1, N + 1): | ||
+ | client = lire_a_la_position(i, | ||
+ | assert len(recherche_multiple(client, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Après utilisation de cette fonction, regardez dans quelle proportion le nombre de clients a diminué. |