Ou est l'erreur : boucles imbriquées [Résolu]

Signaler
Messages postés
9
Date d'inscription
jeudi 26 juin 2008
Statut
Membre
Dernière intervention
14 juillet 2008
-
Messages postés
9
Date d'inscription
jeudi 26 juin 2008
Statut
Membre
Dernière intervention
14 juillet 2008
-
le compilateur ne mentionne aucune "error" ni "warning"
pourtant j'ai fait le programme pour que le valeur de S[N][M] changent!!!
voici le code ( merci pour votre temps)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<math.h>
#define N 5
#define M 8
#define Ls 12

floatalea(floatu,floatv);
floatfonc(float*x,intn);

intmain()
{
srand(2008);
inti,k,count;
floatlanda1,landa2,longeur;
floatY[M][N],S[M][N];
floata[N]={0,1,3,-5,-10},b[N]=
{
10,18,19,11,21};

for(i=0;i<M;i++)
{
for(k=0;k<N;k++)
{
S[i][k]=alea(a[k],b[k]);

}
}
printf("\n\n");

printf("Col1\t\tCol2\t\tCol3\t\tCol4\t\tCol5\n");
for(i=0;i<M;i++)
{
for(k=0;k<N;k++)
{
printf("%f\t",S[i][k]);

}
printf("\n");
}

for(i=0;i<M;i++)
{
for(k=0;k<N;k++)
{
landa1=alea(0,1);
while(count<Ls)
{
Y[i][k]=S[i][k];
landa2=alea(0,1);
if(landa1>0.5)
{
Y[i][k]=Y[i][k]+landa2*longeur;
}
else
{
Y[i][k]=Y[i][k]-landa2*longeur;
}
if(fonc(Y[i],N)<fonc(S[i],N))

{
S[i][k]=Y[i][k];
count=Ls-1;
}
count=count+1;
}
}
}

printf("\n\nCol1\t\tCol2\t\tCol3\t\tCol4\t\tCol5\n");
for(i=0;i<M;i++)
{
for(k=0;k<N;k++)
{
printf("%f\t",S[i][k]);

}
printf("\n");
}

}
floatalea(floatu,floatv)
{
return(float)(u+((float)rand()/RAND_MAX*(v-u)));
}

floatfonc(float*x,intn)
{
inti;
floatval=0.0,t1=0.0,t2=0.0;

for(i=0;i<n;i++)
{
t1+=pow((x[i]-1.0),2.0);
}
for(i=1;i<n;i++)
{
t2+=(x[i]*x[i-1]);
}
val=t1-t2;

returnval;
}

10 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Et bien, il y a quelque petites choses:

landa1 = alea(0,1);
landa2 = alea(0,1);

J'ignore comment est fait alea mais si ces lignes donnent toujours le même résultat, je n'en vois pas trop l'utilité.

De plus, si landa1 est toujours inférieur à 0.5

if(landa1 > 0.5)

sera toujours faux.

if(fonc(Y[i],N)<fonc(S[i],N))

Je me trompe ou le tableau Y[i] n'est pas remplit lors de l'appel de la fonction (du moins, tant que que k < N-1) ? Dans ce cas, fonc ne risque t-elle pas de retourner un résultat biaisé ?

C++ (@++)<!--
Messages postés
14745
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 juillet 2020
92
Hello,
Problème de parenthèses dans la fonction alea peut-être?
returnu+((float)rand()/RAND_MAX)*(v-u);

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
9
Date d'inscription
jeudi 26 juin 2008
Statut
Membre
Dernière intervention
14 juillet 2008

 des espaces ont sautés lorsque j'ai poster le code ( exemple "returnval" à la place de "return val" !!)
non ce n'est pas la fonction alea qui pose problème, je soupçonne lol la boucle while et les deux if à l'intérieur.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
1
srand(time(0)); ???

D@runia
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Salut

En principe il suffit de lire le message d'erreur à savoir ici: "la variable count est utilisée sans avoir été initialisée"



A+
Mon site internet : http://pistol.petesampras.free.fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Quel est le problème au fait ? Qu'est-ce que ton code ne fait pas correctement. Cette information nous aiderais probablement bien plus.

Aussi, comme précisé par darunia:
srand(2008);
ne te générera pas une suite très aléatoire de nombre. La même suite sortira d'une exécution du code à l'autre.

C++ (@++)<!--
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
1
Mouais, je suis d'accord avec SAKingdom, on propose des solutions mais on est pas forcement sur de nous, tout simplement parce qu'on a pas vraiment compris le souci (enfin pour moi c'est le cas !).

D@runia
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Oops j'avais pas vu le message de pete. count n'est, en effet, pas initialisé avant son utilisation dans la boucle
while(count < Ls)

C++ (@++)<!--
Messages postés
9
Date d'inscription
jeudi 26 juin 2008
Statut
Membre
Dernière intervention
14 juillet 2008

Bonsoir à tous,
je viens d'initialiser count =1; // rien ne se passe non plus
srand(2008) effectivement je veux avoir la même suite
j'essaie de coder un algorithme mathématique de recherche de la solution minimale d'une fonction donnée :  les S[M][N] est la matrice des coordonnées ( M vecteurs ligne de N coordonées chacun : dans l'espace (x,y,z), un vecteur donné aura trois coordonnées x, y et z ).

initialement je stock les coordonnées d'un vecteur i : S[i][k] dans Y[i][k], ensuite pour un i donné je modifie  Y[i][k] et je calcule fonc(Y[i]) si j'obtient meilleure solution je garde ce vecteur dans S[i].
probleme : à la fin du programme j'obtient les meme valeure initiales de S[i][k] les memes !!!! comme si le block  for{....} ne fait rien : surement une erreur de ma part.
Messages postés
9
Date d'inscription
jeudi 26 juin 2008
Statut
Membre
Dernière intervention
14 juillet 2008

Salut SAKingdom, et bien vous avez raison : les éléments  Y[i][k] ne sont pas tous initialisé. normalement je devrais le faire avant avec un boucle for;
UN GRAND MERCI.