#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define?max?100??//数组定义统一大小
int?g?=?0;? ? ? ? ? ? ? ? ? ? //全局变量,为登录时输入密码次数
int?student_number?=?5;??//全局变量,student_number为学生的人数
? struct?user??????//定义一个结构体,存储用户登录账号和密码,并初始化五个管理员的信息
{
?char?username[20];
?char?password[20];
}user[5]?=?{
?{"蒋超",?"1450824311"},
?{"李佳树",?"2041775273"},
?{"刘英杰",?"395636706"},
?{"胡友亮",?"924056026"},
?{"黄家杨",?"2946644844"}
};
struct?student??//定义结构体,包含学生信息,并初始化五个学生的信息?
{
?char?name[max];??//姓名
?char?num[max];??//学号
?char?sex[max];??//性别
?int?chinese;??//语文成绩
?int?mathematic;??//数学成绩
?int?english;??//英语成绩
?int?computer;??//计算机成绩
}s[5]?=?{
?{??"蒋超",?"00001",?"boy",?80,90,80,90},
?{??"李佳树",?"00002",?"boy",?60,80,90,50},
?{??"黄家杨",?"00003",?"girl",?85,65,75,90},
?{??"胡友亮",?"00004",?"boy",?55,65,75,80},
?{??"刘英杰",?"00005",?"girl",?90,95,98,99}
};
struct?student*?p;??//定义一个结构体指针
//主菜单函数声明
void?login();????//登入函数
void?main_menu();????//主界面函数
void?input_record();????//输入学生成绩处理???1
void?show_record();????//显示学生成绩处理???2???
void?search_record();????//查询学生成绩处理???3
void?change_record();????//更新学生成绩处理???4
void?delete_record();????//删除学生信息???5
void?calc_record();????//计算成绩处理???6
void?save_record();????//保存处理???7
void?exit_record();????//退出???8
//查询子函数声明
void?search_by_num();????//学号查询
void?search_by_name();???//姓名查询
void?search_by_sex();????//性别查询
void?search_by_exit();???//返回上一级
//计算子函数声明
void?calc_sum();?????//计算总成绩
void?calc_ave();?????//计算平均成绩
void?calc_eixt();?????//返回上一级
//自定义函数
void?print_table();???//表头
void?print_table_sum();??//总成绩表格
void?print_table_ave();??//平均分表格
void?read();????????//将文件中的数据读入到结构体数组中
//微信搜索公众号:C语言中文社区,关注获取200G编程资料。
int?main()????????//*主函数
{
?login();??//首先进行管理员登录
?main_menu();??//登录成功后显示主界面
?return?0;
}
void?login()????//登录函数,管理员使用该系统前需进行登录,定义密码只允许输错三次?
{
?int?i;
?char?id[20],?password[20];
?printf("****登录界面****\n");
?printf("请输入账号名:");
?scanf("%s",?id);
?printf("请输入密码:");
?scanf("%s",?password);
?for?(i?=?0;?i?<?5;?i++)??//遍历五个管理员的信息,如果输入的信息在初始化的信息中存在则登录成功
?{
??if?(strcmp(id,?user[i].username)?==?0?&&?strcmp(password,?user[i].password)?==?0)
??{
???printf("登录成功!\n");
???system("cls");??//清屏函数
???main_menu();???//登录成功,打印主界面
???break;
??}
?}
?if?(i?==?5)?????//遍历完一轮管理员信息,此时i=5且未找到符合的管理员信息,说明账号密码输入错误
?{
??system("cls");
??printf("登录失败!\n\n");
??g++;?//有三次登录机会,每次登录都遍历一次user结构体
??if?(g?>=?3)??//若三次机会都用完,则退出系统
??{
???printf("你已经输错三次,将自动退出系统\n");
???exit(1);
??}
??else
??{
???login();?//否则,登陆成功,进入主界面
??}
?}
}
void?main_menu()????//展示主菜单,并对用户的请求做出对应响应?
{
?read();????//将文件中的学生信息读取到链表中
?system("cls");??//清屏函数
?int?x;
?//主菜单
?printf("*************************************************\n");
?printf("*\t欢迎使用高校学生成绩管理系统V2.0\t*\n");
?printf("*************************************************\n");
?printf("*\t\t1.输入学生信息\t\t\t*\n");
?printf("*\t\t2.显示学生信息\t\t\t*\n");
?printf("*\t\t3.查询学生信息\t\t\t*\n");
?printf("*\t\t4.更新学生信息\t\t\t*\n");
?printf("*\t\t5.删除学生信息\t\t\t*\n");
?printf("*\t\t6.计算学生成绩\t\t\t*\n");
?printf("*\t\t7.保存\t\t\t\t*\n");
?printf("*\t\t8.退出系统\t\t\t*\n");
?printf("*************************************************\n");
?printf("请输入你要执行的操作:");
?scanf("%d",?&x);
?if?(x?==?1)
??input_record();???//输入信息?
?if?(x?==?2)
??show_record();???//显示信息?
?if?(x?==?3)
??search_record();??//查询信息?
?if?(x?==?4)
??change_record();???//更新信息?
?if?(x?==?5)
??delete_record();???//删除信息?
?if?(x?==?6)
??calc_record();???//计算成绩?
?if?(x?==?7)
??save_record();???//保存
?if?(x?==?8)
??exit_record();???//退出
?else
?{
??printf("输入错误,即将重新进入主界面\n");
??main_menu();
?}
}
void?input_record()??//输入学生成绩函数????1
{
?//定义两个char类型变量来获取用户的输入?
?char?v,?z;
?//在开头位置做一个标记
?aa:
??{
??system("cls");??//清屏函数
??printf("请输入学生姓名:");
??scanf("%s",?s[student_number].name);
??printf("请输入学生学号(五位):");
??scanf("%s",?s[student_number].num);
??printf("请输入学生性别(boy/girl):");
??scanf("%s",?s[student_number].sex);
??printf("请输入学生语文成绩:");
??scanf("%d",?&s[student_number].chinese);
??printf("请输入学生数学成绩:");
??scanf("%d",?&s[student_number].mathematic);
??printf("请输入学生英语成绩:");
??scanf("%d",?&s[student_number].english);
??printf("请输入学生计算机成绩:");
??scanf("%d",?&s[student_number].computer);
??printf("请选择是否保存(y或n):");
??scanf("%s",?&z);
??if?(z?==?'y')??//若输入为y,则保存信息到文件中
??{
???student_number++;
???save_record();
??}
??printf("是否继续添加,请选择(y或n)(否会回到主界面):");
??scanf("%s",?&v);
??if?(v?==?'y')??//若输入为y,则跳转至开头标记aa处
??{
???goto?aa;
??}
??else
??{
???main_menu();
??}
?}
}
void?show_record()??//显示学生信息函数????2???
{
?system("cls");??//清屏函数
?int?i,?k,?x;
?char?get;
?x?=?student_number;
?print_table();??//打印表头?
?for?(i?=?0;?i?<?x;?i++)?//打印表格数据?
?{
??printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
?}
?printf("\n1.返回主界面\n2.返回上一级\n");
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
?{
??main_menu();
?}
?else?if?(k?==?2)
?{
??main_menu();
?}
}
void?search_record()???//查询学生成绩函数????3
{
?system("cls");??//清屏函数
?int?x;
?//打印菜单
?printf("1?按学号查询\n");
?printf("2?按姓名查询\n");
?printf("3?按性别查询\n");
?printf("4?返回上一级\n");
?printf("请输入:");
?scanf("%d",?&x);
?if?(x?==?1)
??search_by_num();?//按学号查询函数?
?if?(x?==?2)
??search_by_name();?//按姓名查询函数?
?if?(x?==?3)
??search_by_sex();?//按性别查询查询?
?if?(x?==?4)
??search_by_exit();?//返回主界面
?else
?{
??printf("输入错误\n");
??search_record();??//重新查询
?}
}
void?print_table()?????//打印学生信息表格的表头函数?
{
?printf("+----------+----------+----------+------+------+------+------+\n");
?printf("|???姓名???|???学号???|???性别???|?语文?|?数学?|?英语?|计算机|\n");
?printf("+----------+----------+----------+------+------+------+------+\n");
}
void?search_by_num()????//查询学生信息函数的子函数——按学号查询函数?
{
?int?i,?k;
?char?num1[max];??//用户输入学生学号
?system("cls");??//清屏函数
?printf("请输入要查找的学号:");
?scanf("%s",?num1);
?for?(i?=?0;?i?<?student_number;?i++)??//遍历链表,寻找是该学号是否存在
?{
??if?(strcmp(num1,?s[i].num)?==?0)
??{
???print_table();
???printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
???break;
??}
?}
?if?(i?==?student_number)??//student_number为全局变量学生的人数
?{
??printf("不存在这个学号!\n\n");
?}
?printf("1.返回主界面\n2.继续查询\n");
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
?{
??main_menu();
?}
?else
?{
??search_record();
?}
}
void?search_by_name()????//询学生信息函数的子函数——按姓名查询函数?
{
?int?i,?k;
?char?name1[max];?//用户输入学生姓名
?system("cls");??//清屏函数
?printf("请输入查找的姓名:");
?scanf("%s",?name1);
?for?(i?=?0;?i?<?student_number;?i++)??//遍历链表,看该名字是否存在
?{
??if?(strcmp(name1,?s[i].name)?==?0)
??{
???print_table();
???printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
???break;
??}
?}
?if?(i?==?student_number)?
?{
??printf("不存在这个姓名\n");
?}
?
?printf("1.返回主界面\n2.继续查询\n");
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
?{
??main_menu();
?}
?else
?{
??search_record();
?}
}
void?search_by_sex()????//询学生信息函数的子函数——按性别查询函数?
{
?int?i,?k;
?char?sex1[max];??//用户输入学生的性别
?system("cls");??//清屏函数
?printf("请输入查找的性别(boy/girl):");
?scanf("%s",?sex1);
?print_table();???//表格
?for?(i?=?0;?i?<?student_number;?i++)??//遍历链表,看该性别是否存在
?{
??if?(strcmp(sex1,?s[i].sex)?==?0)
???printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
?}
?if?(i?==?student_number)
?{
??printf("1.返回主界面\n2.继续查询\n");
?}
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
?{
??main_menu();
?}
?else
?{
??search_record();
?}
}
void?search_by_exit()????//返回上一级(返回主菜单)的函数?
{
?main_menu();
}
void?change_record()????//更新学生成绩函数????4
{
?//输入学生学号修改学生信息并保持
?system("cls");??//清屏函数
?int?i;
?char?name2[max],?sex2[max];
?int?chinese2,?mathematic2,?english2,?computer2;
?char?numbefor[max];
?printf("请输入要修改的学生的学号:");?????//用户输入学生学号
?scanf("%s",?numbefor);
?for?(i?=?0;?i?<?student_number;?i++)??//遍历链表,看该学号是否存在
?{
??if?(strcmp(numbefor,?s[i].num)?==?0)?//存在
??{
???printf("修改前:\n");
???print_table();??//打印表格
???printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
???printf("请分别输入修改后信息\n");
???printf("请输入学生姓名:");
???scanf("%s",?name2);
???printf("请输入学生性别:");
???scanf("%s",?sex2);
???printf("请输入学生语文成绩:");
???scanf("%d",?&chinese2);
???printf("请输入学生数学成绩:");
???scanf("%d",?&mathematic2);
???printf("请输入学生英语成绩:");
???scanf("%d",?&english2);
???printf("请输入学生计算机成绩:");
???scanf("%d",?&computer2);
???printf("请选择是否保存(y或n):");
???getchar();
???if?(getchar()?==?'y')??//修改学生信息
???{
????strcpy(s[i].name,?name2);
????strcpy(s[i].sex,?sex2);
????s[i].chinese?=?chinese2;
????s[i].mathematic?=?mathematic2;
????s[i].english?=?english2;
????s[i].computer?=?computer2;
????save_record();??//保存学生信息到文件中
????printf("修改后:\n");
????printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
????printf("\n");
???}
???break;
??}
?}
?if?(i?==?student_number)
?{
??printf("很抱歉!没有这位学生\n");
?}
?printf("是否继续修改,请选择(y/n):");
?getchar();
?if?(getchar()?==?'y')
?{
??change_record();??//继续修改
?}
?else
?{
??main_menu();??//返回主界面
?}
}
void?delete_record()????//删除学生信息函数????5
{
?//输入学生学号删除学生信息并保存?
?system("cls");
?char?num4[max];
?char?a;
?int?v;
?printf("请输入要删学生的学号:\n");
?scanf("%s",?num4);
?int?i,?j;
?for?(i?=?0;?i?<?student_number;?i++)???//遍历链表,看学号是否存在
?{
??if?(strcmp(num4,?s[i].num)?==?0)??//存在,执行删除操作
??{
???printf("你将要删除该学生信息\n");
???printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer);
???printf("\n");
???printf("y?确认删除\tn?取消\n");
???printf("请输入:");
???scanf("%s",?&a);
???if?(a?==?'y')
???{
????for?(j?=?i;?j?<?student_number;?j++)??//将链表中该节点指向下一节点以实现删除操作
????{
?????strcpy(s[j].num,?s[j?+?1].num);??strcpy(s[j].name,?s[j?+?1].name);??strcpy(s[j].sex,?s[j?+?1].sex);
?????s[j].chinese?=?s[j?+?1].chinese;??s[j].mathematic?=?s[j?+?1].mathematic;??s[j].english?=?s[j?+?1].english;
?????s[j].computer?=?s[j?+?1].computer;
????}
????printf("删除成功!\n");
????student_number--;??//全局变量,student_number-1
????save_record();??//将删除后的信息保存到文件中
???}
???else
???{
????printf("已取消操作\n");
???}
??}
?}
?if?(i?==?student_number)??//该学号不存在
?{
??printf("没有这个学号的学生\n");
?}
?printf("1.继续删除?2.返回主界面\n");
?printf("请输入:");
?scanf("%d",?&v);
?if?(v?==?1)
?{
??delete_record();
?}
?else
?{
??main_menu;
?}
}
void?calc_record()????//计算学生成绩函数????6
{
?//有两个功能,一个是计算总成绩一个是计算平均分?
?system("cls");??//清屏函数
?int?x;
?printf("1?计算总成绩\n");
?printf("2?计算平均分\n");
?printf("3?返回上一级\n");
?printf("请输入:");
?scanf("%d",?&x);
?if?(x?==?1)
??calc_sum();??//计算总成绩
?if?(x?==?2)
??calc_ave();??//计算平均成绩
?if?(x?==?3)
??main_menu();??//返回主界面
?else
?{
??printf("输入错误\n");
??calc_record();?//重新打印该界面
?}
}
void?print_table_sum()????//计算总成绩函数的子函数——打印总成绩表格的表头?
{
?printf("+----------+----------+----------+------+------+------+------+------+\n");
?printf("|???姓名???|???学号???|???性别???|?语文?|?数学?|?英语?|计算机|总成绩|\n");
?printf("+----------+----------+----------+------+------+------+------+------+\n");
}
void?print_table_ave()????//计算平均分函数的子函数——打印平均成绩表格的表头?
{
?printf("+----------+----------+----------+------+------+------+------+------+\n");
?printf("|???姓名???|???学号???|???性别???|?语文?|?数学?|?英语?|计算机|平均分|\n");
?printf("+----------+----------+----------+------+------+------+------+------+\n");
}
void?calc_sum()????//计算学生成绩函数的子函数——计算总成绩函数?
{
?print_table_sum();??//打印表头
?int?i,?k,?sum?=?0;??//sum为学生的总成绩
?int?x?=?student_number;??//student_number为学生人数
?for?(i?=?0;?i?<?x;?i++)
?{
??sum?=?s[i].chinese?+?s[i].mathematic?+?s[i].english?+?s[i].computer;
??printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6d\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer,?sum);
?}
?printf("1?返回上一级\n2?返回主界面\n?");
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
??calc_record();
?if?(k?==?2)
??main_menu();
?else
?{
??printf("输入错误!\n");
??calc_record();
?}
}
void?calc_ave()????//计算学生成绩函数的子函数——计算平均成绩函数?
{
?print_table_ave();??//打印表头
?int?i,?k;
?int?x?=?student_number;??//student_number为学生人数
?float?ave;??//ave为学生平均成绩
?for?(i?=?0;?i?<?x;?i++)
?{
??ave?=?(s[i].chinese?+?s[i].mathematic?+?s[i].english?+?s[i].computer)?*?0.25;
??printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6.2f\n",?s[i].name,?s[i].num,?s[i].sex,?s[i].chinese,?s[i].mathematic,?s[i].english,?s[i].computer,?ave);
??if?(i?==?6)
??{
???break;
??}
?}
?printf("1?返回上一级\n2?返回主界面\n?");
?printf("请输入:");
?scanf("%d",?&k);
?if?(k?==?1)
??calc_record();
?if?(k?==?2)
??main_menu();
?else
?{
??printf("输入错误!\n");
??calc_record();
?}
}
void?calc_eixt()????//返回上一级(返回主菜单)函数?
{
?main_menu();
}
void?save_record()??//保存学生信息函数????7(将结构体数组学生数据写入到文件中)?
{
?FILE*?fp;??//定义一个文件指针
?int?i;
?//若文件打开失败
?if?((fp?=?fopen("student-list",?"wb"))?==?NULL)??//以二进制方式对文件进行读写
?{
??printf("cannot?open?file\n");
??return;
?}
?fwrite(&student_number,?4,?1,?fp);?????//将学生人数写入文件
?for?(i?=?0;?i?<?student_number;?i++)?????//二进制写
?{
??if?(fwrite(&s[i],?sizeof(struct?student),?1,?fp)?!=?1)
??{
???printf("file?write?error\n");?//出错处理
??}
??else
??{
???printf("file?write?sucess\n");?//文件写入成功
??}
?}
?fclose(fp);??//关闭文件指针
}
void?read()?????//将文件中的数据读入到结构体数组中
{
?FILE*?fp;??//定义一个文件指针
?int?i;
?//若文件打开失败
?if?((fp?=?fopen("student-list",?"rb"))?==?NULL)??//以二进制方式读取文件
?{
??printf("cannot?open?file\n");
??return;
?}
?fread(&student_number,?4,?1,?fp);?????//读取学生人数
?for?(i?=?0;?i?<?student_number;?i++)??//二进制写
?{
??if?(fread(&s[i],?sizeof(struct?student),?1,?fp)?!=?1)
??{
???printf("file?read?error\n");?//出错处理
??}
??else
??{
???printf("file?read?sucess\n");?//文件读取成功
??}
?}
?fclose(fp);??//关闭文件指针
}
void?exit_record()???//退出系统函数????8
{
?printf("感谢您的使用,已退出!");
?exit;
?