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 :

Compteur de voyelles


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Compteur de voyelles
    Bonjour tout le monde!
    Mon code a une petite problème!!! Il ne marche passss :/

    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 <stdio.h>
    #include <math.h>
    #include <string.h>
     
    int main (void)
    {
        char voyelles[13]={'a','e','i','o','u','y','A','E','I','O','U','Y'};
        char text[50];
        int longuerText = 0;
        int i;
     
        printf("Entrez votre texte ici : ");
        fgets(text, 50, stdin);
        longuerText = strlen(text) - 1;
     
        printf("le text a %d caracthers !\n", longuerText);
     
        for(i=0; i!=longuerText;i++)
        {
            if(text[i]=='a')
            {
                i++;
            }
        }
        if (i >= 1)
        {
            printf("Il y a %d voyelles dans votre texte !", i);
        }
        else if (i < 1)
        {
            printf("Un mot sans voyelle?WTF???");
        }
        return 0;
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    - ça marche pas c'est pas un diagnostic
    - ton code a certainement plus d'un problème vu que tu vérifies... uniquement le a
    - tu utilises i pour 2 choses différentes
    - si i n'est pas >= 1, il sera forcément < 1
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ah nn oui c'était pour un vérification par lettre j'avais oublié de remettre les restes une fois après mais y a tjrs un problème :/

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Attends je me concentre pour deviner ton code et ce qui ne va pas....


    Nom : 333652_108b6.jpg
Affichages : 4465
Taille : 20,8 Ko

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En dehors de la judicieuse remarque de Bktero, moi je m'interroge sur cette ligne char voyelles[13]={'a','e','i','o','u','y','A','E','I','O','U','Y'} (pourquoi ne pas écrire plus simplement char voyelles[13]="aeiouyAEIOUY" pour bien montrer que tu veux une chaine et encore mieux char *voyelles="aeiouyAEIOUY" vu que tu n'auras sûrement pas l'intention de modifier son contenu ?)
    Accessoirement moi, je n'aurais mis que "aeiouy" et ensuite testé chaque caractère converti en minuscules (mais ce que j'en dis...)
    Sinon le #include <math.h> ne se justifie pas trop non plus (sauf si tu considères qu'une addition doit passer par des fonctions mathématiques avancées)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Points : 143
    Points
    143
    Par défaut
    J'allais le défendre en disant que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'a','e','i','o','u','y','A','E','I','O','U','Y'}
    permet d'économiser un octet par rapport à à cause du fameux \0 mais en faite non je ne peux pas, dans les deux cas il utilise un tableau de 13 char.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baragouine Voir le message
    mais en fait non je ne peux pas, dans les deux cas il utilise un tableau de 13 char.
    Hé oui. Et moi au début j'allais dire que je ne comprenais pas ce "13" jusqu'à ce que je me souvienne que dans une initialisation partielle, ce qui n'était pas explicité (donc ici le 13°) était alors initialisé à 0 transformant alors ce tableau en string

    Comme quoi, quand on code, certaines façons d'écrire ont une signification particulière que n'ont pas certaines autres (même si le résultat est le même)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    merci à toutes et à tous pour vos réponses ...
    et voila j'ai fais des petit changement dans le 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
    27
    28
    29
     
    #include <stdio.h>
    #include <string.h>
     
    #define TAILLE_TEXT 50
    #define TAILLE_VOYELLE 7
     
    int main(void)
    {
        char text[TAILLE_TEXT], voyelles[TAILLE_VOYELLE] = {'a', 'e', 'i', 'o', 'u', 'y'};
        int i, tailleText = 0, numbrVoyelle = 0;
     
        printf("Entre votre text ici :%n");
     
        fgets(text, TAILLE_TEXT, stdin);
     
        tailleText = strlen(text);
     
        for(i == 0; i != tailleText; i++)
        {
            if(text[numbrVoyelle] == voyelles[TAILLE_VOYELLE])
            {
                numbrVoyelle++;
            }
        }
        printf("Il y a %d voyelle dans votre text\n", numbrVoyelle);
     
        return 0;
    }

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Points : 143
    Points
    143
    Par défaut
    Je parie que le code n'a pas été tester et je suis sur qu'il ne fonctionne pas.
    À mon humble avis tu devrais découper ton problème en plusieurs fonction et je te propose un jeu, tu remplis les TODOS et ça devrait fonctionner:

    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
    36
    37
    #include <stdio.h>
     
    #define MAX_TXT 256
     
    // Renvoie 0 si c n'est pas une voyelle
    int is_vowel(char const c)
    {
      // TODO 1:
      // Renvoyer une valeur différent de 0 si c est une voyelle.
    }
     
    // Renvoie le nombre de voyelle dans la chaine s
    int count_vowel(char const* s)
    {
      int n = 0;
     
      // jusqu'au \0 de la chaîne s
      while (*s)
      {
        // TODO 2:
        // Si le caractère *s est une voyelle incrémenter n
        ++s;
      }
     
      return (n);
    }
     
    int main(void)
    {
      char txt[MAX_TXT];
     
      printf("Entre votre text ici : ");
      fgets(txt, MAX_TXT, stdin);
      printf("Il y a %d voyelle dans votre text\n", count_vowel(txt));
     
      return (0);
    }
    Voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE1BWF9UWFQgMjU2CgovLyBSZW52b2llIDAgc2kgYyBuJ2VzdCBwYXMgdW5lIHZveWVsbGUKaW50IGlzX3Zvd2VsKGNoYXIgY29uc3QgYykKewogIHJldHVybiAoCiAgICBjID09ICdhJyB8fCBjID09ICdlJyB8fCBjID09ICdpJyB8fCBjID09ICdvJ3x8IGMgPT0gJ3UnIHx8CiAgICBjID09ICdBJyB8fCBjID09ICdFJyB8fCBjID09ICdJJyB8fCBjID09ICdPJ3x8IGMgPT0gJ1UnCiAgKTsKfQoKLy8gUmVudm9pZSBsZSBub21icmUgZGUgdm95ZWxsZSBkYW5zIGxhIGNoYWluZSBzCmludCBjb3VudF92b3dlbChjaGFyIGNvbnN0KiBzKQp7CiAgaW50IG4gPSAwOwoKICB3aGlsZSAoKnMpCiAgewogICAgaWYgKGlzX3Zvd2VsKCpzKSkKICAgICAgKytuOwogICAgKytzOwogIH0KCiAgcmV0dXJuIChuKTsKfQoKaW50IG1haW4odm9pZCkKewogIGNoYXIgdHh0W01BWF9UWFRdOwoKICBwcmludGYoIkVudHJlIHZvdHJlIHRleHQgaWNpIDogIik7CiAgZmdldHModHh0LCBNQVhfVFhULCBzdGRpbik7CiAgcHJpbnRmKCJJbCB5IGEgJWQgdm95ZWxsZSBkYW5zIHZvdHJlIHRleHRcbiIsIGNvdW50X3Zvd2VsKHR4dCkpOwoKICByZXR1cm4gKDApOwp9

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par baragouine Voir le message
    Je parie que le code n'a pas été tester et je suis sur qu'il ne fonctionne pas.
    Simple il manque une boucle pour parcourir le tableau des voyelles


    Citation Envoyé par baragouine Voir le message
    À mon humble avis tu devrais découper ton problème en plusieurs fonction et je te propose un jeu, tu remplis les TODOS et ça devrait
    Et pourquoi ? c'est juste une comparaison de 2 tableaux. Tu ne vas pas coder une montagne pour 5 lignes de code
    D'autant plus que le tableau (ou chaîne de caractères) est très flexible parce que, si tu isoles le code dans une fonction, tu peux ensuite chercher les voyelles majuscules, les chiffres ... et cela juste en le changeant (<- mais cela reste très [très] limité puisque tu ne peux pas rechercher des motifs ou des nombres par exemple, mais en tant qu'exercice niveau 0 c'est très bien )

    Enfin, tu peux effectivement remplacer ce tableau par un pointeur de fonction (qui dit si c'est 1 des caractères recherchés ou pas), ... mais c'est moins flexible parce que tu ne peux pas la modifier à l'exécution, en lisant un fichier ou une ressource externe par exemple.
    Et en plus vu le niveau de @bardiiar, les tableaux et les pointeurs il est en plein apprentissage


    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <stdio.h>
    #include <stdlib.h>
     
    /* #define DISPLAY_DEBUG 1 */
     
     
    int main (int argc, char** argv)
    {
        char* p_letter;
        char* p_char;
        size_t count;
        /* unsigned */ char current_letter;
        unsigned char not_found;
     
        char* ASCII_text = "Amy normally hated Monday mornings, but this year was different. Kamal was in her art class and she liked Kamal. She was waiting outside the classroom";
     
        char* list_chars = "aeiouyAEIOUY";
     
        for(p_letter=ASCII_text, count=0; (*p_letter != '\0'); ++p_letter) {
            current_letter = *p_letter;
     
            for(not_found=1, p_char=list_chars; (not_found && (*p_char != '\0'));) {
                if (*p_char != current_letter) {
                    ++p_char;
                } else {
                    not_found = 0;
                    ++count;
                }
            }
     
    #ifdef DISPLAY_DEBUG
            if (not_found) {
                printf("main - next letter : %c\n", current_letter);
            } else {
                printf("main - next letter : %c (found %c, %zu)\n", current_letter, *p_char, count);
            }
    #endif
        }
     
    #ifndef DISPLAY_DEBUG
            printf("main - result : found %zu vowel%s", count, ((count > 1)? "s\n": "\n"));
    #else
            printf("\n\nmain - result : found %zu vowel%s", count, ((count > 1)? "s\n": "\n"));
    #endif
     
     
        return EXIT_SUCCESS;
    }
    Et puisque tu te poses la question (et c'est une évidence) c'est "gcc -Wall main.c -DDISPLAY_DEBUG" pour voir les traces

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bardiiar Voir le message
    merci à toutes et à tous pour vos réponses ...
    Il ne suffit pas que de les lire, il faut aussi les mettre en oeuvre !!!

    Citation Envoyé par bardiiar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TAILLE_VOYELLE 7
    char voyelles[TAILLE_VOYELLE] = {'a', 'e', 'i', 'o', 'u', 'y'};
    Alors d'un point de vue C c'est bon. Toutefois, il est alors d'usage de ne pas se préoccuper du '\0' dans les #define, qui ne contiennent alors que la taille "logique" du tableau, et d'inclure le '\0' à part
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TAILLE_VOYELLE 6                # Parce que c'est la réalité, les voyelles minuscules sont réellement au nombre de 6
    char voyelles[TAILLE_VOYELLE + 1 /* les autres lecteurs verront que tu as pensé au '\0' */] = {'a', 'e', 'i', 'o', 'u', 'y'};   /* Ou ="aeiouy" pour montrer que tu vois bien une chaine comme je l'avais déjà dit !!!*/
    Et pareil pour text[TAILLE_TEXT] qui, avec un certain reste de fétichisme, sera alors défini à 50 caractères "utiles" et "+1" pour le '\0'.

    Citation Envoyé par bardiiar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i == 0; i != tailleText; i++)
    Alors là bravo. i==0 pour une affectation ? sérieux ??? En plus tu l'avais écrit correctement dans ton premier code !!!
    Sinon effectivement i != tailleText c'est bon mais pareil, les programmeurs iront plutôt sur un test écrit i < tailleText plus par habitude que pour réellement protéger le cas i > tailleText qui ne se peut pas ici mais qui se pourrait dans un autre code. Et donc si on prend toujours l'habitude de privilégier la sécurité même quand ce n'est pas nécessaire, on l'aura alors par réflexe le jour où cela le sera.

    Citation Envoyé par bardiiar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(text[numbrVoyelle] == voyelles[TAILLE_VOYELLE])
    Désolé, le C n'est pas une marmite dans laquelle tu peux jeter les bouts de code au hasard en espérant qu'ils vont se réassembler dans le bon ordre. Le C est un langage bête et con qui ne fait que ce que tu lui dis de faire. Tu compares un caractère avec un élément du tableau "voyelles" (la logique voudrait que tu le compares avec tous) et cet élément est pile le dernier donc celui qui vaut '\0'.


    Citation Envoyé par foetus Voir le message
    Et pourquoi ? c'est juste une comparaison de 2 tableaux. Tu ne vas pas coder une montagne pour 5 lignes de code
    Ben là je suis plus en accord avec baragouine. C'est clair qu'il s'agit d'un exercice d'apprentissage. C'est vrai que le problème est simple ici mais il peut être plus complexe ailleurs. baragouine lui apprend donc à découper un problème en petites fonctions élémentaires qui lui permettront de le résoudre et lui apprendront le mécanisme pour des problèmes plus complexes plus tard...

    Mais pour aller aussi dans ton sens () quand tu parles de recherche dans majuscules ou chiffres, c'est vrai que le nom "is_vowel" est peut-être trop limitatif. Moi j'aurais peut-être plus vu un truc comme int is_inTab(char c, char *tab) permettant ainsi à la fonction de regarder si "c" est dans n'importe quel tableau de char (ce qui rapproche d'ailleurs de l'opérateur in dispo dans d'autres langages)...

    Citation Envoyé par foetus Voir le message
    Enfin, tu peux effectivement remplacer ce tableau par un pointeur de fonction
    Allons y mollo avec la joie...
    Nom : 81670_gb_news.jpg
