大老们,这个怎么写啊

img


本课题要完成一门课程的学生成绩信息统计功能,学生课程course信息至少包含:编号no,学号sno,姓名sname,平时分usual(占总分20%),实验expr分(占总分20%),期末考试分exam(占总分60%),计算总分total和等级grade,信息需要文件保存和读取。基本功能可实现信息的添加和计算、删除、修改、显示和计算。扩展功能包括给不及格学生发通知等。

可以用一个类来实现,结构体也可以

【以下回答由 GPT 生成】

在C语言中实现学生成绩信息统计功能可以通过使用结构体和文件操作来实现。下面是一个具体的解决方案:

第一步:定义学生信息的结构体

typedef struct {
    int no;
    char sno[20];
    char sname[50];
    float usual;
    float expr;
    float exam;
    float total;
    char grade;
} Student;

第二步:实现添加学生信息的功能

Student addStudent() {
    Student student;
    printf("请输入学生编号:");
    scanf("%d", &student.no);
    printf("请输入学生学号:");
    scanf("%s", student.sno);
    printf("请输入学生姓名:");
    scanf("%s", student.sname);
    printf("请输入学生平时成绩:");
    scanf("%f", &student.usual);
    printf("请输入学生实验成绩:");
    scanf("%f", &student.expr);
    printf("请输入学生期末考试成绩:");
    scanf("%f", &student.exam);
    student.total = 0.2 * student.usual + 0.2 * student.expr + 0.6 * student.exam;
    if (student.total >= 90) {
        student.grade = 'A';
    } else if (student.total >= 80) {
        student.grade = 'B';
    } else if (student.total >= 70) {
        student.grade = 'C';
    } else if (student.total >= 60) {
        student.grade = 'D';
    } else {
        student.grade = 'F';
    }
    return student;
}

void saveStudentToFile(Student student) {
    FILE *file = fopen("students.txt", "a");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    fprintf(file, "%d %s %s %.2f %.2f %.2f %.2f %c\n", student.no, student.sno, student.sname, student.usual, student.expr, student.exam, student.total, student.grade);
    fclose(file);
}

void addStudentInfo() {
    printf("请输入要添加的学生信息:\n");
    Student student = addStudent();
    saveStudentToFile(student);
    printf("学生信息添加成功!\n");
}

第三步:实现计算学生信息的功能

void calculateStudentInfo() {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    float sumTotal = 0;
    int count = 0;
    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        Student student;
        sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
        sumTotal += student.total;
        count++;
    }
    if (count > 0) {
        float averageTotal = sumTotal / count;
        printf("所有学生的总分平均值为:%.2f\n", averageTotal);
    }
    fclose(file);
}

第四步:实现显示学生信息的功能

void displayStudentInfo(Student student) {
    printf("编号:%d\n", student.no);
    printf("学号:%s\n", student.sno);
    printf("姓名:%s\n", student.sname);
    printf("平时成绩:%.2f\n", student.usual);
    printf("实验成绩:%.2f\n", student.expr);
    printf("期末考试成绩:%.2f\n", student.exam);
    printf("总分:%.2f\n", student.total);
    printf("等级:%c\n", student.grade);
}

void displayAllStudents() {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        Student student;
        sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
        displayStudentInfo(student);
        printf("-----------------\n");
    }
    fclose(file);
}

第五步:实现删除学生信息的功能

void deleteStudentInfo(int no) {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    FILE *tempFile = fopen("temp.txt", "w");
    if (tempFile == NULL) {
        printf("文件打开错误\n");
        fclose(file);
        return;
    }
    char line[100];
    int isFound = 0;
    while (fgets(line, sizeof(line), file) != NULL) {
        int currentNo;
        sscanf(line, "%d", &currentNo);
        if (currentNo != no) {
            fputs(line, tempFile);
        } else {
            isFound = 1;
        }
    }
    fclose(file);
    fclose(tempFile);
    remove("students.txt");
    rename("temp.txt", "students.txt");
    if (isFound) {
        printf("学生信息删除成功!\n");
    } else {
        printf("未找到对应的学生信息。\n");
    }
}

第六步:实现修改学生信息的功能

void modifyStudentInfo(int no) {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    FILE *tempFile = fopen("temp.txt", "w");
    if (tempFile == NULL) {
        printf("文件打开错误\n");
        fclose(file);
        return;
    }
    char line[100];
    int isFound = 0;
    while (fgets(line, sizeof(line), file) != NULL) {
        int currentNo;
        sscanf(line, "%d", &currentNo);
        if (currentNo != no) {
            fputs(line, tempFile);
        } else {
            Student student = addStudent();
            fprintf(tempFile, "%d %s %s %.2f %.2f %.2f %.2f %c\n", student.no, student.sno, student.sname, student.usual, student.expr, student.exam, student.total, student.grade);
            isFound = 1;
        }
    }
    fclose(file);
    fclose(tempFile);
    remove("students.txt");
    rename("temp.txt", "students.txt");
    if (isFound) {
        printf("学生信息修改成功!\n");
    } else {
        printf("未找到对应的学生信息。\n");
    }
}

第七步:实现给不及格的学生发送通知的功能

void sendNotificationToFailedStudents() {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("文件打开错误\n");
        return;
    }
    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        Student student;
        sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
        if (student.grade == 'F') {
            printf("通知:学号为%s的学生%s不及格,请注意补救!\n", student.sno, student.sname);
        }
    }
    fclose(file);
}

以上就是一个基本的实现学生成绩信息统计功能的解决方案。你可以根据自己的需求来扩展其他功能。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^