Code C++ avec résultat pas cohérent

Aelgar -  
cptpingu Messages postés 3840 Date d'inscription   Statut Modérateur Dernière intervention   -
Hello tout le monde, voila j'ai un petit problème, j'ai un exercice dans lequel on me demande d'écrire un programme. Ce programme , lorsqu'on rentre un nombre doit être capable de dire le poids des nombre, pour exemple : Je tape le nombre "125" il doit m'afficher "1 : 2, 2 : 1, 5 : 0", pour ça tout va bien, une fois la position des nombre enregistrer il faut que le programme ressorte le nombre du début... Je sais pas si j'ai été trés clair.

Mon code vous sera peut être + explicite, tout fonctionne sauf le résultat de fin, sois le résultat est bon, soit il me ressort un résultat supérieur de 1 ou 2 ou inférieur de 1 ou 2... Pourtant je vois pas ou est le soucis dans le codage.

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
unsigned long int N = 0, B = 25, i = 1, x,y,z, j = 0, nombreFinal = 0;


unsigned long int nombre = 1;
int tableau[10][50] = {11} ;

cout << "Ecrivez un nombre (de moins de 10 chiffre):" << endl;
cin >> nombre ;
B = nombre;
while(B > 0 ){
N = B % 10;
B = B / 10;
switch(N)
{
case 0:

tableau[0][i] = i;
break;
case 1:
tableau[1][i] = i;
break;
case 2:
tableau[2][i] = i;
break;
case 3:
tableau[3][i] = i;
break;
case 4:
tableau[4][i] = i;
break;
case 5:
tableau[5][i] = i;
break;
case 6:
tableau[6][i] = i;
break;
case 7:
tableau[7][i] = i;
break;
case 8:
tableau[8][i] = i;
break;
case 9:
tableau[9][i] = i;
break;
}


i++;
}
x = i;
z = 0;
while(j <= 9)
{
i = 0;
y = 0;
while(i < 49 )
{
if((tableau[j][i]) < 10 && (tableau[j][i]) > 0)
{
x = 1;
nombreFinal = z + j*(pow(10,(i-1)));
z = nombreFinal;

if (x == 1 && y != 5)
{
cout << "\n" << j << ":";
x = 2;
y = 5;
}

cout << " " << tableau[j][i]-1 ;


}
else
{

}

i++;
}

j++;
}
if (nombreFinal > nombre)
{
cout << "\n" << nombreFinal-1;
}
else if(nombreFinal < nombre)
{
cout << "\n" << nombreFinal+1;
}
else if(nombreFinal == nombre)
{
cout << "\n" << nombreFinal;
}


}


En attente de vos réponse, cordialement.
A voir également:

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

1) Ce tableau est mal initialisé :
int tableau[10][50] = {11};


2) Heureusement que tu t'arrêtes à 10 !!!
    N = B % 10;
    B = B / 10;
    switch(N)
    {
    case 0:

            tableau[0][i] = i;
            break;
    case 1:
            tableau[1][i] = i;
            break;
    case 2:
            tableau[2][i] = i;
            break;
    case 3:
            tableau[3][i] = i;
            break;
    case 4:
            tableau[4][i] = i;
            break;
    case 5:
            tableau[5][i] = i;
            break;
    case 6:
            tableau[6][i] = i;
            break;
    case 7:
            tableau[7][i] = i;
            break;
    case 8:
            tableau[8][i] = i;
            break;
    case 9:
            tableau[9][i] = i;
            break;
    }

Version courte :
    N = B % 10;
    B = B / 10;
    tableau[N][i] = i;

3) Tu as déclaré nombreFinal de type unsigned long int, dont la valeur maximale est ULONG_MAX ≈ 4.29*10^9 mais tu l'utilises comme s'il pouvait aller jusqu'à 10^50 ! Cela va entraîner des erreurs de calcul...
    while(i < 49 )
    {
        if((tableau[j][i]) < 10 && (tableau[j][i]) > 0)
            {
            x = 1;
            nombreFinal = z + j*(pow(10,(i-1)));
0
Aelgar
 
Merci de prendre le temps de répondre.

Voilà j'ai fait les modifications que tu m'as dis, néanmoins mon problème est toujours là, il ne me renvoit pas tout le temps la bonne valeur...Soit 1 de plus ou 2 ou 3 , ou 1 de moins,etc...

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
unsigned long int N = 0, B = 25, i = 1, x,y,z, j = 0, nombreFinal = 0;


unsigned long int nombre = 1;
int tableau[10][50] = {NULL} ;

cout << "Ecrivez un nombre (de moins de 10 chiffre):" << endl;
cin >> nombre ;
B = nombre;
while(B > 0 ){
N = B % 10;
B = B / 10;
tableau[N][i] = i;



i++;
}
x = i;
z = 0;
while(j <= 9)
{
i = 0;
y = 0;
while(i < 10 )
{
if((tableau[j][i]) < 10 && (tableau[j][i]) >= 1)
{
x = 1;
nombreFinal = z + j*(pow(10,(i-1)));
z = nombreFinal;

if (x == 1 && y != 5)
{
cout << "\n" << j << ":";
x = 2;
y = 5;
}

cout << " " << tableau[j][i]-1 ;


}
else
{

}

i++;
}

j++;


}
cout <<"\n" << nombreFinal;

}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
"il ne me renvoit pas tout le temps la bonne valeur...Soit 1 de plus ou 2 ou 3 , ou 1 de moins"
Je ne sais pas comment tu exécutes ton programmes, mais quand je testes ton code, ça fait n'importe quoi... c'est pas juste la mauvaise valeur, tout est faux !

http://cpp.sh/7zcs
Ecrivez un nombre (de moins de 10 chiffre):
1

0: 3 3
1: 0
3: 0
6: 1
9: 0
90009001
0
Aelgar
 
Je viens de copier/coller mon code sur ton site, il m'affiche le bon résultat et pas ce que tu a c/p au dessus, pourtant en essayant ton lien effectivement ça affiche le résultat que tu as envoyer...

Les résultats pas tous cohérent, retourné par mon compilateur :
http://zupimages.net/viewer.php?id=16/16/bykh.png
http://zupimages.net/viewer.php?id=16/16/ejlt.png
http://zupimages.net/viewer.php?id=16/16/uisb.png
http://zupimages.net/viewer.php?id=16/16/rohh.png

Mon code sur ton site, qui marche :
http://cpp.sh/2g7n

Le truc bizarre c'est que sur ton site tout fonctionne impeccable, pas sur code::blocks ....Je vais essayer avec un troisieme compilateur voir si le problème vient de code::blocks.

PS : J'ai initialisé le tableau en tableau[10][11] plutôt que tableau[10][50] mais j'ai oublié de remplacer dans le dernier code que j'ai copier ici...J'crois pas que ça change grand chose mais bon !
0
cptpingu Messages postés 3840 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Bonjour.

Plutôt que de pointer tout ce qui ne va pas, je te renvoi directement sur cette conversation (à bien lire jusqu'à la fin, surtout la page 2):
https://codes-sources.commentcamarche.net/forum/affich-10056758-le-poids-d-un-nombre

C'est un exercice qui est apparemment souvent donné...

Quelques conseils:
- Évite les using namespace, c'est crade et dangereux, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace/
- En C++ on évite "NULL", soit tu utilises "0", soit tu as un compilo "moderne" et tu utilises "nullptr".
- Préfère <cmath> à <math.h> (en C++, si tu un header qui finit par ".h" regarde si la version commençant par un "c" existe).
0