基于c语言-高中生信息管理系统
基于c语言-高中生信息管理系统
一、题目简介
该设计要求学生以学生管理业务为背景,对“学生信息管理系统”软件进行分析和设计。
通过该题目的分析和设计,使学生初步得到软件工程的训练,全面培养软件开发过程中的分析、设计、编码、测试及文档规范书写的能力,得到软件工程的综合训练,提高解决实际问题的能力。
二、设计任务
1、查阅文献资料,一般在5篇以上;
2、针对学生信息管理系统,锻炼学生的分析、设计能力,培养学生对软件文档规范的书写能力;
3、以学生信息管理业务为背景,通过调研、分析现有的管理模式和已有的管理软件,建立系统模型;
4、完成学生信息管理系统的软件可行性分析、项目开发计划、需求规格说明、概要设计和详细设计(结构化设计方法和面向对象设计方法可任选一种);
5、在分析和设计的基础上编码完成一个可演示的版本并进行测试;
6、撰写设计说明书;
三、主要框架
四、系统结构详解
1.全局介绍:
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
//2.成绩管理:对学生的成绩进行管理;
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
//5.返回登录界面
2.库函数与函数定义
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <conio.h>
void Databaseinitialization();
void Loginscreen();
void Interface();
int outmenu();
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement();
void addstudent( );
void restudent( );
void destudent();
void listudent( );
//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement();
void addstuscores();
void resstuscores();
void destuscores();
void listuscores();
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery();
void stuinforinquiry();
void stubainforstatistics();
void gendernum();
void agenum();
void clanum();
void stuperforstatistics();
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings();
void adPerSettings();
void dadababackup();
void resdadatabase();
void indadatabase();
3.结构体数据库与初始变量设置
//学生资料数据
typedef struct Student
{
int id; //编号1,2,3...
char name[15]; //名字
char gender[2]; //性别-男-女
int age; //年龄
char cla[10]; //班级
char phone[15]; //电话
int sco[4]; //成绩--语文,数学,英语,总分
};
//账户数据
typedef struct Account
{
char acc[20]; //账号
char password[20]; //密码
int key; //忘记密码问题答案
int permissions; //权限-0-管理员,1-学生
};
#define n 100 //最大储存数
//全局变量
int logstatus = -1;//登录状况,0-管理员,1-学生
int id = 0;//资料数据库数组[id](0-1-...) id=0-->序号为1的资料,即stu[id].id=1;
int idnum = 0;//资料总人数
int accnum = 0;//账户数据库数组[accnum](0-1-...)
int numbackup = 0;//备份的数目
int Ending = 1; //退出
const char* filename = "d:/code/c/database.txt";//备份文件放置位置
Student stu[n]; //资料数据库
Account acc[n]; //账户数据库
4.主函数-main()
void main() //主程序
{
Databaseinitialization();//数据库初始化
while (Ending)
{
Loginscreen();//用户登录界面
if (Ending)
Interface(); //操作界面
}
}
5.数据库初始化-Databaseinitialization()
//数据库初始化
void Databaseinitialization()
{
accnum = 2;
id = 2;
idnum = 2;
//设置账户第一个账号密码,且权限为管理员
strcpy(acc[0].acc, "0");
strcpy(acc[0].password, "0");
acc[0].permissions = 0;
//设置账户第二个账号密码,且权限为普通用户
strcpy(acc[1].acc, "1");
strcpy(acc[1].password, "1");
acc[1].permissions = 1;
//学生资料初始化
stu[0].id = 1;
strcpy(stu[0].name, "张三");
strcpy(stu[0].gender, "男");
stu[0].age = 21;
strcpy(stu[0].cla, "高三一班");
strcpy(stu[0].phone, "13200000000");
stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;
stu[1].id = 2;
strcpy(stu[1].name, "李四");
strcpy(stu[1].gender, "男");
stu[1].age = 21;
strcpy(stu[1].cla, "高三一班");
strcpy(stu[1].phone, "18000000000");
stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
}
以下介绍界面代码过长,就统一放在总代码里啦.
6.用户登录界面-Loginscreen()
7.操作界面-Interface()
7.1学生信息基本资料管理-Stubainformanagement()
①添加学生基本信息-addstudent()
②修改学生基本信息-restudent()
③删除学生基本信息-destudent()
④查看学生基本信息-listudent()
7.2学生成绩管理-Performancemanagement()
①添加学生成绩-addstuscores()
②修改学生成绩-resstuscores()
③删除学生成绩-destuscores()
④查看学生成绩-listuscores()
7.3统计查询-Statisticalquery()
①学生资料查询-stuinforinquiry()
②学生基本信息统计-stubainforstatistics()
//性别人数比例-gendernum()
//年龄分布-agenum()
//班级人数分布-clanum()
③学生成绩统计–平均分,最高分-stuperforstatistics()
7.4系统设置-SysSettings()
①管理员权限设置-adPerSettings()
②对资料数据库备份-dadababackup()
③恢复上一次的备份-resdadatabase()
④数据库初始化-indadatabase()
7.4返回登录界面-outmenu()
五、总代码
/*
-->高中生信息管理系统
该设计要求学生以学生管理业务为背景,对“学生信息管理系统”软件进行分析和设计。
将学生信息管理系统划分为:学生基本资料管理、成绩管理、统计查询管理、系统设置等。
其中:
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
//2.成绩管理:对学生的成绩进行管理;
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <conio.h>
void Databaseinitialization();
void Loginscreen();
void Interface();
int outmenu();
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement();
void addstudent( );
void restudent( );
void destudent();
void listudent( );
//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement();
void addstuscores();
void resstuscores();
void destuscores();
void listuscores();
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery();
void stuinforinquiry();
void stubainforstatistics();
void gendernum();
void agenum();
void clanum();
void stuperforstatistics();
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings();
void adPerSettings();
void dadababackup();
void resdadatabase();
void indadatabase();
//学生资料数据
typedef struct Student
{
int id; //编号1,2,3...
char name[15]; //名字
char gender[2]; //性别-男-女
int age; //年龄
char cla[10]; //班级
char phone[15]; //电话
int sco[4]; //成绩--语文,数学,英语,总分
};
//账户数据
typedef struct Account
{
char acc[20]; //账号
char password[20]; //密码
int key; //忘记密码问题答案
int permissions; //权限-0-管理员,1-学生
};
#define n 100 //最大储存数
//全局变量
int logstatus = -1;//登录状况,0-管理员,1-学生
int id = 0;//资料数据库数组[id](0-1-...) id=0-->序号为1的资料,即stu[id].id=1;
int idnum = 0;//资料总人数
int accnum = 0;//账户数据库数组[accnum](0-1-...)
int numbackup = 0;//备份的数目
int Ending = 1; //退出
const char* filename = "d:/code/c/database.txt";//备份文件放置位置
Student stu[n]; //资料数据库
Account acc[n]; //账户数据库
void main() //主程序
{
Databaseinitialization();//数据库初始化
while (Ending)
{
Loginscreen();//用户登录界面
if (Ending)
Interface(); //操作界面
}
}
//数据库初始化
void Databaseinitialization()
{
accnum = 2;
id = 2;
idnum = 2;
//设置账户第一个账号密码,且权限为管理员
strcpy(acc[0].acc, "0");
strcpy(acc[0].password, "0");
acc[0].permissions = 0;
//设置账户第二个账号密码,且权限为普通用户
strcpy(acc[1].acc, "1");
strcpy(acc[1].password, "1");
acc[1].permissions = 1;
//学生资料初始化
stu[0].id = 1;
strcpy(stu[0].name, "张三");
strcpy(stu[0].gender, "男");
stu[0].age = 21;
strcpy(stu[0].cla, "高三一班");
strcpy(stu[0].phone, "13200000000");
stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;
stu[1].id = 2;
strcpy(stu[1].name, "李四");
strcpy(stu[1].gender, "男");
stu[1].age = 21;
strcpy(stu[1].cla, "高三一班");
strcpy(stu[1].phone, "18000000000");
stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
}
//用户登录界面
void Loginscreen()
{
int i;
int Loop = 1; //账户登录界面loop
do
{
Loop = 1;
int ch = 0, key;
int login=-1;//登录寻找结果
int useregistration = 0;//用户注册寻找结果
int forpassword = 0;//修改与忘记密码的寻找结果
int loop1 = 111;
char acc1[20] = "";
char password1[20] = "";
printf("----------------学生信息信息管理系统登录界面----------------\n\n");
printf("\t\t1 管 理 员 登 录(可进行信息查看与修改)\n");
printf("\t\t2 学 生 登 录(只能查看不能修改)\n");
printf("\t\t3 用 户 注 册\n");
printf("\t\t4 密 码 修 改\n");
printf("\t\t5 忘 记 密 码\n");
printf("\t\t6 退 出\n");
printf("请选择(1-6):\n");
scanf("%d", &ch);
if (ch > 6 || ch < 1)
{
printf("输入有误,请重新输入\n");
continue;
}
switch (ch)
{
case 1:
//1 管 理 员 登 录(可进行信息查看与修改)
while (loop1)
{
printf("请输入管理员账号(-1返回):\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop1 = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
login = i;//数据库存在该账户
break;
}
}
if (login != -1)
{
printf("请输入管理员账号密码:\n");
scanf("%s", password1);
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
if (!strcmp(acc[i].password, password1))
{
if (acc[i].permissions == 0)
{
logstatus = 0;
printf("管理员登录成功\n");
loop1 = 0;
Loop = 0;
}
else
printf("该账户非管理员\n");
}
else
printf("密码输入有误,请重新输入.\n");
break;
}
}
}
else
printf("资料库没有该用户!!!\n");
}
break;
case 2:
//2 学 生 登 录(只能查看不能修改)
while (loop1)
{
printf("请输入学生账号:\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop1 = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
login = i;//数据库存在该账户
break;
}
}
if (login != -1)
{
printf("请输入学生账号密码:\n");
scanf("%s", password1);
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
if (!strcmp(acc[i].password, password1))
{
logstatus = 1;
printf("学生登录成功\n");
loop1 = 0;
Loop = 0;
}
else
printf("密码输入有误,请重新输入.\n");
}
}
}
else
printf("资料库没有该用户!!!\n");
}
break;
case 3:
//3 用 户 注 册
while (loop1)
{
printf("请输入用户账号(-1返回):\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop1 = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
printf("已经存在该账号,请重新输入!!!\n");
useregistration = 1;
break;
}
else
useregistration = 0;
}
if (!useregistration)
{
printf("请输入账号密码:\n");
scanf("%s", password1);
printf("请输入账号密匙(用于更改密码):\n");
scanf("%d", &key);
strcpy(acc[accnum].acc, acc1);
strcpy(acc[accnum].password, password1);
acc[accnum].key = key;
accnum++;
printf("账户创建完成!!!\n");
}
}
break;
case 4:
//4 密 码 修 改
while (loop1)
{
printf("请输入要修改密码的账户(-1返回):\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop1 = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
forpassword = i;//数据库存在该账户
break;
}
}
if (forpassword)
{
printf("请输入该账号密匙:\n");
scanf("%d", &key);
if (key == acc[forpassword].key)
{
printf("请输入新密码:\n");
scanf("%s", password1);
strcpy(acc[forpassword].password, password1);
printf("密码修改完成!!!\n");
}
else
printf("输入的密匙有误!!!\n");
}
else
printf("未存在该账号,请重新输入!!!\n");
}
break;
case 5:
//5 忘 记 密 码
while (loop1)
{
printf("请输入忘记密码的账户(-1返回):\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop1 = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
forpassword = i;//数据库存在该账户
break;
}
}
if (forpassword)
{
printf("请输入该账号密匙:\n");
scanf("%d", &key);
if (key == acc[forpassword].key)
{
printf("该账户密码为:%s\n", acc[forpassword].password);
}
else
printf("输入的密匙有误!!!\n");
}
else
printf("未存在该账号,请重新输入!!!\n");
}
break;
case 6:
//6 退 出
Loop = 0;
Ending = outmenu();
break;
}
} while (Loop);
}
//操作界面
void Interface()
{
int choice = 0;
int ending = 111, loop = 111;
do
{
printf("----------------学生信息信息管理系统----------------\n\n");
printf("\t\t1 学生信息基本资料管理\n");
printf("\t\t2 成绩管理\n");
printf("\t\t3 统计查询管理\n");
printf("\t\t4 系统设置\n");
printf("\t\t5 返回登录界面\n");
printf("请选择(1-5):\n");
scanf("%d", &choice);
if (choice > 5 || choice < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (choice)
{
case 1:
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
Stubainformanagement();
break;
case 2:
//2.成绩管理:对学生的成绩进行管理;
Performancemanagement();
break;
case 3:
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
Statisticalquery();
break;
case 4:
//4.系统设置:①可以对数据库备份/恢复/初始化,②管理操作员等。
if (!logstatus)
{
SysSettings();
}
else
{
printf("需要管理员权限\n");
}
break;
case 5:
ending = outmenu();
break;
}
} while (ending);
}
//退出菜单--返回0
int outmenu()
{
int loop = 0;
char choice;
printf("\n你确定要退出吗? y/n\n");
do {
getchar(); //跳过回车
scanf("%c", &choice);
if (choice == 'y' || choice == 'n') {
break;
}
printf("\n你的输入有误,请重新输入 y/n ?");
} while (1);
if (choice == 'y')
loop = 0;
else
loop = 1;
return loop;
}
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement()
{
int ch;
int loop = 111;
do
{
printf("----------------学生信息操作选择----------------\n\n");
printf("\t\t1 添 加 学 生 信 息\n");
printf("\t\t2 修 改 学 生 信 息\n");
printf("\t\t3 删 除 学 生 信 息\n");
printf("\t\t4 学 生 信 息 列 表\n");
printf("\t\t5 退 出\n");
printf("请选择(1-5(1-3需要管理员权限)):\n");
scanf("%d", &ch);
if (ch > 5 || ch < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (ch)
{
case 1:
if (!logstatus)
{
addstudent();
id++;
}
else
{
printf("需要管理员权限\n");
}
break;
case 2:
if (!logstatus)
{
restudent();
}
else
{
printf("需要管理员权限\n");
}
break;
case 3:
if (!logstatus)
{
destudent();
}
else
{
printf("需要管理员权限\n");
}
break;
case 4:
listudent();
break;
case 5:
loop = 0;
break;
}
} while (loop);
}
//①添加学生基本信息
void addstudent( )
{
stu[id].id = id + 1;
printf("------------------添加学生信息------------------\n\n");
printf("姓名:\n");
scanf("%s", stu[id].name);
printf("性别:\n");
scanf("%s", stu[id].gender);
printf("年龄:\n");
scanf("%d", &stu[id].age);
printf("班级:\n");
scanf("%s", stu[id].cla);
printf("电话:\n");
scanf("%s", stu[id].phone);
idnum = id + 1;
printf("--------------------添加完成--------------------\n");
}
//②修改学生基本信息
void restudent( )
{
int moid;
while (1)
{
printf("------------------修改学生信息------------------\n\n");
printf("请选择待修改学生编号(-1退出):");
scanf("%d", &moid);
if (moid == -1)
{
return;
}
else if (moid > idnum)
{
printf("输入编号没有学生信息,请重新输入\n");
}
else
{
moid = moid - 1;
//printf("请选择要修改的内容:)\n");
printf("姓名(%s):\n", stu[moid].name);
scanf("%s", stu[moid].name);
printf("性别(%s):\n", stu[moid].gender);
scanf("%s", stu[moid].gender);
printf("年龄(%d):\n", stu[moid].age);
scanf("%d", &stu[moid].age);
printf("班级(%s):\n", stu[moid].cla);
scanf("%s", stu[moid].cla);
printf("电话(%s):\n", stu[moid].phone);
scanf("%s", stu[moid].phone);
printf("--------------------修改成功--------------------\n");
return;
}
}
}
//③删除学生基本信息
void destudent( )
{
int deid;
int i;
char choice;
while (1)
{
printf("------------------删除学生信息------------------\n");
printf("请选择待删除学生信息编号(-1退出):");
scanf("%d", &deid);
if (deid == -1)
{
return ;
}
else if (deid > id)
{
printf("输入编号没有学生信息,请重新输入\n");
continue;
}
else
{
printf("确认是否删除(Y/ N):\n");
getchar(); //跳过回车
scanf("%c", &choice);
if (choice == 'y' || choice == 'Y')
{
deid = deid - 1;
id = id - 1;
idnum = id;
for (i = deid; i < n - 2; i++)
{
stu[i] = stu[i + 1];
stu[i].id--;
}
printf("--------------------删除完成--------------------\n");
return ;
}
else
return ;
}
}
}
//④查看学生基本信息
void listudent( )
{
int i,lenmax;
int len[n];
if (id == 0)
{
printf("表格中尚未有用户数据!\n");
return;
}
else
{
for (i = 0; i < id; i++)
{
len[i]= 10-strlen(stu[i].cla);
}
printf("--------------------用户列表--------------------\n");
printf("编号\t姓名\t性别\t年龄\t班级\t 电话\n");
for (i = 0; i < id; i++)
{
printf("%d\t%s\t%s\t%d\t%s", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla);
for (int j = 0; j < len[i]; j++)
printf(" ");
printf("%s", stu[i].phone);
printf("\n");
}
printf("----------------学生信息列表完成----------------\n\n");
}
}
//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement()
{
int ch;
int loop = 111;
if (idnum == 0)
{
printf("表格中尚未有用户数据!\n");
return;
}
else
{
do
{
printf("----------------学生成绩操作选择----------------\n\n");
printf("\t\t1 添加学生成绩信息\n");
printf("\t\t2 修改学生成绩信息\n");
printf("\t\t3 删除学生成绩信息\n");
printf("\t\t4 学生成绩信息列表\n");
printf("\t\t5 退 出\n");
printf("请选择(1-5(1-3需要管理员权限)):\n");
scanf("%d", &ch);
if (ch > 5 || ch < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (ch)
{
case 1:
if (!logstatus)
{
addstuscores();
}
else
{
printf("需要管理员权限\n");
}
break;
case 2:
if (!logstatus)
{
resstuscores();
}
else
{
printf("需要管理员权限\n");
}
break;
case 3:
if (!logstatus)
{
destuscores();
}
else
{
printf("需要管理员权限\n");
}
break;
case 4:
listuscores();
break;
case 5:
loop = 0;
break;
}
} while (loop);
return;
}
}
//①添加学生成绩
void addstuscores()
{
int addid;
while (1)
{
printf("请输入要添加成绩的学生编号(-1退出):\n");
scanf("%d", &addid);
if (addid == -1)
return;
else if (addid > idnum)
{
printf("输入的学生编号没有对应信息.请重新输入");
}
else
{
printf("---------------------添加学生成绩信息---------------------\n\n");
printf("语文成绩:\n");
scanf("%d", &stu[addid - 1].sco[0]);
printf("数学成绩:\n");
scanf("%d", &stu[addid - 1].sco[1]);
printf("英语成绩:\n");
scanf("%d", &stu[addid - 1].sco[2]);
stu[addid - 1].sco[3] = stu[addid - 1].sco[0] + stu[addid - 1].sco[1] + stu[addid - 1].sco[2];
printf("--------------------添加完成--------------------\n");
return;
}
}
}
//②修改学生成绩
void resstuscores()
{
int moid;
while (1)
{
printf("请输入要修改成绩的学生编号(-1退出):\n");
scanf("%d", &moid);
if (moid == -1)
return;
else if (moid > idnum)
{
printf("输入的学生编号没有对应信息.请重新输入");
}
else
{
printf("----------------修改学生成绩信息----------------\n\n");
printf("语文成绩:\n");
scanf("%d", &stu[moid - 1].sco[0]);
printf("数学成绩:\n");
scanf("%d", &stu[moid - 1].sco[1]);
printf("英语成绩:\n");
scanf("%d", &stu[moid - 1].sco[2]);
stu[moid - 1].sco[3] = stu[moid - 1].sco[0] + stu[moid - 1].sco[1] + stu[moid - 1].sco[2];
printf("--------------------修改完成--------------------\n");
return;
}
}
}
//③删除学生成绩
void destuscores()
{
int deid;
while (1)
{
printf("请输入要删除成绩的学生编号(-1退出):\n");
scanf("%d", &deid);
if (deid == -1)
return;
else if (deid > idnum)
{
printf("输入的学生编号没有对应信息.请重新输入");
}
else
{
printf("----------------删除学生成绩信息----------------\n");
stu[deid - 1].sco[0] = 0;
stu[deid - 1].sco[1] = 0;
stu[deid - 1].sco[2] = 0;
stu[deid - 1].sco[3] = 0;
printf("--------------------删除完成--------------------\n");
return;
}
}
}
//④查看学生成绩
void listuscores()
{
int i;
int len[n];
if (idnum == 0)
{
printf("表格中尚未有用户数据!\n");
return;
}
else
{
for (i = 0; i < id; i++)
{
len[i] = 10 - strlen(stu[i].cla);
}
printf("------------------学生成绩列表------------------\n");
printf("编号\t姓名\t班级\t 语文 数学 英语 总分");
printf("\n");
for (i = 0; i < id; i++)
{
printf("%d\t%s\t%s", stu[i].id, stu[i].name, stu[i].cla);
for (int j = 0; j < len[i]; j++)
printf(" ");
printf("%d %d %d %d", stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
printf("\n");
}
printf("----------------成绩信息列表完成----------------\n\n");
}
}
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery()
{
int ch;
int loop = 111;
if (idnum == 0)
{
printf("表格中尚未有用户数据!\n");
return;
}
else
{
do
{
printf("------------------统计查询操作------------------\n\n");
printf("\t\t1 学 生 资 料 查 询\n");
printf("\t\t2 学 生 基 本 信 息 统 计\n");
printf("\t\t3 学 生 成 绩 统 计\n");
printf("\t\t4 退 出\n");
printf("请选择(1-4):_\n");
scanf("%d", &ch);
if (ch > 4 || ch < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (ch)
{
case 1:
stuinforinquiry();
break;
case 2:
stubainforstatistics();
break;
case 3:
stuperforstatistics();
break;
case 4:
loop = 0;
break;
}
} while (loop);
}
}
//①学生资料查询
void stuinforinquiry()
{
int quid;
int choice;
int loop=111;
while (1)
{
printf("请输入要查询的学生编号(-1退出):\n");
scanf("%d", &quid);
if (quid == -1)
return;
else if (quid > idnum)
{
printf("输入的学生编号没有对应信息.请重新输入");
}
else
{
while (loop)
{
printf("----------------学生信息查看选择----------------\n\n");
printf("\t\t1 全 部\n");
printf("\t\t2 姓 名\n");
printf("\t\t3 性 别\n");
printf("\t\t4 年 龄\n");
printf("\t\t5 班 级\n");
printf("\t\t6 电 话\n");
printf("\t\t7 成 绩\n");
printf("\t\t8 退 出\n");
printf("请选择要查询的学生信息:\n");
scanf("%d", &choice);
if (choice > 8 || choice < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (choice)
{
case 1:
printf("姓名\t性别\t年龄\t班级\t电话\t语文 数学 英语 总分\n");
printf("%s\t%s\t%d\t%s\t%s\t%d %d %d %d\n", stu[quid].name, stu[quid].gender, stu[quid].age, stu[quid].cla, stu[quid].phone, stu[quid].sco[0], stu[quid].sco[1], stu[quid].sco[3], stu[quid].sco[4]);
break;
case 2:
printf("姓名为:%s\n", stu[quid].name);
break;
case 3:
printf("性别为:%s\n", stu[quid].gender);
break;
case 4:
printf("年龄为:%d\n", stu[quid].age);
break;
case 5:
printf("班级为:%s\n", stu[quid].cla);
break;
case 6:
printf("电话为:%s\n", stu[quid].phone);
break;
case 7:
printf("成绩为:语文:%d\n数学:%d\n英语:%d\n总分:%d\n", stu[quid].sco[0], stu[quid].sco[1], stu[quid].sco[2], stu[quid].sco[3]);
break;
case 8:
loop = 0;
break;
}
}
return;
}
}
}
//②学生基本信息统计
void stubainforstatistics()
{
printf("总人数: %d\n",idnum);
//性别人数比例
gendernum();
//年龄分布
agenum();
//班级人数分布
clanum();
}
//性别人数比例
void gendernum()
{
int i;
int mnum=0, femnum=0; //男女人数
double proofmale, prooffemale;//男女比例
for (i = 0; i < idnum; i++)
{
if (!strcmp(stu[i].gender, "男"))
mnum++;
else if (!strcmp(stu[i].gender, "女"))
femnum++;
}
proofmale = mnum * 100 / idnum;
prooffemale = femnum * 100 / idnum;
printf("男生人数:%d 所占比例:%.2f%%\n", mnum, proofmale);
printf("女生人数:%d 所占比例:%.2f%%\n", femnum, prooffemale);
}
//年龄分布
void agenum()
{
int i, j;
typedef struct age
{
int age;
int agenum = 1; //该年龄人数
double ageratio;//该年龄比例
};
int anum = 1;//年龄种类个数
age a[20];
a[0].age = stu[0].age;
for (i = 1; i < idnum; i++)
{
for (j = 0; j < anum; j++)
{
if (stu[i].age == a[j].age) //原有,则对应数目+1
a[j].agenum++;
else
a[anum++].age = stu[i].age;//没有,则添加
}
}
for (i = 0; i < anum; i++)
{
a[i].ageratio = a[i].agenum*100 / idnum;//计算各年龄比例
}
for (i = 0; i < anum; i++)
{
printf("%d岁人数:%d 所占比例:%.2f%%\n", a[i].age, a[i].agenum, a[i].ageratio);
}
}
//班级人数分布
void clanum()
{
int i, j;
typedef struct cla
{
char cla[10];
int clanum = 1; //该班级人数
double claratio;//该班级人数比例
};
int cnum = 1;//班级种类个数
cla c[20];
strcpy(c[0].cla, stu[0].cla);
for (i = 1; i < idnum; i++)
{
for (j = 0; j < cnum; j++)
{
if (!strcmp(stu[j].cla, c[j].cla)) //原有,则对应数目+1,相同-返回0
c[j].clanum++;
else
strcpy(c[cnum++].cla, stu[i].cla);//没有,则添加
}
}
for (i = 0; i < cnum; i++)
{
c[i].claratio = c[i].clanum *100/ idnum;//计算各年龄比例
}
for (i = 0; i < cnum; i++)
{
printf("%s班级人数:%d 所占比例:%.2f%%\n", c[i].cla, c[i].clanum, c[i].claratio);
}
}
//③学生成绩统计--平均分,最高分
void stuperforstatistics()
{
int i, j;
typedef struct score
{
double topoints=0;//总分
double avescore=0;//平均分
double tapscore=0;//最高分
};
score sco[4];//语文-数学-英语-总分
for (i = 0; i < 4; i++)
{
for (j = 0; j < idnum; j++)
{
sco[i].topoints = sco[i].topoints + stu[j].sco[i];//求单个数据总和
}
}
for (i = 0; i < 4; i++)
{
sco[i].avescore = sco[i].topoints / idnum;//求平均分
sco[i].tapscore= stu[0].sco[i];//储存第一个学生成绩,用于求最大值
}
for (i = 0; i < idnum; i++)
{
for (j = 0; j < 4; j++)
{
if (sco[j].tapscore < stu[i].sco[j])
sco[j].tapscore= stu[i].sco[j];//求最高分
}
}
printf("类别 语文 数学 英语 总分\n");
printf("平均分 %.1f %.1f %.1f %.1f\n", sco[0].avescore, sco[1].avescore, sco[2].avescore, sco[3].avescore);
printf("最高分 %.f %.f %.f %.f\n", sco[0].tapscore, sco[1].tapscore, sco[3].tapscore, sco[3].tapscore);
}
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings()
{
int choice;
int ending = 111;
do
{
printf("---------------------系统设置---------------------\n\n");
printf("\t\t1 管理员权限设置\n");
printf("\t\t2 数据库备份\n");
printf("\t\t3 数据库恢复\n");
printf("\t\t4 数据库初始化\n");
printf("\t\t5 退 出\n");
printf("请选择(1-5):\n");
scanf("%d", &choice);
if (choice > 5 || choice < 1)
{
printf("输入有误,请重新输入");
continue;
}
switch (choice)
{
case 1:
//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
adPerSettings();
break;
case 2:
//2 数据库备份
dadababackup();
break;
case 3:
//3 数据库恢复
resdadatabase();
break;
case 4:
//4 数据库初始化
indadatabase();
break;
case 5:
//5 退 出
ending = 0;
break;
}
} while (ending);
}
//①管理员权限设置
void adPerSettings()
{
int i;
int forpassword = 0;
int loop = 111;
char acc1[20];
while (loop)
{
printf("请输入要赋予管理员权限的账户(-1返回):\n");
scanf("%s", acc1);
if (!strcmp(acc1, "-1"))
{
loop = 0; break;
}
for (i = 0; i < accnum; i++)
{
if (!strcmp(acc[i].acc, acc1))
{
forpassword = i;//数据库存在该账户
break;
}
}
if (forpassword)
{
acc[forpassword].permissions = 0;
printf("-------------------------操作完成-------------------------\n");
}
else
printf("未存在该账号,请重新输入!!!\n");
}
}
//②对资料数据库备份
void dadababackup()
{
int i;
//创建一个文件指针
FILE* fp = NULL;
//打开文件/如果不存在则创建
fp = fopen(filename, "w");//清空原数据
if (fp == NULL)
{
puts("打开文件失败!");
exit(0);
}
fputs("", fp);
fclose(fp);
fp = fopen(filename, "a");//追加模式写入
fprintf(fp, "编号\t姓名\t性别\t年龄\t班级\t电话\t\t语文 数学 英语 总分\n");
for (i = 0; i < idnum; i++)
{
fprintf(fp, "%d\t%s\t%s\t%d\t%s\t%s\t%d %d %d %d\n", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla, stu[i].phone, stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
}
numbackup = idnum;
//关闭文件!!!
fclose(fp);
printf("---------------------数据库备份完成--------------------\n");
}
//③恢复上一次的备份
void resdadatabase()
{
int i;
FILE* fp = NULL;
char s[20][20];
//打开文件/如果不存在则创建
fp = fopen(filename, "a+");//追加模式读取
if (fp == NULL)
{
puts("Fali to open file!");
exit(0);
}
///将文件位置指示符移动到指定文件流的开始。
rewind(fp);
//从文件中读取数据,保存到stu
fscanf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t\t%s %s %s %s\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
id = idnum = numbackup;
for (i = 0; i < idnum; i++)
{
fscanf(fp, "%d\t%s\t%s\t%d\t%s\t%s\t%d %d %d %d\n", &stu[i].id, stu[i].name, stu[i].gender, &stu[i].age, stu[i].cla, stu[i].phone, &stu[i].sco[0], &stu[i].sco[1], &stu[i].sco[2], &stu[i].sco[3]);
}
printf("数据恢复为:\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s %s %s %s\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
for (i = 0; i < idnum; i++)
{
printf("%d\t%s\t%s\t%d\t%s\t%s\t%d %d %d %d\n", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla, stu[i].phone, stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
}
fclose(fp);
printf("---------------------数据库恢复完成--------------------\n");
}
//④数据库初始化
void indadatabase()
{
id = 2;
idnum = 2;
stu[0].id = 1;
strcpy(stu[0].name, "陈望明");
strcpy(stu[0].gender, "男");
stu[0].age = 21;
strcpy(stu[0].cla, "高三一班");
strcpy(stu[0].phone, "13288403973");
stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;
stu[1].id = 2;
strcpy(stu[1].name, "扎龙");
strcpy(stu[1].gender, "男");
stu[1].age = 21;
strcpy(stu[1].cla, "高三一班");
strcpy(stu[1].phone, "18070193131");
stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
printf("-------------------数据库初始化成功-------------------\n");
}