Le poids d'un nombre [Résolu]

Signaler
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
Bonjour, le but de l'exercice est de faire ceci :

Créer un programme qui permet de saisir un nombre entier naturel et qui affiche le ou les poid(s) de chaque chiffre dans ce nombre. À partir de ces informations, le nombre doit pouvoir être reconstitué. Le poids représente la position du chiffre dans le nombre, en partant de la droite (le premier chiffre de droite est à la position 0, il a donc un poids 0).

voilà et moi j'ai codé quelque chose comme cela :
#include <iostream>

using namespace std;

int main()
{
    int tableau[9] ; // contient le max de chiffre que peut comporter le nombre 
	int i ;
    int nbre0 ;
	int nbre1 ;
	int nbre2 ;
	int nbre3 ;
	int nbre4 ;
	int nbre5 ;
	int nbre6 ;
	int nbre7 ;
	int nbre8 ;
	unsigned long int nbdiv17 ;
	unsigned long int nbdiv16 ;
	unsigned long int nbdiv15 ;
	unsigned long int nbdiv14 ;
	unsigned long int nbdiv13 ;
	unsigned long int nbdiv12 ;
	unsigned long int nbdiv11 ;
	unsigned long int nbdiv10 ;
	unsigned long int nb ;

	cout << " Entrez un nombre : " ;
	cin >> nb ;

	nbre0 = nb % 10 ; // reste de la division de nbre0 par nb modulo 10
    tableau[0] = nbre0 ;

    nbdiv10 = nb / 10 ;
	nbre1 = nbdiv10 % 10 ;
    tableau[1]= nbre1 ;

    nbdiv11 = nbdiv10 / 10 ;
    nbre2 = nbdiv11 % 10 ;
    tableau[2]= nbre2 ;

    nbdiv12 = nbdiv11 / 10 ;
    nbre3 = nbdiv12 % 10 ;
    tableau[3]= nbre3 ;

    nbdiv13 = nbdiv12 / 10 ;
    nbre4 = nbdiv13 % 10 ;
    tableau[4]= nbre4 ;

    nbdiv14 = nbdiv13 / 10 ;
    nbre5 = nbdiv14 % 10 ;
    tableau[5]= nbre5 ;

    nbdiv15 = nbdiv14 / 10 ;
    nbre6 = nbdiv15 % 10 ;
    tableau[6]= nbre6 ;

    nbdiv16 = nbdiv15 / 10 ;
    nbre7 = nbdiv16 % 10 ;
    tableau[7]= nbre7 ;

    nbdiv17 = nbdiv16 / 10 ;
    nbre8 = nbdiv17 % 10 ;
    tableau[8]= nbre8 ;


    for (i = 0; i < 9; i++)
    {
    	if (tableau[i] > 0)
    	{
    	    cout << tableau[i] << " : " << i << " \n " ; // affichage du tableau qui contient le nombre.
        }
    }

    cout << " Entrez un nombre : " ;
    cin >> nb ;

return 0 ;

}

Je voudrais savoir si cela est bon et si oui, je voudrais savoir pourquoi il ne m'affiche pas le poids des 0 dans le nombre ??

29 réponses

Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Oui voilà c'est bon............ ça m'énerve parce que tu avait raison, ca va beaucoup plus vite que ce que je voulais faire et c'était pas si dur......................... j'ai perdu beaucoup de temps parce que j'ai du mal à voir les choses......................!

Merci en tout cas de m'avoir progressivement ouvert les yeux :D
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Comme vu avec toi, il s'avère qu'en fait, il ne fallait pas donner le poids de chaque nombre, mais *les* poids de chaque nombre.
C'est-à-dire qu'on associe à un nombre toutes les positions où il est présent (en partant de la droite).
Ex:
  • 111 => "1" est présent aux positions 0, 1 et 2.
  • 1133 => "1" est présent aux positions 2 et 3, et "3" est présent aux positions 0 et 1.
  • 789=> "7" est présent à la position 2, "8" est présent à la position 1 et "9" est présent à la position 0.


Le code modifié est donc:
#include <iostream>
#include <cmath>

