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.