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 :

insérer dans l'ordre alphabétique une suite de prénoms


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut insérer dans l'ordre alphabétique une suite de prénoms
    salut
    j'ai réalisé un programme qui permet d'insérer dans l'ordre alphabétique une suite de prénoms terminés par "." en utilisant les listes chaînés, mais lors de l'exécution ma liste ne se trie pas :s
    est ce que quelqu'un peut m'aider ?
    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
    #include<stdio.h>
    #include<conio.h>
     
    //******************************les structures******************************
     
     struct prenom
    {
    	char p[25];		//prenom
    	struct prenom  *suiv;
    };
    typedef struct prenom *listeprens;
     
    //***************************Lire Ordre***************************************
     
     
    listeprens lireordre()
    {
    	listeprens lst=NULL;
    	char pren[25];
    while(gets(pren),strcmp(pren,".")&&inserordre(&lst,pren));
    return lst;
    } 
     
    //************************inserordre**************************************
     
    int inserordre(listeprens *adlp,char *pren)
    {
    	struct prenom *nouv,*bal,*prec;
    if(nouv=malloc(sizeof(*nouv)))	//allocation
    {
    	strcpy(nouv->p,pren);	
    	bal=*adlp;
    	while(bal&&strcmp(bal->p,pren<0)) 
    	{
    		prec=bal;
    		bal=bal->suiv;
    	}
    	if(bal==*adlp){ *adlp=nouv;  nouv->suiv=bal;	   }
    	else{ prec->suiv=nouv; 	nouv->suiv=bal; }
    	return 1;
    }
    else return 0;
    }
    //**********************************ecrire**************************************
    void ecrire(listeprens lp)
    {
    	while(lp)
    	{
    	printf("%s\t",lp->p);
     
    	lp=lp->suiv;
    	}}
     
    //**************************main***********************************************
     
    void main(void)
    {
     listeprens lp;
     clrscr();
    printf("entrer une suite de prenoms se terminant par .:\n");
     lp=lireordre();
    printf("dans l'ordre:\n");
    ecrire(lp);
    getch();
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    J'ai pas encore tout regardé mais déjà,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(bal&&strcmp(bal->p,pren<0))
    est louche.

    De plus, le type de main est int et il faut éviter d'utiliser gets.


  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    while(bal&&strcmp(bal->p,pren<0))
    ça veut dire qu'on va incrémenter bal (bal est l'en tête de la liste parce qu'elle reçoit *adlp) tant qu'elle est vrai et tant que le nom qu'on a inséré (pren) est inférieur au conteu de bal (pour positionner bal dans le nom qui suit pren dans l'ordre alphabétique)
    j'ai utilisé gets pour saisir un nom par ligne
    merci pour tes conseils mais estce que tu peux justifier pourquoi je dois faire ceci ou pourquoi je ne dois pas faire cela
    merci

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Alors, il au vaut mieux éviter d'utiliser gets car cette fonction ne vérifie pas qu'elle a suffisamment de place pour écrire là où on lui demande.
    Citation Envoyé par http://www.hmug.org/man/3/fgets.php
    SECURITY CONSIDERATIONS

    The gets() function cannot be used securely. Because of its lack of
    bounds checking, and the inability for the calling program to reliably
    determine the length of the next incoming line, the use of this function
    enables malicious users to arbitrarily change a running program's func-
    tionality through a buffer overflow attack. It is strongly suggested
    that the fgets() function be used in all cases. (See the FSA.)
    Et sinon, dans ce qui suit, tu as mis la comparaison comme argument de srtcmp.
    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
    while(
       bal  &&
       strcmp(
          bal->p, /*bal->p est comparé à ...*/
          pren < 0 /*... (pren inférieur à 0) ??*/
       )
    )
    /*Il me semble que la comparaison devrait être placée ici :*/
    while(
       bal  &&
       strcmp(
          bal->p, /*bal->p est comparé à ...*/
          pren /*... pren*/
       )
       < 0 /*vérification du signe de strcmp*/
    )

  5. #5
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Voici quelques commentaires:
    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    #include <stdio.h>
    #include <stdlib.h>
    /* -tc- inutile et pas portable
    #include <conio.h>
    */
    #include <string.h>
     
    /*******************************les structures*********************************/
     
    struct prenom
    {
        char p[25];  /* prenom */
        struct prenom  *suiv;
    };
    /* -tc- Masquer un pointeur derriere un alias cette maniere, c'est pas terrible.
       Ou alors, il faudrait que le nom de l'alias reflete le fait qu'il represente
       un pointeur p.ex. en prefixant l'identificateur de l'alias par p_
    */
    typedef struct prenom * p_listeprens;
     
    /****************************fclean()******************************************/
     
    int fclean (char *buffer, FILE * fp)
    {
       int err = 0;
       if (buffer != NULL && fp != NULL)
       {
          char *pc = strchr (buffer, '\n');
     
          if (pc != NULL)
          {
             /* On remplace '\n' par le caractere nul '\0' */
             *pc = 0;
          }
          else
          {
             /* La saisie a ete tronquee, on purge le flux entrant */
             int c;
     
             while ((c = fgetc(fp)) != '\n' && c != EOF)
             {
             }
             err = 1;
          }
       }
       return err;
    }
     
    /*************************inserordre*******************************************/
     
    int inserordre(p_listeprens *adlp, char *pren)
    {
        struct prenom *nouv = NULL;
        struct prenom *bal = NULL;
        struct prenom *prec = NULL;
     
        nouv = malloc(sizeof *nouv);
        if (nouv != NULL)
        {
            /* -tc- creation d'une structure statique dont tous les champs sont
               initialises a zero */
            static struct prenom const tmp;
            /* -tc- Initialisation de nouv */
            *nouv = tmp;
     
            /* -tc- C'est une bonne idee de securiser la copie */
            strncat(nouv->p, pren, sizeof nouv->p - 1);
            bal = *adlp;
     
            while (bal != NULL && strcmp(bal->p, pren) < 0)
            {
                prec = bal;
                bal = bal->suiv;
            }
     
            if (bal == *adlp)
            {
                /* -tc- la liste est vide */
                *adlp = nouv;
                nouv->suiv = bal;
            }
            else
            {
                prec->suiv = nouv;
                nouv->suiv = bal;
            }
     
            /* -tc- Outre le fait que je n'aime en general pas utiliser des return
               sauvages, je trouve toujours etrange, en C, de renvoyer 1 lorsque tout
               s'est bien passe. */
            return 1;
        }
        else
        {
            return 0;
        }
    }
     
    /****************************lireordre()***************************************/
     
    /* -tc- Par soucis de symetrie entre declaration et definition de fonction, je
       conseille de toujours dedfinir une fonction a l'aide d'un prototype. En
       particulier, une liste vide d'arguments devrait etre specifiee par void. */
    p_listeprens lireordre(void)
    {
        p_listeprens lst = NULL;
        char pren[25] = "";
        int end = 0;
     
        while (end == 0 && fgets(pren, sizeof pren, stdin) != NULL)
        {
            fclean(pren, stdin);
     
            if (strcmp(pren, ".") != 0 && inserordre(&lst, pren) == 1)
            {
            }
            else
            {
                end =1;
            }
        }
     
        return lst;
    }
     
    /***********************************ecrire************************************/
    void ecrire(p_listeprens lp)
    {
        while (lp != NULL)
        {
            printf("%s    ", lp->p);
            lp = lp->suiv;
        }
    }
     
    /***************************main**********************************************/
     
    /* -tc- main() renvoit un entier de type int, toujours! */
    int main(void)
    {
        p_listeprens lp;
        printf("Entrer une suite de prenoms (un par ligne) et terminer par un \'.\':\n");
        lp = lireordre();
        printf("dans l'ordre:\n");
        ecrire(lp);
        /* -tc- inutile et pas portable
        getch();
        */
     
        /* -tc- main() doit retourner 0, EXIT_SUCCESS ou EXIT_FAILURE */
        return 0;
    }
    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++

    +

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    merci ça marche trés bien, je vous remercie beaucoup

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

Discussions similaires

  1. [VBA-EXcel] classement des noeuds d'une treeview dans l'ordre alphabétique
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/01/2017, 19h02
  2. Comment Incrémenter une chaine dans l'ordre alphabétique ?
    Par Bobsinglar dans le forum Général Java
    Réponses: 4
    Dernier message: 14/11/2008, 15h06
  3. fichier dans l'ordre alphabétique avec dirent
    Par drasalmed dans le forum POSIX
    Réponses: 6
    Dernier message: 03/12/2007, 23h19
  4. Alimenter un recordset dans l'ordre alphabétique
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/11/2007, 11h04
  5. extraction dans un champ (TEXTE) une suite de numéro
    Par BORDEAUX4 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/03/2007, 13h43

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