begin process at 2012 05 30 19:13:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 15 décembre 2009 à 19:15:03 | Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

intrication

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
mercredi 16 décembre 2009 à 08:06:05 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

tpoinsot


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
mercredi 16 décembre 2009 à 08:28:10 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

fregolo52

Membre Club
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 !
mercredi 16 décembre 2009 à 08:36:59 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

tpoinsot

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
mercredi 16 décembre 2009 à 15:03:40 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

intrication

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
mercredi 16 décembre 2009 à 16:00:55 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

tpoinsot

Remet ton code en forme, c'est mieux pour tout le monde (on arrive à lire)

Attention au for : n'écris pas
Code C/C++ :
j=0;
for (j;... 
mais
Code C/C++ :
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

Code C/C++ :
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
mercredi 16 décembre 2009 à 16:02:58 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

tpoinsot

oubli : le return ne doit pas être dans le if, ou alors il faut faire
Code C/C++ :
else return -1; // pas trouvé


thip
mercredi 16 décembre 2009 à 17:43:19 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

intrication

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é :

Code C/C++ :
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
mercredi 16 décembre 2009 à 21:04:06 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

intrication

j'ai trouvé une astuce, mais c'est de la bricole :

Dans la boucle if je rajoute ceci

Code C/C++ :

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
jeudi 17 décembre 2009 à 12:30:34 | Re : Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.

tpoinsot

ça fonctionne c'est le principal.
break ne casse qu'un niveau, et plutôt que j=9 tu peux faire
Code C/C++ :
    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

Code C/C++ :
    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

Code C/C++ :
    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

1 2

Cette discussion est classée dans : tableau, printf, ecart, lf, tup


Répondre à ce message

Sujets en rapport avec ce message

Printf bizarre [ par x0s ] Bonjour Amis codeurs,J'ai un probleme avec cette petite fonction, je débute en c, merci de m'aider, voici le problème:#include /* Autor ponté sur une valeur pour l'éliminé [ par sturnarbo ] énoncé:/*Ecrire un programme qui lit un entier X et un tableau A du type int au clavieret élimine toutes les occurrences de X dans A en tassant les él Problem Affichage de mon Tableau [ par Orezza ] salut à tous, j'ai un blem à l'affichage du tableau. l'utilisateur parametre son tableau, c lui qui l'initilize mais j'arrive pas à afficher apres le Blem Somme ELmt d'un Tableau Bidimensionnel [ par Orezza ] Slt c encore moi, le boulet de l'info...c tjrs le meme prog mais cette fois ci j'aimerais afficher la somme des elmts de mon tableaux.#include #includ Question pour un "String" ;-)) [ par nobody77 ] Bonjour,j'ai un tableau de caractéres qui contient des sauts de ligne "CR/LF".Je voudrais faire une fonction qui me permettrait de lire les chaînes de URGENT: pb passage d'argument tableau de chaine de caracteres! [ par joduak ] Salut à vous! j'ai un problème de passage d'argument d'un tableau de chaine de caractere. Si quelqu'un à une idée, faire vite svp ! Voici mon code : tableau unidimensionnel .... [ par slowlover ] j'ai fais un tableau unidimensionnel dont voici l'algorithme:#includeint main(){//declarationsfloat tab[10];int i;for(i=0;i{printf("entrez la valeur % fonctions sur les tableau [ par micoo86 ] Bonjour,en faite j'ai fait un programme avec le tableau (somme,affichage,minimum,maximum)mais j'arrive pas a faire le rest de l'exercice.si quelqu'un probleme avec des sockets [ par ratp ] Bonjours à tousJ'ai un probleme avec mon programme client serveur.Je voudrais que vous m'aidiez à créer un serveur simple et multi-clientJe voudrais f problème de point vérgulle? [ par awalle ] voilà mon code! #include #include #include int main() { double v,h,a,b,x; h=(b-a)/6; printf("doner a\n");


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales