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 :

Problème tableau de structures et pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 7
    Par défaut Problème tableau de structures et pointeur
    Heey,
    je dois faire la saisie d'un tableau de structure Te de Ne étudiants à l'aide des pointeurs. Au début ça marche très bien puis au niveau de la date de naissance ça bloque.. Aussi je pense qu'il y'a un problème dans le remplissage de tnotes.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void main()
    {
      struct identification {
       int num;
       char section[20];
      };
     
      struct date {
       int jours;
       int mois;
       int annee;
      };
     
      struct etudiant {
       struct identification id;
       char nom[20];
       char prenom[20];
       struct date date_naiss;
       float tnotes[10];
       float moy;
      };
      int ne,nn;
      struct etudiant *te;
      struct etudiant *p;
      float *pn;
      p=te;
     
      do
      { printf ("Donnez le nombre d'etudiant :");
        scanf ("%d",&ne);
      }while ((ne<2)||(ne>20));
     
      te=(struct etudiant*)malloc(ne*(sizeof(struct etudiant)));
     
      do
      { printf ("Donnez le nombre de notes :");
        scanf ("%d",&nn);
      }while((nn<2)||(nn>10));
     
      for (p=te;p<te+ne;p++)
        { printf ("Donnez le num de l'etudiant :");
          scanf ("%d",p->id.num);
          printf ("Donnez la section de l'etudiant :");
          scanf ("%s",p->id.section);
          printf ("Donnez le nom de l'etudiant :");
          scanf ("%s",p->nom);
          printf ("Donnez le prenom de l'etudiant :");
          scanf ("%s",p->prenom);
          printf ("Donnez le jour de naissance de l'etudiant :");
          scanf ("%d",p->date_naiss.jours);
          printf ("Donnez le mois de naissance de l'etudiant :");
          scanf ("%d",p->date_naiss.mois);
          printf ("Donnez l'annee de naissance de l'etudiant :");
          scanf ("%d",p->date_naiss.annee);
          for (pn=p->tnotes;pn<(tnotes+nn);pn++)
          {do
           {printf ("Donnez les notes :");
            scanf ("%f",pn);
           }while ((*pn<0)||(*pn>20));
          }
        }
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Définis "ça bloque".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Je ne comprends pas ce struct etudiant *te; struct etudiant *p; p=te;. J'ai l'impression de voir ici un aveugle ("te", qui contient n'importe quoi) guider un autre aveugle ("p"). Avec en plus ces noms "te" et "p" qui sonnent très "enquêtes du juge Ti" (Van Gulik).
    Et donc quand on voit ce genre d'instruction aussi absurde qu'inutile, on ne peut pas s'empêcher de penser que pour le reste c'est pareil => manque de réflexion et de fondation. Et c'est encore renforcé par cette fonction main() que tu nous mets "void" alors qu'elle est "int".

    Donc pose les bons jalons, construit ton code proprement en ayant bien en tête là où tu veux aller et tes soucis disparaitront tous seuls.

    Par exemple ta saisie. Tu ne sens pas déjà que ça va être méga lourd ? "donner le nombre de notes" puis "donner le nom" puis "donner le prénom" puis le jour de naissance etc. Déjà rien que la date ; tu peux pas la faire saisir sous forme jj/mm/aa et la découper sur le "/" pour en extraire les infos ? Et les notes t'es obligé de demander combien il va y en avoir ? Peut pas faire une boucle de 1 à 10 et dire "saisissez la note n ou -1 pour quitter" et donc extraire le nombre réel de notes saisies ? Et faire de même pour le nombre d'étudiants...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    J'ai trouvé, te c'est le tableau d'étudiants. nn c'est le nombre de notes. Pour les autres, je chercherai plus tard...

    A part ça, quant on fait scanf() il faut mettre un & devant les variables comme pour toutes les fonctions qui doivent modifier un paramètre (à part pour les pointeurs et les tableaux car leur nom est déjà une adresse) donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          scanf ("%d",&p->id.num);
          scanf ("%d",&p->date_naiss.jours);
          scanf ("%d",&p->date_naiss.mois);
          scanf ("%d",&p->date_naiss.annee);
    for (pn=p->tnotes;pn<(tnotes+nn);pn++) ne doit pas compiler j'aurais écrit for (pn=p->tnotes;pn<p->tnotes+nn;pn++).
    J'ai compris que les pointeurs étaient une contrainte imposée, mais les nommer sur 2 lettres n'est pas une bonne idée

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 7
    Par défaut
    Mercii pour votre aide !
    Au début je n'ai pas mis les adresses & pr scanf j'ai cru que p et pn sont des pointeurs donc ils nécessitent pas des &...
    J'ai essayé de changer un peu voilà :


    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct identification
    {
        int num;
        char section[20];
    };
     
    struct date
    {
        int jours;
        int mois;
        int annee;
    };
     
    struct etudiant
    {
        struct identification id;
        char nom[20];
        char prenom[20];
        struct date date_naiss;
        float tnotes[10];
        float moy;
    };
     
    void remplir (int ne,int nn,struct etudiant *te)
    {
        struct etudiant *p;
        float *tnotes;
        float *pn;
        for (p=te; p<te+ne; p++)
        {
            printf ("Donnez le num et la section de l'etudiant :");
            scanf ("%d%s",&p->id.num,p->id.section);
            printf ("Donnez le nom et le prenom de l'etudiant :");
            scanf ("%s%s",p->nom,p->prenom);
            printf ("Donnez la date de naissance de l'etudiant :");
            scanf ("%d%d%d",&p->date_naiss.jours,&p->date_naiss.mois,&p->date_naiss.annee);
     
            for (pn=p->tnotes; pn<p->tnotes+nn; pn++)
            {
                do
                {
                    printf ("Donnez les notes :");
                    scanf ("%f",pn);
                }
                while ((*pn<0)||(*pn>20));
            }
        }
    }
     
    void main ()
    {
        int ne,nn;
        float *pn;
        struct etudiant *te;
        struct etudiant *p;
        p=te;
     
        do
        {
            printf ("Donnez le nombre d'etudiant :");
            scanf ("%d",&ne);
        }
        while ((ne<2)||(ne>20));
     
        te=(struct etudiant*)malloc(ne*(sizeof(struct etudiant)));
     
        do
        {
            printf ("Donnez le nombre de notes :");
            scanf ("%d",&nn);
        }
        while((nn<2)||(nn>10));
        remplir (ne,nn,te);
     
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sunshine25 Voir le message
    Au début je n'ai pas mis les adresses & pr scanf j'ai cru que p et pn sont des pointeurs donc ils nécessitent pas des &...
    Oui p et pn sont des pointeurs. C'est pour ça que tu écris ensuite p->xxx et pn->yyy. La flèche indique que l'élément placé avant est un pointeur (et n'est en réalité qu'un raccourci vers l'écriture (*p).xxx et (*pn).yyy mais c'est plus pratique d'utiliser la flèche que les parenthèses).
    Mais les membres pointés par cette flèche (exemple p->id.num) ne sont pas des pointeurs (id_num est un int !!!). Donc pour indiquer que tu veux envoyer à scanf l'adresse de ce id_num t'es obligé de mettre "&" devant. Et pareil pour tous les autres...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. problème tableau de structure
    Par alaninho dans le forum C
    Réponses: 9
    Dernier message: 24/08/2012, 14h18
  2. problème tableau de structure
    Par scary dans le forum Débuter
    Réponses: 8
    Dernier message: 30/03/2008, 19h38
  3. Problème free() : Tableau de structures
    Par bit_o dans le forum C
    Réponses: 11
    Dernier message: 28/04/2007, 15h53
  4. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  5. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20

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