Enregistrements

akramdib Messages postés 8 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
j'ai pas pu trouver où elle est la faute que j'ai comis
merci de me guider

voici mon code :

#include <stdio.h>
#include <stdlib.h>
int i ,n ;
typedef struct etudiant
{
    int note[100];
    char nom[100];
    char prenom[100];

}etudiant;

int main()
{
    printf("donner le nombre d'etudiants qui vous allez me donner leurs info : n= ");
    scanf("%d",n);
    for(i=1;i<=n;i++)
        {
            printf("quel est le nom d'etudiant %d :",n );
            scanf("%s",&etudiant.nom[i]);

            printf("quel est le prenom d'etudiant %d :",n );
            scanf("%s",&etudiant.prenom[i]);

            printf("quel est la note d'etudiant %d :",n );
            scanf("%d",&etudiant.note[i]);

        }
        
   for(i=1;i<=n;i++)
    {
      printf("etudiant %d :",n);
      printf("Nom:%s",etudiant.nom);
      printf("Prenom:%s",etudiant.prenom);
      printf("La Note :%s",etudiant.note);
    }
    return 0;
}


et voici ce que l'IDE m'affiche :



Configuration: Windows / Chrome 74.0.3729.169

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Bonjour akramdib,

    Il y a plusieurs problèmes dans ton code. La cause première de l'erreur est que tu ne déclares pas une variable "etudiant", mais juste un type "etudiant", avec l'instruction
    typedef
    , ce type étant un alias du type
    struct etudiant
    que tu as définit et donc, tu n'as pas de mémoire allouée permettant un stockage que quoi que ce soit, juste la création de types.

    Pour déclarer un étudiant en utilisant ce type, il faudrait écrire, par exemple :
    etudiant etud1;
    et à ce moment là, tu réserves de la mémoire pour stocker des choses dans les membres de la
    struct
    avec la variable
    etud1
    .

    Il y a des confusions au niveau des valeurs passées en arguments de tes
    scanf()
    , qui attend des pointeurs. Si
    n
    est un
    int
    alors tu dois passer un pointeur sur
    n
    , donc
    scanf("%d", &n);
    et pas
    scanf("%d", n);
    ...

    Par contre, lorsque tu veux traiter une chaîne de caractères, l'identifiant de la chaîne déclarée pointe déjà vers l'adresse mémoire du début de l'espace réservé à la chaîne. Donc si tu as un tableau de 100
    char
    déclaré comme
    char nom[100];
    , qui est un espace mémoire pouvant accueillir une chaîne de 99 caractères au maximum (plus de
    '\0'
    qui termine la chaîne), il suffit de faire
    scanf("%s", nom);
    et tu n'as pas besoin de précéder le nom de
    &
    ...

    Ce qui m'amène à la dernière série de problèmes. Un
    typedef
    sur une
    struct
    comme :

    typedef struct etudiant
    {
        int note[100];
        char nom[100];
        char prenom[100];
    } etudiant;

    est un type qui permet de stocker :
    - un tableau de 100 notes avec le membre "note"
    - une chaîne de 99 caractères avec le membre "nom"
    - une chaîne de 99 caractères avec le membre "prenom"

    Si tu veux un tableau de 100 étudiants, avec chacun 1 note, 1 nom et 1 prénom, cela ne sert à rien de réserver un espace pour un tableau de 100 notes de cet étudiant... sauf si tu veux stocker 100 notes pour chacun des 100 étudiants...

    Pour faire un tableau de 100 étudiants, tu déclarerais :

    etudiant etudiants[100];

    et tu accèdes aux champs concernant la note du premier étudiant en faisant
    etudiants[0].note
    , à l'adresse réservée pour son nom en faisant
    etudiants[0].nom
    etc.

    Dal
    1