Le poids d'un nombre [Résolu]

TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 23 nov. 2015 à 10:45 - Dernière réponse : cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention
- 25 avril 2016 à 11:40
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 ??
Afficher la suite 

Votre réponse

29 réponses

cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 23/11/2015 à 17:02
0
Merci
Bonjour.

pourquoi il ne m'affiche pas le poids des 0 dans le nombre

Tu dis: si le nombre vaut 0, ne pas l'afficher. Donc si tu écris 102, tu n'afficheras que 1 et 2.
Tu considères (à tort), que 0 est la valeur d'une case non remplie. Or, c'est faux, car une case non remplie et non initialisée à une valeur indeterminée (pour vulgariser: valeur aléatoire). De plus, tu ignores aussi tout 0 "légitime" (comme dans 102, ou 30405).
La bonne méthode serait plutôt de compter le nombre de chiffres constituant le nombre donné en argument. Si on connait la "taille" du nombre, il est facile de n'afficher que ce qui est nécessaire.

Je voudrais savoir si cela est bon

À part cette petite erreur de "0", le code est "bon". Mais il peut être largement amélioré (mise au propre). Tu crées une vingtaine de variables, car tu as besoin de 2*9 cas à gérer. Or, tu te doutes bien que si on t'avait demandé un poids montant à 1000, tu n'allais pas t'amuser à créer 2*1000 variables ! Quand on a besoin de X variables, c'est que l'on a besoin... d'un tableau. Tout simplement.
De plus, au lieu de répéter la même logique en boucle, pourquoi ne pas utiliser, justement, une boucle ?

Enfin, quelques remarques plus techniques:
  • N'utilise pas using namespace, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
  • Tu commentes ton code, c'est très bien, mais tu "paraphrases" au lieu de documenter, ce qui n'est pas très utile. Pour bien commenter son code, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires


Je te propose une version modifiée de ton code:
#include <iostream>

int main()
{
  int tableau[9];
  int nb = 0;
  int nb_size = 0;

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

  while (nb > 0)
  {
    tableau[nb_size] = nb % 10;
    nb /= 10;
    ++nb_size;
  }

  for (int i = 0; i < nb_size; ++i)
    std::cout << tableau[i] << " : " << i << std::endl;

  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
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 23/11/2015 à 12:29
0
Merci
Ah oui d'accord, en faite je veux faire apparaître le 0 dans les nombres, qu'il soit compté mais que quand on saisie 0, le programme se termine et se ferme, j'ai oublié une consigne regarde : "Le programme doit fonctionner pour plusieurs nombres : l'arrêt du programme se fera lorsque le nombre saisi sera égal à 0."

C'est ca que je voulais exprimer dans mon programme surtout.
Pour le reste effectivement je me doutais que ca allait être lourd de tout déclaré de cette façon mais je ne voyais pas comment faire autrement.
J'ai entendu que certains utilisaient des list ou map mais moi ca je ne connais pas.....................
D'autres utilisent des tableaux à 2 dimensions aussi apparemment....
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 23 nov. 2015 à 13:27
0
Merci
l'arrêt du programme se fera lorsque le nombre saisi sera égal à 0

Je t'ai fait une exemple pour une "passe". Il te faut maintenant ajouter quelque chose de plus pour gérer "N" passes. Ça ne devrait pas être trop difficile :). Souviens-toi de ce que je t'ai expliqué plus haut, tu as besoin de *répéter* une action.

J'ai entendu que certains utilisaient des list ou map mais moi ca je ne connais pas.

Si l'un de tes camarades utilise une liste ou une map, tu peux l'envoyer ici, et lui dire que c'est inutile. On peut certe faire des listes ou de map, mais c'est d'une lourdeur complètement non nécessaire.

D'autres utilisent des tableaux à 2 dimensions aussi apparemment....

Autant une liste ou une map, c'est lourd pour rien, autant un tableau à double dimension, là c'est carrément faux. J'ai beau chercher, je ne vois pas pourquoi on utiliserait ça...
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 23/11/2015 à 14:30
0
Merci
Bon très bien c'est bon à savoir alors ! Je repasserai ici pour te dire comment le programme fonctionne, par contre du coup pour qu'il me ré-affiche le nombre a partir des poids, il faut fait l'opération inverse ?
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 12:28
0
Merci
pour qu'il me ré-affiche le nombre a partir des poids, il faut fait l'opération inverse ?

Il te suffit de lire ton tableau "à l'envers". Tout simplement. (De la fin vers le début).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 24 nov. 2015 à 13:01
0
Merci
Oui d'accord merci beaucoup en tout cas :)
Commenter la réponse de TheRogerFederer
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 24/11/2015 à 15:02
0
Merci
Pour l'inverser est ce que je peux utiliser qqch comme ceci ?? (à noter que ce n'est qu'un exemple donc que les variables n'ont rien a voir) :
sauv = vec[i] ;
vec[i] = vec[i-1] ;
vec[i-1] = sauv ;

