学生信息管理系统
文章目录
一、实现目标
实现一个简单的学生信息管理系统,要求系统能为客户提供下列各项服务:
1.教学管理人员能够使用这个系统对学生基本信息,课程信息进行管理,包括数据的添加,修改,删除和浏览;
2.能对学生选课进行管理,包括添加学生选课信息。录入成绩;
3.能够使用查询功能,快速查到指定学生或者指定课程的基本信息以及所指定学生的选课信息;
4.能够对学生选课情况进行简单统计,包括所选的总的课程数,总学分数以及平均成绩;
5.要注意添加学生基本信息,课程信息相关数据时,学号和课程号不能重复;还有在添加学生选课信息时,要求该学生和课程必须时存在的,而且不能添加重复的选课信息;
6.提供友好的交互界面,可以方便用户进行功能选择,实现信息的管理和查询,并可清晰地显示相关的信息。
二、实现方式
使用VS的MFC。微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC的使用
MFC的入门教程
三、主要函数
1.结构体
代码如下(示例):
struct student {
char name[30];// 学生姓名
char num[30];//学号
int zy;//专业
int bj;//班级
int math;//数学成绩
int english;//英语成绩
int dl;//专业课导论成绩
int c;//C语言成绩
int ty;//体育成绩
int s;//总分
double ave;//平均分
};
2.开始函数声明
代码如下(示例):
void fileread(struct student stu[M]);//*读取文件函数
void filesave(struct student stu[M]);//*保存文件函数
void input(struct student stu[M]);//****输入数据函数
void output(struct student stu[M]);//***输出函数
void del(struct student stu[M]);//******删除学生信息函数 (1 、2)
void gai(struct student stu[M]);//******改成绩函数
void chakan(struct student stu[M]);//**查询学生成绩信息函数
void name_(struct student stu[M]);//****使用学生姓名删其信息 1
void num_(struct student stu[M]);//*****使用学生学号删其信息 2
void order(struct student stu[M]);//****进行排序函数
int count = 0;//输入学生成绩信息的个数,一开始为零
struct student t;
//这个t是进行order排序时用的
int main()
{
int sum = 0, xuan;//xuan一开始进入界面进行选择 ,
system("mode con: cols=369 lines=3690"); //控制编译器高和宽
struct student stu[M];
//**********代码运行界面*********
printf("\t\t\t\t\t\t 欢迎使用学生成绩管理信息系统\n");
do {
printf("\t\t\t\t\t -------------------------------------------\n");
printf("\t\t\t\t\t\t ***学生成绩信息管理系统***\n");
printf("\t\t\t\t\t\t\t ***************\n");
printf("\t\t\t\t\t\t\t 1、输入学生信息\n");
printf("\t\t\t\t\t\t\t 2、浏览学生信息\n");
printf("\t\t\t\t\t\t\t 3、查看学生信息\n");
printf("\t\t\t\t\t\t\t 4、修改学生成绩\n");
printf("\t\t\t\t\t\t\t 5、删除学生信息\n");
printf("\t\t\t\t\t\t\t 6、学生信息排序\n");
printf("\t\t\t\t\t\t\t 7、读取文件信息\n"); //从文件读取
printf("\t\t\t\t\t\t\t 8、保存到文件\n"); //保存到文件
printf("\t\t\t\t\t\t\t 9、退出系统\n");
printf("\t\t\t\t\t\t\t ***************\n");
printf("\t\t\t\t\t\t\t 请输入你的选择\n");
scanf_s("%d", &xuan); //进行选择功能
fflush(stdin); //清除输入缓冲区
if (xuan > 9 || xuan <= 0)
{
sum++;
if (sum >= 8)
{
printf("输入错误次数过8次,程序将重新开始\n");
//通过限制错误输入,避免进入死胡同
system("pause"); //程序暂停,重新选择
system("cls"); //清屏语句
}
}
switch (xuan) //根据选择,调用不同的函数来完成不同的任务
{
case 1:input(stu); break; //输入
case 2:output(stu); break; //输出
case 3:chakan(stu); break; //查询
case 4:gai(stu); break; //修改
case 5:del(stu); break; //删除
case 6:order(stu); break; //排序
case 7:fileread(stu); break;//读取文件数据
case 8:filesave(stu); break;//保存文件数据
case 9:printf("使用完毕,请关掉程序\n"); system("pause"); break;
default:printf("无效的选择,请重新输入\n"); break;
}
} while (xuan != 9);
printf("本程序结束 over\n");
return 0;
}
3.保存文件函数
代码如下(示例):
void filesave(struct student stu[M])
{
int a = 0;
char b;
FILE* fp;
printf("请确认一边是否已经输入学生信息了:'yes' or 'no'?\n");
scanf_s("%c", &b,1);
fflush(stdin);//清除输入缓冲区
while (b != 'yes' && b != 'no')
{
if (b != 'yes' && b != 'no')
printf("输入错误,重新输入\n");
printf("确定请输入'yes' or 'no'?\n");
scanf_s("%c", &b,1);
fflush(stdin);//清除输入缓冲区
}
if (b == 'yes')
{
errno_t err = fopen_s(&fp, "D:\Stu\stuSys","w");
if (err)
{
printf("文件打开错误,程序无法进行\n");
exit(0);
}
for (a = 0; a < count; a++)
{
fwrite(&stu[a], sizeof(struct student), 1, fp);
}
fclose(fp);
if (count == 0)
printf("无学生成绩信息,不能保存\n");
else
printf("数据已经保存\n");
}
else
return;
}
4.读取文件函数
代码如下(示例):
void fileread(struct student stu[M])
{
int a = 0;
char b;
FILE* fp;
system("cls");//清屏语句
printf("请确认是否已经输入或存有学生信息:'yes'or'no'?\n");
scanf_s("%c", &b,1);
fflush(stdin);//清除输入缓冲区
while (b != 'yes' && b != 'n0')
{
if (b != 'yes' && b != 'no')
printf("输入错误,重新输入\n");
printf("请确认是否已经输入或存有学生信息:'yes'or'no'?\n");
scanf_s("%c", &b,1);
fflush(stdin);//清除输入缓冲区
}
if (b == 'yes')
{
errno_t err = fopen_s(&fp, "D:\Stu\stuSys", "r");
if (err)
{
printf("文件打开错误,程序不能进行\n");
exit(0);
}
fread(&stu[a], sizeof(struct student), 1, fp);
count = 0;
count++;
a++;
while (fread(&stu[a], sizeof(struct student), 1, fp))
{
a++;
count++;
}
fclose(fp);
printf("数据读取完毕!!!\n");
system("cls");//清屏语句
system("pause");//系统重新开始 ,进行选择功能(1~9)
}
else
return;
}
5.输入函数
代码如下(示例):
void input(struct student stu[M])
{
int len;
system("cls");//清屏语句
printf("请添加要输入学生的信息\n");
do {
printf("输入学生学号(12位数)\n");
//do-while循环,输错时,有提示(学号为12个数字)
scanf_s("%s", &stu[count].num,15);
len = strlen(stu[count].num);
} while (len != 12);
printf("输入同学的姓名(字母)\n");
scanf_s("%s", stu[count].name,20);
printf("输入学生的专业代码:1物联网工程 2计算机科学与技术 3软件工程 4大数据 \n");
//采用如此方法解决了专业输入难问题
scanf_s("%d", &stu[count].zy,1);
printf("输入学生班级号码:1、31 2、32 \n");
scanf_s("%d", &stu[count].bj,1);
do {
printf("按顺序输入不大于100的学生各科成绩\n");
printf("数学、英语、专业导论课、C语言、体育\n");
scanf_s("%d%d%d%d%d", &stu[count].math, &stu[count].english, &stu[count].dl, &stu[count].c, &stu[count].ty,15);
} //判断分数值是否超过100 ,若超过则重新输入
while (stu[count].math > 100 || stu[count].english > 100 || stu[count].dl > 100 || stu[count].c > 100 || stu[count].ty > 100);
//求总分
stu[count].s = (stu[count].math + stu[count].english + stu[count].dl + stu[count].c + stu[count].ty);
//求平均值
stu[count].ave = stu[count].s / 5.0;
//输入学生成绩信息的个数
count++;
}
6.输出函数
代码如下(示例):
void output(struct student stu[M])
{
int j;
system("cls");//清屏语句
if (count == 0)
{
printf("目前没有学生信息记录\n");
return;
}
for (j = 0; j < count; j++)
{
//for循环控制输出的个数
for (j = 0; j < count; j++)
{
printf("学号:%s ", stu[j].num);
printf("姓名:%s ", stu[j].name);
if (stu[j].zy == 1)
printf("专业:物联网工程");
else if (stu[j].zy == 2)
printf("专业:计算机科学与技术");
else if (stu[j].zy == 3)
printf("专业:软件工程");
else
printf("专业:大数据");
printf("班级:18221071%d ", stu[j].bj);
printf("数学:%d", stu[j].math);
printf("英语:%d", stu[j].english);
printf("专业课导论:%d", stu[j].dl);
printf("C语言:%d", stu[j].c);
printf("体育:%d", stu[j].ty);
printf("总分:%d", stu[j].s);
printf("平均:%.1lf ", stu[j].ave);
printf("顺序:%d \n", j + 1);
}
}
}
7.查看函数
代码如下(示例):
void chakan(struct student stu[M])
{
int j = 0;
char xh[25];//通过学号查找学生信息
system("cls");
if (count == 0)
{
printf("目前没有学生信息\n");
return;
}
else
{
printf("请输入你想要查看的同学学号(12位数字)\n");
scanf_s("%s", &xh,15);
fflush(stdin);//清除输入缓冲区
for (j = 0; j < count; j++)
{
if (strcmp(stu[j].num, xh) == 0)//判断大小是否相等
{
printf("学号:%s ", stu[j].num);
printf("姓名:%s ", stu[j].name);
if (stu[j].zy == 1)
printf("专业:物联网工程");
else if (stu[j].zy == 2)
printf("专业:计算机科学与技术");
else if (stu[j].zy == 3)
printf("专业:软件工程");
else
printf("专业:大数据:");
printf("班级:18221071%d", stu[j].bj);
printf("数学:%d", stu[j].math);
printf("英语:%d", stu[j].english);
printf("专业课导论:%d", stu[j].dl);
printf("C语言:%d", stu[j].c);
printf("体育:%d", stu[j].ty);
printf("总分:%d", stu[j].s);
printf("平均:%.1lf ", stu[j].ave);
// *******在查看学生个人成绩时,可以看到总分排名*****
int a, b, c = j;
//*****冒泡排序******
for (a = 0; a < count; a++)
{
for (b = a + 1; b < count; b++)
{
if (stu[b].s > stu[a].s)
{
t = stu[b];
stu[b] = stu[a];
stu[a] = t;
}
}
}
int d = 1;
for (a = 0; a < count; a++)
{
if (stu[c].s < stu[a].s)
d++;
else
break;
}
printf("总分排名:%d\n", d);
}
}
if (j == count)//判断是否有学生成绩信息
printf("没有你所查看的学生信息\n");
}
}
8.修改成绩函数
代码如下(示例):
void gai(struct student stu[M])
{
int j, course;
char xh[25];
system("cls");//清屏语句
if (count == 0)//判断是否有学生成绩信息
{
printf("目前没有学生信息\n");
return;
}
else
{
printf("修改的学生学号为:\n");
scanf_s("%s", &xh,12);
fflush(stdin);//清除输入缓冲区
for (j = 0; j < count; j++)
if (strcmp(stu[j].num, xh) == 0)
{
printf("修改学生成绩\n");
printf("选择课程: 1、数学 2、英语 3、专业课导论 4、C语言 5、体育\n");
scanf_s("%d", &course,1);
printf("改为多少分:\n");
//进行修改所选学生的一门的成绩
switch (course)
{
case 1:scanf_s("%d", &stu[j].math,3); break;
case 2:scanf_s("%d", &stu[j].english,3); break;
case 3:scanf_s("%d", &stu[j].dl,3); break;
case 4:scanf_s("%d", &stu[j].c,3); break;
case 5:scanf_s("%d", &stu[j].ty,3); break;
default:printf("请重新输入\n"); break;
}
}
}
}
9.自定义删除函数
代码如下(示例):
void del(struct student stu[M])
{
int choice;
system("cls");//清屏语句
if (count == 0)
{
printf("目前没有学生信息\n");
return;
}
else
{
printf("请选择你所要删除的方式:1、学号 2、姓名 3、取消\n");
scanf_s("%d", &choice,1);
switch (choice)
{
case 3:return; break;
case 2:name_(stu); break;
case 1:num_(stu); break;
default:printf(",输入错误,重新输入\n"); break;
}
}
}
10.排序函数
代码如下(示例):
void order(struct student stu[M])
{
int j, choice, i;
system("cls");//清屏语句
printf("请输入你想要进行排序的方式(所有排序的方式均是降序)!!!\n");
printf("1、数学 2、英语 3、物联网导论 4、C语言 5、体育 6、平均分 7、学号 8、专业序号排名\n");
scanf_s("%d", &choice,1);
//********以下都使用冒泡排序 *****
switch (choice)
{
// 数学排名降序
case 1:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stu[j].math > stu[i].math)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
// 英语排名降序
case 2:for ( i = 0; i < count; i++)
{
for ( j = i + 1; j < count; j++)
{
if (stu[j].english > stu[i].english)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
//专业课导论排名降序
case 3:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stu[j].dl > stu[i].dl)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
//C语言排名降序
case 4:for (i = 0; i < count; i++)
{
for (j =i + 1; j < count; j++)
{
if (stu[j].c > stu[i].c)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
//体育排名降序
case 5:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stu[j].ty > stu[i].ty)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
//平均分(总分)排名降序
case 6:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stu[j].ave > stu[i].ave)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
// 学号排名升序
case 7:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (strcmp(stu[j].num, stu[i].num) < 0)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
// 专业序号排名升序
case 8:for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stu[j].zy < stu[i].zy)
{
t = stu[j];
stu[j] = stu[i];
stu[i] = t;
}
}
}
break;
default:printf("请重新输入\n");
break;
}
}
四、示意图展示