//
ou sont
parenthèsés par /* */
Les variables sont les endroits où l'on peut stocker des valeurs, des
nombres, des expressions, des objets.
Le nom des variables est formé par une suite de caractères et commence par
une lettre : attention on n'a pas droit aux
mots réservés ...ne pas utiliser par exemple la variable i dans un
for car i représente le nombre complexe de module 1 et
d'argument
.
Une action ou bloc est une séquence d'une ou plusieurs instructions.
Quand il y a plusieurs instructions il faut les parenthéser avec { }
et séparer les instructions par un point virgule (;)
Un bloc est donc parenthèsé par { } et commence
éventuellement par la déclaration des variables locales (local...).
En effet les variables locales doivent être déclarées au début d'un
bloc par le mot réservé local puis on met les noms des variables
séparés par des virgules (,). Ces variables locales peuvent être
initialisées lors de leur déclaration.
Attention Les variables locales sont toujours affectèes : on ne
définira donc pas, les variables formelles, avec local.
Voici des exemples :
u(n,uo,u1):={ local L,a,b; purge(A,B,x); [a,b]:=solve(x^2-x-1,x); L:=linsolve([A+B=uo,A*a+B*b=u1],[A,B]); return normal(L[0]*a^n+L[1]*b^n); };On tape :
idiv2(a,b):={ local (q:=0),(r:=a); if (b!=0) { q:=iquo(a,b); r:=irem(a,b); } return [q,r]; };
Voici le programme de la même fonction mais avec les variables locales internes au bloc du if :
idiv2(a,b):={ if (b==0) {return [b,a];} if (b!=0) { local q,r; q:=iquo(a,b); r:=irem(a,b); return [q,r]; } };ou encore avec les variables locales internes au bloc du else :
idiv2(a,b):={ if (b==0) {return [b,a];} else { local q,r; q:=iquo(a,b); r:=irem(a,b); return [q,r]; } };
L'affectation se fait avec := (par exemple a:=2; b:=a;).
Les entrées se font par passage de paramètres ou avec input.
Il n'y a pas de distinction entre programme et fonction : les sorties se font
en mettant le nom de la variable à afficher (ou la séquence des variables
à afficher ou entre crochets les variables à afficher séparées par
une virgule) précedé du mot réservé return.
Les tests et boucles ont une syntaxe similaire au langage C++.
testif(a,b):={ if ((a==10) or (a<b)) b:=b-a; else a:=a-b; return [a,b]; };
testfor1(a,b):={ local j,s:=0; for (j:=a;j<=b;j++) s:=s+1/j^2; return s; };
testfor2(a,b):={ local j,s:=0; for (j:=b;j>=a;j--) s:=s+1/j^2; return s; };
testwhile(a,b):={ while ((a==10) or (a<b)) b:=b-a; return [a,b]; };
Un exemple : le PGCD d'entiers
- Version itérative
pgcd(a,b):={ local r; while (b!=0) { r:=irem(a,b); a:=b; b:=r; } return a; };-Version récursive
pgcdr(a,b):={ if (b==0) return a; return pgcdr(b,irem(a,b)); };ou
pgcdr(a,b):=if (b==0) return a; else return pgcdr(b,irem(a,b));