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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 152
    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 152
    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 152
    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 152
    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.

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