[C]problème pucle langage C

Sportif_C -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

J'ai un problème avec les boucles dans ce petit bout de programme. En fait, je cherche à sortir des boucle dès que modifie ==1.
Là, mon programme ne s'arréte pas :(. Je ne vois pas pourquoi!
Pourriez-vous m'aider à identifier eet à la corriger?
Merci par avance.
void calculeCircuitExchangeNouveau2(GestionNoeuds *pGestionNoeuds, double **distanceEntreNoeuds, Circuit *pCircuit)
 {
     int i, j;

     int modifie;

     double cout = 0;


       do
        {
               modifie=0;
               i=1;

               do
               {
                    j=i+1;
                    do
                    {

                          cout = differenceCout(i,j,distanceEntreNoeuds,pCircuit);

                          if(cout < 0.0)
                         {

                              echangeCircuit(i, j, pCircuit );
                              printf("\n");
                              affichageCircuit(pCircuit);
                              
                              if((pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit1>=0 && pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit2 >= 0) && (pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1 <=0 && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2<=0))
                              {
                                   modifie==1;
                                   affichageCircuit(pCircuit);
                              }
                         }
                    }while(j<nbreNoeuds);
                    j++;
               }while(i<nbreNoeuds);
               i++;
          }while(modifie==1);

}

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Je pense que ta principale erreur vient de la ligne modifie==1 dans ton if, qui devrait plutôt être modifie=1.
    Sinon l'usage de boucles for est très certainement à privilégier vu tes calculs :

    void calculeCircuitExchangeNouveau2(GestionNoeuds *pGestionNoeuds, double **distanceEntreNoeuds, Circuit *pCircuit)
    {
        int i, j, modifie;
        do
        {
            modifie=0;
    
            for (i=1;   i<nbreNoeuds; i++)
            for (j=i+1; j<nbreNoeuds; j++)
            {            
                if(differenceCout(i,j,distanceEntreNoeuds,pCircuit) < 0)
                {
                    echangeCircuit(i, j, pCircuit );
                    printf("\n");
                    affichageCircuit(pCircuit);
                    
                    if(    pGestionNoeuds->tableau[pCircuit->tableau[01]].demandProduit1 >=0
                        && pGestionNoeuds->tableau[pCircuit->tableau[01]].demandProduit2 >=0
                        && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1 <=0
                        && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2 <=0)
                    {
                        modifie=1;
                        affichageCircuit(pCircuit);
                    }
                } // if differenceCout<0
            } // for i et j
        }
        while(modifie==1);
    }

    Remarque : vu que tu n'as mis qu'une partie de ton code, je n'ai pas pu vérifier que cela fonctionnait correctement...
    0
  2. Sportif_C
     
    Bonjour,

    J'ai effecté la modification.
    Mais le compilateur maintenant n'entre pas dans la boucle do while :(Du coup il n'exécute pas le programme
    Des idées pour corriger ça?
    Merci par avance de votre aide.
    void calculeCircuitExchangeNouveau2(GestionNoeuds *pGestionNoeuds, double **distanceEntreNoeuds, Circuit *pCircuit)
     {
    	int i, j, k;
    
         int modifie;
    
         double cout = 0;
    
    
           do
            {
                   modifie=0;
    
    
                   for(i=1;i<nbreNoeuds;i++)
                   {
    
                       for(i=j+1;j<nbreNoeuds;j++)
                        {
    
                             printf("i:%d\n",i);
                             printf("j:%d\n",j);
                             cout = differenceCout(i,j,distanceEntreNoeuds,pCircuit);
    
                             printf("cout %lf\n",cout);
    
                             if(cout < 0.0)
                             {
    
                                  echangeCircuit(i, j, pCircuit );
                                  printf("\n");
                                  affichageCircuit(pCircuit);
                                  printf("demandP1[10]:%d\n", pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1 );
                                  printf("demandP1[1]:%d\n", pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit1 );
                                  printf("demandP2[10]:%d\n", pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2 );
                                  printf("demandP2[1]:%d\n", pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit2 );
                                  if((pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit1>=0 && pGestionNoeuds->tableau[pCircuit->tableau[1]].demandProduit2 >= 0) && (pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1 <=0 && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2<=0))
                                  {
                                       modifie=1;
                                       affichageCircuit(pCircuit);
                                  }
                             }
                        }
    
                   }
    
              }while(modifie==1);
    
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si il entre dans la boucle do while, mais c'est au niveau des boucles for que ça coince...
      Tu as mis for(i=j+1;j<nbreNoeuds;j++) au lieu de for(j=i+1;j<nbreNoeuds;j++) comme j'avais mis...
      Comme j n'est pas initialisé, sa valeur est arbitraire, et on a potentiellement j>=nbreNoeud
      0
    2. Sportif_C
       
      Bien vu KX. Merci.
      Maintenant, le problème est que le compilateur après avoir remplacer i de 1 à nbreNoeuds et j de 2 à nbreNoeuds, il me renvoie la dernière valeur meme si la deuxième condition dans ma boucle n'est pas vrai!
      Comment faire pour remédier à ça?Merci encore.
      0
    3. KX Messages postés 19031 Statut Modérateur 3 020
       
      Qu'est-ce que tu veux dire par il me renvoie la dernière valeur ? Ta fonction ne renvoie aucun résultat !
      Personnellement je ne sais pas ce qu'est censé faire ton code, alors il est difficile de savoir sur le fond ce qui peut poser problème... Peut-être qu'avec cet affichage là tu y verras un peu plus clair :

      void calculeCircuitExchangeNouveau2(GestionNoeuds *pGestionNoeuds, double **distanceEntreNoeuds, Circuit *pCircuit)
      {
         int modifie;
         do
         {
            modifie=0;
               
            int i,j;
            for(i=1;  i<nbreNoeuds;i++)
            for(j=i+1;j<nbreNoeuds;j++)
            {
               double cout = differenceCout(i,j,distanceEntreNoeuds,pCircuit);
               printf("i=%d\tj=%d\tcout=%f\n",cout);
               
               if (cout<0)
               {
                  printf("\nEchange %d-%d\n",i,j);
                  printf("Avant\n"); affichageCircuit(pCircuit);
                  echangeCircuit(i, j, pCircuit );
                  printf("Apres\n"); affichageCircuit(pCircuit);
      
                  printf("\nTests\n");
                  printf("demandP1[ 1]=%d\t >=0 ?\n",pGestionNoeuds->tableau[pCircuit->tableau[ 1]].demandProduit1);
                  printf("demandP1[10]=%d\t <=0 ?\n",pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1);
                  printf("demandP2[ 1]=%d\t >=0 ?\n",pGestionNoeuds->tableau[pCircuit->tableau[ 1]].demandProduit2);
                  printf("demandP2[10]=%d\t <=0 ?\n",pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2);
                  
                  if(    pGestionNoeuds->tableau[pCircuit->tableau[ 1]].demandProduit1>=0
                     && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit1<=0
                     && pGestionNoeuds->tableau[pCircuit->tableau[ 1]].demandProduit2>=0
                     && pGestionNoeuds->tableau[pCircuit->tableau[10]].demandProduit2<=0)
                  {
                     modifie=1;
                     //affichageCircuit(pCircuit);
                     printf("Modifie !     modifie==1\n");
                  }
                  else
                  {
                     printf("Non modifie ! modifie==%d\n",modifie);
                  }
               } // if cout
            } // for i,j
         } // do
         while(modifie==1);
      }
      0