Original file was panocalc.tex
Transcription
Original file was panocalc.tex
Une calculatrice pour PANORAMIC 1 Introduction Dans cet article nous allons voir comment programmer une calculatrice : tout d’abord en PANORAMIC « pur », avec l’instruction INPUT ; puis, pour plus de performances, avec une bibliothèque de sous-programmes. 2 L’instruction INPUT Lorsqu’une chaîne de caractères, correspondant à une expression mathématique, est passée à l’instruction INPUT, PANORAMIC calcule la valeur de l’expression. Le programme suivant en donne un exemple : Code : dim expr$ repeat input "Entrez une expression : "; expr$ print expr$ until expr$ = "0" end Difficile de faire plus simple... Cependant, on constate certaines limitations certains opérateurs, comme l’exponentiation (^), la division entière (\) ou l’opérateur modulo (mod), ne sont pas acceptés ; il est difficile d’éditer la chaîne en cours de saisie ; on ne peut pas définir de variables. Pour pallier à ces inconvénients, nous allons utiliser une bibliothèque de sous-programmes. : 3 La bibliothèque PANOCALC Cette bibliothèque est disponible à l’adresse suivante : http://sourceforge.net/projects/panolib/files/panocalc.zip L’archive contient les fichiers suivants : eval.dll : DLL utilisée par la bibliothèque eval.bas : Source de la DLL en FreeBASIC Les répertoires en et fr contiennent les fichiers suivants, en versions anglaise et française : eval_init.inc : Fichiers à inclure eval_subs.inc : Programmes exemples en BASIC PANORAMIC test_eval.bas calc.bas panocalc.bas panocalc.pdf : Documentation Pour utiliser la bibliothèque, placez dans un répertoire la DLL compilée (eval.dll), les fichiers à inclure et les programmes exemples. Vous pouvez alors lancer ces derniers depuis l’éditeur de PANORAMIC. 4 Description de la bibliothèque 4.1 Variables globales La bibliothèque utilise deux variables globales : Eval_Code% Eval_Result : Code de retour d’une fonction (entier) : Valeur d’une expression (réel) Ces variables sont dimensionnées dans le fichier eval_init.inc. Note : les noms de variables sont préfixés par Eval pour éviter des conflits possibles avec des variables du programme principal. 4.2 Procédures La bibliothèque définit trois procédures dans le fichier eval_subs.inc. 4.2.1 Eval_Init() Initialise la bibliothèque. Doit être appelée avant les autres SUBs. 4.2.2 Eval_SetVar(VarName$, Value) Initialise une variable de la bibliothèque. Il y a 26 variables, de A à Z (on peut utiliser les majuscules ou les minuscules). Notez que ces variables sont différentes des variables PANORAMIC. Il n’y a donc pas de risque de conflit. Le numéro d’ordre de la variable (1 pour A, etc.) est retourné dans Eval_Code%. Exemple : Eval_SetVar("e", exp(1)) 4.2.3 Eval(Expression$) Evalue l’expression mathématique passée en argument. Le résultat est retourné dans Eval_Result. La variable Eval_Code% contient un code d’erreur, selon la convention suivante : 0 Pas d’erreur 1 Symbole non reconnu 2 Parenthèses non appariées 3 Variable non définie 4 Fonction non définie Exemple : Eval("4 * atan(1)") Ces SUBs sont essentiellement des appels à la DLL eval.dll. Cependant, nous n’étudierons pas ici le mécanisme des DLLs, car l’utilisateur n’a besoin que des SUBs. Les DLLs pourront faire l’objet d’un prochain article. Pour accéder à ces procédures, il suffit d’inclure les deux fichiers *.inc au moyen de la directive #include : o eval_init.inc en début de programme o eval_subs.inc en fin de programme Notez que le fichier eval_init.inc effectue l’appel L’utilisateur peut donc appeler directement les autres procédures. à Eval_Init. Note : nous ne décrirons pas en détail la syntaxe des expressions. Nous renvoyons pour cela à la documentation de la bibliothèque. Notons cependant que les noms des fonctions peuvent différer de ceux de PANORAMIC (p. ex. atan au lieu de atn). D’autre part, la bibliothèque possède des opérateurs et des fonctions qui ne figurent pas dans PANORAMIC. 5 Programmes de démonstration 5.1 Un exemple simple : test_eval.bas ' ---------------------------------------------------------------------' Definition des variables globales de la bibliotheque et initialisation ' ---------------------------------------------------------------------#include "eval_init.inc" ' ---------------------------------------------------------------------' Programme principal ' ---------------------------------------------------------------------dim x, variable$, expression$, result variable$ = "x" x = rnd(1) Eval_SetVar(variable$, x) print print "Nom de la variable : ", variable$ print "Numero d'ordre : ", Eval_Code% print "Valeur : ", x expression$ = "cos(x)^2 + sin(x)^2" Eval(expression$) print print "Expression : ", expression$ print "Resultat : ", Eval_Result print "Code d'erreur : ", Eval_Code% end ' ---------------------------------------------------------------------' Definition des procedures de la bibliotheque ' ---------------------------------------------------------------------#include "eval_subs.inc" Dans cet exemple : Nous définissons une variable x à laquelle nous donnons une valeur aléatoire : c’est une variable de PANORAMIC. Nous transférons ensuite cette valeur à une variable "x" de la bibliothèque (différente de la variable x de PANORAMIC). Nous pouvons alors utiliser la variable "x" de la bibliothèque dans une expression (ici "cos(x)^2 + sin(x)^2", égal à 1 quel que soit x). 5.2 Une calculatrice simple : calc.bas Ce programme implémente une calculatrice à 4 variables : La formule à évaluer doit être saisie dans l’objet EDIT situé sous l’étiquette « Saisissez une formule, puis cliquez sur Evaluer ». La formule peut utiliser 4 variables, notées A à D. Les valeurs de ces variables doivent être saisies dans les objets EDIT correspondants. Le résultat s’obtient en cliquant sur le bouton « Evaluer », ce qui provoque un branchement au sous-programme suivant : Code : On_Click_Button_14: for i% = 1 to 4 Eval_SetVar(chr$(64 + i%), val(text$(5 + i%))) next i% Eval(text$(11)) text 13, str$(Eval_Result) return Les objets EDIT contenant les valeurs des variables ont des numéros consécutifs (6 à 9). Cela permet de récupérer ces valeurs dans une boucle. La fonction chr$(64 + i%) génère les caractères majuscules A, B ... dont les codes ASCII commencent à 65. Une fois les variables initialisées, l’expression peut être évaluée. On affiche alors le résultat, qui se trouve dans la variable globale Eval_Result. 5.3 Une calculatrice plus complète : panocalc.bas Ce programme ajoute une série de boutons à la calculatrice : Les boutons « Opérateurs » et « Fonctions » insèrent les symboles ou les noms de fonctions. Dans ce dernier cas, une parenthèse ouvrante est ajoutée automatiquement : par exemple, un clic sur le bouton « sin » insérera sin(. Toutefois, le bouton « rnd » (nombre aléatoire) insérera rnd() car cette fonction n’a pas d’argument. Le bouton « Retour arrière » (marqué ) efface le dernier caractère saisi, tandis que le bouton « Effacer » supprime la formule entière. Chaque bouton est muni d’une bulle d’aide (propriété HINT) qui rappelle sa fonction.