parisse a écrit :La raison derrière ce problème c'est que en interne, segment, demi-droite, droite et vecteur sont codés de manière identique, avec un attribut secondaire (qui gère le type), ce qui permet d'unifier par exemple la recherche d'intersections. Il n'est donc pas possible de changer le fait qu'un segment passant par 2 points confondus sera indéfini.
Pour le P.S., avez-vous des exemple de ligne de commande qui ne marchent pas (ou qui ne tiennent pas compte des attributs)?
C'est ce que je craignais. J'ai donc modifier mon programme en rajoutant un test sur les segments si segment égal UNDEF alors je donne la valeur du point.
Pour l'exemple, voici la version originale avec en commentaire la nouvelle version :
Code : Tout sélectionner
repete_lancers(n,p):={
local j,k,eff,freq,batons,points,result;
// j : numéro de la simulation
// result : nombre de "Pile" dans la simulation
// eff[k] : nombre de fois où l'on obtient k "Pile" au cours des 10 000 simulations
// freq[k] : fréquence d'obtention de k "Pile" au cours des 10 000 simulations
eff:=[0$26]; // On initialise la liste eff avec 26 fois la valeur 0
freq:=[0$26]; // On initialise la liste freq avec 26 fois la valeur 0
batons:=[]; // On définit une liste vide nommée batons pour la représentation graphique
points:=[]; // On définit une liste vide nommée points pour la représentation graphique
pour j de 1 jusque 10000 faire
result:=lancers(n,p);
eff[result]:=eff[result]+1;
fpour
afficher("Au cours de 10 000 simulations de lancers, on a obtenu :");
freq:=eff/10000;
//pour k de 0 jusque n faire
// si segment(point(k,0),point(k,freq[k]))==undef alors batons:=batons,point(k,0) sinon batons:=batons,segment(point(k,0),point(k,freq[k])) fsi;
//fpour;
batons:=seq(segment(point(k,0),point(k,freq[k])),k,0,25,1);
points:=seq(point(k,freq[k]),k,0,n,1);
afficher(freq);
affichage(batons,vert+line_width_4),affichage(points,rouge+point_width_4);
}
:;
et la fonction lancers(n,p) :
Code : Tout sélectionner
lancers(n,p):={
local k,pile;
// k : numéro du lancer
// pile : Nombre de "Pile" obtenus
pile := 0;
pour k de 1 jusque n faire
si alea(0,1)<p alors pile := pile + 1 fsi;
fpour;
retourne(pile);
}
:;
Dans le code tel quel, j'ai le tracé des segments mais sans les attributs.
Si j'inverse les commandes :
Code : Tout sélectionner
affichage(points,rouge+point_width_4),affichage(batons,vert+line_width_4);
au lieu de
Code : Tout sélectionner
affichage(batons,vert+line_width_4),affichage(points,rouge+point_width_4);
alors aucun tracé. Je peux comprendre ce second cas mais pour le premier, j'ai du mal à comprendre ce qui se passe (soit la commande est exécutée soit elle ne l'ai pas, me semble t-il).