2017-09-22 8 views
1

Le problème est de trouver la plus grande moyenne d'un groupe d'étudiants. Comme vous le savez Structure fonctionne ici et à mon point de vue c'est une bonne idée (ou peut-être) que cette structure fait d'abord en utilisant Tableau de Structure parce que j'ai par exemple 30 étudiants. Ensuite, cherchez parmi les membres de cette structure et trouvez la réponse ultime.Trouver la plus grande moyenne parmi une liste d'étudiants en utilisant la structure

Mais j'ai rencontré un problème que je ne peux pas remplir le struct Stdinfo student[stdnum] et ma boucle for ne fonctionne pas correctement et je ne sais pas pourquoi!

Comme un chèque, j'ai utilisé printf() pour imprimer l'un des membres, mais je ne pouvais pas.

Voici mon code:

#include <stdio.h> 

struct Stdinfo 
{ 
    char name[30]; 
    int score; 
}; 

struct Stdinfo function(); 

int main(int argc, char **argv) 
{ 
    //Number of students ~stdnum 
    int stdnum, i; 
    puts("Input numbers of student(s) :"); 
    scanf("%i", &stdnum); 
    stdnum--; 

    struct Stdinfo student[stdnum]; 

    //Filling array of structure 
    for (i = 0; i < stdnum; i++) 
    { 
     student[i] = function(); 
    } 

    return 0; 
} 

struct Stdinfo function() 
{ 
    struct Stdinfo student; 
    puts("Input the name of the student : "); 
    fgets(student.name, sizeof(student.name), stdin); 
    puts("Input his(her) score:"); 
    scanf("%i", &student.score); 
    return student; 
} 

Maintenant la recherche n'est pas mon problème principal et je vous remercie de toute aide dont je peux résoudre « membres de structure dépôt » problème.

+2

Pourquoi avez-vous soustrait 1 à 'stdnum'? Votre tableau est maintenant trop petit. – Barmar

+0

@Barmar_ Parce que si vous avez 3 étudiants, vous aurez un tableau de taille 2. 0,1,2 –

+1

Non, c'est la taille 3. Les index vont de 0 à la taille-1. – Barmar

Répondre

0

Vous réduisez la taille de la baie de manière incorrecte. Ce faisant, vous ignorez le dernier étudiant. Jetez ce décrément.

Pensez maintenant comment l'entrée vient. L'utilisateur entre le nombre d'étudiants et ensuite son Enter!

scanf("%i" ,&stdnum); consommera le numéro, mais pas le retour à la ligne (à partir de Entrée).

En conséquence, fgets() lira cette nouvelle ligne et s'arrêtera là. En d'autres termes, il pense que c'est ce que l'entrée est réellement. Pour résoudre ce problème, consommez simplement cette nouvelle ligne, par ex. avec getchar(), avant que fgets() ne soit appelé.

#include <stdio.h> 
#include <string.h> 

struct Stdinfo{ 
     char name[30]; 
     int score; 
    }; 

struct Stdinfo function() ; 

int main(void) 
{ 
    //Number of students ~stdnum 
    int stdnum , i; 
    puts("Input numbers of student(s) :") ; 
    scanf("%i" ,&stdnum); 
    // Do not do that, it makes your program ignore the last student 
    //stdnum--; 

    struct Stdinfo student[stdnum] ; 

    //Filling array of structure 
    for(i=0 ; i < stdnum ; i++) 
    { 
     student[i] = function() ; 
    } 
    // print your array 
    for(i=0 ; i < stdnum ; i++) 
    { 
     printf("%s\n", student[i].name); 
     printf("%d\n", student[i].score); 
    } 

    return 0; 
} 

struct Stdinfo function() { 

    struct Stdinfo student; 

    getchar(); // Consume newline from previous input 

    puts("Input the name of the student : ") ; 
    fgets(student.name , sizeof (student.name) , stdin); 
    // remove trailing newline from 'fgets()' 
    student.name[strcspn(student.name, "\n")] = 0; 

    puts("Input his(her) score:") ; 
    scanf("%i" ,&student.score) ; 

    return student ; 
} 

PS: Vous pouvez Removing trailing newline character from fgets() input (mon exemple le fait).

+1

Cela fonctionne bien et sans problème. –