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 :

Compter le nombre de caractères différents dans une chaîne saisie


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Compter le nombre de caractères différents dans une chaîne saisie
    pour commencer mon code source

    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 <string.h>
    #include <stdio.h>
    #include <ctype.h>
     
    void main()
    {
    char chaine[100];
    char i,j;
    int k=0;
     
     
    printf("Veuillez entre une chaine de caractere de longueur max 100\n");
    scanf("%s",chaine);
    printf("vous avez rentre : %s",chaine);
     
    getchar();
     
    for(i=0;i<strlen(chaine);i++)
    {
                         for(j=i;j<strlen(chaine);j++)
                         {
           	                      if( tolower(chaine[j]) == tolower(chaine[i]) )
     		              {
     		              k++;
     		              }
                         }
     printf("\nvous avec entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]),k);
     k=0;
    }
     
    getchar();
    getchar();
    }
    dans la première partie du code il y a la saisie d'une chaine de caractère, dans la seconde un comptage de chaque caractère présent dans celle-ci, mais le problème c'est que je ne sais pas comment ignoré un caractère déjà compter (si vous me comprenez pas je peu vous faire une screen)
    si quelqu'un pouvais me mettre sur le chemin, sa serais mimi

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Le but est de compter le nombre de caractère différent dans une chaine de caractère saisie?
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    pourquoi ne pas les ramplacer par des caractaires non utilisé ?

  4. #4
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    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
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
     
    void main()
    {
       char chaine[100];
       char i,j;
       int k=1,taille;
     
     
       printf("Veuillez entre une chaine de caractere de longueur max 100\n");
       scanf("%s",chaine);
       printf("vous avez rentre : %s",chaine);
     
       getchar();
     
       taille = strlen(chaine);
       for(i=0;i<taille;i++)
       {
          if(chaine[i] != '\0')
          {
             for(j=i+1;j<taille;j++)
             {
                if( tolower(chaine[j]) == tolower(chaine[i]) )
                {
                   chaine[j] = '\0';
                   k++;
                }
             }
             printf("\nvous avec entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]),k);
             k=1;
          }
       }
     
       getchar();
       getchar();
    }
    par contre a quoi sert la fonction tolower ?

  5. #5
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Ekinoks->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(j=i+1;j<taille;j++)
             {
                if( tolower(chaine[j]) == tolower(chaine[i]) )
                {
                   chaine[j] = '\0';
                   k++;
                }
             }
    Mettre le caractère de fin de chaine n'est pas une bonne idée.

    par contre a quoi sert la fonction tolower ?
    Ca permet de convertir un caractère en minuscule.

    De plus, il aurait pu être possible de convertir toute le chaine de caractères en minuscule grâce à la fonction CharLower().

  6. #6
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    mais le problème c'est que je ne sais pas comment ignoré un caractère déjà compter
    Dans un autre tableau de char, je mémoriserais les caractères lus. A l'aide de la fonction strchr(), je viendrais comparer l'élément à compter avec la chaine des caractères lus pour savoir si cela a été déjà fait. Si c'est déjà fait, je l'ignore et je passe au suivant.
    C'est une solution qui me vient à l'esprit!

  7. #7
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    ho ! dans se cas un autre caractère différent de '\0' non utilisé ^^ ou bien recréé sa propre fonction tolower

  8. #8
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Crayon
    Le but est de compter le nombre de caractère différent dans une chaine de caractère saisie?
    je croie que le but est de compter le nombre de caractère différent et combien de foie il apparaissent chacun

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par homeostasie
    De plus, il aurait pu être possible de convertir toute le chaine de caractères en minuscule grâce à la fonction CharLower().
    A condition que tu fournisses le code de cette fonction non standard.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci Ekinoks !
    par contre faut que je rejoute de quoi ignoré les espace maintenant

  11. #11
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Voici comment je ferais cela:

    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
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <conio.h>
     
    int main(int argc, char* argv[])
    {
        char chaine[100], i=0;
        int tab[128];
     
        memset(tab, 0, sizeof(int) * 128);
     
        printf("Veuillez entre une chaine de caractere de longueur max 100\n");
        scanf("%s",chaine);
        printf("vous avez rentre : %s",chaine);
     
        getchar();
     
        while(chaine[i] != '\0')
        {
            tab[tolower(chaine[i])]++;
            printf("\nvous avez entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]), tab[tolower(chaine[i])]);
            i++;
        }
        getch();
     
        return 0;
    }
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    nan la tu as un petit probs
    tape par exemple coucou ou 123123
    avant j'avais sa mais à l'inverse

  13. #13
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Essaie ma version amélioré:
    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
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <conio.h>
     
    int main(int argc, char* argv[])
    {
        char chaine[100], i;
        int tab[128], ch;
     
        memset(tab, 0, sizeof(int) * 128);
     
        printf("Veuillez entre une chaine de caractere de longueur max 100:\n");
     
     
        for(i = 0; (i < 80) &&  ((ch = getchar()) != EOF) && (ch != '\n'); i++ )
            chaine[i] = (char)ch;
        chaine[i] = '\0';
     
        printf("vous avez rentre : %s", chaine);
     
        i=0;
        while(chaine[i] != '\0')
        {
            tab[tolower(chaine[i])]++;
            printf("\nvous avez entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]), tab[tolower(chaine[i])]);
            i++;
        }
        getch();
     
        return 0;
    }
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  14. #14
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    A condition que tu fournisses le code de cette fonction non standard.
    Oui c'est vrai...

    Citation Envoyé par Einsteinium
    par contre faut que je rejoute de quoi ignoré les espace maintenant
    Là tu vas avoir un soucis en utilisant ainsi la fonction scanf():
    En effet, avec l'option "%s" la séquence s'arrête lorsque scanf rencontre un caractère d'espacement donc tu ne saisiras pas l'ensemble de ta chaîne.

    Je te conseille rapidement d'utiliser fgets() ou de maitriser réellement scanf(), ce qui est loin d'être aisé.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    @Crayon tj pareil

    @homeostasie ouai je sais j'ai vu sa j'essaye de trouvais une solution ^^

  16. #16
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    par contre faut que je rejoute de quoi ignoré les espace maintenant
    Une fois que tu auras réussi à saisir ta chaine complète via fgets(), il te sera possible d'ignorer le caractère espace soit en faisant une simple comparaison de caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (chaine[i] == ' ') ...
    soit en comparant avec sa valeur entière sachant que l'espace corresponds à 32.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (chaine[i] == 32)

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    via fgets(), j'abandonne pour le moment ^^
    je vais bien finir de trouvais par scanf

  18. #18
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    C'est quoi tu cherches à faire celà?:
    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
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <conio.h>
     
    int main(int argc, char* argv[])
    {
        char chaine[100], i;
        int tab[128], ch;
     
        memset(tab, 0, sizeof(int) * 128);
     
        printf("Veuillez entre une chaine de caractere de longueur max 100:\n");
     
     
        for(i = 0; (i < 80) &&  ((ch = getchar()) != EOF) && (ch != '\n'); i++ )
            chaine[i] = (char)ch;
        chaine[i] = '\0';
     
        printf("vous avez rentre : %s", chaine);
     
        i=0;
        while(chaine[i] != '\0')
        {
            tab[tolower(chaine[i])]++;
            //printf("\nvous avez entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]), tab[tolower(chaine[i])]);
            i++;
        }
     
     
        for(i=0; i<127; i++)
        {
            if(tab[i])
                printf("\nvous avez entre %c ou %c : %d fois",tolower(i),toupper(i), tab[i]);
        }
     
        getch();
     
        return 0;
    }
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  19. #19
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    via fgets(), j'abandonne pour le moment
    je vais bien finir de trouvais par scanf
    Abandonne scanf à mon avis!

    Un exemple d'utilisatin de fgets() au lieu de scanf():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      char chaine[100] = {0};
     
      printf("Veuillez entre une chaine de caractere de longueur max 100\n");
      if (fgets(chaine,100, stdin) != NULL)
      {
        printf("vous avez rentre : %s\n",chaine);
      }
      else
      {
         /*Traitement de l'erreur*/
      }
    A noter qu'il sera aussi nécessaire de purger le buffer d'entrée stdin après chaque utilisation de fgets.

  20. #20
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Crayon
    C'est quoi tu cherches à faire celà?:
    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
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <conio.h>
     
    int main(int argc, char* argv[])
    {
        char chaine[100], i;
        int tab[128], ch;
     
        memset(tab, 0, sizeof(int) * 128);
     
        printf("Veuillez entre une chaine de caractere de longueur max 100:\n");
     
     
        for(i = 0; (i < 80) &&  ((ch = getchar()) != EOF) && (ch != '\n'); i++ )
            chaine[i] = (char)ch;
        chaine[i] = '\0';
     
        printf("vous avez rentre : %s", chaine);
     
        i=0;
        while(chaine[i] != '\0')
        {
            tab[tolower(chaine[i])]++;
            //printf("\nvous avez entre %c ou %c : %d fois",tolower(chaine[i]),toupper(chaine[i]), tab[tolower(chaine[i])]);
            i++;
        }
     
     
        for(i=0; i<127; i++)
        {
            if(tab[i])
                printf("\nvous avez entre %c ou %c : %d fois",tolower(i),toupper(i), tab[i]);
        }
     
        getch();
     
        return 0;
    }
    Des petites remarques:
    -> tu peux l'orienter dans le code, donner des morceaux mais tout fournir ainsi n'a pas vraiment d'intérêt pour lui.
    ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for(i = 0; (i < 80) &&  ((ch = getchar()) != EOF) && (ch != '\n'); i++ )
            chaine[i] = (char)ch;
        chaine[i] = '\0';
    Pourquoi une chaine saisie maxi de 80 caractères alors que tu définis un tableau chaine de 100 caractères?
    De plus, la fonction fgets() permet la saisie d'une chaine.

    Bonne soirée

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

Discussions similaires

  1. [XL-2010] Compter le nombre de noms différents dans une colonne
    Par mcog2 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 02/12/2015, 08h34
  2. Compter le nombre de caractères contenus dans une balise HTML
    Par adissa357 dans le forum Général Java
    Réponses: 2
    Dernier message: 16/10/2013, 13h19
  3. [XL-2007] Compter le nombre de valeurs différente dans une colonne
    Par Mist-e-Fire dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/04/2013, 09h01
  4. Réponses: 1
    Dernier message: 22/05/2012, 19h15
  5. URGENT - Nombre d'enregistrements différents dans une table
    Par Jeankiki dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/08/2004, 15h51

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