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 :

Probleme structures chainees (classement d'eleves)


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 11
    Par défaut Probleme structures chainees (classement d'eleves)
    Bonjour,
    cela fait pas mal de temps que je suis en train de travailler sur un programme en C, qui doit ranger des eleves (dont le nom, le prenom, la date de naissance et la note sont entrees par l'utilisateur) dans l'ordre alphabetique de leurs noms..
    Je pense avoir bien defini la fonction qui range les noms dans l'ordre alphabetique, et celle qui affiche les elements entres par l'utilisateur. Cependant, je n'arrive pas a les utiliser dans ma fonction principale...
    Si quelqu'un a une suggestion..
    Merci d'avance..

    Voici ce que j'ai fait :
    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
    typedef struct eleve {
    	char nom[32];
    	char prenom[32];
    	int date_de_naissance;
    	double  note_finale;
    	struct eleve* suivant;
    } Eleve;
     
    ///Fonction lire_eleve
    ///Fonction qui demande a l'utilisateur les données des eleves qu'il souhaite insérer.
    Eleve* lire_eleve(Eleve* el){
    	printf("nom?\n");
    	scanf("%s",el->nom);
    	printf("prenom?\n");
    	scanf("%s",el->prenom);
    	printf("date de naissance?\n");
    	scanf("%d",&el->date_de_naissance);
    	printf("note finale?\n");
    	scanf("%lf",&el->note_finale);
    return el;
    }
     
    ///Fonction imprime_eleve
    ///Fonction qui imprime le nom, le prenom, la date de naissance et la note finale
    void imprime_eleve(Eleve s){
    int a=strlen(s.nom);
    int b=strlen(s.prenom);
    int i;
    for(i=0;i<a;i++){printf("%c ",s.nom[i]);}
    for(i=0;i<b;i++){printf("%c ",s.prenom[i]);}
    printf("%i %d \n",s.date_de_naissance,s.note_finale);
    };
     
    // Cette fonction insere en tete de la liste l'eleve donne. Tete pointera sur le nouvel  Eleve.
    void insertionEnTete(Eleve ** tete, Eleve * eleveAInserer) {
        eleveAInserer->suivant= (*tete);    
        (*tete) = eleveAInserer;}
     
    //Insere en queue de liste l'eleve donne    
        void insertionEnQueue(Eleve ** tete, Eleve * eleveAInserer) {
        Eleve * ptr;    
        if (*tete != NULL) {	
                  ptr = * tete;	while (ptr->suivant!= NULL)	    
                  ptr = ptr->suivant;	ptr->suivant= eleveAInserer;    }
                   else	*tete = eleveAInserer; }
     
     
    void inserer(Eleve ** tete, Eleve * eleveAInserer) {
        if (*tete == NULL) { 
    	*tete = eleveAInserer;
        } else { 
    	if (strcmp((*tete)->nom, eleveAInserer->nom) > 0) {  
    	    printf("Insertion en tete %s < %s\n", eleveAInserer->nom, (*tete)->nom);
    	    insertionEnTete(tete, eleveAInserer);
    	} else {
    	    Eleve * ptr = *tete;
     
    	    while ((ptr->suivant != NULL) && (strcmp(ptr->suivant->nom, eleveAInserer->nom) < 0)) { 
    		printf("%s > %s\n", eleveAInserer->nom, ptr->suivant->nom);
    		ptr = ptr->suivant;
    	    }
    	    eleveAInserer->suivant= ptr->suivant;
    	    ptr->suivant= eleveAInserer;
    	}
        }
    } 
     
    void imprime_classe(Eleve* tete) {
        Eleve * ptr;
        ptr = tete;
        if (tete == NULL)
    	printf("Il n y a pas d'étudiants\n");
        else {
    	do {
    	    printf("%s \t\t%s \t\t%d \t\t %d\n", ptr->nom, ptr->prenom, ptr->date_de_naissance, ptr->note_finale);
    	    ptr = ptr->suivant;
    	} while (ptr != NULL);
        }
    }
     
     
    ///Fonction main()
    int main(){
        Eleve * tete = NULL;
    	Eleve* premier=malloc(sizeof(Eleve));
    	premier=lire_eleve(premier);
    	int isAnotherStudent=1;
    	while(isAnotherStudent==1) 
    	{       
    		printf("Voudriez-vous continuer la saisie? (oui(1) ou non(0)) \n");
    		scanf("%d",&isAnotherStudent);
    		if(isAnotherStudent==1)
    		{
    			premier->suivant= malloc(sizeof(Eleve)); 
    			premier->suivant=lire_eleve(premier->suivant);
    		} else
    		{
    		premier->suivant=NULL;
    		}
     
    	}
           imprime_classe(premier);
          // imprime_classe(classe, compteur);
     
    	return 0;
     
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Bonjour et bienvenue sur le forum.

    On attend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(isAnotherStudent==1)
    {
      Eleve * p= malloc(sizeof(Eleve));
      lire_eleve(p);
      inserer(&premier,p);
    }
    else ...
    A noter que la fonction imprime_eleve n'est pas très astucieusse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void imprime_eleve(Eleve * s)
    {
    printf("%s ",s->nom);
    printf("%c ",s->prenom)
    printf("%i %d \n",s->date_de_naissance,s->note_finale);
    }
    d'où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void imprime_classe(Eleve* tete) {
        Eleve * ptr;
        ptr = tete;
        if (tete == NULL)
    	printf("Il n y a pas d'étudiants\n");
        else do 
              {
    	    imprime_eleve(ptr);
    	    ptr = ptr->suivant;
              } while (ptr != NULL);
    }

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 11
    Par défaut
    Bonsoir,
    je vous remercie. J'ai fait les modifications, cependant, des que l'on rentre deux noms, le programme les classe tous les deux, sans attendre que l'on en rentre d'autres.. il faudrait qu'il stocke tous les noms que l'utilisateur rentre, et qu'il les classe ensuite.. J'ai beau chercher, tout essayer, je n'y parviens pas..
    Je vous remercie

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    cependant, des que l'on rentre deux noms, le programme les classe tous les deux, sans attendre que l'on en rentre d'autres..
    C'est ta fonction inserer() qui est faite de cette façon : elle cherche où insérer le nouveau.
    Si tu veux les rentrer sans classement, n'utilise que des insertions en tête ou en queue au choix, et procède au tri à la fin. Il te faudra alors ajouter une fonction de tri de ta liste.
    Si pour cette fonction de tri, tu veux utiliser la fonction standard qsort(), il te faudra sans doute revoir légèrement ta structure de données.

Discussions similaires

  1. probleme structure case
    Par monsieur77 dans le forum Linux
    Réponses: 4
    Dernier message: 07/11/2007, 12h14
  2. Probleme structure / realloc
    Par bobgeldof7 dans le forum C
    Réponses: 4
    Dernier message: 30/11/2006, 21h33
  3. probleme liste chainee
    Par Pitou5464 dans le forum C
    Réponses: 13
    Dernier message: 27/10/2006, 19h07
  4. probleme structure en parametre
    Par ciberju dans le forum C
    Réponses: 2
    Dernier message: 21/08/2006, 03h26
  5. Réponses: 3
    Dernier message: 02/03/2006, 11h25

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