Accueil > Forum > > > > Trouver l'indice i d'un tableau T[i] en fonction d'une valeur T0, et d'un écart +/- e.
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
|
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++ : mais
Code C/C++ :
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
|
|
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");
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|