probleme de bloucle for...

probleme de bloucle for... - Java - Programmation

Marsh Posté le 13-01-2006 à 15:32:25    

Voila, j'ai le constructeurs suivant
(oui, je sais que ce n'est pas forcement une bonne idée de mettre tout ça dans le constructeur, mais c'est pour mes test)
 

Code :
  1. private double coefX = Double.POSITIVE_INFINITY ;
  2. private double coefY = Double.POSITIVE_INFINITY ;
  3. private double origineX = Double.POSITIVE_INFINITY;
  4. private double origineY = Double.POSITIVE_INFINITY;
  5. public Echelle(ArrayList<Courbe> lc){
  6.  double xMax, yMax, xMin, yMin;
  7.  int taille = lc.size();
  8.  int rangXMax = 0, rangYMax = 0, rangXMin = 0, rangYMin = 0;
  9.  for(int rang=0; rang<taille; rang++){
  10.   System.out.println("\ntest" + rang +"\n"+((Courbe)lc.get(rang)).toString());
  11.   if(((Courbe)lc.get(rangXMax)).getXMax().getX() > ((Courbe)lc.get(rang)).getXMax().getX())continue;
  12.   else rangXMax = rang;
  13.   if(((Courbe)lc.get(rangYMax)).getYMax().getY() > ((Courbe)lc.get(rang)).getYMax().getY())continue;
  14.   else rangYMax = rang;
  15.   if(((Courbe)lc.get(rangXMin)).getXMin().getX() < ((Courbe)lc.get(rang)).getXMin().getX())continue;
  16.   else rangXMin = rang;
  17.   if(((Courbe)lc.get(rangYMin)).getYMin().getY() < ((Courbe)lc.get(rang)).getYMin().getY())continue;
  18.   else rangYMin = rang;
  19.   System.out.println("rangXMax =" +rangXMax);
  20.   System.out.println("rangYMax =" +rangYMax);
  21.   System.out.println("rangXMin =" +rangXMin);
  22.   System.out.println("rangYMin =" +rangYMin);
  23.  }
  24.  xMax = ((Courbe)lc.get(rangXMax)).getXMax().getX();
  25.  yMax = ((Courbe)lc.get(rangYMax)).getYMax().getY();
  26.  xMin = ((Courbe)lc.get(rangXMin)).getXMin().getX();
  27.  yMin = ((Courbe)lc.get(rangYMin)).getYMin().getY();
  28.  System.out.println( "xMax = "+xMax+"\n"+
  29.     "yMax = "+yMax+"\n"+
  30.     "xMin = "+xMin+"\n"+
  31.     "yMin = "+yMin+"\n" );
  32. }


 
L'objet ArrayListe que je met en parametre contient deux objet Courbe.
A l'execution, j'obtient ceci:

Citation :


test0
PointMesure[10.0, 45.0]
PointMesure[100.0, 40.0]
PointMesure[1000.0, 20.0]
PointMesure[10000.0, 30.0]
PointMesure[100000.0, 0.0]
 
rangXMax =0
rangYMax =0
rangXMin =0
rangYMin =0
 
test1
PointMesure[1.0, 300.0]
PointMesure[10.0, 500.0]
 
xMax = 100000.0
yMax = 500.0
xMin = 1.0
yMin = 0.0


 
Je rentre une premiere fois dans la boucle for et execute toutes les lignes.
a la deuxieme fois (deuxieme objet Courbe) il rentre dans la boucle, execute la premiere ligne, mais zap totalement les System.out.println de fin...  
 
Moi pas comprendre!
 

Reply

Marsh Posté le 13-01-2006 à 15:32:25   

Reply

Marsh Posté le 13-01-2006 à 16:33:25    

blaise_laporte a écrit :

...
Je rentre une premiere fois dans la boucle for et execute toutes les lignes.
a la deuxieme fois (deuxieme objet Courbe) il rentre dans la boucle, execute la premiere ligne, mais zap totalement les System.out.println de fin...  
 
