Comptage et décomposition

Comptage et décomposition - C++ - Programmation

Marsh Posté le 26-12-2016 à 19:05:39    

Bonsoir à tous et merci déjà de venir m'aider.
 
J'ai 2 exercices à faire et j'ai quelques idées mais j'ai besoin de vous pour m'aider à bien m'orienter.
 
Le premier exercice est que dans une chaîne de caractères entré par l'utilisateur, je souhaite compter le nombres de lettres et de chiffres mais je n'arrive qu'à compter le nombres de caracteres dans la chaine mais je ne vois pas comment on peut séparer les chiffres et les lettres (à part avec la table ASCII mais ça risque de me faire un programme de fou).
 
Pour vous donner un exemple, je dois faire ceci : dans la chaîne, il y a "Je vais avoir 17 ans", je dois dire qu'il y a 19 lettres et 2 chiffres.
 
Le 2e exercice consiste à récupérer la chaîne de caractères et de découper la phrase afin d'avoir une liste avec les mots. Il faut savoir que la chaîne de caractères est dans un tableau appellé tableauCar et dans ma consigne, je prend chaque mot et le copier dans le tableau qui s'appelle tableauMot.
 
Un exemple : dans tableauCar, il y a "Je suis un programmeur" et dans tableauMot, je dois avoir tableauMot[0]=Je / tableauMot[1]=suis / tableauMot[2]=un / tableauMot[3]=programmeur
 
Pour celui ci, j'avais pensé à un pointeur avec un if qui permet de dire que si le pointeur détècte un espace, je récupère le mot d'avant et je le copie dans tableauMot[compteur] et compteur je l'incrémente de 1 à chaque espace.
 
Voila, j'espère que vous pourrez m'aider à trouver la solution :)
 
Bonne soirée / Bonne journée à tous
Et Bonne Année 2017 !!!

Reply

Marsh Posté le 26-12-2016 à 19:05:39   

Reply

Marsh Posté le 26-12-2016 à 20:54:44    

Pour le premier exo, converti chaque caractère en INT (pour avoir l'ascii), si c'est compris entre 48 et 57 (inclus) alors c'est un nombre, sinon c'est un caractère.
De ce fait ton code reste assez court avec cette condition.
 
Pour le deuxième exo ton idée me semble bonne ;)

Reply

Marsh Posté le 26-12-2016 à 20:59:05    

Merci Devil
 
J'ai tenté ça mais il me met comme erreur : forbids comparison between pointer and integer mais je ne vois pas ou est l'erreur :
 
        char*ptc;
        int lettre=0, chiffre=0;
        if (ptc<=65 && ptc>=90)
        {
            lettre++;
        }
        else if (ptc<=48 && ptc>=57)
        {
            chiffre++;
        }
si le caractere est compris entre 65 et 90 je fais lettre=lettre+1
si le caractere est compris entre 48 et 57, je fais chiffre=chiffre+1
donc a la fin j'affiche lettre et chiffre pour avoir mes 2 valeurs

Reply

Marsh Posté le 26-12-2016 à 22:05:03    

Code :
  1. #include <iostream>
  2. #include <cctype>
  3. int main () {
  4.   char c;
  5.   int lettres(0), chiffres(0);
  6.  
  7.   std::cout << "Entrez une phrase, et terminez par un retour chariot." << std::endl;
  8.  
  9.   while (std::cin.get(c)) {
  10.     if (std::isalnum(c)) {
  11.       std::isdigit(c)?chiffres++:lettres++;
  12.     }
  13.     if (c == '\n') {
  14.       break;
  15.     }
  16.   }
  17.  
  18.   std::cout << "Il y avait " << chiffres << " chiffres et " << lettres << " lettres." << std::endl;
  19.  
  20.   return 0;
  21. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-12-2016 à 12:01:14    

ping59 a écrit :

Merci Devil
 
J'ai tenté ça mais il me met comme erreur : forbids comparison between pointer and integer mais je ne vois pas ou est l'erreur :
 
        char*ptc;
        int lettre=0, chiffre=0;
        if (ptc<=65 && ptc>=90)
        {
            lettre++;
        }
        else if (ptc<=48 && ptc>=57)
        {
            chiffre++;
        }
si le caractere est compris entre 65 et 90 je fais lettre=lettre+1
si le caractere est compris entre 48 et 57, je fais chiffre=chiffre+1
donc a la fin j'affiche lettre et chiffre pour avoir mes 2 valeurs

À part le fait que c'est pas du C++, le problème c'est l'étoile. Tu déclares un pointeur sur un char mais tu veux un char.
 
PS: Pour la prochaine fois, le code entre balises stp. http://forum-images.hardware.fr/icones/message/c.gif


Message édité par rat de combat le 27-12-2016 à 12:01:46
Reply

Marsh Posté le 27-12-2016 à 16:07:14    

Noter que pour ce genre de chose, le fait qu'on soit en C++ ne joue pas des masses, on aurait aussi bien pu l’écrire en C:

Code :
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. int main () {
  4.   int lettres = 0, chiffres = 0;
  5.  
  6.   printf("Entrez une phrase, et terminez par un retour chariot.\n" );
  7.   while (char c = getchar()) {
  8.     if (c == EOF) {
  9.       printf("Erreur en lecture!" );
  10.       break;
  11.     }
  12.     if (c == '\n') {
  13.       printf("Il y avait %d chiffres et %d lettres.", chiffres, lettres);
  14.       break;
  15.     }
  16.     if (isalnum(c)) {
  17.       isdigit(c)?chiffres++:lettres++;
  18.     }
  19.   }
  20.  
  21.   return 0;
  22. }


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-12-2016 à 21:06:41    

gilou a écrit :

Noter que pour ce genre de chose, le fait qu'on soit en C++ ne joue pas des masses, on aurait aussi bien pu l’écrire en C:

En tTout à fait exact :jap: , mais le sujet dit C++, alors autant faire du vrai C++. Il y a pas mal de gens qui mélangent/confondent/... les deux.


Message édité par rat de combat le 27-12-2016 à 22:00:40
Reply

Marsh Posté le 28-12-2016 à 00:01:22    

Certes, mais c'est typiquement le genre de chose qui n'exploite en rien les capacités du C++.
A la limite, pour les exploiter, faudrait utiliser la locale courante, ca compterait aussi les caractères accentues. Mais g++ sous windows ne sait pas utiliser de locale autre que C ou POSIX, alors...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed