一、设计思路
1、设计问题 |
(1)如何登录?通过用户名找到对应对象?
(2)管理员如何对课程、学生、老师进行增删查改?
(3)如何循环输入课程、老师、学生信息?课程有多个上课时间和地点怎么办?
(4)管理员如何查看学生成绩,选课情况?
(5)学生、老师如何进行选、退课?如何判断时间是否冲突?是否选过?
(6)学生选、退课后如何将名单反馈给老师?
(7)课程数据类内,如何储存选了课的学生信息?
(8)老师如何给学生提交平时成绩和考试成绩?并将成绩分别反馈给课程数据和对应学生?
(9)学生如何对自己的成绩进行查询?老师如何查看所授课程的选课学生的成绩?
(10)学生、老师如何查看可选的课程?
(11)学生、老师如何查看自身的选课情况和课程表?
2、解决思路 |
本系统是对课程、老师、信息进行操作,需有课程、老师、学生的数据类。
老师、学生要进行自主选退课等操作,需由老师、学生的操作类。
而管理员可以对课程、老师、学生的基础信息进行增删查改,须有一个管理员操作类。
(1)打开系统,首先是选择是用户还是管理员,管理员直接进入管理操作类;用户登录通过用户名(学号or工号)唯一,可在学生、老师总数据内查找是否存在对应的对象,并判断是老师还是学生,然后进入对应的操作类进行操作,操作完成要对相应修改、添加的信息进行保存。
(2)管理员有所有课程、学生、老师的信息,找到单个对象,通过数据类的函数对数据类进行操作,显示、删除或修改等。
(3)管理员循环输入课程、学生、老师信息,可以通过while实现,对于第一步输入进行判断,-1结束,跳出循环,否则继续输入,最后保存。
(4)学生、老师选、退课,通过输入的课程号及班号到数据库内查询,若存在,通过数据类函数调用判断当前情况与要选的课程是否冲突,冲突输出提示,反之保存课程信息,并将对应老师填上,或者保存学生信息。
(5)课程数据类内可以建一个学生信息的结构体向量,用来保存选了课的学生的基础信息,并将其反馈给老师,可以通过读老师文件时,将课程给老师时,带上这个结构体向量,可以将选课学生名单反馈给老师。
(6)老师要分别输入选课学生的平时成绩和考试成绩(默认3:7),将其保存,并将其保存到课程数据类内的学生结构体内,学生、老师、管理员查成绩时,可以通关函数调用数据计算绩点等。
(7)学生、老师选课是对所有课程进行选择,在老师、学生数据类内,应有一个课程向量来储存所有的课程,选课时全部显示,方便老师、学生进行选课。
(8)课程表可以在数据类内建一个string二维数组,用于储存对应时间上的课程名称,无课时为空。选课时用于判断时间是否冲突。
3、系统功能规划 |
学生选课系统使用对象有:管理员、所有学生、所有老师。
(1)系统通过用户登录,分别进入对应操作界面,角色有:管理员、老师、学生。
(2)管理员功能:完成对学生、教师、课程基本数据的“增删查改”;对选课结果及学生成绩进行查询(查某个学生、查某个教师教的某门课、某门课程的选课情况及学生成绩)。
学生功能: 查看课程;选、退课;查询个人的选课情况及成绩情况;显示课程表。
老师功能: 查看课程;选、退课;查询个人的选课情况;显示课程表、显示选课学生名单;录入学生成绩并反馈到每个学生选课信息中
二、具体实现
1、类设计 |
(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结束"<<endl;
is>>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结束"<<endl;
is>>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<<"已存在此门课程"<<endl;
else {c.push_back(z); cout<<"已添加"<<endl;}
system("pause");
}
paixvc();
}
(2)课程展示(包含所选课程信息/*老师学生的展示类似*/):
课程输出流:
ostream&operator<<(ostream &os,course &d)
{
int i;
cout<<"课程代号\t课程名称\t课程学分\t课堂容量\t教学班号\t任课老师"<<endl;
os<<d.no<<"\t\t"<<d.name<<"\t"<<d.xuefen<<"\t\t"<<d.number<<"\t\t"<<d.banhao<<"\t\t";
if(d.teacher=="-1") cout<<"暂无"<<endl;
else cout<<d.teacher;
cout<<endl;
cout<<"上课时间\t上课地点"<<endl;//应该是文件读入课程信息、、
if(d.n==0) cout<<"暂无"<<endl;
for(i=0;i<d.n;i++)
{
cout<<"周";
os<<d.time[i]/10;
cout<<"第";
os<<d.time[i]%10;
cout<<"节";
os<<"\t"<<d.where[i]<<endl;
}
return os;
}
管理员显示所有课程的信息:
void guanli::displaycourse(int a)
{system("cls");
string ss;
for(int i=0;i<c.size();i++)
{cout<<"-----------------------------------------------"<<endl;
cout<<c[i]<<endl;
if(a)
{
if(c[i].sssn()!=0)
{
c[i].displaystudent();
}}cout<<"-----------------------------------------------"<<endl;
}
}
(3)课程文件读取、存储(学生老师类似)
读文件
void guanli::load1()
{
course x1;
int n;
string m,z,l,a;
float b,x,y;
ifstream infile("d:\\20164235-course.tet",ios::in);
if(!infile) return ;
c.clear();
while(infile>>x1)
{if(x1.getno()=="-1") break;
infile>>m;
x1.setteacher(m);
infile>>n;
for(int i=0;i<n;i++)
{
infile>>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<c.size();i++)
{outfile<<c[i].getno()<<"\t\t"<<c[i].getname()<<"\t\t"<<c[i].getxuefen();
outfile<<"\t\t"<<c[i].getnumber()<<"\t\t"<<c[i].getbanhao()<<"\t\t";
for(k=0;k<c[i].getn();k++)
{
outfile<<c[i].gettime(k)<<"\t"<<c[i].getwhere(k)<<endl;
}
outfile<<"-1"<<endl;
outfile<<c[i].getteacher()<<endl;
outfile<<c[i].sssn()<<endl;
if(c[i].sssn()!=0)
{
for(j=0;j<c[i].sssn();j++)
{outfile<<c[i].getsssnumber(j)<<"\t"<<c[i].getsssname(j)<<"\t"<<c[i].getsssclas(j);
outfile<<"\t"<<c[i].getsssps(j)<<"\t"<<c[i].getsssks(j)<<endl;
}}}
outfile<<"-1"<<endl;
outfile.close();system("cls");
}
(4)学生选课(老师类似,退课同理)
学生选课
void studentcaozuo::addc()
{
string z,hao;
int i,j,t=0;
while(1)
{system("cls");
load1();
displaycourse();
cout<<s<<endl;int l;
cout<<"请输入所选课程的课程号、班号,输入-1结束"<<endl;
cin>>z;
if(z=="-1") break;
else
{cin>>hao;
if(s.chakecheng(z)!=-1) {cout<<"此门课程已选过"<<endl;system("pause");}
else
{system("cls");
for(i=0;i<c.size();i++)
if(c[i].getno()==z&&c[i].getbanhao()==hao) {cout<<c[i]<<endl;break;}
if(i!=c.size()){
if(c[i].sssn()==c[i].getnumber()) cout<<"此门课程已满,请重新选择"<<endl;
else {
for(j=0;j<c[i].getn();j++)
{l=c[i].gettime(j);
if(s.chake(c[i].gettime(j))) {cout<<"时间冲突"<<endl;t=1;break;}}
if(t==0){
c[i].addstudent(s.getnumber(),s.getname(),s.getclas(),0,0);//;
cout<<"已选此课程"<<endl;
s.add(c[i]);save1();//c[i].displaystudent();system("pause");
}}system("pause");
}
else {
cout<<"课程号输入有误,请重新输入,输入-1结束"<<endl;system("pause");}
}
}}
}
(5)老师输入成绩
输入平时成绩(考试成绩类似)
void teachercaozuo::pschengji(string a,string b)
{system("cls");
string k;
int j;
float ji;
for(j=0;j<c.size();j++)
if(c[j].getno()==a&&c[j].getbanhao()==b)
{
cout<<"请对应输入学生平时成绩"<<endl;
cout<<"学号\t\t姓名\t\t平时成绩"<<endl;
for(int i=0;i<c[j].sssn();i++)
{cout<<c[j].getsssnumber(i)<<"\t"<<c[j].getsssname(i)<<"\t\t";
cin>>ji;
cout<<endl;
c[j].tianjiaps(c[j].getsssnumber(i),ji);
t.setpschengji(a,i,ji);
}break;
}
if(j==c.size()) cout<<"输入有误,请重新输入"<<endl;system("pause");
}
老师输入成绩
else if(a==4)
{string aa,b;int z;
while(1)
{system("cls");
cout<<"请输入要填写成绩的课程号和教学班号,输入-1退出"<<endl;
cin>>aa;
if(aa=="-1") break;
cin>>b;
if(t.chakecheng(aa,b)==-1) cout<<"输入有误,请重新输入"<<endl;
else
{while(1)
{cout<<"输入平时成绩按1,输入考试成绩按2,退出按-1"<<endl;
cin>>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<<"共有"<<sss.size()<<"人选了此门课程"<<endl;
if(sss.size()==0) return ;
cout<<"选课学生信息:"<<endl;
cout<<"学生学号\t学生姓名\t所属班级\t平时成绩\t考试成绩\t综合成绩"<<endl;
for(i=0;i<sss.size();i++)
{cout<<sss[i].snumber<<"\t"<<sss[i].sname<<"\t\t"<<sss[i].sclas<<"\t"<<sss[i].ps<<"\t\t"<<sss[i].ks<<"\t\t";
cout<<sss[i].ps*0.3+sss[i].ks*0.7<<endl;
}
cout<<endl;
}
老师类里查找课程
void teacher::displaystudent(string a,string b)
{ ma1=ma.find(a);
if(ma1!=ma.end()&&c[ma[a]].getbanhao()==b)
c[ma[a]].displaystudent();
else cout<<"输入有误,请重新输入"<<endl;
system("pause");
}
老师操作类里输入要查找的课程号及班号,进行查询
else if(a==3)
{string aa,b;
while(1)
{system("cls");
cout<<"请输入课程号和教学班号,输入-1退出"<<endl;
cin>>aa;
if(aa=="-1") {break;}
cin>>b;
if(t.chakecheng(aa,b)==-1) {cout<<"输入有误,请重新输入"<<endl;system("pause");}
else t.displaystudent(aa,b);
}
}
(7)学生查询自己的成绩:
void student::displayall()
{system("cls");
float zong=0,xuefen=0;
int i,j;
cout<<"课程名称\t课程成绩\t课程学分\t课程绩点"<<endl;
for(int i=0;i<c.size();i++)
{
cout<<c[i].getname()<<"\t"<<c[i].getjiji(number)<<"\t\t"<<c[i].getxuefen()<<"\t";
if(c[i].getjiji(number)<60) cout<<"0"<<endl;
else {cout<<(c[i].getjiji(number)/10-5)*c[i].getxuefen()<<endl;
zong+=(c[i].getjiji(number)/10-5)*c[i].getxuefen();}
xuefen+=c[i].getxuefen();
}
setjidian(zong/xuefen);
cout<<"平均学分绩点:\t"<<getjidian()<<endl;system("pause");
}
2、分析运行结果 |
本系统基本实现了管理员对课程、学生、老师信息的增删查改
学生、老师也可以选退课,信息可以及时反馈老师可以为学生评定成绩,学生、老师、管理员均可查看成绩。任老师有选课学生名单,基本上实现了选课系统的基础功能
但是当多个人同时进行选课时,难免会有信息更替导致信息传递有延迟,使得所看信息不是最新的
再者,系统运行时间较长
3、改进想法 |
想法原来挺多的。。但是能想到的都尽力实现了,我存储学生成绩用的是结构体(因为上一次已经把成绩都输好了,改起来太麻烦,就没有改),我感觉老师要的成绩类存储与结构体用法大同小异吧?!而且这个结构体用起来感觉挺方便的。。。
这一次的系统相对于上一次的,我将课程里储存上了对应选课学生信息,使得调用输出时更加方便了,优化了上一次现输出现调用延长程序运行时间的BUG。
另一处改动的地方就是对于成绩,加了平时成绩,后期需要对学生成绩进行运算保存,绩点的运算是读文件时进行函数调用运算保存的,没有直接存在文件里
再就是没有对学生根据绩点进行排名,按照正常的,应该是专业内排名,还需建专业类~~~
选课学生名单也没有进行排序。。因为应该是根据专业内的学号进行排名。。
以上都是可以加班级类、专业类进行改进的、
四、设计体会与小结
1、设计遇到的问题及解决办法 |
- 读文件、写文件问题
一开始并不会文件,然后就根据老师给的莫办自己摸索,再千万次程序非正常停止后,恍然大悟,就是一个输入输出,只不过是文件输入,输出到文件。。。注意输入输出对应就好—。—、
2、老师选课、学生选课后(退课同)要经信息反馈;
特别学生选课后,要将学生名单反馈给老师,一大串的函数调用,各种调,说实话,写的过程整个人都是懵的,完全不知道怎么完成的…
反正就是暴力解决,需要哪里取哪里。再就是通过频繁文件读取,更新实时信息,我的信息并不是都直接存到文件里,很多是读文件时保存的,(例如:读老师信息时,文件里只有课程号与班号,然后对其进行查找,然后再存到老师向量里,感觉这样,信息准确度更高)
3.老师输入成绩,并进行反馈
我的这些信息,都是存到课程数据类的学生结构体内,学生查成绩时现到课程里面查找自己的成绩,然后进行计算,再保存输出、
4.操作类里只有一个对象
本来刚想的时候感觉很繁琐,没有什么思路,后来摸索着尝试,再就是跟别人讨论,发现放到构造函数里进行类的转换操作,也实现了对单个对象进行操作、
(5)登录类问题
我的登录类(名字是caozuo)直接继承了管理类,因为登录类里面需要所有的信息,(学生老师选的课程读文件时现添加,保证信息的准确性)所以方便起见直接继承了。。。不知道安不安全、、、但是在写一遍太繁琐、、所以还是用了继承
PS:写的时候其实遇到挺多麻烦,但大多是因为对系统的不熟悉,写了这一个系统后,感觉其实不难,就是麻烦,各种函数调用。。。写的恶心。。或许也是会者不难,难者不会吧。重要的,还是对系统的功能的分析理解,全面分析好系统的功能,才能完善系统!
2、通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高 |
本次设计系统学习的知识不少,会了类的定义与使用,还学了继承,也应用到了本次系统里,再就是懂得很多代码错误,英语能力或许也有提高,\(^o^)/~
巩固的知识才是真的多!vector、map、迭代器的应用啊;改代码、写代码能力呀;对系统的功能分析能力呀;结构体、类、继承的应用点啊;还有就是平心静气的写代码能力,真的好磨砺人哦(⊙o⊙),课程设计这一个周不必说了、蓝瘦!在宿舍时也是,基本上每次写代码都要连续坐5、6个小时,一气呵成才行,不然再继续的时候,真的有一种想全部删了重写的冲动(因为根本不知道上次改的什么、、而且短时间内改的,很多是错误的。。)
至于提高,那必须是全面提高呀!巩固的知识都是提高,我觉得对自身最有用的就是改代码能力,不仅是改自己的,还帮别人看过几眼,改代码能力真的显著提高!对于写系统会出的错,我也基本都见过了,实在是出过的错比我吃的饭都多╮(╯▽╰)╭。写代码能力也提高不少,后来的几次,刚写的代码错误很少了,基本上都能够实现想要达成的目的。老师上课时讲的对系统的功能分析也使我获益匪浅,虽然我分析功能这一方面还不够优秀,但也是提高不少。
3、有何感想 |
感想嘛。自己就还是个小菜鸟,还要继续努力呀!做系统时(也不仅仅是系统),要思虑全面,对所有对象都考虑周全,再就是不能自以为是,觉得对的,很可能还有BUG对于每个功能进行实际操作一遍,很多时候,程序运行一遍过了之后,还是会有错误、那是没有运行顾及到的。
写代码真的是一个苦差事,写的时候烦的不行,总有一种坚持不下去的感觉。但是写完后,会感觉十分自豪,身心舒畅!现在看看自己的代码,也不知道是怎么完成的。。反正我能想到的功能都实现了~~也不知道这1500行代码是怎么出来的╮(╯▽╰)╭。总之收获很多,结局是美好的,很开心O(∩_∩)O
再就是,我不得不吐槽,这个codeblocks有毒啊!!!有时候写完代码,根本就没再改过,再打开就运行不了了?!。。明明上一次运行时好好的。。有两次交完作业之后又发现自己程序不能运行了。。。慌得不行!!!然而重新打开几次又莫名其妙好了,。。。真的是。。。也是对人心理素质的考验!!!o(>﹏<)o
代码:
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct some
{
string snumber;
string sname;
string sclas;
float ps;
float ks;
};
class course{
vector<some>sss;
map<string,int>ss;//学号与位置
map<string,int>::iterator ss1;
string name,no,banhao,teacher,where[5];
int number,time[5],n;//课容量
float xuefen,chengji;
public:
course(string n,string na,float fen,int x,string z): no(n),name(na),xuefen(fen),number(x),banhao(z){chengji=0;teacher="-1";}
course(){name="-1";no="-1";banhao="-1";teacher="-1";
xuefen=0;number=0;chengji=0;}
string getno(){return no;}
void setno(string n){no=n;}
string getbanhao(){return banhao;}
void setbanhao(string n){banhao=n;}
string getname(){return name;}
void setname(string n){name=n;}
string getteacher(){return teacher;}//任课老师
string getsssnumber(int a){return sss[a].snumber;}//所含学生
string getsssname(int a){return sss[a].sname;}
string getsssclas(int a){return sss[a].sclas;}
float getsssps(int a){return sss[a].ps;}
float getsssks(int a){return sss[a].ks;}
void displaystudent();
int sssn(){return sss.size();}
void addstudent(string a,string b,string c,float x,float y);
void erasestudent(string a);
void setteacher(string n){teacher=n;}
float getxuefen(){return xuefen;}
void setxuefen(float n){xuefen=n;}
int getnumber(){return number;}
void setnumber(int n){number=n;}
float getichengji(string a){return sss[ss[a]].ps*0.3+sss[ss[a]].ks*0.7;}
int getn(){return n;}
void paixv();
void tianjiaps(string a,float b){sss[ss[a]].ps=b;}
void tianjiaks(string a,float b){sss[ss[a]].ks=b;}
float getps(string a) {ss1=ss.find(a); if(ss1!=ss.end()) return sss[ss[a]].ps; else return -1;}
float getks(string a) {ss1=ss.find(a); if(ss1!=ss.end()) return sss[ss[a]].ks; else return -1;}
float getjiji(string a){ss1=ss.find(a); if(ss1!=ss.end()) return sss[ss[a]].ps*0.3+sss[ss[a]].ks*0.7;else return -1;}
int gettime(int a){return time[a];}
string getwhere(int a){return where[a];}
friend ostream&operator<<(ostream &os,course &d);
friend istream&operator>>(istream &is,course &d);
};
ostream&operator<<(ostream &os,course &d)
{
int i;
cout<<"课程代号\t课程名称\t课程学分\t课堂容量\t教学班号\t任课老师"<<endl;
os<<d.no<<"\t\t"<<d.name<<"\t"<<d.xuefen<<"\t\t"<<d.number<<"\t\t"<<d.banhao<<"\t\t";
if(d.teacher=="-1") cout<<"暂无"<<endl;
else cout<<d.teacher;
cout<<endl;
cout<<"上课时间\t上课地点"<<endl;//应该是文件读入课程信息、、
if(d.n==0) cout<<"暂无"<<endl;
for(i=0;i<d.n;i++)
{
cout<<"周";
os<<d.time[i]/10;
cout<<"第";
os<<d.time[i]%10;
cout<<"节";
os<<"\t"<<d.where[i]<<endl;
}
return os;
}
istream&operator>>(istream &is,course &d)
{string a,b,c;
float x;
int z,i=0,k=0;
cout<<"请依次输入课程代号、课程名称、学分、课容量、教学班号,输入-1结束"<<endl;
is>>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结束"<<endl;
is>>t.time[i];
if(t.time[i]==-1) break;
is>>t.where[i];
i++;
}
d=t;
d.n=i;
return is;
}
bool cmp1(course a,course b)//课程号字典排序
{
return a.getno()<b.getno();
}
bool ccc(struct some &a,struct some &b)
{
return a.snumber<b.snumber;
}
void course::paixv()
{
//sort(sss.begin(),sss.end(),ccc);
ss.clear();
for(int i=0;i<sss.size();i++)
ss.insert(make_pair(sss[i].snumber,i));
}
void course::addstudent(string a,string b,string c,float x,float y)
{
struct some A={a,b,c,x,y};
sss.push_back(A);
paixv();
}
void course::erasestudent(string a)
{ paixv();//cout<<sss.size()<<endl;
ss1=ss.find(a);
if(ss1!=ss.end())
{
ss.erase(ss1);
sss.erase(sss.begin()+ss1->second);paixv();}
}
void course::displaystudent()
{
int i;
cout<<"共有"<<sss.size()<<"人选了此门课程"<<endl;
if(sss.size()==0) return ;
cout<<"选课学生信息:"<<endl;
cout<<"学生学号\t学生姓名\t所属班级\t平时成绩\t考试成绩\t综合成绩"<<endl;
for(i=0;i<sss.size();i++)
{cout<<sss[i].snumber<<"\t"<<sss[i].sname<<"\t\t"<<sss[i].sclas<<"\t"<<sss[i].ps<<"\t\t"<<sss[i].ks<<"\t\t";
cout<<sss[i].ps*0.3+sss[i].ks*0.7<<endl;
}
cout<<endl;
}
class student{
vector<course>c;
vector<course>::iterator it;
map<string,int>ma;
map<string,int>::iterator ma1;
course z;
string name,number,clas;
int n;//所选课程总和
float average,jidian,zong;
float s;//课程绩点总和
int rankk;
string kebiao[6][8];
float all;//已选学分
public:
student(string num,string na,string cla):number(num),name(na),clas(cla)
{
for(int i=0;i<=5;i++)
for(int j=0;j<=7;j++)
kebiao[i][j]="--------";
}
student(){
name="-1";number="-1";clas="-1";
}
string getnumber(){return number;}
void setnumber(string m){number=m;}
string getname(){return name;}
void setname(string m){name=m;}
string getclas(){return clas;}
void setclas(string m){clas=m;}
int getn(){return c.size();}
void setn(int a){n=a;}
float getxuefen(){return all;}
float getjidian(){return jidian;}
void setjidian(float a){jidian=a;}
float getaverage(){return average;}
void NEW();
int find(string a);
void add(course a);
void erasee(string noo);
float dankechengji(int i){return c[i].getichengji(number);}
void xiugai();
int getfind();
void paixv();
void kebiaodisplay();
void displayalll();
int chake(int a){if(kebiao[a%10][a/10]!="--------") return 1;else return 0;}
int chakecheng(string a){ma1=ma.find(a); if(ma1!=ma.end()) return ma[a];else return -1;}
string courseno(int k){return c[k].getno();}
string coursehao(int j){return c[j].getbanhao();}
friend ostream&operator<<(ostream &os,student &d);
friend istream&operator>>(istream &is,student &d);
void displayall();
};
void student::displayalll()
{
float zong=0,xuefen=0;
int i,j;
for(int i=0;i<c.size();i++)
{
if(c[i].getjiji(number)<60) cout<<"0"<<endl;
else {cout<<(c[i].getjiji(number)/10-5)*c[i].getxuefen()<<endl;
zong+=(c[i].getjiji(number)/10-5)*c[i].getxuefen();}
xuefen+=c[i].getxuefen();
}
if(zong==0) setjidian(0);
else
setjidian(zong/xuefen);
}
void student::displayall()
{system("cls");
float zong=0,xuefen=0;
int i,j;
cout<<"课程名称\t课程成绩\t课程学分\t课程绩点"<<endl;
for(int i=0;i<c.size();i++)
{
cout<<c[i].getname()<<"\t"<<c[i].getjiji(number)<<"\t\t"<<c[i].getxuefen()<<"\t";
if(c[i].getjiji(number)<60) cout<<"0"<<endl;
else {cout<<(c[i].getjiji(number)/10-5)*c[i].getxuefen()<<endl;
zong+=(c[i].getjiji(number)/10-5)*c[i].getxuefen();}
xuefen+=c[i].getxuefen();
}
if(zong==0) setjidian(0);
else
setjidian(zong/xuefen);
cout<<"平均学分绩点:\t"<<getjidian()<<endl;system("pause");
}
void student::kebiaodisplay()
{
int i,j;
cout<<" 周一\t\t周二\t\t周三\t\t周四\t\t周五\t\t周六\t\t周日"<<endl;
for(i=1;i<=5;i++)
{
cout<<"第"<<i<<"大节\t";
for(j=1;j<=7;j++)
cout<<kebiao[i][j]<<"\t";
cout<<endl;
}
}
ostream&operator<<(ostream &os,student &d)
{
cout<<"-----------------------------------------------"<<endl;
cout<<"学号\t\t姓名\t\t班级\t\t平均学分绩点\t选课总数"<<endl;
os<<d.number<<"\t"<<d.name<<"\t\t"<<d.clas<<"\t"<<d.getjidian()<<"\t\t"<<d.c.size()<<endl;
for(int i=0;i<d.c.size();i++)
{os<<d.c[i];
cout<<"成绩:"<<d.dankechengji(i)<<endl<<endl;}
cout<<"-----------------------------------------------"<<endl<<endl;
return os;
}
istream&operator>>(istream &is,student &d)
{
string a,b,c,x;
cout<<"依次输入学生学号、姓名、班级,按-1结束输入"<<endl;
is>>a;
if(a=="-1") {d.setnumber(a);return is;}
is>>b>>c;
student t(a,b,c);
d=t;
return is;
}
void student::paixv()
{
ma.clear();
sort(c.begin(),c.end(),cmp1);
n=c.size();
for(int i=0;i<n;i++)
ma.insert(make_pair(c[i].getno(),i));
}
void student::NEW()
{
average=zong/n;
jidian=s/all;
}
void student::add(course a)
{
c.push_back(a);
ma.insert(make_pair(a.getno(),c.size()-1));
all+=a.getxuefen();
n=c.size();
for(int i=0;i<a.getn();i++)
kebiao[a.gettime(i)%10][a.gettime(i)/10]=a.getname();
paixv();
}
void student::erasee(string noo)
{
ma1=ma.find(noo);if(ma1==ma.end()){cout<<"未选此课"<<endl;return ;}
cout<<c[ma[noo]]<<endl;cout<<"退选成功"<<endl;
for(int i=0;i<c[ma[noo]].getn();i++)
kebiao[c[ma[noo]].gettime(i)%10][c[ma[noo]].gettime(i)/10]="--------";
c.erase(c.begin()+ma[noo]);
ma.erase(ma1);n=c.size();
paixv();
}
bool cmps(student a,student b)//学生按学号排序
{
return a.getnumber()<b.getnumber();
}
bool cmps1(student a,student b)//学生按绩点排序
{
return a.getjidian()>b.getjidian();
}
class teacher{
string hao;
string yuanxi;
string name;
int number;
vector<course>c;
vector<course>::iterator it;
map<string,int>ma;
map<string,int>::iterator ma1;
course z;
string kebiao[6][8];
public:
teacher(string a,string b,string c):hao(a),yuanxi(c),name(b)
{for(int i=0;i<=5;i++)
for(int j=0;j<=7;j++)
kebiao[i][j]="--------";}
teacher(){
hao="-1";yuanxi="-1";name="-1";number=0;}
string gethao(){return hao;}
void sethao(string a){hao=a;}
string getyuanxi(){return yuanxi;}
void setyuanxi(string a){yuanxi=a;}
string getname(){return name;}
void setname(string a){name=a;}
int getnumber(){return c.size();}
void setnumber(int a){number=a;}
void paixv();
void add(course a);
int chake(int a){if(kebiao[a%10][a/10]!="--------") return 1;else return 0;}
int chakecheng(string a,string b){ma1=ma.find(a); if(ma1!=ma.end()&&c[ma[a]].getbanhao()==b) return ma[a];else return -1;}
string courseno(int k){return c[k].getno();}
int chakechengm(string a){ma1=ma.find(a); if(ma1!=ma.end()) return ma[a];else return -1;}
string coursehao(int j){return c[j].getbanhao();}
void erasee(string noo);
void kebiaodisplay();
void displaystudent(string a,string b);
void setpschengji(string a,int i,float ji)
{c[ma[a]].tianjiaps(c[ma[a]].getsssnumber(i),ji);}
void setkschengji(string a,int i,float ji)
{c[ma[a]].tianjiaks(c[ma[a]].getsssnumber(i),ji);}
friend ostream&operator<<(ostream &os,teacher &d);
friend istream&operator>>(istream &is,teacher &d);
};
void teacher::displaystudent(string a,string b)
{ ma1=ma.find(a);
if(ma1!=ma.end()&&c[ma[a]].getbanhao()==b)
c[ma[a]].displaystudent();
else cout<<"输入有误,请重新输入"<<endl;
system("pause");
}
void teacher::kebiaodisplay()
{
int i,j;
cout<<" 周一\t\t周二\t\t周三\t\t周四\t\t周五\t\t周六\t\t周日"<<endl;
for(i=1;i<=5;i++)
{
cout<<"第"<<i<<"大节\t";
for(j=1;j<=7;j++)
cout<<kebiao[i][j]<<"\t";
cout<<endl;
}
}
ostream&operator<<(ostream &os,teacher &d)
{cout<<"-----------------------------------------------"<<endl;
cout<<"教师工号\t教师姓名\t所属院系\t教授课程总数"<<endl;
os<<d.hao<<"\t\t"<<d.name<<"\t\t"<<d.yuanxi<<"\t\t"<<d.c.size()<<endl;
cout<<"教授课程:"<<endl;
for(int i=0;i<d.c.size();i++)
{os<<d.c[i]<<endl;
d.c[i].displaystudent();}
cout<<"-----------------------------------------------"<<endl;
return os;
}
istream&operator>>(istream &is,teacher &d)
{
string a,b,c;
cout<<"依次输入教师工号、教师姓名、院系,输入-1结束"<<endl;
is>>a;
if(a=="-1") {d.sethao(a);return is;}
is>>b>>c;
teacher t(a,b,c);
d=t;
return is;
}
bool cmpt(teacher a,teacher b)//学生按学号排序
{
return a.gethao()<b.gethao();
}
void teacher::paixv()
{
ma.clear();
sort(c.begin(),c.end(),cmp1);
number=c.size();
for(int i=0;i<number;i++)
ma.insert(make_pair(c[i].getno(),i));
}
void teacher::add(course a)
{
c.push_back(a);
number=c.size();
for(int i=0;i<a.getn();i++)
kebiao[a.gettime(i)%10][a.gettime(i)/10]=a.getname();
paixv();
}
void teacher::erasee(string noo)
{
ma1=ma.find(noo);if(ma1==ma.end()) {cout<<"未选此课"<<endl;return ;}
cout<<c[ma1->second]<<endl;cout<<"退选成功"<<endl;
for(int i=0;i<c[ma[noo]].getn();i++)
kebiao[c[ma[noo]].gettime(i)%10][c[ma[noo]].gettime(i)/10]="--------";
c.erase(c.begin()+ma1->second);
ma.erase(ma1);number=c.size();
paixv();
}
class guanli
{
public:
vector<course>c;
vector<course>::iterator it;
map<string,int>ma;
map<string,int>::iterator ma1;
vector<student>s;
vector<student>::iterator its;
map<string,int>mas;
map<string,int>::iterator ma1s;
vector<teacher>t;
vector<teacher>::iterator itt;
map<string,int>mat;
map<string,int>::iterator ma1t;
void addcourse();
void addstudent();
void addteacher();
int searchcourse(string no,string aa);
int searchstudent(string no);
int searchteacher(string no);
void deletecourse();
void deletestudent();
void deleteteacher();
void querycourse();
int qquerycourse(string name,string hao);
void querystudent();
int qquerystudent(string name);
void queryteacher();
int qqueryteacher(string name);
void chargecourse();
void chargestudent();
void chargeteacher();
void displaycourse(int a);
void displaystudent();
void displayteacher();
void menudisplay1();
void menudisplay2(int a);
void menu2(int a);
void menu1();
void load1();
void load2();
void load3();
void save1();
void save2();
void save3();
void paixvc();
void paixvs();
void paixvt();
};
void guanli::paixvc()
{
ma.clear();
sort(c.begin(),c.end(),cmp1);
for(int i=0;i<c.size();i++)
ma.insert(make_pair(c[i].getno(),i));
}
void guanli::paixvs()
{
mas.clear();
sort(s.begin(),s.end(),cmps);
for(int i=0;i<s.size();i++)
mas.insert(make_pair(s[i].getnumber(),i));
}
void guanli::paixvt()
{
mat.clear();
sort(t.begin(),t.end(),cmpt);
for(int i=0;i<t.size();i++)
mat.insert(make_pair(t[i].gethao(),i));
}
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<<"已存在此门课程"<<endl;
else {c.push_back(z); cout<<"已添加"<<endl;}
system("pause");
}
paixvc();
}
void guanli::addstudent()
{
student z;
while(1)
{system("cls");
cin>>z;
if(z.getnumber()=="-1") break;
if(searchstudent(z.getnumber())!=-1) cout<<"已存在此学号学生"<<endl;
else {s.push_back(z);cout<<"学生添加成功"<<endl;}
system("pause");
}paixvs();
}
void guanli::addteacher()
{
teacher z;
while(1)
{system("cls");
cin>>z;
if(z.gethao()=="-1") break;
if(searchteacher(z.gethao())!=-1) cout<<"已存在此工号教师"<<endl;
else {t.push_back(z);cout<<"教师添加成功"<<endl;}
system("pause");
}paixvt();
}
int guanli::searchcourse(string no,string aa)
{
int i;
for(i=0;i<c.size();i++)
if(c[i].getno()==no&&c[i].getbanhao()==aa)
return i;
return -1;
}
int guanli::searchstudent(string no)
{
int i;
for(i=0;i<s.size();i++)
if(s[i].getnumber()==no)
return i;
return -1;
}
int guanli::searchteacher(string no)
{
int i;
for(i=0;i<t.size();i++)
if(t[i].gethao()==no)
return i;
return -1;
}
void guanli::querycourse()
{
int k;
string a;
string name;system("cls");
while(1)
{
cout<<"输入所查课程的课程号和教学班号,输入-1结束"<<endl;
cin>>name;
if(name=="-1") break;
cin>>a;
k=searchcourse(name,a);
if(k!=-1) {cout<<c[k]<<endl;c[k].displaystudent();}
else cout<<"课程号输入有误,请重新输入"<<endl;
}
}
void guanli::querystudent()
{
int k;
string name;system("cls");
while(1)
{cout<<"输入所查学生的学号,输入-1结束"<<endl;
cin>>name;
if(name=="-1") break;
k=searchstudent(name);
if(k!=-1) cout<<s[k]<<endl;
else cout<<"学号输入有误,请重新输入"<<endl;
}
}
int guanli::qquerycourse(string name,string hao)
{
int k;
k=searchcourse(name,hao);
return k;
}
int guanli::qquerystudent(string name)
{
int k;
k=searchstudent(name);
return k;
}
int guanli::qqueryteacher(string name)
{
int k;
k=searchteacher(name);
return k;
}
void guanli::queryteacher()
{
int k;
string name;system("cls");
while(1)
{cout<<"输入所查教师的工号,输入-1结束"<<endl;
cin>>name;
if(name=="-1") break;
k=searchteacher(name);
if(k!=-1) cout<<t[k]<<endl;
else cout<<"工号输入有误,请重新输入"<<endl;
}
}
void guanli::deletecourse()
{
int k;
string na,hao;system("cls");
while(1)
{
cout<<"输入要删除的课程的课程号和班号,输入-1结束"<<endl;
cin>>na;
if(na=="-1") break;
cin>>hao;
k=searchcourse(na,hao);
if(k!=-1) c.erase(c.begin()+k);
else cout<<"课程号输入有误,请重新输入"<<endl;
}
}
void guanli::deletestudent()
{
int k;
string na;system("cls");
while(1)
{
cout<<"输入要删除的学生的学号,输入-1结束"<<endl;
cin>>na;
if(na=="-1") break;
k=searchstudent(na);
if(k!=-1) s.erase(s.begin()+k);
else cout<<"学号输入有误,请重新输入"<<endl;
}
}
void guanli::deleteteacher()
{
int k;
string na;system("cls");
while(1)
{
cout<<"输入要删除的教师的工号,输入-1结束"<<endl;
cin>>na;
if(na=="-1") break;
k=searchteacher(na);
if(k!=-1) t.erase(t.begin()+k);
else cout<<"工号输入有误,请重新输入"<<endl;
}
}
void guanli::chargecourse()
{
int k;
string na,hao;
course zz;system("cls");
while(1)
{
cout<<"输入要修改的课程的课程号和班号,输入-1结束"<<endl;
cin>>na>>hao;
if(na=="-1") break;
k=searchcourse(na,hao);
if(k!=-1)
{
cout<<c[k]<<endl;
cin>>zz;
c[k]=zz;
cout<<"修改后的信息:"<<endl;
cout<<c[k]<<endl;
}
else cout<<"课程号输入有误,请重新输入"<<endl;
}
paixvc();
}
void guanli::chargestudent()
{
int k;
string na;
student zz;system("cls");
while(1)
{
cout<<"输入要修改的学生的学号,输入-1结束"<<endl;
cin>>na;
if(na=="-1") break;
k=searchstudent(na);
if(k!=-1)
{
cout<<s[k]<<endl;
cin>>zz;
s[k]=zz;
cout<<"修改后的信息:"<<endl;
cout<<s[k]<<endl;
}
else cout<<"学号输入有误,请重新输入"<<endl;
}paixvs();
}
void guanli::chargeteacher()
{
int k;
string na;system("cls");
teacher zz;
while(1)
{
cout<<"输入要修改的教师的工号,输入-1结束"<<endl;
cin>>na;
if(na=="-1") break;
k=searchteacher(na);
if(k!=-1)
{
cout<<t[k]<<endl;
cin>>zz;
t[k]=zz;
cout<<"修改后的信息:"<<endl;
cout<<t[k]<<endl;
}
else cout<<"工号输入有误,请重新输入"<<endl;
}paixvt();
}
void guanli::displaycourse(int a)
{system("cls");
string ss;
for(int i=0;i<c.size();i++)
{cout<<"-----------------------------------------------"<<endl;
cout<<c[i]<<endl;
if(a)
{
//cout<<"共有"<<c[i].sssn()<<"人选了此课"<<endl;
if(c[i].sssn()!=0)
{
c[i].displaystudent();
}}cout<<"-----------------------------------------------"<<endl;
}
}
void guanli::displaystudent()
{system("cls");
for(int i=0;i<s.size();i++)
cout<<s[i]<<endl;
}
void guanli::displayteacher()
{system("cls");
for(int i=0;i<t.size();i++)
cout<<t[i]<<endl;
}
void guanli::load1()
{
course x1;
int n;
string m,z,l,a;
float b,x,y;
ifstream infile("d:\\20164235-course.txt",ios::in);
if(!infile) return ;
c.clear();
while(infile>>x1)
{if(x1.getno()=="-1") break;
infile>>m;
x1.setteacher(m);
infile>>n;
for(int i=0;i<n;i++)
{
infile>>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::load2()
{
int a;
course x;
string zz,hao;
student x1;
float l;
ifstream infile("d:\\20164235-student.txt",ios::in);
if(!infile) return ;
s.clear();
while(infile>>x1)
{
if(x1.getnumber()=="-1") break;
infile>>l;
x1.setjidian(l);
infile>>a;
while(a--)
{infile>>zz>>hao;
x1.add(c[qquerycourse(zz,hao)]);
}
x1.setn(a);x1.displayalll();
s.push_back(x1);
mas.insert(make_pair(x1.getnumber(),s.size()-1));
}
infile.close();system("cls");
}
void guanli::load3()
{
int a;
course x;
string zz,hao;
teacher x1;
ifstream infile("d:\\20164235-teacher.txt",ios::in);
if(!infile) return ;
t.clear();
while(infile>>x1)
{
if(x1.gethao()=="-1") break;
infile>>a;
while(a--)
{infile>>zz>>hao;
x1.add(c[qquerycourse(zz,hao)]);
}x1.setnumber(a);
t.push_back(x1);
mat.insert(make_pair(x1.gethao(),t.size()-1));
}
infile.close();system("cls");
}
void guanli::save1()
{int j,k;
ofstream outfile("d:\\20164235-course.txt",ios::out);
if(!outfile) return ;
for(int i=0;i<c.size();i++)
{outfile<<c[i].getno()<<"\t\t"<<c[i].getname()<<"\t\t"<<c[i].getxuefen();
outfile<<"\t\t"<<c[i].getnumber()<<"\t\t"<<c[i].getbanhao()<<"\t\t";
for(k=0;k<c[i].getn();k++)
{
outfile<<c[i].gettime(k)<<"\t"<<c[i].getwhere(k)<<endl;
}
outfile<<"-1"<<endl;
outfile<<c[i].getteacher()<<endl;
outfile<<c[i].sssn()<<endl;
if(c[i].sssn()!=0)
{
for(j=0;j<c[i].sssn();j++)
{outfile<<c[i].getsssnumber(j)<<"\t"<<c[i].getsssname(j)<<"\t"<<c[i].getsssclas(j);
outfile<<"\t"<<c[i].getsssps(j)<<"\t"<<c[i].getsssks(j)<<endl;
}}}
outfile<<"-1"<<endl;
outfile.close();system("cls");
}
void guanli::save2()
{
ofstream outfile("d:\\20164235-student.txt",ios::out);
if(!outfile) return ;
for(int i=0;i<s.size();i++)
{
outfile<<s[i].getnumber()<<"\t"<<s[i].getname()<<"\t"<<s[i].getclas()<<"\t"<<s[i].getjidian()<<"\t"<<s[i].getn()<<endl;
for(int j=0;j<s[i].getn();j++)
outfile<<s[i].courseno(j)<<"\t"<<s[i].coursehao(j)<<endl;
}
outfile<<"-1"<<endl;
outfile.close();system("cls");
}
void guanli::save3()
{
ofstream outfile("d:\\20164235-teacher.txt",ios::out);
if(!outfile) return ;
for(int i=0;i<t.size();i++)
{outfile<<t[i].gethao()<<"\t"<<t[i].getname()<<"\t";
outfile<<t[i].getyuanxi()<<"\t"<<t[i].getnumber()<<endl;
for(int j=0;j<t[i].getnumber();j++)
outfile<<t[i].courseno(j)<<"\t"<<t[i].coursehao(j)<<endl;
}
outfile<<endl<<"-1"<<endl;
outfile.close();system("cls");
}
void guanli::menudisplay1()
{
cout<<"*******************************************"<<endl;
cout<<" 欢迎使用选课系统 "<<endl;
cout<<" 0: 退出 "<<endl;
cout<<" 1: 课程管理 "<<endl;
cout<<" 2: 学生管理 "<<endl;
cout<<" 3: 教师管理 "<<endl;
cout<<"*******************************************"<<endl;
return ;
}
void guanli::menudisplay2(int a)
{
cout<<"*******************************************"<<endl;
if(a==1)
{
cout<<" 欢迎使用课程管理系统 "<<endl;
cout<<" 0: 退出 "<<endl;
cout<<" 1: 增加课程 "<<endl;
cout<<" 2: 删除课程 "<<endl;
cout<<" 3: 修改课程 "<<endl;
cout<<" 4: 查询课程 "<<endl;
cout<<" 5: 展示所有课程及选课结果 "<<endl;
}
if(a==2)
{
cout<<" 欢迎使用学生管理系统 "<<endl;
cout<<" 0: 退出 "<<endl;
cout<<" 1: 增加学生 "<<endl;
cout<<" 2: 删除学生 "<<endl;
cout<<" 3: 修改学生 "<<endl;
cout<<" 4: 查询学生 "<<endl;
cout<<" 5: 展示所有学生 "<<endl;
}
if(a==3)
{
cout<<" 欢迎使用教师管理系统 "<<endl;
cout<<" 0: 退出 "<<endl;
cout<<" 1: 增加教师 "<<endl;
cout<<" 2: 删除教师 "<<endl;
cout<<" 3: 修改教师 "<<endl;
cout<<" 4: 查询教师 "<<endl;
cout<<" 5: 展示所有老师 "<<endl;
}
cout<<"*******************************************"<<endl;
}
void guanli::menu1()
{
int x;
while(1)
{system("cls");
menudisplay1();
cout<<"请输入你的选择"<<endl;
cin>>x;
if(!x) break;
system("cls");
menu2(x);
}
}
void guanli::menu2(int a)
{
int x;
system("cls");
if(a==1)
{
while(1)
{
menudisplay2(a);
cout<<"请输入你的选择"<<endl;
cin>>x;
if(!x) break;
switch(x)
{
case 1:
addcourse();
break;
case 2:
deletecourse();
break;
case 3:
chargecourse();
break;
case 4:
querycourse();
break;
case 5:
displaycourse(1);
break;
}
system("pause");
system("cls");
}
}
if(a==2)
{
while(1)
{
menudisplay2(a);
cout<<"请输入你的选择"<<endl;
cin>>x;
if(!x) break;
switch(x)
{
case 1:
addstudent();
break;
case 2:
deletestudent();
break;
case 3:
chargestudent();
break;
case 4:
querystudent();
break;
case 5:
displaystudent();
break;
}
system("pause");
system("cls");
}
}
if(a==3)
{
while(1)
{
menudisplay2(a);
cout<<"请输入你的选择"<<endl;
cin>>x;
if(!x) break;
switch(x)
{
case 1:
addteacher();
break;
case 2:
deleteteacher();
break;
case 3:
chargeteacher();
break;
case 4:
queryteacher();
break;
case 5:
displayteacher();
break;
}
system("pause");
system("cls");
}}
}
class studentcaozuo
{
student s;
vector<course>c;
vector<course>::iterator it;
map<string,int>ma;
map<string,int>::iterator ma1;
public:
void displaycourse();
void addc();
void erasec();
void load1();
student A(){return s;}
void xuanze();
void jieguo();
void save1();
studentcaozuo(student a):s(a){load1();xuanze();save1();}
};
void studentcaozuo::save1()
{int j,k;
ofstream outfile("d:\\20164235-course.txt",ios::out);
if(!outfile) return ;
for(int i=0;i<c.size();i++)
{outfile<<c[i].getno()<<"\t\t"<<c[i].getname()<<"\t\t"<<c[i].getxuefen();
outfile<<"\t\t"<<c[i].getnumber()<<"\t\t"<<c[i].getbanhao()<<"\t\t";
for(k=0;k<c[i].getn();k++)
{
outfile<<c[i].gettime(k)<<"\t"<<c[i].getwhere(k)<<endl;
}
outfile<<"-1"<<endl;
outfile<<c[i].getteacher()<<endl;
outfile<<c[i].sssn()<<endl;//cout<<c[i].sssn()<<endl;system("pause");
if(c[i].sssn()!=0)
{
for(j=0;j<c[i].sssn();j++)
{outfile<<c[i].getsssnumber(j)<<"\t"<<c[i].getsssname(j)<<"\t"<<c[i].getsssclas(j);
outfile<<"\t"<<c[i].getsssps(j)<<"\t"<<c[i].getsssks(j)<<endl;
}}}
outfile<<"-1"<<endl;
outfile.close();system("cls");
}
void studentcaozuo::displaycourse()
{
for(int i=0;i<c.size();i++)
{cout<<"-----------------------------------------------"<<endl;
cout<<c[i]<<endl;
cout<<"-----------------------------------------------"<<endl<<endl;
}
}
void studentcaozuo::xuanze()
{ int a;
while(1)
{
system("cls");
s.kebiaodisplay();
cout<<"###################################################################"<<endl;
cout<<" 0: 退出"<<endl;
cout<<" 1: 选课"<<endl;
cout<<" 2: 退课"<<endl;
cout<<" 3: 考试成绩"<<endl;
cout<<" 4: 选课情况"<<endl;
cout<<"###################################################################"<<endl;
cin>>a;
if(a==0) break;
else if(a==1) addc();
else if(a==2) erasec();
else if(a==3) s.displayall();
else if(a==4) {system("cls");cout<<s<<endl;system("pause");}
}
}
void studentcaozuo::load1()
{
course x1;
int n;
string m,z,l,a;
float b,x,y;
ifstream infile("d:\\20164235-course.txt",ios::in);
if(!infile) return ;
c.clear();
while(infile>>x1)
{if(x1.getno()=="-1") break;
infile>>m;
x1.setteacher(m);
infile>>n;
for(int i=0;i<n;i++)
{
infile>>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 studentcaozuo::addc()
{
string z,hao;
int i,j,t=0;
while(1)
{system("cls");
load1();
displaycourse();
cout<<s<<endl;int l;
cout<<"请输入所选课程的课程号、班号,输入-1结束"<<endl;
cin>>z;
if(z=="-1") break;
else
{cin>>hao;
if(s.chakecheng(z)!=-1) {cout<<"此门课程已选过"<<endl;system("pause");}
else
{system("cls");
for(i=0;i<c.size();i++)
if(c[i].getno()==z&&c[i].getbanhao()==hao) {cout<<c[i]<<endl;break;}
if(i!=c.size()){
if(c[i].sssn()==c[i].getnumber()) cout<<"此门课程已满,请重新选择"<<endl;
else {
for(j=0;j<c[i].getn();j++)
{l=c[i].gettime(j);
if(s.chake(c[i].gettime(j))) {cout<<"时间冲突"<<endl;t=1;break;}}
if(t==0){
c[i].addstudent(s.getnumber(),s.getname(),s.getclas(),0,0);//;
cout<<"已选此课程"<<endl;
s.add(c[i]);save1();//c[i].displaystudent();system("pause");
}}system("pause");
}
else {
cout<<"课程号输入有误,请重新输入,输入-1结束"<<endl;system("pause");}
}
}}
}
void studentcaozuo::erasec()
{
string z;
while(1)
{system("cls");
cout<<s<<endl;
cout<<"请输入所退课程的课程号,输入-1结束"<<endl;
cin>>z;
if(z=="-1") break;
else
{ma1=ma.find(z);
if(ma1!=ma.end())
{//cout<<"!"<<endl;
c[ma1->second].erasestudent(s.getnumber());
s.erasee(z);
//ma.erase(ma1);
//cout<<"已退选此门课程"<<endl;
save1();
system("pause");
}
else {
cout<<"课程号输入有误,请重新输入,输入-1结束"<<endl;system("pause");
}}
}
}
class teachercaozuo
{
teacher t;
vector<course>c;
vector<course>::iterator it;
map<string,int>ma;
map<string,int>::iterator ma1;
public:
void addc();
void erasec();
void xuanze();
void displaycourse();
teacher A(){return t;}
void load1();
void save1();
void pschengji(string a,string b);
void kschengji(string a,string b);
teachercaozuo(teacher a):t(a){load1();xuanze();save1();}
};
void teachercaozuo::pschengji(string a,string b)
{system("cls");
string k;
int j;
float ji;
for(j=0;j<c.size();j++)
if(c[j].getno()==a&&c[j].getbanhao()==b)
{
cout<<"请对应输入学生平时成绩"<<endl;
cout<<"学号\t\t姓名\t\t平时成绩"<<endl;
for(int i=0;i<c[j].sssn();i++)
{cout<<c[j].getsssnumber(i)<<"\t"<<c[j].getsssname(i)<<"\t\t";
cin>>ji;
cout<<endl;
c[j].tianjiaps(c[j].getsssnumber(i),ji);
t.setpschengji(a,i,ji);
}break;
}
if(j==c.size()) cout<<"输入有误,请重新输入"<<endl;system("pause");
}
void teachercaozuo::kschengji(string a,string b)
{system("cls");
string k;
int j;
float ji;
for(j=0;j<c.size();j++)
if(c[j].getno()==a&&c[j].getbanhao()==b)
{
cout<<"请对应输入学生考试成绩"<<endl;
cout<<"学号\t\t姓名\t\t考试成绩"<<endl;
for(int i=0;i<c[j].sssn();i++)
{cout<<c[j].getsssnumber(i)<<"\t"<<c[j].getsssname(i)<<"\t\t";
cin>>ji;
cout<<endl;
c[j].tianjiaks(c[j].getsssnumber(i),ji);
t.setkschengji(a,i,ji);
}break;
}
if(j==c.size()) cout<<"输入有误,请重新输入"<<endl;system("pause");
}
void teachercaozuo::save1()
{int j,k;
ofstream outfile("d:\\20164235-course.txt",ios::out);
if(!outfile) return ;
for(int i=0;i<c.size();i++)
{outfile<<c[i].getno()<<"\t\t"<<c[i].getname()<<"\t\t"<<c[i].getxuefen();
outfile<<"\t\t"<<c[i].getnumber()<<"\t\t"<<c[i].getbanhao()<<"\t\t";
for(k=0;k<c[i].getn();k++)
{
outfile<<c[i].gettime(k)<<"\t"<<c[i].getwhere(k)<<endl;
}
outfile<<"-1"<<endl;
outfile<<c[i].getteacher()<<endl;
outfile<<c[i].sssn()<<endl;
if(c[i].sssn()!=0)
{
for(j=0;j<c[i].sssn();j++)
{outfile<<c[i].getsssnumber(j)<<"\t"<<c[i].getsssname(j)<<"\t"<<c[i].getsssclas(j);
outfile<<"\t"<<c[i].getsssps(j)<<"\t"<<c[i].getsssks(j)<<endl;
}}}
outfile<<"-1"<<endl;
outfile.close();system("cls");
}
void teachercaozuo::displaycourse()
{
for(int i=0;i<c.size();i++)
{cout<<"-----------------------------------------------"<<endl;
cout<<c[i]<<endl;
cout<<"-----------------------------------------------"<<endl;
}
}
void teachercaozuo::xuanze()
{
int a;
while(1)
{
system("cls");
t.kebiaodisplay();
cout<<"###################################################################"<<endl;
cout<<" 0: 退出"<<endl;
cout<<" 1: 选课"<<endl;
cout<<" 2: 退课"<<endl;
cout<<" 3: 学生选课结果及成绩"<<endl;
cout<<" 4: 填写成绩"<<endl;
cout<<" 5: 个人选课情况"<<endl;
cout<<"###################################################################"<<endl;
cin>>a;
if(a==0) break;
else if(a==1) addc();
else if(a==2) erasec();
else if(a==3)
{string aa,b;
while(1)
{system("cls");
cout<<"请输入课程号和教学班号,输入-1退出"<<endl;
cin>>aa;
if(aa=="-1") {break;}
cin>>b;
if(t.chakecheng(aa,b)==-1) {cout<<"输入有误,请重新输入"<<endl;system("pause");}
else t.displaystudent(aa,b);
}
}
else if(a==4)
{string aa,b;int z;
while(1)
{system("cls");
cout<<"请输入要填写成绩的课程号和教学班号,输入-1退出"<<endl;
cin>>aa;
if(aa=="-1") break;
cin>>b;
if(t.chakecheng(aa,b)==-1) cout<<"输入有误,请重新输入"<<endl;
//ma1=ma.find(aa);if(ma1==ma.end()||c[ma[aa]].getbanhao()!=b) {cout<<"输入有误,请重新输入"<<endl;system("pause");system("cls");}
else
{while(1)
{cout<<"输入平时成绩按1,输入考试成绩按2,退出按-1"<<endl;
cin>>z;
if(z==-1) break;
else if(z==1)
pschengji(aa,b);
else if(z==2) kschengji(aa,b);
}
}
system("pause");}
}
else if(a==5) {system("cls");cout<<t<<endl;system("pause");}
}
}
void teachercaozuo::addc()
{
string z,hao;
int i,j,l,tt=0;
while(1)
{system("cls");
displaycourse();cout<<t<<endl;
cout<<"请输入所选课程的课程号、班号,输入-1结束"<<endl;
cin>>z;
if(z=="-1") break;
else {cin>>hao;
if(t.chakechengm(z)!=-1) {cout<<"已选过此门课程"<<endl;system("pause");}
else { for(j=0;j<c.size();j++)
if(c[j].getno()==z&&c[j].getbanhao()==hao) {break;}
if(j!=c.size())
{
if(c[j].getteacher()!="-1") cout<<"已有教师选了此门课程,请重新选课"<<endl;
else {
for(i=0;i<c[j].getn();i++)
{l=c[j].gettime(i);
if(t.chake(c[j].gettime(i))) {cout<<"时间冲突"<<endl;tt=1;break;}}
if(tt==0){
//c[j].addstudent(s.getnumber());
cout<<"选课成功"<<endl;
c[j].setteacher(t.getname());t.add(c[j]);cout<<c[j]<<endl;}}
system("pause");
}
else {
cout<<"输入有误,请重新输入,输入-1结束"<<endl;system("pause");}
}
}
}
}
void teachercaozuo::erasec()
{
string z;
while(1)
{system("cls");
cout<<t<<endl;
cout<<"请输入所退课程的课程号,输入-1结束"<<endl;
cin>>z;
if(z=="-1") break;
else
{ ma1=ma.find(z);
if(ma1!=ma.end())
{
c[ma1->second].setteacher("-1");
t.erasee(z);
//ma.erase(ma1);
//cout<<"已退选此课程"<<endl;
system("pause");}
else{
cout<<"课程号输入有误,请重新输入,输入-1结束"<<endl;system("pause");
} }
}
}
void teachercaozuo::load1()
{
course x1;
int n;
string m,z,l,a;
float b,x,y;
ifstream infile("d:\\20164235-course.txt",ios::in);
if(!infile) return ;
c.clear();
while(infile>>x1)
{if(x1.getno()=="-1") break;
infile>>m;
x1.setteacher(m);
infile>>n;
for(int i=0;i<n;i++)
{
infile>>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");
}
class caozuo:public guanli
{
public:
void menu1();
};
void caozuo::menu1()
{load1();load3();load2();system("cls");
cout<<"*******************************************"<<endl;
cout<<" 欢迎使用选课系统"<<endl;
cout<<" 用户登录"<<endl;
string a,b;
cout<<"请输入:"<<endl;
cout<<"用户名(学号或工号),输入-1退出"<<endl;
cin>>a;
if(a!="-1")
{
cout<<"密码(假设正确)"<<endl;
cin>>b;
int ttt;
ttt=qquerystudent(a);//tt==-1,招不到学生
if(ttt!=-1)
{cout<<"学生"<<a<<"登陆成功"<<endl;system("pause");
studentcaozuo ss(s[ttt]);
s[ttt]=ss.A();
save2();
//save1();
}
else
{
ttt=qqueryteacher(a);
if(ttt!=-1) {cout<<"教师"<<a<<"登陆成功"<<endl;system("pause");
teachercaozuo tt(t[ttt]);
t[ttt]=tt.A();
save3();
//save1();
}
else {cout<<"用户不存在,请重新输入"<<endl;system("pause");menu1();}
}
}
}
int main()
{
int a;
guanli s;
caozuo ll;
while(1)
{system("cls");
cout<<"管理员输入1,用户登陆输入0,退出输入-1"<<endl;
cin>>a;
if(a==1)
{s.load1();
s.load3();
s.load2();
//s.load3();
s.menu1();
s.save1();
s.save2();
s.save3();}
else if(a==-1) break;
else if(a==0)
{
ll.load1();
ll.load3();
ll.load2();
//ll.load3();
ll.menu1();
}
}
}