PDA

Afficher la version complète : ça marche mais le résultat est faux !!!



moniroje
26/10/2016, 17h13
J'ai presque tout bon (OK, je me suis inspiré d'un corrigé mais j'ai dérivé...)
puisque j'ai la console, pas d'erreur, le code s'effectue... oui mais...
Donc il y a un tableau, je mets dans les cases des entiers dizaines par exemple
et une case avec 111 .
Si je demande s'il existe un chiffre entre 100 et 120, le code me répond qu'il n'y en a pas!!
Où est l'erreur..????
en plus si vous pouvez répondre à mes questions en commentaires!! ça serait super!

#include<iostream>
using namespace std;

// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
int i; for(i=0;i<n;i++)
{ // tiens, pourquoi le corrigé met ces accolades ?
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n)
// pourquoi il me dit pour ci-dessus: unused parameter 'n' ???
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la fourchette
* et je les initialise = 0 sinon il me balance ce message:
* "Problème: min is used uninitialized in this function" aux cout */
int i=0,ind=-1; // je déclare i=0 pour true et ind =-1 pour false
// et pourquoi le corrigé ne met pas des accolades ici ??
cout<<"Tapez la valeur minimale de votre recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donnez la valeur maximale de votre fourchette: "<<MAX<<" : ";
cin>>MAX;
if(t[i]>=min && t[i]<=MAX)ind=i;
// si t[i] est dans nos limites, faut alors écrire i pour ind
else i++; // sinon tu vas à la case suivante
return ind; // et tu envoies ind
}

int main()
{
int a[10]; // soit la tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10);
if(w!=-1)cout<<"Il existe une valeur dans la fourchette que vous avez fixée. "
<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<endl;
else cout<<"Pas de valeurs dans la fourchette que vous avez fixée. "<<endl;
return 0;
}
/* ce code fonctionne mais le résultat est faux: si je mets des unités et à la
* dernière case: la 9, je mets 12, si je limite la fourchette entre 10 et
* 15, il me répond bêtement: " Pas de valeurs dans la fourchette que vous..."
* donc w n'a que des -1 ?? grrrr...*/

linux5623
26/10/2016, 17h38
Tu as voulu faire quoi dans la fonction f ??

moniroje
26/10/2016, 17h51
salut!!
ben, la fonction,
d'abord, elle nous demande de fixer les limites min et MAX
puis elle liste les cases du tableau et elle dit pour la case i qui a un entier dans les limites fixées min et MAX, elle dit ind=i qu'elle envoir en return
et w qui récupère ce return, hop!! il dit c'est la case machin qui a un entier dans cette fourchette requise.

linux5623
26/10/2016, 19h01
Et tu crois que c'est possible sans une boucle dans le code ?

moniroje
27/10/2016, 17h02
hi hi, j'ai pâli en lisant ta question??
hein, je n'ai pas mis ma boucle???
Ben si que je l'ai mise: avec if suivi d'un else i++;
OK, ça ne marche pas et tu me poses cette question, donc ce n'est pas une boucle;
vais essayer avec while
A +

moniroje
27/10/2016, 17h48
Mon essai avec while:

/* quelleCaseTableauContientCertaineValeur */

#include<iostream>
using namespace std;
// je crée la variable i dont j'aurais besoin pour itérer dans le tableau:
int i ;
// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
for(i=0;i<n;i++)
{ // accolades pour la boucle for
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n)
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la fourchette
* et je les initialise = 0 sinon il me balance ce message aux cout:
* "Problème: min is used uninitialized in this function" */
int ind=-1; /* je déclare ind qui contiendra le numéro de la case gagnante ou bien -1 */

cout<<"Tape la valeur minimale de ta recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donne la valeur maximale de ta fourchette: "<<MAX<<" : ";
cin>>MAX;
/* maintenant la fonction va chercher dans chacune des cases du tableau:
* je vais utiliser if else: */
// if(t[i]>=min && t[i]<=MAX) // on teste: si c'est vrai, on fait opération:
// {ind=i ; // l'opération: donner à ind la valeur i: n° de la case gagnante
// return ind; // et tu envoies ind avec le numéro de la case gagnante
// }
// else i++; // sinon tu vas à la case suivante
/* ci-dessus le if else, ça ne marche pas; linux5623 me dit qu'il faut une boucle...
* tiens donc, if else n'agit pas comme une boucle avec le i++ ?? OK, je vais essayer
* la boucle while se construit ainsi : while (condition) {// instructions à répéter }
* tout ce qui est entre les accolades est répété tant que la condition est vérifiée.*/
// while (t[i]!>=min && t[i]!<=MAX) // ERROR: expected ')' before '!' token !!! j'essaye:
while ((t[i])!>=min && (t[i])!<=MAX) // ERROR: le même message!
}
ind=-1 // ce qui => ERROR: 'ind' does not name a type !! ben wé!! je l'ai déclaré int au début de la fonction!
}
while t[i]>=min && t[i]<=MAX)
{
ind=i
}

int main()
{
int a[10]; // soit la tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10); // dans w on met la vaeur retournée par la fonction f()
// ci-dessous est dit: si (w n'est pas -1): soit le numéro de la case gagnante
if(w!=-1)
{cout<<"Il existe une valeur dans la fourchette que tu as fixée. "
<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<endl;
cout<<" et cette valeur est "<<a[i]<<endl;
}
else cout<<"Pas de valeurs dans la fourchette que tu as fixée. "<<endl;
return 0;
}


Houla la!!! on dirait que je m'égare!

linux5623
27/10/2016, 17h55
Et ça compile ça ??

Tu devrais indenter ton code. Tu trouveras certaines erreurs !

moniroje
27/10/2016, 22h12
:gloups:ben non, ça compile pas...
J'ai indenté et en effet, j'ai vu des oublis...
Ça n'empêche, j'ai toujours les erreurs aux mêmes endroits!

// quelleCaseTableauContientCertaineValeur

#include<iostream>
using namespace std;
// je crée la variable i dont j'aurais besoin pour itérer dans le tableau:
int i ;
// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
for(i=0;i<n;i++)
{ // accolades pour la boucle for
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n)
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la fourchette
* et je les initialise = 0 sinon il me balance ce message aux cout:
* "Problème: min is used uninitialized in this function" */
int ind=-1; /* je déclare ind qui contiendra le numéro de la case gagnante ou bien -1 */

cout<<"Tape la valeur minimale de ta recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donne la valeur maximale de ta fourchette: "<<MAX<<" : ";
cin>>MAX;
/* maintenant la fonction va chercher dans chacune des cases du tableau:
* je vais utiliser if else: */
// if(t[i]>=min && t[i]<=MAX) // on teste: si c'est vrai, on fait opération:
// {ind=i ; // l'opération: donner à ind la valeur i: n° de la case gagnante
// return ind; // et tu envoies ind avec le numéro de la case gagnante
// }
// else i++; // sinon tu vas à la case suivante
/* ci-dessus le if else, ça ne marche pas; linux5623 me dit qu'il faut une boucle...
* tiens donc, if else n'agit pas comme une boucle avec le i++ ?? OK, je vais essayer
* la boucle while se construit ainsi : while (condition) {// instructions à répéter }
* tout ce qui est entre les accolades est répété tant que la condition est vérifiée.*/
// while (t[i]!>=min && t[i]!<=MAX) // ERROR: expected ')' before '!' token !!! j'essaye:
while ((t[i])!>=min && (t[i])!<=MAX) // ERROR: le même message!
{
ind=-1
}
while t[i]>=min && t[i]<=MAX)
{
ind=i
}
}
int main()
{
int a[10]; // soit la tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10); // dans w on met la vaeur retournée par la fonction f()
// ci-dessous est dit: si (w n'est pas -1): soit le numéro de la case gagnante
if(w!=-1)
{cout<<"Il existe une valeur dans la fourchette que tu as fixée. "
<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<endl;
cout<<" et cette valeur est "<<a[i]<<endl;
}
else cout<<"Pas de valeurs dans la fourchette que tu as fixée. "<<endl;
return 0;
}

jupar
28/10/2016, 12h09
:gloups:ben non, ça compile pas...
J'ai indenté et en effet, j'ai vu des oublis...
Ça n'empêche, j'ai toujours les erreurs aux mêmes endroits!

// quelleCaseTableauContientCertaineValeur

#include<iostream>
using namespace std;
// je crée la variable i dont j'aurais besoin pour itérer dans le tableau:
int i ;
// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
for(i=0;i<n;i++)
{ // accolades pour la boucle for
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n)
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la fourchette
* et je les initialise = 0 sinon il me balance ce message aux cout:
* "Problème: min is used uninitialized in this function" */
int ind=-1; /* je déclare ind qui contiendra le numéro de la case gagnante ou bien -1 */

cout<<"Tape la valeur minimale de ta recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donne la valeur maximale de ta fourchette: "<<MAX<<" : ";
cin>>MAX;
/* maintenant la fonction va chercher dans chacune des cases du tableau:
* je vais utiliser if else: */
// if(t[i]>=min && t[i]<=MAX) // on teste: si c'est vrai, on fait opération:
// {ind=i ; // l'opération: donner à ind la valeur i: n° de la case gagnante
// return ind; // et tu envoies ind avec le numéro de la case gagnante
// }
// else i++; // sinon tu vas à la case suivante
/* ci-dessus le if else, ça ne marche pas; linux5623 me dit qu'il faut une boucle...
* tiens donc, if else n'agit pas comme une boucle avec le i++ ?? OK, je vais essayer
* la boucle while se construit ainsi : while (condition) {// instructions à répéter }
* tout ce qui est entre les accolades est répété tant que la condition est vérifiée.*/
// while (t[i]!>=min && t[i]!<=MAX) // ERROR: expected ')' before '!' token !!! j'essaye:
while ((t[i])!>=min && (t[i])!<=MAX) // ERROR: le même message!
{
ind=-1
}
while t[i]>=min && t[i]<=MAX)
{
ind=i
}
}
int main()
{
int a[10]; // soit la tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10); // dans w on met la vaeur retournée par la fonction f()
// ci-dessous est dit: si (w n'est pas -1): soit le numéro de la case gagnante
if(w!=-1)
{cout<<"Il existe une valeur dans la fourchette que tu as fixée. "
<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<endl;
cout<<" et cette valeur est "<<a[i]<<endl;
}
else cout<<"Pas de valeurs dans la fourchette que tu as fixée. "<<endl;
return 0;
}

Hello !

Ligne 41 que veux tu dire par "!>="

et ta variable globale "i" , tu devrais essayer de la suivre à travers ta boucle while, (via cout<<i<<endl, par exemple), tu devrais y voir un peu plus clair comme ça.

++
J

moniroje
28/10/2016, 17h42
hiii!!! salut jupar!!
ben je veux dire n'est pas <=
Bon, mon code va mieux, ça compile, j'ai de nouveau la console
mais les résultats sont toujours aussi faux...
et là, tout l'aprem à essayer de m'en dépatouiller, ... Voici mon code plus mieux que la veille:

/* quelleCaseTableauContientCertaineValeur */

#include<iostream>
using namespace std;
// je crée la variable i dont j'aurais besoin pour itérer dans le tableau:
int i ;
// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
for(i=0;i<n;i++)
{ // accolades pour la boucle for
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n) // => ! unused parameter 'n' hein???
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la
* fourchette et je les initialise = 0 sinon il me
* balance ce message aux cout: "Problème: min is used
* uninitialized in this function" */
int ind=-1; /* je déclare ind qui contiendra le numéro de la case gagnante
* ou bien -1 */

cout<<"Tape la valeur minimale de ta recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donne la valeur maxi de ta fourchette: "<<MAX<<" : ";
cin>>MAX;
/* maintenant la fonction va chercher dans chacune des cases du tableau:
* linux5623 me dit qu'il faut une boucle... OK, je vais essayer la boucle
* while qui se construit ainsi :
* while (condition) {// instructions à répéter }
* tout ce qui est entre les accolades est répété tant que la condition est
* vérifiée. Dans mon cas, la condition pour que ça se répète est ind=-1*/
/* while (ind==-1) /* le code fonctionne; mais il me dit toujours "Pas de valeur
* dans la fourchette fixée, même si j'en ai mis une ! shit!
* le corrigé a en plus de moi: && i<n: faisons: */
while (ind==-1 && i<n) /* chouette, ça a l'air de marcher! Il dit: "Il existe
* une valeur dans la fourchette fixée..." Non, il dit
* ça même si je n'ai pas mis de valeur dans la fourchette! */
{
// si t[i] dans la fourchette gagnante, tu mets la valeur i dans ind
if(t[i]>=min && t[i]<=MAX)ind=i;
// et comme ind n'est pas -1, hop, la boucle while s'arrête
else i++; // si ce n'est pas le cas, alors tu vas à la case suivante
cout<<i<<endl; // suggestion jupar; sans doute mal placée, ça ne fait rien.
return ind; // quand la boucle while s'arrête, ça retourne ind
}
} // fin de la fonction f() => ! control reaches end of non-void function

int main()
{
int a[10]; // soit le tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10); // dans w on met la valeur retournée par la fonction f()
// ci-dessous est dit: si (w n'est pas -1): soit le numéro de la case gagnante
if(w!=-1)
{cout<<"Il existe une valeur dans la fourchette que tu as fixée. "<<endl;
cout<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<"ième"<<endl;
// zut!! toujours le même résultat: est la 10 ième mêm si je mets en case 3!
cout<<" et cette valeur est "<<a[i]<<endl;
// toujours la même valeur: 4190304 ! n'importe quoi!!!
}
else cout<<"Pas de valeurs dans la fourchette que tu as fixée. "<<endl;
return 0;
}

linux5623
28/10/2016, 18h21
Les warnings c'est pas normal. Il faut considérer ça comme une erreur.

Un autre truc qui ne doit pas exister, c'est les variables globales. C'est source d'erreur !!
Et c'est d’ailleurs la raison qui fait que ce code ne fonctionne pas !!

moniroje
28/10/2016, 22h36
Salut linux!!!
ah??? moi qui viens d'apprendre les variables globales et tout content d'en mettre !
J'ai donc mis i en variable locale mais toujours pareil:
on peut mettre les nombres, définir la fourchette min-MAX
et bien même si il y a une valeur dedans, mon code => résultat: ya pas...
ouinnn, vais me coucher!!

/* quelleCaseTableauContientCertaineValeur */

#include<iostream>
using namespace std;
// je crée la variable i dont j'aurais besoin pour itérer dans le tableau:
/* int i ; ici, elle est globale et c'est pas bon dit linux5623!
* Moi, je croyais que c'était bien parce que i sert pour les fonctions
* saisir() et f()... note c+ec027: "Les variables globales sont définies
* hors de tout corps de fonction et sont disponibles pour tous les éléments
* du programme (même le code d'autres fichiers).
* Les variables globales ne sont pas affectées par les portées et sont toujours
* disponibles (une variable globale dure jusqu'à la fin du programme)." et donc
* pourquoi c'est pas bien ?? */
// je crée la fonction saisir() qui servira à remplir un tableau:
void saisir(int t[],int n)
{
int i; // OK, je déclare ici la variable d'itération i (variable locale)
for(i=0;i<n;i++)
{ // accolades pour la boucle for
cout<<"Tapez la valeur de la case numero "<<i<<" : ";
cin>> t[i];
}
}

// je crée la fonction f() demandée:
int f(int t[], int n) /* ce qui => ! unused parameter 'n' si j'utilise plus bas, le
* while (ind==-1) */
{
int min=0, MAX=0; /*je déclare les variables minimale et maximale de la
* fourchette et je les initialise = 0 sinon il me
* balance ce message aux cout: "Problème: min is used
* uninitialized in this function" */
int ind=-1; /* je déclare et initialise ind qui contiendra le numéro de
* la case gagnante; ou bien -1; je fais de même pour la
* variable d'itération i dans le cadre de cette fonction:*/
int i=0; // la première case se nomme 0 (variable locale)
cout<<"Tape la valeur minimale de ta recherche: "<<min<<" : ";
cin>> min;
cout<<"Maintenant donne la valeur maxi de ta fourchette: "<<MAX<<" : ";
cin>>MAX;
/* maintenant la fonction va chercher dans chacune des cases du tableau:
* il faut donc une boucle... essayons la boucle while qui se construit ainsi :
* while (condition) {// instructions à répéter }
* tout ce qui est entre les accolades est répété tant que la condition est
* vérifiée. Dans mon cas, la condition pour que ça se répète est ind=-1 */
/* while (ind==-1) /* le code fonctionne; mais il me dit toujours "Pas de valeur
* dans la fourchette fixée", même si j'en ai mis une. shit!
* le corrigé a en plus de moi: && i<n: faisons: */
while (ind==-1 && i<n) /* "Pas de valeur dans la fourchette fixée", même si
* j'en ai mis une. */
{
// si t[i] dans la fourchette gagnante, tu mets la valeur i dans ind
if(t[i]>=min && t[i]<=MAX) ind=i;
// et comme ind n'est pas -1, hop, la boucle while s'arrête
else i++; // si ce n'est pas le cas, alors tu vas à la case suivante
cout<<i<<endl; // suggestion jupar; sans doute mal placée, ça ne fait rien.
return ind; // quand la boucle while s'arrête, ça retourne ind
}
} // fin de la fonction f() => ! control reaches end of non-void function

int main()
{
int a[10]; // soit le tableau a de taille 10
int w; // on déclare la variable w qui sera le résultat de la fonction f()
int i=0; // pour que le cout ci-dessous ne soit pas en ERROR

saisir(a,10); // on utilise saisir() pour le tableau a de taille 10
w=f(a,10); // dans w on met la valeur retournée par la fonction f()
// ci-dessous est dit: si (w n'est pas -1): soit le numéro de la case gagnante
if(w!=-1)
{cout<<"Il existe une valeur dans la fourchette que tu as fixée. "<<endl;
cout<<"la case contenant cette valeur dans la fourchette fixée est la "<<w<<"ième"<<endl;
// zut!! toujours le même résultat: est la 10 ième mêm si je mets en case 3!
cout<<" et cette valeur est "<<a[i]<<endl;
// ce qui => ERROR: i was not declared in this scope; OK, je déclare ci-dessus
}
else cout<<"Pas de valeurs dans la fourchette que tu as fixée. "<<endl;
return 0;
}