#include
#include
#include
#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;