课程设计任务书.docx
《课程设计任务书.docx》由会员分享,可在线阅读,更多相关《课程设计任务书.docx(36页珍藏版)》请在冰豆网上搜索。
课程设计任务书
课程设计报告
课程名称计算机程序设计基础
(2)
班级
学号
姓名
指导助教
2014年7月21日
一、设计内容与设计要求
1.课程设计目的
面向对象程序设计课程设计是集中实践性环节之一,是学习完《计算机程序设计基础2》课程后进行的一次全面的综合练习。
要求学生达到熟练掌握C++语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。
2.课题题目
1)学生成绩管理系统
2)图书管理系统
3.设计要求
1)设计课题题目:
每个同学都完成2道课题。
后面有范题,仅供同学们参考,不列入本次课程设计的课题。
2)根据课题完成以下主要工作:
①完成系统需求分析:
包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。
②完成系统总体设计:
包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。
③完成系统详细设计:
数据文件;类层次图;界面设计与各功能模块实现。
④系统调试:
调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。
⑤使用说明书及编程体会:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
⑥关键源程序(带注释)
3)按规定格式完成课程设计报告,并在网络学堂上按时提交。
4)不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
4.程序设计的基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)每套系统中设计的类的数目不少于4个,每个类中要有各自的属性(多于3个)和方法(函数多于3个);
(4)需要定义一个抽象类,采用继承方式派生这些类。
并设计一个多重继承的派生类。
(5)在程序设计中,引入多函数的多态性、运算符重载等机制。
(6)自己设计测试数据,将测试数据存在文件中,通过文件来进行数据读写来测试。
5.创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
、进度安排
小学期
第1周
小学期
第2周
注:
1、一定要保留自己那个课题的完整任务书在课程设计报告里面。
2、“评分表”放在“附录:
源程序清单”的后面。
附录1:
评分表
课程名称:
计算机程序设计基础2
项目
评价
设计方案的合理性与创新性
3×2
设计与调试结果
4×2
设计说明书的质量
1×2
程序基本要求涵盖情况
4×2
程序代码编写素养情况
2×2
课程设计周表现情况
1×2
综合成绩
15×2
教师签名:
日期:
要求和格式示范:
学生考勤管理系统
说明:
范例中红色字体的部分都是必须
目录
1.系统需求分析1
2.总体设计1
3.详细设计1
4.系统调试1
5.结果分析1
6.总结1
附录:
源程序清单
1.系统需求分析
考勤信息记录了学生的缺课情况,它包括:
缺课日期、第几节课(连续用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。
试设计考勤管理系统,使之能提供以下功能:
1)录入学生的缺课记录:
从键盘输入数据(提示:
为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:
缺课日期第几节课课程名称学生姓名缺课类型
每行一条纪录。
例如:
2013-04-292-4中国近现代文学史李云龙迟到
2013-04-282-4大学生社交礼仪马志鹏旷课
2)修改某个学生的缺课记录:
可以对缺课纪录的任意部分进行修改,然后显示一下修改后的纪录。
3)查询某个学生的缺课情况:
查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。
4)统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;
5)统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序;
6)系统以菜单方式工作。
(所谓菜单指用户可以自由选择所要执行的功能。
学生可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。
学生考勤管理系统有广大的用户群,这其中有老师、有教务处主任、有公司管理人员,也可以供给一般用户使用。
总之该系统可以满足用户需求,实现对其管理的人员的考勤工作。
2.总体设计
学生考勤管理系统包含五个大的功能,分别是:
录入学生缺课信息、修改学生缺课信息、查询某个学生的缺课情况、统计某段时间内(以天为单位),旷课学生姓名及旷课节数和统计某段时间内,有学生旷课的课程及旷课人次。
学生的缺课信息主要包含缺课日期,第几节课、课程名称,学生姓名,缺课类型。
在录入学生缺课信息时根据系统提示逐一输入。
每输入完一条信息,系统会提示是否继续输入,用户可以选择继续或返回主菜单。
在修改学生缺课信息时,用户首先输入要修改的学生姓名,系统会检索如果系统中有该学生的相关信息则系统首先会提示用户修改该学生的那一部分信息,用户可自行选择。
如果系统中没有该学生的相关信息,则系统会给相关提示,用户可以选择继续输入要修改的学生姓名或选择退出返回主菜单。
在查询学生缺课信息时,用户先输入要查询的学生姓名,系统检索判断是否存在该
学生的信息然后做出相应的提示。
总之,用户可以方便的在系统提示下进行使用。
学生考勤管理系统中功能模块图:
3.详细设计
学生考勤管理系统中四个类的类层次图为:
图2学生考勤管理系统中四个类的类层次图
学生考勤管理系统中各功能模块的实现:
图3学生考勤管理系统中菜单函数的功能图
1、学生缺课信息录用功能模块:
图4学生缺课信息录入的功能
2、修改某学生缺课信息功能的模块图
图5学生考勤管理系统修改学生缺课信息功能图
3查询某学生缺课信息功能图:
图6学生考勤管理系统查询学生缺课信息功能图
4、统计某段时间内旷课学生姓名及旷课节数功能模块:
图7统计某段时间内旷课学生姓名及旷课节数功能图
5、统计某段时间内,有学生旷课的课程及旷课人次功能模块
图8统计某段时间内,有学生旷课的课程及旷课人次功能图
学生考勤管理系统中四个类的UML图为:
图9学生考勤管理系统中四个类的UML图
4.系统调试
程序编写完成后,我进行了程序调试。
调试过程中,出现了以下问题:
当录入学生缺课信息时,出现了无法退出录入函数的情况,主要原因是输入函数中while循环语句没有设置跳出循环的条件。
除此之外,修改某学生缺课信息时,如果没有该学生的缺课信息,系统没有提示要用户没有该学生信息,也没有建议用户重新输入要修改的学生姓名。
由此我发现了该系统修改学生缺课信息的不足。
于是,我对修改函数进行了修改与完善。
在该函数中,我设置了if语句用来判断系统中是否存有用户要修改的学生缺课信息。
如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在 循环语句中改变循环进行的条件从而终止循环。
至于在修改后显示该学生的缺课信息,运行时发现系统并没有做到这一点,对源代码检查之后发现是修改函数中显示函数的调用出了点问题,显示函数的实参有误,应该把要修改缺课信息的学生所在的信息类对象作为实参,然后用显示函数的形参引用实参对象,通过对象调用信息类的成员函数,从而实现显示功能。
至于该系统的查询功能的实现,在调试时发现还有欠缺,当随便输入一个学生姓名时,系统没有显示该学生的缺课信息,也没有提示系统没有找到该学生的有关信息,经过在查询函数while循环中加入一个if 条件语句后,系统实现了提示用户的功能,如果系统中没有你要查询的学生缺课信息,系统将会提示用户,用户可以继续输入要查询的学生姓名也可以通过按系统设置的退出键选择退出查询环节。
至于两个统计功能至今没有完善,主要是特定时间学生缺课次数和课程的缺课人次的统计问题尚待解决,现如今只完成了一两条学生缺课信息的统计。
主要问题是特定时间这个前提条件对我造成了一定的障碍。
对系统中存储的信息进行查找和统计运用对象指针比较方便,但我没有使用,也算有点遗憾。
在调试过程中我出现的最严重的问题是函数形参引用对象数组,结果系统提示将近几十个错误,在我把函数形参改为对象数组后,错误一下减少了很多。
还有比较突出的问题是整个程序不知哪掉了个}号系统会提示有错,但就不懂那专业术语啥意思。
还有就是我以为派生类公有继承的基类的保护成员在派生类内为公有成员,可编译时才发现是不对的。
通过认真调试,我发现我有了收获。
5.测试结果与分析
本程序的测试数据文件是XXX,,测试结果截图如图?
所示。
………………………………………
这次的课设,我写的程序也没有什么独到之处,我觉得唯一可以从我的程序可以看出的是数组用得比较多,反正是没啥特色,不仅如此,还写得功能不全,实在是惭愧。
现在在这里也只能说说它的不足之处了。
类层次不够清晰,纵观整个程序可以发现四个类之间的关系不甚恰当,我有这个感觉,但我不知如何改进。
函数参数设定不够完美,整个程序中对指针的运用比较少。
对于指针的巧妙运用把握得不够。
还有就是容易missing;或者是},这都是些应该改掉的毛病。
除此以外,我对于怎样用文件保存数据还没深入了解,但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。
在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;然后用cout<
具体为什么我是解释不清了
在调用系统的显示功能时,如果在getname()函数前加一个*号输出的只是一个字符,不加反而能输出所有字符。
getname()函数的返回值为指针类型,但前面说过利用函数返回指针类型的值并不能输出字符数组中所有的字符,为什么这里又可以呢?
老天,这是为什么?
我不知道这一知识,这也算我的程序的不足之处吧!
对于两个统计函数的功能不全,我感到无能为力,我为了这两函数苦思了两天,硬是没凑合来。
到后来,脑子里都乱了,运行时屏幕上尽是些乱七八糟的东西。
老师帮我看看,看有没有什么简单的方法一下搞定它。
结果不是很好,但过程够了就行。
这也是自欺欺人的看法,让我再一次自责吧。
6.总结
这次的程序设计相对于上学期还是有了进步的。
学生考勤管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。
既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。
从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。
通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。
比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。
这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。
这次的实验给以了我警示,它让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。
基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。
总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。
附录:
源程序清单
#include
#include
#include
usingnamespacestd;
//时间类
classtime
{public:
time(inty=0,intm=0,intd=0)
{year=y;month=m;day=d;}
~time(){}
protected:
intyear,month,day;
};
//信息类
classxinxi:
publictime
{public:
xinxi(){tiaoshu++;}
~xinxi(){tiaoshu--;}
voidsetname(char*n){strcpy(name,n);}
voidsettime(inty,intm,intd){year=y;month=m;day=d;}
voidsetqklx(char*qk){strcpy(queke,qk);}
voidsetjieci(char*jc){strcpy(jieci,jc);}
voidsetkechen(char*kc){strcpy(kechen,kc);}
char*getname(){char*n;n=name;returnn;}
char*getqklx(){char*qk=queke;returnqk;}
char*getjieci(){char*jc;jc=jieci;returnjc;}
char*getkechen(){char*gk;gk=kechen;returngk;}
int*gettime();
private:
charname[20];//姓名
charjieci[3],kechen[10],queke[10];
inttm[3];
staticinttiaoshu;
};
intxinxi:
:
tiaoshu=0;
int*xinxi:
:
gettime()
{int*t;
t=tm;
tm[0]=year;
tm[1]=month;
tm[2]=day;
returnt;
}
//缺课课程类
classqkechen:
publicxinxi
{public:
qkechen(){kcshu++;}
~qkechen(){kcshu--;}
intgetrc(xinxist1[],intn,intj);
charqkn[20];//公有数据成员
private:
intrenci;
staticintkcshu;//静态数据成员
};
intqkechen:
:
kcshu=0;
intqkechen:
:
getrc(xinxist1[],intn,intj)
{renci=0;
renci++;
for(inti=0;iif(*(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)
renci++;
returnrenci;
}
//缺课学生类
classqstu:
publicxinxi
{public:
qstu(){qst++;}
~qstu(){qst--;}
voidprint(xinxi&st1);
intgetjs(xinxist1[],intn,intj);
intsetjs(intjs=0)
{jieshu=js;}
charqstn[20];
private:
intjieshu;
staticintqst;//静态数据成员
};
intqstu:
:
qst=0;
//类的实现
voidqstu:
:
print(xinxi&st1)
{
cout<<"|缺课日期|"<<"第几节课|"<<"课程名称|"<<"缺课类型|"<cout<<"|"<<*st1.gettime()<<"|"<<*(st1.gettime()+1)<<*(st1.gettime()+2)<<"|"<<}
intqstu:
:
getjs(xinxist1[],intn,intj)
{inti=0,js=0;
xinximin;
if(*(st1[j].getjieci()+2)!
='\0')
js=+2;
else
js++;
for(i=0;iif(*(st1[i+1].gettime()+1)==*(st1[j].gettime()+1)&&
*(st1[i+1].gettime()+2)==*(st1[j].gettime()+2))
if(strcmp(st1[i+1].getname(),qstn)==0)
{
if(*(st1[i].getjieci()+2)!
='\0')
js=+2;
else
js++;
}
jieshu=js;
returnjieshu;
}
//函数声明
intshuru(xinxist1[]);
voidchaxun(xinxist1[],qstuqt[]);
voidxiugai(xinxist1[],intn);
voidtongji1(xinxist1[],qstuqt1[]);
voidtongji2(xinxist1[],qkechenqk1[]);
voidcaidan();
voidxiansi(xinxi&st1);
voidsetqstn(xinxist1[],qstuqt1[],intn);
voidsetqkn(xinxist1[],qkechenqk[],intn);
//全局变量
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<<"********欢迎进入学生考勤管理系统!
*********"<caidan();
cout<<"--------请选择菜单项:
"<cin>>ch;
switch(ch)
{case1:
g=shuru(tl);break;
case2:
xiugai(tl,g);break;
case3:
chaxun(tl,qt);break;
case4:
tongji1(tl,qt);break;
case5:
tongji2(tl,qk);break;
case6:
exit(0);
}
}
return0;
}
//菜单函数
voidcaidan()
{system("colorA");
cout<<"*************************************************************"<cout<<"*学生考勤管理系统*"<cout<<"*************************************************************"<cout<<"3.-------------查询学生的缺课情况---------------------------*"<cout<<"4.--------统计某段时间内旷课学生姓名及旷课节数--------------*"<cout<<"5.--------统计某段时间内旷课的课程及旷课人次----------------*"<cout<<"6.----------------退出系统----------------------------------*"<}
//输入函数
intshuru(xinxist1[])
{chara;
cout<<"------输入开始!
----"<do{q++;
cout<<"请输入学生姓名"<cin>>name;
st1[q].setname(name);
cout<<"请输入课程名称"<cin>>kechen;
st1[q].setkechen(kechen);
cout<<"请输入缺课日期"<cin>>y>>m>>d;
st1[q].settime(y,m,d);
cout<<"请输入缺课类型"<cin>>queke;
st1[q].setqklx(queke);
cout<<"请输入缺课节次"<cin>>jieci;
st1[q].setjieci(jieci);
cout<<"是否还要继续输入:
(y/n)"<cin>>a;
}while(a=='y');
returnq+1;
}
//修改函数
voidxiugai(xinxist1[],intn)
{
intk=1,j=0,a[10];
intflgh;
inth;
while(k==1)
{cout<<"请输入你要修改缺课记录的学生姓名"<cin>>name;
flgh=0;
for(inti=0;iif(s