TheRogerFederer
Messages postés256Date d'inscriptionmercredi 31 mars 2010StatutMembreDernière intervention10 mars 2016
-
23 nov. 2015 à 10:45
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
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 ??
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;
}
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....
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 23 nov. 2015 à 13:27
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...
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 24 nov. 2015 à 16:19
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).
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 :
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 24 nov. 2015 à 17:30
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).
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.
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 ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 24 nov. 2015 à 21:07
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".
TheRogerFederer
Messages postés256Date d'inscriptionmercredi 31 mars 2010StatutMembreDernière intervention10 mars 20161 24 nov. 2015 à 21:39
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.....................?