学生学籍管理说明书.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