学生信息管理系统设计文档一、设计任务描述为了实现学籍管理的简单化,我们基于Visual C++集成开发环境编写了“学生信息管理系统”软件,该软件适用于所有win dows操作系统,面向广大用户,界面简洁,操作简单。
此软件主要是实现对学生学籍信息进行系统化的管理,可以对学生基本信息进行添加、删除、查找、修改以及对学生成绩的管理,主要是根据学生的学号及其姓名进行操作的。
该软件可以更加方便管理者管理学生学籍信息。
二、功能需求说明该系统所需要的功能有:1链表的建立;2、学生信息的插入;3、学生信息的查询;4、学生信息的输出;5、学生信息的修改;6、学生信息的删除;7、良好的欢迎选择界面。
三、总体方案设计一、实现任务的方法1、在欢迎选择界面中,使用Switch这一选择结构来连接程序的执行和用户的命令;2、在从学生信息的建立直到删除,都是使用链表的相关知识;3、在定义学生信息时,建立一个Inform类;在定义学生课程成绩时,自定义了一个achieve结构体;ST rucr acnieve{ int nunber :char nane [10] [10];float achieveiaent [13]:float xuefen [10]: float 0 : float average ; achieve C): float count average (); struct Inform {chai name [10]: charnum[20]: string sex : string: id; string bir; string adr : string tel , achieve ach; void achinput 0 : void achprint 0 ; };三、模块划分 (1) 链表的建立。
(2) 对链表信息的插入。
(3) 对链表信息的查找。
(4) 对链表信息的输出。
(5) 对链表信息的删除。
(6) 对链表信息的修改。
课程成绩信息作为附加信息,穿插于各个模块中三、数据结构说明一、自定义的数据结构:1、achieve (课程成绩)用于存放课程成绩信息包括课程数、课程名、成绩、学 分、总分和平均分。
"谍稈数〃课程容(最參课稈数为nn"成绩 "学专 "总分"平均分"默认枸隆雷教"计算该学生课程的加权平均分(总咸绩/总学分)"元素类型"姓名 〃学号 〃性别"身份证号 //出生年月曰 〃家庭地址 "电话号码 "课程咸绩 "谍程成绩输入 "遥程成缢输出3、结点结构-Nodetype,定义了数据域inform 和指针域next;2、inform (学生基本信息)用于存放学生基本信息,包括姓名、学号、性别等。
//构造函数 〃析构函数 〃建立链表 //插入学生信息 //删除学生信息 //查找 //修改〃输出信息 //声明头指针HodrtTii"?b-^riesrt-nULL,a _>nBKl-b; p 口 ; \匚 CDUT«削建宁右? ClIl i >ES ;struct Nodetype //结点结构{inform data; "数据域Nodetvpe 〃指针域};二、类Student 用于存放处理学生信息的各个功能函数,private 成员是链表的头指针class Student {public :Student (); ^Student (); void creat (); void insert (); void del 0 ; void search (), void modifyO , void Display 0 ; private :Xodetype ^head;四、各模块设计说明'、建立:首先:建立一个空链表:Stude nt::Stude nt() {head=new Nodetype; head-> next=NULL; 表明这是一个空链表coutvv'请建立链表\n"; }然后建立链表gutfC"吉粧h 寿庭堆址:匹”: cin>>3:・;=drccut'K"ffi 入电诸号码當"T .1 el.oaufc<C 是否更齢入宁土肌程术娠诂息如矿; "判斷是瓷桁入审晴C 1K >)C ;(c=/ | [ c=?-!r )[a azhiiiput [);"创益一今戲韦电三并将该韦电地址侔存在抱軒变誉b 申 ■V 牠丄湎换1T 得至侶技作ZJb 却歎掘加使结点戲合终在链表的最后面E.两个对象正常输出、添加:按照学号从小到大的顺序插入:s=iiew Xodetvpe;s->daTa=s;q=head.p^q-'/nerXt;irhi le(pl =NUHAj6strcnp (p->data, num, x. nuuO <0)■q=pp=p->next;} 〃迪历琵表查找梵应插入的位匿亘到找的某书直的数据城比输入£学号丄s~ ^next^p: ” _______ __q->next=s;〉I 插入新结点£cout«*添:山成功'是否维续奪加(Y/?4)*«en£ll; cin>>cs■}三、输出:将链表的数据输出,由于上述操作,输出时会按照学号从小到大的顺序输出。
四、查找:利用学号和姓名两种方式进行查找,查找时主要是遍历链表进行判断while(p!=NULL&&(d==1 &&strcmp(i nput,p->data .n um)!=0)||(d==2&&strcmp(i np ut,p->data .n ame)!=0)){p=p->n ext;} 〃遍历链表查找符合要求的节点五、删除:利用节点的删除操作,找到链表中第i-1个结点,修改其指向后继的指针:q = p->n ext;p->n ext = q->n ext;delete(q);六、更改:利用查找的操作,查到后在进行重新输入的操作;五、测试情况说明测试一:学生信息的输入和输出都正常,但是查找、删除和修改时都只能对第一个数据进行操作,如下图所示:cT]地it;派匕^^3 = 657668?中的数据输岀如下;:朱方菠'证号=3站£?6鲫强日:19920924 庭芒止匕浙江幵此话是■刁弓:百咋肚溯日逻辑关丟弄错! 歹应该为T■冷="缶:rfjpi 加 T p-计「SUP '=0)1但是当要进行查找、删除、修改操作时,系统只能对第一个对象进行操作查看程序时,发现查找函数、删除和修改函数都有个逻辑错误Bviichld} luw ItCOUt "1三年1亍月「eudl. cin>: inpuibreak,cue 2:CffUt "•刖■■占•”加机:cln> input. bre^k;:^cderype *p.p=q ; h :rii Lr If'12v :肚口rr i* h;.-iT |)- -1AT a. - iin '!^'p=p-~霓圧祥云誉疋存舎寻求曲节戸2 f ((d=】iist j ■眄J (i rput . p->dat 岳 iunZ=0) (<t=3Mt3tra()(input, f'dat H , nane) =0)、 {emit -<"找到的悄岂tlT : \n l: cwZ"学号:<r «p ->data. mn«* \n* : *«p ->4at8i n?»« "■ n' < < "身曲证号;*«p ->dai;s. i4C<* \p* 机"性和:* «jr>daxa. m «h \n J X 生日bLr^' \a'«家庭地址:妝p->dita ■dr«, W 农"电话号码;Wp~>dag hW 诃; if p- da?a. Eih. nunbcr^B)71 耳匚拄訐"If : H ■; <p -/ca*E. achprint : }全部修改后,程序的上述错误就没再出现了。
错误二:当提示是否输入课程成绩信息时,输入第一门课程名时,会出现无穷循环对于这种状况,我百思不得其解,后来请教其他同学,他告诉我错误在于声明课程成绩信息时出错了struct achieve{ __int numb 雯i[:^*7: hoff iQat^acIneveinem [10].float xuefen[lD]: float siunO ;float average 0;achieve();f lt>a t count average1:';"课程数"踝程名(最多课程数为1(0"锻绩"学分"总分//■平肉分打默认构罐雨数〃计算谏学主课程的加权平均分(总成绩/总学井)但当输入第一门课程后就会出现下图所示状况:应该为二维数组,修改之后,课程成绩输入输出便正常了(讣时諦人总團貓$咼毎和请输未按照学号大小输出!,是否押续添加(Y/N) \<sidl:Sw 帕是字符格式不能魁行这种比较!im Crt 扁 nd w 序;邨花LI 32X CHI <1exe長中的魏捱布岀如下. 千':予方捏 付证耳;5弋创 列:flSitWl :同汇话耳码;J 曲需“5错误三:输入 学生信息时不按照学号大小顺序,输出结果时也不按照从小到大的顺序输出。
如下图所示后来查看程序,发现插入函数(insert )中判断新插入的数据的位置时出现问题 whi 1 e (p! =XULL&^p->data,num<x. num)(q-P ; ~7p=p->next ;) //矽於i 表杏找x 应插入的位置直到]S'>next _p; q _)next=s ;cout«*S55 加成 cin^^cs;寻地1「;河/ 话吕码:54G5eP4EG应该为strcmp(p->data.num,x.num)<0;之后输出正确了!六、评价和改进意见(1)不足:①程序可能存在冗杂之处。