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

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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