程序设计报告南京邮电大学学生管理系统 c语言.docx
《程序设计报告南京邮电大学学生管理系统 c语言.docx》由会员分享,可在线阅读,更多相关《程序设计报告南京邮电大学学生管理系统 c语言.docx(25页珍藏版)》请在冰点文库上搜索。
程序设计报告南京邮电大学学生管理系统c语言
程序设计报告
题目:
学生信息管理系统
专业电子信息科学与技术
学生姓名孟祥熙
班级学号B08020221
指导教师王蔚
指导单位南京邮电大学
日期2009/5/20
教师评语
教师签名:
年月日
成绩评定
备注
一、课题名称
学生信息管理系统
二、课题内容和要求
(一)程序设计任务:
已知有20个学生记录(包括学号、姓名、成绩)的文件student.dat,所有学生以学号从小到大排序(该文件自行建立)。
要求编程序实现查询、排序、插入、删除诸功能。
(二)系统必须提供的基本功能:
A.要求显示如下界面
****************************************
1--------------查询
2--------------排序
3--------------插入
4--------------删除
****************************************
通过选择1-4来确定要做哪一个操作。
B.若选1,则出现如下界面
****************************************
1.1----------按学号查询
1.2----------按姓名查询
1.3----------按成绩查询
****************************************
通过选择1.1-1.3来确定要做哪一个操作,其中:
按学号查询用二分法实现;按姓名查询用顺序法实现;按成绩查询实现查询成绩小于m分的学生;找到该生将学生记录输出到屏幕,若查无此人,输出相关信息。
C.若选2,则按成绩从大到小排序,姓名,学号顺序也随之调整。
D.若选3,将一个新学生记录按学号顺序插入,并把结果保存到文件student.dat中。
E.若选4,删除指定学生的记录,并把结果保存到文件student.dat中。
F.以上各个功能均编写成子函数,由主函数调用实现。
三、需求分析
查询功能:
按学号查询用二分法实现;
按姓名查询用顺序法实现;
按成绩查询实现查询成绩小于m分的学生;
找到该生将学生记录输出到屏幕,若查无此人,输出相关信息。
排序功能:
按成绩从大到小排序,姓名,学号顺序也随之调整,并把结果保存到文件student.dat中。
插入功能:
将一个新学生记录按学号顺序插入,并把结果保存到文件student.dat中。
删除功能:
删除指定学生的记录,并把结果保存到文件student.dat中。
菜单功能:
包含不同菜单,以显示不同功能。
四、概要设计
classStudent
{
charnum[10];用字符数组保存学生学号
charname[10];用字符数组保存学生姓名
intscore;用整形变量保存成绩
public:
Student(char*nu="",char*na="",ints=0);构造函数
voiddisp();打印所有学生的信息
boolfindna(charn[]);检查输入的姓名与学生姓名是否一致
boolfindsc(intn);检查输入分数与学生数分是否一致
friendvoiddelnum(inti,fstream&f);友元函数删除指定位置的学生信息
friendvoidpaisco(fstream&f);友元函数按分数排序
friendvoidchanu(fstream&f,char*nu,char*na,ints);友元函数插入输入的学生信息
friendvoidfindnum(charnum[],fstream&f,inti);友元函数查找与输入学号相符的学生,并可以由i值判断是否接入delnum已删除查找出来的学生信息
};
voidfindsco(intsco,fstream&f);按学号查找并输出学生信息,其中与类中的boolfindsc(intn)配合,保持了程序中学生信息的不可见性
voidfindnam(charnam[],fstream&f,inti)与类中的boolfindna(charn[]);结合,保持程序中学生信息不可见性,并可以有i值判断是否接入delnum已删除查找出来的学生信息
voidCreatefile(char*filename)创建初始文件,包含20个学生信息,在引用的时候加入如下语句
cout<<"是否恢复数据?
(Y/N)";
cin>>i;
if(i=='y'||i=='Y')
{
Createfile("student.dat");
count=20;
cout<<"已恢复原始数据!
";
getch();
}可以让执行程序的人回复数据,相当于rest键
voidmenu3(void)//显示删除菜单
voidmenu2(void)//显示主菜单
voidmenu1(void)//显示查找学生菜单
voidfind(fstream&f);查找学生的总函数,分配不同输入的选项接入姓名,学号,成绩不同的函数以查询,并实现退出,返回上一菜单功能
voiddel(fstream&f)删除学生的总函数,分配不同的输入选项接入findnu,与findna,并由后两者查找出学生位置后调用delnum删除
voidmainmenu(fstream&f)主菜单函数,实现接入find,del,chanu函数并实现退出功能
intmain(void)建立文件流对象,并实现有选择的创建预存的学生数据的dat文件
五、详细设计
#include
#include
#include
#include
usingnamespacestd;
#definemax100
intcount=0;
//类区
classStudent
{
charnum[10];
charname[10];
intscore;
public:
Student(char*nu="",char*na="",ints=0);
voiddisp();
boolfindna(charn[]);
boolfindsc(intn);
friendvoiddelnum(inti,fstream&f);
friendvoidpaisco(fstream&f);
friendvoidchanu(fstream&f,char*nu,char*na,ints);
friendvoidfindnum(charnum[],fstream&f,inti);
};
Student:
:
Student(char*nu,char*na,ints)
{
strcpy(num,nu);
strcpy(name,na);
score=s;
}//构造函数
voidStudent:
:
disp()
{
cout<<"________________________________________"<"<"<"<}
constintNUM=sizeof(Student);
boolStudent:
:
findna(charn[])//namesearch
{
if(strcmp(name,n)==0)
{
returntrue;
}else
returnfalse;
}
boolStudent:
:
findsc(intn)
{
if(score<=n)
returntrue;
else
returnfalse;
}
//功能区
voidfindsco(intsco,fstream&f);
voidCreatefile(char*filename)
{
ofstreamout(filename);
Studentstu[20]={Student("B08020211","乔旭",81),Student("B08020212","朱飞林",82),Student("B08020213","朱沛贤",83),Student("B08020214","朱磊",84),Student("B08020215","吴建",85),Student("B08020216","李舜",86),Student("B08020217","沈金伟",87),Student("B08020218","陆向阳",88),Student("B08020219","陈亮",89),Student("B08020220","周明源",90),Student("B08020221","孟祥熙",91),Student("B08020222","姚明",92),Student("B08020223","费伟恒",93),Student("B08020224","徐鹏",94),Student("B08020225","赵以国",95),Student("B08020226","谈亦商",96),Student("B08020227","唐奔",97),Student("B08020228","曹振",99),Student("B08020229","黄波",98),Student("B08020230","程龙",99)};
out.write((char*)stu,sizeof(Student)*20);
out.close();
:
:
count=20;
}//建立文件
voidchanu(fstream&f,char*nu,char*na,ints)
{
Studentstu[max];
inta,b,flag=0;
f.seekg(0,ios:
:
beg);
f.read((char*)&stu,sizeof(Student)*count);
stu[count+1]=Student("","",0);
for(b=0;b{
if(strcmp(stu[b].num,nu)>0)
{
break;
}
}
a=b;
while(a>=b)
{
strcpy(stu[a+1].num,stu[a].num);
strcpy(stu[a+1].name,stu[a].name);
stu[a+1].score=stu[a].score;
a--;
}
strcpy(stu[b].num,nu);
strcpy(stu[b].name,na);
stu[b].score=s;
f.seekg(0,ios:
:
beg);
f.write((char*)stu,sizeof(Student)*count+1);
system("cls");
count++;
findsco(100,f);
}
voidpaisco(fstream&f)
{
Studentstu[max];
inta,b,i,temp;
chartempna[20],tempnu[10];
f.seekg(0,ios:
:
beg);
f.read((char*)&stu,sizeof(Student)*count);
for(a=0;a{
for(b=0;bif(stu[b].score{
strcpy(tempna,stu[b+1].name);
strcpy(stu[b+1].name,stu[b].name);
strcpy(stu[b].name,tempna);
strcpy(tempnu,stu[b+1].num);
strcpy(stu[b+1].num,stu[b].num);
strcpy(stu[b].num,tempnu);
temp=stu[b+1].score;
stu[b+1].score=stu[b].score;
stu[b].score=temp;
}
}
system("cls");
cout<<"排序完成!
"<getch();
for(i=0;i{
stu[i].disp();
cout<}
}//按分数大小排序
voiddelnum(inti,fstream&f)
{
chara;
Studentstu[max];
cout<<"确认删除?
(Y/N):
";
cin>>a;
system("cls");
if(a=='Y'||a=='y')
{
f.seekg(0,ios:
:
beg);
f.read((char*)&stu,sizeof(Student)*count);
while(i{
strcpy(stu[i-1].num,stu[i].num);
strcpy(stu[i-1].name,stu[i].name);
stu[i-1].score=stu[i].score;
i++;
}
f.seekg(0,ios:
:
beg);
f.write((char*)stu,sizeof(Student)*(count-1));
cout<<"该学生资料已删除"<count--;
}
else
cout<<"学生资料未删除"<findsco(100,f);
getch();
}//按指定位置删除;
voidfindnum(charnum[],fstream&f,inti)
{
Studentstu[max];
intj=0,low=0,high=count-1,m;
intflag=0;
f.seekg(0,ios:
:
beg);
f.read((char*)&stu,sizeof(Student)*count);
while(low<=high)
{
m=(low+high)/2;
if(strcmp(stu[m].num,num)==0)
{
j=m+1;
flag=1;
stu[m].disp();
}
if(strcmp(stu[m].num,num)<0)
{
low=m+1;
}
elsehigh=m-1;
}//二分法查找学生学号
if(!
flag)
{
cout<<"查无此人!
"<}
if(i)
{
delnum(j,f);
}
}//1.1,学号查找
voidfindnam(charnam[],fstream&f,inti)
{
Studentst;
intm=0;
f.seekg(0,ios:
:
beg);
boolfd=false;
while(!
f.eof()&&!
fd)
{
f.read((char*)&st,NUM);
if(fd=st.findna(nam))
{
st.disp();
}
m++;
}
if(!
fd)
cout<<"查无此人!
"<if(i)
{
delnum(m,f);
}
}//1.2namesearch
voidfindsco(intsco,fstream&f)
{
Studentstu[max];
intflag=0,i;
f.seekg(0,ios:
:
beg);
f.read((char*)&stu,NUM*count);
for(i=0;i{
if(stu[i].findsc(sco))
{
stu[i].disp();
flag=1;
}
}
if(!
flag)
cout<<"查无此人!
"<}//1.3scoresearch
//菜单区
voidmenu3(void)//删除菜单
{
cout<<"________________________________________"<";
}
voidmenu2(void)//主菜单
{
cout<<"________________________________________"<";
}
voidmenu1(void)//主菜单1.1
{
cout<<"________________________________________"<";
}
//////////////////////////////////////////////////
///////////////////////菜单项/////////////////////
/////////////////////////////////////////////////
voidfind(fstream&f);
voiddel(fstream&f)
{
while
(1)
{
system("cls");
menu3();
chari,a,m[20],n[20];
cin>>i;
if(i=='4')
{
cout<<"任意键退出,按“1”键返回。
";
cin>>a;
if(a=='1')
{
continue;
}
else
system("cls");
cout<<"感谢使用!
"<exit(0);
}
switch(i)
{
case'1':
cout<<"学号:
";
cin>>n;
system("cls");
findnum(n,f,1);
getch();
break;
case'2':
cout<<"姓名:
";
cin>>m;
system("cls");
findnam(m,f,1);
getch();
break;
case'3':
system("cls");
find(f);
break;
default:
system("cls");
cout<<"输入错误,请重新选择!
"<getch();
}
}
}
voidmainmenu(fstream&f)
{
while
(1)
{
system("cls");
menu1();
charn,a,b,nu[20],na[20];
ints;
cin>>n;
if(n=='5')
{
cout<<"任意键退出,按“1”键返回。
";
cin>>a;
if(a=='1')
{
continue;
}
else
system("cls");
cout<<"感谢使用!
"<getch();
system("cls");
cout<<"****************************************"<孟祥熙"<通信与信息工程学院"<电子信息科学与技术"<B08020221"<