一、设计思路
(1)如何登录?通过用户名找到对应对象?
(2)管理员如何对课程、学生、老师进行增删查改?
(3)如何循环输入课程、老师、学生信息?课程有多个上课时间和地点怎么办?
(4)管理员如何查看学生成绩,选课情况?
(5)学生、老师如何进行选、退课?如何判断时间是否冲突?是否选过?
(6)学生选、退课后如何将名单反馈给老师?
(7)课程数据类内,如何储存选了课的学生信息?
(8)老师如何给学生提交平时成绩和考试成绩?并将成绩分别反馈给课程数据和对应学生?
(9)学生如何对自己的成绩进行查询?老师如何查看所授课程的选课学生的成绩?
(10)学生、老师如何查看可选的课程?
(11)学生、老师如何查看自身的选课情况和课程表?
本系统是对课程、老师、信息进行操作,需有课程、老师、学生的数据类。
老师、学生要进行自主选退课等操作,需由老师、学生的操作类。
而管理员可以对课程、老师、学生的基础信息进行增删查改,须有一个管理员操作类。
(1)打开系统,首先是选择是用户还是管理员,管理员直接进入管理操作类;用户登录通过用户名(学号or工号)唯一,可在学生、老师总数据内查找是否存在对应的对象,并判断是老师还是学生,然后进入对应的操作类进行操作,操作完成要对相应修改、添加的信息进行保存。
(2)管理员有所有课程、学生、老师的信息,找到单个对象,通过数据类的函数对数据类进行操作,显示、删除或修改等。
(3)管理员循环输入课程、学生、老师信息,可以通过while实现,对于第一步输入进行判断,-1结束,跳出循环,否则继续输入,最后保存。
(4)学生、老师选、退课,通过输入的课程号及班号到数据库内查询,若存在,通过数据类函数调用判断当前情况与要选的课程是否冲突,冲突输出提示,反之保存课程信息,并将对应老师填上,或者保存学生信息。
(5)课程数据类内可以建一个学生信息的结构体向量,用来保存选了课的学生的基础信息,并将其反馈给老师,可以通过读老师文件时,将课程给老师时,带上这个结构体向量,可以将选课学生名单反馈给老师。
(6)老师要分别输入选课学生的平时成绩和考试成绩(默认3:7),将其保存,并将其保存到课程数据类内的学生结构体内,学生、老师、管理员查成绩时,可以通关函数调用数据计算绩点等。
(7)学生、老师选课是对所有课程进行选择,在老师、学生数据类内,应有一个课程向量来储存所有的课程,选课时全部显示,方便老师、学生进行选课。
(8)课程表可以在数据类内建一个string二维数组,用于储存对应时间上的课程名称,无课时为空。选课时用于判断时间是否冲突。
学生选课系统使用对象有:管理员、所有学生、所有老师。
(1)系统通过用户登录,分别进入对应操作界面,角色有:管理员、老师、学生。
(2)管理员功能:完成对学生、教师、课程基本数据的“增删查改”;对选课结果及学生成绩进行查询(查某个学生、查某个教师教的某门课、某门课程的选课情况及学生成绩)。
学生功能: 查看课程;选、退课;查询个人的选课情况及成绩情况;显示课程表。
老师功能: 查看课程;选、退课;查询个人的选课情况;显示课程表、显示选课学生名单;录入学生成绩并反馈到每个学生选课信息中
二、具体实现
(1)学生结构体:
学号、姓名、班级、平时成绩、考试成绩。
(2)课程数据类:
私有成员:课程号、课程名称、学分、课容量、教学班号、任课老师(初始值-1)、上课时间、地点(多个)、学生结构体向量。
公有成员函数:取、改成员函数;构造函数;整体输入、输出流;
(3)学生数据类:
私有成员:学号、姓名、班级、选课数目、课程向量、平均学分绩点、课程表。
公有成员函数:取、改成员函数;构造函数;整体输入、输出流;
(4)老师数据类:
私有成员:工号、姓名、院系、选课数目、课程向量、课程表。
公有成员函数:取、改成员函数;构造函数;整体输入、输出流;
(5)管理操作类:
私有成员:课程向量、学生向量、老师向量。
公有成员函数:课程、学生、老师的增删查改函数;课程、学生、老师文件的读取、存储;菜单。
(6)老师操作类:
私有成员:一个老师对象;课程向量;
公有成员函数:课程的文件读取、存储;选课;退课;选课结果及选课学生成绩显示;
(7)学生操作类:
私有成员:一个学生对象;课程向量;
公有成员函数:课程的文件读取、存储;选课;退课;选课结果及成绩显示;
(8)登录类:
需要所有学生、老师信息及其文件,与管理信息相同的太多,所以继承了管理类。只需新建一个菜单,进行登录,然后通过输入的用户名进行判断是学生还是老师,继而找到对应对象的操作类,进行选择操作。
2、功能实现过程
(1)循环添加课程(添加老师与学生类似,删除、修改同理):
课程输入流:
istream&operator>>(istream &is,course &d)
{string a,b,c;
float x;
int z,i=0,k=0;
cout<<"请依次输入课程代号、课程名称、学分、课容量、教学班号,输入-1结束"<>a;
if(a=="-1") {d.setno("-1");return is;}
is>>b;
is>>x;
is>>z>>c;
course t(a,b,x,z,c);
while(1)
{cout<<"输入上课时间、地点,输入-1结束"<>t.time[i];
if(t.time[i]==-1) break;
is>>t.where[i];
i++;
}
d=t;
d.n=i;
return is;
}
管理员进行循环输入课程:
void guanli::addcourse()
{
int a;
course z;
while(1)
{system("cls");
cin>>z;
if(z.getno()=="-1") break;
a=searchcourse(z.getno(),z.getbanhao());
if(a!=-1) cout<<"已存在此门课程"<>x1)
{if(x1.getno()=="-1") break;
infile>>m;
x1.setteacher(m);
infile>>n;
for(int i=0;i>m>>z>>l>>x>>y;
x1.addstudent(m,z,l,x,y);
}
c.push_back(x1);
ma.insert(make_pair(x1.getno(),c.size()-1));
}
infile.close();system("cls");
}
存文件
void guanli::save1()
{
int j,k;
ofstream outfile("d:\\20164235-course.tet",ios::out);
if(!outfile) return ;
for(int i=0;i>z;
if(z=="-1") break;
else
{cin>>hao;
if(s.chakecheng(z)!=-1) {cout<<"此门课程已选过"<>ji;
cout<>aa;
if(aa=="-1") break;
cin>>b;
if(t.chakecheng(aa,b)==-1) cout<<"输入有误,请重新输入"<>z;
if(z==-1) break;
else if(z==1)
pschengji(aa,b);
else if(z==2) kschengji(aa,b);
}
}
system("pause");}
}
(6)老师所授课程选课情况及成绩展示:
课程类里展示选课的学生
void course::displaystudent()
{
int i;
cout<<"共有"<>aa;
if(aa=="-1") {break;}
cin>>b;
if(t.chakecheng(aa,b)==-1) {cout<<"输入有误,请重新输入"<
本系统基本实现了管理员对课程、学生、老师信息的增删查改
学生、老师也可以选退课,信息可以及时反馈老师可以为学生评定成绩,学生、老师、管理员均可查看成绩。任老师有选课学生名单,基本上实现了选课系统的基础功能
但是当多个人同时进行选课时,难免会有信息更替导致信息传递有延迟,使得所看信息不是最新的
再者,系统运行时间较长
想法原来挺多的。。但是能想到的都尽力实现了,我存储学生成绩用的是结构体(因为上一次已经把成绩都输好了,改起来太麻烦,就没有改),我感觉老师要的成绩类存储与结构体用法大同小异吧?!而且这个结构体用起来感觉挺方便的。。。
这一次的系统相对于上一次的,我将课程里储存上了对应选课学生信息,使得调用输出时更加方便了,优化了上一次现输出现调用延长程序运行时间的BUG。
另一处改动的地方就是对于成绩,加了平时成绩,后期需要对学生成绩进行运算保存,绩点的运算是读文件时进行函数调用运算保存的,没有直接存在文件里
再就是没有对学生根据绩点进行排名,按照正常的,应该是专业内排名,还需建专业类~~~
选课学生名单也没有进行排序。。因为应该是根据专业内的学号进行排名。。
以上都是可以加班级类、专业类进行改进的、
四、设计体会与小结
- 读文件、写文件问题
一开始并不会文件,然后就根据老师给的莫办自己摸索,再千万次程序非正常停止后,恍然大悟,就是一个输入输出,只不过是文件输入,输出到文件。。。注意输入输出对应就好—。—、
2、老师选课、学生选课后(退课同)要经信息反馈;
特别学生选课后,要将学生名单反馈给老师,一大串的函数调用,各种调,说实话,写的过程整个人都是懵的,完全不知道怎么完成的…
反正就是暴力解决,需要哪里取哪里。再就是通过频繁文件读取,更新实时信息,我的信息并不是都直接存到文件里,很多是读文件时保存的,(例如:读老师信息时,文件里只有课程号与班号,然后对其进行查找,然后再存到老师向量里,感觉这样,信息准确度更高)
3.老师输入成绩,并进行反馈
我的这些信息,都是存到课程数据类的学生结构体内,学生查成绩时现到课程里面查找自己的成绩,然后进行计算,再保存输出、
4.操作类里只有一个对象
本来刚想的时候感觉很繁琐,没有什么思路,后来摸索着尝试,再就是跟别人讨论,发现放到构造函数里进行类的转换操作,也实现了对单个对象进行操作、
(5)登录类问题
我的登录类(名字是caozuo)直接继承了管理类,因为登录类里面需要所有的信息,(学生老师选的课程读文件时现添加,保证信息的准确性)所以方便起见直接继承了。。。不知道安不安全、、、但是在写一遍太繁琐、、所以还是用了继承
PS:写的时候其实遇到挺多麻烦,但大多是因为对系统的不熟悉,写了这一个系统后,感觉其实不难,就是麻烦,各种函数调用。。。写的恶心。。或许也是会者不难,难者不会吧。重要的,还是对系统的功能的分析理解,全面分析好系统的功能,才能完善系统!
2、通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高 |
本次设计系统学习的知识不少,会了类的定义与使用,还学了继承,也应用到了本次系统里,再就是懂得很多代码错误,英语能力或许也有提高,\(^o^)/~
巩固的知识才是真的多!vector、map、迭代器的应用啊;改代码、写代码能力呀;对系统的功能分析能力呀;结构体、类、继承的应用点啊;还有就是平心静气的写代码能力,真的好磨砺人哦(⊙o⊙),课程设计这一个周不必说了、蓝瘦!在宿舍时也是,基本上每次写代码都要连续坐5、6个小时,一气呵成才行,不然再继续的时候,真的有一种想全部删了重写的冲动(因为根本不知道上次改的什么、、而且短时间内改的,很多是错误的。。)
至于提高,那必须是全面提高呀!巩固的知识都是提高,我觉得对自身最有用的就是改代码能力,不仅是改自己的,还帮别人看过几眼,改代码能力真的显著提高!对于写系统会出的错,我也基本都见过了,实在是出过的错比我吃的饭都多╮(╯▽╰)╭。写代码能力也提高不少,后来的几次,刚写的代码错误很少了,基本上都能够实现想要达成的目的。老师上课时讲的对系统的功能分析也使我获益匪浅,虽然我分析功能这一方面还不够优秀,但也是提高不少。
感想嘛。自己就还是个小菜鸟,还要继续努力呀!做系统时(也不仅仅是系统),要思虑全面,对所有对象都考虑周全,再就是不能自以为是,觉得对的,很可能还有BUG对于每个功能进行实际操作一遍,很多时候,程序运行一遍过了之后,还是会有错误、那是没有运行顾及到的。
写代码真的是一个苦差事,写的时候烦的不行,总有一种坚持不下去的感觉。但是写完后,会感觉十分自豪,身心舒畅!现在看看自己的代码,也不知道是怎么完成的。。反正我能想到的功能都实现了~~也不知道这1500行代码是怎么出来的╮(╯▽╰)╭。总之收获很多,结局是美好的,很开心O(∩_∩)O
再就是,我不得不吐槽,这个codeblocks有毒啊!!!有时候写完代码,根本就没再改过,再打开就运行不了了?!。。明明上一次运行时好好的。。有两次交完作业之后又发现自己程序不能运行了。。。慌得不行!!!然而重新打开几次又莫名其妙好了,。。。真的是。。。也是对人心理素质的考验!!!o(>﹏<)o
代码:
#include
#include
#include
#include
#include