Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart

intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009 - 15 déc. 2009 à 19:15
intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009 - 18 déc. 2009 à 13:24
Bonjour à tous

Voila le topo :

J'ai un tableau T2[i] qui contient des floatants.
Je recherche pour quel "i" j'ai cette condition de réalisée : Tup-ecart*0.5 <T2[i]< Tup-ecart*0.5 (alpha)
"Tup", "ecart" sont des floatants, paramètres.

J'ai réussi a trouver le "i", mais j'ai été obligé de modifié manuellement l'écart pour que la condition soit "vrai".
Je voudrais qu'on précise un ecart, très petit, dès le début, et à chaque fois que la condition (alpha) n'est pas réalisée pour tous les "i", on multiplie l'écart par 10.

Alors j'ai fait ceci, mais sans résultat :

int find_Tup2(double tab[],double Tup,double ecart0)
{
int i=(nombre_de_valeurs)/2,j=0,p=0;double Tup2=0,ecart;
ecart= ecart0;

while(j<5)
{
ecart=ecart*pow(10,j);
for(i;i<nombre_de_valeurs;i++)
{
if ((tab[i]>Tup-ecart*0.5)&&(tab[i]<Tup+ecart*0.5)) {p=i;}
// printf ("p est %d\n",p);
// printf ("ecart est %lf\n",ecart);
// printf ("i est %i\n",i);
}
}

printf ("Le i qui correspond a T_up dans le tableau T2 est %d\n",p);
printf ("L'ecart entre T_up et T_up2 le plus petit possible est %lf\n",ecart);
printf ("T_up2 = %lf\n",tab[p]);
return p;
}

Si quelqun a une idée, elle est la bienvenue !!

Merci à tous
@+

Jonathan

10 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
16 déc. 2009 à 08:06
Bonjour,

Tu devrais présenter ton code un peu mieux, aller à la ligne après les ";" ...

1) while j : à la fin du bloc, j n'est pas modifié, ça pourrait tourner indéfiniment si tu n'avais pas mis par erreur le return (voir point 2)

2) le bloc de printf+return devrait se trouver dans un test "si j'ai trouvé la bonne valeur de i", par exemple en mettant p= -1; avant la boucle i et en vérifiant si p>= 0 après.

3) ta boucle i : pas d'initialisation de i, alors si tu faisait un second passage dans la boucle sur j, tu verrais que i reprends là où il avait fini la fois d'avant. Bizarre l'initialisation de i à nombre_de_valeurs/2. Si nombre_de_valeur vaut zéro ce n'est pas gênant, mais c'est bizarre quand même.

J'arrête là pour l'instant.

thip
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
16 déc. 2009 à 08:28
tpoinsot,
tu as mal analysé, si j'ai bien les yeux en face des trous (pas sûre à cette heure matinale ) le return est en dehors du while !!! (le 'if' est sur une seule ligne) Donc ca doit boucler indéfiniement.

Et utilisez la balise de code !! Ca le rend plus lisible !
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
16 déc. 2009 à 08:36
Exact : c'est moi qui n'ai pas les yeux en face des trous.

Donc :

1) ça tourne indéfiniment, j toujours < 5

2) supprimé

3) idem

thip
0
intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009
16 déc. 2009 à 15:03
Bonjour


MERCI !!!!

j'ai modifié le code comme tu me l'as conseillé. En particulier l'iniatialisation de i !
Je pensais qu'en redémarrant la boucle il reprennait la valeur initiale de i, mais ce ne marche pas comme çà !
Je m'en souviendrai.

D'ailleurs pour ce qui est de l'initialisation a nombre_de_valeurs/2, c'est normal, j'ai un graph de solutions avec une symetrie, et j'ai donc découpé l'acquisition des données sur 2 tableaux de 0 à nombre_de_valeurs/2 et nombre_de_valeurs/2 à nombre_de_valeurs, pour exploiter cette symetrie. Et ca marche bien !!

J'ai mis le printf+return dans un if !
J'ai remplacé la boucle while sur j par une boucle for sur j.

En revanche mon j, fait des sauts 2 en 2. Je sais c'est normal il recoit j++ et j=j+1; quand il rentre dans la boucle for, mais si je supprime j=j+1. C'est comme si il ne passait plus dans la boucle for sur i.

Tu as une idée ?

Voila ce que j'obtiens:


int find_Tup2(double tab[],double Tup,double ecart0)
{
int i,j=0,p=0;
double Tup2=0,ecart;
ecart= ecart0;

for(j;j<=5;j++)
{
ecart=ecart*pow(10,j);
i=(nombre_de_valeurs)/2;

for(i;i<nombre_de_valeurs;i++)
{
if ((tab[i]>Tup-ecart*0.5)&&(tab[i]<Tup+ecart*0.5)) {p=i;}
}
printf ("j est %i\n",j);
j=j+1;
}
if (p!=0)
{printf ("Le i qui correspond a T_up dans le tableau T2 est %d\n",p);
printf ("L'ecart entre T_up et T_up2 le plus petit possible est %lf\n",ecart);
printf ("T_up2 = %lf\n",tab[p]);
printf ("X_up2 = %lf\n",X2[p]);
return p;
}

}

Encore merci

Jonathan
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
16 déc. 2009 à 16:00
Remet ton code en forme, c'est mieux pour tout le monde (on arrive à lire)

Attention au for : n'écris pas
j=0;
for (j;... 
mais
for (j=0; ...


Je ne vois pas pourquoi tu ne repasses pas dans la boucle j si tu retire j=j+1 !!!
essaie ça, avec le printf dans la boucle i, tu verras mieux

int find_Tup2(double tab[],double Tup,double ecart0) 
{ 
    int    i, j, p=0; 
    double Tup2=0; // A quoi ça sert ?
    double ecart = ecart0; 

    for(j=0; j<=5; j++) 
    { 
        ecart=ecart*pow(10,j); 
        for(i=(nombre_de_valeurs)/2; i<nombre_de_valeurs; i++) 
        { 
            printf ("j est %d,  i = %d\n", j, i); 
            if ( (tab[i]>Tup-ecart*0.5) && (tab[i]<Tup+ecart*0.5) )
            {
                p=i;
                break; // on s'arrête à la 1ere valeur trouvée
            } 
        } 
        //printf ("j est %i\n",j); 
        //j=j+1; 
    } 
    if (p!=0) 
    {
        printf ("Le i qui correspond a T_up dans le tableau T2 est %d\n",p); 
        printf ("L'ecart entre T_up et T_up2 le plus petit possible est %lf\n",ecart); 
        printf ("T_up2 = %lf\n",tab[p]); 
        printf ("X_up2 = %lf\n",X2[p]); 
        return p; 
    } 
} 




thip
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
16 déc. 2009 à 16:02
oubli : le return ne doit pas être dans le if, ou alors il faut faire
else return -1; // pas trouvé


thip
0
intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009
16 déc. 2009 à 17:43
Merci pour ton aide !!!!!!!!!!!!

J'ai exécuté le code avec les modifs que tu as apporté. Ca marche presque !

Voici le résultat en image :



La bonne valeur qu'il doit trouver pour i est i=9040, avec cette valeur,l' ecart=0.01 est minimum.
nombre de valeurs/2 = 6392; et nombre de valeurs 12784. Et au début je rentre un ecart0=0.000 000 1

Tout va bien jusqu'a j=3et i=9040, le pb c'est qu'il retourne dans la boucle 2 fois pour j=4, j=5,et trouve que i=6392 soit nombre_de_valeurs/2 soit encore l'initialisation de la boucle for sur i.

En fait il repasse dans la boucle j 2 fois, après le break de la boucle i. Il faudrait qu'il arrête la boucle i et la boucle j quand il a la 1ere valeur qui verifie la condition. J'ai essayé de positioner un break; sans résultat.

Voila le code exécuté :

int find_Tup2(double tab[],double Tup,double ecart0)
{
    int    i, j, p=0;
    double Tup2=0; // A quoi ça sert ? c'est pour plus tard.
    double ecart = ecart0;

    for(j=0; j<=5; j++)
    {
        ecart=ecart*pow(10,j);
        for(i=(nombre_de_valeurs)/2; i<nombre_de_valeurs; i++)
        {
            printf ("j est %d,  i = %d\n", j, i);
            if ( (tab[i]>Tup-ecart*0.5) && (tab[i]<Tup+ecart*0.5) )
            {
                p=i;
                break; // on s'arrête à la 1ere valeur trouvée
            }

        }

        //printf ("j est %i\n",j);
        //j=j+1;
    }
    if (p!=0)
    {
        printf ("Le i qui correspond a T_up dans le tableau T2 est %d\n",p);
        printf ("L'ecart entre T_up et T_up2 le plus petit possible est %lf\n",ecart);
        printf ("T_up2 = %lf\n",tab[p]);
        printf ("X_up2 = %lf\n",X2[p]);
        return p;
    }
    else return -1;

}


Merci

Jonathan
0
intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009
16 déc. 2009 à 21:04
j'ai trouvé une astuce, mais c'est de la bricole :

Dans la boucle if je rajoute ceci


if ((tab[i]>Tup-ecart*0.5)&&(tab[i]<Tup+ecart*0.5))
            {
                p=i;jp=j;// je stocke pour quel j on a atteint la condition vraie
                j=9;// je mets un j> jmax de la boucle
                break;




Tu as mieux ?

Jonathan
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
17 déc. 2009 à 12:30
ça fonctionne c'est le principal.
break ne casse qu'un niveau, et plutôt que j=9 tu peux faire
    for(j=0; j<=5; j++)
    {
        ecart=ecart*pow(10,j);
        for(i=(nombre_de_valeurs)/2; i<nombre_de_valeurs; i++)
        {
            printf ("j est %d,  i = %d\n", j, i);
            if ( (tab[i]>Tup-ecart*0.5) && (tab[i]<Tup+ecart*0.5) )
            {
                p=i;
                break; // on s'arrête à la 1ere valeur trouvée
            }

        }

        if ( p!=0 )
            break;
    }


ou encore

    for(j=0; j<=5 && p==0; j++)
    {
        ecart=ecart*pow(10,j);
        for(i=(nombre_de_valeurs)/2; i<nombre_de_valeurs && p==0; i++)
        {
            printf ("j est %d,  i = %d\n", j, i);
            if ( (tab[i]>Tup-ecart*0.5) && (tab[i]<Tup+ecart*0.5) )
            {
                p=i;
            }
        }
    }


et pendant qu'on y est

    ecart = 1;
    for(j=0; j<=5 && p==0; j++)
    {
        for(i=(nombre_de_valeurs)/2; i<nombre_de_valeurs && p==0; i++)
        {
            printf ("j est %d,  i = %d\n", j, i);
            if ( (tab[i]>Tup-ecart*0.5) && (tab[i]<Tup+ecart*0.5) )
            {
                p=i;
            }
        }
        ecart *= 10;
    }


thip
0
intrication Messages postés 5 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 18 décembre 2009
18 déc. 2009 à 13:24
Merci beaucoup !!

Tu as été d'une aide précieuse !

J'espère surtout retenir les erreurs que j'ai faites.



A+

Merci encore

Jonathan
0
Rejoignez-nous