IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Affichage du poids d'un chiffre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut Affichage du poids d'un chiffre
    Bonjour , je dois créer un algorithme (en utilisant seulement des variables type numérique) qui permet de saisir un nombre entier naturel et qui affiche le poids d'un chiffre en partant de la droite . par exemple :

    Je saisis Exemple :

    Si le nombre saisi est :

    7377683

    L’affichage doit donner :

    3 : 0 5

    6 : 2

    7 : 3 4 6

    8 : 1

    7377683

    Je suis donc parti sur un tableau , modulo et division successive :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <iostream>
    using namespace std;
     
    int main() {
        int tableau[9];
    	int i;
        int nombre1;
    	int nombre2;
    	int nombre3;
    	unsigned long int nombre;
    	cout << "Entrez un nombre";
    	cin >> nombre;
     
    	nombre1 = nombre % 10;
        tableau[0] = nombre1;
        tableau[1] = 1;
        while (nombre>10){
     
    		nombre = nombre / 10;
    		nombre2 = nombre % 10;
            cout << nombre2 << "\n" ;
     
    		for (i=1; i < 9; i++){
    		        tableau[i]= nombre2 ;
    		}
     
     
        }
     
        cout <<  tableau[0] << "\n" ;
        cout <<  tableau[1] << "\n" ;
        cout <<  tableau[2] << "\n" ;
        cout <<  tableau[3] << "\n" ;
        cout <<  tableau[4] << "\n" ;
        cout <<  tableau[5] << "\n" ;
        cout <<  tableau[6] << "\n" ;
        cout <<  tableau[7] << "\n" ;
        cout <<  tableau[8] << "\n" ;
        cout <<  tableau[9] << "\n" ;
     
        cout << "Entrez un nombre";
    		cin >> nombre;
     
    }

    Le probleme est que le tableau ne se remplit qu'avec la derniere valeur de nombre2 , je ne comprends pas.

    Je suis parti sur ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <iostream>
    using namespace std;
     
    int main() {
        int nombre3=0;
    	int i =0;
        int nombre1;
    	int nombre2;
    	unsigned long int nombre;
    	cout << "Entrez un nombre";
    	cin >> nombre;
     
    	nombre1 = nombre % 10;
        cout << nombre1 << ":"<< "0" << "\n";
     
        while (nombre>10){
     
    		nombre = nombre / 10;
    		nombre2 = nombre % 10;
            i++;
    		cout << nombre2 <<  ":"  << i <<"\n";
     
     
        }
     
        cout << "Entrez un nombre";
    		cin >> nombre;
     
    }
    l'Algorithme fonctionne mais je ne sais pas comment faire pour effacer les doublons ... Je pourrais passer par des conditions mais pour ça il faudrait que ma variable nombre2 stocke toutes les valeurs prises dans des variables indépendantes. Comment faire ? Merci de votre aide

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Bonjour,

    C'est exactement ce que tu lui demandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (nombre>10){
     
    		nombre = nombre / 10;
    		nombre2 = nombre % 10;
            cout << nombre2 << "\n" ;
     
    		for (i=1; i < 9; i++){
    		        tableau[i]= nombre2 ;
    		}
    //[...]
    }
    traduction "tant que nombre > 10, nombre2 devient = à nombre module 10, puis tu me mets ce nombre2 dans toutes les cases de mon tableau allant de 1 à 8."

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Bonjour,

    C'est exactement ce que tu lui demandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (nombre>10){
     
    		nombre = nombre / 10;
    		nombre2 = nombre % 10;
            cout << nombre2 << "\n" ;
     
    		for (i=1; i < 9; i++){
    		        tableau[i]= nombre2 ;
    		}
    //[...]
    }
    traduction "tant que nombre > 10, nombre2 devient = à nombre module 10, puis tu me mets ce nombre2 dans toutes les cases de mon tableau allant de 1 à 8."
    Comment je peux faire pour stocker toute les valeurs prises par nombre2 dans un tableau ? Je vois pas du tout...

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Comme cela t’a été dit, il te faut plutôt un tableau… de tableaux.

    En effet, un tableau d’entiers te permet seulement de stocker la dernière position. Pour en stocker plus d’une, il te faut un autre tableau, de taille variable celui-ci. Et ça, en C++, ça s’appelle std::vector.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    J'en suis arrivé à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    //============================================================================
    // Name        : poids.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
     
    #include <iostream>
    using namespace std;
     
    int main() {
        int tableau[9];
    	int i;
        int nombre1;
    	int nombre2;
    	int nombre3;
    	int nombre4;
    	int nombre5;
    	int nombre6;
    	int nombre7;
    	int nombre8;
    	int nombre9;
    	unsigned long int nombrediv17;
    	unsigned long int nombrediv16;
    	unsigned long int nombrediv15;
    	unsigned long int nombrediv14;
    	unsigned long int nombrediv13;
    	unsigned long int nombrediv12;
    	unsigned long int nombrediv11;
    	unsigned long int nombrediv10;
    	unsigned long int nombre;
    	cout << "Entrez un nombre";
    	cin >> nombre;
     
    	nombre1 = nombre % 10;
        tableau[0] = nombre1;
     
        nombrediv10 = nombre / 10;
    	nombre2 = nombrediv10 % 10;
        tableau[1]= nombre2 ;
     
        nombrediv11 = nombrediv10 / 10;
        nombre3 = nombrediv11 % 10;
        tableau[2]= nombre3 ;
     
        nombrediv12 = nombrediv11 / 10;
        nombre4 = nombrediv12 % 10;
        tableau[3]= nombre4 ;
     
        nombrediv13 = nombrediv12 / 10;
        nombre5 = nombrediv13 % 10;
        tableau[4]= nombre5 ;
     
        nombrediv14 = nombrediv13 / 10;
        nombre6 = nombrediv14 % 10;
        tableau[5]= nombre6 ;
     
        nombrediv15 = nombrediv14 / 10;
        nombre7 = nombrediv15 % 10;
        tableau[6]= nombre7 ;
     
        nombrediv16 = nombrediv15 / 10;
        nombre8 = nombrediv16 % 10;
        tableau[7]= nombre8 ;
     
        nombrediv17 = nombrediv16 / 10;
        nombre9 = nombrediv17 % 10;
        tableau[8]= nombre9 ;
     
     
        for (i=0 ; i <9 ; i++){
        	if (tableau[i]>0 ) {cout << tableau[i] <<":"<< i<< "\n";}
     
     
        }
     
        cout << "Entrez un nombre";
    		cin >> nombre;
     
    }
    maintenant il faut que j'arrive a supprimer les doublons , comment faire pour verifier si une valeur existe déjà dans un tableau ?

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu pars dans une (très) mauvaise direction. Tu n’as pas besoin d’autant de variables.

    En fait, tu as seulement besoin des choses suivantes :
    - le « tableau » de résultat final, qui contient, pour chaque chiffre, les différentes positions auxquelles on les a trouvées dans le nombre donné (en réalité, un tableau de tableau)
    - le chiffre courant, qui serait par exemple le chiffre le plus à droite
    - le nombre courant, c’est à dire le nombre initial auquel on enlève successivement chacun des chiffres courants.

    Normalement, tu n’as pas besoin de plus que ça.

    Essaie déjà d’écrire l’algorithme en français, avec des mots, en partant de ces données, en réfléchissant bien aux différentes opérations que tu dois effectuer (des choses comme « rajouter un élément dans la liste » sont des opérations tout à fait valable), comment tu isoles chaque chiffre. Une fois que tout ça sera clair, tu pourras coder ton algorithme en C++.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Bonjour,

    Citation Envoyé par Mrstark Voir le message
    Si le nombre saisi est :

    7377683

    L’affichage doit donner :

    3 : 0 5

    6 : 2

    7 : 3 4 6

    8 : 1

    7377683

    Je suis donc parti sur un tableau , modulo et division successive :
    Essentiellement, vu l'affichage que tu veux à la fin, j'aurais plutôt dit un tableau de listes (tu utilises 2 dimensions pour afficher ta solution).

    Le probleme est que le tableau ne se remplit qu'avec la derniere valeur de nombre2 , je ne comprends pas.
    C'est pas étonnant, tu remplis ton tableau avec nombre2 à chaque tour de boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		for (i=1; i < 9; i++){
    		        tableau[i]= nombre2 ;
    		}
    Je suis parti sur ça aussi :

    l'Algorithme fonctionne mais je ne sais pas comment faire pour effacer les doublons ... Je pourrais passer par des conditions mais pour ça il faudrait que ma variable nombre2 stocke toutes les valeurs prises dans des variables indépendantes. Comment faire ? Merci de votre aide
    Le plus simple serait que tu reprennes la conception de l'algo : supposons que tu prenne le nombre chiffre par chiffre comme tu sembles vouloir le faire, comment en déduirais-tu la réponse ? Comment stockerais-tu les poids de tes chiffres, pour ne l'afficher qu'à la fin ? Pose ta bonne structure de donnée et ta méthode manuelle, et ça ira mieux

    Bonne journée

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Mrstark Voir le message
    en utilisant seulement des variables type numérique
    Hello,

    Il y à deux façons de faire, soit avec un tableau de std::list, soit avec un tableau de int (ou plutôt unsigned int) et quelques opération bit à bit -> un int peut être vu comme un tableau de booléen. Il est possible de ne pas avoir de tableau, au prix d'une dizaine de lignes.

    Faut voir à quelle point la contrainte "seulement des variables type numérique" doit être respectée.

    Les deux solutions utilisent le même principe et tiennent en moins de 30 lignes, ou ~40 sans tableau : découper le nombre (division / modulo) et ajouter la position de chaque chiffre à une liste (push_back ou opération bit à bit : "or" pour ajouter, "and" pour lire).

    As-tu le droit d'utiliser des tableaux ? std::list ?

    Attention aussi à tes tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tableau[9];
    // ...
    cout <<  tableau[9] << "\n" ;
    Tu accèdes ici au 10eme élément du tableau, qui n’existe pas !

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    C++ truc de fainéant; il te trie ta collection [il faut dire que ce sont des int]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #include <iostream>
    #include <list>
    #include <map>
     
     
    class Elt {
    public:
     
        Elt() {
            indexes_list = NULL;
        }
     
     
        Elt(int first_index) {
            indexes_list = new std::list<int>(1, first_index);
        }
     
     
        ~Elt() {
            if (indexes_list != NULL) {
                delete indexes_list;
                indexes_list = NULL;
            }
        }
     
     
    public:
     
        void add_index(int index) {
    //      Useless Test: the default constructor is never called
    //      if (indexes_list != NULL) {
                indexes_list->push_front(index);
    //      } else {
    //          indexes_list = new std::list<int>(1, index);
    //      }
     
        }
     
     
        void print() {
            if ((indexes_list == NULL) || (indexes_list->empty())) return;
     
            std::list<int>::iterator it = indexes_list->begin();
            std::cout << "occurence: " << indexes_list->size() << std::endl << (*it);
            it++;
     
            for (;it != indexes_list->end(); ++it) {
                std::cout << " - " << (*it);
            }
     
            std::cout << std::endl;
        }
     
     
    private:
     
        std::list<int>* indexes_list;
    };
     
     
     
    // Type List
    // Maybe create a class List
    typedef std::map<unsigned char, Elt*> List;
     
     
     
    void list_remove_all(List& list) {
        if (!list.empty()) {
            for(std::map<unsigned char, Elt*>::iterator it = list.begin(); it != list.end(); ++it) {
                delete ((Elt*) it->second);
                list[it->first] = NULL;
            }
     
            list.erase(list.begin(), list.end());
        }
    }
     
     
     
    void algo(int number, List& list) {
        list_remove_all(list);
     
        Elt* tmp = NULL;
        int nb = number, index = 0;
        unsigned char digit = 0;
     
        while(nb >= 10) {
            nb = (nb / 10);
            index++;
        }
     
        index++;
     
        for(;index > 0; index--) {
            digit =  (number % 10);
            number = (number / 10);
     
            std::cout << "Find " << (int) digit << " (" << index << ")" << std::endl;
     
            tmp = list[digit];
     
            if (tmp != NULL) {
                tmp->add_index(index);
            } else {
                list[digit] = new Elt(index);
            }
        }
    }
     
     
     
    int main() {
        int number = 7377683;
     
        List list;
     
        algo(number, list);
     
        std::cout << std::endl;
     
        for(std::map<unsigned char, Elt*>::iterator it = list.begin(); it != list.end(); ++it) {
            std::cout << "Digit: " << (int) it->first << ", ";
            ((Elt*) it->second)->print();
        }
     
        list_remove_all(list);
    }
    Édit: Mise à jour du découpage du nombre et remplissage de la classe Elt [qui est inutile, quoique on ne sait jamais ]

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Même comme ça je comprends pas tout lol il y a beaucoup de truc en trop comme l'occurence et le find . je peux pas rendre un truc que j'ai pas compris moi même , je viens de commencer . En plus ton algo affiche le "poids" des chiffre en partant de la gauche et en commençant par 1 alors que ça devrait être de la droite et commencer par 0

  11. #11
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Mrstark Voir le message
    Même comme ça je comprends pas tout lol il y a beaucoup de truc en trop comme l'occurence et le find . je peux pas rendre un truc que j'ai pas compris moi même , je viens de commencer . En plus ton algo affiche le "poids" des chiffre en partant de la gauche et en commençant par 1 alors que ça devrait être de la droite et commencer par 0
    Si j'ai fait le code en C++ c'est parce que tu ne comprends le C
    Comment veux-tu coder en C++ si tu ne comprends pas un algo en C "niveau 0"

    Pour le poids, truc très difficile : 4 lignes à commenter et un -- à changer

    PS: avec les std::map il y a une petite facilité - subtilité

  12. #12
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    @foetus: ta classe Elt est inutile, et tu as une utilisation assez dangereuse de map : une map qui contient des ressources allouées sur le tas et qui gère leur durée de vie (une map de pointeurs donc), c'est un cas typique d'utilisation de pointeurs intelligents (unique_ptr).
    Mais dans ton cas, aucune raison d'avoir des pointeurs.

    Concernant l'algo, pas besoin non plus de map, les seuls éléments utiles de la STL sont : cin, cout et éventuellement des list (ou vector).
    Un simple tableau de list/vector suffit.

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/04/2015, 13h17
  2. Affichage du poids du fichier dans barre d'état
    Par etorria dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/03/2008, 18h20
  3. Réponses: 2
    Dernier message: 16/07/2007, 12h52
  4. [TP] Programme affichage de poids, sexe, taille
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 19/06/2007, 01h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo