Ajouter des éléments à une liste.

Voir le sujet précédent Voir le sujet suivant Aller en bas

Ajouter des éléments à une liste.

Message  F.Couvreur le Mar 3 Mar - 17:39

Bonjour Patrick,
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 ne parviens pas à ajouter à la liste Exclus les cases déjà barrées. Ce qui explique que, par exemple, la case 10 soit barrée en vert comme multiple de 5 alors qu'elle devrait l'être en rouge comme multiple de 2.
Je sais que l'instruction
Code:

if (mod(L[n+m],Premier[k])=0 And (L[n+m]<>Exclus[k]))
n'est pas correcte car ma boucle ne parcourt que les quatre premiers éléments de Exclus qui doit en contenir bien plus par la suite.
Suis-je clair ? Very Happy
Merci.

F.Couvreur

Nombre de messages : 137
Age : 53
Date d'inscription : 10/02/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  P.Fradin le Mar 3 Mar - 20:12

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:

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] 

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  F.Couvreur le Mer 4 Mar - 2:20

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 :
Code:

[for z in %1 do
              if (%2 = z) then 1
                  else 0
                  fi
              od]
Puis, j'ai tenté sans succès :
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
 ]               
PS : ton code est vraiment plus simple, j'enrage ! Mad

F.Couvreur

Nombre de messages : 137
Age : 53
Date d'inscription : 10/02/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  P.Fradin le Mer 4 Mar - 11:20

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 Embarassed , 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]


PS : ton code est vraiment plus simple, j'enrage ! Mad
Petit scarabé deviendra grand Laughing

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  F.Couvreur le Dim 15 Mar - 15:19

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) ?
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##
Merci.

F.Couvreur

Nombre de messages : 137
Age : 53
Date d'inscription : 10/02/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  P.Fradin le Dim 15 Mar - 17:07

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:

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.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  F.Couvreur le Lun 16 Mar - 14:51

Bonjour Patrick,
Je découvre le code que tu me proposes à l'instant, merci mais.... Very Happy

Pour ta première question , ce n'est pas Grille qu'il faut redessiner, mais Marque
On est bien d'accord que c'est pour cette question

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) ?
La macro ReCalc() sert bien à redessiner une figure créée à l'aide d'un élément graphique utilisateur ?
Si oui, en indiquant ReCalc(Grille), pourquoi cela ne marche pas ?

la méthode consiste à chaque frame de redessiner tout depuis la frame 1
J'ai cherché à "empiler" les frames les unes sur les autres.
Merci.

F.Couvreur

Nombre de messages : 137
Age : 53
Date d'inscription : 10/02/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  P.Fradin le Lun 16 Mar - 15:16

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.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  F.Couvreur le Mar 17 Mar - 15:17

Bonjour Patrick,
Désolé de ne répondre que maintenant, mais je suis un peu débordé en ce moment.
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?
Je crois que oui.


La macro Initialiser modifie la variable alpha
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"?

Code:
if %1>1 then
  Inc(alpha,1), ReCalc(Marque)
fi
Ce code indique bien que la frame 1 est celle qui correspond à alpha= 0 ?
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 : 53
Date d'inscription : 10/02/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  P.Fradin le Mar 17 Mar - 15:45

Bonjour Fabrice,

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...Laughing


Code:
if %1>1 then
  Inc(alpha,1), ReCalc(Marque)
fi
Ce code indique bien que la frame 1 est celle qui correspond à alpha= 0 ?

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 Laughing!

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Ajouter des éléments à une liste.

Message  Contenu sponsorisé Aujourd'hui à 11:51


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum