C语言学生成绩管理系统

学员信息管理系统

系统设计概览

学员信息包括

属性变量名
姓名stu_name
学号stu_num
年龄stu_age
课程成绩stu_point
入学年份stu_year
性别stu_gender

函数包括

名称用处
max_point求出成绩最大值
min_point求出成绩最小值
avg_point求出成绩均值
above_avg_num高出均值人数
above_avg_per高出均值比例
stu_init初始化学生系统,如果已有txt文件,则从存储读取信息
read_data通过文件读取学生信息
new_stu_byfile通过文件读取单个学生信息
new_stu_bystdin通过键盘读取单个学生信息
stu_show_all展示所有学员信息
save_to_disk保存到磁盘

具体设计

学生结构体设计

  • 姓名,通过字符串存储
  • 学号,通过字符串存储
  • 年龄,通过整型存储
  • 课程成绩 通过整型存储
  • 入学年份 通过整型存储
  • 性别 通过整型存储。且有如下约定
    • 0对应男性
    • 1对应女性

系统变量说明

  • tot_stu_num为学生数目
  • MAX_SIZE 为最大学生数目
  • 学生信息存储在stuinfo.txt的文件中

系统操作手册

指令名功能
h帮助
n键入新学员信息
s保存所有学员
v展示学员信息
f计算学员信息
r清空所有信息
q退出

函数功能说明

指令全称功能
maxmax point计算最大值
minmin point计算最小值
avgaverage计算均值
aanabove average number高出均值人数
aapabove average percentage高出均值比例
quitquit from function退出函数计算
helphelp获取该帮助

测试代码

  • 编译器:gcc
  • 编译标准:C89
  • 编译指令:gcc -std=c89 Student_manager.c -o StuManager
  • 测试用数据:testdata.txt
测试项目状态
初始化
获取帮助
键入新学员信息
查看所有学员信息
保存到磁盘
清空所有信息
进入函数计算
最高分
最低分
均分
高于均分人数
高于均分比例
函数帮助信息
正常退出函数
正常退出系统
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define MAX_SIZE 30 /*最大学员数目*/
typedef struct      /*存储学员信息的结构体*/
{
    char stu_name[32];                        /*存储姓名*/
    char stu_num[32];                         /*存储学号*/
    int stu_age;                              /*存储年龄*/
    int stu_point;                            /*存储成绩*/
    int stu_year;                             /*存储入学年份*/
    int stu_gender;                           /*存储性别*/
} Student;                                    /*管理学员结构体名字为Student*/
Student student_info[MAX_SIZE];               /*定义学员数组*/
int tot_stu_num;                              /*学员数目*/
void new_stu_byfile(FILE *inputfile, int num) /*通过文件读入新的学员*/
{
    if (num == MAX_SIZE)
    {
        printf("错误发生,学员数量已到达上限");
        return;
    }
    /*通过fscanf从文件中输入学员信息*/
    fscanf(inputfile, "%s%s%d%d%d%d", student_info[num].stu_name, student_info[num].stu_num, &student_info[num].stu_age, &student_info[num].stu_point, &student_info[num].stu_year, &student_info[num].stu_gender); /*读取学员信息*/
    return;
}
void new_stu_bystdin(int num) /*通过键盘读入新的学员*/
{
    if (num == MAX_SIZE)
    {
        printf("错误发生,学员数量已到达上限");
        return;
    }
    /**
     * @brief 通过键盘输入信息
     *
     */
    printf("请输入学员姓名\n");
    scanf("%s", student_info[num].stu_name);
    printf("请输入学员学号\n");
    scanf("%s", student_info[num].stu_num);
    printf("请输入学员年龄\n");
    scanf("%d", &student_info[num].stu_age);
    printf("请输入学员成绩\n");
    scanf("%d", &student_info[num].stu_point);
    printf("请输入学员入学年份\n");
    scanf("%d", &student_info[num].stu_year);
    printf("请输入学员性别。0代表男性,1代表女性\n");
    int flag = 0;
    /**
     * @brief 判断性别输入是否正确
     *
     */
    while (!flag)
    {
        scanf("%d", &student_info[num].stu_gender);
        if (student_info[num].stu_gender == 1 || student_info[num].stu_gender == 0)
            flag = 1;
        else
            printf("性别格式错误,请按照0代表男性,1代表女性进行输入");
    }
    printf("新学员信息已经键入成功!\n");
    tot_stu_num++; /*总人数加1*/
    return;
}
void read_data() /*从磁盘读取信息*/
{
    FILE *stufile = fopen("stuinfo.txt", "r"); /*通过只读方式打开文件*/
    if (stufile == NULL)                       /*之前没有存储信息*/
    {
        tot_stu_num = 0;
        printf("==========\n此前没有存储过学员信息\n==========\n"); /*提示信息*/
    }
    else
    {
        fscanf(stufile, "%d", &tot_stu_num);                     /*读入学员数目*/
        printf("==========\n已存储%d位学员信息\n", tot_stu_num); /*提示信息*/
        int i = 0;                                               /*计数器,统计已读入个数*/
        while (i < tot_stu_num)
        {
            new_stu_byfile(stufile, i++); /*调用函数,通过文件读入单个学员信息*/
        }
        printf("读入完毕\n==========\n"); /*提示信息*/
    }

    fclose(stufile); /*关闭文件*/
}
void stu_init() /*系统初始化函数*/
{
    printf("==========\n系统初始化中\n");          /*提示信息*/
    tot_stu_num = 0;                               /*学员数目清零*/
    memset(student_info, 0, sizeof(student_info)); /*将学员信息清零*/
    read_data();                                   /*读取存储*/
    printf("系统初始化完毕,输入h获得指令帮助\n");
}
/**
 * @brief 系统操作提示函数
 *
 */
void help()
{
    printf("==========\n欢迎使用学员管理系统\n指令如下\n");
    printf("h\thelp\t获取帮助\n");
    printf("s\tsave\t保存学员信息到文件中\n");
    printf("n\tnew\t输入新学员信息\n");
    printf("v\tview\t查看所有学员信息\n");
    printf("f\tfunc\t学员信息函数计算\n");
    printf("r\treset\t清空学员信息\n");
    printf("q\tquit\t退出系统\n");
}
void save_to_disk()
{
    printf("正在将%d名学员信息存储到stuinfo.txt中\n", tot_stu_num);
    int num = 0;                               /*统计总学员数目*/
    FILE *outfile = fopen("stuinfo.txt", "w"); /*打开文件*/
    fprintf(outfile, "%d\n", tot_stu_num);
    while (num < tot_stu_num)
    {
        /*将信息按照顺序输出到文件*/
        fprintf(outfile, "%s\n%s\n%d\n%d\n%d\n%d\n\n", student_info[num].stu_name, student_info[num].stu_num, student_info[num].stu_age, student_info[num].stu_point, student_info[num].stu_year, student_info[num].stu_gender);
        num++;
    }
    fclose(outfile); /*关闭文件指针*/
    printf("信息保存成功!\n");
}
void stu_show_all()
{
    printf("展示%d位学员信息\n", tot_stu_num);
    int num = 0;
    while (num < tot_stu_num)
    {
        /*展示第num个学员的信息*/
        printf("------------\n");
        printf("学员姓名\t%s\n", student_info[num].stu_name);
        printf("学员学号\t%s\n", student_info[num].stu_num);
        printf("学员年龄\t%d\n", student_info[num].stu_age);
        /**
         * @brief 通过if将性别的输出格式化
         *
         */
        printf("学员性别\t");
        if (student_info[num].stu_gender == 0)
        {
            printf("男\n");
        }
        else
            printf("女\n");
        printf("学员成绩\t%d\n", student_info[num].stu_point);
        printf("学员入学年份\t%d\n", student_info[num].stu_year);
        num++;
    }
}
/**
 * @brief 计算最大值
 *
 */
void max_point()
{
    /**
     * @brief 判断特殊情况
     *
     */
    if (tot_stu_num == 0)
    {
        printf("当前有0个学员,无法计算最高分\n");
        return;
    }

    int ans = student_info[0].stu_point; /*ans为临时的最大值*/
    int num = 0;
    while (num < tot_stu_num)
    {
        /*如果当前分数大于临时最高分,更新*/
        if (student_info[num].stu_point > ans)
            ans = student_info[num].stu_point;
        num++;
    }
    printf("最高分是%d\n", ans);
}
void min_point()
{
    /**
     * @brief 判断特殊情况
     *
     */
    if (tot_stu_num == 0)
    {
        printf("当前有0个学员,无法计算最低分\n");
        return;
    }
    int ans = student_info[0].stu_point; /*ans为临时的最小值*/
    int num = 0;
    while (num < tot_stu_num)
    {
        /*如果当前分数小于临时最低分,更新*/
        if (student_info[num].stu_point < ans)
            ans = student_info[num].stu_point;
        num++;
    }
    printf("最低分是%d\n", ans);
}
/**
 * @brief 计算均分的函数
 *
 * @return 如果return -1;计算失败;否则返回均值
 */
double avg()
{
    int num = 0;
    double sum = 0; /*总和*/
    /*特殊情况*/
    if (tot_stu_num == 0)
    {
        printf("当前有0个学员,无法计算均分\n");
        return -1;
    }
    while (num < tot_stu_num)
    {
        sum += student_info[num].stu_point; /*更新总和*/
        num++;
    }
    return sum / tot_stu_num;
}
int aan()
{
    int num = 0;
    int cnt = 0;
    /*特殊情况*/
    if (tot_stu_num == 0)
    {
        printf("当前有0个学员,无法计算该函数\n");
        return -1;
    }
    double aver = avg();
    /**
     * @brief 统计高于均分的人数
     *
     */
    while (num < tot_stu_num)
    {
        if (student_info[num].stu_point > aver)
        {
            cnt++;
        }
        num++;
    }
    return cnt;
}
double aap()
{
    int num = 0;
    /*特殊情况*/
    if (tot_stu_num == 0)
    {
        printf("当前有0个学员,无法计算该函数\n");
        return -1;
    }
    double cnt = aan(); /*统计高于均分人数*/
    double tot = tot_stu_num;
    return cnt / tot_stu_num; /*返回高于均分比例*/
}
/**
 * @brief 函数计算入口
 *
 */
void stu_fun()
{
    printf("学员信息进一步计算中,请输入指令或者help获取帮助\n");
    char function_name[255];

    /**
     * @brief 通过strcmp获取对应的命令
     *
     * 如果strcmp(a,b)==0 说明a和b相等
     */
    while (1)
    {
        printf("-------------\n");
        scanf("%s", function_name); /*输入命令*/
        if (!strcmp("help", function_name))
        {
            printf("max\t计算最大值\nmin\t计算最小值\navg\t计算均值\naan\t高出均值人数\naap\t高出均值比例\nquit\t退出函数计算\nhelp\t获取帮助\n");
            continue;
        }
        if (!strcmp("max", function_name))
        {
            max_point();
            continue;
        }
        if (!strcmp("min", function_name))
        {
            min_point();
            continue;
        }
        if (!strcmp("avg", function_name))
        {
            double average = avg();
            if (average != -1)
                printf("均分为%.2lf\n", average);
            continue;
        }
        if (!strcmp("aan", function_name))
        {
            int aan_ = aan();
            if (aan_ != -1)
                printf("高出均值人数为%d\n", aan_);
            continue;
        }
        if (!strcmp("aap", function_name))
        {
            double per = aap();
            if (per != -1)
                printf("高出均值比例为%.2lf%%\n", per * 100);
            continue;
        }
        if (!strcmp("quit", function_name)) /*退出指令*/
        {
            break;
            continue;
        }
        printf("没有该函数指令,输入help以获得帮助\n"); /*如果没有匹配的指令,提示相关信息*/
    }
}
void reset()
{
    FILE *file = fopen("stuinfo.txt", "w"); /*通过只读方式打开文件,实现截断清零*/
    fclose(file);
    tot_stu_num = 0;                               /*学员数目清零*/
    memset(student_info, 0, sizeof(student_info)); /*学员信息清零*/
    printf("学员信息已经被清零\n");
}
int main()
{
    SetConsoleOutputCP(65001); /*防止中文乱码*/
    stu_init();                /*系统初始化*/
    char order[256];           /*命令字符*/
    while (1)
    {
        printf("==========\n系统运行中\n"); /*提示信息*/
        scanf("%s", &order);                /*输入命令*/
        if (strlen(order) > 1)
        {
            printf("请输入单个字符,输入h以获得帮助\n");
        }
        else
        {
            switch (order[0])
            {
            case 'h': /*帮助信息*/
                help();
                break;
            case 'n': /*新学员*/
                new_stu_bystdin(tot_stu_num);
                break;
            case 's': /*手动保存*/
                save_to_disk();
                break;
            case 'v': /*展示所有学员*/
                stu_show_all();
                break;
            case 'f': /*计算函数*/
                stu_fun();
                break;
            case 'q': /*退出系统*/
                printf("退出系统中,系统正在自动保存\n");
                save_to_disk();
                printf("欢迎下次使用,再见( ̄︶ ̄)↗ \n");
                return 0;
            case 'r':
                reset();
                break;
            default:
                printf("没有该指令,请注意大小写。或者输入h以获得帮助\n");
                break;
            }
        }

        printf("==========\n");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值