#includeiostream#includeiomanip#includefstream#includeconio.husingnamespacestd;//定义课程classcourse//某个学生所学的课程中的某一个{public:charcname[20];//课程名称floatgrade;//课程成绩course*Next;//指向下一个课程的指针};//学生类classstudent{public:student(){root=NULL;constintmaxcourse=5;factcourse=0;}voidreadname(charN[]);//读入学生的姓名voidgetname(charN[]);//得到学生的姓名voidwrecourse(charN[],floatscore);//要据课程名写入学生课程的成绩floataverage();//学生课程的平均成绩voidaddcourse(charN[],floatg);//给学生增加一门课intfindcourse(charN[]);//查找是否已有此课程,如果有返回,如果没有返回intretfactcourse(){returnfactcourse;}//得到所学的课程数目course*retroot(){returnroot;}//利用键表将所有的课程保存起来intretmaxcourse(){return5;}//得到最多可学的课程数目voidclrroot()//清零{root=NULL;factcourse=0;}private:charsname[20];//学生的姓名intmaxcourse;//学生最多可以学五门课程intfactcourse;//学生实际所学的课程数目course*root;//课程的根结点指针};voidstudent::readname(charN[])//读入学生的姓名{strcpy(sname,N);}voidstudent::getname(charN[])//得到学生的姓名{strcpy(N,sname);}voidstudent::wrecourse(charN[],floatscore)//要据课程名写入学生课程的成绩{course*p=root;if(p==NULL)return;if(p!=NULL)p=p-Next;while(p){if(strcmp(p-cname,N)==0)p-grade=score;p=p-Next;}}floatstudent::average()//学生课程的平均成绩{floataver=0.0;course*p=root;while(p){aver=aver+p-grade;}aver=aver/factcourse;returnaver;}voidstudent::addcourse(charN[],floatg)//给学生增加一门课{course*s=newcourse;s-Next=NULL;if(root==NULL)root=s;course*p=root;course*newcourse=newcourse;newcourse-Next=p-Next;p-Next=newcourse;strcpy(newcourse-cname,N);newcourse-grade=g;factcourse++;}intstudent::findcourse(charN[])//查找是否已有此课程,如果有返回,如果没有返回{course*p=root;if(root==NULL)return0;p=p-Next;while(p){if(strcmp(p-cname,N)==0)return1;p=p-Next;}return0;}classstudentdb{public:studentstu;studentdb*Next;};structstudentname{chartname[20];//学生的名字floatresult;//学生所得的该课程分数studentname*Next;};//课程类classsubject{public:subject(){first=NULL;maxstudent=30;activestudnet=0;}floatreadcredit();//得到课程的学分voidgetcredit(floata);//设置学分floatgetaverage();//得到学生的平均成绩floatgetresult(charN[]);//查找某个学生的成绩voidgetkname(charN[]);//读出课程的名称voidsetkname(charN[]);//读入课程的名称studentname*retfirst(){returnfirst;}//返回根结点voidfindstudent(studentdb*P);//根据该课程的名称,寻找选这课程的学生intretactivestudent(){returnactivestudnet;}//返回实际学生数intretmaxstudent(){return30;}//返回最多学生数voidclractivestudnet(){activestudnet=0;}//从文件中读出来后将实际学生数清零private:intmaxstudent;//最多学生数intactivestudnet;//实际学生数studentname*first;//学生名单floatcredit;//该课程的学分floataveragerusult;//该课程的平均成绩charkname[20];//该课程的名称};floatsubject::readcredit()//得到课程的学分{returncredit;}voidsubject::getcredit(floata)//设置学分{credit=a;}floatsubject::getaverage()//得到学生的平均成绩{floatk=0.0;studentname*p;p=first-Next;if(p==NULL)return0;while(p){k=k+p-result;p=p-Next;}returnk/activestudnet;}floatsubject::getresult(charN[])//查找某个学生的成绩{studentname*p;p=first;while(p){if(strcpy(p-tname,N)==0)returnp-result;p=p-Next;}return-1;}voidsubject::getkname(charN[])//读出课程的名称{strcpy(N,kname);}voidsubject::setkname(charN[])//读入课程的名称{strcpy(kname,N);}voidsubject::findstudent(studentdb*P)//根据该课程的名称,寻找选这课程的学生{studentname*newcode=newstudentname;newcode-Next=NULL;first=newcode;studentname*T=first;studentdb*K=P-Next;while(K){course*Y=K-stu.retroot();if(Y==NULL){K=K-Next;continue;}if(Y!=NULL)Y=Y-Next;while(Y){if(strcmp(Y-cname,kname)==0){studentname*Acode=newstudentname;charName[20];K-stu.getname(Name);strcpy(Acode-tname,Name);Acode-result=Y-grade;Acode-Next=T-Next;T-Next=Acode;activestudnet=activestudnet+1;break;}Y=Y-Next;}K=K-Next;}return;}voidtuichu(){system(cls);cout\n\n谢谢你使用选修课系统\n\nendl;cout\nyou'rewelcome!\nendl;getch();exit(-1);}//总菜单charmenu(){intk=0;chara[3],c,i;system(cls);coutendlendl;cout*******************************************\n**\n*学生选修课系统*\n**\n**\n*操作方式:*\n*1.选修课系统学生端*\n**\n*2.选修课系统管理端*\n**\n*******************************************\nendl;while(1){cout\n\t\t请选择登入方式:;cina;if(strlen(a)==1){for(i='1';i='2';i++){c=i;if(c==a[0])returnc;}}cerr\n\n\t\t\t\t输入有误!\nendl;k++;if(k2){system(cls);cerr\n\n\n\t\t~~提示~~:错误输入次数超过三次,你将被强制退出!!\n\nendl;cout\t\t按任意键继续endl;getch();tuichu();}}}//选修课系统端操作charcustom(){charA[10];charb;chari;intk=0;system(cls);;cout\n\n\n※※※※※※※※※※※※※※※※※※※※※※※※※※\n※选修课系统学生端※\n※※\n※操作方式:.※\n※1、学生选课※\n※2、学生情况※\n※3、选课情况※\n※4、退出系统※\n※※\n※※※※※※※※※※※※※※※※※※※※※※※※※※\nendl;while(1){cout\t\t\t请选择操作方式:;cinA;if(strlen(A)==1){for(i='1';i='4';i++){b=i;if(b==A[0])returnb;}}cerr\n\t\t\t\t输入有误!\nendl;k++;if(k2){system(cls);cerr\n\n\t\t\t~~提示~~:错误输入超过三次!你将被强制退出!!\nendl;cout\t\t按任意键继续endl;getch();tuichu();}}}charserver(){charA[10];charb;chari;intk=0;system(cls);;cout\n\n\n※※※※※※※※※※※※※※※※※※※※※※※※※\n※※\n※选修课系统管理端※\n※※\n※操作方式:※\n※1.增加学生2.增加课程※\n※3.删除学生4.删除课程※\n※5.填写成绩6.更改学分※\n※7.学生情况8.选课情况※\n※9.保存数据0.退出系统※\n※※\n※※※※※※※※※※※※※※※※※※※※※※※※※\nendl;while(1){cout\t\t请选择操作方式:;cinA;if(strlen(A)==1){for(i='0';i='9';i++){b=i;if(b==A[0])returnb;}}cerr\n\t\t\t\t输入有误!\nendl;;k++;if(k2){cerr错误输入超过三次!\n;exit(-1);}}}//密码检查voidpassword(){intk=0,i;charA[]=admin;charB[10];chara;system(cls);for(i=0;i8;