Apprendre Maple Programmation

 
  Page d'accueilPage d'accueil   RechercherRechercher   Forum de discussionForum de discussion   ContactContact   SommaireSommaire 
  Cours MapleCours Maple   Travaux dirigésTravaux dirigés   Thèmes d'activitésThèmes d'activités   Thèmes d'activitésMaplets
Ecran MapleEcran Maple  TéléchargementTéléchargement  BibliographieBibliographie  LiensLiens  

 

Page d'accueil   Cours Maple   << Chapitre précédent   Chapitre suivant >>


Remarque importante: pour pouvoir entrer plusieurs lignes d'instructions Maple successives,
sans exécution à la fin de chaque ligne, presser
Shift+Entrée à la fin de chaque ligne.
Puis, pour valider l'ensemble des lignes ainsi écrites, presser
Entrée en plaçant le curseur par
exemple sur la dernière ligne écrite.

 

LES STRUCTURES DE CONTRÔLE:

 

Structure de contrôle if .. then:

if condition1 then instruction 1

elif condition2 then instruction2 elif et else sont optionnels)

elif condition3 then instruction3 ...

else instructionN

end if;

 

Effectue un test selon certaines conditions:

elif signifie "autrement si" . La dernière instruction à exécuter doit être précédée de else .

 

Exemple 1: résolution de l'équation du premier degré ax+b = 0 .
Modifiez les valeurs de
a et de b , puis validez les lignes suivantes:

> a:=7:b:=3:

> if a<>0 then print(`Une solution : x `=-b/a)
        elif b=0 then print(`Tout x est solution`)
        else print(`Pas de solution`)
    end if;

`Une solution : x ` = -3/7

 

Structure de contrôle while .. do:

while condition do ... end do;
Exécute une suite d'instructions, tant que la condition est vraie.

 

Exemple 2: calcul de la somme des 100 premiers entiers naturels

> somme:=0:k:=-1:
    while k<100 do k:=k+1:somme:=somme+k end do:
    `somme `=somme;

`somme ` = 5050

 

 

Structure de contrôle for .. to:

for variable from initiale to finale by pas do ... end do;

Exécute une boucle pour une variable allant d'une valeur initiale à une valeur finale,

avec un pas donné.

 

from , by peuvent être omises ou écrites dans un ordre quelconque.

Si l'on omet from , initiale vaut 1. Si l'on omet by , pas vaut 1.

 

Exemple 3: calcul de la somme des 100 premiers entiers naturels

> somme:=0:
    for k from 0 to 100 do somme:=somme+k end do:
    `somme `=somme;

`somme ` = 5050

 

Exemple 4: calcul de la somme des entiers impairs inférieurs à 100
Ici, on omet
from donc la première valeur de k est 1. La dernière valeur prise par k sera 99.

> somme:=0:
    for k to 100 by 2 do somme:=somme+k end do:
    `somme `=somme;

`somme ` = 2500

 

for variable in expression do .. end do;

Exemple 5: donner les nombres premiers de la liste [31,39,47,105]

> for k in [31,39,47,105] do
        if isprime(k) then print(k,`est premier`) end if
    end do;

31, `est premier`

47, `est premier`

 

LES PROCÉDURES:

 

Un programme MAPLE peut être organisé en sous-programmes appelées procédures .
Une procédure, de type
procedure , est définie par le mot-clé proc et peut être assignée à
un nom de variable. Pour définir une procédure intitulée
nom , on utilisera la syntaxe suivante:

 

nom := proc (paramètres_formels)

global variables_globales; (la ligne global est optionnelle)

local variables_locales; (la ligne local est optionnelle)

description
chaîne_de_description; (la ligne description est optionnelle)

option nom_option; (la ligne option est optionnelle)

. . . instructions . . . (corps de la procédure)

end proc;

 

 

Exemple 6:

La procédure intitulée maxi calcule le plus grand de 2 entiers positifs.
Elle comporte 2 paramètres formels
u et v . Leur type peut être omis, mais si on le veut le préciser,
bien noter la syntaxe
u :: posint , v :: posint pour signifier que u et v sont de type posint .
Elle ne comporte ni variables globales, ni variables locales, mais une chaîne de description

de la procédure et une option de copyright.

> maxi:=proc(u::posint,v::posint)
        description "calcule le plus grand de 2 entiers positifs";
        option `Copyright (c) 2001 A.Le Stang`;
        if u<v then v else u end if;
    end proc;

