学生学籍管理说明书.docx
- 文档编号:8453849
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:42
- 大小:343.33KB
学生学籍管理说明书.docx
《学生学籍管理说明书.docx》由会员分享,可在线阅读,更多相关《学生学籍管理说明书.docx(42页珍藏版)》请在冰豆网上搜索。
学生学籍管理说明书
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年春季学期
算法与数据结构课程设计
题目:
学籍管理
专业班级:
10级软件工程基地班
姓名:
学号:
10500233
指导教师:
王旭阳
成绩:
目录
摘要1
1.采用类c语言定义相关的数据类型2
2.各模块的伪码算法2
3.函数的调用关系图6
4.调试分析7
5.测试结果7
6.源程序(带注释)11
总结27
参考文献28
致谢29
附件Ⅰ任务一源程序代码30
摘要
学籍管理系统设计涉及学生信息的录入,显示,查找,删除,修改,统计,保存,退出等功能,从而能够对信息进行处理。
程序中运用了相关类的知识,同时定义了一定数量的数据及成员函数。
程序使用了数组记录统计的相关数据,运用了指针实现相应功能函数的功能,运用了student,school两个类实现面向对象的要求。
程序的完成涉及到程序的分析,模块的分解,程序的控制,程序的调试。
关键词:
学籍管理;数据结构;C++;程序控制
1.采用类c语言定义相关的数据类型
类:
student
数据成员
编号,姓名,年龄,专业,性别,籍贯,民族,生日,政治面貌,身份证,数学成绩,英语成绩,计算机成绩
类:
school
成员函数
录入函数Input():
输入编号到计算机的成绩;
统计函数count():
统计各科的总成绩,计算平均成绩,统计各科的及格率;
查询函数found():
按学号或姓名查找学生的记录;
修改函数mend():
修改指定学号学生成绩记录;
删除函数del():
删除指定学号学生记录;
输出函数show():
输出班级所有学生成绩记录;
2.各模块的伪码算法
2.1定义类:
classstudent
{
protected:
variable;
public:
student*next;
student(){}
~student(){}
char*getname(){returnname;}
intgetnumber(){returnnumber;}
doublegetscore(inti){returnscore[i];}
floatgetg(){return(score[0]+score[1]+score[2]+score[3]+score[4]+score[5]);}
input:
data;
output:
data。
2.2保存函数
voidschool:
:
save()
{
student*p;
p=head;
ofstreamos("student.txt",ios:
:
out);
if(school:
:
getkey()==1)
{
while(p->next)
{
(p->next)->output(os);
p=p->next;
}
}
school:
:
setkey(0);
}
2.3修改函数
voidschool:
:
mend()
{
student*p;
intnum=-1,n;
charname[20]="^";
if(n==1)学号
if(n==2)姓名
if(!
find(&p,num,name))
(p->next)->output();
(p->next)->input();
school:
:
setkey
(1);
}
2.4查找函数
voidschool:
:
found()
{
student*p;
intnum=-1,n=9;
charname[20]="^";
if(n==1):
学号
if(n==2):
姓名
if(!
find(&p,num,name))
(p->next)->output();
}
2.5初始化函数
//初始化函数
voidschool:
:
begin()
{
student*p,*p2;
p=head;
clear();
longt;
ifstreamis("student.txt",ios:
:
in);
if(!
is)
{
ofstreamos("student.txt",ios:
:
out);
os.close();
return;
}
intnum=-1;
while
(1)
{
num=-1;
t=is.tellg();
is>>num;
is.seekg(t);
if(num<0)
{
is.close();
return;
}
p2=newstudent;
p2->input(is);
p->next=p2;
p2->next=NULL;
p=p->next;
}
}
2.6清空函数:
voidschool:
:
clear()
{
student*p,*p2;
p=head->next;
while(p)
{
p2=p;
p=p->next;
deletep2;
}
}
3.
函数的调用关系图
系统组织结构图:
系统功能结构图
:
4.调试分析
a、调试中遇到的问题及对问题的解决方法
此次课程设计所研究的问题不是很难,即进行学籍管理,所以总的高度比较顺利。
但在最初的设计过程中犯了一个致命的错误,即没有很好的进行整体布局,也没有定义统一的函数接口,以致程序的结构与函数的混乱。
当各模块组合在一起的时候更是无没进行调试。
故只有一切从头开始,重新分配任务,以及统一定义各函数的接口。
在调试的过程中发现当输入错误的时会发生想不到的错误,为了避免这样意外的发生,写了一个判断函数judge()以及输入函数input()对其进行改进。
当一段相同的代码在程序中多次使用并且功能相对单一时,有必要将其写成一个函数,以减少工作量,并且使程序具有更好的可读性。
在编写程序的过程中,及时对重要和难懂的程序段写注释是一个很好的习惯,无论是以后的测试还是以后的维护都能够节省相当多的时间。
调试时最先进行各函数的调试,确保无误时再进行各模块的调试,最后才是将各模块组合在一起测试完整的程序。
在调试的过程中不断地进行改进、完善。
在序能够正确运行的基础上,再对各函数进行格式的优化,加强程序的结构性,并增强程序的可读性,包括给运行界面增加相应的操作提示等,使操作界面简单而又美观。
b、算法的时间复杂度和空间复杂度
本算法采用类对象的列表,假设实例化为n,则其时间复杂度和空间复杂度都是O(n)。
5.测试结果
5.1主菜单:
5.2录入信息界面
5.3显示信息界面:
5.4查找学生界面:
5.5修改学生信息界面:
5.6统计成绩界面:
5.7保存学生信息界面:
6.源程序(带注释)
#include
#include
#include
#include
usingnamespacestd;
classstudent
{
protected:
intnumber;
intage;
charname[20];
charsex[6];
charzhy[20];
charplace[20];
charnation[6];
charbirth[20];
charparty[10];
charid[20];
floatscore[6];
public:
student*next;
student(){}
~student(){}
char*getname(){returnname;}
intgetnumber(){returnnumber;}
doublegetscore(inti){returnscore[i];}
floatgetg(){return(score[0]+score[1]+score[2]+score[3]+score[4]+score[5]);}
voidinput()
{
inte=1;
cout<<"\t\t\t按提示输入:
"< cout<<"\t\t输入学号: "; cin>>number; cout<<"\t\t输入年龄: "; cin>>age; cout<<"\t\t输入姓名: "; cin>>name; do { cout<<"\t\t输入性别: "; cin>>sex; if(strcmp(sex,"男")==0||strcmp(sex,"女")==0) { cout<<"\t\t输入专业: "; cin>>zhy; cout<<"\t\t输入籍贯: "; cin>>place; cout<<"\t\t输入民族: "; cin>>nation; cout<<"\t\t输入生日: "; cin>>birth; cout<<"\t\t输入政治面貌: "; cin>>party; cout<<"\t\t输入身份证号: "; cin>>id; cout<<"\t\t输入数学分数: "; cin>>score[0]; cout<<"\t\t输入英语分数: "; cin>>score[1]; cout<<"\t\t输入计算机分数: "; cin>>score[2]; cout<<"\t\t输入语文分数: "; cin>>score[3]; cout<<"\t\t输入算法与数据结构分数: "; cin>>score[4]; cout<<"\t\t输入物理分数: "; cin>>score[5]; e=0; } else { cout<<"\t\t\t无此性别类型! 重新输入! "< e=1; } }while(e); return; } voidinput(ifstream&is) { is>>number>>age>>name>>sex>>zhy>>place>>nation>>birth>>party>>id >>score[0]>>score[1]>>score[2]>>score[3]>>score[4]>>score[5]; is.get(); } voidoutput() { cout<<"学生基本信息如下: "< cout<<"学号: "< <<"年龄: "< <<"姓名: "< <<"性别: "< <<"籍贯: "< <<"民族: "< <<"专业: "< <<"生日: "< <<"政治面貌: "< <<"身份证号: "< <<"数学: "< <<"英语: "< <<"计算机: "< <<"语文: "< <<"算法与数据结构: "< <<"物理: "< <<"总分: "< } voidoutput(ofstream&os) { os< < < < < < < < < < < < < < < < } }; classschool { public: school(){head=newstudent;head->next=NULL;key=0;} ~school(){deletehead;} voidinput(); voidmend(); voiddel(); intfind(student**p,intnum,char*pn="^"); voidfound(); voidshow(); voidcount(); voidsave(); voidbegin(); voidclear(); charmainmenu(); intgetkey(){returnkey;} voidsetkey(intk){key=k;} private: student*head; intkey; }; //录入函数 voidschool: : input() { student*p,*p2=NULL; p=head; intn; while(p->next) p=p->next; while(n) { p2=newstudent; p2->input(); p->next=p2; p2->next=NULL; p=p->next; school: : setkey (1); cout<<"\t\t\t按1继续,按0返回: "; cin>>n; } } //子查找函数 intschool: : find(student**p1,intnum,char*pn) { student*p; p=head; while(p->next) { (*p1)=p; if((p->next)->getnumber()==num||! strcmp((p->next)->getname(),pn)) return1; p=p->next; } return0; } //查找函数 voidschool: : found() { student*p; intnum=-1,n=9; charname[20]="^"; do { cout<<"\t\t1: 按学号查找,2: 按姓名查找: "; cin>>n; }while(n<1||n>2); if(n==1) { cout<<"\t\t\t输入学号: "; cin>>num; } if(n==2) { cout<<"\t\t\t输入姓名: "; cin>>name; } if(! find(&p,num,name)) { cout<<"\t\t找不到你要查找的内容! "< return; } (p->next)->output(); } //删除函数 voidschool: : del() { student*p,*p2; intnum; cout<<"\t\t\t输入学号: "; cin>>num; if(! find(&p,num,"^")) { cout<<"\t\t找不到你要删除的内容! "< return; } (p->next)->output(); p2=p->next; p->next=p2->next; deletep2; school: : setkey (1); } //显示函数 voidschool: : show() { student*p; p=head; while(p->next) { (p->next)->output(); p=p->next; } } //修改函数 voidschool: : mend() { student*p; intnum=-1,n; charname[20]="^"; do { cout<<"\t\t1: 按学号修改,2: 按姓名修改: "; cin>>n; }while(n<1||n>2); if(n==1) { cout<<"\t\t\t输入学号: "; cin>>num; } if(n==2) { cout<<"\t\t\t输入姓名: "; cin>>name; } if(! find(&p,num,name)) { cout<<"\t\t找不到你要修改的内容! "< return; } (p->next)->output(); (p->next)->input(); school: : setkey (1); } //保存函数 voidschool: : save() { student*p; p=head; ofstreamos("student.txt",ios: : out); if(school: : getkey()==1) { while(p->next) { (p->next)->output(os); p=p->next; } } cout<<"\t\t\t文件已保存! "< school: : setkey(0); } //初始化函数 voidschool: : begin() { student*p,*p2; p=head; clear(); longt; ifstreamis("student.txt",ios: : in); if(! is) { ofstreamos("student.txt",ios: : out); os.close(); return; } intnum=-1; while (1) { num=-1; t=is.tellg(); is>>num; is.seekg(t); if(num<0) { is.close(); return; } p2=newstudent; p2->input(is); p->next=p2; p2->next=NULL; p=p->next; } } //清空函数 voidschool: : clear() { student*p,*p2; p=head->next; while(p) { p2=p; p=p->next; deletep2; } } //统计函数 voidschool: : count() { student*p; p=head; intn=0; doubleg[6]={0,0,0,0,0,0}; floatj[6]={0,0,0,0,0,0}; while(p->next) { p=p->next; n++; for(inti=0;i<6;i++) { g[i]=g[i]+(p->getscore(i)); (p->getscore(i))>=60? j[i]++: 0; } } cout<<"\t\t\b\b\b\b数学总分: "< "< "< <<"\t\t\b\b\b\b英语总分: "< "< "< <<"\t\t\b\b\b\b计算机总分: "< "< "< <<"\t\t\b\b\b\b语文总分: "< "< "< <<"\t\t\b\b\b\b算法与数据结构总分: "< "< "< <<"\t\t\b\b\b\b物理总分: "< "< "< } //主选菜单函数 charschool: : mainmenu() { charn[6]; cout<<"\n\n☆☆☆☆欢迎进入高校学籍管理系统☆☆☆☆"< <<"\n\n班级: 10级软件工程基地班姓名: 田亚红"< <<"****************************"< <<"****************************"< <<"**1: 录入学生信息**"< <<"**2: 显示学生信息**"< <<"**3: 查找学生信息**"< <<"**4: 删除学生信息**"< <<"**5: 修改学生信息**"< <<"**6: 统计学生成绩**"< <<"**7: 保存学生信息**"< <<"**0: 退出系统**"< <<"****************************"< <<"****************************"< <<"请选择: "; cin>>n; returnn[0]; } //主函数 voidmain() { schoolpp; intk=1; charn; pp.begin(); while(k==1) { n=pp.mainmenu(); switch(n) { case'1': pp.input();break; case'2': pp.show();break; case'3': pp.found();break; case'4': pp.del();break; case'5': pp.mend();break; case'6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 学籍 管理 说明书