Moi pas comprendre!


 
Pour moi, les 2 itérations de la boucle se passent bien. C'est juste que ta 2ème courbe ne contient que 2 points.
 
PS : ton code est totallement illisible, utilise des variables locales au lieu d'apeler 46 fois ((Courbe)lc.get(rangXMax)).getXMax().getX()
 
ex:

Code :
  1. int taille = lc.size();
  2.     // plutot que de travailler avec le rang on utilise directement les objets
  3.     Courbe rangXMax = (Courbe) lc.get(0);
  4.     Courbe rangYMax = (Courbe) lc.get(0);
  5.     Courbe rangXMin = (Courbe) lc.get(0);
  6.     Courbe rangYMin = (Courbe) lc.get(0);
  7.     // NB : on commence la boucle à 1
  8.     for (int rang = 1; rang < taille; rang++) {
  9.       // courbe courrante
  10.       Courbe courbe = (Courbe) lc.get(rang);
  11.       System.out.println("\ntest" + rang + "\n" + courbe.toString());
  12.       if (rangXMax.getXMax().getX() > courbe.getXMax().getX()) {
  13.         continue;
  14.       } else {
  15.         rangXMax = courbe;
  16.       }
  17.       if (rangYMax.getYMax().getY() > courbe.getYMax().getY()) {
  18.         continue;
  19.       } else {
  20.         rangYMax = courbe;
  21.       }
  22.       if (rangXMin.getXMin().getX() < courbe.getXMin().getX()) {
  23.         continue;
  24.       } else {
  25.         rangXMin = courbe;
  26.       }
  27.       if (rangYMin.getYMin().getY() < courbe.getYMin().getY()) {
  28.         continue;
  29.       } else {
  30.         rangYMin = courbe;
  31.       }
  32.       System.out.println("rangXMax =" + rangXMax);
  33.       System.out.println("rangYMax =" + rangYMax);
  34.       System.out.println("rangXMin =" + rangXMin);
  35.       System.out.println("rangYMin =" + rangYMin);
  36.     }
  37.     double xMax = rangXMax.getXMax().getX();
  38.     double yMax = rangYMax.getYMax().getY();
  39.     double xMin = rangXMin.getXMin().getX();
  40.     double yMin = rangYMin.getYMin().getY();
  41.     System.out.println(
  42.       "xMax = " + xMax + "\n"
  43.       + "yMax = " + yMax + "\n"
  44.       + "xMin = " + xMin + "\n"
  45.       + "yMin = " + yMin + "\n" );


 

Reply

Marsh Posté le 13-01-2006 à 17:02:13    

Merci pour les conseil de lisibilité. C'est des reflexes que j'ai pas encore aquis.
Du coup, mon code donne ceci:

Code :
  1. public Echelle(ArrayList<Courbe> lc){
  2.  double xMax, yMax, xMin, yMin;
  3.  Courbe courbeXMax = (Courbe) lc.get(0);
  4.  Courbe courbeYMax = (Courbe) lc.get(0);
  5.  Courbe courbeXMin = (Courbe) lc.get(0);
  6.  Courbe courbeYMin = (Courbe) lc.get(0);
  7.  int taille = lc.size();
  8.  int rangXMax = 0, rangYMax = 0, rangXMin = 0, rangYMin = 0;
  9.  for(int rang=0; rang<taille; rang++){
  10.   // courbe courrante
  11.   Courbe courbe = (Courbe) lc.get(rang);
  12.   System.out.println("\ntest" + rang +"\n"+(courbe.toString()));
  13.   if(courbeXMax.getXMax().getX() > courbe.getXMax().getX())continue;
  14.   else courbeXMax = courbe;
  15.   if(courbeYMax.getYMax().getY() > courbe.getYMax().getY())continue;
  16.   else courbeYMax = courbe;
  17.   if(courbeXMin.getXMin().getX() < courbe.getXMin().getX())continue;
  18.   else courbeXMin = courbe;
  19.   if(courbe.getYMin().getY() < courbe.getYMin().getY())continue;
  20.   else courbeYMin = courbe;
  21.   System.out.println("rangXMax =" +courbeXMax.getXMax().getX());
  22.   System.out.println("rangYMax =" +courbeYMax.getYMax().getY());
  23.   System.out.println("rangXMin =" +courbeXMin.getXMin().getX());
  24.   System.out.println("rangYMin =" +courbeYMin.getYMin().getY());
  25.  }
  26.  xMax = courbeXMax.getXMax().getX();
  27.  yMax = courbeYMax.getYMax().getY();
  28.  xMin = courbeXMin.getXMin().getX();
  29.  yMin = courbeYMin.getYMin().getY();
  30.  System.out.println( "xMax = "+xMax+"\n"+
  31.     "yMax = "+yMax+"\n"+
  32.     "xMin = "+xMin+"\n"+
  33.     "yMin = "+yMin+"\n" );
  34. }


 
