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 :

programme qui compte les lettres dans une chaine de caracteres


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 31
    Points : 17
    Points
    17
    Par défaut programme qui compte les lettres dans une chaine de caracteres
    salut,
    voila j'ai commencé a réalisé ce programme mais je me suis coincé :/
    Voila ce que j'ai :

    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 <stdio.h>
    #include <string.h>
    #define Max 200
     
    void lirechaine (char Tab[Max])
    {
        int i=0;
        char c;
        c=getchar();
        while((c!='\n') && (i<Max))
        {
            Tab[i++]=c;
            c=getchar();
        }
        Tab[i]='\0';
    }
    int main()
    {
        char Tab[Max], TAB[Max];
        int x=0, i, j, k;
        printf("entrez une chaine de caracteres :\n");
        lirechaine(Tab);
        for(i=0; i<strlen(Tab); i++)
        {
                for (j=0; j<strlen(Tab); j++){
                if (Tab[i]==Tab[j])
                x++;
                for (k=0; k<i; k++){
                TAB[k]=Tab[k];
                }
                for (k=i; k<strlen(Tab); k++){
                TAB[k]=Tab[i+1];
                }
            }   
            printf("%d fois la lettre %c\n", x, Tab[i]);
            x=0;
        }
    }
    pouvez vous le corriger et le compléter, Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Sois un peu plus précis s'il te plait.

    Ton programme compte le nombre de lettre ou de caractères?
    Est-ce qu'il compte le nombre de lettres/caractères différents ou ils les compte tous?

    Dis-nous aussi ce qui te coince : une erreur? un soucis algorithmique?

    Soigne aussi l'indentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(i=0; i<strlen(Tab); i++)
        {
                for (j=0; j<strlen(Tab); j++){
                       if (Tab[i]==Tab[j])
                               x++;
                       for (k=0; k<i; k++)
                              TAB[k]=Tab[k];
                       for (k=i; k<strlen(Tab); k++)
                              TAB[k]=Tab[i+1];
            }

    Dans ta boucle de lecture, si i == Max tu sors mais tu auras en dessous
    Tu risques donc un segfault;

    Sinon, à ta place, je trierais la chaîne de caractère par ordre croissant.
    Ensuite, il ne reste plus qu'à faire un parcours en incrémentant une variable dès qu'on passe à une lettre/caractère différent.
    Ce sera plus simple et plus rapide.


    EDIT : je pense avoir compris ce qu'il te bloque :

    lorsque tu t'aperçoit que tab[i] == tab[j];
    Au lieu d'utiliser un TAB[];
    fait un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int k = j;
    do
    {
            tab[k] = tab[k+1];
            k++;
    }
    while (tab[k+1] != '\0')

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !

    s'il s'agit d'un exercice pourquoi ne pas utiliser un simple pour compter des lettres tu n'as besoin que de 256 compteurs, un par lettre, que tu initialises à 0 avant de lire ta chaîne, lettre par lettre, en incrémentant le compteur correspondant dans une simple boucle.
    commence par un programme qui fonctionne pour les 127 premiers caractères (sans accent), puis, si nécessaire, tiens compte des caractères < 0 (mais ça complique un peu la sauce).

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  4. #4
    Membre régulier Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    la solution d'anacharsis est la meilleure à mon avis.
    J'aurai fait la même chose si j'avais eu à le coder en utilisant un tableau de 256 int pour stocker le nombre d'occurences de chaque lettre.

    Par contre si je peux me permettre une remarque sur ton code:

    Evites de déclarer des variables différentes en les nommant : TAB, tab.
    On pourrait aussi ajouter Tab, tAb, taB, etc ...
    Ca n'améliore pas la lecture du code et c'est source d'erreurs difficiles à trouver par la suite!

    A+

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    je n'ai pas tres bien compris se que tu veux faire, mais je crois que tu veux compter pour chaque lettre de ta chaine le nombre de fois qu'elle est cité dans la chaine:

    genre pour la chaine : "manger manger" t'aura :
    la lettre m est cité 2 fois.
    la lettre a est cité 2 fois.
    la lettre n est cité 2 fois.
    la lettre g est cité 2 fois.
    la lettre e est cité 2 fois.
    la lettre r est cité 2 fois.

    ton code est déjà bon a quelque détail prés, bien sure ta d'autre façon beaucoup plus élégante mais je croix que le but de l’exercice est l’algorithmique

    je t'ai mis des commentaire.

    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
     
    #include <stdio.h>
    #include <string.h>
    #define Max 200
     
    void lirechaine (char Tab[Max])
    {
    int i=0;
    char c;
    c=getchar();
    while((c!='\n') && (i<Max))
    {
    Tab[i++]=c;
    c=getchar();
    }
    Tab[i]='\0';
    }
    int main()
    {
    char Tab[Max];	// suprime le deuxieme tableau qui ne serta a rien a mon avis 
    int x=0, i, j, k,repete = 0;	// rajout d'une variable pour tester la répétition 
    printf("entrez une chaine de caracteres :\n");
    lirechaine(Tab);
    for(i=0; i<strlen(Tab); i++)
    {
    for (j=0; j<strlen(Tab); j++){
    if (Tab[i]==Tab[j])
    x++;
     
    // je ne voi pas en quoi sert cette partie du code donc je le met en commentaire
    // for (k=0; k<i; k++){
    // TAB[k]=Tab[k];
    // }
    // for (k=i; k<strlen(Tab); k++){
    // TAB[k]=Tab[i+1];
    // }
    } 
     
    // pour éviter la répetition dans l'affichage du résultats 
    for(int x = 0; x<i;x++){
    if(Tab[i]==Tab[x])
    repete++;}
    // pour ne pas compter les éspaces 
    if(repete == 0 && Tab[i] != ' ') printf("%d fois la lettre %c\n", x, Tab[i]);
    x=0; repete=0;
    }
     
    getchar();	// evite de fermer le programme avant le retour chariot 
    }

Discussions similaires

  1. Eliminer les espaces dans une chaine de caractere
    Par sialafrere dans le forum WinDev
    Réponses: 2
    Dernier message: 02/05/2008, 21h42
  2. Réponses: 6
    Dernier message: 21/01/2008, 18h59
  3. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  4. position d'une lettre dans une chaine de caractaire
    Par zidenne dans le forum Delphi
    Réponses: 3
    Dernier message: 14/08/2006, 10h18
  5. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 16h30

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