// 从score.txt中查找所有大于90分的学生信息（学号、成绩），并统计学生的数量和平均成绩。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct stu_s
{
    int sid;
    char dh; // 逗号
    float score;

    struct stu_s *next;
} STU;

int main()
{
    FILE *fp = fopen("sxxx.dest", "rb");
    // FILE *fp = fopen("score.txt", "r");

    if (NULL == fp)
    {
        return 1;
    }

    // 计算文件大小
    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    printf("score.txt 文件大小: %ld B\n", file_size);

    // 重置光标位置
    fseek(fp, 0, SEEK_SET); // 等同于使用 rewind(fp);
    // 按照 STU 的结构存储数据，计算出以存放学生数量
    int stu_num = file_size / sizeof(STU);
    printf("学生数量: %d\n", stu_num);

    int above_90_stu_nums = 0;               // 大于 90 分的学生数
    float sum_score_of_above_90_stus = 0.0f; // 大于 90 分学生的总成绩

    // printf("\n学号\t成绩\n");
    for (int i = 0; i < stu_num; i++)
    {
        // 为新的链表节点分配内存空间
        STU *s = calloc(1, sizeof(STU));
        // 从文件中读取一个学生的数据
        fread(s, sizeof(STU), 1, fp);

        if (s->score > 90)
        {
            above_90_stu_nums++;
            // printf("%.2f\n", s->score);
            sum_score_of_above_90_stus += s->score;
        }

        free(s);
    }

    float avg_score_of_above_90_stus = sum_score_of_above_90_stus / above_90_stu_nums;
    printf("\n大于 90 分的学生有 %d 位，他们的平均成绩为 %.2f\n", above_90_stu_nums, avg_score_of_above_90_stus);

    fclose(fp);

    return 0;
}