Ici la fin donnerai (si on peut utiliser cela biensure) :
temp = tableau[i] ;
tableau[i] = tableau[nb] ;
tableau[nb] = temp ;

cout << temp << endl ;

En ayant pris comme variable intermédiaire temp....
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 15:45
0
Merci
Oui, mais c'est t'embêter pour rien...

Au lieu d'afficher de 0 à size - 1, tu affiches de size - 1 à 0, tout simplement. (C'est trivial, il te suffit de changer les bornes de ta boucle).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 24 nov. 2015 à 16:06
0
Merci
Attends comment ca ? Tu fait qqch comme ca :
 for (i < nb_size-1; i = 0; --i)


et a la fin tu affiche quoi du coup ?
cout << nb << " : " <<  endl ; // Affichage du poids
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 16:19
0
Merci
L'inversion de la boucle est correcte dans le principe, fausse sur la syntaxe. Réfléchis un tout petit peu à ce que tu écris (lis à l'oral ce que ça "fait" en français), et surtout: fais des tests avant de demander ! Essaie plusieurs méthodes, regarde ce que ça donne. Regarde aussi la syntaxe d'une boucle for, tu comprendras vite d'où vient le souci.

a la fin tu affiche quoi du coup

Pourquoi veux-tu absolument stocker cela quelquepart ? Tu as juste à afficher, caractère par caractère chacun des chiffres à la suite (à l'envers).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 24/11/2015 à 17:05
0
Merci
Effectivement en lisant a haute voix ca change pour la syntaxe de la boucle, ceci est peut-être mieux :
for (i = 0; i < nbre_size-1; --i)


Par contre pour : "Pourquoi veux-tu absolument stocker cela quelque part ? Tu as juste à afficher, caractère par caractère chacun des chiffres à la suite (à l'envers)."

je comprend tout a fait en français la dessus il n'y a pas de souci mais comment y parvenir.........?? Je suppose qu'afficher :
cout << tableau[9] ;
cout << tableau[8] ;
cout << tableau[7] ;
...

est inutile et même faux...???
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 17:30
0
Merci
ceci est peut-être mieux

Est-ce que tu l'as testé ? Car là, tu vas de 0 à size - 1, mais en reculant à partir de 0 (ce qui fait que tu iras sur -1, puis -2, etc... à l'infini).
Ce que tu veux faire, c'est *partir* de size - 1, jusqu'à que ce que tu *atteignes* 0, en reculant.

Je suppose qu'afficher est inutile et même faux..

Il faut vraiment que tu testes les choses. C'est dommage, tu as les bonnes idées, mais tu ne les vérifies pas :(. (Pour répondre à ta question, c'est au contraire tout à fait correcte).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 24/11/2015 à 17:41
0
Merci
Ah d'accord, je pensais en faite qu'en écrivant cela :
for (i = 0; i < nbre_size-1; --i)

on allait de size-1 a 0........................

Oui oui j'ai tout testé, en faite il boucle a l'infini en m'affichant des nombres avec un millier de chiffres...............
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 24/11/2015 à 18:02
0
Merci
La boucle for fonctionne comme ceci:
for (action à effectuer la tout première fois avant de rentrer dans la boucle;
      test à effectuer à chaque début de boucle pour savoir si on continue de boucler ou non;
      action à effectuer à chaque fin de boucle)
{
}


Donc si tu dis:
for (i = 0; i < nbre_size-1; --i)


Avant ma boucle, je met i à 0.
À chaque début tour, je regarde si i < size, et si c'est vrai.
À chaque fin de tour je décrémente i.

Tu te rends bien compte que c'est problématique.


Si tu dis:
for (i < nb_size-1; i = 0; --i)


