1南京航空航天大学《C++程序设计语言》课程设计报告学生学籍管理系统小组成员:081110310曲健指导教师:陈丹完成日期:二○一二年四月十八日2目录一、需求分析...............................................................................................3二、程序的主要功能..................................................................................4三、程序运行平台......................................................................................5四、系统总框架图......................................................................................5五、程序类的说明......................................................................................6六、模块分析...............................................................................................8七、比较有特色的函数..............................................................................9八、存在的不足与对策............................................................................12九、程序源代码.........................................................................................133一、需求分析学籍管理现状1、目前国内大中专院校众多,在校的学生人数占据了社会人口很大一部分,是社会群体中的新生力量;2、对学生学籍的管理是各大院校日常管理中不可忽视的一个重要环节;3、随着计算机等高新科技的发展,对学籍的管理早已不能仅仅满足于纸质文件。因此,开发出一套计算机学生学籍管理系统显得很有必要。本系统存在的价值1、满足了各大院校对学籍管理的强烈要求;2、力图用最少的代码完成最多的功能,代码简洁没有冗余;3、系统操作简便明了,根据提示即可进行简便常用的日常学籍管理;4、占用资源少、需求大、简便易操作,多彩的可视化界面。综合以上众多优势,证明了本系统存在的价值。选择C++的理由C++为了解决程序设计的复杂性,美国贝尔实验室于1980年开始研制一种“带类”的C,到1983年才正式命名为C++。C++语言吸收了C和Simula67的精髓,具有C无可比拟的优越性。C++结构清晰、易于维护、已于拓展,同时又不失效率。(节选自《C++简明教程》(皮德常),电子工业出版社)综合以上优点,我们选定C++为本次系统的程序设计语言。4二、程序的主要功能显示全部学生信息显示全部学生的学生信息。包括学号、姓名、电话、住址、绩点、奖惩信息、学生证预约记录等查找指定信息通过输入学号,查找并输出指定学生的全部信息开具学籍证明通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出学生证预约登记记录指定学生的学生证预约登记记录奖惩信息录入记录指定学生的奖惩信息记录按学号排序后输出按学号排序后输出到屏幕,并保存到PeoInfo.txt文件按绩点高低排序输出按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件清除数据文件清除PeoInfo.txt文件中的全部信息学生信息更新/修改通过学号更新/修改该学生的信息作者&版权信息显示作者及课设的相关信息5三、程序运行平台MicrosoftVisualC++6.0四、系统总框架图(图4-1)(图4-2)6五、程序类的说明Stu类的说明classStu//父类,公用类{protected:Info*person;fstreampeople;//创建二进制文件public:Stu();virtualInfo*SearNum(char*)=0;//按学号查找学生信息,纯虚函数booloperator(constInfo*);//比较成绩高低,重载运算符friendvoidInputOne(Info*p1);//友元函数voidcreat();//创建链表~Stu();};Show类的说明classShow:publicStu//Stu的子类,显示模块,抽象类{public:voidShowOne(Info*);//显示指定的学生信息voidShowAll();//显示所有学生的信息Info*SearNum(char*);voidListNum();//按学号排序输出voidListMark();//按绩点高低排序输出};Manage类的说明classManage:publicShow//Show的子类,管理模块,多重继承{public:Info*SearNum(char*);voidApply(char*);//学籍证明7voidBook(char*);//学生证预约voidChange(char*);//信息更新/修改voidGoodBad(char*);//奖惩情况录入};WrongIn类的说明classWrongIn//用于捕捉输入异常{};8六、模块分析显示模块显示全部学生的学生信息。包括学号、姓名、电话、住址、绩点、奖惩信息、学生证预约记录等查找模块通过输入学号,查找并输出指定学生的全部信息管理模块1、开具学籍证明。通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出;2、学生证预约登记。记录指定学生的学生证预约登记记录;3、奖惩信息录入。记录指定学生的奖惩信息记录;4、学生信息更新/修改。通过学号更新/修改该学生的信息;输出模块1、按学号排序后输出。按学号排序后输出到屏幕,并保存到PeoInfo.txt文件;2、按绩点高低排序输出。按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件;清除模块清除PeoInfo.txt文件中的全部信息作者&版权信息模块显示作者及课设的相关信息9七、比较有特色的函数纯虚函数SearNumvirtualInfo*SearNum(char*)=0;//按学号查找学生信息,纯虚函数Creat函数voidStudent::creat()//创建链表{Info*head;Info*p1,*p2;intn=0;charGoOn='Y';p1=p2=newInfo;InputOne(p1);people.write((char*)p1,sizeof(*p1));//二进制输出文件head=NULL;while(GoOn=='Y'||GoOn=='y'){n++;if(n==1)head=p1;elsep2-next=p1;p2=p1;system(COLOR1e);cout是否继续输入?Y/N:;cinGoOn;cin.ignore();if(GoOn!='Y'&&GoOn!='y')//判断输入是否结束{people.close();break;}p1=newInfo;InputOne(p1);people.write((char*)p1,sizeof(*p1));}p2-next=NULL;person=head;}——该函数通过指针和链表,动态存储学生信息,并保存到文件中10SearNum函数Info*Student::SearNum(char*a)//按学号查找学生信息{system(COLOR3d);Info*p;cout开始按学号查找!\n;p=person;boolrecord=false;while(p!=NULL&&!record){if(strcmp(p-num,a)==0){ShowOne(p);returnp;record=true;}p=p-next;}if(!record)cout没有查找到相关数据!\n;}——该函数通过链表查找数据,运用了布尔类型运算符重载函数boolStudent::operator(constInfo*right){if(person-markright-mark)returntrue;elsereturnfalse;}——该函数重载了运算符,便于直接比较两结构体所存储数据的绩点高低ListNum函数voidStudent::ListNum()//按学号排序输出{Info*p1,*p2,*temp,*now;inti=0;system(COLOR3f);cout开始按学号排序!\n;now=person;11p1=person;p2=person-next;while(p2&&i++=N){if(strcmp(p2-num,p1-num)0&&p1==person)//插入到头结点之前{temp=p2;p2=temp-next;//在原链表中删除p2的信息person=temp;temp-next=p1;//p2插入到最前}if(strcmp(p2-num,p1-num)0){temp=p2;p2=temp-next;temp-next=p1;p1=temp;}now=now-next;p1=now;p2=now-next;}fstreamlistnum;listnum.open(PeoInfo.txt,ios::out|ios::binary);p1=person;while(p1){listnum.write((char*)p1,sizeof(*p1));p1=p1-next;}listnum.close();ShowAll();}——运用链表和指针按学号大小排序全部学生信息12八、存在的不足与对策类对象中的信息存储问题描述:类对象中用数组存储所有学生的信息,显得较为复杂,不方便管理和操作。在数据的处理时造成一定的麻烦。对策:类外部定义Info结构体,在类内部用结构体+链表的方式存储学生的信息文件写入的问题描述:用普通文件存储学生信息显得较为复杂,数据录入较为繁琐,不便于操作。对策:采用二进制文件的方式,整块录入结构体数据文件。方便、快捷。链表排序问题描述:对链表的操作掌握的不够熟练,对创建好的链表进行排序时显得手足无措,不能善于利用指针。对策:参考相关书籍,请教老师等。程序细节问题描述:由于首次进行比较大规模的程序设计,程序中的很多输入输出细节没有注意到,导致某些格式不统一。对策:小组成员轮流校对程序,发现问题并改进。13九、程序源代码另附:1、程序单文件原始代码“学生学籍管理_单文件代码.cpp”;2、多文件组织后的“学生学籍管理_多文件组织”工程文件夹。/*本程序应用了:布尔类型格式化输入输出cin.getline()引用作为函数参数函数重载内存的动态分配二进制文件结构体指针构造函数析构函数静态数据成员函数覆盖纯虚函数抽象类友元函数运算符重载继承和多重继承异常处理通过链表动态存储数据多文件组织等C++的特色功能*/#includeiostreamusingnamespacestd;#includefstream#includestdlib.hstructInfo{charnum[20];//学号charname[8];//姓名charphone[12];//电话charadres[40];//住址floatmark;//绩点charother[100];//奖惩信息