truc2geek

2012/05/17

Python, part 2 : applis en mode console

Filed under: Python — Étiquettes : , , , , , , — truc2geek @ 13:13

on peut écrire un programme Python avec n’importe quel éditeur de texte.
on n’a pas de compilation à effectuer, le code (bytecode compilé automatiquement en fait) est intreprété.
attention à l’indentation, qui est gérée automatiquement dans l’IDLE : si elle n’est pas respectée, le programme ne
pourra pas être exécuté.
dans Notepad++ par exemple, pour éviter le problème : « Paramétrage », « Préférences », onglet « Menu langage/Tabulations » :
dans la zone « Tabulations » sur la droite, cocher « Insérer des espaces »

appli console 1

1e ligne du code de l’appli : encodage utf-8 (dans Notepad++, encoder non pas en « utf-8 sans BOM » mais simplement « utf-8 »)

au démarrage de l’application, la fonction CalculTTC() est appelée.
on demande à l’utilisateur de saisir un montant HT puis un taux de TVA, et on affiche le montant TTC.
la fonction raw_input récupère la saisie de l’utilisateur, sous forme de chaîne quelle que soit la nature de la saisie (nombre, date…).
la fonction float() convertit une chaîne en nombre réel en virgule flottante
la dernière ligne de cette fonction utilise encore la fonction raw_input(), mais cette fois pas pour utiliser ce que l’utilisateur va saisir : c’est simplement pour éviter que la fenêtre ne se ferme immédiatement après l’affichage du résultat.

appli console 2

on reprend l’appli console 1, mais on effectue cette fois le traitement en boucle
on initialise la variable vSaisie, en lui affectant pour valeur une chaîne vide
ensuite on boucle sur cette valeur, en demandant à l’utilisateur de saisir 1 ou 2
s’il saisit 1, le programme effectue le traitement
s’il saisit 2, le programme sort de la boucle et se termine
toute autre saisie sera « ignorée », c’est-à-dire qu’aucun traitement ne sera déclenché, et le programme fera donc un nouveau passage dans la boucle : on demandera donc à nouveau à l’utilisateur de saisir 1 ou 2.

appli console 3

on reprend l’appli console 2, mais on gère les erreurs possibles.
par exemple, pour éviter que l’application se ferme brutalement si l’utilisateur saisit un texte au lieu d’un montant

on écrit une fonction qui vérifie qu’une variable contient bien un nombre entier ou décimal
on peut l’écrire et la tester dans le shell

les essais montrent qu’une donnée booléenne sera acceptée, ce qui n’est pas le comportement attendu…
petits essais dans le shell pour comprendre comment True ou False peut être interprété comme un nombre :

pour être rigoureux on devrait modifier cette fonction, mais concrètement dans cette application, elle ne recevra jamais de variable de type booléen, mais systématiquement une variable de type chaîne car provenant de la fonction raw_input() : le problème reste théorique.

on code une fonction qui va demander à l’utilisateur de saisir une variable de type float,
et qui boucle jusqu’à ce qu’une saisie correcte soit effectuée
cette fonction utilisera la fonction DonneeFloat()

on teste cette nouvelle fonction

concernant la saisie d’un nombre à virgule, Python attend que le séparateur décimal utilisé soit le point mais en France on utilise plutôt la virgule
on a donc deux possibilités :

  • soit on exige de l’utilisateur qu’il utilise le point
  • soit on remplace automatiquement la virgule par un point

évidemment on opte pour la deuxième possibilité :

dans la fonction SaisirFloat, remplacer la virgule par un point avant d’appeler la fonction DonneeFloat
vSaisie = vSaisie.replace(‘,’, ‘.’)

le code final de cette version de l’appli :

appli console 4

on reprend appli console 3, on propose plus de fonctions, et sous forme de menu

le menu doit proposer un certain nombre de choix, puis attendre que l’utilisateur saisisse un choix valide
(et en cas de choix invalide, rappeler les choix valides)

les variables de type liste

elles sont idéales ici pour stocker, par exemple, l’ensemble des saisies valides.
quelques manips sur une variable de type liste, dans le shell de l’IDLE :
créer une variable de type liste (ici contenant des chaînes)
obtenir le nombre d’élements
récupérer la valeur d’un élément, ici le premier puis le dernier (l’indice du 1er élément est 0)
voir quelle erreur est indiquée si on cherche à récupérer la valeur d’un élément inexistant
tester la présence d’une valeur dans la liste

l’application

on commence par coder une fonction qui génère le message de rappel des choix valides, à partir de la liste :
le message commencera par ‘saisissez ‘ suivi de la première valeur valide entre guillemets,
puis pour chaque valeur suivante, on ajoute une virgule, un espace et la valeur entre guillemets
et entre l’avant-dernière et la dernière valeur, pas de virgule, mais le mot ‘ou’
ce qui donnera, par exemple : saisissez « 1 », « 2 », « 3 » ou « 4 »

on code une fonction qui demande une saisie et vérifie qu’elle correspond à l’une des valeurs attendues

la variable booléenne vPremSaisie est initialisée à True au début de la fonction
à chaque passage dans la boucle while, elle est testée :

  • si elle vaut True, le message affiché pour demander une saisie sera simplement ‘saisissez votre choix : ‘
  • sinon le message sera celui renvoyé par la fonction MsgChoixValides, afin de rappeler à l’utilisateur quels sont les choix valides

la dernière instruction comprise dans le bloc de la boucle while affecte la valeur False à vPremSaisie, afin que dès le 2e passage dans la boucle, cette liste de choix valides soit affichée.

on modifie la fonction de calcul de manière à traiter les trois cas possibles
elle recevra en argument ‘TTC’, ‘HT’ ou ‘TVA’
les calculs :
TTC = HT + (HT * TVA / 100)
HT = TTC / (1 + TVA / 100)
TVA = (TTC – HT) / HT * 100

le raisonnement de la fonction :
selon la donnée à calculer, demander les deux autres
effectuer le calcul
retour au menu principal

et enfin, la fonction qui sera chargée d’afficher le menu, puis soit d’appeler la fonction Calcul() en lui transmettant ‘TTC’, ‘HT’ ou ‘TVA’,
soit de quitter l’application, selon le choix de l’utilisateur

ce qui donne, pour le code complet de l’application :


Publicités

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Propulsé par WordPress.com.

%d blogueurs aiment cette page :