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 :

gestion des notes d'une classe


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut gestion des notes d'une classe
    bonsoir a tous je crée cette discution autour du sujet suivant:
    on se propose d'ecrire un programme pour gerer les notes de langage C a l'aide d'une liste chainée.

    a) definir un type ELEVE caractérisé par un note et son nom(le type doit pouvoir permettre egalement de gerer une liste chainée)


    b)Ecrire une fonction qui saisit un eleve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ELEVE Creer(char *nom,float note)
    c)ecrire une fonction qui ajoute un eleve a une liste d'eleves
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ELEVE ajouter(ELEVE *liste, ELEVE nouveau)
    d)ecrire une fonction qui affiche le contenu de la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher(ELEVE* liste)
    e)ecrire une fonction qui retourne la moyenne des notes contenues dans une liste d'eleve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float moyenne(ELEVE* liste)
    voici ce que j'ai fait:

    a)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct eleve
    {
         char* nom;
         float note;
         struct eleve *s;
         struct eleve *p;
    }ELEVE;
    b)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ELEVE Creer( char* nom , float note )
    {
          ELEVE *e=(ELEVE*) malloc(1*sizeof(ELEVE)); 
          strcpy(e->nom,nom);  // on recopie son nom et sa note
          e->note=note;
          //on ne s'occupe pas des pointeurs suivants et precedents pour le moment
          return *e;  //on retourne l'objet lui meme et non son adresse
    }
    c)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ELEVE* Ajouter(ELEVE *tete,ELEVE nouveau)
    {
         nouveau.s=tete;             
         nouveau.p=NULL;
         if (tete != NULL)
         {
              tete->p = &nouveau;
              nouveau.p=NULL;
         }
         return &nouveau;
    }
    d)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Afficher(ELEVE *tete)
    {
         if (tete != NULL)
         {
               while(tete != NULL)
               {
                       printf("Nom de l'eleve: %s\n" , tete->nom); 
                       printf("Note de l'eleve: %d\n\n" , tete->note); 
                       tete=tete->s;
               }
         }
         else printf("la liste d'eleves est vide\n");
         system("pause");
    }
    pour la question e) on verra plus tard....

    mais pour le moment la fonction Creer ne marche pas, pourtant
    je l'ai testé seule avec le main ci dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(void)
    {
         ELEVE *nouveau;
         nouveau = &Creer("name",10);
         printf("nom : %s\n",nouveau->nom);
         printf("note : %f\n",nouveau->note);
         system("pause");
         return 0;
    }
    malgré le system("pause") la fenetre se ferme avant ke je n'ai pu voir si tout est ok...

    quelqu'un aurait il la solution a mon pb?

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Tu déclares un pointeur, il faut donc allouer la mémoire pour pouvoir utiliser strcpy ! Je te conseille d'utiliser un tableau plutôt que passer par une allocation dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct eleve
    {
         char nom[50];
         float note;
         struct eleve *s;
         struct eleve *p;
    }ELEVE;

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Bonjour,

    Ce qui me fait dresser les cheveux sur la tête (ceux qui me restent) et ceux de mon compilateur d'ailleurs, c'est surtout cette ligne (dans le main):
    Citation Envoyé par tijani5960 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveau = &Creer("name",10);
    Erreur qui est sans doute due à quelques erreurs dans les fonctions...

    Concernant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ELEVE Creer(char *nom,float note)
    Je ne suis pas d'accord avec tes commentaires:
    on ne s'occupe pas des pointeurs suivants et precedents pour le moment
    Si justement ! C'est ici qu'il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    e->s = NULL;
    e->p = NULL;
    on retourne l'objet lui meme et non son adresse
    Et encore si! Tu alloues un objet dynamiquement, retourne alors son pointeur... Je ne suis même pas certain de savoir ce que fait le code
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ELEVE* Ajouter(ELEVE *tete,ELEVE nouveau);
    Le premier paramètre est un pointeur, le retour est un pointeur, mais pourquoi pas le second paramètre ?
    Fait une fonction avec cette signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ELEVE* Ajouter(ELEVE *tete,ELEVE* nouveau);
    ce sera mieux...

    Dans le fond c'est plutôt bien parti, mais on distingue comme un trouble au niveau des pointeurs...

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(void)
    {
         ELEVE *nouveau;
         nouveau = &Creer("name",10);
    Ceci est illégal : on ne peut pas prendre l'adresse d'une valeur (ici celle retournée par la fonction Creer()). C'est, sur le principe, la même chose qu'écrire &1
    Les fonctions en C retournent toujours des valeurs, jamais des objets (lvalue). Ainsi, on ne peut pas écrire f()=....(mais parfois on peut avoir *f()=.... )

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ELEVE* Ajouter(ELEVE *tete,ELEVE nouveau)
    {
    ....
         return &nouveau;
    }
    est incorrect puisque cette fonction retourne l'adresse d'une variable locale (nouveau) qui est détruite en sortie de fonction.

    - Tout ces problèmes viennent d'un prototype illogique de la fonction Creer().
    La fonction Creer devrait être du genre :
    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
    ELEVE * Creer( char* nom , float note )
    {
          ELEVE *e = malloc(sizeof(ELEVE));
          if(e != NULL) // Allocation réussie ?
          { 
             e->nom = malloc(strlen(nom)+1); // Allouer pour la chaine de caractères
             if(e->nom!= NULL)               // Allocation réussie ?
             {         
               strcpy(e->nom,nom);           // Oui, on recopie son nom et sa note
               e->note=note;
               e->s = e->p = NULL;
             }
             else free(e), e = NULL;         // Non, libérez tout ce qui a été alloué
          }
          return e;
    }
    //avec 
    int main(void)
    {
         ELEVE *nouveau = Creer("name",10);
         if(nouveau != NULL)printf("nom : %s\n",nouveau->nom);
    ....
    - Si on doit respecter le prototype de Creer(), cela amène à faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ELEVE Creer( char* nom , float note )
    {
         ELEVE e;
         e.nom = malloc(strlen(nom)+1); 
         if(e.nom!= NULL)strcpy(e.nom,nom);  // on recopie son nom et sa note
         e.note=note;
         e.s = e.p = NULL;
         return e; 
    }
    Avec des conséquences illogiques si on respecte le prototype de ajouter() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ELEVE ajouter(ELEVE *liste, ELEVE nouveau)
    {
       ELEVE *e = malloc(sizeof *e);
       if(e != NULL)
       {
         *e = nouveau;
       // insertion de e dans la liste;
       }
       return nouveau ; // A quoi sert ce retour ? a rien du tout !
                        // Comment indiquer la réussite ou l'échec de l'allocation ?
    }
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ELEVE * ajouter(ELEVE *liste, ELEVE nouveau)
    {
       ELEVE *e = malloc(sizeof *e);
       if(e != NULL)
       {
         *e = nouveau;
       // insertion de e dans la liste;
       }
       return e ; 
    }
    Il y a probablement donc des erreurs sur les prototypes de Creer() et ajouter().

Discussions similaires

  1. Demande d une aplication vb ( gestion des notes dans une ecole priver )
    Par hassan se dans le forum Discussions diverses
    Réponses: 0
    Dernier message: 29/04/2013, 21h54
  2. [Turbo Pascal] [Débutant] Gestion des notes des élèves d'une classe
    Par bigamine5 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/02/2009, 11h26
  3. Gestion des 'property' d'une classe
    Par philnext dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2007, 08h45
  4. Gestion des erreurs dans une classe
    Par gregb34 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 26/07/2007, 09h59

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