Partage
  • Partager sur Facebook
  • Partager sur Twitter

compter le nombre de voyelles d'une chaine

Sujet résolu
    4 septembre 2021 à 15:58:43

    bonjour!

    voici l'enoncé de l'exercice

    Écrire un programme qui lit un mot au clavier et qui indique combien de fois sont présentes
    chacune des voyelles a, e, i, o, u ou y, que celles-ci soient écrites en majuscules ou en minuscules, comme
    dans cet exemple :
    Donnez un mot : Anticonstitutionnellement
    Il comporte
    1 fois la lettre a
    3 fois la lettre e
    3 fois la lettre i
    2 fois la lettre o
    1 fois la lettre u
    0 fois la lettre y

    et voici ce que j'ai proposé mais ca ne marche pas

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
    char mot[50];
    int compteur[] = {1,2,3,4,5,6};
    int taille,j=0;
    int c=0;
    printf("Donnez un mot : ");
    scanf("%s",mot);
    taille = strlen(mot);
    for(j = 0;j<taille;j++)
    {
    switch(c)
    {
    case'a':
    compteur[1]++;
    break;
    case'A':
    compteur[1]++;
    break;
    case'e':
    compteur[2]++;
    break;
    case'E':
    compteur[2]++;
    break;
    case'i':
    compteur[3]++;
    break;
    case'I':
    compteur[3]++;
    break;
    case'o':
    compteur[4]++;
    break;
    case'O':
    compteur[4]++;
    break;
    case'u':
    compteur[5]++;
    break;
    case'U':
    compteur[5]++;
    break;
    case'y':
    compteur[6]++;
    break;
    case'Y':
    compteur[6]++;
    break;
    }
    }
    printf("%d fois la lettre a\n",compteur[1]);
    printf("%d fois la lettre e\n",compteur[2]);
    printf("%d fois la lettre i\n",compteur[3]);
    printf("%d fois la lettre o\n",compteur[4]);
    printf("%d fois la lettre u\n",compteur[5]);
    printf("%d fois la lettre y\n",compteur[6]);
    return0;
    
    
    }

    -
    Edité par FatimatouZahraTALL 4 septembre 2021 à 16:50:47

    • Partager sur Facebook
    • Partager sur Twitter
      4 septembre 2021 à 16:01:18

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        4 septembre 2021 à 16:26:09

        Bonjour !

        « ça ne marche pas », ça ne veut pas dire grand chose...

        Quand tu ne sais pas pourquoi ça ne marche pas, tu dois faire une enquête jusqu'à trouver la raison du bug. Par exemple affiche la valeur de la varaible 'c' juste avant le 'switch'.

        Pourquoi as-tu initialisé les valeurs du compteur à {1, 2, 3, 4, 5, 6} ? Ces nombres représentent quoi ? Sont-ce des indices ?

        • Partager sur Facebook
        • Partager sur Twitter
          4 septembre 2021 à 16:40:47

          Ton switch teste la variable c , mais que vaut c ? quel valeur lui as-tu donné ?

          Les indices de tableaux vont de n à n-1 (ex : un tableau de 4 cases à comme indice valide 0, 1, 2, 3).

          PS : Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            4 septembre 2021 à 16:52:45


            bonjour je m'excuse pour ces differentes fautes je suis debutante dans ce forum

            les nombres 1 2 3 4 5 6 representent les indices du compteurs

            j'ai declare la variable c car je lui ai donné une valeur comme etant la voyelle qu'on recherche

            que dois-je faire donc?

            merci d'avance



            -
            Edité par FatimatouZahraTALL 4 septembre 2021 à 16:56:07

            • Partager sur Facebook
            • Partager sur Twitter
              4 septembre 2021 à 17:07:51

              Chaque cases de ton tableau compteur représente un compteur, un pour chaque voyelle. Généralement, quand on veux compter on commence à 0.

              Dans ton code tes compteurs commence aux valeurs avec lesquels tu les a initialisé (1, 2, 3, 4, 5, 6) C'est à dire par exemple le compteur du 'y'  compteur[5]  vaut déjà 6.

              Pour la variable c , il faut lui donner la valeur de la lettre que tu es en train de tester. Dans ton code c vaut toujours 0.

              • Partager sur Facebook
              • Partager sur Twitter
              ...
                4 septembre 2021 à 17:55:20

                Si tu faisais c=mot[j] avant le switch?
                Où tiens-tu compte des majuscules ou des minuscules?
                Moi, je suis allergique aux switch ... je les évite quand je peux.
                Si le programme ne passe qu'une fois, on pourrait déclarer un tableau de lettres comme suit:
                int lettres[26] = { 0 };   // Il y a 26 lettres que je sache ...
                Pour chaque lettre du mot, je ferais:
                lettres[tolower(c)-'a']++;   // faire #include <ctype.h> au début.
                Et à la fin j'afficherais:
                printf("Nombre de 'e': %d\n", lettres['e'-'a']);
                À répéter pour chaque voyelle.
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  4 septembre 2021 à 18:17:10

                  PierrotLeFou a écrit:

                  Où tiens-tu compte des majuscules ou des minuscules?

                  Dans le swtich !

                  PierrotLeFou a écrit:

                  int lettres[26] = { 0 };   // Il y a 26 lettres que je sache ...

                  On ne compte que les voyelles !

                  Oui, ici le switch n'est pas la meilleure solution, mais bon, on va pas en rajouter, c'est déjà pas facile.



                  • Partager sur Facebook
                  • Partager sur Twitter
                  ...
                    4 septembre 2021 à 18:59:04

                    PierrotLeFou a écrit:

                    Si tu faisais c=mot[j] avant le switch?
                    Où tiens-tu compte des majuscules ou des minuscules?
                    Moi, je suis allergique aux switch ... je les évite quand je peux.
                    Si le programme ne passe qu'une fois, on pourrait déclarer un tableau de lettres comme suit:
                    int lettres[26] = { 0 };   // Il y a 26 lettres que je sache ...
                    Pour chaque lettre du mot, je ferais:
                    lettres[tolower(c)-'a']++;   // faire #include <ctype.h> au début.
                    Et à la fin j'afficherais:
                    printf("Nombre de 'e': %d\n", lettres['e'-'a']);
                    À répéter pour chaque voyelle.


                    Cela causerait une faille de sécurité, avec écriture hors d'un tableau sous la volonté de l'utilisateur; ne surtout pas faire cela.

                    A noter que le programme initial a une autre faille de sécurité avec le scanf.

                    Le plus simple est de ne pas enregistrer le mot avant de le traiter (ça ne sert à rien et pose des problèmes) et d'utiliser un compteur nommé par voyelle.

                    #include <ctype.h>
                    #include <stdio.h>
                    
                    int main(void)
                    {
                    	int numA = 0, numE = 0, numI = 0, numO = 0, numU = 0;
                    
                    	for (;;) {
                    		const int c = getchar();
                    
                    		if (!isalpha(c))
                    			break;
                    
                    		switch (tolower(c)) {
                    		case 'a':
                    			numA++;
                    			break;
                    		case 'e':
                    			numE++;
                    			break;
                    		case 'i':
                    			numI++;
                    			break;
                    		case 'o':
                    			numO++;
                    			break;
                    		case 'u':
                    			numU++;
                    			break;
                    		}
                    	}
                    	printf("%d a, %d e, %d i, %d o, %d u\n",
                    	       numA, numE, numI, numO, numU);
                    	return 0;
                    }
                    



                    -
                    Edité par Marc Mongenet 4 septembre 2021 à 19:07:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 septembre 2021 à 19:01:23

                      Règle d'or : décomposer le problème.

                      On pourrait faire une fonction qui "categorise" les caractères.

                      Elle retournera 1 pour a (ou A), 2 pour e, 3 pour i etc. Et 0 pour les autres

                      A partir de la, on aurait un tableau de compteurs de caracteres de chaque catégorie (7)

                      Parcours de la chaîne, incrémentation du compteur de la catégorie de chaque caractère, et affichage à la fin.

                      -
                      Edité par michelbillaud 4 septembre 2021 à 19:02:56

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 septembre 2021 à 19:26:21

                        @michelbillaud:
                        J'ai l'impression que tu déplaces le problème. Le switch se retrouvera dans la fonction.
                        Je ne vois pas en quoi mon indexage va me faire sortir du tableau ... sauf si on a des caractères autres que des lettres.
                        On pourra le vérifier en faisant un tolower et en testant si on est entre 'a' et 'z' inclusivement.
                        Pour simplifier à la fin:
                        char *choix = "aeiouy";
                        for(int i=0; choix[i]; i++) {
                         printf("Nombre de '%c': %d\n", choix[i], lettres[choix[i] - 'a']);
                        }
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          4 septembre 2021 à 20:03:26

                          FatimatouZahraTALL a écrit:

                          les nombres 1 2 3 4 5 6 representent les indices du compteurs

                          Quand tu déclares

                          int compteur[] = {1,2,3,4,5,6};

                          c'est équivalent à faire cette initialisation :

                          compteur[0] = 1;
                          compteur[1] = 2;
                          compteur[2] = 3;
                          compteur[3] = 4;
                          compteur[4] = 5;
                          compteur[5] = 6;

                          Or je ne crois pas que 1, 2, 3, 4, 5, 6 soient destinés à être des indices, puisque tu les affiche ainsi :

                          printf("%d fois la lettre a\n",compteur[1]);
                          printf("%d fois la lettre e\n",compteur[2]);
                          printf("%d fois la lettre i\n",compteur[3]);
                          printf("%d fois la lettre o\n",compteur[4]);
                          printf("%d fois la lettre u\n",compteur[5]);
                          printf("%d fois la lettre y\n",compteur[6]);

                          On dirait plutôt que compteur[i] représente le nombre de fois où une voyelle apparaît. Du coup ton initialisation n'est pas correcte.

                          -
                          Edité par robun 4 septembre 2021 à 20:03:39

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 septembre 2021 à 20:35:47

                            Avec quelques notions plus avancées

                            • énumérations (pour donner des noms aux catégories)
                            • détermination de la catégorie par un tableau statique
                            • désignateurs pour initialiser le tableau
                            #include <stdio.h>
                            
                            enum {
                            	AUTRE,
                            	A, E, I, O, U, Y,
                            } categorie[128] = {  // ascii seulement
                            	[ 'a' ] = A,  // désignateurs
                            	[ 'A' ] = A,
                            	[ 'e' ] = E,
                            	[ 'E' ] = E,
                            	[ 'i' ]	= I,
                            	[ 'I' ] = I,
                            	[ 'o' ] = O,
                            	[ 'O' ] = O,
                            	[ 'u' ] = U,
                            	[ 'U' ] = U,
                            	[ 'y' ] = Y,
                            	[ 'Y' ] = Y  // les autres : 0 == AUTRE
                            };
                            	
                            void test(char *chaine) {
                            	printf("%s ", chaine);
                            	int compteurs[7] = {0};
                            	for (int i = 0; chaine[i] != '\0'; i++) {
                            		compteurs[categorie[chaine[i]]] ++;
                            	}
                            	for (int j=1; j < 7; j++) {
                            		if (compteurs[j] != 0) {
                            			printf("%c=%d, ", "_aeiuoy"[j],  compteurs[j]);
                            		}
                            	}
                            	printf("\n");
                            }
                            
                            int main() {
                            	test("coucou");
                            	test("abracadabra");
                            	test("anticonstitutionnellement");
                            }

                             Execution

                             ./categories 
                            coucou u=2, o=2, 
                            abracadabra a=5, 
                            anticonstitutionnellement a=1, e=3, i=3, u=2, o=1, 
                            



                            -
                            Edité par michelbillaud 4 septembre 2021 à 20:38:02

                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 septembre 2021 à 20:57:32

                              #include<stdio.h>
                              #include<string.h>
                              
                              int main(void)
                              {
                                  char mot[256];
                                  int compteur[6] = {0};
                                  char voyelle[] = {'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y'};
                              
                                  printf("Donnez un mot : ");
                                  scanf("%255s", mot);
                              
                                  int taille = strlen(mot);
                              
                                  for(int j = 0; j<taille; j++)
                                                 for(int i=0; i<12; i++) if(mot[j]==voyelle[i]) compteur[i%6]++;
                              
                                  for(int i=0; i<6; i++)
                                                     printf("%d fois la lettre %c\n",compteur[i], voyelle[i+6]);
                              
                                  return 0;
                              }
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 septembre 2021 à 21:12:34

                                Et ben, si avec tout ces codes le PO ne s'en sort pas ! Après je ne suis pas sur qu'il ai tout compris !

                                • Partager sur Facebook
                                • Partager sur Twitter
                                ...
                                  4 septembre 2021 à 21:41:03

                                  PierrotLeFou a écrit:

                                  Je ne vois pas en quoi mon indexage va me faire sortir du tableau ... sauf si on a des caractères autres que des lettres.

                                  Oui c'est exactement cela, si l'on a des caractères autres que des lettres, catastrophe. 90% des failles de sécurité de C viennent de tels manques d'anticipation.

                                  @zero.c
                                  Mais pourquoi s'acharner à utiliser la fonction scanf, alors qu'elle est inadaptée, complexe, produit un code plus compliqué, plus lent, et arbitrairement limité (à 255 caractères ici) ?



                                  -
                                  Edité par Marc Mongenet 4 septembre 2021 à 21:44:23

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 septembre 2021 à 21:54:43

                                    Marc Mongenet a écrit:

                                    Mais pourquoi s'acharner à utiliser la fonction scanf, ... plus lent,

                                    Oh tu sais, j'ai beau taper les caractères très très vite, elle les attrape encore plus vite que moi !

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 septembre 2021 à 22:15:07

                                      merci a vous tous j'ai pu m'en sortir!!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 septembre 2021 à 22:47:50

                                        Pour Marc, sans le scanf :

                                        #include <ctype.h>
                                        #include <stdio.h>
                                        
                                        int main(void)
                                        {
                                            int compteur[6] = {0};
                                            char voyelle[] = {'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y'};
                                        
                                            printf("Donnez un mot : ");
                                        
                                            while(1)
                                            {
                                                const int c = getchar();
                                                if (!isalpha(c)) break;
                                                for(int i=0; i<12; i++) if(c==voyelle[i]) compteur[i%6]++;
                                            }
                                        
                                            for(int i=0; i<6; i++)
                                                               printf("%d fois la lettre %c\n",compteur[i], voyelle[i+6]);
                                        
                                            return 0;
                                        }



                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 septembre 2021 à 23:41:51

                                          FatimatouZahraTALL a écrit:

                                          merci a vous tous j'ai pu m'en sortir!!

                                          Bonjour,

                                          Sujet résolu

                                          Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 septembre 2021 à 1:07:59

                                            Voici ce que je voulais dire. Le code n'est pas coloré. Désolé AbcAbc6:
                                            (on retrouve l'indentation avec un copier-coller)
                                            -
                                            #include <stdio.h>
                                            #include <ctype.h>
                                            int main(void) {
                                                printf("Entrez un mot: ");
                                                char word[100];
                                                fgets(word, 100, stdin);
                                                int count[26] = { 0 };
                                                for(int i=0; word[i]; i++) {
                                                    char c = tolower(word[i]);
                                                    if(c>='a' && c<='z')  count[c-'a']++;
                                                }
                                                char *vowell = "aeiouy";
                                                for(int i=0; vowell[i]; i++)
                                                    printf("Nombre de '%c': %d\n", vowell[i], count[vowell[i]-'a']);
                                                return 0;
                                            }
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Le Tout est souvent plus grand que la somme de ses parties.

                                              5 septembre 2021 à 9:42:33

                                              Pour pousser le bouchon un peu plus loin avec les énumérations

                                              enum {
                                              	AUTRE,
                                              	A,E, I, O, U, Y,
                                              	PREMIERE_VOYELLE = A,
                                              	DERNIERE_VOYELLE = Y,
                                              	NB_CATEGORIES = DERNIERE_VOYELLE + 1
                                              } categorie[128] = etc?

                                              permet d'éviter les constantes en dur dans la déclaration du tableau des compteurs

                                              	int compteurs[NB_CATEGORIES] = {0};

                                              et dans la boucle

                                              	for (int j = PREMIERE_VOYELLE; j <= DERNIERE_VOYELLE; j++) {
                                              		if (compteurs[j] != 0) {

                                              -
                                              Edité par michelbillaud 5 septembre 2021 à 9:45:13

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              compter le nombre de voyelles d'une chaine

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown