VC++课程设计---高校学籍管理系统源程序一、课程设计题目:学籍管理系统二、目的与要求:1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。2、基本要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;(2)要求在设计的过程中,建立清晰的类层次;(3)在系统的设计中,至少要用到面向对象的一种机制。3、创新要求:在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。4、写出设计说明书三、设计方法和基本原理:1、功能要求要求完成以下功能:1)能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。2)能够将指定的信息从文件中删除。3)能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。4)可以统计全部学生的总成绩,及其在班上的排名。5)能够统计各科的平均成绩及及格率。6)要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。7)如果检索不到相应的信息应提示用户。2、问题的解决方案:根据系统功能要求,可以将问题解决分为以下步骤:a)写出需求分析(做什么)b)分析系统中的各个实体之间的关系及其属性和行为;c)根据问题描述,设计系统的类层次;d)完成类层次中各个类的描述(包括属性和方法);e)完成类中各个成员函数的定义;f)用户界面的设计g)分析系统功能模块(系统流程图)h)代码编写i)功能调试;j)完成系统总结报告以及系统使用说明书。源程序代码如下:[code]/*course.dat-课程列表(只读)student.dat-学生信息*/#includefstream.h#includeiomanip.h#includestring.h#includectype.hclassCOURSE//课程类{private:staticintcoursenum;//课程数量staticchar(*coursename)[20];//课程名称public:staticvoidLoadCourse()//从文件COURSE.DAT装入课程信息{ifstreamf(course.dat);fcoursenum;coursename=newchar[coursenum][20];for(inti=0;icoursenum;i++)fcoursename;f.close();}friendclassSTUDENT;friendclassCOLLEGE;};intCOURSE::coursenum=0;char(*COURSE::coursename)[20]=0;classSTUDENT//学生类{private:charnum[20];//学号charname[20];//姓名charsex;//性别charcname[20];//班级float*grade;//成绩(动态数组)floatsum;//各科总分STUDENT*next;public:STUDENT(){grade=newfloat[COURSE::coursenum];next=0;}~STUDENT(){delete[]grade;}voidInput(){sum=0;cout学号:;cinnum;//输入学生一般信息cout姓名:;cinname;cout性别:;cinsex;sex=toupper(sex);cout班级:;cincname;for(inti=0;iCOURSE::coursenum;i++)//输入学生各科成绩{coutCOURSE::coursename成绩:;cingrade;sum+=grade;//计算总分}}voidInput(ifstream&f){fnum;fname;fsex;sex=toupper(sex);fcname;for(inti=0;iCOURSE::coursenum;i++)//输出学生各科成绩,总分{fgrade;}fsum;}staticvoidOutputT(){coutsetw(10)学号setw(20)姓名setw(5)性别setw(10)班级;for(inti=0;iCOURSE::coursenum;i++)coutsetw(7)COURSE::coursename;coutsetw(10)总分endl;}voidOutput(){coutsetw(10)num;//输出学生一般信息coutsetw(20)name;coutsetw(5)sex;coutsetw(10)cname;for(inti=0;iCOURSE::coursenum;i++)//输出学生各科成绩,总分{coutsetw(7)grade;}coutsetw(10)sumendl;}voidOutput(ofstream&f){fsetw(10)num;//输出学生一般信息fsetw(20)name;fsetw(5)sex;fsetw(10)cname;for(inti=0;iCOURSE::coursenum;i++)//输出学生各科成绩,总分{fsetw(7)grade;}fsetw(10)sumendl;}friendclassCOLLEGE;};classCOLLEGE//学校类{private:STUDENT*SL;//学生链表voidClear();intFind(char*ID,STUDENT**p1,STUDENT**p2);voidCOLLEGE::ValueS2ToS1(STUDENT&s1,STUDENT&s2);public:COLLEGE(){COURSEadCourse();//装入课程信息SL=newSTUDENT();//创建学生链表表头结点}~COLLEGE(){STUDENT*p=SL;//删除学生链表各个结点while(p){SL=p-next;deletep;p=SL;}}voidSet();//课程设置(增,删,改,存)voidAdd();//增加学生voidDelete();//删除学生voidModify();//修改学生voidQuery();//查询学生信息(按姓名,学号)voidPrint();//输出所有学生信息voidStat();//统计课程平均成绩,课程合格率voidSumSort();//按总分排名(高-低)voidNumSort();//按学号排序(低-高)voidSave();//学生数据存盘voidLoad();//装入学生数据};//增加学生voidCOLLEGE::Add(){cout\n**增加学生信息**\n;STUDENT*p=newSTUDENT;//创建1个新学生结点STUDENT*p2=SL;//查找学生链表表尾结点while(p2-next)p2=p2-next;p2-next=p;//链接学生结点p-Input();//输入学生信息}//查找学生结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)intCOLLEGE::Find(char*ID,STUDENT**p1,STUDENT**p2){*p1=SL-next;*p2=SL;while(*p1){if(strcmp((*p1)-num,ID)==0)break;//找到else{*p2=*p1;//继续查找*p1=(*p1)-next;}}return*p1?1:0;}//删除学生voidCOLLEGE:elete(){cout\n**删除学生**\n;charNo[20];STUDENT*p1,*p2;cout学号:;cinNo;if(!Find(No,&p1,&p2)){cout指定的学生没有找到!\n;}else{p2-next=p1-next;//连接deletep1;cout正确删除!\n;}}//修改学生voidCOLLEGE::Modify(){cout\n**修改学生**\n;charNo[20];STUDENT*p1,*p2;cout学号:;cinNo;if(!Find(No,&p1,&p2)){cout指定的学生没有找到!\n;}else{p1-Output();//输出原来的学生信息(做提示)p1-Input();//输入此学生信息(更新)cout修改完成!\n;}}/*承上*///查询学生信息//按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示.voidCOLLEGE:uery(){cout\n**查询学生**\n;STUDENT*p=SL-next;charNo[20];charName[20];charch;do{cout按学号查1,按姓名查2:;cinch;}while(ch!='1'&&ch!='2');intflag=0;//未找到0,找到1if(ch=='1')//按学号查{cout学号:;cinNo;while(p)if(strcmp(p-num,No)==0){flag=1;break;}elsep=p-next;}else//按姓名查{cout姓名:;cinName;while(p)if(strcmp(p-name,Name)==0){flag=1;break;}elsep=p-next;}if(flag==1)//如果找到,显示此同学信息{p-OutputT();p-Output();}else//否则给出未找到提出cout指定的学生没有找到!\n;}//输出所有学生信息voidCOLLEGE:rint(){cout\n**输出学生信息**\n;STUDENT*p=SL-next;STUDENT::OutputT();//输出标题while(p)//循环输出各位学生信息{p-Output();p=p-next;}}//学生数据存盘voidCOLLEGE::Save(){ofstreamf(student.dat);STUDENT*p=SL-next;while(p)//遍历学生链表{p-Output(f);//写入文件p=p-next;}f.close();cout\n**保存数据完成!**\n;}voidCOLLEGE::Clear(){STUDENT*p=SL-next;while(p){SL-next=p-next;deletep;p=SL-next;}}//装入学生数据voidCOLLEGEad(){Clear();ifstreamf(student.dat);STUDENT*p=SL;STUDENT*p2=newSTUDENT;p2-Input(f);while(f){p-next=p2;p=p-next;p2=newSTUDENT;p2-Input(f);}deletep2;f.close();}//统计课程平均成绩,课程合格率voidCOLLEGE::Stat(){float*sum=newfloat[COURSE::coursenum];//各科平均成绩float*pass=newfloat[COURSE::coursenum];//各科合格人数,/n=合格率intn=0;//学生人数for(inti=0;iCOURSE::coursenum;i++){STUDENT*p=SL-next;n=0;sum=pass=0;while(p)//遍历学生链表{n++;//人数sum=sum+p-grade;//某科总分if(p-grade=60)pass++;//某科合格人数p=p-next;}}for(i=0;