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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 6
    Points
    6
    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 du Club
    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
    Points : 44
    Points
    44
    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
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 6
    Points
    6
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    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 éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    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
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    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