Souci avec la commande affichage

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Souci avec la commande affichage

Message par albenic » jeu. févr. 07, 2013 7:49 am

Bonjour,

le code ci-dessous est opérationnel pour les calculs mais il n'affiche pas ma fonction affine par morceaux. Qui peut me dire pourquoi ?

Code : Tout sélectionner

fonction2(x):={
  local a;
  si x<=4 alors
    a:=3*x;
    afficher("Aire = "+a);
    DispG;
    affichage(polygone_ouvert(point(0,0),point(x,a)),vert+epaisseur_ligne_3);
  fsi;
  si x>4 et x<=8 alors
    a:=12+x;
    afficher("Aire = "+a);
    affichage(polygone_ouvert(point(0,0),point(4,12),point(x,a)));
  fsi;
  si x>8 et x<=10 alors
    a:=16+3*x;
    afficher("Aire = "+a);
    affichage(polygone_ouvert(point(0,0),point(4,12),point(8,16),point(x,a)));
  fsi;
  si x>10 et x<=12 alors
    a:=22+3*x;
    afficher("Aire = "+a);
    DispG;
    affichage(polygone_ouvert(point(0,0),point(4,12),point(8,16),point(10,22),point(x,a)));
  fsi;
}:;
Par avance merci.

PS : je n'utilise pas la fenêtre DispG et ne souhaite pas l'utiliser (je trouve plus commode d'avoir ma réponse et en dessous le graphique).

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Souci avec la commande affichage

Message par parisse » jeu. févr. 07, 2013 2:57 pm

Si vous n'utilisez pas la fenetre DispG, il faut creer une sequence ou une liste, y mettre tous les objets graphiques a afficher au fur et a mesure de leur creation, et renvoyer la liste avec return. Ici c'est plus simple, il suffit d'enlever les DispG et de mettre des return avant chaque affichage (comme return quitte immediatement il renverra l'objet graphique a afficher, alors qu'actuellement en l'absence de return tous les tests successifs sont faits et la valeur renvoyee est en general 0 qui correspond au dernier test non pris).

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Souci avec la commande affichage

Message par albenic » jeu. févr. 07, 2013 4:50 pm

Bonsoir,

C'est ce que je craignais. Le problème est que ce programme est à faire par des élèves et je l'ai écrit comme je pense qu'ils vont le rédiger.

Après de nombreux essais la solution la plus simple et la plus compréhensible me semble effectivement d'utiliser la fenêtre DispG.

Merci pour ces éclaircissements.

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Souci avec la commande affichage

Message par parisse » jeu. févr. 07, 2013 6:45 pm

pourquoi ne pas leur apprendre à utiliser return?

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Souci avec la commande affichage

Message par albenic » jeu. févr. 07, 2013 6:59 pm

parisse a écrit :pourquoi ne pas leur apprendre à utiliser return?
Les élèves connaissent la commande afficher et pour l'instant elle leur sufit (les élèves sont comme tout le monde : tant qu'ils ont un truc qui fonctionne, ils s'y accrochent).

Pour moi (mais peut-être suis-je dans l'erreur) le principal intérêt de la commande "retourne" (en vf...) est lorsque l'on crée un programme qui utilise un sous-programme alors là la commande retourne prend tout son sens et elle est un passage obligé. Malheureusement, je n'en suis pas encore à ce stade avec mes élèves mais c'est un objectif vers lequel je tends...

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Souci avec la commande affichage

Message par parisse » jeu. févr. 07, 2013 7:45 pm

Il y a un autre intérêt à la commande return, c'est de quitter immédiatement la fonction en cours. Ca permet d'éviter des tests imbriqués (les forếts d'ifs) ou d'utiliser des booléens compliqués dans certaines boucles et donc d'écrire une fonction plus facile à lire et comprendre donc à mettre au point. Par exemple on pourrait écrire une fonction de max de 3 éléments comme ça

Code : Tout sélectionner

max3(a,b,c):={
  si a>b et a>c alors return a; fsi;
  si b>c alors return b; fsi;
  return c;
}
au lieu de

Code : Tout sélectionner

max3(a,b,c):={
si a>b et a>c alors return a;
sinon si b>c alors return b; sinon return c; fsi; fsi;
} 

Répondre