1、C+课程设计学生通讯管理系统课程设计报告一 课程设计目的及要求学生通讯系统学生通信录信息包括:姓名、学号、年龄、性别、家庭住址、联系电话、寝室号等信息。现要求编写程序来完成如下功能: 学生通信录信息的输入 学生的通信录信息删除和修改 学生的通信录信息查询和统计功能 学生的通信录信息输出显示。二 课程设计具体实现1总体设计学生通讯管理系统只修改学号管理员登陆系统普通用户登陆系统删除信息退出系统密码校验增加信息查找信息修改信息修改密码全部修改只修改姓名2详细设计在进行系统的各项功能介绍之前,有必要先说一下我所选的课程项设计的主要思路。这个系统的核心部分就是结构体链表,它贯穿整个程序。一切数据的增、
2、删、查、改都要以它为支撑。整个程序其实就是在操作一张很大的链表。我在15周时就已经开始考虑课程设计题目,当时是想先做一个关于面向过程的课题,立马就考虑的先用结构体链表做为数据的容器。而且已经做成型了。后来老师您把题目给改了,要求都用面向对象做,我是考虑过用vector或者是list来做数据的容器的,但想想程序几经初成型,就不改变容器了,就直接把类的对象做为结构体的数据部分,程序当然也有较大改动,但基本框架是没有变的。先来说链表的构造,在主菜单下选择功能之前,链表就已经认构造完毕,程序按行读取文本文件,每读一行,便对其进行分割。分割出来的字符串为学生类对象对应的每一项信息。在分割字符串时,我按字
3、符进行分割(当然,在数据存储时也是按行存储,且每项信息以分开),其关键代码如下:void read_info() /读取文件head=NULL;Student s; /构造学生类对象ifstream in(student_info.txt);string read;int no;while(getline(in,read) /按行读取no=0;int i;while(read.find_first_of()!=-1)string temp;i=read.find_first_of();temp=read.substr(0,i);if(no=0)s.name=temp; /赋予姓名if(no=1
4、)s.tel=temp; /赋予电话if(no=2)s.xuehao=temp;/赋予学号if(no=3)s.sex=temp; /赋予性别if(no=4)s.banji=temp; /赋予班级no+;read=read.substr(i+1);s.dizhi=read; /赋予地址if(s.name.size()0&s.xuehao.size()0) /判断学号与姓名是否为空insert_into_list(s); /插入链表in.close();void insert_into_list(Student st)struct list*curr,*ne;curr=(struct list*)
5、new(struct list); /申请空间curr-student=st;ne=head;if(head=NULL) /如果头指针为空插入第一条数据head=curr;curr-next=NULL;else while(ne-next!=NULL) ne=ne-next;/遍历结构体,直到尾ne-next=curr;curr-next=NULL;Txt文件才的储存形式如下:所以,能正确的读取所有数据在于字符串的分割,当然用此种方法读到的数据全是字符串,只是本系统为学生通讯系统,并不需要其他类型的数据,如有必要,字符串也可以转化。就这样,当文件按行读取完毕时,链表中的每个结构体都包含有一个不
6、同的学生类对象,至此,链表已初始化完毕。在程序接下来的运行过程中,对数据的操作就是直接操作链表的节点。下面对系统功能进行介绍:i. 登陆系统:通过欢迎界面后,将进入登陆方式选择界面,如图:ii. 若选择以普通用户身份登录系统,会出现以下界面:普通用户的功能包括:1.增加数据;2.查询数据;3.浏览数据;4.数据统计1) 增加数据功能的界面如下:用户根据系统提示,对单个学生信息进行逐项输入,按回车键结束输入。除姓名与学号外,其他信息只要直接按回车键就可以跳过输入,系统将保存为空。对信息的输入还要有一定的规范性,如学号与电话为纯数字;姓名长度最多只有四个字;性别若有,只能为男或女,系统会自动对输入
7、的信息进行校验,包括规范性校验与数据是否重复校验。若无法通过校验,数据不会保存。其关键代码如下: 规范性校验:bool Student:check_tel_xuehao() /学号与电话检查函数if(xuehao.size()=0) /如果学号为空,返回falsereturn false;if(!check_string(xuehao)|!check_string(tel) /如果学号中处在数字以外的字符,返回falsecout学号或电话输入有误!endl;return false;return true;bool check_string(string a) /检测字符串中是否只包含数字ch
8、ar b;for(int i=0;i9|b10) /如果姓名为空或者姓名长度过长cout姓名输入有误!2|(sex.size()0&(pare(男)&pare(女)cout性别输入错误!student.name)com+; /对比姓名if(type=2|type=0)&!pare(ne-student.xuehao)com+; /对比学号if(com0) /若m0,证明原有数据中含有被检数据,或者的话,将会返回NULL。return ne;if(ne-next=NULL)break;ne=ne-next;coutendl;return NULL;2) 数据查询功能界面如下:进行数据查询时,可输
9、入任何字符,只要学生信息中任何一项包含输入的关键字,该信息都会被显示出来,如上图,分别输入了“女”,“B105”,进行查询,结果信息都完整的显示了出来,以下是进行信息查询的关键代码:void User:find_info()string key; /关键字struct list*ne; /结构体指针int find; /找到的数据量int com;char s; /选择FIND:system(cls);coutkey;ne=head; /注意这个head不能空,要初始化find=0;show_table_head();while(ne!=NULL) /遍历链表,指针每移一位都要调出指针所指的学
10、生类,然后进行每项数据的对比com=0;if(check_string(ne-student.name,key)com+; /如果相关信息内包含关键字,com+,下同if(check_string(ne-student.banji,key)com+;if(check_string(ne-student.dizhi,key)com+;if(check_string(ne-student.sex,key)com+;if(check_string(ne-student.tel,key)com+;if(check_string(ne-student.xuehao,key)com+;if(com0) /
11、即至少有一项匹配,则横排显示find+;ne-student.show_info(find);if(ne-next=NULL)break; /指针指向尾部,退出ne=ne-next;coutn找到find条数据!nendl;couts;if(s=y) goto FIND;3) 数据浏览功能:此功能可以显示所有存入的数据,界面如下:在数据显示时,主要用的技术就是对结构体链表进行遍历,指针指向结构体的学生类对象,然后调用该类的自身数据显示函数,这样就可显示所有数据。关键代码如下:void User:show_all() /显示所有信息system(cls); /清屏struct list*ne;
12、/链表指针ne=head; /指向头指针int i=1;show_table_head();/显示表头while(ne!=NULL) /遍历链表ne-student.show_info(i); /横排显示学生信息i+;if(ne-next=NULL) break; /如果到达尾指针,退出ne=ne-next; /指针指向下一位system(pause);void Student:show_info(int i) /横行显示信息coutsetw(4)i;coutsetw(8)name;coutsetw(14)tel;coutsetw(14)xuehao;coutsetw(6)sex;coutse
13、tw(9)banji;coutsetw(7)dizhiendl;4) 数据统计功能:数据可以按照三种方式进行统计,即 按性别、按班级,按住址。计时,对应条目相等的数据会显示在同体列表下,并会显示数据总数。一下截图是按住址统计的部分结果:以下是关键代码:void User:tongji_info()TONGJI:system(cls);char s;couts;if(s=1)find_info(1);else if(s=2)find_info(2);else if(s=3)find_info(3);elseerr_show();couts;if(s=1) goto TONGJI;void Use
14、r:find_info(int type)tyhead=NULL;struct list*ne; /结构体list指针ne=head; /注意这个head不能空,要初始化while(ne!=NULL) /遍历链表,指针每移一位都要调出指针所指的学生类,然后进行每项数据的对比string key;if(type=1)key=ne-student.sex;else if(type=2)key=ne-student.dizhi;elsekey=ne-student.banji;if(!contain(key)add(key);if(ne-next=NULL)break; /指针指向尾部,退出ne=n
15、e-next;struct typelist*ne2;ne2=tyhead;system(cls);while(ne2!=NULL) /遍历链表typelistshow_table_head(); /表头显示函数string key;key=ne2-atype;if(key.size()=0)key=其他;coutkey:see_list(type,key,true)人n;elsecoutkey:see_list(type,key,false)next=NULL)break; /指针指向尾部,退出ne2=ne2-next;coutpare(key)|(ne-student.sex.size()
16、=0&nullinfo) /检查性别是否匹配find+;ne-student.show_info(find);else if(type=2)if(!ne-pare(key)|(ne-student.dizhi.size()=0)&nullinfo) /检查地址是否匹配find+;ne-student.show_info(find);elseif(!ne-pare(key)|(ne-student.banji.size()=0)&nullinfo) /检查班级是否匹配find+;ne-student.show_info(find);if(ne-next=NULL)break; /指针指向尾部,退
17、出ne=ne-next;return find;void add(string key)struct typelist*curr,*ne; /结构体typelist指针curr=(struct typelist*)new(struct typelist); /申请空间curr-atype=key;ne=tyhead; /ne指向头指针,如果初始化数据时,文件中有数据,此时头指针一定不为空if(tyhead=NULL) /若链表为空tyhead=curr; /头指针指向currentcurr-next=NULL; /current为第一数据,表头的next指针为空else /如果头指针不为空wh
18、ile(ne-next!=NULL) /遍历链表,直到ne指针指向尾部ne=ne-next;ne-next=curr; /尾指针的next指针指向current,此时current已插入链表curr-next=NULL; /current位于链表尾部,其next指针当为NULLbool contain(string key)struct typelist*ne; /结构体指针typelistne=tyhead;while(ne!=NULL) /遍历链表if(!ne-pare(key)return true;if(ne-next=NULL)break; /指针指向尾部,退出ne=ne-next;
19、return false;iii. 若选择以管理员身份登录系统则会出现管理员界面:当正确输入用户名与密码后,方可进行功能操作。其中,增加数据、查询数据、浏览数据与数据统计功能与普通用户的代码实现相同,因为管理员类继承与普通用户类,所以此函数直接继承。在此不多作描述。下面介绍删除数据与修改数据功能。1) 数据修改进行数据修改时,需要先输入正确的学号或姓名,在找到数据后,可按提示进行修改,次系统有一个方便的地放就是若不想修改某项数据,可直接按回车键,如下图。关键代码实现如下:void Manager:edit_info()string key; /关键字char s;struct list*xiu
20、;EDIT:system(cls);Student temp; /用于做缓存的学生类对象coutstudent.show_info(); /以下为数据录入coutn请输入新数据,若不必修改,请直接按回车键:n;cout请输入姓名:;getline(cin,temp.name);cout请输入电话:;getline(cin,temp.tel);cout请输入学号:;getline(cin,temp.xuehao);cout请输入性别:;getline(cin,temp.sex);cout请输入班级:;getline(cin,temp.banji);cout0) /若重输了姓名if(check_r
21、epeat(temp.name,1)!=NULL)goto WRONG; /检查未通过else temp.name=xiu-student.name;if(temp.xuehao.size()0)if(check_repeat(temp.xuehao,1)!=NULL) goto WRONG;else temp.xuehao=xiu-student.xuehao;if(temp.sex.size()=0)temp.sex=xiu-student.sex;if(temp.tel.size()=0)temp.tel=xiu-student.tel;if(temp.banji.size()=0)te
22、mp.banji=xiu-student.banji;if(temp.dizhi.size()=0)temp.dizhi=xiu-student.dizhi;if(temp.check_name_other()&(temp.check_sex()&temp.check_tel_xuehao() /数据规范性检查xiu-student=temp; / 对指针下数据进行修改coutn修改成功!endl;edit_flag=true;coutn修改后的数据为:student.show_info();goto ASK;else goto WRONG;elseerr_show();couts;if(s=
23、y) goto EDIT;goto ASK;WRONG:err_show();coutn错误!未修改数据!endl;ASK:couts;if(s=1)goto EDIT;2) 数据删除删除数据需要先输入学号或姓名,数据的删除本质上就是链表节点的删除。截图如下:关键代码如下:int Manager:del_info() /删除信息string m; /删除的关键字struct list*la,*ne;char s;DEL:system(cls);ne=head;if(head=NULL) /如果数据为空err_show();coutn空链表!不可进行下一步操作!endl;goto ASK;coutstudent.name)|!pare(head-student.xuehao) /如果姓名或学号的所对对应的学生对象位于链表头部,则需要改变头指针,头指针指向内容将要删除head=ne-next; /改变头指针ne-student.show_info(); /显示信息coutn确认删除(y/n)?;c
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1