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 :

Manipulation d'une série d'entiers saisis


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Par défaut Manipulation d'une série d'entiers saisis
    Bonjour

    Je commence tout juste le C++ (1 mois, j'ai déjà quelques connaissances en Ada) et on m'a demandé de réaliser une fonction qui permettrait de faire ceci :

    L'utilisateur entre en une seule fois :
    564 564 5 99 99 99 9 23

    On retourne à l'écran :
    2 fois 564, 1 fois 5, 3 fois 99, 1 fois 9, 1 fois 23

    Le problème est que je ne sais pas comment commencer. Je dois tester chaque caractère individuellement (imposé) au cas où l'utilisateur entrerait autre chose qu'un chiffre (C++ étant moins typé qu'Ada...). On a pas encore vu le type String en cours (je suis étudiant) donc je pense pas que je puisse l'utiliser :/ Je vais utiliser : char chaine[nmbreDeCaractères]

    Résultat, je ne sais pas comment découper mon code mais je pensais faire comme ci :

    Tant que charactèreEntré n'est pas la fin de ligne :

    Si charactèreEntré (est différent de " " (espace))
    Alors on l'ajoute en tant que caractère à une variable. Possible ?
    Sinon... Il faudrait que je change de variable où stocker le prochain résultat.

    Bref, je suis un peu perdu. Vous pourriez m'indiquer une direction svp ? :/

    Merci beaucoup

  2. #2
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonjour,

    Alors, tout d'abord, les char[], char*, c'est du C. C'est plus compliquer d'apprendre à les utiliser correctement en autodidacte que les std::string.

    Si tu nous dis ce que tu as vu en cours, on pourra peut être t'aider sur cette base là (je crains que tu aies un cours de C nommé cours de C++ : ils t'ont fait le coup des strcpy, strcmp et autres cochonneries en appelant ça C++?)

    En attendant, voici des ressources pour apprendre à te servir de la classe string (je doute qu'on te reproche d'apprendre par toi même) :

    Introduction : String et flux d'entrée/sortie standards

    Liste plus exhaustive des fonctions de std::string (Ce site contient du C et du C++, il m'avait bien servit à mes débuts)

    Cours complet de C++

    ++

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Par défaut Màj
    Bonjour,

    Merci bretus pour ta réponse. Pour te répondre, je fais un cours de C/C++. On a vu les types Int (long, short), Float (double), et char (uniquement 1 caractère)

    Alors en fait, il semblerait qu'il ne faille ni utiliser de string, ni de tableau de chars.

    En gros, je DOIS tester les caractères un par un dans une boucle et, et c'est là où ça se corse, dans la même boucle afficher le résultat. Donc je ne peux utiliser de chaines ou de tableaux :/


    Je reprends mon exemple :

    L'utilisateur entre en une seule fois :
    564 564 5 99 99 99 9 23

    On retourne à l'écran :
    2 fois 564, 1 fois 5, 3 fois 99, 1 fois 9, 1 fois 23


    En gros, je dois tester le caractère (si différent de la fin de ligne)
    Comment faire ça sans utiliser de tableau ni de chaine ?

    Il semblerait que je doive utiliser un case dans lequel je teste :
    1) Lecture du premier nombre (caractère précédent est nul)
    2) Lecture du nombre suivant (caractère précédent est " " (espace). Juste ?)
    3) Fin de lecture (quand je tombe sur un espace ?)

    En gros, ce qui m'ennuie c'est comment stoker le résultat du nombre que je teste. Ensuite je peux tester si le nombre actuel est le même que le nombre précédent.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    exercice de C malheureusement
    L'énoncé impose-t-il que les chiffres soient correctement ordonnés ? Sinon, ça me parait impossible avec ta contrainte. (534 9 534 ne pourrait pas être géré comme 2 fois 534)

    As-tu accès à certaines fonctions C ? strtol ? strtoul ? strtod ?
    Sinon, c'est à peine plus compliqué.

    Personnellement, je découperai ça en 2, et, ayant connaissance de strtol, je créerais une fonction bool findNumber(char* src, char** end, int& num) (qui est la signature de strtol en gros ), qui prend la chaîne, trouve le nombre s'il existe et retourne un pointeur sur le caractère suivant pour recommencer à partir de là la lecture.
    Ensuite, dans ta boucle principale, tu as besoin de 3 variables
    - le dernier nombre trouvé dans la chaîne
    - le compteur du nombre de fois que ce nombre a été répété
    - une variable temporaire pour accueillir le nombre qu'on vient de lire
    > si le nombre qu'on vient de lire est le même que le dernier
    >> on incrémente le compteur
    > sinon
    >> on affiche "compteur fois dernier_nombre"
    >> on reset le compteur ()
    > on sauvegarde le nouveau dernier
    <répéter tant qu'un nombre est trouvé (findNumber retourne true par exemple)>
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Par défaut
    Bonjour Bousk,

    Alors, je ne peux pas utiliser ce qu'on a pas vu. Je connais pas strtol, strtoul et strtod. Je ne peux pas non plus créer de sous-programmes donc pas de fonction ni de procédure à part le main.

    L’ordre importe. Le le gère comme ça :
    545 9 545 : 1 fois 545, 1 fois 9, 1 fois 545.

    En tous cas, merci beaucoup pour ta réponse. J'avais justement l'idée de faire à ta manière avec les variables.

    Mon problème, comment créer un nombre XYZ, Exemple : on lit 3, ensuite 4, ensuite 2 et finallement " " (espace) comment créer une variable contenant 342 ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Dommage de ne pas pouvoir créer de sous-programme, ç'aurait rendu le tout plus aisé à lire. Mais ça ne change fondamentalement rien.

    Pour traduire un morceau de chaîne en int, je te propose ce 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
    int toInt(const char* str)
    {
      int n = 0;
      bool doNext = true;
      do {
        switch(*str) {
          case 0:
          case 1:
          case 2:
          case 3:
          case 4:
          case 5:
          case 6:
          case 7:
          case 8:
          case 9:
            n *= 10; // décallage
            n += (*str - '0');
            break;
          default:
            doNext = false;
        }
        ++str;
      } while (doNext );
      return n;
    }
    Bon le code est pas parfait, pas exempt de critiques, mais devrait t'aider à démarrer.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Par défaut
    Merci beaucoup Bousk. Je vais essayer avec ton code et je te redonne des nouvelles dès que j'aurai le temps d'avancer

  8. #8
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    C'est pas parce que tu ne la pas vue en cours que ta po le droit de l'utilisé, c'est un raisonnement tordue! Et si c'est un vrai cour de C++, voila une solution avec la stl pour "éclater" une chaine de caractères:

    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 <string>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <vector>
     
     
    using namespace std ;
     
    int main(int , char** )
    {
    	string sentence = "123 456 789 2";
        istringstream iss(sentence);
    	vector<string> tokens ;
        copy(istream_iterator<string>(iss),
                 istream_iterator<string>(),
                 back_inserter<vector<string>>(tokens));
     
    	copy( tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n") );
    }

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    J'ai l'impression qu'il s'agit d'avoir la notion de variable et d'état. A ce titre, oui, il faut utiliser les flux (std::cin) pour lire la prochaine valeur. L'algorithme pourrait être quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    lire valeur
    valeur_courante <- valeur
    compteur <- 0
    tant que non fini
      lire valeur
      si(valeur == valeur_courante)
          incrémenter compteur
      sinon
          ecrire compteur "fois" valeur_courante
          compteur <- 0
          valeur_courante <- valeur
      fin si
    fin tant que
    Sachant que pour lire une valeur entière, il ne faut pas chercher midi à quatorze heure (*):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int valeur;
    std::cin>>valeur;
    de même pour écrire, il faut utiliser les flux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<compteur<<" fois "<<valeur_courante;

    (*)Pour l'instant on peut supposer que l'utilisateur ne fait pas de saisie de frappe et ce sont toujours des entiers qui sont saisis.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2014, 16h49
  2. saisie d'une série
    Par keli1 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/01/2011, 10h57
  3. Réponses: 2
    Dernier message: 27/05/2007, 22h23
  4. Réponses: 12
    Dernier message: 12/03/2006, 15h53
  5. Créer une série dans un chart
    Par cyrose dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/11/2002, 11h37

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