C++课程设计报告Word文档下载推荐.docx
《C++课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
需求分析,按照课题要求,搜集查询相关参考资料。
2017年6月13日
至2017年6月14日
概要设计和详细设计阶段,根据前期的需求分析结果,定义系统实现所需要的自定义函数数据类型及个功能函数。
2017年6月15日
至2017年6月17日
程序的进一步完善,调试与测试撰写课程设计报告。
主
要
参
资
料
考
[1].谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2014
[2].梁旭.C语言课程设计(第三版)[M].北京:
电子工业出版社,2013
[3].刁成嘉.面向对象程序设计[M].北京:
机械工业出版社,2004
[4].张鸿.C++语言程序设计[M].北京:
中国电力出版社,2014
指导教师
意见
(签字):
年月日
系(教研室)
主任意见
面向对象程序设计(C++)课程设计说明书
学院名称:
计算机与信息工程学院
班级名称:
通信162
学生姓名:
沈杰
学号:
2016211881__
题目:
学生考勤管理系统的设计与实现
姓名:
王南洋
起止日期:
2017年6月12日至2017年6月17日
1系统需求分析
考勤信息记录了学生的缺课情况,它包括:
缺课日期、第几节课(连续用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。
试设计考勤管理系统,使之能提供以下功能:
1.1录入学生的缺课记录
从键盘输入数据提示,为避免重复从键盘输入数据测试时可将数据存储在文件中,利用输入重定向功能读入。
输入格式为:
缺课日期、第几节课、课程名称、学生姓名、缺课类型,每行一条纪录。
例如:
2016-04-292-4中国近代史李某迟到
2017-04-282-4大学生心理素质马某旷课
1.2修改学生的缺课记录
可以对缺课纪录的任意部分进行修改,然后显示一下修改后的纪录。
1.3查询学生的缺课情况
查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。
1.4统计
1.4.1统计姓名及节数
统计某段时间内(以天为单位)旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序。
1.4.2统计课程及人次
统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序旷课人次相同的课程按课程名称升序排序。
1.5小结
系统以菜单方式工作。
所谓菜单指用户可以自由选择所要执行的功能。
学生可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。
学生考勤管理系统有广大的用户群这其中有老师、有教务处主任、有公司管理人员,也可以供给一般用户使用。
总之,该系统可以满足用户需求,实现对其管理的人员的考勤工作。
2总体设计
学生考勤管理系统包含五个大的功能。
分别是:
录入学生缺课信息、修改学生缺课信息、查询某个学生的缺课情况、统计某段时间内(以天为单位)旷课学生姓名及旷课节数和统计某段时间内,有学生旷课的课程及旷课人次。
学生的缺课信息主要包含缺课日期、第几节课、课程名称、学生姓名、缺课类型。
在录入学生缺课信息时根据系统提示逐一输入。
每输入完一条信息,系统会提示是否继续输入、用户可以选择继续或返回主菜单。
在修改学生缺课信息时,用户首先输入要修改的学生姓名,系统会检索如果系统中有该学生的相关信息则系统首先会提示用户修改该学生的那一部分信息,用户可自行选择。
如果系统中没有该
学生的相关信息,则系统会给相关提示,用户可以选择继续输入要修改的学生姓名或选择退出返回主菜单。
在查询学生缺课信息时,用户先输入要查询的学生姓名。
系统检索判断是否存在该学生的信息然后做出相应的提示。
总之,用户可以方便的在系统提示下进行使用。
图1学生考勤管理系统中功能模块图
3详细设计
学生考勤管理系统中四个类的类层次图为
图2学生考勤管理系统中中四个类的类层次图
学生考勤管理系统中各功能模块的实现
图3学生考勤管理系统中菜单函数的功能图
3.1学生缺课信息录用功能模块
图4学生缺课信息录入的功能
3.2修改某学生缺课信息功能的模块图
图5学生考勤管理系统修改学生缺课信息功能图
3.3查询某学生缺课信息功能图
图6学生考勤管理系统查询学生缺课信息功能图
3.4统计某段时间内旷课学生姓名及旷课节数功能模块
图7统计某段时间内旷课学生姓名及旷课节数功能图
3.5统计某段时间内有学生旷课的课程及旷课人次功能模块
图8统计某段时间内有学生旷课的课程及旷课人次功能图
4系统调试
4.1系统实现
程序编写完成后,我进行了程序调试。
调试过程中,出现了以下问题:
当录入学生缺课信息时,出现了无法退出录入函数的情况,主要原因是输入函数中while循环语句没有设置跳出循环的条件。
除此之外,修改某学生缺课信息时,如果没有该学生的缺课信息,系统没有提示要用户没有该学生信息,也没有建议用户重新输入要修改的学生姓名。
由此我发现了该系统修改学生缺课信息的不足。
在该函数中,也可查询要修改的学生缺课信息。
如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在循环语句中改变循环进行的条件从而终止循环。
系统实现了提示用户的功能,如果系统中没有你要查询的学生缺课信息,系统将会提示用户,用户可以继续输入要查询的学生姓名也可以通过按系统设置的退出键选择退出查询环节。
通过认真调试,我发现我有了收获。
4.2类的设计
附录:
源程序代码(部分主要程序)
//缺课课程类
classqkechen:
publicxinxi
{public:
qkechen(){kcshu++;
}
~qkechen(){kcshu--;
intgetrc(xinxist1[],intn,intj);
charqkn[20];
//公有数据成员
private:
intrenci;
staticintkcshu;
//静态数据成员
};
intqkechen:
:
kcshu=0;
getrc(xinxist1[],intn,intj)
{renci=0;
renci++;
for(inti=0;
i<
n;
i++)
if(*(st1[i+1].gettime()+1)==*(st1[j].gettime()+1)&
&
*(st1[i+1].gettime()+2)==*(st1[j].gettime()+2))
if(strcmp(qkn,st1[i].getkechen())==0)
returnrenci;
}
//缺课学生类
classqstu:
qstu(){qst++;
~qstu(){qst--;
voidprint(xinxi&
st1);
intgetjs(xinxist1[],intn,intj);
intsetjs(intjs=0)
{jieshu=js;
charqstn[20];
intjieshu;
staticintqst;
//静态数据成员
intqstu:
qst=0;
//全局变量
intg,k=1,b=1;
intq=-1;
charname[20],kechen[10],queke[10],jieci[3];
inty,m,d;
//主函数
intmain()
{xinxitl[15];
//定义15条信息类对象
qstuqt[10];
qkechenqk[6];
intch;
while
(1)
{cout<
<
"
********欢迎进入学生考勤管理系统*********"
endl;
caidan();
cout<
--------请选择菜单项:
cin>
>
ch;
switch(ch)
{case1:
g=shuru(tl);
break;
case2:
xiugai(tl,g);
case3:
chaxun(tl,qt);
case4:
tongji1(tl,qt);
case5:
tongji2(tl,qk);
case6:
exit(0);
return0;
//修改函数
voidxiugai(xinxist1[],intn)
{
intk=1,j=0,a[10];
intflgh;
inth;
while(k==1)
{cout<
请输入你要修改缺课记录的学生姓名"
name;
flgh=0;
if(strcmp(name,st1[i].getname())==0)
do{a[j]=i;
1.修改日期2.修改节次3.修改课程名称4.修改缺课类型"
请输入要选择的数值(1,2,3,4)"
intb;
b;
if(b==1)
请输入新日期"
y>
m>
d;
st1[i].settime(y,m,d);
elseif(b==2)
请输入新节次"
jieci;
st1[i].setjieci(jieci);
elseif(b==3)
请输入新课程名称"
kechen;
st1[i].setkechen(kechen);
elseif(b==4)
请输入新缺课类型"
queke;
st1[i].setqklx(queke);
flgh=1;
j++;
}while(b<
1||b>
4);
if(flgh==0)
没有你要找的学生姓名请重试要退出请按0"
k;
else
还要继续吗(1\0)退出请按0"
j;
{h=a[i];
xiansi(st1[h]);
//查询函数
voidchaxun(xinxist1[],qstuqt[])
{
charn='
y'
;
intu[10];
while(n=='
)
{intj=0;
输入你要查询的学生姓名:
inti=0;
for(;
g;
{u[j]=i;
j++;
if(j==0)
没有你所要的学生名字!
//没有找到
是否退出退出请按n\n"
for(inta=0;
a<
a++)
{//只有一条信息
if(j<
2)
{i=u[a];
|缺课日期|"
第几节课|"
课程名称|"
缺课类型|"
|"
*st1[i].gettime()<
*(st1[i].gettime()+1)<
*(st1[i].gettime()+2)<
st1[i].getjieci()<
<
st1[i].getkechen()<
st1[i].getqklx()<
//两条信息以上排序
i=u[a];
if(*(st1[i].gettime()+1)<
*(st1[i+1].gettime()+1))
qt[i].print(st1[i]);
if(*(st1[i].gettime()+1)==*(st1[i+1].gettime()+1)&
*(st1[i+1].gettime()+2))
else
*(st1[i].gettime()+2)==*(st1[i+1].gettime()+2))
if(strcmp(st1[i].getjieci(),st1[i+1].getjieci())==-1)
是否继续查询(y/n)继续请按y退出按n"
//统计某段时间内旷课学生姓名及旷课节数
voidtongji1(xinxist1[],qstuqt1[])
{intd1=0,js=0;
xinximin;
if(g==0)
没有你要统计的学生信息请返回菜单录入学生缺课信息"
elseif(g==1)
姓名:
st1[0].getname()<
if(*(st1[0].getjieci()+2)!
='
\0'
js=+2;
js++;
节数:
js<
//显示函数
voidxiansi(xinxi&
st1)
{cout<
学生姓名|"
cout<
|"
*(st1.gettime())<
*(st1.gettime()+1)<
*(st1.gettime()+2)
st1.getjieci()<
st1.getkechen()<
st1.getname()<
st1.getqklx()<
//删除信息
主要代码如下
voiddel(records*r)//删除学生信息
{
if(r->
n==0)
{
cout<
记录为空!
return;
}
请输入要删除的记录的序号:
(输入-1删除全部)"
flush;
intflag;
flag;
if(flag>
r->
n-1&
flag<
-1)
不存在所要删除的记录!
elseif(flag==-1)r->
n=0;
else
for(inti=flag;
n-1;
i++)
r->
r[i].set(r->
r[i+1]);
r->
n--;
charyn;
保存修改?
(y/n)"
yn;
if(yn=='
)wt(r);
elsereturn;
}
5结果分析
这次的课设,我写的程序也没有什么独到之处,我觉得唯一可以从我的程序可以看出的是数组用得比较多,反正是没啥特色。
不仅如此,还写得功能不全,实在是惭愧。
现在在这里也只能说说它的不足之处了。
类层次不够清晰,纵观整个程序可以发现四个类之间的关系不甚恰当,我有这个感觉。
但我不知如何改进。
函数参数设定不够完美,整个程序中对指针的运用比较少。
对于指针的巧妙运用把握得不够。
还有就是容易missing或者是}这都是些应该改掉的毛病。
除此以外,我对于怎样用文件保存数据还没深入了解。
但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。
在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;
然后用cout<
p;
语句可以输出字符数组里全部的内容,但利用函数返回指针值却不能做到这一点。
在我思考一番后终于明白了,这与内存中的地址值有关。
具体为什么我是解释不清了,调用系统的显示,如果在getname()函数前加一个*号输出的只是一个字符,不加反而能输出所功能时有字符。
getname()函数的返回值为指针类型。
但前面说过利用函数返回指针类型的值并不能输出字符数组中所有的字符,为什么这里又可以呢?
我不知道这一知识,这也算我的程序的不足之处吧!
对于两个统计函数的功能不全,我感到无能为力,我为了这两函数苦思了两天硬是没凑合来。
到后来脑子里都乱了,运行时屏幕上尽是些乱七八糟的东西。
结果不是很好,但过程够了就行。
5.1综合测试原始界面
图9综合测试原始界面
5.1.1录入学生缺课记录
图10录入学生缺课记录
5.1.2修改学生缺课记录
图11修改学生缺课记录
5.1.3查询学生缺课情况
图12查询学生缺课情况
5.1.4统计某段时间旷课学生姓名及旷课节数
图13统计某段时间旷课学生姓名及旷课节数
6总结
这次的程序设计相对于上学期还是有了进步的。
学生考勤管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。
既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。
从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。
通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。
比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。
这次的课程设计中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里。
只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。
这次的实验给以了我警示,它让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。
基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢?
原先我认为是可以的,经过这次程序设计我知道我错了。
总之,我觉得做学问不应该马虎。
对于所学一定要有深入的理解这也是我这次课程设计得到的启示。
参考文献
[3].刁成嘉.面向对象程序设计[M].北京:
[4].张鸿.C++语言程序设计[M].北京:
填表日期:
2017年06月17日
指导教师评语
成绩评定
指导教师签名: