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 :

élement d'une liste


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut élement d'une liste
    Bonjour !!!
    Alors, j'ai une nouvelle question =)

    J'ai un programme tiré d'un livre qui sert à compter le nbre d'espace blanc, ça nous donne ça :

    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 <stdio.h>
     
    main()
    {
      int c,i,nwhite,nother;/*i:compteur; nwhite pour espaces blancs; nother pour compter autres*/
      int ndigit[10]; /**vecteur declare - compte le nbre de 0, 1...9 (premier element compte le nbre de 0)*/
     
      nwhite = nother = 0;
     
      for (i = 0;i<10;++i)
        ndigit[i] = 0;
     
      while ((c=getchar()) !=EOF)
        {
        if (c>='0' && c<='9')
        /*fais reference au code ASCII*/
            ++ndigit[c-'0']; /*rajoute un a l'element du vecteur correspondant au chiffre*/
        else if (c==' '|| c== '\n' || c=='\t')
            ++nwhite;
          else
            ++nother;
        }
        printf("digitos=");
        for(i=0;i<10;++i)
          printf("%d",ndigit[i]);
        printf(",espacios blancos = %d, otros = %d \n",nwhite,nother);
     
    }
    Où donc digit et une liste, est chaque élément de sa liste compte le nombre de 0, 1...9 qu'il y a dans un texte.
    Ma question est la suivante :
    pour ce if là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       if (c>='0' && c<='9')
        /*fais reference au code ASCII*/
            ++ndigit[c-'0']; /*rajoute un a l'element du vecteur correspondant au chiffre*/
    Je comprends le principe mais 'aimerais savoir s'il est possible de faire ça autrement ? En fait, moi j'aurais plutôt l'idée de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       if (c>='0' && c<='9')
        /*fais reference au code ASCII*/
            ++ndigit[c]
    Ainsi, si par exemple c = 3, alors le 4éme élément de la liste ndigit sera incrémenté. Ce qu'on cherche à faire !
    Sommes nous obligé de passé par le code ASCI ?
    En fait je mélange un peu avec Python je sais... mais je suis perturbée

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ainsi, si par exemple c = 3, alors le 4éme élément de la liste ndigit sera incrémenté. Ce qu'on cherche à faire !
    Lorsque tu tapes 3 (via getchar), la fonction ne renvoie pas 3 mais '3', ce qui est totalement différent.

    C'est comme si on tapait :
    et non
    Par conséquent, pour connaitre la "distance" du caractère saisi (caractère représentant un chiffre) par rapport au caractère '0', il faut donc retrancher ce caractère par '0', ce qui permet ensuite de bien se positionner dans le tableau.

    Par exemple, le caractère '0' a la valeur 48 en ASCII, et la norme C impose que tous les caractères chiffrés se suivent. Donc si on retranche '0' par '0' (48-48), ça fait 0. Si on retranche '1' par '0' (49-48), ça fait 1. etc

    Du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ndigit['0'-'0'] = ... ;
    sera compilé en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ndigit['1'-'0'] = ... ;
    sera compilé en :
    etc

    Il n'y a pas d'autre moyen pour y arriver, sauf en se compliquant inutilement la tâche via des fonctions permettant des saisies formatées car ton code ne doit pas gérer que les chiffres mais aussi les autres types de caractères.

    Si tu voulais vraiment faire
    il te faudrait un tableau de 58 éléments ('9' vaut 57 en ASCII). Or, les 48 premiers éléments seraient inutilisés. Cela n'aurait aucun intérêt.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    Merci jeroman a m'aider depuis le début

    Donc en fait si je comprends bien, tu ne peux pas car getchar() 'enregistre' seulement le code ASCI de ce que tu tapes à l'écran ?
    Bon et bien... c'est bien triste ^^

    Merci bcp en tout cas

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    c'est bien triste ^^
    Pourquoi donc ? Il n'y a qu'une soustraction à faire.
    Si tu utilises ce chiffre plusieurs fois après (dans des calculs ou pour l'indice de tableau(x) ), tu peux créer une variable temporaire dans laquelle tu stockes cette valeur, afin de ne pas soustraire à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int caractere;
    ...
    caractere = getchar();
    if (caractere >= '0' && caractere <='9')
    {
      int chiffre = caractere - '0' ;
     
      /* divers calculs utilisant "chiffre" */
      ...
      ...
      ...
    }

  5. #5
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    Oui =)
    C'est juste que c'est étrange après le Python... mais bon ^^
    Je découvre =)
    Merci en tout cas pour ton aide !

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

Discussions similaires

  1. comment ajouter des élements dans une liste ?
    Par ryoussef19 dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 15/06/2007, 16h02
  2. récupérer les élements d'une liste (<select>)
    Par ferrero dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/06/2007, 13h55
  3. Réponses: 1
    Dernier message: 02/04/2007, 15h56
  4. [Generics] ajouter un élement dans une liste typée
    Par anitshka dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/02/2007, 11h04

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