C语言实现学生测评管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
#define FILE_NAME "students.txt"

struct Student {
    char name[20];
    int id;
    int english_score;
    int math_score;
    int computer_score;
};

int num_students = 0;

// 添加学生信息
void add_student() {
    struct Student student;
    printf("添加学生信息\n");
    printf("姓名:");
    scanf("%s", student.name);
    printf("学号:");
    scanf("%d", &student.id);
    printf("英语成绩:");
    scanf("%d", &student.english_score);
    printf("数学成绩:");
    scanf("%d", &student.math_score);
    printf("计算机成绩:");
    scanf("%d", &student.computer_score);

    FILE* fp = fopen(FILE_NAME, "a"); // 以追加模式打开文件
    fprintf(fp, "%s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score); // 写入数据
    fclose(fp);
    num_students++; // 学生数量加一
    printf("学生信息已添加\n");
}

void modify_student() {
    int target_id;
    printf("修改学生信息\n");
    printf("请输入要修改的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %d %d %d %d", student.name, &student.id, &student.english_score, &student.math_score, &student.computer_score) == 5) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("原信息: %s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score);
            printf("新姓名:");
            scanf("%s", student.name);
            printf("新英语成绩:");
            scanf("%d", &student.english_score);
            printf("新数学成绩:");
            scanf("%d", &student.math_score);
            printf("新计算机成绩:");
            scanf("%d", &student.computer_score);
            printf("修改后: %s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score);
        }
        fprintf(tmp_fp, "%s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score); // 将学生信息写入临时文件
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    } else {
        printf("学生信息已修改\n");
    }
}

void query_student() {
    int target_id;
    printf("查询学生信息\n");
    printf("请输入要查询的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %d %d %d %d", student.name, &student.id, &student.english_score, &student.math_score, &student.computer_score) == 5) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf(" 姓名:%s\n学号: %d\n英语成绩:%d\n数学成绩:%d\n计算机成绩:%d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score);
            break; // 找到目标学生后终止循环
        }
    }

    fclose(fp);

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
}

void delete_student() {
    int target_id;
    printf("删除学生信息\n");
    printf("请输入要删除的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %d %d %d %d", student.name, &student.id, &student.english_score, &student.math_score, &student.computer_score) == 5) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("已删除学生信息:%s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score);
} else {
fprintf(tmp_fp, "%s %d %d %d %d\n", student.name, student.id, student.english_score, student.math_score, student.computer_score); // 将学生信息写入临时文件
}
}

fclose(fp);
fclose(tmp_fp);

remove(FILE_NAME); // 删除原文件
rename("tmp.txt", FILE_NAME); // 将临时文件重命名

if (!found) { // 如果没有找到目标学生
    printf("未找到学生\n");
} else {
    num_students--; // 学生数量减一
    printf("学生信息已删除\n");
}
}

void menu() {
    printf("\n请选择功能\n");
    printf("1. 添加学生信息\n");
    printf("2. 修改学生信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 删除学生信息\n");
    printf("5. 显示所有学生的成绩信息\n");
    printf("0. 退出\n");
}
void compute_score_statistics(struct Student* students, int num_students, int* total_english_score, int* total_math_score, int* total_computer_score, double* avg_english_score, double* avg_math_score, double* avg_computer_score) { *total_english_score = 0; *total_math_score = 0; *total_computer_score = 0; for (int i = 0; i < num_students; i++) {

*total_english_score += students[i].english_score;



*total_math_score += students[i].math_score;
*total_computer_score += students[i].computer_score;
}
*avg_english_score = *total_english_score / num_students;
*avg_math_score = *total_math_score / num_students;
*avg_computer_score = *total_computer_score / num_students;
}


void show_all_scores() {
struct Student students[MAX_STUDENT];

FILE* fp = fopen(FILE_NAME, "r");

int i = 0;
while (fscanf(fp, "%s %d %d %d %d", students[i].name, &students[i].id, &students[i].english_score, &students[i].math_score, &students[i].computer_score) == 5) {
    i++;
}

fclose(fp);

int total_english_score, total_math_score, total_computer_score;
double avg_english_score, avg_math_score, avg_computer_score;
compute_score_statistics(students, i, &total_english_score, &total_math_score, &total_computer_score, &avg_english_score, &avg_math_score, &avg_computer_score);

printf("学号\t姓名\t英语\t数学\t计算机\t总分\n");
for (int j = 0; j < i; j++) {
    int total_score = students[j].english_score + students[j].math_score + students[j].computer_score;
    printf("%d\t%s\t%d\t%d\t%d\t%d\n", students[j].id, students[j].name, students[j].english_score, students[j].math_score, students[j].computer_score, total_score);
}
printf("\t平均分\t%.1lf\t%.1lf\t%.1lf\n", avg_english_score, avg_math_score, avg_computer_score);
}

int main() {
int choice;
do {
printf("\n学生综合测评管理系统\n");
printf("1. 添加学生信息\n");
printf("2. 修改学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 显示所有学生的成绩信息\n");
printf("0. 退出系统\n");
printf("请选择功能:");
scanf("%d", &choice);

    switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            modify_student();
            break;
        case 3:
            query_student();
            break;
        case 4:
            delete_student();
            break;
        case 5:
            show_all_scores();
            break;
        case 0:
            break;
        default:
            printf("无效的选择\n");
            break;
    }
} while (choice != 0);

return 0;}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值