[C]problème pucle langage C
Sportif_C
-
KX Messages postés 19031 Statut Modérateur -
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.
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
-
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... -
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); }-
-
-
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); }
-