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 :

incrémenter un entier d'une cellule d'une liste


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Par défaut incrémenter un entier d'une cellule d'une liste
    Bonjour,
    encore des problèmes avec ma liste....
    Le but : l'utilisateur entre des mots ce qui crée au fur et a mesure une liste avec tous les mots entrés.
    MAIS (car il y a un mais), si le mot a déjà été entré, je dois incrémenter l'entier de la cellule au lieu de créer une nouvelle cellule de la liste.
    J'ai am fonction pour chercher le mot, mais après je vois pas comment incrémenter...
    J'ai tenté quelque chose, mais clairement ce n'est pas bon.

    Merci
    Julien

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct element element;
    struct element
    {
        char chaine[80];
        int val;
        struct element *nxt;
    };
    typedef element* llist;
     
     
    llist ajouterEnTete (llist liste, char const *mot);
    void afficherListe(llist liste);
    llist rechercherElement(llist liste, char const *mot);
     
     
    char mot[80]; 
     
     
    int main(int argc, char **argv)
    {
    llist maliste = NULL;
    element* essai = malloc(sizeof(element));
    beginning :
    printf("Please, enter a word: \n");
    fgets(mot,80,stdin);
    printf("You entered the word : %s \n",mot);
    essai=rechercherElement(maliste,mot);
    if(essai!=NULL){
    //essai->val = val+1;
    //maliste=essai;
    }
    else{
    maliste = ajouterEnTete(maliste,mot);
    }
    	printf("\n Type q to quit or Enter to continue \n");
    	char answer = getchar();
    		if(answer!='q'){
    			goto beginning;
    		} 
     
    afficherListe(maliste);
    //printf("%s ", maliste->chaine);
    //printf("%d ", maliste->val);
     
     system("PAUSE");
        return 0;
    }
     
     
     
    llist ajouterEnTete (llist liste, char const *mot){
    element* nouvelElement = malloc(sizeof(element));
    strcpy(nouvelElement->chaine,mot);
    nouvelElement->val = 1;
    //printf("jouter");
    //printf("%s ", nouvelElement->chaine);
    //printf("%d ", nouvelElement->val);
    nouvelElement->nxt = liste;
    return nouvelElement;
    }
     
     
    void afficherListe(llist liste){
        element *tmp = liste;
        //printf("%s ", tmp->chaine);
          //  printf("%d ", tmp->val);
        while(tmp != NULL){
            //printf("affich");
            printf("%s ", tmp->chaine);
            printf("%d ", tmp->val);
            tmp = tmp->nxt;
        }
     
    llist rechercherElement(llist liste, char const *mot){
    element *tmp=liste;
    while(tmp != NULL){
    if(!strcasecmp(tmp->chaine,mot)){
    	printf("Word spellt correctly");
           return tmp;
           }
       tmp = tmp->nxt;
       }
       return NULL;
    }
    }

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par juju03 Voir le message
    Bonjour,
    encore des problèmes avec ma liste....
    Le but : l'utilisateur entre des mots ce qui crée au fur et a mesure une liste avec tous les mots entrés.
    MAIS (car il y a un mais), si le mot a déjà été entré, je dois incrémenter l'entier de la cellule au lieu de créer une nouvelle cellule de la liste.
    J'ai am fonction pour chercher le mot, mais après je vois pas comment incrémenter...
    Tu cherches l'élément qui contient la chaine. Si tu le trouves, tu incrémentes le compteur de 1. C'est trivial...

    Evidemment, c'est pas
    mais
    tout simplement... ('val' pour un compteur, c'est pas terrible... pourquoi pas 'compteur' ou 'cpt' ?

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Par défaut
    Merci pour l'aide.
    Un truc me titille : j'incrémente donc essai, mais pour prendre en compte cette modification dans ma liste réelle.
    Si je fais maliste=essai; , je vais perdre le reste de ma liste. J'ai faux ??

    Sinon ben vous méritez bien que je vous invite en Suède, vu l'aide que vous me donner.
    Merci
    Julien

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par juju03 Voir le message
    Un truc me titille : j'incrémente donc essai, mais pour prendre en compte cette modification dans ma liste réelle.
    Si je fais maliste=essai; , je vais perdre le reste de ma liste. J'ai faux ??
    Il faut modifier directement l'élément de la liste. A partir du moment où tu as récupéré son adresse et que tu l'as stockée dans un pointeur, tu accède à cet élément et à tous les champs.
    Sinon ben vous méritez bien que je vous invite en Suède, vu l'aide que vous me donner.
    Avec plaisir.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Par défaut
    Rebonsoir,
    je n'arrive pas à utiliser la methode rechercherElement : j'ai une erreur undefined reference to 'rechercherElement'.

    Et sinon quand j'obtiens mon "essai", pour changer juste la cellule de ma liste, j'ai juste à modifier essai ????

    Merci

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct element element;
    struct element
    {
        char chaine[80];
        int val;
        struct element *nxt;
    };
    typedef element* llist;
     
     
    llist ajouterEnTete (llist liste, char const *mot);
    void afficherListe(llist liste);
    llist rechercherElement(llist liste, char const *mot);
     
     
    char mot[80]; 
     
     
    int main(int argc, char **argv)
    {
    llist maliste = NULL;
    element* essai = malloc(sizeof(element));
    beginning :
    printf("Please, enter a word: \n");
    fgets(mot,80,stdin);
    printf("You entered the word : %s \n",mot);
    essai=rechercherElement(maliste,mot);
    //if(essai!=NULL){
    //essai->val++;
    //maliste=essai;
    //}
    //else{
    maliste = ajouterEnTete(maliste,mot);
    //}
    printf("\n Type q to quit or Enter to continue \n");
    char answer = getchar();
    if(answer!='q'){
    	goto beginning;
    } 
     
     
    afficherListe(maliste);
    //printf("%s ", maliste->chaine);
    //printf("%d ", maliste->val);
     
     system("PAUSE");
        return 0;
    }
     
     
     
    llist ajouterEnTete (llist liste, char const *mot){
    element* nouvelElement = malloc(sizeof(element));
    strcpy(nouvelElement->chaine,mot);
    nouvelElement->val = 1;
    //printf("jouter");
    //printf("%s ", nouvelElement->chaine);
    //printf("%d ", nouvelElement->val);
    nouvelElement->nxt = liste;
    return nouvelElement;
    }
     
     
    void afficherListe(llist liste){
        element *tmp = liste;
        int i=0,MAX=1;
         // while(tmp != NULL){
     
         // }
        //printf("%s ", tmp->chaine);
          //  printf("%d ", tmp->val);
          //while(i<=10){
        while(tmp != NULL){
            //printf("affich");
            printf("%s ", tmp->chaine);
            printf("%d ", tmp->val);
            tmp = tmp->nxt;
    //}
     
        //tmp=liste;
    }
     
    llist rechercherElement(llist liste, char const *mot){
    element *tmp=liste;
    while(tmp != NULL){
    if(!strcasecmp(tmp->chaine,mot)){
    	printf("Word spellt correctly");
           return tmp;
           }
       tmp = tmp->nxt;
       }
       return NULL;
    }
    }

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par juju03 Voir le message
    je n'arrive pas à utiliser la methode rechercherElement : j'ai une erreur undefined reference to 'rechercherElement'.
    Pas de 'methode' en C. Uniquement des fonctions.

    Il faut placer les fonctions dans le fichier source de façon à ce qu'elles soient définies avant leur usage...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void f(int a)
    {
    }
     
    void g(void)
    {
       f(3);
    }
    Et sinon quand j'obtiens mon "essai", pour changer juste la cellule de ma liste, j'ai juste à modifier essai ????
    Si 'essai' pointe sur l'élément à modifier, oui. Tu fais ce que je t'ai déjà indiqué...

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Par défaut
    Alors voilà,
    ça y est mon code marche.
    Mais j'aimerai savoir ce que vous trouvez moche et qu'il ne faut pas réellement écrire en C (essayer de faire un code propre quoi...).
    Je vois déjà le problème de free avec malloc, mais je dois l'utiliser dans le main ou bien après le return dans la fonction ?

    Le but du programme :
    L'utilisateur entre des mots, si le mot n'existe pas dans la liste on l'ajoute. S'il a déjà été entré on indrémente Val. A la fin on ressort le top10 des mots les plus entrés.

    Merci à vous pour votre aide !

    Julien

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct element element;
    struct element
    {
        char chaine[256];
        int val;
        struct element *nxt;
    };
    typedef element *llist;
     
     
     
    llist ajouterEnTete (llist liste, char const *mot){
    element* nouvelElement = malloc(sizeof(element));
    strcpy(nouvelElement->chaine,mot);
    nouvelElement->val = 1;
    nouvelElement->nxt = liste;
    return nouvelElement;
    }
     
    void afficherListe(llist liste){
    element *tmp = liste;
    int i=0,MAX=1;
    printf("     Top 10    \n");
    printf("----------------\n");
    printf("Number    Word\n");
    printf("----------------\n");
    while(tmp != NULL){
            if(tmp->val>MAX){
                    MAX=tmp->val;
            }
            tmp = tmp->nxt;
    }
    MAX++;
    while(i<3){
            while(tmp != NULL){
                    if((tmp->val)==MAX){
                            printf("  %d       %s", tmp->val,tmp->chaine);
                            i++;
                    }
                    tmp = tmp->nxt;        
            }
            tmp=liste;
            MAX--;
    }
    }
     
    llist rechercherElement(llist liste, char const *mot){
    element *tmp=liste;
    while(tmp != NULL){
            if(!strcasecmp(tmp->chaine,mot)){
                    return tmp;
            }
            tmp = tmp->nxt;
    }
    return NULL;
    }
     
     
     
    char mot[256]; 
    llist maliste = NULL;
    llist intermediaire = NULL;
     
    int main(int argc, char **argv){
    beginning :
     
    printf("Please, enter a word: \n");
    fgets(mot,256,stdin);
    intermediaire = rechercherElement(maliste,mot);
    if(intermediaire!=NULL){
            intermediaire->val++;
    }
    else{
            maliste = ajouterEnTete(maliste,mot);
    }
    printf("\n Type q to quit or Enter to continue \n");
    char answer = getchar();
    if(answer!='q'){
            goto beginning;
    } 
     
    afficherListe(maliste);
    system("PAUSE");
    return 0;
    }

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Tu peux commencer à corriger ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /home/thierry/devel/test/main.c:: In function «ajouterEnTete":
    /home/thierry/devel/test/main.c:16: attention : implicit declaration of function «strcpy"
    /home/thierry/devel/test/main.c:16: attention : incompatible implicit declaration of built-in function «strcpy"
    /home/thierry/devel/test/main.c:: In function «rechercherElement":
    /home/thierry/devel/test/main.c:60: attention : implicit declaration of function «strcasecmp"
    /home/thierry/devel/test/main.c:: In function «main":
    /home/thierry/devel/test/main.c:91: attention : ISO C90 forbids mixed declarations and code
    /home/thierry/devel/test/main.c:75: attention : unused parameter «argc"
    /home/thierry/devel/test/main.c:75: attention : unused parameter «argv"
    :: === Build finished: 6 errors, 0 warnings ===

    Ensuite voici quelques commentaires en vrac:

    • Ton code n'est pas indenté
    • Personnellement, je pense qu'un pointeur doit rester explicite. Ainsi, je n'aime pas beaucoup ce type de typedef:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      typedef element * llist;
      Utilise soit des pointeurs explicites sur element, ou au pire préfixe llist avec un p_ pour rappeler le fait qu'il s'agit d'un pointeur:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      typedef element * p_llist;
    • Tu ne vérifies pas si malloc() a échoué. Il faut TOUJOURS vérifier que la valeur retournée par malloc() n'est pas NULL. Ici, si malloc() renvoie NULL, tu auras une erreur de segmentation lorsque tu essaie de déréférencer nouvelElement.
    • Je préfère la construction suivante:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      element* nouvelElement = malloc(sizeof *nouvelElement);
      à la forme:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      element* nouvelElement = malloc(sizeof(element));
    • N'utilise pas strcpy() pour copier une chaine passée en argument d'une fonction dans un tampon. Tu risques des débordements. Préférer strncpy() ou strncat():
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      *(nouvelElement->chaine) = 0;
      strcat(nouvelElement->chaine, mot, sizeof nouvelElement->chaine - 1);
    • Tu n'utilises ni argc, ni argv. Tu peux donc définir main() avec le prototype suivant: int main(void)
    • Pourquoi mot, maliste et intermediaire sont-elles définies en global. C'est très mauvais! Ces variables peuvent être définies dans main(), car tu les passes de toute manière en argument de tes fonctions.
    • J'utiliserai fgets() de la manière suivante:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      fgets(mot, sizeof mot, stdin);
    • Après fgets(), il ne faut pas oublier de nettoyer le tampon de stdin en cas de débordement et éventuellement d'effacer le caractère de fin de ligne saisi à la fin de mot. Pour cela, fais une recherche sur le forum avec le mot clé fclean.
    • Lorsque tu saisis le caractère de answer, n'oublie pas qu'il reste au minimum un caractère de fin de ligne dans le tampon de stdin.
    • Le goto est une pratique à éviter, à moins de pouvoir justifier son utilisation. A mon sens, il n'est jamais nécessaire d'utiliser goto. Le langage C est construit suivant les principes de la programmation structurée et fournie tous les outils pour programmer selon ce paradigme. Dans le cas présent, utilise une boucle while ou do... while.
    • systeme("PAUSE") n'est pas nécessaire sur les IDE modernes


    Bonne chance

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  3. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 17h01
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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