《课程设计任务书676206870.doc》由会员分享,可在线阅读,更多相关《课程设计任务书676206870.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流课程设计任务书676206870.精品文档.袇芁蒀蒇螃芀腿蚃虿袆 课 程 设 计 报 告课程名称 计算机程序设计基础(2) 班 级 学 号 姓 名 指导助教 2013年 7月 22日一、设计内容与设计要求1.课程设计目的面向对象程序设计课程设计是集中实践性环节之一,是学习完计算机程序设计基础2课程后进行的一次全面的综合练习。要求学生达到熟练掌握C+语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。2.课题题目1)学生成绩管理系统2) 图
2、书管理系统3设计要求1)设计课题题目:每个同学都完成2道课题。 后面有范题,仅供同学们参考,不列入本次课程设计的课题。2)根据课题完成以下主要工作:完成系统需求分析:包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。完成系统总体设计:包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。完成系统详细设计:数据文件;类层次图;界面设计与各功能模块实现。系统调试:调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。使用说明书及编程体会:说明如何使用你编写的程序,详细列出每一步的操作步骤。关键源程序(带注释)3)按规定格式完成课程设计报告,并在网络学堂上按时
3、提交。4)不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。4. 程序设计的基本要求: (1)要求利用面向对象的方法以及C+的编程思想来完成系统的设计; (2)要求在设计的过程中,建立清晰的类层次; (3)每套系统中设计的类的数目不少于4个,每个类中要有各自的属性(多于3个)和方法(函数多于3个); (4)需要定义一个抽象类,采用继承方式派生这些类。并设计一个多重继承的派生类。(5)在程序设计中,引入多函数的多态性、运算符重载等机制。(6)自己设计测试数据,将测试数据存在文件中,通过文件来进行数据读写来测试。5.创新要求: 在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功
4、能。 、进度安排小学期第 1 周小学期第 2 周注:1、一定要保留自己那个课题的完整任务书在课程设计报告里面。 2、“评分表”放在“附录:源程序清单”的后面。附录1:评分表课程名称: 计算机程序设计基础2 项 目评 价设计方案的合理性与创新性32设计与调试结果42设计说明书的质量12程序基本要求涵盖情况42程序代码编写素养情况22课程设计周表现情况12综合成绩152 教师签名: 日 期: 要求和格式示范:学生考勤管理系统说明:范例中红色字体的部分都是必须目 录1.系统需求分析12.总体设计13.详细设计14.系统调试15.结果分析16.总结1附录:源程序清单1. 系统需求分析 考勤信息记录了学
5、生的缺课情况,它包括:缺课日期、第几节课(连续用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计考勤管理系统,使之能提供以下功能:1) 录入学生的缺课记录:从键盘输入数据(提示:为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:缺课日期 第几节课 课程名称 学生姓名 缺课类型每行一条纪录。例如:2013-04-29 2-4 中国近现代文学史 李云龙 迟到2013-04-28 2-4 大学生社交礼仪 马志鹏 旷课2) 修改某个学生的缺课记录:可以对缺课纪录的任意部分进行修改,然后显示
6、一下修改后的纪录。3) 查询某个学生的缺课情况:查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。4) 统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;5) 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序; 6) 系统以菜单方式工作。(所谓菜单指用户可以自由选择所要执行的功能。学生可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情
7、。学生考勤管理系统有广大的用户群,这其中有老师、有教务处主任、有公司管理人员,也可以供给一般用户使用。总之该系统可以满足用户需求,实现对其管理的人员的考勤工作。2. 总体设计学生考勤管理系统包含五个大的功能,分别是:录入学生缺课信息、修改学生缺课信息、查询某个学生的缺课情况、统计某段时间内(以天为单位),旷课学生姓名及旷课节数和统计某段时间内,有学生旷课的课程及旷课人次。学生的缺课信息主要包含缺课日期,第几节课、课程名称,学生姓名,缺课类型。在录入学生缺课信息时根据系统提示逐一输入。每输入完一条信息,系统会提示是否继续输入,用户可以选择继续或返回主菜单。在修改学生缺课信息时,用户首先输入要修改
8、的学生姓名,系统会检索如果系统中有该学生的相关信息则系统首先会提示用户修改该学生的那一部分信息,用户可自行选择。如果系统中没有该学生的相关信息,则系统会给相关提示,用户可以选择继续输入要修改的学生姓名或选择退出返回主菜单。在查询学生缺课信息时,用户先输入要查询的学生姓名,系统检索判断是否存在该学生的信息然后做出相应的提示。总之,用户可以方便的在系统提示下进行使用。学生考勤管理系统中功能模块图:修改某学生的缺课信息查询某学生的缺课信息统计某段时间内旷课学生姓名及旷课节数统计某段时间内,有学生旷课的课程及旷课人次录入学生的缺课信息学生考勤管理系统录入缺课学生的姓名、缺课日期、缺课节次、缺课课程名称
9、、缺课类型修改某学生的缺课日期、缺课节次、缺课课程名称、缺课类型查询某学生的缺课日期、缺课节次、缺课课程名称、缺课类型按时间升序显示旷课学生姓名及旷课节数按时间升序显示有学生旷课的课程及旷课人次3. 详细设计学生考勤管理系统中四个类的类层次图为:Time类Xinxi类qstu类qkechen类图2 学生考勤管理系统中四个类的类层次图学生考勤管理系统中各功能模块的实现:菜单 统计某段时间内,有学生旷课的课程及旷课人次统计某段时间内旷课学生姓名及旷课节数查询某学生的缺课信息录入学生的缺课信息修改某学生的缺课信息 图3 学生考勤管理系统中菜单函数的功能图1、 学生缺课信息录用功能模块:学生缺课信息录
10、用功能录入学生缺课节次录入学生缺课日期录入学生缺课课程名称录入缺课学生姓名录入学生缺课类型图4 学生缺课信息录入的功能2、 修改某学生缺课信息功能的模块图修改某学生的缺课节次修改某学生缺课信息功能修改某学生的缺课日期修改某学生的缺课课程修改某学生的缺课类型图5 学生考勤管理系统修改学生缺课信息功能图3 查询某学生缺课信息功能图:查询某学生缺课信息功能输入要查询的学生姓名显示要查询的学生缺课信息继续查询或返回菜单图6 学生考勤管理系统查询学生缺课信息功能图4、 统计某段时间内旷课学生姓名及旷课节数功能模块:统计某段时间内旷课学生姓名及旷课节数功能统计某段时间内旷课学生姓名及旷课节数显示某段时间内
11、旷课学生姓名及旷课节数返回菜单图7统计某段时间内旷课学生姓名及旷课节数功能图5、统计某段时间内,有学生旷课的课程及旷课人次功能模块统计某段时间内,有学生旷课的课程及旷课人次统计某段时间内,有学生旷课的课程及旷课人次功能显示某段时间内,有学生旷课的课程及旷课人次返回菜单图8 统计某段时间内,有学生旷课的课程及旷课人次功能图学生考勤管理系统中四个类的UML图为:Time-year:int-month:int-day:int+time()+time()Xinxi-name20:char-kechen10:char-jieci3:char- queke10:char-tm3:char-tiaoshu:
12、int=0+xinxi()+xinxi()+setname(n:char*):void +settime(y:int, m:int,d:int):void+setqklx(qk: char*): void+setjieci(jc: char*):void+setkechen(kc: char*):void+getname():char*+getqklx():char*+getjieci():char*+getkechen():char* +gettime():int*qkechen-renci:int-kcshu:int=0+qkechen()+qkechen()+getrc(st1:xinx
13、i,n:int ,j:int):int+qkn20:charqstu-jieshu:int -qst:int+qstu()+qstu()+print(st1:xinxi &):void+getjs( st1:xinxi,n:int, j:int):int+setjs(js:int=0):int +qstn20:char基类派生类派生类派生类 图 9 学生考勤管理系统中四个类的UML图4. 系统调试程序编写完成后,我进行了程序调试。调试过程中,出现了以下问题:当录入学生缺课信息时,出现了无法退出录入函数的情况,主要原因是输入函数中while循环语句没有设置跳出循环的条件。除此之外,修改某学生缺课
14、信息时,如果没有该学生的缺课信息,系统没有提示要用户没有该学生信息,也没有建议用户重新输入要修改的学生姓名。由此我发现了该系统修改学生缺课信息的不足。于是,我对修改函数进行了修改与完善。在该函数中,我设置了if语句用来判断系统中是否存有用户要修改的学生缺课信息。如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在循环语句中改变循环进行的条件从而终止循环。至于在修改后显示该学生的缺课信息,运行时发现系统并没有做到这一点,对源代码检查之后发现是修改函数中显示函数的调用出了点问题,显示函数的实参有误,应该把要修改缺课信息的学生所在的信息类对象作为实参
15、,然后用显示函数的形参引用实参对象,通过对象调用信息类的成员函数,从而实现显示功能。至于该系统的查询功能的实现,在调试时发现还有欠缺,当随便输入一个学生姓名时,系统没有显示该学生的缺课信息,也没有提示系统没有找到该学生的有关信息,经过在查询函数while循环中加入一个if条件语句后,系统实现了提示用户的功能,如果系统中没有你要查询的学生缺课信息,系统将会提示用户,用户可以继续输入要查询的学生姓名也可以通过按系统设置的退出键选择退出查询环节。至于两个统计功能至今没有完善,主要是特定时间学生缺课次数和课程的缺课人次的统计问题尚待解决,现如今只完成了一两条学生缺课信息的统计。主要问题是特定时间这个前
16、提条件对我造成了一定的障碍。对系统中存储的信息进行查找和统计运用对象指针比较方便,但我没有使用,也算有点遗憾。在调试过程中我出现的最严重的问题是函数形参引用对象数组,结果系统提示将近几十个错误,在我把函数形参改为对象数组后,错误一下减少了很多。还有比较突出的问题是整个程序不知哪掉了个 号系统会提示有错,但就不懂那专业术语啥意思。还有就是我以为派生类公有继承的基类的保护成员在派生类内为公有成员,可编译时才发现是不对的。通过认真调试,我发现我有了收获。5. 测试结果与分析本程序的测试数据文件是XXX,, 测试结果截图如图?所示。这次的课设,我写的程序也没有什么独到之处,我觉得唯一可以从我的程序可以
17、看出的是数组用得比较多,反正是没啥特色,不仅如此,还写得功能不全,实在是惭愧。现在在这里也只能说说它的不足之处了。类层次不够清晰,纵观整个程序可以发现四个类之间的关系不甚恰当,我有这个感觉,但我不知如何改进。函数参数设定不够完美,整个程序中对指针的运用比较少。对于指针的巧妙运用把握得不够。还有就是容易missing;或者是,这都是些应该改掉的毛病。除此以外,我对于怎样用文件保存数据还没深入了解,但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;然后用c
18、outp;语句可以输出字符数组里全部的内容,但利用函数返回指针值却不能做到这一点,在我思考一番后终于明白了,这与内存中的地址值有关。具体为什么我是解释不清了在调用系统的显示功能时,如果在getname()函数前加一个*号输出的只是一个字符,不加反而能输出所有字符。getname()函数的返回值为指针类型,但前面说过利用函数返回指针类型的值并不能输出字符数组中所有的字符,为什么这里又可以呢?老天,这是为什么?我不知道这一知识,这也算我的程序的不足之处吧!对于两个统计函数的功能不全,我感到无能为力,我为了这两函数苦思了两天,硬是没凑合来。到后来,脑子里都乱了,运行时屏幕上尽是些乱七八糟的东西。老师
19、帮我看看,看有没有什么简单的方法一下搞定它。结果不是很好,但过程够了就行。这也是自欺欺人的看法,让我再一次自责吧。6. 总结这次的程序设计相对于上学期还是有了进步的。学生考勤管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。平时
20、遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。这次的实验给以了我警示,它让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。 总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这
21、次课设得到的启示。附录:源程序清单 #include#include#includeusing namespace std; /时间类class time public: time(int y=0,int m=0,int d=0) year=y;month=m;day=d; time() protected: int year,month,day; /信息类 class xinxi:public time public: xinxi() tiaoshu+; xinxi()tiaoshu-; void setname(char *n)strcpy(name,n); void settime(in
22、t y,int m,int d)year=y;month=m;day=d; void setqklx(char *qk)strcpy(queke,qk); void setjieci(char *jc)strcpy(jieci,jc); void setkechen(char *kc)strcpy(kechen,kc); char *getname()char *n;n=name;return n; char *getqklx()char *qk=queke;return qk; char *getjieci()char *jc;jc=jieci;return jc; char *getkec
23、hen()char *gk;gk=kechen;return gk; int *gettime(); private: char name20;/姓名 char jieci3,kechen10,queke10; int tm3; static int tiaoshu; int xinxi:tiaoshu=0; int *xinxi:gettime() int *t; t=tm; tm0=year; tm1=month; tm2=day; return t; /缺课课程类 class qkechen:public xinxi public: qkechen()kcshu+; qkechen()k
24、cshu-; int getrc(xinxi st1,int n,int j); char qkn20;/公有数据成员 private: int renci; static int kcshu;/静态数据成员 int qkechen:kcshu=0; int qkechen:getrc(xinxi st1,int n,int j) renci=0; renci+; for(int i=0;in;i+) if(*(st1i+1.gettime()+1)=*(st1j.gettime()+1)&*(st1i+1.gettime()+2)=*(st1j.gettime()+2)if(strcmp(q
25、kn,st1i.getkechen()=0) renci+; return renci; /缺课学生类 class qstu:public xinxi public: qstu()qst+; qstu()qst-; void print(xinxi &st1); int getjs(xinxi st1,int n,int j); int setjs(int js=0) jieshu=js; char qstn20; private: int jieshu; static int qst; /静态数据成员 int qstu:qst=0; /类的实现 void qstu:print(xinxi &
26、st1)cout| 缺课日期 | 第几节课 | 课程名称 | 缺课类型|endl; cout|*st1.gettime()|*(st1.gettime()+1)*(st1.gettime()+2)|st1.getjieci()| st1.getkechen()|st1.getqklx()|endl; int qstu:getjs(xinxi st1,int n,int j) int i=0,js=0; xinxi min; if(*(st1j.getjieci()+2)!=0) js=+2; else js+; for(i=0;in;i+) if(*(st1i+1.gettime()+1)=*
27、(st1j.gettime()+1)& *(st1i+1.gettime()+2)=*(st1j.gettime()+2) if(strcmp(st1i+1.getname(),qstn)=0) if(*(st1i.getjieci()+2)!=0) js=+2; else js+; jieshu=js; return jieshu; / 函数声明int shuru(xinxi st1);void chaxun(xinxi st1,qstu qt);void xiugai(xinxi st1,int n);void tongji1(xinxi st1,qstu qt1);void tongji
28、2(xinxi st1,qkechen qk1);void caidan();void xiansi(xinxi &st1);void setqstn(xinxi st1,qstu qt1,int n);void setqkn(xinxi st1,qkechen qk,int n);/全局变量int g,k=1,b=1;int q=-1;char name20,kechen10,queke10,jieci3;int y,m,d; /主函数int main() xinxi tl15;/定义15条信息类对象 qstu qt10; qkechen qk6; int ch; while(1)cout*
29、欢迎进入学生考勤管理系统!*endl; caidan(); cout-请选择菜单项:ch; switch(ch) case 1: g=shuru(tl); break; case 2: xiugai(tl,g); break; case 3: chaxun(tl,qt); break; case 4: tongji1(tl,qt); break; case 5: tongji2(tl,qk); break; case 6: exit(0); return 0; /菜单函数 void caidan() system(color A);cout*endl;cout* 学生考勤管理系统 *endl;
30、cout*endl; cout1.-录入学生的缺课记录-*endl; cout2.-修改学生的缺课记录-*endl;cout3.-查询学生的缺课情况-*endl;cout4.-统计某段时间内旷课学生姓名及旷课节数-*endl; cout5.-统计某段时间内旷课的课程及旷课人次-*endl;cout6.-退出系统-*endl; /输入函数 int shuru(xinxi st1) char a; cout-输入开始!-endl; do q+; cout请输入学生姓名name; st1q.setname(name); cout请输入课程名称kechen; st1q.setkechen(kechen
31、); cout请输入缺课日期ymd; st1q.settime(y,m,d); cout请输入缺课类型queke; st1q.setqklx(queke); cout请输入缺课节次jieci; st1q.setjieci(jieci); cout是否还要继续输入:(y/n)a;while(a=y);return q+1; /修改函数 void xiugai(xinxi st1,int n) int k=1,j=0,a10; int flgh; int h; while(k=1) cout请输入你要修改缺课记录的学生姓名name; flgh=0; for(int i=0;in;i+) if(st
32、rcmp(name,st1i.getname()=0) do aj=i; cout1.修改日期2.修改节次3.修改课程名称4.修改缺课类型endl; cout请输入要选择的数值(1,2,3,4)b; if(b=1) cout请输入新日期ymd;st1i.settime(y,m,d); else if(b=2) cout请输入新节次jieci; st1i.setjieci(jieci); else if(b=3) cout请输入新课程名称kechen; st1i.setkechen(kechen); else if(b=4) cout请输入新缺课类型queke; st1i.setqklx(que
33、ke); flgh=1;j+;while(b4);if(flgh=0)cout没有你要找的学生姓名,请重试要退出请按0k; else cout还要继续吗(10)退出请按0k; for(int i=0;ij;i+) h=ai; xiansi(st1h); / 查询函数 void chaxun(xinxi st1,qstu qt) char n=y;int u10;while(n=y) int j=0;cout输入你要查询的学生姓名:name; int i=0;for(;ig;i+) if(strcmp(name,st1i.getname()=0) uj=i; j+; if(j=0) cout没有
34、你所要的学生名字!;/没有找到 coutn;for(int a=0;aj;a+) /只有一条信息if(j2) i=ua; cout| 缺课日期 | 第几节课 | 课程名称 | 缺课类型|endl; cout| *st1i.gettime()| *(st1i.gettime()+1)| *(st1i.gettime()+2)| st1i.getjieci()| st1i.getkechen()| st1i.getqklx()| endl; /两条信息以上排序 else i=ua; if(*(st1i.gettime()+1)*(st1i+1.gettime()+1) qti.print(st1i
35、); else if(*(st1i.gettime()+1)=*(st1i+1.gettime()+1)& *(st1i.gettime()+2)*(st1i+1.gettime()+2) qti.print(st1i);else if(*(st1i.gettime()+1)=*(st1i+1.gettime()+1)& *(st1i.gettime()+2)=*(st1i+1.gettime()+2) if(strcmp(st1i.getjieci(),st1i+1.getjieci()=-1) qti.print(st1i); cout是否继续查询(y/n)继续请按y退出按nn; /统计某
36、段时间内旷课学生姓名及旷课节数 void tongji1(xinxi st1,qstu qt1) int d1=0,js=0;xinxi min;if(g=0)cout没有你要统计的学生信息请返回菜单录入学生缺课信息endl; else if(g=1)cout姓名:st10.getname()endl; if(*(st10.getjieci()+2)!=0) js=+2; else js+;cout节数:jsendl;else/信息按时间排序int i=0;for(;i(g-1);i+) if(*(st1i.gettime()+1)*(st1i+1.gettime()+1) min=st1i;
37、st1i=st1i+1;st1i+1=st1i; else if(*(st1i.gettime()+1)=*(st1i+1.gettime()+1)& *(st1i.gettime()+2)*(st1i+1.gettime()+2) min=st1i;st1i=st1i+1;st1i+1=st1i; else if(*(st1i.gettime()+1)=*(st1i+1.gettime()+1)&*(st1i.gettime()+2)=*(st1i+1.gettime()+2) d1+; for(int j=0;j(g-d1);j+) cout*st1j.gettime()*(st1j.gettime()+1)*(st1j.gettime()+2)endl; for(i=0;ik;i+) setqstn(st1,qt1,g); cout姓名:qt1i.qstne