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 pour compter les minuscules


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Par défaut Programme pour compter les minuscules
    Bonjour tout le monde,

    Je débute en langage C et je cherche à faire un programme qui pourrait ne compter que les minuscules dans une chaine de caractère.
    Pour l'instant j'ai réalisé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        char chaine[] = "Salut";
        int taille = 0;
        int i = 0;
            //On récupère la longueur de la chaîne dans taille
        taille = strlen(chaine);
        for(i=0; i<taille; i++)
        {
            printf("%c", chaine[i]);
        }
    Elle me permet d'afficher le tableau de char caractères après caractères, juste pour tester

    Pour conserver les minuscules je pensais incrémenter un compteur dans une boucle if, en utilisant le code ascii.
    Comment pourrais-je faire une boucle : "si char[i] a un code ascii compris entre 97 et 122" ?

    Merci par avance

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    La bibliothèque standard C fournit islower. Cette fonction est utilisable non seulement avec des chaînes ASCII, mais aussi avec d'autres codages et environnements.

    Au fait, chaque chaîne de caractères est terminée par un caractère nul. En itérant sur la chaîne et s'arrêtant au caractère nul, on obtiendrait la longeur de la chaîne sans utiliser strlen au préalable.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Par défaut Recherche de lettre minuscule dans une chaîne
    Pour répondre spécifiquement à la question, je vous propose d'utiliser la fonction prédéfinie islower.
    Elle a pour prototype int islower(char c) : elle fournit la valeur 1 (vrai) si c est une lettre minuscule et la valeur 0 (faux) dans le cas contraire.

    Donc vous devez réaliser un test sur chaque caractère de la chaîne, en utilisant la fonction ci-dessus.

    Au boulot !

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Par défaut
    Super ça marche merci beaucoup ! C'est en effet plus facile que d'utiliser directement le code Ascii
    Ma boucle For ressemble donc à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(i=0; i<taille; i++)
        {
            if(islower(chaine[i]))
            {
                compteur = compteur + 1;
            }
        }
    Il suffit d'un printf et je peux afficher le nombre de minuscules.

    Merci encore

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    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 773
    Par défaut
    Citation Envoyé par Hugo_Loup Voir le message
    d'utiliser directement le code Ascii
    en C, le code ASCII/ un caractère (avec les simple quotes) est un entier. Le type char est avant tout un type pour stocker un entier sur 8 bits (<- attention le code ASCII est sur 7 bits, de 0 à 127)
    De plus, que ce soit les lettres minuscules et majuscules ou les chiffres, le code ASCII garde l'ordre

    Parce que je n'ai rien comme les fonctions comme islower mais souvent sous Windows, elles n'existent pas ou avec une autre signature

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        char c;
     
        for(i=0, compteur=0; i < taille; i++) {
            c = chaine[i];
     
            if ((c >= 'a' /*97*/) && (c <= 'z' /*122*/)) {
                ++compteur;
            }
        }

  6. #6
    Membre chevronné
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 213
    Par défaut
    pour éviter de faire 2 boucles sur chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *c;
    c = chaine;
    while (*c)
    {
        if (*c ... ) ...
        c++;
    }

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    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 773
    Par défaut
    Citation Envoyé par Xelland Voir le message
    pour éviter de faire 2 boucles sur chaine :
    C'est un peu trop technique pour lui déjà il faut savoir que while (*c) { est un test réduit de while ((*c) != '\0') {.
    Et qu'ensuite, une chaîne de caractères en C (avec les double quotes) doit être terminée par le caractère final/ sentinelle '\0'.

    C'est d'ailleurs ce que fait la fonction strlen qu'il utilise, et donc dans ton cas son appel est inutile.

  8. #8
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Par défaut Compter les lettres minuscules d'une chaîne : ma proposition
    Je propose un programme complet. Certainement pas le meilleur, mais...

    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
    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
    59
    60
    61
    62
    63
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    #define LONGMAX_CHAINE 999
     
    int main()
    {
        char chaine[LONGMAX_CHAINE + 1];
        int i, nombre_minuscule;
        char reponse;
     
        do
        {
            system("cls");
            printf("\n\n\t\tDETERMINATION DU NOMBRE DE MINUSCULES DANS UNE CHAINE\n\n");
     
            printf("Entrez votre chaine de caracteres : ");
            scanf("%s", chaine);
     
            system("cls");
            printf("\n\n\t\tDETERMINATION DU NOMBRE DE MINUSCULES DANS UNE CHAINE\n\n");
            printf("Liste des minuscules dans la chaine \"%s\"\n", chaine);
            nombre_minuscule = 0;
            for(i=0; chaine[i] != '\0'; i++)
            {
                if(islower(chaine[i]))
                {
                    printf("%c\t", chaine[i]);
                    nombre_minuscule++;
                }
            }
     
            printf("\n");
            if(nombre_minuscule == 0)
            {
                printf("Cette chaine ne contient AUCUNE lettre minuscule");
            }
            else
            {
                if(nombre_minuscule == 1)
                {
                    printf("Cette chaine contient UNE lettre minuscule");
                }
                else
                {
                    printf("Cette chaine contient %d lettres minuscules", nombre_minuscule);
                }
            }
     
            printf("\n\n");
            do
            {
                printf("Voulez-vous traiter une autre chaine de caracteres (O/N)? : ");
                fflush(stdin);
                scanf("%c", &reponse);
            }
            while((reponse != 'o')&&(reponse != 'O')&&(reponse != 'n')&&(reponse != 'N'));
        }
        while((reponse != 'n')&&(reponse != 'N'));
     
        return 0;
    }

  9. #9
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 792
    Par défaut
    Hello,

    Tu viens d'apprendre qu'il existe une fonction islower(). Super. Il existe également isupper(), mais aussi tolower() et toupper() (tout ça dans ctype.h). Ça simplifiera tes tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	do
    	{
    		printf("Voulez-vous traiter une autre chaine de caracteres (O/N)? : ");
    		scanf("%c", &reponse);
    		reponse=toupper(reponse);
    	}
    	while(reponse != 'O' && reponse != 'N');
    }
    while(reponse != 'N');
    Mais tu peux aussi utiliser strchr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    do scanf("%c",&answer);
    while(strchr("oOnN",answer)==NULL);    // modifié suite à la remarque de Sve@r
    J'ai supprimé le fflush(stdin): on ne flush pas un fichier en entrée, cela peut amener un UB

    Edit: merci Sve@r pour ta remarque.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par edgarjacobs Voir le message
    Mais tu peux aussi utiliser strchr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    do scanf("%c",&answer);
    while(strchr(answer,"oOnN")==NULL);
    Tu t'es trompé dans les paramètres de strchr(). Le premier paramètre c'est la chaine dans laquelle chercher et le second c'est le caractère à trouver => strchr("oOnO", answer)

    Citation Envoyé par Xelland Voir le message
    pour éviter de faire 2 boucles sur chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *c;
    c = chaine;
    while (*c)
    {
        if (*c ... ) ...
        c++;
    }
    Ca oblige à utiliser un pointeur peut-être au-delà des connaissances actuelles du PO débutant. Toutefois si vraiment tu veux partir par là, n'oublie alors pas que le "for" existe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (char *c=chaine, *c != '\0'; c++) {
        if (islower(*c)) ...
    }
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme pour compter les lignes d'un fichier texte?
    Par codon21 dans le forum Windows
    Réponses: 1
    Dernier message: 19/03/2009, 07h36
  2. Requete pour compter les points dans un championnat
    Par IG2da dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/10/2006, 17h58
  3. Problème pour compter les lignes d'un résultat
    Par Yoshidu62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/07/2006, 11h18
  4. requete pour compter les valeurs ds une colonne
    Par smariteau dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2006, 17h37
  5. existe t 'il des programme pour transformer les bases
    Par creazone dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/10/2004, 14h11

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