Problème (surement idiot) avec "for"

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
Répondre
bipbip1313
Messages : 12
Inscription : sam. oct. 13, 2007 7:45 am
Localisation : Albertville

Problème (surement idiot) avec "for"

Message par bipbip1313 » lun. nov. 23, 2009 2:14 pm

Bonjour,

Je teste ce programme simple :

A:=point(1,0);
O:=point(0,0);
saisir("n",n);

B:=rotation(0,2*pi/6,A);
segment(A,B);

for (j:=1;j<=n;j++){
B:=rotation(0,2*pi/n,A);
segment(A,B);
A:=B;
};

Le premier segment est bien tracé, mais les segments à l'intérieur de la boucle n'apparaissent pas. Euh... où est l'ânerie?

Merci
Cordialement

Pierre

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

Re: Problème (surement idiot) avec "for"

Message par parisse » lun. nov. 23, 2009 3:31 pm

Ca vient du fait que seul le résultat de l'évaluation de la boucle est affiché. Il faut mettre dans une liste les objets intermédiaires et l'évaluer.
L:=[];
A:=1; n:=10;
for (j:=1;j<=n;j++){
B:=rotation(0,2*pi/n,A);
L[j]:=segment(A,B);
A:=B;
};
L;

bipbip1313
Messages : 12
Inscription : sam. oct. 13, 2007 7:45 am
Localisation : Albertville

Re: Problème (surement idiot) avec "for"

Message par bipbip1313 » lun. nov. 23, 2009 3:54 pm

Merci!

Une micro-remarque : ceci n'est vrai qu'avec des constructions géométriques, avec l'affichage de calculs pas de problèmes. C'est volontaire ou une "limite" de Xcas?

Cordialement

Pierre

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

Re: Problème (surement idiot) avec "for"

Message par parisse » lun. nov. 23, 2009 5:32 pm

