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 :

nombre de chiffres


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut nombre de chiffres
    bonjour,

    il y a un truc que je ne comprends pas avec ce 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
    #include <stdio.h>
     
    main()
    {
            int c, i, nespace, nautre;
            int nchiffre[10];
     
            nespace = nautre = 0;
            for( i = 0; i < 10; ++i)
                    nchiffre[i] = 0;
     
            while( (c = getchar() ) != EOF )
                    if(c >= '0' && c <= '9')
                            ++nchiffre[c-'0'];
                    else if( c == ' ' || c == '\n' || c == '\t' )
                            ++nespace;
                    else
                            ++nautre;
     
            printf("chiffres =");
            for( i = 0; i < 10; ++i)
                    printf(" %d", nchiffre[i]);
            printf(", espacement = %d, autres = %d\n", nespace, nautre);
    }
    là où je ne comprends pas c'est ++nchiffre[c-'0'];
    j'ai compris que c-'0' sert d'indice mais ++nchiffre[c-'0'] incrémente quoi? et pourquoi c-'0'?? est-ce " c moins 0 ? le reste je comprend mais c'est juste cette portion de code.
    quand je compile
    je rentre exemple :

    6 tomates et 7 bananes
    ça me donne:
    [deMonHunTer@hackLab langageC]$ ./compteChiffres
    6 tomates et 7 bananes
    chiffres = 0 0 0 0 0 0 1 1 0 0, espacement = 5, autres = 16
    là je ne comprend pas le résultat de chiffres

    Merci de votre aide

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Dans le code ASCII, chaque caractère a une valeur. Bien que les tables soient différentes, le chiffre 0 jusqu'au chiffre 9 ont des valeurs consécutives.

    (Ce n'est pas forcément vrai pour les lettres par contre).

    nchiffre contient le nombre de fois qu'on voit chaque chiffre.

    Vu que '0' ... '9' ont des valeurs consécutives :

    '0' - '0' = 0
    '1' - '0' = 1
    ...
    '9' - '0' = 9

    du coup, ce code compte le nombre de fois qu'on voit chaque chiffre.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    A noter que le code ASCII n'a strictement rien avoir avec le C, à part peut-être que le jeu de caractères minimal que doit supporter tout environnement compatible avec le C est dérivé de l'ASCII (pour les caractères, pas pour leur code).

    Citation Envoyé par fearyourself
    Ce n'est pas forcément vrai pour les lettres par contre
    Ce n'est pas forcément vrai en C, mais forcément vrai dans le code ASCII.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    donc pour résumer:

    si je tape exmple : '9'
    donc mon c = '9'

    ++nchiffre['9'-'0'];
    ++nchiffre[9];

    sachant que nchiffre[9] vallait 0, ++nchiffre[9] = 1 et ansi de suite...

    donc on aurait pu écrire directement ++nchiffre[c]; alors?

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par deMonHunTer Voir le message
    donc pour résumer:

    si je tape exmple : '9'
    donc mon c = '9'

    ++nchiffre['9'-'0'];
    ++nchiffre[9];

    sachant que nchiffre[9] vallait 0, ++nchiffre[9] = 1 et ansi de suite...

    donc on aurait pu écrire directement ++nchiffre[c]; alors?
    ben non. c vaut '9' qui n'est pas égal à 9...

    Tente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf ("Valeur de %c est %d\n", c, c);
    Jc

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Melem Voir le message
    A noter que le code ASCII n'a strictement rien avoir avec le C, à part peut-être que le jeu de caractères minimal que doit supporter tout environnement compatible avec le C est dérivé de l'ASCII (pour les caractères, pas pour leur code).

    Ce n'est pas forcément vrai en C, mais forcément vrai dans le code ASCII.
    Mea culpa, je pense que tu as raison :-)

    Jc

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    ben non. c vaut '9' qui n'est pas égal à 9...

    Tente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf ("Valeur de %c est %d\n", c, c);
    Jc
    oui je veux bien mais
    ++nchiffre['9'] pointe alors sur quel indice de nchiffre[i]? car '9' vaut TAB
    je pensais d'après le résultat que ++nchiffre['9' - '0'] pointait sur la 9ème valeur du tableau nchiffre, o`u alors j'ai rien compris

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    On va tout reprendre depuis le début.

    A l'intérieur de l'ordinateur tout est représenté par des nombres entiers. Même un nombre réel est représenté par un nombre entier. Ce nombre entier utilisé pour représenter quelque chose est appelé un code. Les caractères ('A', 'B', 'C', 'a', 'b', 'c', '+', '-', '0', '1', '2', '*', '#', '.', '!', etc.) ne font pas exception : ils sont également associés à des codes. La plupart du temps, c'est le code appelé ASCII qui sert de base. Dans ce code :

    'A' a la valeur (le code) 65
    'B' a la valeur (le code) 66
    'a' a la valeur (le code) 97
    'b' a la valeur (le code) 98
    '0' a la valeur (le code) 48
    '1' a la valeur (le code) 49
    ...
    On ne va pas y passer la soirée.

    Si tu fais donc :
    Tu verras affiché 65 à l'écran.
    De même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d\n", 'A' + 1);
    Affichera 66 et :
    Affichera B.

    ++nchiffre['9'] pointe alors sur quel indice de nchiffre[i]?
    Oublions d'abord le ++.

    Le caractère '9' a la valeur 57 donc écrire nchiffre['9'] est une mauvaise utilisation du tableau. Si tu veux avoir nchiffre[9], soit tu l'écris ainsi, soit tu fais nchiffre['9' - 48] ou mieux (et recommandé) : nchiffre['9' - '0']. Maintenant, le ++nchiffre[9]; incrémente nchiffre[9]. nchiffre[9], dans ton programme, est utilisé pour indiquer combien de fois apparaît le caractère '9'.

    je pensais d'après le résultat que ++nchiffre['9' - '0'] pointait sur la 9ème valeur du tableau nchiffre
    C'est exact.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    merci beaucoup, je comprend l'astuce. j'avais pas tilté sur les caractère ASCII. trop bien comment c'est plus clair dans ma tête.
    En tout cas merci à vous tous!!!

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

Discussions similaires

  1. [C#] Limiter le nombre de chiffre apres la virgule ?
    Par MaxiMax dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/08/2011, 14h20
  2. Réponses: 12
    Dernier message: 05/08/2005, 15h32
  3. Limiter nombre de chiffre apres la virgule
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/08/2005, 12h02
  4. arrondir un nombre à 2 chiffres après la virgule
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/02/2005, 08h36
  5. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 13h04

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