Avant ma boucle, je regarde si i < nb_size.
À chaque début tour, je met i à 0 et je regarde si i est bien différent de 0 pour continuer à boucler.
À chaque fin de tour je décrémente i.

Il y a là aussi un souci.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 24/11/2015 à 19:25
0
Merci
Ahh oui d'accord dans le premier cas on a un i qui commence a 0 et qui va dans les négatifs comme tu avait dit !

Dans l'autre, i est a 0 au début, on regarde si i est différent de 0 ce qui est faux puisqu'on le met a 0 justement et ensuite on décrémente donc on a un i qui passe encore dans les négatifs....................

Nous on veut quoi au juste ? On veut l'inverse de ça :
for (int i = 0; i < nb_size; ++i)
??
Donc quand tu dis "qu'on inverse les bornes", cela veut dire que cela :
for (int i != 0; i >= nb_size-1; ++i)

Sauf que la a ce moment rien n'empêche i d'aller dans les négatifs, et en plus maintenant rien n'empêche i de passer au dessus de la taille du nombre ?
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 21:07
0
Merci
Ahh oui d'accord dans le premier cas on a un i qui commence a 0 et qui va dans les négatifs comme tu avait dit !


Oui. Tout à fait.

Dans l'autre, i est a 0 au début, on regarde si i est différent de 0 ce qui est faux puisqu'on le met a 0 justement et ensuite on décrémente donc on a un i qui passe encore dans les négatifs....................

Pas tout à fait. i valant 0, la condition n'est pas rempli, et la boucle s'arrête. Donc i n'ira pas dans les négatifs, et restera à 0.

Donc quand tu dis "qu'on inverse les bornes", cela veut dire que cela

Inverser les bornes, ce n'est pas faire un copier coller naïf. C'est modifier le nombre de départ et d'arrivé, de manière à aller de la fin vers la début. Il s'avère qu'inverser les valeurs de départ et d'arrivé, cela suffit normalement.
Je te rappelle la syntaxe d'un for:
for (int i = DEPART; CONDITION; INCREMENT)
{
}


int i != 0 => Est-ce pour toi une syntaxe correcte ? int i = 0 veut dire: déclarer un entier et l'initialiser i à 0. Que veut dire int i != 0 ? Initialiser un entier et ne pas l'initialiser à 0 ?

i >= nb_size - 1 => Donc tu vas boucler *tant que* i reste plus grand que nb_size - 1. Si ton i commence à 0, à quel moment ça restera vrai ?

Si tu as du mal à conceptualiser cela, essaie de la visualiser autrement.
Ecris les choses suivantes sans boucle, peut être que ça t'aidera:
  • Affiche le dernier élément d'un tableau de taille "size".
  • Affiche l'avant dernier élément d'un tableau de taille "size".
  • Affiche l'avant avant dernier élément d'un tableau de taille "size".
  • Affiche l'avant avant avant dernier élément d'un tableau de taille "size".

Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 24 nov. 2015 à 21:39
0
Merci
Pour afficher le dernier élément on fait : size - 1
Pour afficher l'avant dernier élément on fait : size - 2
Pour afficher l'avant avant dernier élément on fait : size - 3
Pour afficher l'avant avant avant dernier élément on fait : size - 4
etc.....................?
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 24 nov. 2015 à 22:27
0
Merci
Donc... ?
Au premier tour i vaudra size - 1.
Au deuxième tour i vaudra size - 2.
etc..
Jusqu'à ce que tu atteignes 0.

Quel est la valeur de départ ? D'arrivé ? Donc ton for ira de ... à ... ?
Si tu suis la syntaxe donnée dans le précédent post, ça donnera ?
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 25/11/2015 à 09:48
0
Merci
Et bien ma valeur de départ sera size-1, et celle d'arrivé sera 0, et on fera une décrémentation de --i ??

Normalement ça ferai cela :
for (int i = size-1; i >= 0; --i) ??
???

Mais t'inquiète c'est bon j'ai trouvé...... :
for (i = nbre_size-1; i >= 0; --i)

    cout << " Afficher le nombre de d\x82part : " << tableau[i] << endl ;

J'ai testé pour plusieurs nombres ça marche très bien
Commenter la réponse de TheRogerFederer
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 25 nov. 2015 à 10:41
0
Merci
for (i = nbre_size-1; i >= 0; --i)


Oui, c'est ça \o/ !
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.