学生成绩管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_STUDENTS 100
#define MAX_SUBJECTS 10
#define MAX_FILENAME 100

// 定义全局变量
struct student {
    char num[20];
    char name[20];
    float scores[MAX_SUBJECTS];
    float sum;
    float avg;
};
struct student students[MAX_STUDENTS];
int n = 0;  // 学生数目
int m = 0;  // 科目数目
char subjects[MAX_SUBJECTS][20];
char filename[MAX_FILENAME] = "students.txt";  // 保存学生成绩数据的文件名

// 声明函数
void show_menu();
void add_record();
void list_record();
void del_record();
void modify_record();
void sort_by_sum(bool reverse);
void sort_by_num(bool reverse);
void search_record();
void write_to_file();
void read_from_file();
bool check_num(char *num);

// 主函数
int main()
{
    // 初始化科目列表和学生数组
    printf("请输入学生的数量: ");
    scanf("%d", &n);
    printf("请输入学科的数量: ");
    scanf("%d", &m);
    printf("请输入学科的名称:\n");
    for (int i = 0; i < m; i++) {
        scanf("%s", subjects[i]);
    }
    for(int j=0;j<n;j++){
    	printf("请输入学生学号: ");
    	scanf("%s", students[j].num);
    printf("请输入学生姓名: ");
    scanf("%s", students[j].name);
    printf("请输入各科成绩:\n");
    float sum = 0.0;
    for (int i = 0; i < m; i++) {
        printf("%s: ", subjects[i]);
        scanf("%f", &students[j].scores[i]);
        sum += students[j].scores[i];
    }
    students[j].sum = sum;
    students[j].avg = sum / m;
    printf("学生成绩录入成功!\n");
	} 
    // 进入菜单循环
    char choice[10];
    while (true) {
        show_menu();
        printf("请输入您要进行的操作: ");
        scanf("%s", choice);
        if (strcmp(choice, "1") == 0) {
            add_record();
        } else if (strcmp(choice, "2") == 0) {
            list_record();
        } else if (strcmp(choice, "3") == 0) {
            del_record();
        } else if (strcmp(choice, "4") == 0) {
            modify_record();
        } else if (strcmp(choice, "5") == 0) {
            search_record();
        } else if (strcmp(choice, "6") == 0) {
            sort_by_sum(true);
        } else if (strcmp(choice, "7") == 0) {
            sort_by_sum(false);
        } else if (strcmp(choice, "8") == 0) {
            sort_by_num(true);
        } else if (strcmp(choice, "9") == 0) {
            sort_by_num(false);
        } else if (strcmp(choice, "W") == 0 || strcmp(choice, "w") == 0) {
            write_to_file();
        } else if (strcmp(choice, "R") == 0 || strcmp(choice, "r") == 0) {
            read_from_file();
        } else if (strcmp(choice, "0") == 0) {
            break;
        } else {
            printf("输入的数据无效,请重新输入!\n");
        }
        printf("Press Enter to continue...\n");
        getchar();
        getchar();
    }
    return 0;
}

// 定义函数:显示菜单
void show_menu()
{
    printf("\nManagement for Students' scores\n\n");
    printf("1. Append record\n");
    printf("2. List record\n");
    printf("3. Delete record\n");
    printf("4. Modify record\n");
    printf("5. Search record\n");
    printf("6. Sort in descending order by sum\n");
    printf("7. Sort in ascending order by sum\n");
    printf("8. Sort in descending order by num\n");
    printf("9. Sort in ascending order by num\n");
    printf("W. Write to a File\n");
    printf("R. Read from a File\n");
    printf("0.Exit\n");
}

// 定义函数:新增学生信息
void add_record()
{
    while (true) {
        printf("请输入学生学号: ");
        scanf("%s", students[n].num);
        if (check_num(students[n].num)) {
            bool exists = false;
            for (int i = 0; i < n; i++) {
                if (strcmp(students[i].num, students[n].num) == 0) {
                    printf("该学号已存在,请重新输入!\n");
                    exists = true;
                    break;
                }
            }
            if (!exists) {
                break;
            }
       } else {
            printf("输入的学号无效,请重新输入!\n");
        }
    }
    printf("请输入学生姓名: ");
    scanf("%s", students[n].name);
    printf("请输入各科成绩:\n");
    float sum = 0.0;
    for (int i = 0; i < m; i++) {
        printf("%s: ", subjects[i]);
        scanf("%f", &students[n].scores[i]);
        sum += students[n].scores[i];
    }
    students[n].sum = sum;
    students[n].avg = sum / m;
    printf("学生成绩录入成功!\n");
    n++;
}

// 定义函数:显示学生信息
void list_record()
{
    printf("学号\t姓名");
    for (int i = 0; i < m; i++) {
        printf("\t%s", subjects[i]);
    }
    printf("\t总分\t平均分\n");
    for (int i = 0; i < n; i++) {
        printf("%s\t%s", students[i].num, students[i].name);
        for (int j = 0; j < m; j++) {
            printf("\t%.1f", students[i].scores[j]);
        }
        printf("\t%.1f\t%.1f\n", students[i].sum, students[i].avg);
    }
}

// 定义函数:删除学生信息
void del_record()
{
    char num[20];
    printf("请输入要删除的学生的学号: ");
    scanf("%s", num);
    bool found = false;
    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].num, num) == 0) {
            found = true;
            for (int j = i; j < n - 1; j++) {
                students[j] = students[j+1];
            }
            n--;
            printf("学生成绩已删除!\n");
            break;
        }
    }
    if (!found) {
        printf("该生信息不存在!\n");
    }
}

// 定义函数:修改学生信息
void modify_record()
{
    char num[20];
    printf("请输入要修改的学生的学号: ");
    scanf("%s", num);
    bool found = false;
    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].num, num) == 0) {
            found = true;
            printf("请输入新的学生姓名: ");
            scanf("%s", students[i].name);
            printf("请输入新的各科成绩:\n");
            float sum = 0.0;
            for (int j = 0; j < m; j++) {
                printf("%s: ", subjects[j]);
                scanf("%f", &students[i].scores[j]);
                sum += students[i].scores[j];
            }
            students[i].sum = sum;
            students[i].avg = sum / m;
            printf("信息修改成功.\n");
            break;
        }
    }
    if (!found) {
        printf("该生信息不存在.\n");
    }
}

// 定义函数:按总分排序(为了减少函数量,将正序和倒序在一个函数中实现) 
void sort_by_sum(bool reverse)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if ((students[j].sum < students[j+1].sum && !reverse) || (students[j].sum > students[j+1].sum && reverse)) {
                struct student temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
    printf("已成功按总分排列!\n");
}

// 定义函数:按学号排序(为了减少函数量,将正序和倒序在一个函数中实现) 
void sort_by_num(bool reverse)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if ((strcmp(students[j].num, students[j+1].num) > 0 && !reverse) || (strcmp(students[j].num, students[j+1].num) < 0 && reverse)) {
                struct student temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
    printf("已成功按学号排列!\n");
}

// 定义函数:查询学生信息
void search_record()
{
    char num[20];
    printf("请输入要查询的学生学号: ");
    scanf("%s", num);
    bool found = false;
    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].num, num) == 0) {
            found = true;
            printf("学号\t姓名");
            for (int j = 0; j < m; j++) {
                printf("\t%s", subjects[j]);
            }
            printf("\t总分\t平均分\n");
            printf("%s\t%s", students[i].num, students[i].name);
            for (int j = 0; j < m; j++) {
                printf("\t%.1f", students[i].scores[j]);
            }
            printf("\t%.1f\t%.1f\n", students[i].sum, students[i].avg);
            break;
        }
    }
    if (!found) {
        printf("该生信息不存在.\n");
    }
}

// 定义函数:将学生成绩数据保存到文件中
void write_to_file()
{
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
        printf("文件打开失败.\n");
        return;
    }
    fprintf(fp, "%d %d\n", n, m);
    for (int i = 0; i < m; i++) {
        fprintf(fp, "%s\n", subjects[i]);
    }
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%s %s", students[i].num, students[i].name);
        for (int j = 0; j < m; j++) {
            fprintf(fp, " %.1f", students[i].scores[j]);
        }
        fprintf(fp, " %.1f %.1f\n", students[i].sum, students[i].avg);
    }
    fclose(fp);
    printf("信息已被成功写入文件!\n");
}

// 定义函数:从文件中读取学生成绩数据
void read_from_file()
{
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("文件打开失败!\n");
        return;
    }
    fscanf(fp, "%d %d", &n, &m);
    for (int i = 0; i < m; i++) {
        fscanf(fp, "%s", subjects[i]);
    }
    for (int i = 0; i < n; i++) {
        fscanf(fp, "%s %s", students[i].num, students[i].name);
        float sum = 0.0;
        for (int j = 0; j < m; j++) {
            fscanf(fp, "%f", &students[i].scores[j]);
            sum += students[i].scores[j];
        }
        students[i].sum = sum;
        students[i].avg = sum / m;
    }
    fclose(fp);
    printf("成功从文件中读取信息!\n");
}

// 定义函数:检查学生学号是否合法
bool check_num(char *num)
{
    if (strlen(num) == 0 || strlen(num) > 20) {
        return false;
    }
    for (int i = 0; i < strlen(num); i++) {
        if (!isdigit(num[i]) && !isalpha(num[i])) {
            return false;
        }
    }
    return true;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值