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 :

Petit probleme dans un exo


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Petit probleme dans un exo
    Bonjour,

    Je débute en programmation et je bug pour un exo.
    Le but est d'afficher le rang de chaque chiffre d'un nombre saisi. Jusque là pas de souci.
    Je bloque sur un problème d'occurrence. Il faut afficher qu'une fois un chiffre. Si il est saisi plusieurs fois, il faut afficher les rangs qu'il occupe.

    voici mon code :

    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
    #include <iostream>
     
    unsigned long int val;
    unsigned long int valTemp;
    int rangs;
    int a;
    int i,j;
     
    int main()
    {
        std::cout << "Entrer un entier naturel : ";
        std::cin >> val;
     
        // Transfert de val dans une autre variable.
        valTemp = val;
     
        rangs = 0;
     
        // Calcul du nombre de rangs.
        while (valTemp > 0)
        {
            valTemp = valTemp / 10;
            rangs++;
        }
     
        // Initialisation d'un tableau de la même taille que le nombre de rangs.
        int tabVal[rangs];
        tabVal[rangs];
     
        for(i = 0; i < rangs; i++)
        {
            tabVal[i] = 0;
        }
     
        // transfert du rang n dans le tableau tabVal à la position n.
        for(i = 0; i < rangs; i++)
        {
            tabVal[i] = val % 10;
            val = val / 10;
        }
     
        // C'est là que je bug.
        for(i = 0; i < rangs; i++)
        {
            std::cout << tabVal[i] << " : " << i << std::endl;
        }
     
        return 0;
    }
    Si quelqu'un peu voler à mon secour.

    Merci

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si l'exercice le permet, remplir une string pour la saisie et stoquer chaque chiffre ( en char ) dans une map.
    Pour chaque chiffre, utiliser un vector pour enregistrer les rangs.
    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
    #include <iostream>
    #include <map>
    #include <vector>
     
    int main()
    {
        std::cout << "Entrer un entier naturel : ";
     
        std::string val;
        std::getline( std::cin, val );
     
        //Le chiffre et ses rangs
        std::map< const char, std::vector< unsigned int >> letter_pos;
     
        for( unsigned int p = 0; p < val.size(); p++ )
        {
            //Pour chaque chiffre, on enregistre son rang
            letter_pos[ val[ p ]].push_back( p );
        }
        ....
    }
    Ne reste plus qu'a dérouler le tout.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Merci pour la réponse. Malheureusement il faut utiliser uniquement un unsigned long int pour la saisi mais j'ai trouvé la réponse hier.

    Voici le code (je ne sais pas si c'est particulièrement optimisé) :

    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
    #include <iostream>
     
    unsigned long int val;
    unsigned long int valTemp;
    int rangs;
    int a;
    int i,j;
     
    int main()
    {
        std::cout << "Entrer un entier naturel : ";
        std::cin >> val;
     
        // Transfert de val dans une autre variable.
        valTemp = val;
     
        rangs = 0;
     
        // Calcul du nombre de rangs.
        while (valTemp > 0)
        {
            valTemp = valTemp / 10;
            rangs++;
        }
     
        //std::cout << rangs - 1 << std::endl << std::endl;
     
        // Initialisation d'un tableau de la même taille que le nombre de rangs.
        int tabVal[rangs];
     
        for(i = 0; i < rangs; i++)
        {
            tabVal[i] = 0;
        }
     
        // transfert du rang n dans le tableau tabVal à la position n.
        for(i = 0; i < rangs; i++)
        {
            tabVal[i] = val % 10;
            val = val / 10;
        }
     
        //for(i = 0; i < rangs + 1; i++)
        //{
        //    std::cout << tabVal[i];
        //}
     
        a = 1; //Variable utilisé pour compenser j.
     
        for(i = 0; i < rangs; i++)
        {
            if(tabVal[i] != -1)
            {
                std::cout << tabVal[i] << " : " << i << std::endl;
            }
     
            for(j = a; j < rangs; j++)
            {
                if(tabVal[i] == tabVal[j])
                {
                    std::cout << j << std::endl;
                    tabVal[j] = -1;
                }
            }
            a++; // Compense j. j doit toujours rester 1 unité au-dessus de i.
        }
        return 0;
    }

    Edit : Et Merde, y a une erreur lorsque ça boucle avec j il faut ajouter au if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((tabVal[i] == tabVal[j] && (tabVal[j] != -1))
    Edit 2 : Arf maintenant je bug sur la reconstitution du nombre à partir du poids.
    Si quelqu'un peut m'aider ?

    Merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Re,

    Bon j'ai quasiment terminé mon exo. J'ai rajouté un tableau à 2 dimensions pour stocker le rang d'occurrence puis reconstituer le nombre ensuite.


    Je me heurte encore à un souci. A la fin de mon programme je me retrouve avec un tableau d'entiers. On me demande de le transformer en un entier long non signé. Je ne sais pas comment faire.

    quelqu'un pourrait il m'aider svp ?

    merci.

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Re !
    Sans doute en faisant l'inverse de cela ?!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        // transfert du rang n dans le tableau tabVal à la position n.
        for(i = 0; i < rangs; i++)
        {
            tabVal[i] = val % 10;
            val = val / 10;
        }
    J'ai rajouté un tableau à 2 dimensions pour stocker le rang d'occurrence puis reconstituer le nombre ensuite.
    En quel honneur ce tableau à deux dimensions ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    En quel honneur ce tableau à deux dimensions ?
    A partir d'un tableau contenant les chiffres qui composent le nombre je calcul le(s) rang(s) d'occurrence des chiffres si occurrence il y a.
    Le problème c'est qu'avec cette méthode je ne conserve pas le(s) rang(s) d'occurrence, je ne fait qu'afficher.

    D'où l'idée d'utiliser une matrice :
    - Dans la 1° colonne est stocké les chiffres qui composent le nombre sans leur occurrence.
    ex : si le nombre saisi est 223344 :
    la 1° colonne contiendra 234.
    - Dans la 2° colonne est stocké le(s) rang(s) où le chiffre apparaît.
    ex : pour 223344 on a :
    4 : 0 1 (4 est au rang 0 et 1)
    3 : 2 3
    2 : 4 5

    Voici ma boucle principale modifiée :
    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
    for(i = 0; i < rangs; i++)
            {
                // Va servir pour i > 0.
                if(tabVal[i] != -1)
                {
                    gotoxy(1, i + 2);                               // Gestion de l'affichage. Position du curseur.
                    tab[i][0] = tabVal[i];                          // Dans la matrice, les chiffres sont affichés sur la
                                                                    // premières colonne. Le rang où on les retrouves est
                                                                    // affiché sur la ligne correspondant au chiffre.
                    std::cout << tab[i][0] << " : " << i << " ";    // Affichage de la première colonne ((0,0), (1, 0), (2,0) ...).
                }
     
                // Boucle imbriquée qui va permettre de stocker dans la matrice le rang d'occurrence.
                for(j = a; j < rangs; j++)
                {
                    // Si tabval[i] est égal à tabVal[i + 1].
                    if((tabVal[i] == tabVal[j]) && (tabVal[j] != -1))
                    {
                        tab[i][j] = j;              // On stock le(s) rang(s) d'occurence sur la même ligne.
                        tabVal[j] = -1;             // On affecte -1 à tabVal[j] pour éviter d'afficher l'occurrence.
                        std::cout << tab[i][j] << " ";     // On affiche le rang d'occurence.
                    }
                }
                a++; // Compense j. j doit toujours rester 1 unité au-dessus de i.
            }
    Après, à partir de la matrice, je reconstitue le nombre (ce qui est demandé dans l'exo), que je remet dans tabVal[], puis je convertis tabVal en un seul entier.
    Enfin, je ne sais pas si c'est légal mais mon compilo ne bronche pas je transfert cet entier dans un entier long non signé (demandé dans l'exo) de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //val = unsigned long int  entier = int
    val = entier

  7. #7
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Le problème c'est qu'avec cette méthode je ne conserve pas le(s) rang(s) d'occurrence, je ne fait qu'afficher.
    Cette boucle d'affichage ne devrait pas avoir à modifier les valeurs qu'elle imprime.
    Ce n'est pas son rôle, et cela implique d'avoir des copies de tableaux pas nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i = 0; i < rangs; i++)
        for(j = a; j < rangs; j++)
    La difficulté de cette boucle est d'eviter de retomber sur le chiffre d'un rang déjà controlé.

    Les consignes :
    Le but est d'afficher le rang de chaque chiffre d'un nombre saisi. Jusque là pas de souci.
    Je bloque sur un problème d'occurrence. Il faut afficher qu'une fois un chiffre. Si il est saisi plusieurs fois, il faut afficher les rangs qu'il occupe.
    Le plus simple est donc de chercher les rangs de chaque chiffre existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( unsigned int number = 0; number < 10; number++ )
    D'une pierre de coup, on peut imprimer le chiffre et ses rangs.

Discussions similaires

  1. petit probleme dans amarok
    Par PhiberOptik dans le forum KDE
    Réponses: 1
    Dernier message: 19/07/2007, 21h22
  2. un petit probleme dans mon code
    Par hanene_z dans le forum C
    Réponses: 9
    Dernier message: 22/12/2006, 17h06
  3. Réponses: 6
    Dernier message: 02/08/2006, 17h24
  4. petit probleme dans un code : theoreme de pythagore
    Par ETI-trian dans le forum C++
    Réponses: 3
    Dernier message: 15/10/2005, 13h13
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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