学员信息管理系统
系统设计概览
学员信息包括
属性 | 变量名 |
---|
姓名 | 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 | 保存到磁盘 |
具体设计
学生结构体设计
- 姓名,通过字符串存储
- 学号,通过字符串存储
- 年龄,通过整型存储
- 课程成绩 通过整型存储
- 入学年份 通过整型存储
- 性别 通过整型存储。且有如下约定
系统变量说明
- tot_stu_num为学生数目
- MAX_SIZE 为最大学生数目
- 学生信息存储在
stuinfo.txt
的文件中
系统操作手册
指令名 | 功能 |
---|
h | 帮助 |
n | 键入新学员信息 |
s | 保存所有学员 |
v | 展示学员信息 |
f | 计算学员信息 |
r | 清空所有信息 |
q | 退出 |
函数功能说明
指令 | 全称 | 功能 |
---|
max | max point | 计算最大值 |
min | min point | 计算最小值 |
avg | average | 计算均值 |
aan | above average number | 高出均值人数 |
aap | above average percentage | 高出均值比例 |
quit | quit from function | 退出函数计算 |
help | help | 获取该帮助 |
测试代码
- 编译器: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_info[MAX_SIZE];
int tot_stu_num;
void new_stu_byfile(FILE *inputfile, int num)
{
if (num == MAX_SIZE)
{
printf("错误发生,学员数量已到达上限");
return;
}
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;
}
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;
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++;
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");
}
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)
{
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);
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++;
}
}
void max_point()
{
if (tot_stu_num == 0)
{
printf("当前有0个学员,无法计算最高分\n");
return;
}
int ans = student_info[0].stu_point;
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()
{
if (tot_stu_num == 0)
{
printf("当前有0个学员,无法计算最低分\n");
return;
}
int ans = student_info[0].stu_point;
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);
}
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();
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;
}
void stu_fun()
{
printf("学员信息进一步计算中,请输入指令或者help获取帮助\n");
char function_name[255];
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;
}