Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dès qu'un programme correspond à un algorithme un peu plus complexe (que ce que nous avons vu jusqu'à présent), il faut le structurer.
Le programme principal est relativement court car on se contente de saisir des variable, d'appeler des sous-programmes (SP).
Un même sous-programme peut être appelé plusieurs fois par le programme principal.
Les sous-programmes sont appelés plus précisément : procédures ou fonctions.
Les procédures sont des SP qui ne retournent pas de valeurs au programme principal.
Les fonctions sont des SP qui retournent des valeurs au programme principal.
Mais avec Python cette distinction n'a pas d'intérêt pratique : les procédures et fonctions sont définies avec le même mot clé : def.
Dans le code d'une fonction il y aura une instruction return qu'on ne retrouvera pas dans une procédure.
Objectif :
Nous avons d'abord la description d'une fonction ("cercle1") et d'une procédure ("cercle2")
Puis nous avons le programme principal dans lequel on appelle successivement la fonction "cercle1" et
la procédure "cercle2".
Les deux valeurs retournées par la fonction sont récupérées dans le programme principal respectivement dans les variables circonference et aire.
J'affiche ensuite ces deux variables.
J'utilise la fonction pi du module math.
Les variables définies dans cette fonction sont : r, c, s
La variable utilisée dans cette procédure est r.
Cette variable est utilisée pour dessiner le cercle avec le module turtle.
Vous avez saisi le code source et vous vous êtes assuré qu'il fonctionne correctement.
Au fait, n'oubliez pas de cliquer dans la fenêtre graphique pour "reprendre la main".
Maintenant vous allez découvrir via des tests, la notion de portée des variables ainsi que la problèmétique des erreurs de saisie.
Dans les deux SP ("cercle1" & "cercle2") rajoutez l'instruction "print(rayon)".
Exécutez de nouveau le programme !
Pas de plantage : le rayon est affiché deux fois.
Supprimez logiquement les rajouts : transformer instructions en commentaires.
Puis lancez l'exécution.
Plantage !
Tout cela est normal.
Une variable définie au niveau d'un SP (procédure ou fonction) n'est connue que de cette routine ;
elle ne peut être manipulée dans le programme principal.
Par contre une variable définie au niveau du programme principal peut être manipulée également dans les SP ;
Cette variable a donc une portée plus grande.
Lancez l'exécution du programme et saisissez la chaine "100 cm" .
Il y a "plantage" !
La fonction eval() est incapable de convertir en numérique une chaine comprenant
des lettres.
C'est la faute de l'utilisateur qui n'a pas lu l'invite de commande : un entier !
Mais un bon programme doit prévoir les étourderies de l'utilisateur.
Il faut donc améliorer ce programme et prévoir un contrôle de saisie.
C'est l'occasion d'introduire une notion très puissante mais parfois un peu délicate : les expressions régulières.
On retrouve ce concept dans tous les langages. Ainsi le lecteur qui connait JavaScript va retrouver une syntaxe déjà connue.
Extrait :
Whou ! ça se complique sérieusement.
Voyons toutes les nouveautés :
import re : activation du module re (Regular Expressions) donc le module qui traite des expressions régulières
gabarit ="^[0-9]{1,}$" : la variable gabarit contient une expression régulière qui veut dire "au moins un chiffre".
while not re.search(gabarit, rayon) : tant que le contenu de rayon ne correspond pas au format de saisie défini dans gabarit
il faut boucler donc ressaisir le rayon.
Nous avons donc utilisé la méthode search() du module re. et aussi la syntaxe while not … (tant que FAUX)
Une expression régulière est une chaine qui commence par le caractère "^" et se termine pas "$" puis comprend 1 à N couples "classe – quantificateur".
Une classe est délimitée par des crochets, le quantificateur est délimité par des accolades.
Dans l'exemple précédent il n'y avait qu'un couple "classe-quantificateur".
Une classe indique le ou les caractères autorisés à la saisie. On reconnait une classe car elle est entre crochets.
Une classe peut être un énumération de caractères autorisés ou un intervalle ou un mélange des deux.
Un quantificateur suit une classe et indique le nombre de caractères autorisés à la saisie. Un quantificateur est entre accolades ou est un symbole :
Les expressions régulières nom_g & prenom_g autorisent seulement les lettres minuscules et majuscules mais non accentuée ; au moins deux.
L'expression telephone_g autorise seulement 10 chiffres.
L'expression motpasse_g autorise les chiffres et les lettres non accentuées ; au moins 8 caractères.
Comme le rayon doit être un entier (donc uniquement des chiffres) il y a une solution plus simple concernant le
contrôle de saisie du rayon : c'est à dire sans recourir aux expressions régulières.
Ci-dessus extrait du programme avec une autre technique pour le contrôle de saisie.
Avec la méthode is.digit() la saisie ne doit comporter que des chiffres.
Tant que la saisie dans rayon comprend autre chose que des chiffres, on reste dans la boucle de saisie.
Je reviens sur le thème "tirage au sort de cinq cartes dans un jeu de 32".
Dans le chapitre 8 ce programme avait déjà été amélioreé avec l'emploi d'un ensemble interdisant les doublons mais alors "la main" du joueur pouvait alors être inférieure à 5 cartes ...
Dans la version définitive le programme est structuré afin d'être flexible.
Il faut parfois plus de cinq tirages, si le tirage au sort produit des doublons.
Une fonction nommée "tirage_carte()" sera appelée au moins 5 fois (parfois plus) par le programme principal. ...
Il faut appeler cette fonction jusqu'à ce que la longueur de l'ensemble "mon_jeu" soit égale à 5.
Tant que n (nombre d'éléments du set "mon_jeu" est inférieur à 5, il faut boucler.
La variable "carte" récupère la valeur retournée par la fonction.
Les chaines de format ou "f-strings" permettent d'afficher les sorties selon un format approprié.
Il suffit à l'intérieur du print() d'un f majuscule ou minuscule juste après la parenthèse ouvrante.
Calcul de la TVA, du montant TTC à partir du montant HT.
Si vous saisissez 1000, ce programme retourne :
TVA : 55
TTC : 1055
Ce programme calcule la TVA et le TTC au taux réduit ou au taux normal.
De plus il y a des contrôles de saisie.
Vous pouvez faire plusieurs tentatives pour la saisie du montant HT et du code_tva.
Il y a donc un bémol : le montant HT doit obligatoirement être un entier ...
On associe aux instructions print des "f-strings". Les montants affichés sont libellés en € !
Notez bien la syntaxe à l'intérieur des parenthèses de la fonction print :
f"TVA : {ht * taux} €" : le f doit précèder la chaine entre guillemets.
Dans la chaine il y peut y avoir une expression de calcul (entre accolades).
Juste après l'accolade fermante rajoutez € !
Constatez que malgré de nombreuses erreurs de saisie, il n'y a pas plantage du programme.
Pour préciser le taux réduit on peut saisir r ou R et pour le taux normal : n ou N.
L'affichage des sorties est correct.
Un esprit chagrin peut faire remarquer qu'il serait préférable que les montants affichés apparaissent avec deux décimales.
La solution :
J'ai donc rajouté juste avant l'accolade fermante la chaine ":.2f". ":" pour indiquer le début d'un format et ".2f" qui signifie "toujours deux décimales".