[C]problème pucle langage C

Fermé
Sportif_C - 23 juil. 2011 à 14:33
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 23 juil. 2011 à 18:06
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);

}
A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
23 juil. 2011 à 14:52
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
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
23 juil. 2011 à 16:16
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
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
23 juil. 2011 à 18:06
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