成绩册显示错误C

成绩册显示错误C,c,C,我有我正在写的成绩册程序,我无法确定我的错误在哪里。我没有正确显示结果。下面是我应该运行的示例以及结果应该是什么样的: ID, NAME, GRADE 2442 Kapowski, Kelly 87 99 100 87 88 -99 1254 Slater, A.C. 90 100 -99 8742 Morris, Zack 77 65 50 80 66 -99 结果: Welcome to the automated grade book program. Version 2.0 Enter

我有我正在写的成绩册程序,我无法确定我的错误在哪里。我没有正确显示结果。下面是我应该运行的示例以及结果应该是什么样的:

ID, NAME, GRADE
2442
Kapowski, Kelly
87 99 100 87 88 -99
1254
Slater, A.C.
90 100 -99
8742
Morris, Zack
77 65 50 80 66 -99
结果:

Welcome to the automated grade book program. Version 2.0
Enter Student data filename:grades.txt
Name                 ID    Average Grade Scores
Kapowski, Kelly      2442     92.2     A  87  99 100  87  88
Morris, Zack         8742     67.6     D  77  65  50  80  66
Slater, A.C.         1254     95.0     A  90 100 
守则:

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

#define MAX_NAME 50
#define MAX_SCORES 20
#define MAX_FILE_NAME 100

typedef struct {
    char name[MAX_NAME];
    int id;
    double scores[MAX_SCORES];
    int num_scores;

} student_t;

double student_average (student_t student);
FILE * get_data_file();
void get_data(student_t students[], int num_students, FILE *input_file);
void sort_student_array(student_t students[], int num_students);
int find_index_of_next(const student_t students[], int num_elements, int start_index);
void display_data(const student_t students[], int num_elements);

int main() {

   student_t *students;
    FILE *input_file;
    int num_students;

    input_file = get_data_file();

    //Get the number of students in the data file
    fscanf (input_file, "%d", &num_students);

   //Dynamically allocate the student array
    students = (student_t *)calloc(num_students, sizeof(student_t));

    // Get the student data
    get_data(students, num_students, input_file);

    // Sort the array alphabetically
    sort_student_array(students, num_students);

    // Display the student data
    display_data(students, num_students);

    // Free the space allocated to the array
    free(students);

    return 0;
}

//For each of the student's scores, divide the total points by the number of scores      
double student_average (student_t student) {

    double average;
    double total;
    int count;

    for (count = 0; count < student.num_scores; count++)
        total += student.scores[count];

    average = total / student.num_scores;

    return average;
}

//Read in the data file and make sure it is valid
FILE * get_data_file() {

    int valid = 0;
    char file_name[MAX_FILE_NAME];
    FILE *in_file;

    printf("Welcome to the automated grade book program. Version 2.0\n");

    do {
        printf ("Enter student data filename:");
        scanf ("%s", file_name);
        in_file = fopen (file_name, "r");

        if (in_file != NULL){
            valid = 1;
        } else {
            printf ("Unable to open file %s. Try again.\n", file_name);
        }
    } while (!valid);

    return in_file;
}

//Read data for each student
void get_data(student_t students[], int num_students, FILE *input_file) {

    int count;
    int count2;
    student_t student;
    double value;

    for (count = 0; count < num_students; count++) {
        //Read the student id number
        fscanf (input_file, "%d\n", &student.id);
        //Read the student name
        fgets (student.name, MAX_NAME, input_file);
        //Remove the newline from the name
        student.name[strlen(student.name)-1] = '\0';
        //Read the student test scores
        fscanf(input_file, "%lf", &value);

        count2 = 0;
        while (value != -99){
            student.scores[count2] = value;
            fscanf(input_file, "%lf", &value);
            count2++;
        }

        //Store count2 as the number of test scores for the student
        student.num_scores = count2;
        //Store the student in the student array
        students[count] = student;
    }
}

//Sort the students alphabetically
void sort_student_array(student_t students[],int num_students) {

    int count;
    int index_of_first;
    student_t temp;

    for (count = 0; count < num_students - 1; count++) {
        index_of_first = find_index_of_next(students, num_students, count);

        if (index_of_first != count) {
            temp = students[count];
            students[count] = students[index_of_first];
            students[index_of_first] = temp;
        }
    }
}

// For each student in the list, Test if the student's name in count is
// before the student's name in index_of_first
int find_index_of_next(const student_t students[], int num_elements, int start_index) {
    int count,
        index_of_first = start_index;

    for (count = start_index; count < num_elements; count++){
        if (strcmp(students[count].name, students[index_of_first].name) < 0)
            index_of_first = count;
    }

    return index_of_first;
}
//Displays the student data in proper format
void display_data(const student_t students[], int num_elements){
    int count;
    int index;
    double average;
    char grade;


    printf ("\nName                 ID   Average Grade Scores\n");


    for(count = 0; count < num_elements; count++) {
        printf ("%-20s", students[count].name);

        printf (" %-4d", students[count].id);

        average = student_average(students[count]);
        printf (" %7.1lf", average);

        if (average >= 90)
            grade = 'A';
        else if (average >= 80)
            grade = 'B';
        else if (average >= 70)
            grade = 'C';
        else if (average >= 60)
            grade = 'D';
        else
            grade = 'F';

        printf (" %5c", grade);

        //Test if the student's name in count 
        //is before the student's name in index_of_first
        for (index = 0; index < students[count].num_scores; index++)
            printf (" %3.0lf", students[count].scores[index]);


        printf ("\n");
    }
}

它只是停止,在这里什么也不做。

您的输入文件格式错误。我的意思是,首先你要看学生人数,然后在你的循环中,你要得到ID、姓名和分数。但您的输入文件最初并没有学生编号行,而是有“ID、姓名、年级”行。这样更改grades.txt文件将解决问题:

3
2442
Kapowski, Kelly
87 99 100 87 88 -99
1254
Slater, A.C.
90 100 -99
8742
Morris, Zack
77 65 50 80 66 -99

如果您检查scanf调用的返回值,可能很快就会发现这个问题
scanf
返回成功转换的项目数,因此应为

if (scanf ("%s", ...) == 1) {
    /* OK */
} else {
    /* Problem. */
}
...
if (fscanf (input_file, "%lf", &value) == 1) {
    /* OK */
} else {
    /* Problem. */
}

您现在得到的输出是什么?@user3067307更改输入文本文件是否解决了您的问题?
if (scanf ("%s", ...) == 1) {
    /* OK */
} else {
    /* Problem. */
}
...
if (fscanf (input_file, "%lf", &value) == 1) {
    /* OK */
} else {
    /* Problem. */
}