DAIGL – Développement – TD/TP – Fonctions et procédures
TD/TP – Fonctions et procédures
Contexte
Le site www.holamovies.com (propriété de Boa Global, un fond d'investissements belge) est a sur la
promotion des nouveautés en salles et en DVD et propose une base de données couvrant tous les films qui
ont été diffusés en Belgique. Les responsables de ce site, à la recherche d'un développeur
Python/wxWidgets (wxPython) ont déposé une offre d'emploi sur le site de FOREM ("Pôle Emploi" belge)
Ayant passé tous les entretiens avec succès, vous signez votre premier contrat de travail. Votre première
mission ? Développer une application graphique en langage Python, dédiée à la gestion de la base de
données du site.
1- Interface Utilisateur
Les copies d'écran présentées ci-dessus correspondent à la toute
première version de votre application (celle étudiée dans ce TD/TP).
La fenêtre principale (wx.Frame) est constituée d'une barre de menus
(wx.MenuBar) qui ne propose qu'un seul menu (wx.Menu) dans
lequel on ne trouve qu'un seul item... l'item Quitter. Le corps de la
fenêtre est organisée sous la forme d'un ensemble de trois panneaux
(wx.Panel) regroupés à l'aide d'un cadre d'onglets (wx.NoteBook) :
Visualiser la liste des films, insérer un film et rechercher des films en
fonction de leur durée. Chaque panneau est organisé est deux zones
séparées par une ligne horizontale (wx.StaticLine) : La zone
associée aux champs et la zone associée aux boutons (wx.Button).
La zone associée aux champs intègre jusqu'à quatre widgets différents
: Des champs de texte appelés aussi étiquettes (wx.StaticText),
des champs de saisies (wx.TextCtrl) dont le rôle est de permettre
de saisir des informations, une liste déroulante (wx.Choice) associée
aux genres des films, et des boîtes de liste (wx.ListBox) qui ont pour fonction d'afficher des informations
sous forme de listes.
2- Rôle des widgets
2.1. Panneau "Visualiser"
Le widget référencé par la variable lb_films permet de visualiser les titres des films recensés. La méthode
rafraichir() de la classe pnlVisualiser a pour rôle d'insérer dans ce widget, les titres des films
mémorisés dans la variable globale Films.
Variable Classe Commentaire
b_rafraichir wx.Button Déclencher le "rafraîchissement" de la liste des titres des films
en cas de modification de la liste.
lb_films wx.ListBox Afficher la liste des titres des films.
page 1
DAIGL – Développement – TD/TP – Fonctions et procédures
2.2. Panneau "Rechercher"
Cette page permet de rechercher un ou plusieurs films donc le critère de recherche est basé sur une durée
comprise entre deux valeurs exprimées sous la forme de deux entiers (nombres de minutes). Seul le titre
des films répondant aux critères imposés sont affichés dans la "liste résultat".
Variable Classe Commentaire
b_rechercher wx.Button Déclencher la recherche des films dont la durée est comprise
entre les deux valeurs indiquées.
b_annuler wx.Button RAZ de tous les champs de saisies.
tc_min wx.TextCtrl Saisir la durée minimale.
tc_max wx.TextCtrl Saisir la durée maximale.
lb_films wx.ListBox Afficher la liste des films après application du filtre.
2.3. Panneau "Insérer"
Variable Classe Commentaire
b_inserer wx.Button Déclencher l'insertion d'un nouveau film dans la liste.
b_annuler wx.Button RAZ de tous les champs de saisies.
tc_titre wx.TextCtrl Saisir le titre du film.
tc_duree wx.TextCtrl Saisir la durée du film sous la forme "hh:mm".
tc_dateSortie wx.TextCtrl Saisir la date de sortie du film sous la forme "jj/mm/aaaa".
c_genre wx.Choice Choisir le genre du film.
Genres autorisés : Drame, Comédie, Action, Guerre, Animation, Historique, Policier, Thriller, SF, Horreur,
Western et Documentaire.
3- Organisation et persistance des données
Vous avez décidé de simuler la base de données recensant l'ensemble des films dont les fiches sont
consultables sur Internet, par un fichier texte nommé films.txt. Au lancement de l'application, la
procédure lireBase() recopie le contenu du fichier films.txt dans une variable globale nommée
Films (voir déclaration ci-après), et en fin d'exécution, le contenu de cette variable est recopié dans le
fichier films.txt par appel à la procédure ecrireBase(). Une ligne du fichier films.txt correspond à
un film et est structurée de la façon suivante : "titre:durée:date_sortie:genre". Le champ durée
est exprimé sous la forme d'un entier (nombre de minutes) et le champ date_sortie est exprimé sous la
forme d'une chaîne de caractères au format "jj/mm/aaaa".
Après recopie des données en mémoire vive, le tableau Films est à l'image du fichier films.txt (une
ligne du fichier pour un élément du tableau). Ce tableau pouvant ne pas être rempli, la variable globale
nb_films nous permet de connaître à tout instant, le nombre de films mémorisés. Il faut donc prévoir la
gestion de cette variable dans les différents algorithmes qui constituent l'application (exemple : incrémenter
la valeur de nb_films lors de l'insertion d'un nouveau film).
Déclaration des variables globales :
Constantes :
NB_FILMS = 10000
NB_GENRES = 12
Variables globales :
Films[NB_FILMS] : Chaîne
nb_films : Entier
Genres[NB_GENRES] : Chaîne
La variable Genres permet de recenser tous les genres reconnus. Cette variable est initialisée au lancement
de l'application.
page 2
DAIGL – Développement – TD/TP – Fonctions et procédures
4- Développement de l'application
4.1. Structure des données
4.1.1. Rechercher l'algorithme de la procédure Découper() dont le rôle est de découper une chaîne en
fonction d'un caractère désigné comme caractère séparateur.
Prototype :
Procédure Découper(e src:Chaîne,e sép:Caractère,s dst:Chaîne[],s nb:Entier)
src : Chaîne à découper (source)
sép : Caractère séparateur
dst : Tableau de chaînes (destination)
nb : Nombre d'extraits (champs) mémorisés dans le tableau dst
Exemple d'utilisation :
Découper("AI:140:24/08/2001:SF",":",infos,nbc) affecte à la variable nbc la valeur 4 et
à la variable infos la liste de chaînes ("AI","140","24/08/2001","SF").
4.1.2. Donner le nom de la méthode Python de la classe str (string) qui permet de réaliser le même
traitement que la procédure Découper().
4.1.3. Rechercher l'algorithme de la fonction nbChamps() dont le rôle est de retourner le nombre de
champs présents dans une chaîne en fonction d'un caractère désigné comme caractère séparateur.
Prototype :
Fonction nbChamps(src:Chaîne,sép:Caractère):Entier
src : Chaîne constituée de champs (source)
sép : Caractère séparateur
Exemples d'utilisation :
nbChamps("AI:140:24/08/2001:SF",":")retourne la valeur 4.
nbChamps("24/08/2001","/")retourne la valeur 3.
4.1.4. Donner l'instruction Python qui permet de réaliser le même traitement que la fonction nbChamps().
4.1.5. Rechercher l'algorithme de la fonction valeurChamp() dont le le est de retourner la valeur du
champ dont le numéro est spécifié.
Prototype :
Fonction valeurChamp(src:Chaîne,sép:Caractère,num:Entier):Chaîne
src : Chaîne constituée de champs (source)
sép : Caractère séparateur
num : Numéro du champ
Exemples d'utilisation :
valeurChamp("AI:140:24/08/2001:SF",":",2)retourne la valeur "140".
valeurChamp("24/08/2001","/",1)retourne la valeur "24".
4.1.6. Donner l'instruction qui permet de réaliser le traitement de la fonction valeurChamp() en Python.
4.2. Visualisation
4.2.1. Quel est le rôle de l'instruction self.lb_films.Clear() (méthode rafraichir()) ?
4.2.2. Donner le nom de la méthode de la classe wx.ListBox dont le rôle est d'insérer une chaîne à la fin
page 3
DAIGL – Développement – TD/TP – Fonctions et procédures
d'une wx.ListBox.
4.2.3. Rechercher le code Python de la méthode rafraichir() de la classe pnlVisualiser.
4.3. Recherche
4.3.1. Rechercher le code Python de la méthode annulerRechercher() de la classe pnlRechercher
dont le rôle est d'afficher la valeur 0 dans les widgets référencés par self.tc_min et self.tc_max, et
d'effacer le contenu du widget référencé par self.lb_films.
4.3.2. Rechercher l'algorithme de la fonction estEntier() dont le rôle est retourner VRAI si la chaîne de
caractères passée en paramètre n'est constituée que de chiffres, et FAUX dans le cas contraire.
4.3.3. Donner le nom de la méthode Python de la classe str qui correspond à la fonction estEntier() ?
4.3.4. Donner le nom de la fonction (algorithmique) dont le rôle est de convertir une chaîne en entier.
4.3.5. Donner le nom de la fonction Python dont le rôle est de convertir une chaîne en entier.
4.3.6. Rechercher l'algorithme de la procédure filtrerParDurées() dont le rôle est de créer une liste de
titres de films dont la durée est comprise entre les deux valeurs indiquées.
Prototype :
Procédure filtrerParDurées(e min:Entier,e max:Entier,s titres:Chaîne[],
s nb:Entier)
min : Durée minimale
max : Durée maximale
titres : Tableau des titres
nb : Nombre de titres mémorisés dans le tableau titres.
4.3.7. Rechercher le code Python de la fonction filtrerParDurees().
4.3.8. Donner le nom de la classe wxPython associée à une fenêtre de dialogue permettant d'afficher un
message d'erreur à l'attention de l'utilisateur.
4.3.9. Rechercher le code Python de la méthode rechercherFilms() de la classe pnlRechercher.
4.4. Insertion
4.4.1. Modifier le code Python de la méthode __init__() (constructeur) de la classe pnlInserer de
façon à initialiser le widget référencé par self.lc_genre avec les chaînes mémorisées dans la variable
globale Genres.
4.4.2. Rechercher le code Python de la méthode annulerInserer() de la classe pnlInserer dont le
rôle est d'afficher une chaîne de caractères vide dans le widget référencé par self.tc_titre, d'afficher la
chaîne "00:00" dans le widget référencé par self.tc_duree, d'afficher la chaîne "00/00/000" dans le
widget référencé par self.tc_dateSortie, et de positionner le widget référencé par self.c_genre sur
le premier choix.
4.4.3. Rechercher l'algorithme de la fonction suppEspaces() dont le rôle est de retourner la chaîne passée
en paramètre après suppression de tous les espaces "parasites" (suppression des espaces en début et fin
de chaîne, et remplacement de chaque bloc d'espaces par un seul espace).
page 4
DAIGL – Développement – TD/TP – Fonctions et procédures
Prototype :
Fonction suppEspaces(src:Chaîne):Chaîne
4.4.4. Rechercher le code Python de la fonction suppEspaces().
4.4.5. Rechercher l'algorithme de la fonction formatDuréeOk() dont le rôle est de retourner VRAI si la
chaîne passée en paramètre respecte le format "hh:mm", et FAUX dans le cas contraire.
Prototype :
Fonction formatDuréeOk(durée:Chaîne):Booléen
Exemples d'utilisation :
formatDuréeOk("") retourne la valeur FAUX.
formatDuréeOk("kiwi") retourne la valeur FAUX.
FormatDuréeOk("01:25") retourne la valeur VRAI.
FormatDuréeOk("01:99") retourne la valeur VRAI.
4.4.6. Rechercher le code Python de la fonction formatDureeOk().
4.4.7. Rechercher l'algorithme de la fonction duréeValide() dont le rôle est de retourner VRAI si la chaîne
passée en paramètre représente une durée valide, et FAUX dans le cas contraire.
Prototype :
Fonction duréeValide(durée:Chaîne):Booléen
Exemples d'utilisation :
duréeValide("01:25") retourne la valeur VRAI.
duréeValide("01:99") retourne la valeur FAUX.
4.4.8. Rechercher le code Python de la fonction dureeValide().
4.4.9. Rechercher l'algorithme de la fonction duréeVersEntier() dont le rôle est de convertir (et de
retourner) en nombre de minutes la durée passée en paramètre.
Prototype :
Fonction duréeVersEntier(durée:Chaîne):Entier
Exemples d'utilisation :
duréeVersEntier("00:00") retourne la valeur 0.
duréeVersEntier("01:30") retourne la valeur 90.
4.4.10. Rechercher la code Python de la fonction dureeVersEntier().
4.4.11. Rechercher l'algorithme de la fonction formatDateOk() dont le rôle est de retourner VRAI si la
chaîne passée en paramètre représente une date valide, et FAUX dans le cas contraire.
Prototype :
Fonction formatDateOk(date:Chaîne):Booléen
Exemples d'utilisation :
formatDateOk("") retourne la valeur FAUX.
formatDateOk("kiwi") retourne la valeur FAUX.
formatDateOk("01/01") retourne la valeur FAUX.
formatDateOk("01/01/2010") retourne la valeur VRAI.
formatDateOk("01/99/9999") retourne la valeur VRAI.
4.4.12. Rechercher le code Python de la fonction formatDateOk().
4.4.13. Rechercher l'algorithme de la fonction estBissextile() dont le rôle est de retourner VRAI si
l'année passée en paramètre est une année bissextile, et FAUX dans le cas contraire.
Prototype :
Fonction estBissextile(année:Entier):Booléen
4.4.14. Rechercher le code Python de la fonction estBissextile().
4.4.15. Rechercher l'algorithme de la fonction nbJoursParMois() dont le rôle est de retourner le nombre
de jours présents dans le mois dont le numéro est passé en paramètre.
Prototype :
Fonction nbJoursParMois(mois:Entier,année:Entier):Entier
page 5
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !