Probleme structures chainees en C (classement d'eleves)
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Probleme structures chainees en C (classement d'eleves)



  1. #1
    invite690e7e9c

    Probleme structures chainees en C (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..
    Mon probleme est :
    d'une part, je n'arrive pas a afficher les donnees saisies par l'utilisateur
    d'autre part, je n'arrive pas a utiliser ma fonction qui range les noms dans l'ordre alphabetique..
    Si quelqu'un a une suggestion..
    Merci d'avance..

    Voici ce que j'ai fait :

    Code:
    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;
    
    }

    -----
    Dernière modification par yoda1234 ; 21/11/2009 à 06h37. Motif: Mise en place balise code

  2. #2
    yoda1234

    Re : Probleme structures chainees en C (classement d'eleves)

    Je te suggère d'utiliser la balise "code" quand tu insères ce genre de choses dans un message.
    Elle est représentée par ce symbole dans l'éditeur avancé de message.
    Là où l'ignorance est un bienfait, c'est de la folie d'être sage (Thomas Gray).

  3. #3
    invite690e7e9c

    Re : Probleme structures chainees en C (classement d'eleves)

    D'accord, c'est bien note!
    Je precise mon probleme dans le code : en fait tous les elements sont la, 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 main...
    Merci

  4. #4
    polo974

    Re : Probleme structures chainees en C (classement d'eleves)

    question 1: comment faire rentrer une date dans un int (ça m'étonnerait que l'utilisateur donne le nombre de jours depuis le 01/01/1900...)
    question 2: comment faire un printf d'un double avec un %d

    question plus sérieuse: comment le pointeur premier peut être le premier élément s'il est régulièrement modifié?
    question annexe: à quoi sert le pointeur tete qui est déclaré et non utilisé?

    réponse: mélange de pointeur...
    Jusqu'ici tout va bien...

  5. A voir en vidéo sur Futura
  6. #5
    invite690e7e9c

    Re : Probleme structures chainees en C (classement d'eleves)

    Bpnsoir,
    je te remercie, j'ai revu tout ca, voici mon nouveau code:
    Code:
    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)
    {
    printf("%s ",s->nom);
    printf("%c ",s->prenom);
    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 
              {
    	    imprime_eleve(ptr);
    	    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)
                                   {
                                   Eleve * p= malloc(sizeof(Eleve));
                                     lire_eleve(p);
                                       inserer(&premier,p);
                                       }
     else
    		{
    		premier->suivant=NULL;
    		imprime_classe(premier);
    		}
    		
    	}
           
          // imprime_classe(classe, compteur);
     
    	return 0;
     
    }
    Par contre avec ce que j'ai fait 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..
    Toute suggestion est la bienvenue..
    Merci beaucoup

  7. #6
    Jack
    Modérateur

    Re : Probleme structures chainees en C (classement d'eleves)

    Ce n'est pas vraiment du C pur la définition de nouvelle variable au milieu des instructions.

    A quoi sert la variable tete dans le main?

    Code:
    ...
    else
    		{
    		premier->suivant=NULL;
    		imprime_classe(premier);
    		}
    ...
    si je comprends bien, premier représente ta tête de liste. Et dès que tu as fini la saisie, premier->suivant est mis à NULL. Donc le reste de la liste est perdu.

    Tu n'as pas de debugger pour mettre au point le programme? Comme çà tu pourrais suivre l'évolution de la liste.

    De plus, je recommande le papier, le crayon et la gomme pour suivre cette évolution à la main.

    A+

  8. #7
    invite2d7144a7

    Re : Probleme structures chainees en C (classement d'eleves)

    Bonjour,
    Citation Envoyé par Jack Voir le message
    De plus, je recommande le papier, le crayon et la gomme pour suivre cette évolution à la main.
    On ne le répétera jamais assez.

    Mais ils veulent courir avant d'apprendre à marcher ...

    ... et d'ailleurs, même une fois qu'on sait courir, le conseil reste bon.

Discussions similaires

  1. Problème de classement sur apb
    Par invitebb2347c3 dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 10/06/2009, 16h40
  2. témoignages d'eleves ou anciens eleves a l'INAPG
    Par invite11c3567a dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 30/01/2009, 18h57
  3. [Biologie Moléculaire] Structures
    Par invite9d710677 dans le forum Biologie
    Réponses: 6
    Dernier message: 01/10/2008, 16h11
  4. C : Initialisation de structures/tableaux de structures
    Par invitef1d0ad93 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 12/08/2008, 11h57
  5. [TIPE] Stabilité Classement ELO (classement aux échecs)
    Par invite3482538a dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 08/05/2008, 16h50
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...