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 :

Calculer le nombre de lettres (grand débutant)


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut Calculer le nombre de lettres (grand débutant)
    Voilà je suis sur un exercice d'un bouquin et je bloque un peu .

    En fait l'exercice demande d'écrire un programme qui demande à l'utilisateur d'entrer une phrase puis qui écrit : Nombre de lettres a : x, nombre de lettres b : x, nombres de lettres c : x...

    Voilà ce que j'ai pondu pour le moment (oui oui ça doit être très facile pour vous ^^) :

    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
    #include <iostream>
    using namespace std;
     
    int main()
    {
       const int TAILLE = 27;
       char lettres [TAILLE] = "abcdefghijklmnopqrstuvwxyz";
     
       const int MAX = 200;
       char phrase [] = {0};
     
       cout << "Entrez une phrase : ";
       cin.getline (phrase, MAX);
     
       for (int i = 0 ; i < 26 ; i++) //Boucle pour chaque lettre de l'alphabet
       {
          int total = 0; //Nombre d'une lettre
     
          for (int j = 0 ; phrase [j] != '\0' ; j++) //Analyse chaque élément de la phrase et ajoute 1 au compteur
          {                                          //quand il trouve la lettre
             if (phrase [j] == lettres [i])
             {
                ++total;
             }
          }
     
          cout << "Nombre de " << lettres [i] << " : " << total << endl;
       }
     
       char response;
       cin >> response;
       return 0;
    }
    J'ai aussi essayé à l'aide de pointeurs mais ça marche encore moins bien et j'en vois pas l'utilité ^^

    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
    #include <iostream>
    using namespace std;
     
    int main()
    {
       const int TAILLE = 27;
       char lettres [TAILLE] = "abcdefghijklmnopqrstuvwxyz";
       char * lettrePtr = lettres;
     
       const int MAX = 200;
       char phrase [] = {0}, * phrasePtr = phrase;
     
       cout << "Entrez une phrase : ";
       cin.getline (phrase, MAX);
     
    for (; *lettrePtr != '\0' ; lettrePtr++) //Boucle pour chaque lettre de l'alphabet
       {
          int total = 0; //Nombre d'une lettre
     
          for (; *phPtr != '\0' ; phPtr++) //Analyse chaque élément de la phrase et ajoute 1 au compteur
          {                                 //quand il trouve la lettre
             if (*phPtr == *lettrePtr)
             {
                ++total;
             }
          }
     
          cout << "Nombre de " << *lettrePtr << " : " << total << endl;
       }
     
       char response;
       cin >> response;
       return 0;
    }
    Mais regarder la première version, c'est celle qui marche le mieux.

    Donc j'ai fait divers tests, ça marche bien quand on entre qu'une lettre. Par exemple si je rentre t il me mettra Nombre de t : 1.

    Quelques problèmes : si je rentre plus de quatre fois la même lettre, il plante. Si par exemple je mets aaaa il me mettra bien "Nombre de a : " 4, mais si je mets aaaaa il plantera. Va savoir...

    Autre problème, dès que j'entre des chaînes un peu plus longues (mais inférieures à la valeur max !), ben il fait un résultat bizarre, enfin vous allez voir, il remplace les lettres. Il met par exemple "Nombre de a", puis juste en dessous au lieu de "Nombre de b", il met "Nombre de m", ou "Nombre de ".

    EDIT : par exemple écrivez a. Ca marche bien. ab : ca marche bien aussi. zabc ca marche bien aussi, zabc d là ca plante :/

    Enfin testez le ce sera plus rapide ^^.

    Enfin, j'aimerais pouvoir prendre en charge les majuscules aussi. Parceque là si je tape a A il me met que une fois a. J'avias pensé dans le if a rajouter un toupper ou une connerie comme ça.
    Ensuite est-ce possible de rendre le code plus court, sans forcément deux boucles for et avec si possibles des techniques faciles (j'ai pas encore tout vu, je suis encore aux pointeurs là).

    Et enfin, quelle utilité il y aurait à utiliser des pointeurs comme j'ai "essayé" de le faire dans le deuxième code.

    Merci ^^.

  2. #2
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    Dans l'idée ça me parait correct, mais il y a un hic:

    const int MAX = 200;
    char phrase [] = {0};
    Tu ne voulais pas plutôt déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int MAX = 200;
       char phrase [MAX];
    ?

    Et dans la version sur les pointeurs, tu devrais réinitialiser le pointeur sur le début de la phrase à chaque nouvelle lettre. Mais en effet pour réaliser ce que tu souhaite, ça n'a pas vraiment d'intéret d'utiliser les pointeurs, à part pour rendre le code moins lisible (enfin, un petit intéret pédagogique quand même !)

    Sinon une autre remarque, pour faire une pause à la fin d'un programme C++, on préfère généralement cette méthode là :http://c.developpez.com/faq/cpp/?pag...e#SL_cin_pause


    Et enfin, tu demandes si il existe une méthode plus simple. Oui oui
    En fait tu utilises beaucoup d'outils du C ici (char*, entres autres).

    Regarde ces quelques articles de la FAQ pour comprendre ce que c'est que la "bibliothèque standard" (STL), et voir qu'elle te facilite beaucoup la tâche. Regarde par exemple comment fonctionnent les strings (chaines de caractères standard en C++), et les conteneurs standards.
    http://c.developpez.com/faq/cpp/?page=STL

    Normalement, ce code peut s'écrire en quelques lignes, comme ceci par exemple: (avant de lire ce code, je te conseille d'avoir rapidement parcouru les pages sur la STL, et les 2 posts qui suivent)
    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
    #include <string>  // pour string et toupper
    #include <map>  // pour map
    #include <iostream>  // pour cout et endl
    #include <algorithm> // pour transform
     
    void NombreOccurences(string ligne)
    {
    	// a chaque lettre on va associer un nombre d'occurences
    	map<char,int> occurences; 
     
    	// on passe toute la chaine en majuscule pour ne pas faire la différence
    	transform( ligne.begin(), ligne.end(), ligne.begin(), toupper);
     
    	// sa taille
    	size_type size = ligne.size();
     
    	// pour chaque lettre de la chaine
    	for (size_type i=0; i<size, ++i)
    	{
    		// on augmente son nombre d'occurences de 1
    		++ ( occurences[ ligne[i] ] );
    	}
     
    	// et on affiche tout ca
    	map<char,int>::const_iterator ite = occurences.begin();
    	while (ite!=occurences.end())
    	{
    		cout << "il y a " << ite->second << " occurences de " << ite->first << endl;
    		++ite;
    	}
    }
    C'est pas beaucoup plus court, mais surement plus lisible: 1 seule boucle (+ 1 pour l'affichage, mais bon ), peu d'instructions...

    Après, par rapport aux pointeurs, c'est à voir. Personnellement, je dirais que si tu commences le C++, ce n'est pas la peine de vraiment rentrer dans le détail des pointeurs, de l'implémentation d'une liste chainée, etc .... Regarde plutôt directement la STL, la manipulation des références, du mot clé "const", etc ... ça te donnera des bonnes bases des le début. Tu pourras regarder les concepts comme les pointeurs, le polymorphisme, etc plus tard. Mais d'autres personnes sont de l'avis inverse (dont beacoup de profs) J'ai peut être une très mauvais pédagogie

    Il me semble qu'il y a deja au beaucoup de posts sur le sujet, à toi de voir comment tu souhaite avancer !
    And still we will be here, standing like statues ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    sinon, voila un code fait avec des char :
    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
     
    #include <iostream>
    using namespace std;
     
    int main()
    {
        char phrase[] = "la phrase";
     
        int letter_counter[26];
     
    	for(int i='a';i<='z';i++)
    	{
    	    letter_counter[i-'a'] = 0;
    	    for(int j=0;phrase[j]!='\0';j++)
    	    {
    	        if(phrase[j] == i)
    	        {
                    letter_counter[i-'a']++;
    	        }
    	    }
    	    cout << "nombre de " << char(i) << " : " << letter_counter[i-'a'] << endl;
    	}
    }
    Il faut l'adapter a tes besoins mais il compte le nombre de charque lettre dans un tableau de char.

  4. #4
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Oui c'est déjà plus lisible !

    Mais au niveau algorithme, il y a encore 2 boucles, alors que je pense qu'une seule pourrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int j=0; phrase[j]!='\0'; j++)
    {
         letter_counter[ phrase[j]-'a' ] ++;
    }
    Sauf que ce code n'est pas sécurisé: aucune vérification des bornes du tableau, et d'ailleurs si phrase[j] n'est pas dans [a-z] on accède à un indice hors des bornes. D'où l'utilisation de la map pour accepter n'importe quel caractère (même de la ponctuation, pourquoi pas).
    And still we will be here, standing like statues ...

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Merci. En effet le problème était à cause du tableau que j'avais initialisé à 0, mainteannt ça marche très bien.

    Bon je dois partir, je regarderai demain tout ce que vous m'avez dit, je vous remercie

    Sinon pour les strings j'ai commencé, je suis sur un chapitre qui traite des pointeurs et des chaines

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Bonjour,

    voilà je viens de rajouter la fonction toupper, je pensais pas que ça allait être si simple, ça marche du tonerre, que je tape AAAA ou aaaa ça marche parfait, enfin voilà je suis content, j'en réussissais pas beaucoup des exercices de ce bouquin, là j'ai réussi presque tout seul ^^.

    Juste un dernier petit bug :

    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
    #include <iostream>
    using namespace std;
    #include <cctype>
     
    int main()
    {
       const int TAILLE = 27;
       char lettres [TAILLE] = "abcdefghijklmnopqrstuvwxyz";
     
       const int MAX = 200;
       char phrase [MAX];
     
       cout << "Entrez une phrase : ";
       cin.getline (phrase, MAX);
     
       for (int i = 0 ; i < 26 ; i++) //Boucle pour chaque lettre de l'alphabet
       {
          int total = 0; //Nombre d'une lettre
     
          for (int j = 0 ; phrase [j] != '\0' ; j++) //Analyse chaque élément de la phrase et ajoute 1 au compteur
          {                                          //quand il trouve la lettre
             if (phrase [j] == lettres [i] || phrase [j] == toupper (lettres [i]) )
             {
                ++total;
             }
          }
     
          cout << "Nombre de " << lettres [i] << " - " << toupper (lettres [i])
               << " : " << total << endl;
       }
     
       cout << "Appuyez sur entree pour continuer...";
       cin.ignore( numeric_limits<streamsize>::max(), '\n' );
       return 0;
    }
    le toupper marche parfaitement bien dans la boucle, mais à la fin il marche mal, il semble m'afficher le code ASCII de la lettre et non la lettre elle même. Allez hop dès que ça c'est corrigé je mets que le problème est résolu

    NB : j'ai regardé vos codes, j'ai compris celui de the_penguin mais il y a toujours deux boucles. Celui de bigquick (le second), j'ia un peu compris mais j'ai un peu du mal avec les tableau [tt [xx] ] lol ^^. C'est bien prise de tête ça ^^.

    Enfin j'ai regardé la STL, le lien que tu m'a montré, c'est les templates en fait ^^. J'ai vu ça très rapidement (juste le principe d'un template sur une page de mon bouquin), mais ya un chapitre complet sur la STL, les templates, les trucs vector dans 5-6 chapitres, je vais pas aller trop vite je préfère attendre le chapitre calmement, en attendant le prochain chapitre que j'ai c'est... les classes ^^.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction de conversion de nombre en lettres
    Par david_chardonnet dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2021, 17h51
  2. Réponses: 3
    Dernier message: 21/06/2011, 15h08
  3. calcul de nombre infiniment grand
    Par jerem721 dans le forum C
    Réponses: 17
    Dernier message: 27/10/2010, 22h22
  4. Réponses: 5
    Dernier message: 11/09/2007, 17h15
  5. Calculer le nombre de lettre taper par seconde
    Par amrock dans le forum C++
    Réponses: 5
    Dernier message: 06/07/2007, 10h46

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