学生成绩信息管理系统附录2:顺序表结构化设计源程序清单设计目的与要求26该学生信息管理系统采用C++语言开发研制,针对学生成绩及其数据特点,可以全面实现对学生成绩的插入、查询、修改、删除和输出等功能的计算机管理。
它能使学生信息数据的工作人员从繁重的工作中解脱出来,大大减轻了工作量,减少人为的工作失误,全面提高学生信息管理的效率,从而使学校对于学生成绩的管理水平和技术水平跃上一个新的台阶。
(1)程序要添加适当的注释,程序的书写要采用缩进格式。
(2)程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3)程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4)根据实验报告模板详细书写实验报告, 在实验报告给出链表根据姓名进行查找的算法和插入算法的流程图。
定义一个包含学生信息(学号,姓名,成绩)的的顺序表号,和链表,使其具有如下功能:(1) 根据指定学生个数,逐个输入学生信息;(2) 逐个显示学生表中所有学生的相关信息;(3) 根据姓名进行查找,返回此学生的学号和成绩;(4) 根据指定的位置可返回相应的学生信息(学号,姓名成绩);(5) 给定一个学生信息,插入到表中指定的位置;(6) 删除指定位置的学生记录;(7) 统计表中学生个数。
2 系统需求与功能分析系统需求分析(1)能完成学生信息的插入、查询、修改、删除、输出等功能;(2)采用单链表与顺序表存储结构实现;(3)所有数据以外部文件方式保存。
系统功能分析(1)要设计一个学生成绩管理系统,其功能包括:①插入函数Add() :将学生成绩信息插入到链表中;②查询函数Search() :分别可以按学号和按姓名进行学生成绩查询;③删除函数Delete() :当需要删除的学号和姓名一致时则删除对应的学生记录;⑤输出函数Show():输出全部学生成绩信息;⑥菜单函数Menu():为程序的菜单函数为实现各种功能提供便捷;⑦读取数据函数Read():从外部文件读取学生成绩信息;⑧保存数据函数Save():将数据保存到外部文件中。
3总体结构设计系统的结构设计通过对学生信息管理系统的功能分析,可以定义出系统的总体结构模块图,如图所示。
图学生管理系统总体结构设计系统管理流程图前面的分析中已经定义了系统各个模块,属于静态建模的范围。
在系统运行时刻的动态模型应该由系统的流程决定。
当用户运行该系统后可以来进行学生信息插入管理、学生信息查询管理、学生信息删除管理、学生信息修改管理及学生信息输出等操作,具体的流程如图所示。
进入系统图系统流程图主模块应负责应用程序的主界面,由它调用其他模块.因此主模块应具有操作性好、界面清晰的特点,使用户能够很方便地找到所需功能。
根据功能需求的结果分析,主界面应该由学生信息插入管理,学生信息查询管理、学生信息修改管理、学生信息删除管理和学生信息输出管理组成,可以通过输入相应的数字进入相应的功能模块。
4链表学生信息管理系统详细设计和系统实现系统总体设计完成后,就可以根据需求对各个模块来进行实现了。
在本系统中需要编码实现的主要有学生信息插入、学生信息查询、学生信息修改、学生信息删除和学生信息输出等 5个模块。
(1)学生信息插入模块添加的信息包括学号(不允许重复)、姓名(不允许重复)、分数。
流程图如下图所示。
图插入模块流程图本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。
图尾插法建立单链表操作示意图(2)学生信息查询模块按姓名和学号查找学生信息的流程图分别如下图所示。
图按姓名查找学生信息流程图在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针P,顺next域逐个结点往下搜索。
当P指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针P后移,即将P指向原来所指结点的后继结点。
直到P为NULL 时查找失败。
单链表查找过程如图所示。
图单链表查找过程的示意图按学号查询学生信息同按姓名查找学生信息,此处不再详细列出。
(3)学生信息修改模块首先要查找与要修改数据相匹配的信息,若没有则返回失败。
否则把相应的信息输出,然后再重新输入新的数据并保存 到单链表。
(4) 学生信息删除模块当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹 配的上,贝y 进行删除操作,否则返回失败。
其流程图如下:图删除学生信息模块流程图删除操作定义为将单链表的第i 个结点删去。
因为在单链 表中结点a 存储地址在其前驱结点 a i-1的指针域,所以必须首 先找到a i-1的存储地址P ,然后令P 的next 域指向a i 的后继结 点,即把结点a i 从链上摘下来,最后释放结点 a i 的存储空间,如图所示。
图在单链表中删除结点指针的变化情况(5) 学生信息输出模块N返回主菜单从单链表表头遍历整个单链表,将所有数据输出。
其部分代码如下:void Function::Show() { char choose;Student *temp;system("cls");temp=Student_First->Next;if(!temp) { cout<<" 文件无数据\n\n "<<endl;cout<<"1. 返回主菜单"<<endl;cin>>choose;while(choose!='1')cout<<"1. 返回主菜单"<<endl;cin>>choose;Menu();else{ cout<<" 姓名\t 学号\t 语文成绩\t 数学成绩\t 英语成绩\n";while(temp!=NULL) { temp->Out();temp=temp->Next;cout<<"1. 返回主菜单"<<endl;cin>>choose;while(choose!='1') { cout<<"1. 返回主菜单"<<endl;cin>>choose;Menu();}5系统测试在完成了系统各方面的设计后,并不是可以运行就完成的,为了保证系统性能的稳定性跟安全性等,就要对系统做测试。
测试环境如下:硬件:P4C,80GB硬盘,512M内存;软件:Windows XP Personal SP2 ,分辨率1024*768,Microsoft Visual C++ 。
1.这是链表的主界面2.这是顺序表的主界面图运行主界面我就以顺序表为例介绍一下我的学生信息管理系统吧选择1清空学生信息功能时,如图所示。
图插入学生成绩信息实现②返回主菜单后选择3插入学生成绩信息,4删除学生信息,运行结果按由姓名特定位置删除和按学号删除两种分别如图和图所示。
图按学生学号查找相关信息实现图按学号查找相关信息实现③当在主菜单中选择4时,则进行删除功能。
其运行结果如图所示。
图删除学生信息功能实现⑤当在主菜单中选择 6 时,则进行显示当前信息功能。
其运行 结果如图所示。
图输出学生信息功能实现6 结束语通过这次数据结构课程设计的实验,在解决问题的过程中,充分体会到了数据结构这门课程对于软件设计的重要性, 也体会到了数据结构 +算法 =程序这句话的真正含义,一个实际问题的解决第一步就是要依赖于良好的抽象思维的,将实际问 题转化为相应的数据结构,只有这一步做好了,才能采取相应 的算法和优化方法解决问题和解决好问题。
参考文献[1] 钱新贤,杨猛,程兆炜,张少东. Visual C++ 编程疑难详 解[M].北京:人民邮电出版社, 2000胡明,王涛.数据结构 (C++)[M] . 北京:清华版社, 2001[2] 王红梅,大学出版社, 2007[3] 程学先. 数据库原理与技术 [M] .北京:中国水利水电出 [4] Alex Kriegel & Boris. SQL Bible[M] .北京:电子工业出版社, 2000 [5]郑章,程刚,张勇.Visual C++数据开发技术[M] .北京:机械工业出版社, [6] and . C++ Annotations . Version 4.4.0m,ICCE , University of Groningen , Netherlands , 1990. 250 〜280附录 1:链表结构化设计源程序清单回主菜单 "<<endl;cin>>choose;while(choose!='1'){ cout<<"1. 返回主菜单 "<<endl;cin>>choose;Menu();"<<endl;cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1. 返回主菜单 \n2. 继续删除"<<endl; cin>>choose;if(choose=='1')Menu();else if(choose=='2')Delete();void Function::Modify()续修改 "<<endl;void Function::Delete()回主菜单 \n2. 继续删除 回主菜单 \n2. 继cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1. 返回主菜单\n2. 继续修改"<<endl;cin>>choose;if(choose=='1')Menu();else if(choose=='2')Modify();void Function::Read()姓名查询\n2. 按学号查询\n";cin>>choose;if(choose=='1') { cout<<" 请输入您要查询的姓名:";cin>>t1;while(temp) { if(strcmp(t1,temp->GetName())==0){ flag=1;break;temp=temp->Next;}cout<<"\n 无该学生的信息 \n"<<endl;if(flag==0) else{ cout<<" 姓名 \t 学号 \t 语文成绩 \t 数学成绩 \t 英语temp->Out();break;else if(choose=='2')cin>>t2;while(temp) { if(t2==temp->GetNo()){ flag=1;break;temp=temp->Next;if(flag==0)cout<<"\n 无该学生的信息 \n"<<endl;else成绩 \n"; { cout<<" 请输入您要查询的学号M.{ cout<<" 姓名\t 学号\t 语文成绩\t 数学成绩\t 英语成绩\n";temp->Out();break;}while(choose!='1'||choose!='2');cout<<"\n1. 返回主菜单\n2. 继续查询"<<endl;cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1. 返回主菜单\n2. 继续查询"<<endl;cin>>choose;if(choose=='1')Menu();else if(choose=='2')Search();void Function::Show() { char choose;Student *temp;system("cls");temp=Student_First->Next;if(!temp){ cout<<" 文件无数据\n\n "<<endl;cout<<"1. 返回主菜单"<<endl;cin>>choose;while(choose!='1'){ cout<<"1. 返回主菜单"<<endl;cin>>choose;Menu();elsecoutvv"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";while(temp!=NULL) { temp->Out();temp=temp->Next;coutvv"1. 返回主菜单"vvendl;cin>>choose;while(choose!='1'){ coutvv"1. 返回主菜单"vvendl;cin>>choose;Menu();void Function::Menu() { time_t t;time(&t);char choose;system("cls");cout<<endl;cout<<"*********************************************** ************"<<endl;平顶山学院欢迎你 "<<endl<<endl;"<<endl<<endl;cout<<" 显示系统时间和日期"<<ctime(&t)<<endl;cout<<"*********************************************** **********"<<endl<<endl;cout<<"学生成绩信息管理系统cout<<"版权所有:李卉"<<endl; cout<<"cout<<" 请选择您需要的操作, 选择相关操作请输入相对的括号里的阿拉伯数字!"<<endl;cout<<"\n";cout<<" 录入学生成绩信息:\n"<<endl;cout<<" 查询学生成绩信息:\n"<<endl;cout<<" 删除学生成绩信息:\n"<<endl;cout<<" 修改学生成绩信息:\n"<<endl;cout<<" 显示全部学生成绩信息:\n"<<endl;cout<<" 退出系统"<<endl;cout<<"\n";cin>>choose;switch(choose) { case '1': Add();break;case '2': Search();break;case '3': Delete();break;case '4': Modify();break;case '5': Show();break;case '6': exit(1);break;default:{ cout<<" 请按规定输入选择项!"<<endl;Menu();}void main(){ Function function; o;cout<<endl;cout<<" 请输入第"<<i<<" 名同学的姓名:";cin>>[i-1].name ;cout<<endl;cout<<" 请输入第"<<i<<" 名同学的成绩:";cin>>[i-1].score ;cout<<endl;++;cout<<"\n 本次操作您一共输入了"<<m<<" 名数据\n";return 1;.\n";if(pos<1||pos> { cout<<" 对不起,您要查找的学生不存在,请检查!\n"; return 0;cout<<" 以下是您要找的学生信息:\n\n";cout<<" 学生姓名:"<<[pos-1].name<<endl;cout<<" 学生学号:"<<[pos-1].No <<endl;cout<<" 学生成绩:"<<[pos-1].score<<endl<<endl;return 1;} //// 删除操作/// int dele_elem1(sqlist &sl,int pos,student &elem) { cout<<" 请输入您要删除元素的位置:";cin>>pos;if(pos<1||pos> return 0; } struct student *p,*q;{ cout<<" 您要删除的元素不存在,请检查!\n";p=&[pos-1]);elem=*p;q=+;for(++p;p<=q;++p) *(p-1)=*p;; cout<<" 已删除,请检查输出!\n\n";return 1;} int dele_elem2(sqlist &sl,char *num,student &elem) { student *q,*p; p=;q=+; int flag=0; for(p;p<=q;p++) { if(strcmp(num,p->No)==0) { elem=*p; flag=1; } if(flag)break; }if(flag) { for(++p;p<=q;++p) *(p-1)=*p;cout<<" 已删除! 检查输出看是否符合您的要求!\n\n";return 1;else { cout<<" 不存在该学号代表的学生信息!\n";return 0;//// 输出/// int out_list(sqlist sl) { if==0) { cout<<"\n\n~ 现在还没有任何信息或信息被删除! 您可以先建立顺序表!~\n\n";return 0;else { cout<<"\n 这是您要求的信息显示:\n";struct student *q;q=;int count=0;for(q;q<+;q++) { count++;cout<<endl;cout<<" 第"vvcountvv"条:"vvendl; coutvv" 学号:"vvq->Novvendl; coutvv" 姓名:"vvq->namevvendl; coutvv" 成绩:"vvq->scorevvendl; coutvv"||||||||||||||||||||||||\n";coutvv" --- 共有信息"《«"条---------- \n\n";}//else return 1;}。