Non, c'est la même chose avec des calculs, les calculs évalués dans une boucle ne sont pas renvoyés sauf le dernier. Mais en général, pour un calcul on stocke le résultat du calcul quelque part et on l'affiche, ou alors ce résultat est précisément le résultat de la dernière évaluation faite lors de la dernière itération de la boucle. Peut-etre qu'il faut préciser qu'une boucle for n'est pas équivalent à la juxtaposition de plusieurs instructions par des ; c'est plutot comme l'exécution d'une seule fonction algébrique (dont le résultat est le résultat de la dernière évaluation faite pendant l'exécution de la boucle).

alb
Messages : 1321
Inscription : ven. août 28, 2009 3:34 pm

Re: Problème (surement idiot) avec "for"

Message par alb » lun. nov. 23, 2009 6:11 pm

comment modifier ce programme pour nommer les sommets A0,A1,...?
D'avance merci.

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

Re: Problème (surement idiot) avec "for"

Message par parisse » lun. nov. 23, 2009 7:01 pm

Il vaut mieux le faire dans un programme, par exemple

Code : Tout sélectionner

f(n):={
 local L,A,j,B;
 L:=[];
 A:=1;
 for (j:=1;j<=n;j++){
  B:=rotation(0,2*pi/n,A);
  L[2*j-2]:=segment(A,B);
  L[2*j-1]:=legende(B,"A"+j);
  A:=B;
 };
 L;
}:;
En mode direct, c'est beaucoup plus sioux, car l'évaluation en mode interactif enlève les légendes des points, il faut alors utiliser la pré-affetcation, le stockage en place et eval avec 1 comme niveau d'évaluation, ça donne

Code : Tout sélectionner

A:=1;
n:=10;
L:=[0$(2n)];
for (j:=1;j<=n;j++){
B:=rotation(0,2*pi/n,A);
L[2*j-2]=<segment(A,B);
L[2*j-1]=<legende(B,"A"+j);
A:=B;
};
L;

bipbip1313
Messages : 12
Inscription : sam. oct. 13, 2007 7:45 am
Localisation : Albertville

Re: Problème (surement idiot) avec "for"

Message par bipbip1313 » mar. nov. 24, 2009 6:54 am

Bonjour,

Je ne saisis pas la subtilité sur "for".
Par exemple :

saisir("n",n);
for (j:=1;j<=n;j++){
print(j,"²=",j^2);
};

m'affiche sans problème les carrés successifs et le code Asymptote :

\begin{asy}
unitsize(1cm);
int n=6;
pair pO=(0,0);
pair pA=(1,0);
for(int k=0; k<n; ++k) {
pair pB=rotate(360/n,pO)*pA;
draw(pA--pB,1bp+blue);
pA=pB;
}

\end{asy}

m'affiche bien un superbe hexagone.

Je n'ai pas testé avec d'autres logiciels.

Cordialement

Pierre

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

Re: Problème (surement idiot) avec "for"

Message par parisse » mar. nov. 24, 2009 7:39 am

C'est parce qu'il y a une différence entre afficher et retourner. Dans
for (j:=1;j<=n;j++){
print(j,"²=",j^2);
};
vous affichez, en bleu dans un widget intermédiaire, la valeur retournée par print est 1 et donc la valeur retournée par la boucle est 1 et c'est ça qui sera affiché en noir dans le widget réponse.
Vous pouvez par exemple écrire
a:=for (j:=1;j<=n;j++){
print(j,"²=",j^2);
};
et vous verrez que la valeur de a est 1 après exécution de la boucle.
Naturellement, ça ne sert à rien en général, on n'affecte pas le résultat d'une boucle dans une variable.
Revenons à la différence texte/graphique dans le cadre de l'affichage: il n'y a pas de widget graphique intermédiaire entre le widget d'input et le widget de retour qui pourrait servir à afficher des objets graphiques, donc pas de commande équivalente à print pour afficher des objets graphiques. Il y a toutefois une fenêtre graphique qui conserve toutes les objets graphiques évaluées et qui peut jouer un role analogue ici, c'est la fenêtre DispG (que vous affichez par la commande ci-dessus ou par le menu Cfg->Montrer).

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

Re: Problème (surement idiot) avec "for"

Message par parisse » mar. nov. 24, 2009 7:49 am

En complément du message précédent, le code asymptote sert très certainement à additionner (à la manière de la fenêtre DispG) les différents objets graphiques imprimés au cours de la boucle.

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

Re: Problème (surement idiot) avec "for"

Message par parisse » ven. nov. 27, 2009 10:09 am

Suite aux problemes decrits sur ce fil, je viens de modifier Xcas pour que l'ouverture de la fenetre DispG soit automatique. Cela permettra de creer des objets graphiques dans une boucle sans avoir a rentrer dans les subtilites techniques de Xcas. J'espere que ca n'engendrera pas d'effet pervers (pour l'instant, j'ai juste vu celui-la: si on fait un graphe de suite recurrente en-dehors d'une figure, la fenetre DispG s'ouvre, il faut alors la fermer...)

bipbip1313
Messages : 12
Inscription : sam. oct. 13, 2007 7:45 am
Localisation : Albertville

Re: Problème (surement idiot) avec "for"

Message par bipbip1313 » dim. nov. 29, 2009 3:44 pm

Ce qui veut dire que, dans la prochaine version d'Xcas, avec mon programme de départ

A:=point(1,0);
O:=point(0,0);
saisir("n",n);

for (j:=1;j<=n;j++){
B:=rotation(0,2*pi/n,A);
segment(A,B);
A:=B;
};

J'obtiendrai mon isocagone? :D

Pierre

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

Re: Problème (surement idiot) avec "for"

Message par parisse » dim. nov. 29, 2009 4:57 pm

Oui, ca ouvrira automatiquement la fenetre DispG avec le polygone. Vous aurez meme intérêt à terminer par :; au lieu de ; pour ne pas afficher un graphe en réponse.
Attention, dans DispG, les objets apparaissent sans légende, sauf si elles ont été explicitement indiquées, par exemple
O:=point(0,0,legende="O");
Je mets tout ça à jour demain, avec le debogueur qui ne crashe pas (contrairement à la version de ce week-end), et une bulle d'aide (tooltip) qui affichera la syntaxe de la commande lorsqu'on tape la parenthèse ouvrante qui suit.

bipbip1313
Messages : 12
Inscription : sam. oct. 13, 2007 7:45 am
Localisation : Albertville

Re: Problème (surement idiot) avec "for"

Message par bipbip1313 » lun. nov. 30, 2009 11:45 am

Réellement impressionné par la qualité du SAV! :P

Merci!

Répondre