int main()
{
  int tab[10][9]; // 10 chiffres possibles pour une taille de 9
  // On associe donc chacun de nos 10 numéros, avec un tableau de 9 positions
  // On ne vas pas forcément utiliser les 9 cases.

  while (true) // Boucle principale, là pour faire continuer le programme jusqu'à ce que l'on en ait marre.
  {
    // On remplit toutes les cases à -1, pour dire qu'elles sont vides.
    for (int i = 0; i < 10; ++i)
      for (int j = 0; j < 9; ++j)
        tab[i][j] = -1;

    int nb = 0;
    int position_actuelle = 0;
    std::cout << "Entrez un nombre: ";
    std::cin >> nb;
    if (nb == 0) // Si nb vaut 0, on sort de la boucle principale.
      break;
    if (nb > 999999999)
    {
      std::cerr << "Le nombre est trop grand" << std::endl;
      return 1;
    }

    while (nb > 0)
    {
      // Récupération du nombre pour trouver la liste.
      int indice = nb % 10;

      // On ajoute la position courante dans la liste (en faisant un ajout en queue)
      int pos = 0;
      while (tab[indice][pos] != -1 && pos < 9)
        ++pos;
      tab[indice][pos] = position_actuelle;

      nb /= 10;
      ++position_actuelle;
    }

    // Debug, non demandé, histoire de voir à quoi ressemble notre tableau
    std::cout << "Debug:" << std::endl;
    for (int i = 0; i < 10; ++i)
    {
      std::cout << "Numero " << i << ": ";
      for (int j = 0; j < 9; ++j)
      {
        if (tab[i][j] == -1)
          std::cout << tab[i][j] << " ";
        else
          std::cout << " " << tab[i][j] << " ";
      }
      std::cout << std::endl;
    }

    // Affichage uniquement de ce qui n'est pas en -1
    std::cout << "\nAffichage des positions:" << std::endl;
    for (int i = 0; i < 10; ++i)
    {
      if (tab[i][0] != -1)
      {
        std::cout << "Numero " << i << ": ";
        for (int j = 0; j < 9 && tab[i][j] != -1; ++j)
          std::cout << " " << tab[i][j] << " ";
        std::cout << std::endl;
      }
    }

    // Reconstruction du nombre d'origine
    std::cout << "\nReconstruction du nombre d'origine:" << std::endl;
    int nb_origine = 0;
    for (int i = 0; i < 10; ++i)
      for (int k = 0; k < 9 && tab[i][k] != -1; ++k)
        nb_origine += i * std::pow(10, tab[i][k]);
    std::cout << "Nombre d'origine: " << nb_origine << "\n\n";
  }

  return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Re bonjour, je ne voudrais pas paraître pessimiste mais si tu tape dans le programme un nombre à 9 chiffres, quand il me le reconstitue, il ne me reconstitue pas le bon nombre.......................
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Je viens de tester avec un nombre à 9 chiffres, et je n'ai pas de souci.

Test 1 avec 123456789:
$ ./a.out
Entrez un nombre: 123456789
Debug:
Numero 0: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 1: 8 -1 -1 -1 -1 -1 -1 -1 -1
Numero 2: 7 -1 -1 -1 -1 -1 -1 -1 -1
Numero 3: 6 -1 -1 -1 -1 -1 -1 -1 -1
Numero 4: 5 -1 -1 -1 -1 -1 -1 -1 -1
Numero 5: 4 -1 -1 -1 -1 -1 -1 -1 -1
Numero 6: 3 -1 -1 -1 -1 -1 -1 -1 -1
Numero 7: 2 -1 -1 -1 -1 -1 -1 -1 -1
Numero 8: 1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 9: 0 -1 -1 -1 -1 -1 -1 -1 -1

Affichage des positions:
Numero 1: 8
Numero 2: 7
Numero 3: 6
Numero 4: 5
Numero 5: 4
Numero 6: 3
Numero 7: 2
Numero 8: 1
Numero 9: 0

Reconstruction du nombre d'origine:
Nombre d'origine: 123456789


Test 1 avec 111111111:
$ ./a.out
Entrez un nombre: 111111111
Debug:
Numero 0: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 1: 0 1 2 3 4 5 6 7 8
Numero 2: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 3: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 4: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 5: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 6: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 7: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 8: -1 -1 -1 -1 -1 -1 -1 -1 -1
Numero 9: -1 -1 -1 -1 -1 -1 -1 -1 -1

Affichage des positions:
Numero 1: 0 1 2 3 4 5 6 7 8

Reconstruction du nombre d'origine:
Nombre d'origine: 111111111


Si tu as un exemple qui provoque une erreur, je suis preneur.
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Je t'envoie 2 captures d'écrans :

et

donc quand je tape 123456789 comme chiffre a la fin il me reconstitue : 123456787............., je précise que j'ai fais un copier coller sans rien toucher !
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Je ne vois pas tes captures, mais ce n'est pas grave. Le mieux étant tout de même de copier-coller ton entrée et ta sortie.
J'ai ajouté une sécurité qui vérifie si le nombre a plus de 9 chiffres (j'ai édité le code que j'ai posté). Mais je ne vois pas d'erreur dans mon code, j'ai ajouté cela uniquement au cas où tu mettrais un nombre trop grand sans t'en rendre compte.

Le mieux serait que tu copies l'intégralité de la sortie donnée par le programme.
Messages postés
256
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
10 mars 2016
1
Bon dommage c'est bizarre, je te fais confiance pour le code ! :)
Salut salut, je dois faire le même programme pour un exercice, j'ai tester avec votre dernier code, et comme TheRogerFederer en compilant le programme et en l'exécutant il me ressort les même valeurs que dans les screenshots ci-dessus. Soit 1 de plus ou 2 ou 1 de moins, ou 2 ... Néanmoins j'ai tester votre programme sur ce site :
http://cpp.sh/5fll
Et en exécutant le programme, tout fonctionne.

ça c'est mon code : http://cpp.sh/8jqd
Si je compile les deux codes avec code::blocks, ça fait l'erreur de 1 ou 2 en plus, ou en moins, alors que si je le compile sur le site web, tout marche parfaitement bien.

Donc, le problème ne viendrait-il pas de code::blocks ? :/ Je vois dans tes screenshot que tu l'utilise également... C'est bizzarre j'aimerais bien avoir une bonne note mais cette erreur me fait peur !
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Bonjour.

Il me faudrait plus de détails. Je ne vois pas d'erreur dans le code donné (en plus l'affichage du debug montre que le tableau est correctement rempli). C'est peut être un problème "d'arrondi" lors de l'affichage. Il me faudrait le compilateur utilisé avec sa version exacte par Code::Block avec les options exactes utilisées.