mais en sortie j'ai de nouveau:

Citation :


test0
PointMesure[10.0, 45.0]
PointMesure[100.0, 40.0]
PointMesure[1000.0, 20.0]
PointMesure[10000.0, 30.0]
PointMesure[100000.0, 0.0]
 
rangXMax =100000.0
rangYMax =45.0
rangXMin =10.0
rangYMin =0.0
 
test1
PointMesure[1.0, 300.0]
PointMesure[10.0, 500.0]
 
xMax = 100000.0
yMax = 45.0
xMin = 10.0
yMin = 0.0


 
Le trie ne ce fais pas corectement (yMax devrait etre 500.0 et xMin 1.0) de même que les System.out.println a la fin de la boucle for ne s'execute pas.

Reply

Marsh Posté le 13-01-2006 à 17:09:44    

J'ai la nette impression que tu n'as pas compris le but de la commande "continue".
 
"Continue" ça va directement à la fin de l'itération de boucle actuelle, pour passer au prochain "tour", ça ne veut pas dire qu'on continue à exécuter le code actuel (ce qui n'aurait aucun intérêt [:pingouino])
 
Résultat, dès qu'il a un test qui réussit (pas de modifications à effectuer sur un paramètre) il saute à la fin du for et passe au prochain tour (ou à la fin de la boucle si la liste de courbes est terminée) [:spamafote]
 
Et accessoirement ya des trucs qu'on appelle les débuggers, ça marche vachement bien [:pingouino]


Message édité par masklinn le 13-01-2006 à 17:10:25

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 13-01-2006 à 17:25:46    

En effet, j'avais pas compris continue...
 
Pour ce qui est des debuggers, j'ai essayé une fois, mais j'y conprenai que dalle. Mais j'était vraiment newbies en progra (si si, plus que maintenant :D) je vais essayé de m'y remettre.
 
Merci!

Reply

Marsh Posté le 13-01-2006 à 19:30:49    

à la place de tes continue tu fais ça :

Code :
  1. if(courbeXMax.getXMax().getX() <= courbe.getXMax().getX()) courbeXMax = courbe;
  2. if(courbeYMax.getYMax().getY() <= courbe.getYMax().getY()) courbeYMax = courbe;
  3. if(courbeXMin.getXMin().getX() >= courbe.getXMin().getX()) courbeXMin = courbe;
  4. if(courbe.getYMin().getY() >= courbe.getYMin().getY()) courbeYMin = courbe;


 
tes continue zappent forcément les affichages, donc il faut les virer, et inverses le test (> devient <=, etc.)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 13-01-2006 à 19:59:17    

trevor a écrit :

et inverses le test (> devient <=, etc.)


Ou alors il remplace if(condition) par if(!condition) [:spamafote]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 13-01-2006 à 21:16:40    

aussi oui :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed