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

Fermé
Aelgar - 20 avril 2016 à 08:03
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 21 avril 2016 à 11:07
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 avril 2016 à 12:10
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
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 avril 2016 à 14:48
"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
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 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 2
21 avril 2016 à 11:07
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