Ajouter des éléments à une liste.
2 participants
Page 1 sur 1
Ajouter des éléments à une liste.
Bonjour Patrick,
J'envisage de créer une petite animation pour illustrer le crible d'Erathostène.
Mon problème est le suivant :
Je sais que l'instruction
Suis-je clair ?
Merci.
J'envisage de créer une petite animation pour illustrer le crible d'Erathostène.
Mon problème est le suivant :
- Code:
[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i),
Couleur :=[red ,blue,green,cyan], Premier:=[2,3,5,7],
Exclus:=Copy(Premier,1,4),p:=9.5,
SaveAttr(),croix(black,1,p),RestoreAttr(),
L:=[for m from 0 to 90 step 10 do
for n from 1 to 10 do n+m od od],
for m from 0 to 90 step 10 do
for n from 1 to 10 do
Label(n-0.5 +p*i,n+m),
for k from 1 to Nops(Premier) do
if (mod(L[n+m],Premier[k])=0 And (L[n+m]<>Exclus[k]))
then
SaveAttr(),croix(Couleur[k],n,p), RestoreAttr(),
fi,
od,
od,
p:=p-1, od
]
- Code:
[Color:=%1,Ligne([%2-1+(%3-0.5)*i,%2+(%3+0.5)*i],1),
Ligne([%2+(%3-0.5)*i,%2-1+(%3+0.5)*i],1)]
Je sais que l'instruction
- Code:
if (mod(L[n+m],Premier[k])=0 And (L[n+m]<>Exclus[k]))
Suis-je clair ?
Merci.
F.Couvreur- Nombre de messages : 137
Age : 61
Date d'inscription : 10/02/2008
Re: Ajouter des éléments à une liste.
Bonjour Fabrice,
Je te propose ce code qui me paraît un tout petit peu plus simple, j'ai mis le SaveAttr() et le RestoreAttr() dans la macro croix:
La macro prédéfinie Pos permet de savoir si un élément est dans une liste ou non (merci Alphonse), la commande Insert permet d'insérer un élément dans une liste.
PS: normalement on n'a même pas à connaître les premiers entre 1 et 10 pour le crible d'Erathostène, ce qui donnerait par exemple:
Je te propose ce code qui me paraît un tout petit peu plus simple, j'ai mis le SaveAttr() et le RestoreAttr() dans la macro croix:
- Code:
[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i),
Couleur :=[red,blue,green,cyan], Premier:=[2,3,5,7],
for m from 1 to 100 do
Label(mod(m-1,10)+0.5 +(9.5-div(m-1,10))*i,m)
od,
croix(black,1,9.5), Exclus:=Nil,
k:=0,
for z in Premier
do Inc(k,1), x:=z,
for j from 2 to 100/z do
Inc(x,z),
if (Pos(x,Exclus)=Nil) then
croix(Couleur[k], mod(x-1,10)+1, 9.5-div(x-1,10)),
Insert(Exclus,x)
fi
od
od]
La macro prédéfinie Pos permet de savoir si un élément est dans une liste ou non (merci Alphonse), la commande Insert permet d'insérer un élément dans une liste.
PS: normalement on n'a même pas à connaître les premiers entre 1 et 10 pour le crible d'Erathostène, ce qui donnerait par exemple:
- Code:
[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i), Couleur :=[red,blue,green,cyan],
for m from 1 to 100 do
Label(mod(m-1,10)+0.5 +(9.5-div(m-1,10))*i,m)
od,
croix(black,1,9.5), Exclus:=Nil, k:=0, z:=1,
while z<10
do Inc(z,1), x:=z,
if (Pos(x,Exclus)=Nil) then {nombre premier}
SaveAttr(), Inc(k,1), Color:=Couleur[k],
Label(mod(x-1,10)+0.5 +(9.5-div(x-1,10))*i,x), RestoreAttr(),
for j from 2 to 100/z do {on exclut les multiples}
Inc(x,z),
if (Pos(x,Exclus)=Nil) then
croix(Couleur[k], mod(x-1,10)+1, 9.5-div(x-1,10)),
Insert(Exclus,x)
fi
od
fi
od]
Re: Ajouter des éléments à une liste.
Bonsoir Patrick,
Merci pour ton aide. Quelques explications cependant :
- Exclus:=Nil veut dire que la liste Exclus contient une constante sans valeur ?
- for z in Premier
do Inc(k,1), x:=z,
for j from 2 to 100/z do
Inc(x,z),......
Dans la première boucle, on affecte à la variable x la valeur z donc au départ 2, puis dans la deuxième boucle, Inc(x,z) pour affecter à x la valeur 4 ?
100/2 pour éliminer les multiples de 2 ? 100/3 les multiples de 3 ?......
- Pos(x,Exclus)=Nil), cette macro prédéfinie se trouve-t-elle dans la doc ?
J'avais essayé de créer une macro "booléenne" exlus qui prenait deux paramètres :
Merci pour ton aide. Quelques explications cependant :
- Exclus:=Nil veut dire que la liste Exclus contient une constante sans valeur ?
- for z in Premier
do Inc(k,1), x:=z,
for j from 2 to 100/z do
Inc(x,z),......
Dans la première boucle, on affecte à la variable x la valeur z donc au départ 2, puis dans la deuxième boucle, Inc(x,z) pour affecter à x la valeur 4 ?
100/2 pour éliminer les multiples de 2 ? 100/3 les multiples de 3 ?......
- Pos(x,Exclus)=Nil), cette macro prédéfinie se trouve-t-elle dans la doc ?
J'avais essayé de créer une macro "booléenne" exlus qui prenait deux paramètres :
- Code:
[for z in %1 do
if (%2 = z) then 1
else 0
fi
od]
- Code:
[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i),
Couleur :=[red ,blue,green,cyan], Premier:=[2,3,5,7],
Exclus:=Copy(Premier,1,4),p:=9.5,
SaveAttr(),croix(black,1,p),RestoreAttr(),
L:=[for m from 0 to 90 step 10 do
for n from 1 to 10 do n+m od od],
for m from 0 to 90 step 10 do
for n from 1 to 10 do
Label(n-0.5 +p*i,n+m),
for k from 1 to Nops(Premier) do
if (mod(L[n+m],Premier[k])=0 And (not(exclus(Exclus,L[n+m]))))
then
SaveAttr(),croix(Couleur[k],n,p), RestoreAttr(),
Insert(Exclus,L[n+m])
fi,
od,
od,
p:=p-1, od
]
F.Couvreur- Nombre de messages : 137
Age : 61
Date d'inscription : 10/02/2008
Re: Ajouter des éléments à une liste.
F.Couvreur a écrit:Bonsoir Patrick,
Bonjour Fabrice,
Merci pour ton aide. Quelques explications cependant :
- Exclus:=Nil veut dire que la liste Exclus contient une constante sans valeur ?
Cela signifie que Exclus ne contient rien, une liste vide si tu préfères.
- for z in Premier
do Inc(k,1), x:=z,
for j from 2 to 100/z do
Inc(x,z),......
Dans la première boucle, on affecte à la variable x la valeur z donc au départ 2, puis dans la deuxième boucle, Inc(x,z) pour affecter à x la valeur 4 ?
100/2 pour éliminer les multiples de 2 ? 100/3 les multiples de 3 ?......
Oui c'est ça, x va contenir successivement tous les mutiples de z inférieurs ou égaux à 100. La vaariable k ne sert qu'aux couleurs.
- Pos(x,Exclus)=Nil), cette macro prédéfinie se trouve-t-elle dans la doc ?
Pas encore , elle est dans le fichier de macros TeXgraph.mac, voici sa déclaration:
- Code:
Pos = {Pos(affixe, liste, [, epsilon]) renvoie la liste des positions de l'affixe dans la liste, la comparaison se fait à epsilon près.}
[$compt:=0, $epsilon:=if %3=Nil then 0 else %3 fi,
for $z in %2 do
Inc(compt,1),
if abs(z-%1)<=epsilon then compt fi
od];
Il y a aussi Pos3d qui fait la même chose avec les points de l'espace.
J'avais essayé de créer une macro "booléenne" exlus qui prenait deux paramètres :
- Code:
[for z in %1 do
if (%2 = z) then 1
else 0
fi
od]
Celle-ci ne fonctionne pas car elle ne tient pas compte des comparaisons précédentes, et elle renvoie une liste de 0 ou 1 au lieu d'une seule valeur:
- Code:
[$ok:=0, for z in %1 do if not(ok) then ok:=(%2 = z) fi od, ok]
Petit scarabé deviendra grand
PS : ton code est vraiment plus simple, j'enrage ! Mad
Re: Ajouter des éléments à une liste.
Bonjour Patrick,
Ayant un peu de temps, je reviens sur ce fil car je veux maintenant créer une petite animation. J'obtiens pas tout à fait ce que je veux. En effet, je souhaiterai qu'à la frame numéro 3, les croix rouges (multiples de 2) soient visibles, et ainsi de suite. J'ai bien cherché, mais en vain !
Autre petite question : pourquoi dans la macro Initialiser(), j'ai dû indiquer ReCalc() et non pas ReCalc(Grille) pour avoir ma grille de départ, car sinon, en réinitialisant mon animation, j'ai la frame numéro 5 (multiples de 7 pas encore barrés) ?
Ayant un peu de temps, je reviens sur ce fil car je veux maintenant créer une petite animation. J'obtiens pas tout à fait ce que je veux. En effet, je souhaiterai qu'à la frame numéro 3, les croix rouges (multiples de 2) soient visibles, et ainsi de suite. J'ai bien cherché, mais en vain !
Autre petite question : pourquoi dans la macro Initialiser(), j'ai dû indiquer ReCalc() et non pas ReCalc(Grille) pour avoir ma grille de départ, car sinon, en réinitialisant mon animation, j'ai la frame numéro 5 (multiples de 7 pas encore barrés) ?
- Code:
% TeXgraph version 1.94 beta-8
% Fenetre Xmin Xmax Ymin Ymax Xscale Yscale
100#0#10#0#10#1#1##
% Marges gauche droite haut bas cadre gestion_couleur comptgraph
101#0.5#0.5#0.5#0.5#0#1#2##
% Affectation des Variables theta et phi et type de perspective
18##[theta:=0.5236, phi:=1.0472,OriginalCoord(1),IdMatrix(),IdMatrix3D(),
ModelView(ortho)]##
18##InputMac("Animation.mac")##
% Déclaration des Variables Globales
15#z#3##
15#alpha#2##
15#Premier#[2,3,5,7]##
15#Exclus#[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,
60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,9,15,21,27,33,39,
45,51,57,63,69,75,81,87,93,99]##
% Déclaration des Macros
16#MakeFrame#[{code pour dessiner la frame n° %1}
if %1 >1 then Inc(alpha,1),z:=Premier[alpha] ,ReCalc(Marque),
fi
]##
16#OnBeginAnim#[{exécutée au lancement de l'animation}
]##
16#OnEndAnim#[{exécutée à la fin de l'animation}
]##
16#Initialiser#[{valeurs par défaut de vos paramètres}
alpha:=0 ,Exclus:=Nil,z:=Nil,ReCalc()
]##
16#Tempo#1000##
16#NbFrames#5##
16#Nom#"/home/fab/.TeXgraph/eras"##
16#croix#[SaveAttr(),Color:=%1,Ligne([%2-1+(%3-0.5)*i,%2+(%3+0.5)*i],1),
Ligne([%2+(%3-0.5)*i,%2-1+(%3+0.5)*i],1),RestoreAttr()]##
% Déclaration des Eléments graphiques
% Marque (Utilisateur)
18##[tMin:=-5,tMax:=5,DotScale:=1+i]##
14#Marque#[ Couleur :=[red,blue,green,cyan], Premier:=[2,3,5,7],
x:=z,
for j from 2 to 100/z do
Inc(x,z),
if (Pos(x,Exclus)=Nil) then
croix(Couleur[alpha], mod(x-1,10)+1, 9.5-div(x-1,10)),
Insert(Exclus,x)
fi
od
]#
-1##
% Grille (Utilisateur)
18##[tMin:=0,tMax:=10]##
14#Grille#[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i),
for m from 1 to 100 do
Label(mod(m-1,10)+0.5 +(9.5-div(m-1,10))*i,m)
od,
croix(black,1,9.5)]#
-1##
F.Couvreur- Nombre de messages : 137
Age : 61
Date d'inscription : 10/02/2008
Re: Ajouter des éléments à une liste.
Bonjour Fabrice,
Pour ta première question , ce n'est pas Grille qu'il faut redessiner, mais Marque. Pour la suivante, je te propose ceci:
la méthode consiste à chaque frame de redessiner tout depuis la frame 1. Une autre méthode, mais qui me paraît plus lourde, serait de faire un élément graphique par nombre premier, la macro Initialiser cacherait ces éléments, et à chaque frame on montre un élément de plus.
Pour ta première question , ce n'est pas Grille qu'il faut redessiner, mais Marque. Pour la suivante, je te propose ceci:
- Code:
% TeXgraph version 1.94 beta-8.1
% Fenetre Xmin Xmax Ymin Ymax Xscale Yscale
100#0#10#0#10#1#1##
% Marges gauche droite haut bas cadre gestion_couleur comptgraph
101#0.5#0.5#0.5#0.5#0#1#2##
% Affectation des Variables theta et phi et type de perspective
18##[theta:=0.5236, phi:=1.0472,OriginalCoord(1),IdMatrix(),IdMatrix3D(),
ModelView(ortho)]##
18##InputMac("Animation.mac")##
% Déclaration des Variables Globales
15#alpha#0##
15#Premier#[2,3,5,7]##
15#Couleur#[255,16711680,65280,16776960]##
% Déclaration des Macros
16#MakeFrame#[{code pour dessiner la frame n° %1}
if %1>1 then
Inc(alpha,1), ReCalc(Marque)
fi
]##
16#OnBeginAnim#[{exécutée au lancement de l'animation}
]##
16#OnEndAnim#[{exécutée à la fin de l'animation}
]##
16#Initialiser#[{valeurs par défaut de vos paramètres}
alpha:=0, ReCalc(Marque)
]##
16#Tempo#1000##
16#NbFrames#5##
16#Nom#"/home/fab/.TeXgraph/eras"##
16#croix#[SaveAttr(),Color:=%1,Ligne([%2-1+(%3-0.5)*i,%2+(%3+0.5)*i],1),
Ligne([%2+(%3-0.5)*i,%2-1+(%3+0.5)*i],1),RestoreAttr()]##
% Déclaration des Eléments graphiques
% Grille (Utilisateur)
18##[DotScale:=1+i]##
14#Grille#[Fenetre(10*i,10,1+i), Width:=8, Grille(0,1+1*i),
for m from 1 to 100 do
Label(mod(m-1,10)+0.5 +(9.5-div(m-1,10))*i,m)
od,
croix(black,1,9.5)]#
-1##
% Marque (Utilisateur)
18##[tMin:=-5,tMax:=5]##
14#Marque#[Exclus:=Nil,
for k from 1 to alpha do
z:=Premier[k], x:=z,
for j from 2 to 100/z do
Inc(x,z),
if (Pos(x,Exclus)=Nil) then
croix(Couleur[k], mod(x-1,10)+1, 9.5-div(x-1,10)),
Insert(Exclus,x)
fi
od
od
]#
-1##
la méthode consiste à chaque frame de redessiner tout depuis la frame 1. Une autre méthode, mais qui me paraît plus lourde, serait de faire un élément graphique par nombre premier, la macro Initialiser cacherait ces éléments, et à chaque frame on montre un élément de plus.
Re: Ajouter des éléments à une liste.
Bonjour Patrick,
Je découvre le code que tu me proposes à l'instant, merci mais....
Si oui, en indiquant ReCalc(Grille), pourquoi cela ne marche pas ?
Merci.
Je découvre le code que tu me proposes à l'instant, merci mais....
On est bien d'accord que c'est pour cette questionPour ta première question , ce n'est pas Grille qu'il faut redessiner, mais Marque
La macro ReCalc() sert bien à redessiner une figure créée à l'aide d'un élément graphique utilisateur ?Autre petite question : pourquoi dans la macro Initialiser(), j'ai dû indiquer ReCalc() et non pas ReCalc(Grille) pour avoir ma grille de départ, car sinon, en réinitialisant mon animation, j'ai la frame numéro 5 (multiples de 7 pas encore barrés) ?
Si oui, en indiquant ReCalc(Grille), pourquoi cela ne marche pas ?
J'ai cherché à "empiler" les frames les unes sur les autres.la méthode consiste à chaque frame de redessiner tout depuis la frame 1
Merci.
F.Couvreur- Nombre de messages : 137
Age : 61
Date d'inscription : 10/02/2008
Re: Ajouter des éléments à une liste.
F.Couvreur a écrit:La macro ReCalc() sert bien à redessiner une figure créée à l'aide d'un élément graphique utilisateur ?
Pas exactement, la commande ReCalc() (sans argument) réévalue tout comme si tu avais enregistré et rechargé le fichier.
La commande ReCalc(Grille) réévalue l'élément graphique nommé Grille comme si tu l'avais réouvert avec un double-clic et revalider en cliquant sur Ok. Tu suis?
Si oui, en indiquant ReCalc(Grille), pourquoi cela ne marche pas ?
La macro Initialiser modifie la variable alpha qui n'intervient pas dans la définition de l'élément Grille, il ne sert donc à rien de recalculer cet élément! Par contre, l'élément Marque utilise cette variable, il faut donc recalculer cet élément.
Re: Ajouter des éléments à une liste.
Bonjour Patrick,
Désolé de ne répondre que maintenant, mais je suis un peu débordé en ce moment.
Merci pour ta patience car, comme je te l'ai déjà expliqué, je veux comprendre ce que je fais.
Désolé de ne répondre que maintenant, mais je suis un peu débordé en ce moment.
Je crois que oui.La commande ReCalc(Grille) réévalue l'élément graphique nommé Grille comme si tu l'avais réouvert avec un double-clic et revalider en cliquant sur Ok. Tu suis?
Comme alpha a été initialisée à 0, en recalculant l'élément Marque,l'animation démarre avec alpha=0, c'est à dire avec la grille qui est un élément "fixe"?La macro Initialiser modifie la variable alpha
- Code:
if %1>1 then
Inc(alpha,1), ReCalc(Marque)
fi
Merci pour ta patience car, comme je te l'ai déjà expliqué, je veux comprendre ce que je fais.
F.Couvreur- Nombre de messages : 137
Age : 61
Date d'inscription : 10/02/2008
Re: Ajouter des éléments à une liste.
Bonjour Fabrice,
Ta grille est fixe en effet, il ne sert donc à rien de la recalculer. Dans l'interface graphique de TeXgraph les éléments graphiques sont indépendants les uns des autres, on peut en modifier un sans toucher aux autres, c'est exactement ce que l'on fait dans cet exemple. C'est toute la différence avec les logiciels "tout en ligne de commande", où là tu recompiles tout à chaque fois, y compris le chargement des packages...
Absolument. Puisqu'alpha n'est modifié qu'à partir de %1=2.
Comme on aimerait entendre nos élèves nous tenir le même discours !
F.Couvreur a écrit:
Comme alpha a été initialisée à 0, en recalculant l'élément Marque,l'animation démarre avec alpha=0, c'est à dire avec la grille qui est un élément "fixe"?
Ta grille est fixe en effet, il ne sert donc à rien de la recalculer. Dans l'interface graphique de TeXgraph les éléments graphiques sont indépendants les uns des autres, on peut en modifier un sans toucher aux autres, c'est exactement ce que l'on fait dans cet exemple. C'est toute la différence avec les logiciels "tout en ligne de commande", où là tu recompiles tout à chaque fois, y compris le chargement des packages...
Ce code indique bien que la frame 1 est celle qui correspond à alpha= 0 ?
- Code:
if %1>1 then
Inc(alpha,1), ReCalc(Marque)
fi
Absolument. Puisqu'alpha n'est modifié qu'à partir de %1=2.
Merci pour ta patience car, comme je te l'ai déjà expliqué, je veux comprendre ce que je fais.
Comme on aimerait entendre nos élèves nous tenir le même discours !
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|