1、目 录一、需求分析3二、程序的主要功能4三、程序运行平台5四、系统总框架图5五、程序类的说明6六、模块分析8七、比较有特色的函数9八、存在的不足与对策12九、程序源代码1324一、需求分析 学籍管理现状1、 目前国内大中专院校众多,在校的学生人数占据了社会人口很大一部分,是社会群体中的新生力量;2、 对学生学籍的管理是各大院校日常管理中不可忽视的一个重要环节;3、 随着计算机等高新科技的发展,对学籍的管理早已不能仅仅满足于纸质文件。因此,开发出一套计算机学生学籍管理系统显得很有必要。 本系统存在的价值1、 满足了各大院校对学籍管理的强烈要求;2、 力图用最少的代码完成最多的功能,代码简洁没有冗
2、余;3、 系统操作简便明了,根据提示即可进行简便常用的日常学籍管理;4、 占用资源少、需求大、简便易操作,多彩的可视化界面。综合以上众多优势,证明了本系统存在的价值。 选择C+的理由C+为了解决程序设计的复杂性,美国贝尔实验室于1980年开始研制一种“带类”的C,到1983年才正式命名为C+。C+语言吸收了C和Simula 67的精髓,具有C无可比拟的优越性。C+结构清晰、易于维护、已于拓展,同时又不失效率。(节选自C+简明教程(皮德常),电子工业出版社)综合以上优点,我们选定C+为本次系统的程序设计语言。二、程序的主要功能 显示全部学生信息显示全部学生的学生信息。包括学号、姓名、电话、住址、
3、绩点、奖惩信息、学生证预约记录等 查找指定信息通过输入学号,查找并输出指定学生的全部信息 开具学籍证明通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出 学生证预约登记记录指定学生的学生证预约登记记录 奖惩信息录入记录指定学生的奖惩信息记录 按学号排序后输出按学号排序后输出到屏幕,并保存到PeoInfo.txt文件 按绩点高低排序输出按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件 清除数据文件清除PeoInfo.txt文件中的全部信息 学生信息更新/修改通过学号更新/修改该学生的信息 作者&版权信息显示作者及课设的相关信息三、程序运行平台Micro
4、soft Visual C+ 6.0四、系统总框架图(图4-1)(图4-2)五、程序类的说明 Stu类的说明class Stu /父类,公用类protected:Info *person;fstream people; /创建二进制文件public:Stu();virtual Info *SearNum(char *)=0; /按学号查找学生信息,纯虚函数bool operator(const Info *); /比较成绩高低,重载运算符 friend void InputOne(Info *p1); /友元函数void creat(); /创建链表Stu(); Show类的说明class S
5、how:public Stu /Stu的子类,显示模块,抽象类public:void ShowOne(Info *); /显示指定的学生信息 void ShowAll(); /显示所有学生的信息Info *SearNum(char *);void ListNum(); /按学号排序输出 void ListMark(); /按绩点高低排序输出; Manage类的说明class Manage:public Show /Show的子类,管理模块,多重继承public:Info *SearNum(char *);void Apply(char *); /学籍证明void Book(char *); /
6、学生证预约void Change(char *); /信息更新/修改void GoodBad(char *); /奖惩情况录入 ; WrongIn类的说明class WrongIn /用于捕捉输入异常 ;六、模块分析 显示模块显示全部学生的学生信息。包括学号、姓名、电话、住址、绩点、奖惩信息、学生证预约记录等 查找模块通过输入学号,查找并输出指定学生的全部信息 管理模块1、开具学籍证明。通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出;2、学生证预约登记。记录指定学生的学生证预约登记记录;3、奖惩信息录入。记录指定学生的奖惩信息记录;4、学生信息更新/修改。通过
7、学号更新/修改该学生的信息; 输出模块1、按学号排序后输出。按学号排序后输出到屏幕,并保存到PeoInfo.txt文件;2、按绩点高低排序输出。按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件; 清除模块清除PeoInfo.txt文件中的全部信息 作者&版权信息模块显示作者及课设的相关信息七、比较有特色的函数 纯虚函数SearNumvirtual Info *SearNum(char *)=0; /按学号查找学生信息,纯虚函数 Creat函数void Student:creat() /创建链表Info *head;Info *p1,*p2;int n=0;char GoOn=Y;
8、p1=p2=new Info;InputOne(p1);people.write(char *)p1, sizeof(*p1); /二进制输出文件head=NULL;while(GoOn=Y|GoOn=y)n+;if(n=1) head=p1;else p2-next=p1;p2=p1; system(COLOR 1e);cout GoOn; cin.ignore();if(GoOn!=Y & GoOn!=y) /判断输入是否结束people.close(); break;p1=new Info;InputOne(p1); people.write(char *)p1, sizeof(*p1)
9、;p2-next=NULL;person=head;该函数通过指针和链表,动态存储学生信息,并保存到文件中 SearNum函数Info *Student:SearNum(char *a) /按学号查找学生信息system(COLOR 3d);Info *p;cout num,a)=0)ShowOne(p);return p;record=true;p=p-next;if(!record)cout 运算符重载函数bool Student:operator (const Info *right)if(person-mark right-mark)return true;else return fa
10、lse;该函数重载了运算符,便于直接比较两结构体所存储数据的绩点高低 ListNum函数void Student:ListNum() /按学号排序输出Info *p1,*p2,*temp,*now;int i=0;system(COLOR 3f);cout next;while(p2 & i+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;t
11、emp-next=p1;p1=temp;now=now-next;p1=now;p2=now-next;fstream listnum;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 结构体,在类内部用结构体+链表的方式存储学生的信息 文件写入的问题描述:用普通文件存储学生信息显得较为复杂,数据录入较为繁琐,不便于操作。对策:采用二进制文件的方式,整块录入结构体数据文件。方便、快捷。 链表排序问题描述:对链表的操作掌握的不够熟练,对创建好的链表进行排序时显得手足无措,不能善于利用指针。对策:参考相关书籍,请教老师等。 程序细节问题描述:由于首次进行比较大规模的程序设计,程序中的很多输入输出细节没有注意到,导致某些格式不统一。对策:小组成员轮流校对程序,发现问题并改进。九、程序源代码另附:1、程序单文件原始代码“学生学籍管理_单文件代码.cpp
13、”; 2、多文件组织后的“学生学籍管理_多文件组织”工程文件夹。/* 本程序应用了: 布尔类型 格式化输入输出 cin.getline() 引用作为函数参数函数重载 内存的动态分配二进制文件 结构体指针构造函数 析构函数静态数据成员 函数覆盖纯虚函数 抽象类 友元函数 运算符重载继承和多重继承 异常处理通过链表动态存储数据 多文件组织 等C+的特色功能*/#include using namespace std;#include#includestruct Info char num20; /学号char name8; /姓名char phone12; /电话char adres40; /住址
14、 float mark; /绩点 char other100; /奖惩信息char book; /学生证预约 Info *next;static int N; /记录信息的条数,静态变量class Stu /父类,公用类protected:Info *person;fstream people; /创建二进制文件public:Stu();virtual Info *SearNum(char *)=0; /按学号查找学生信息,纯虚函数bool operator(const Info *); /比较成绩高低,重载运算符 friend void InputOne(Info *p1); /友元函数vo
15、id creat(); /创建链表Stu();class Show:public Stu /Stu的子类,显示模块,抽象类public:void ShowOne(Info *); /显示指定的学生信息 void ShowAll(); /显示所有学生的信息Info *SearNum(char *);void ListNum(); /按学号排序输出 void ListMark(); /按绩点高低排序输出;class Manage:public Show /Show的子类,管理模块,多重继承public:Info *SearNum(char *);void Apply(char *); /学籍证明v
16、oid Book(char *); /学生证预约void Change(char *); /信息更新/修改void GoodBad(char *); /奖惩情况录入 ;class WrongIn /用于捕捉输入异常 ;Stu:Stu()N=0; person=new Info; /内存动态分配people.open(PeoInfo.txt,ios:out | ios:binary);if(people.fail()cout创建文件PeoInfo.txt出错! n ; exit(0);Stu:Stu()people.close();void InputOne(Info *p1) /输入一个学生信
17、息system(COLOR 3f);cout n请输入下面的数据!n ; cout num,20); cout name,8); cout phone,12);cout adres,40); cout p1-mark; cin.ignore(); /略过换行符 cout other,100);cout p1-book; cin.ignore();N+;void Show:ShowOne(Info *p) /显示指定的学生信息system(COLOR 3f);cout =nn;cout 学号: num endl; cout 姓名: name endl; cout 电话: phone endl;c
18、out 住址: adres endl; cout 绩点: mark endl; cout 备注: other endl;cout 学生证预约办理Y/N: book endl;cout next=p1;p2=p1; system(COLOR 1e);cout GoOn; cin.ignore();if(GoOn!=Y & GoOn!=y) /判断输入是否结束people.close(); break;p1=new Info;InputOne(p1); people.write(char *)p1, sizeof(*p1);p2-next=NULL;person=head;Info *Show:S
19、earNum(char *a) /按学号查找学生信息system(COLOR 3d);Info *p;cout num,a)=0)ShowOne(p);return p;record=true;p=p-next;if(!record)cout 没有查找到相关数据!n;return NULL;Info *Manage:SearNum(char *a) /按学号查找学生信息system(COLOR 3d);Info *p;cout num,a)=0)ShowOne(p);return p;record=true;p=p-next;if(!record)cout 没有查找到相关数据!n;return
20、 NULL;void Show:ShowAll() /显示所有学生的信息 char again; fstream showAll;system(COLOR 1e);cout nn* 下面显示所有学生的信息 *n ; showAll.open(PeoInfo.txt,ios:in | ios:binary); if(showAll.fail()cout打开文件PeoInfo.txt出错! n ; exit(0); showAll.read(char *)person, sizeof(*person);while( !showAll.eof() cout 学号: num endl; cout 姓名
21、: name endl; cout 电话: phone endl;cout 住址: adres endl; cout 绩点: mark endl; cout 备注: other endl;cout 学生证预约办理Y/N: book endl; cout n请按回车键,显示下一条信息!n; cin.get(again);showAll.read(char *)person,sizeof(*person); cout显示完毕!n;showAll.close();void Manage:Apply(char *a) /开具学籍证明Info *p;p=SearNum(a);system(COLOR 2
22、e); fstream apply;apply.open(Apply.txt,ios:out);cout =nn;cout 证 明 n;cout name 同学(学号:num),系我校在校学生。n;cout 特此证明。nn;cout 南京航空航天大学nn;cout =n;cout endl 已按上述格式保存到Apply.txt文件中!n;apply =nn;apply 证 明 n;apply name 同学(学号:num),系我校在校学生。n;apply 特此证明。nn;apply 南京航空航天大学nn;apply book=Y;system(COLOR 3e);cout =nn;cout 预
23、约信息已记录!请尽快提交相关证明!nn;cout =n;void Manage:GoodBad(char *a) /学生奖惩情况录入功能Info *p;p=SearNum(a);system(COLOR 5e);cout =nn;cout p-other;fstream GoodBad;GoodBad.open(PeoInfo.txt,ios:out | ios:binary); p=person;while(p)GoodBad.write(char *)p, sizeof(*p);p=p-next; GoodBad.close();cout 奖惩情况录入完毕!感谢使用nn;cout (con
24、st Info *right) /运算符重载if(person-mark right-mark)return true;else return false;void Show:ListNum() /按学号排序输出Info *p1,*p2,*temp,*now;int i=0;system(COLOR 3f);cout next;while(p2 & i+num,p1-num)0 & p1=person) /插入到头结点之前temp=p2;p2=temp-next; /在原链表中删除p2的信息person=temp;temp-next=p1; /p2插入到最前 if(strcmp(p2-num,
25、p1-num)0)temp=p2;p2=temp-next;temp-next=p1;p1=temp;now=now-next;p1=now;p2=now-next;fstream listnum;listnum.open(PeoInfo.txt,ios:out | ios:binary); p1=person;while(p1)listnum.write(char *)p1, sizeof(*p1);p1=p1-next; listnum.close();ShowAll();void Show:ListMark() /按绩点高低排序输出Info *p1,*p2,*temp,*now;int
26、i=0;system(COLOR 3f);cout next;now=person;while(p2!=NULL & i+p1 & p1=person) /插入到头结点之前temp=p2;p2=temp-next; /在原链表中删除p2的信息person=temp;temp-next=p1; /p2插入到最前 if(p2p1)temp=p2;p2=temp-next;temp-next=p1;p1=temp;now=now-next;p1=now;p2=now-next;fstream listnum;listnum.open(PeoInfo.txt,ios:out | ios:binary)
27、; p1=person;while(p1)listnum.write(char *)p1, sizeof(*p1);p1=p1-next; listnum.close();ShowAll(); void Manage:Change(char *a) /学生信息更新/修改Info *p;system(COLOR 4e);p=SearNum(a);cout =nn;cout 请输入该同学更新/修改后的信息:n; cout 学号: num endl; cout name,8); cout phone,12);cout adres,40); cout p-mark; cin.ignore(); /略过
28、换行符 cout other,100);cout p-book; cin.ignore();fstream Change;Change.open(PeoInfo.txt,ios:out | ios:binary); p=person;while(p)Change.write(char *)p, sizeof(*p);p=p-next; Change.close();cout 该同学信息更新/修改完毕!感谢使用nn;cout =n;void main()system(COLOR 1e);Info *p; Manage manage;Show show;int want;char use=Y;ch
29、ar sear20; cout 【欢迎使用学生学籍管理系统】n请先录入要管理的学生信息n;show.creat();cout n学生信息已正常录入,并保存到PeoInfo.txt文件中n;while(use=y | use=Y)cout n*学生学籍管理系统*n; cout 请输入要使用功能的数字代码n; cout 【 1】 显示全部学生信息n; cout 【 2】 查找指定信息n; cout 【 3】 开具学籍证明n; cout 【 4】 学生证预约登记n; cout 【 5】 奖惩信息录入n; cout 【 6】 按学号排序后输出n; cout 【 7】 按绩点高低排序输出n; cout 【 8】 清除数据文件n;