Affichages : 4164
Taille : 29,6 Ko
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,
    Citation Envoyé par foetus Voir le message
    Simple il manque une boucle pour parcourir le tableau des voyelles
    Et pourquoi ? c'est juste une comparaison de 2 tableaux. Tu ne vas pas coder une montagne pour 5 lignes de code ...
    Soit. Cependant, il n'y a pas non plus obligation de compliquer la chose. Il suffit d'une boucle parcourant la chaîne de caractères source à laquelle on fournit par la suite source[i] à une fonction de recherche dans une chaîne de caractères telle que strchr qui se chargera par la suite de rechercher l'occurrence du caractère source[i] dans le motif souhaité(aeiouy). Bien entendu avec la suggestion de @Sve@r de forcer la conversion des caractères en minuscule / majuscule par ordre de préférence; car la bibliothèque C n'offre pas / ne dispose pas de fonction de comparaison de chaînes de caractères qui ne tienne pas compte de la case, à l'exception des systèmes d'exploitation qui respectent la norme POSIX (tels que Windows ou Linux dont pour Linux à travers strcasecmp et strncasecmp dans l'en-tête strings.h) ou de certains compilateurs du langage C qui fournissent des fonctions qui leur sont propres; cela revient donc à faire l'exemple ci-dessous. Bien entendu pour un débutant cela n'est pas forcément explicite et donc il va falloir plus de curiosité, pratique et de lectures de docs mise à disposition.

    Code c : 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
     
    const unsigned char motif[] = "aeiouy";
     
     
    int main( void ){
     
        size_t nbVoyelle = 0x0;
        char src[] = "Developpez.com est une communauté francophone\0";
        for( size_t i = 0x0; i < strlen(src); i++ ){
            if(NULL != strchr((char*)motif, tolower(src[i])))
                nbVoyelle += 0x1;
        }
     
        (void)fprintf(stderr, "Nb Voyelle\t: %lu\n", nbVoyelle );
        return EXIT_SUCCESS;
    }

    à bientôt.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Soit. Cependant, il n'y a pas non plus obligation de compliquer la chose.
    Effectivement ta remarque est pertinente et renforce ce que je dis : cet exercice est trop simple pour être découpé et ce n'est pas avec cet exercice qu'on peut apprendre correctement à découper son code.
    De plus, tu fais la même chose que moi en remplaçant ma deuxième boucle par un appel bibliothèque libc

    Mais ton exemple est faux : le caractère 'é' n'est pas un caractère ASCII

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    de forcer la conversion des caractères en minuscule / majuscule par ordre de préférence
    Pas besoin. On veut les compter, on veut pas les trier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour tout le monde !
    je pense cette fois est bonne
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    int main(void)
    {
        char text[256];
        int longText = 0, i = 0, ca = 0, ce = 0, ci = 0, co = 0, cu = 0, cy = 0, voyelles = 0;
     
        printf("Entre votre text ici : ");
        fgets(text, 256, stdin);
     
        for(i = 0; i < strlen(text); i++)
        {
            if(tolower(text[i]) == 'a' || tolower(text[i]) == 133)
            {
                ca++;
            }
            if(tolower(text[i]) == 'e' || tolower(text[i]) == 130 || tolower(text[i]) == 136 || tolower(text[i]) == 138)
            {
                ce++;
            }
            if(tolower(text[i]) == 'i')
            {
                ci++;
            }
            if(tolower(text[i]) == 'o')
            {
                co++;
            }
            if(tolower(text[i]) == 'u')
            {
                cu++;
            }
            if(tolower(text[i]) == 'y')
            {
                cy++;
            }
        }
     
        /* -------------------------------------------------------------- */
     
        printf("Total voyelles (a,à) est : %d\n", ca);
        printf("Total voyelles (e,%c,%c,%c) est : %d\n",130, 136, 138, ce);
        printf("Total voyelles (i) est : %d\n", ci);
        printf("Total voyelles (o) est : %d\n", co);
        printf("Total voyelles (u) est : %d\n", cu);
        printf("Total voyelles (y) est : %d\n", cy);
     
        /* -------------------------------------------------------------- */
     
        voyelles = ca + ce + ci + co + cu + cy;
     
        printf("Total voyelles est : %d", voyelles);
     
        return voyelles;
    }
    cordialement.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    @bardiiar : Avant de faire des tests avec des codes qui ne sont pas ASCII, documente toi sur les encodages de caractères
    Parce que c'est le merdier absolu

    Parce que tu testes les caractères accentués avec les valeurs > 128, mais c'est du MBCS (Multi Byte Character Set, lien wiki en anglais). Mais cet encodage dépend de pages.
    En gros, 138 peut correspondre au caractère 'é' en latin-9, mais à un autre caractère en latin-1, Shift-JIS, Windows-1252, ... ce test est très [très] aléatoire.
    Pour en être sûr, il faut passer par les API Windows (la Win32) (Linux n'utilise pas cet encodage)

    Et d'autant plus que l'encodage MBCS est déprécié au profit de l'Unicode. Et là encore, il y a l'UTF-8, UTF-16 et UTF-32. Et dans ce cas, ton test il est aux fraises avec l'UTF-8

  17. #17
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par foetus Voir le message
    Mais ton exemple est faux : le caractère 'é' n'est pas un caractère ASCII
    Faux ? probablement dû à une conclusion un peu être trop hâtif de votre part, car ce dernier me donne bien comme résultats 16 voyelles auxquelles cas, je me suis trompé.Quand bien même 'é' fait partie des caractères ASCII étendue, il ne fait pas partie du motif alors je ne vois pas trop...

    Citation Envoyé par Sve@r Voir le message
    Pas besoin. On veut les compter, on veut pas les trier...
    Il y a une incompréhension, je me suis fait mal comprendre. Je ne parle pas de trier les caractères, mais qu'ils soient tous à la même enseigne afin d'ignorer la case (si le motif est en minuscule, l'ensemble des caractères qui compose la chaîne de caractères doit être mise en minuscule cas contraire, en majuscules).
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Faux ? probablement dû à une conclusion un peu être trop hâtif de votre part, car ce dernier me donne bien comme résultats 16 voyelles auxquelles cas, je me suis trompé.Quand bien même 'é' fait partie des caractères ASCII étendue, il ne fait pas partie du motif alors je ne vois pas trop...


    Tu as un magnifique comportement indéfini ("UB - undefined behaviour") (<- mais cela tu le sais aussi bien que moi ).
    La raison c'est que la norme ne dit pas si ton char est signé ou pas et c'est laissé au compilateur (<- à vérifier)

    Et il y a, à peu près, 96% de chances que ton compilateur le considère comme un signed char, et résultat tu as un nombre négatif (sans parler des conversions implicites qu’entraînent les nombres signés)

    Teste ce code, tu verras bien :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main (int argc, char** argv)
    {
        char one_char = 138;
     
        printf("one_char == 138 (%s), one_char == 138 (%s)\n",
                ((one_char == 138)? "true": "false"),
                ((one_char == (signed char) 138)? "true": "false"));
     
     
        return EXIT_SUCCESS;
    }

  19. #19
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par foetus Voir le message


    Tu as un magnifique comportement indéfini ("UB - undefined behaviour") (<- mais cela tu le sais aussi bien que moi ).
    La raison c'est que la norme ne dit pas si ton char est signé ou pas et c'est laissé au compilateur (<- à vérifier)

    Et il y a, à peu près, 96% de chances que ton compilateur le considère comme un signed char, et résultat tu as un nombre négatif (sans parler des conversions implicites qu’entraînent les nombres signés)
    Carrément un comportement indéterminé ? Vous avez peut-être vos raisons. Cependant, je me permets d'en douter et d'avancer que vous cherchez vos réponses par un comportement indéterminé qui pourrait tout simplement s'expliquer non pas par le fait qu'un char soit signé ou pas voir également à cause de son interprétation outre laissée à la discrétion du compilateur. Les paramètres régionaux du système d'exploitation qu'adopte le système d'exploitation a une influences directes et très significatives sur le programme et de manière plutôt étonnante.
    Sur mon système d'exploitation les paramètres locaux sont réglés sur UTF-8, ce qui signifie que mon système d'exploitation encodera le caractère en UTF-8. Cependant, un simple strlen sur le caractère me donne 2 ce qui veut dire que le caractère 'é' n'est pas du forcement encodé en UTF-8. Autre test, modifiez la police du caractère : là encore, j'obtiens un autre comportement dont je ne m'y attendais pas, certains caractères ne sont pas représentés conclusion la vérité se trouve peut-être autre part .
    Cependan, je serais d'avis d'utiliser les Wide Character pour éviter des comportements qui peuvent paraître UB.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    là encore, j'obtiens un autre comportement dont je ne m'y attendais pas, certains caractères ne sont pas représentés conclusion la vérité se trouve peut-être autre part .
    La seule vérité, c'est qu'en C si tu veux utiliser un autre encodage que l'ASCII, la bibliothèque C ne sait pas le faire

    Alors c'est vrai qu'on peut choisir la locale (fonction setlocale <- lien cplusplus en anglais) ou utiliser le type wchar_t (voir ma réponse en dessous), mais c'est si peu flexible, si peu pratique et souvent très contraignant.
    Et surtout que le type pour l'encodage UTF-8 est l'unsigned char et que la bibliothèque C n'utilise que le type char : c'est soit la chronique d'une catastrophe annoncée soit des casts/ conversions dans tous les sens.


    Citation Envoyé par sambia39 Voir le message
    Cependan, je serais d'avis d'utiliser les Wide Character pour éviter des comportements qui peuvent paraître UB.
    Même pas le type wchar_t c'est pour l'encodage UTF-16 et non pas pour l'encodage UTF-8.
    Je suis contre l'encodage UTF-16. Déjà rien qu'un truc bête : Windows a sa version (le type wchar_t est sur 16 bits) et Linux la sienne (le type wchar_t est sur 32 bits).

    Non la vérité soit l'intégration d'une bibliothèque externe (ICU c'est l'Everest) soit coder ses propres fonctions, mais surtout bannir la bibliothèque C (sauf éventuellement pour l'ASCII)

    Mais le truc le plus bête à commencer par faire, c'est de marquer toutes ces variables, toutes ces fonctions avec l'encodage "ASCII_text" , "utf8_var", ...


    Édit :
    Citation Envoyé par sambia39 Voir le message
    Cependant, un simple strlen sur le caractère me donne 2 ce qui veut dire que le caractère 'é' n'est pas du forcement encodé en UTF-8.
    Cela veut surtout dire que tu as enregistré ton fichier source en UTF-8 (sous Linux c'est toujours le cas, Microsoft Visual a changé l'ANSI par défaut au profit de l'UTF-8 que récemment)

    Donc ici, tu as un "bogue potentiel latent" ou si "quelque chose change l'encodage par de l'ANSI - Windows 1252 en France" (ton gestionnaire git, un collègue, ...) ton strlen te donnera 1 (<- du moins de grandes chances)

    Le langage C sait gérer les encodages Unicode (UTF-8, UTF-16 et UTF-32), mais c'est du caractère par caractère en les échappant avec \uXXXX et \UXXXXXXXX

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Compteur de chaque voyelles dans une chaine de caractères
    Par jasma dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/10/2012, 11h38
  2. [PB CONCEPTUEL] avec compteur/trigger
    Par kase74 dans le forum SQL
    Réponses: 6
    Dernier message: 25/03/2004, 12h02
  3. Filtrer les voyelles
    Par Babyneedle dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/12/2003, 16h12
  4. Remise à 0 d'un compteur automatique
    Par missllyss dans le forum SQL
    Réponses: 4
    Dernier message: 15/12/2003, 17h46
  5. Migration Access > SQL Server (suite) : Compteur
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2003, 15h08

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