É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
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 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.
« ç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 ?
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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
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
@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']); }
Le Tout est souvent plus grand que la somme de ses parties.
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.
é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");
}
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
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
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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.