计算机学院计算机科学与技术专业《程序设计综合课程设计》报告(2011/2012学年第一学期)学生姓名:学生班级:学生学号:指导教师:2011年12月30日于氏打字通目录第一章课程设计目的和要求 (1)1.1 目的 (1)1.2 要求 (1)第二章课程设计任务内容 (3)第三章详细设计说明 (4)3.1 模块描述 (4)3.2 性能 (4)3.3 输入项 (4)3.4 输出项 (4)3.5 流程逻辑 (5)3.6 限制条件 (8)3.7 测试计划 (8)第四章软件使用说明 (13)第五章课程设计心得与体会 (14)附录1:参考文献 (16)附录1:程序清单 (17)第一章课程设计目的和要求1.1目的C++语言课程设计的主要目的是培养学生综合运用C++程序设计课程所学到的知识,编写C++程序解决实际问题的能力,以及严谨的工作态度和良好的程序设计习惯。
通过课程设计的训练,学生应该能够了解程序设计的基本开发过程,掌握编写、调试和测试C++语言程序的基本技巧,充分理解结构化程序设计的基本方法。
C++语言程序设计的主要任务时要求学生遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,分析、设计、编写、调试和测试C++语言程序及编写设计报告。
本次课程设计是通过设计一个较为简单的“打字游戏”,进一步熟悉C++中有关各种知识的运用与掌握。
了解系统开发的需求分析、模块分析、程序流程图、编码测试、模块组装与整体调试的全过程,加深对C++的理解与Visual C++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯,进一步培养完善的C++编程设计思维,为以后进行软件编程、数据库管理等深入学习打下一个牢固基础掌握并且熟练应用《C++程序设计》中所学知识。
掌握函数功能的划分方法,并运用此方法解决问题。
学会程序测试方案的制定,并且实现程序的测试。
通过此次实践,积累经验,提高分析和解决问题的能力。
1.2要求课程设计需要从整体来考虑,在大的方向下来考虑小的模块,在继续分工。
作到最小化,可执行化。
1)对于课程设计需要自己筹划一下自己如何去下手,让自己的方案能够用C++来执行。
2)对于运行结果的处理,再运行程序时可能会遇到一些其他问题,对于运行结果的处理主要是在达不到自己的期望是,就要对其进行分析。
3)错误的改正,在对于编程中错误的改正也是一重要的步骤,学会错误的改正才能更好的提高自己。
4)巩固和加深学生对C++语言课程的基本知识的理解和掌握;5)掌握C++语言编程和程序调试的基本技能;6)掌握利用C++语言进行软件设计的方法;7)提高书写程序设计说明文档的能力;8)提高运用C++语言解决实际问题的能力。
第二章课程设计任务内容打字游戏对于玩家的打字能力和反应能力都有很大帮助,游戏中玩家需要对屏幕上显出的字母、单词或句子迅速做出反应。
并且能尽自己最大的能力,在最短的时间内取得优异的成绩。
通过所学的C++编程语言知识,在Visual C++ studio 2008的语言环境中编写程序,以实现以下内容:完成“于氏打字通”的游戏,使该游戏能够实现如下功能:1.简要介绍游戏的开发背景、目的及意义;2.提示玩家该游戏的规则;3.使玩家可以根据自己的实际需要和水平选择关卡;4.使玩家能够在需要时退出;5.将玩家结束游戏的时间与程序中已设时间的作比较来判断玩家的成绩。
第三章详细设计说明3.1模块描述该程序整体较易理解,共分三个模块:头文件,源文件和资源文件,所以总体来看层次有序,简单易懂。
3.2性能该程序具有操作简单,无需组建等工序,直接编译、连接即可运行。
操作简单,根据提示即可完成游戏的全过程。
3.3输入项只需在游戏过程中按照提示输入,开始、选择关卡,重新开始或者退出即可,以上输入为数字输入,可按照提示输入相应数字。
3.4输出项系统会自动调用资源文件中3个txt文本文件中的数据,数据为从左到右依次读取,当游戏结束时,系统会将玩家结束游戏的时间与程序中已设时间的作比较来判断玩家的成绩。
3.5流程逻辑该程序采用循环套循环的方式,结构简单易懂,但是较为繁琐。
主要思路为,屏幕上出现字母、单词、句子,系统判断玩家输入的字母是否是屏幕显示的字母,另外,当玩家将库中所有字母打完后,系统在判断时间是否超过系统的预设时间,最后给玩家输出成绩。
主要流程图如下:主流程如图(1):图(1)图(2)打字流程图(3)图(3)打字流程图(4)图(4)3.6限制条件该程序必须在Visual C++ studio 2008环境中运行。
在玩家输入错误后系统会自动退出没有提醒信息。
由于程序用的循环较多并且程序较为繁琐,尤其是随机抽取牌的时候,循环次数较多,所以程序可能有时运行较慢,玩家需要等待,但是时间是非常短的。
3.7测试计划分别有意输入想要的结果,看其是否能够运行。
如输入结果,分别为:游戏开始、选择关卡、开始游戏、输出成绩、退出等。
游戏开始游戏规则提示,如图(4):图(4)选择关卡,如图(5):图(5)进行游戏,如图(6):图(6)运行结果如图(7):图(7)运行结果如图(8):图(9)运行结果如图(10):图(10)图(11)第四章软件使用说明该程序必须在Visual studio 2008环境中运行,程序具有操作简单,无需组建等工序,直接编译、连接即可运行。
操作简单,根据提示即可完成游戏的全过程。
另外,编码操作完成后,先静态检查一下有没有语法错误,然后进行编译,更深一步检查语法错误。
待编译通过时,运行程序,观察是否能够正常运行,如果有问题,再去修改源程序,直至达到了预期的效果。
第五章课程设计心得与体会通过这次课程设计的实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C++语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。
在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。
在具体操作中对这学期所学的C++语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C++语言具有的语句简洁,使用灵活,执行效率高等特点。
发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。
通过实际操作,学会C++语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。
深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”……的寓意。
同时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。
对于课程设计一开始有一种一头雾水的感觉,它是干什么的,我要怎么做。
拿下来题目之后,觉得以我的能力根本就不可能实现这个题目的要求,可是慢慢我发现它并非不可实现。
只要耐心的分析它要的功能需要什么函数实现,就可以做到。
于是我就着手做这个程序,可是它也并不像我想得那么简单。
在设计中刚开始出现了一百多个错误,令我一头雾水,但是在经过几天的检查与修改后,能够编译出来,这令我非常的高兴,但是运行结果有点出乎我的意料,所运行的结果,不能达到所期望的,但是经过一番修改后,能够输出,并且能进行游戏,这让我喜出望外。
另外,这次的课程设让我认识到很多C++的内在要素:1.程序设计语言是程序设计的工具。
这是我通过两周课程设计深深体会的一点,并且发现如果想有效的进行程序设计,正确地应用程序设计语言表达算法,必须准确的运用程序设计语言,掌握其语法知识。
2.学习程序设计必须重视时间环节,多读程序,多编写程序,多上机实践。
这次的课程设计就使得课堂教学、式样和实践之间的关系更为紧密。
对我的学习有着很深远的影响。
3.我发现作为一个程序设计人员,需要掌握面向过程的程序设计,也要掌握面向对象的程序设计。
从前,人们通过C++语言学习面向过程的程序设计,再通过C++学习面向对象的程序设计。
其实C++并不是纯粹的面向对象的语言,它是一种混合语言。
学习C++既可以编写面向过程的程序,也可以编写面向对象的程序。
这一点是我通过可课程设计所的实践发现的。
4. 深切的感受到了C++语法的复杂,内容的繁多。
发现如果对它缺乏系统的了解,将难以真正的运用,编出来的程序错误百出。
[1]谭浩强著.C++程序设计.北京:清华大学出版社,2004。
[2]谭浩强著.C++程序设计题解与上机指导.北京:清华大学出版社,2005。
Main.cpp#include <iostream>#include "welcome.h"#include "specialfunc.h"#include "shixian.h"using namespace std;int main(){//welcome();if(!judge(shixian(choose()))){exit(0);}gotoxy(15,15);cout<<"是否继续游戏?(Y/N)...";char ch=0;while(ch=toupper(getchar())){if(ch=='Y'){if(!judge(shixian(choose())))exit(0);else{gotoxy(15,15);cout<<"是否继续游戏?(Y/N)...";}}else if(ch=='N')break;}return 0;}Shixian.hint shixian(int filenum);int judge(int ntime);Shixian.cpp#include <iostream>#include <fstream>#include "specialfunc.h"#include <conio.h>#include "welcome.h"#include <time.h>using namespace std;//#define MAXLINE 18#define BEGINLINE 4#define BEGINCOLUM 6int shixian(int filenum){//time_t ntime=0;ntime=time(NULL);frame();char filename[50]={0};sprintf_s(filename,"data\\%d.txt",filenum); ifstream ifsRead(filename);char buffer1[200]={0};char buffer2[200]={0};char * pBuf1=buffer1;char * pBuf2=buffer2;if(ifsRead){memset(buffer1,0,sizeof(buffer1));memset(buffer2,0,sizeof(buffer2));ifsRead.getline(buffer1,sizeof(buffer1)-1);ifsRead.getline(buffer2,sizeof(buffer2)-1);char ch=0;int nline=BEGINLINE;int ncolum=BEGINCOLUM;while(ifsRead){//gotoxy(ncolum,nline);cout<<buffer1;if(nline>=MAXLINE||ifsRead.peek()==EOF){//如果是显示区最后一行,则在打对字符后直接削去,最后在显示区第一行显示下一句话gotoxy(5,nline);while(*pBuf1!=0){ch=_getch();if(ch==*pBuf1){gotoxy(ncolum,nline);cout<<' ';pBuf1++;ncolum++;}}frame();nline=BEGINLINE;gotoxy(BEGINCOLUM,nline);cout<<buffer2;}else{//在下两行显示下一句nline+=2;gotoxy(ncolum,nline);while(*pBuf1!=0){ch=_getch();if(ch==*pBuf1){gotoxy(ncolum,nline);cout<<*pBuf2;gotoxy(ncolum,nline-2);cout<<' ';pBuf1++;pBuf2++;ncolum++;}}}memset(buffer1,0,sizeof(buffer1));//strcpy_s(buffer1,buffer2);memcpy(buffer1,buffer2,sizeof(buffer1));memset(buffer2,0,sizeof(buffer1));ifsRead.getline(buffer2,sizeof(buffer2)-1);pBuf1=buffer1;pBuf2=buffer2;ncolum=BEGINCOLUM;}}else{cout<<"error open file"<<endl;exit(0);}return int(time(NULL)-ntime);}#define MAXTIME 60//判断是否闯关是否成功int judge(int ntime){//if(ntime>MAXTIME){gotoxy(15,19);cout<<"你太慢了!!!受不了你了!!!BYE!!!";gotoxy(15,21);cout<<" 按任意键退出吧!!!";_getch();return 0;}else{gotoxy(15,19);cout<<"哎呦!!!还不错哦!!!";gotoxy(15,21);cout<<" 按任意键继续吧!!!";_getch();return 1;}}Welcome.h//int welcome();int frame();int choose();Welcome.cpp#include <iostream>#include "welcome.h"#include "specialfunc.h" using namespace std;//chooseint choose(void){//frame();gotoxy(0,5);cout<<" 1. "<<endl<<endl<<" 2. "<<endl<<endl<<" 3. "<<endl;gotoxy(20,15);cout<<"请输入您的选择:";char ch=0;while(ch=getchar()){if(ch>='1'&&ch<='3')return ch-'0';}}//welcomeint welcome(void ){frame();gotoxy(0,2);cout<<" "<<endl;cout<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" ** **"<<endl;cout<<" * *"<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" !@#¥…&* 于氏打字通 *&…¥#@ !"<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" "<<endl;cout<<" * *"<<endl;cout<<" 按任意键开始游戏...";_getch();return 0;}//frameint frame(){clrscr();//headfor(int j=0;j<2;j++){for(int i=0;i<76;i++)cout<<'*';cout<<endl;}cout<<" 欢迎使用于氏打字通 "<<endl;//borderfor(int i=0;i<24;i++){gotoxy(76,i);cout<<"**";}//endgotoxy(0,22);for(int j=0;j<2;j++){for(int i=0;i<76;i++)cout<<'*';cout<<endl;}gotoxy(0,2);return 0;}Specialfunc.h#include <windows.h>#ifndef STDIO#define STDIO#include <iostream>using namespace std;#endif#include <conio.h>void gotoxy(int x, int y);void clrscr(void);void OboOutput(char *pstr,int interval,int maxchar);Specialfunc.cpp#ifndef SPECIALFUNC#define SPECIALFUNC#include "specialfunc.h"#endif//gotoxy function ,set the cursor to(x,y)void gotoxy(int x, int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}//clrscr funciont,implement clear screen void clrscr(void){system("cls");}。