C++实现学生选课系统
本文实例为大家分享了C++实现学生选课系统的具体代码,供大家参考,具体内容如下
#include#include #include #include #include usingnamespacestd; structSubList/*某个学生所学的课程中的某一个*/ { intnum;/*课程代号*/ SubList*next;/*指向下一个课程的指针*/ SubList():num(-1),next(NULL){}/*构造函数*/ }; structStuList/*课程中所选的学生*/ { intnum;/*学生的学号*/ floatscore;/*学生所得的该课程分数*/ StuList*next;/*下一个学生*/ StuList():num(-1),score(0),next(NULL){} }; classStudent { private: intNum;/*学号*/ charName[20];/*学生的姓名*/ intMaxSubNum;/*学生最多可以学五门课程*/ intFactSubNum;/*学生实际所学的课程数目*/ SubList*Root;/*课程的指针*/ floatSumXueFen;/*总的选课学分*/ floatFactXueFen;/*实际获得学分*/ floatSumGrade;/*总成绩*/ boolUpdate;/*是否需要更新信息*/ public: Student*next;/*让所有学生的信息连接起来*/ SubList*GetSubPtr()const{returnRoot;}/*获取所选的课程表*/ Student():Update(false),Root(newSubList()),FactXueFen(0),MaxSubNum(5),FactSubNum(0),SumXueFen(0),SumGrade(0),next(NULL){} voidSetName(charN[]){strcpy(Name,N);}/*设置学生的姓名*/ voidSetNum(intnum){Num=num;}/*设置学号*/ constchar*GetName()const{returnName;}/*得到学生的姓名*/ intGetNum()const{returnNum;}/*得到学号*/ intGetFactSubNum()const{returnFactSubNum;}/*得到实际选课数*/ boolFindSub(intnum)const;/*查找是否已有此课程,如果有返回,如果没有返回*/ voidSetInfo(floatsumXueFen,floatfactXueFen,floatsumGrade) { SumXueFen=sumXueFen;/*这三条信息因为一起用所以一起设置了*/ FactXueFen=factXueFen; SumGrade=sumGrade; } voidSetUpdate(boolt){Update=t;}/*是否更新信息的标志*/ floatGetAveGrade(){returnSumGrade/FactSubNum;}/*学生课程的平均成绩*/ voidAddSub(intnum);/*增加课程*/ boolIsFull()const{returnMaxSubNum==FactSubNum;} voidShowStuInfo();/*输出学生信息*/ voidDelSub(intnum);/*删除课程Manage类使用*/ ~Student()/*析构函数不要也行影响不太大一般程序,还不太会内存用完*/ { SubList*p=Root; while(p) { SubList*t=p->next; deletep; p=t; } } }; //课程类 classSubject { private: intMaxStuNum;/*最多学生数*/ intFactStuNum;/*实际学生数*/ floatCredit;/*该课程的学分*/ charName[20];/*该课程的名称*/ intNum;/*课程的代号*/ StuList*Root;/*学生名单*/ floatAveGrade;/*该课程的平均成绩*/ boolUpdate;/*是否更新信息*/ public: StuList*GetStuPtr()const{returnRoot;}/*获取选此课程的学生表*/ Subject*next; Subject():Root(newStuList()),MaxStuNum(30),FactStuNum(0),Update(false),next(NULL){} floatGetCredit()const{returnCredit;}//得到课程的学分 voidSetCredit(floatcredit){Credit=credit;}//设置学分 constchar*GetName()const{returnName;}//读出课程的名称 voidSetName(charN[]){strcpy(Name,N);}//设置课程的名称 intGetNum()const{returnNum;}//读出课程的代号 voidSetNum(intnum){Num=num;}//设置课程的代号 intGetFactStuNum()const{returnFactStuNum;}//返回实际学生数 intGetMaxStuNum()const{returnMaxStuNum;}//最大学生数 voidSetUpdate(boolt){Update=t;} voidSetAveGrade(floatnum){AveGrade=num/FactStuNum;}//设置平均分 floatGetAveGrade(){returnAveGrade;}//得到学生的平均成绩 floatGetStuScore(intnum);//查找某个学生的成绩 boolIsFull()const{returnMaxStuNum==FactStuNum;}//是否人数已满 voidDelStu(intnum);//删除学生 voidAddStu(intnum);//增加学生 ~Subject() { StuList*p=Root; while(p) { StuList*t=p->next; deletep; p=t; } } }; floatSubject::GetStuScore(intnum) { StuList*p=Root->next; while(p->num!=num) p=p->next; returnp->score; } voidStudent::ShowStuInfo() { cout< next; while(!t&&p) { if(p->num==num) t=true; p=p->next; } returnt; } voidStudent::AddSub(intnum)//给学生增加一门课 { SubList*s=newSubList(),*p=Root; while(p->next) p=p->next; p->next=s; s->num=num; FactSubNum++; Update=true; } voidStudent::DelSub(intnum) { SubList*p=Root,*t; while(p->next->num!=num) p=p->next; t=p->next; p->next=t->next; FactSubNum--; Update=true; deletet; } //////////////////////////Subject////////////////////////////////// voidSubject::AddStu(intnum)// { StuList*s=newStuList(),*p=Root; while(p->next) p=p->next; p->next=s; s->num=num; FactStuNum++; Update=true; } voidSubject::DelStu(intnum) { StuList*p=Root,*t; while(p->next->num!=num) p=p->next; t=p->next; p->next=t->next; FactStuNum--; Update=true; deletet; } ////////////////////////////////////////////////////////// classManage { private: Student*StuRoot; Subject*SubRoot; boolUpdate; public: Manage():StuRoot(newStudent()),SubRoot(newSubject()),Update(false){} Manage(constManage&p){} voidAddStu(); voidAddSub(); Student*FindStu(intnum); Subject*FindSub(intnum); intShowSub()const;//显示可选课程 intShowStu()const; voidShowStuSubInfo(Student*p); voidDelStu(Student*p); voidDelSub(Subject*p); voidStart(); intmenu(); intcustom(); intserver(); Student*password1(); boolpassword2(); voidmenu_1_1(Student*p); voidmenu_2_1(); voidmenu_2_2(); voidmenu_2_3(); voidmenu_2_4(); voidmenu_2_5(); voidmenu_2_6(); voidmenu_2_7(); voidmenu_2_8(); voidmenu_2_9(); voidIsUpdate() { if(Update==true) { Student*p=StuRoot->next; Subject*q=SubRoot->next; while(q) { floatsum=0; StuList*t=q->GetStuPtr()->next; while(t) { sum+=t->score; t=t->next; } q->SetAveGrade(sum); q->SetUpdate(false); q=q->next; } while(p) { floatsum=0,xuefen=0,xuefen1=0; SubList*t=p->GetSubPtr()->next; while(t) { Subject*tt=FindSub(t->num); xuefen+=tt->GetCredit(); floatf=tt->GetStuScore(p->GetNum()); sum+=f; if(f>=60) xuefen1+=tt->GetCredit(); t=t->next; } p->SetInfo(xuefen,xuefen1,sum); p->SetUpdate(false); p=p->next; } Update=false; } } }; voidManage::DelStu(Student*p) { SubList*l=p->GetSubPtr()->next; while(l) { FindSub(l->num)->DelStu(p->GetNum()); l=l->next; } Student*t=StuRoot; while(t->next!=p) t=t->next; t->next=p->next; deletep; Update=true; } voidManage::DelSub(Subject*p) { StuList*l=p->GetStuPtr()->next; while(l) { FindStu(l->num)->DelSub(p->GetNum()); l=l->next; } Subject*t=SubRoot; while(t->next!=p) t=t->next; t->next=p->next; deletep; Update=true; } intManage::ShowSub()const { Subject*p=SubRoot->next; intn=0; while(p) { cout< GetNum()<<""< GetName()<<"学分:"< GetCredit()< next; } returnn; } intManage::ShowStu()const { Student*p=StuRoot->next; intn=0; while(p) { cout< GetNum()<<""< GetName()< next; } returnn; } Student*Manage::FindStu(intnum) { Student*p=StuRoot->next; while(p) { if(p->GetNum()==num) break; p=p->next; } returnp; } Subject*Manage::FindSub(intnum) { Subject*p=SubRoot->next; while(p) { if(p->GetNum()==num) break; p=p->next; } returnp; } //总菜单 intManage::menu() { intk=0,n; while(1) { system("cls"); cout< >n; if(n>-1&&n<3) returnn; else { cerr<<"\n\n\t\t\t\t输入有误!\n"< >n; if(n>0&&n<5) returnn; else { cerr<<"\n\t\t\t\t输入有误!请重新输入\n"< >n; if(n>-1&&n<10) returnn; else { cerr<<"\n\t\t\t\t输入有误!\n"< >num; Student*p=FindStu(num); if(p==NULL) { cout<<"无此学号!!请重新输入"< GetName()< =3) { system("cls"); cerr<<"\n\n\t\t\t输入错误密码超过三次!请按任意键退出.."< >B; if(strcmp(A,B)==0) returntrue; else { k++; cerr<<"\n\n\t\t\t密码输入错误!请重新输入!\n"< ShowStuInfo();break;//学生情况 case3:ShowStuSubInfo(p);;break;//选课情况 } IsUpdate(); if(c==4)break;//退出系统 } if(p==NULL) n=0; } elseif(n==2) { boolt=password2(); while(t) { intc=server(); switch(c) { case1:menu_2_1();break;//增加学生 case2:menu_2_2();break;//增加课程 case3:menu_2_3();break;//删除学生 case4:menu_2_4();break;//删除课程 case5:menu_2_5();break;//填写成绩 case6:menu_2_6();break;//更改学分 case7:menu_2_7();break;//学生情况 case8:menu_2_8();break;//选课情况 case9:menu_2_9();break;//保存数据 } IsUpdate(); if(c==0)break;//退出系统 } if(!t) n=0; } } } //学生端功能函数 voidManage::menu_1_1(Student*p)//学生选课 { if(p->IsFull()) cout<<"你的课程已经选满了"< >num; if(p->FindSub(num)) cout<<"此课程你已经选择"< IsFull()) cout<<"课程人数已满"< AddSub(num); FindSub(num)->AddStu(p->GetNum()); cout<<"选课成功"< GetSubPtr()->next; cout< GetNum()<<""< GetName()<<"选课数"< GetFactSubNum()< num); cout<<"\t\t"< GetNum()<<""< GetName()<<""< GetCredit()< GetStuScore(p->GetNum()); cout<<"\t\t成绩"< next; } } //管理端功能函数 voidManage::menu_2_1()//增加学生 { system("cls"); intnum; charname[20]; cout<<"\n\n\t\t\t\t增加学生操作\n"< >num; if(FindStu(num)) cout<<"学生已经存在"< >name; Student*p=newStudent(); p->SetNum(num); p->SetName(name); Student*root=StuRoot; while(root->next) root=root->next; root->next=p; cout< >num; if(FindSub(num)) cout<<"\n\t\t此课程已经存在,按任意键继续"< >name; cout<<"请输入课程学分"< >credit; Subject*p=newSubject(); p->SetNum(num); p->SetName(name); p->SetCredit(credit); Subject*root=SubRoot; while(root->next) root=root->next; root->next=p; cout< >num; Student*p=FindStu(num); if(p==NULL) cout<<"无此学生"< >num; Subject*p=FindSub(num); if(p==NULL) cout<<"无此课程"< >num; Subject*p=FindSub(num); if(p==NULL) cerr<<"\n\t\t没有此课程!!请按任意键继续.."< GetNum()<<"课程名称"< GetName()<<"选课人数"< GetFactStuNum()< >n; if(n==1) { StuList*q=p->GetStuPtr()->next; while(q) { Student*l=FindStu(q->num); cout<<"\n\n\t\t请填写"< num<<""< GetName()<<"的学生成绩\n"< >q->score; l->SetUpdate(true); q=q->next; } p->SetUpdate(true); } } } Update=true; system("pause"); } voidManage::menu_2_6()//更改学分 { system("cls"); cout<<"\n\n\n\t\t\t\t更改学分操作\n"< >num; Subject*p=FindSub(num); if(p==NULL) cout<<"无此课程"< GetCredit()< >n; p->SetCredit(n); StuList*q=p->GetStuPtr()->next; while(q) { FindStu(q->num)->SetUpdate(true); q=q->next; } cout<<"\n\t\t更改课程学分成功,按任意键继续"< next; if(p==NULL) cout<<"无记录"< next; } system("pause"); } voidManage::menu_2_8()//选课情况 { system("cls"); cout<<"\n\n\t\t\t\t选课情况操作"< >num; Subject*p=FindSub(num); if(p==NULL) cout<<"\n\t\t无此课程!!\t请按任意键继续.."< GetNum()<<""< GetName()<<""< GetCredit()< GetMaxStuNum()<<""<<"实际人数"< GetFactStuNum()< GetStuPtr()->next; while(q) { cout< num<<""< num)->GetName()<<""< score< next; } } } system("pause"); } /*保存数据不过没有读取函数这个功能就没有读取懒的写了...*/ voidManage::menu_2_9() { Student*p=StuRoot->next; ofstreamo("Student.txt",32); ofstreamoo("SubList.txt",32); while(p) { SubList*t=p->GetSubPtr()->next; o.write(reinterpret_cast (p),sizeof(*p)); while(t) { oo.write(reinterpret_cast (t),sizeof(*t)); t=t->next; } p=p->next; } o.close(); oo.close(); Subject*q=SubRoot->next; o.open("Subject.txt",32); oo.open("StuList.txt",32); while(q) { StuList*t=q->GetStuPtr()->next; o.write(reinterpret_cast (q),sizeof(*q)); while(t) { oo.write(reinterpret_cast (t),sizeof(*t)); t=t->next; } q=q->next; } o.close(); oo.close(); cout<<"\n\n\n\t\t\t保存数据成功!按任意键继续.."< 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。