[C]problème pucle langage C

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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...
    1. 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);
      
      }
      1. Modérateur
        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
      2. 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.
      3. Modérateur
        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);
        }