Page 1 sur 1
Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 2:14 pm
par bipbip1313
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
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 3:31 pm
par parisse
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;
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 3:54 pm
par bipbip1313
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
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 5:32 pm
par parisse
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).
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 6:11 pm
par alb
comment modifier ce programme pour nommer les sommets A0,A1,...?
D'avance merci.
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 23, 2009 7:01 pm
par parisse
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;
Re: Problème (surement idiot) avec "for"
Publié : mar. nov. 24, 2009 6:54 am
par bipbip1313
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
Re: Problème (surement idiot) avec "for"
Publié : mar. nov. 24, 2009 7:39 am
par parisse
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).
Re: Problème (surement idiot) avec "for"
Publié : mar. nov. 24, 2009 7:49 am
par parisse
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.
Re: Problème (surement idiot) avec "for"
Publié : ven. nov. 27, 2009 10:09 am
par parisse
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...)
Re: Problème (surement idiot) avec "for"
Publié : dim. nov. 29, 2009 3:44 pm
par bipbip1313
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?
Pierre
Re: Problème (surement idiot) avec "for"
Publié : dim. nov. 29, 2009 4:57 pm
par parisse
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.
Re: Problème (surement idiot) avec "for"
Publié : lun. nov. 30, 2009 11:45 am
par bipbip1313
Réellement impressionné par la qualité du SAV!
Merci!