maxi := proc (u::posint, v::posint) option `Copyrig...

> maxi(5,9);maxi(1.2,Pi);

9

Error, invalid input: maxi expects its 1st argument, u, to be of type posint, but received 1.2

 

Une variable locale est une variable qui n'est reconnue qu'à l'intérieur de la procédure,

contrairement à une variable globale accessible en dehors de la procédure.

Exemple 7:

> messages:=proc()
        global message1;
        local message2;
            message1:="Hello, world!";
            message2:="How are you?";
    end proc;

messages := proc () local message2; global message1...
messages := proc () local message2; global message1...

> messages();

w are you?

> message1,message2;

, world!

La valeur de la variable locale message2 n'a pas été reconnue, contrairement à celle de la
variable globale
message1 .

 

Remarque importante:
Un paramètre formel passé à une procédure ne peut être modifié à l'intérieur de cette procédure

 

 

Exemple 8: Diviser un entier positif x par 2 tant qu'il est pair.

> div:=proc(x::posint)
        while type(x,even) do x:=x/2 end do;
    end proc;

div := proc (x::posint)  while type(x,even) do x :=...

> div(48);

Error, (in div) illegal use of a formal parameter

La tentative d'affecter au paramètre formel x sa valeur divisée par 2 provoque une erreur.
On peut modifier la procédure de la manière suivante:

> div:=proc(x::posint)
        local y;
            y:=x;
            while type(y,even) do y:=y/2 end do;
            y
    end proc;

div := proc (x::posint) local y; y := x;  while typ...

> div(48);

3

On obtient en effet successivement : 48,24,12,6,3.

> div(45);

45

 

return met fin à la procédure en donnant un résultat.
next permet de passer à la valeur suivante dans une itération.
break permet de sortir de la structure de contr ô le en cours.

 

Exemple 9: On parcourt une liste de nombres. Au premier entier positif trouvé, on sort de la procédure
avec pour résultat cet entier, sinon si ce nombre est négatif, on sort de la boucle avec pour résultat -1,
sinon on passe au nombre suivant.

> liste:=proc(L::list(numeric))
        local k;
            for k in L do
            print(`lecture de`,k);
            if type(k,nonnegint) then return k
                elif k<0 then break;
                else next;
            end if
            end do;
            return -1;
    end proc;

liste := proc (L::list(numeric)) local k; for k in ...
liste := proc (L::list(numeric)) local k; for k in ...
liste := proc (L::list(numeric)) local k; for k in ...
liste := proc (L::list(numeric)) local k; for k in ...
liste := proc (L::list(numeric)) local k; for k in ...
liste := proc (L::list(numeric)) local k; for k in ...

> liste([12.56,8.9,7,3.14]);

`lecture de`, 12.56

`lecture de`, 8.9

`lecture de`, 7

7

> liste([12.56,-8.9,7,3.14]);

`lecture de`, 12.56

`lecture de`, -8.9

-1

> liste([12.56,8.9,7.1,3.14]);

`lecture de`, 12.56

`lecture de`, 8.9

`lecture de`, 7.1

`lecture de`, 3.14

-1

Récursivité:

Une procédure qui fait référence à elle même dans sa définition est une procédure récursive .

 

Exemple 10: factorielle de n

> factorielle := proc(n::nonnegint)
        if n>0 then n*factorielle(n-1) else 1 end if;
    end proc;

factorielle := proc (n::nonnegint) if 0 < n then n*...

> factorielle(12);

479001600

 

Fonction error:
La fonction
error permet de définir des messages d'erreur personnalisés.

Exemple 11: racine carrée de x

> racine := proc (x)
        if x<0 then error "invalide x: %1", x else simplify(x^(1/2)) end if
    end proc;

racine := proc (x) if x < 0 then error

> racine(144);

12

> racine(-144);

Error, (in racine) invalide x: -144

 

LES MODULES:

 

Un module est une collection de procédures et de données.

Un module, de type module , est défini par le mot-clé module et peut être assigné à un
nom de variable. Pour définir un module intitulé
nom , on utilisera la syntaxe suivante:

nom := module ()

global variables_globales; (la ligne global est optionnelle)

local variables_locales; (la ligne local est optionnelle)

export variables_locales_exportées; (la ligne export est optionnelle)

description
chaîne_de_description; (la ligne description est optionnelle)

option nom_option; (la ligne option est optionnelle)

. . . instructions . . . (corps du module)

end module;


Contrairement au cas des procédures,
le module ne peut avoir de paramètres formels .
On retrouve les notions de variables globales et locales, comme pour les procédures,

mais les modules peuvent exporter des variables locales (celles de la ligne export ),

auxquelles on a accès de l'extérieur du module en utilisant la syntaxe suivante:
nom :- var permet d'accéder à la variable locale exportée var du module nom .

En utilisant la terminologie de la programmation orientée objet, les variables déclarées

dans la ligne local s'apparentent à des membres privés du module, tandis que celles
déclarées dans la ligne
export s'apparentent à des membres publics du module.

 

Exemple 12: Anneau Z/4Z des entiers modulo 4.

> Z4:=module()
        description "Arithmétique modulo 4";
        export add,mult,opp;
            add := (x,y)-> (x+y) mod 4;
            mult := (x,y)-> (x*y) mod 4;
            opp := x-> (-x) mod 4;
    end module;

Z4 := module () export add, mult, opp; description ...

Le module comporte 3 variables locales exportées add , mult , opp .
Vérifions que: (2+3) mod 4 = 1 , que (2*3) mod 4 = 2 et
opp (1) = -1 mod 4 = 3 :

> Z4:-add(2,3);

1

> Z4:-mult(2,3);

2

> Z4:-opp(1);

3

 

 

Exemple 13: Anneau Z/ n Z des entiers modulo n .
On désire modifier le programme précédent pour effectuer de l'arithmétique modulo
n ,

avec 0 < n entier quelconque.
Un module n'acceptant pas de paramètre formel, écrivons une procédure
Construire_Zn

de paramètre formel n , rendant pour résultat un module:

> Construire_Zn:=proc(n::posint)
        module()
                description "Arithmétique modulo n";
                export add,mult,opp;
                    add := (x,y)-> (x+y) mod n;
                    mult := (x,y)-> (x*y) mod n;
                    opp := x-> (-x) mod n;
        end module;
    end proc;

Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...
Construire_Zn := proc (n::posint) module () export ...

> Z7:=Construire_Zn(7);

Z7 := module () export add, mult, opp; description ...

> Z7:-add(6,5);

4

> Z7:-mult(5,3);

1

> Z7:-opp(3);

4

 

On peut utiliser la structure de contrôle use pour accéder aux variables locales exportées du module nom sans avoir recours
à l'utilisation de :-
Exemple: (opp(3) mod 7) = (4 mod 7) = 4 ( (opp(3) mod 7)*5 ) mod 7 = (4*5) mod 7 = 6

(2 + ( (opp(3) mod 7)*5 ) mod 7 ) = (2+6) mod 7 = 1

> use Z7 in
        add( 2, mult( opp(3), 5) )
    end use;

1

 

 

La fonction member permet de savoir si une expression est membre d'un module:

> member(mult,Z7) , member(prod,Z7);

true, false

 

Le constructeur Record:
Le constructeur
Record crée un enregistrement Maple. Un enregistrement, de type record , est
défini par les noms de ses champs (appelés "slots" ou "fields" en anglais).

Exemple 14: On veut créer un enregistrement pour modéliser les nombres complexes.
Un nombre complexe
z est défini par 2 champs: sa partie réelle et sa partie imaginaire.

 

> z := Record( 're', 'im' );

z := module () export re, im; option record; end mo...

On voit qu'un enregistrement est un module particulier, qui a l'option record .

 

On définit un nouveau type complexe associé et la fonction module d'un nombre complexe:

> `type/complexe` := 'record( re, im )':
    Mon_module:=(z::complexe)->sqrt(z:-re^2+z:-im^2);

Mon_module := proc (z::complexe) options operator, ...

> z:-re:=1 : z:-im:=2 :Mon_module(z);

sqrt(5)

On peut aussi initialiser les valeurs des parties réelle et imaginaire de la façon suivante:

> z:= Record( 're' = 1, 'im' = 2 ):Mon_module(z);

sqrt(5)

 

LES LIBRAIRIES ET PACKAGES:

 

Pour obtenir le listing de certaines fonctions des librairies MAPLE, comme ici la fonction ithprime

utiliser:

> interface(verboseproc=2);print(ithprime);

proc (i) global `ithprime/global/magicNumber`; opti...

 

Les packages regroupent des fonctions utiles dans des domaines particuliers.

La fonction suivante appelle la page d'aide donnant les packages existants :

 

> ?index,package

 

La fonction with permet de charger toute ou partie d'un package choisi:

 

> with(student);
    #charge toutes les fonctions du package student

[D, Diff, Doubleint, Int, Limit, Lineint, Product, ...
[D, Diff, Doubleint, Int, Limit, Lineint, Product, ...
[D, Diff, Doubleint, Int, Limit, Lineint, Product, ...

 

Chargement de la fonction binomial du package combinat :

> with(combinat,binomial);

[binomial]

Cette fonction retourne le nombre binomial( n, p ) = n!/(p!*(n-p)!) appelé aussi C( n, p ).

 


Exercice corrigé 3:

 

Ex 3.1
Ecrire une procédure calculant le plus grand de 3 entiers naturels non nuls
a , b , c .

> max3:=proc(a::posint,b::posint,c::posint)
        local max2;
            max2:=proc(x::posint,y::posint)
                if x>y then x else y end if;
            end proc;
        max2(a,max2(b,c));
    end proc;

 

max3 := proc (a::posint, b::posint, c::posint) loca...
max3 := proc (a::posint, b::posint, c::posint) loca...
max3 := proc (a::posint, b::posint, c::posint) loca...
max3 := proc (a::posint, b::posint, c::posint) loca...

> max3(5!,5^3,123);

125

max3 comporte une variable locale max2 à laquelle est affectée une procédure calculant le
plus grand de 2 entiers naturels non nuls.

 

Ex 3.2

1° Écrire un module
pnt permettant de modéliser un point du plan, défini par ses coordonnées
x , y . Ce module comportera des variables locales exportées rendant comme résultat l'abscisse
et l'ordonnée du point.


2° Écrire un module
cercle permettant de modéliser un cercle du plan, défini par son centre et
son rayon. Ce module comportera des variables locales exportées rendant comme résultat le
centre, le rayon, le diamètre, l'aire, et la circonférence du cercle.

 

1° Définition de la procédure pnt rendant pour résultat un module:

> pnt:=proc(x,y)
        module()
            export abscisse,ordonnee;
                abscisse:=()->x;
                ordonnee:=()->y;
        end module
    end proc;

pnt := proc (x, y) module () export abscisse, ordon...

 

Définition d'un point A de coordonnées ( a , b ) :

> A:=pnt(a,b);

A := module () export abscisse, ordonnee; end modul...

> A:-abscisse(), A:-ordonnee();

a, b

 

2° Définition de la procédure cercle rendant pour résultat un module:

> cercle:=proc(c,r)
        module()
            export centre,rayon,diametre,aire,circonference;
                centre:=()->c;
                rayon:=()->r;
                diametre:=()->2*rayon();
                aire:=()->Pi*r^2;
                circonference:=()->Pi*diametre();
        end module
    end proc;

cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...
cercle := proc (c, r) module () export centre, rayo...

 

Définition d'un cercle C de centre A de rayon R :

> C:=cercle(A,R);

C := module () export centre, rayon, diametre, aire...

> C:-centre(), C:-rayon(), C:-diametre(), C:-aire(), C:-circonference();

A, R, 2*R, Pi*R^2, 2*Pi*R

Utilisation des deux structures pour obtenir les coordonnées du centre de C :

> C:-centre():-abscisse(), C:-centre():-ordonnee();

a, b

 



Travail dirigé 3:

 

TD 3.1:

Écrire une procédure second_degré(a,b,c) qui résout l'équation du second degré à

coefficients réels: a*x^2+b*x+c = 0 en distinguant 3 cas selon le signe du discriminant.

 

TD 3.2:

Écrire une procédure somme(n) calculant récursivement la somme des entiers de 0 à n , pour

n entier naturel donné.

 

TD 3.3:

Écrire une procédure renverser(n) , qui , étant donné un entier naturel n ne comportant pas de

0 dans son écriture décimale , rend pour résultat l'écriture renversée de cet entier .

Prévoir un message d'erreur si l'entier comporte le chiffre 0.

 

Exemple:

> renverser(122564);

465221

> renverser(120325);

Error, (in renverser) le chiffre 0 n'est pas autorisé.

 

TD 3.4:

Écrire un module segment permettant de modéliser un segment du plan, défini par ses deux
points extrémités.Ce module comportera des variables locales exportées rendant comme
résultat la première et la seconde extrémité du segment, sa longueur, et son milieu.
On pourra utiliser le module défini par la procédure
pnt de l'exercice corrigé 3.2 .

 

 

 

haut de cette page


©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.