程序设计方法专题实验报告班级:电信(硕)81班姓名:尹鑫学号:08058029实验指导教师:徐宏喆唐亚哲吴茜媛实验地点:计算机教学中心实验结束日期:2009年7月23日联系电话:15829087448程序设计方法专题实验一实验任务题目一:模拟图形界面的计算器要求:(1)利用图形函数模拟一个计算器界面;(2)实现+,-,*,/,C,CE等数学计算功能;(3)输入格式为yyyy/mm/dd的数据,然后按‘-’运算按钮,再输入一个yyyy/mm/dd的数据,紧接着按‘=’按钮即可得到两个日期之间相差的天数。例如2009/03/20-2009/03/19=12009/03/20-2009/03/21=-1题目二:寻找基数问题描述:同一个数会由于采用不同的基数,而使得其表现形式完全不一样。我们熟悉的基数有10进制,12进制,60进制,2进制,8进制和16进制。比如数据12,如果我们用2进制表示,则它就是1100;如果用3进制表示就是110;如果用8进制表示则是14。本题目的任务就是与数的进制(也就是基数)有关。本题目会给大家很多个数对(假设每个数对的数用X和Y表示),程序需要解决的问题就是为X和Y各选择一个最小的基数,以使得这两个数在其选择的基数上是一对相等的数。例如,12和5这个数对,我们可以为12选择基数3,为5选择基数6,这样一来12(base3)=5(base6),因为12(base3)就是10进制数5,而5(base6)也是10进制数中的5。要求:输入:程序输入通过文件完成。文件中的每一行都包含一个数对X和Y,两个数通过一个或多个空格符分割,与X和Y相关联的有效基数范围为2~36。X和Y的合理数值表示字符包括0~9和A~Z(表示数值10~35)。文件的最后一行用一个数字0表示输入结束。输入样例文件(base.in):12510A1234123456121020输出:结果存放在一个文件中。该文件中的每一行对应为输入文件中相应的那行数对,输出的格式按照下面的样例文件即可。输出样例文件(base.out):12(base3)=5(base6)10(base10)=A(base11)12(base17)=34(base5)123isnotequalto456inanybase2…361isnotequalto2inanybase2…3610(base2)=2(base3)题目三:“贪吃蛇”游戏要求:(1)一条蛇在一个密闭的围墙内,食物在墙内随机出现;(2)通过键盘的光标键控制蛇的移动,可以在上、下、左、右四个方向移动;(3)蛇头撞到食物,则表示蛇吃掉了食物,得10分,并且蛇的身体长长1节,接着食物再随机出现;(4)蛇移动过程中,若撞到墙或者自己的身体,则游戏结束。二实验内容题目一所涉及的知识点:由于题目要求利用图形函数制作计算机界面,因此,该题目所涉及的主要知识点为图形函数的调用,其次是定义一系列加减乘除等运算函数并调用.在计算日期时,采用计算所给日期到公元0年0月0日之间的天数然后将所得天数相减的方法,所以在计算天数时要考虑平年闰年的情况,还要考虑每个月的天数不同.最后,所有的计算结果都存入一个字符型数组中,并在计算器的显示框内输出.题目二所涉及的知识点:首先读取文件,将读取的数以字符串的形式存入两个数组中,并比较两个数的大小,找出两个数中最大的字符,然后在从最大字符的下一个字符到Z等一系列的基下,将这两个数分别表示为十进制的数,并比较大小,最后将比较结果以文件的形式输出.所以,所涉及的知识有文件的读取,字符的比较,数在不同基下的转换,结果以文件形式输出等等.题目三所涉及的知识点:贪吃蛇在运动过程中,靠方向键控制,只在墙内运动,并且蛇每吃到食物则蛇身增长一节,当蛇头撞到墙上或自己的身体上时,游戏结束.所以,该程序所涉及的知识有,利用函数生成围墙,并将围墙内的空间划分为一系列的小方块,利用ShowSnake()函数将蛇显示在界面内,利用SetFood()函数设置食物,设置方向键以控制蛇的运行,定义函数以判断蛇头是否撞墙,或者撞到自己的身体,如果撞到,则游戏结束.三程序的算法描述题目一程序的算法的N-S图:为简单起见,将日期计算与一般计算分开表述:(1)一般计算的N-S图:绘制计算器主界面单击鼠标左键,消息响应点击区域识别数字区域运算符号区域CCE小数点Suan=true真假将所点区域中的数以字符串的形式赋给ClickOn,并将num赋值,之后令Suan=falseSuan=true真假在显示框内显示出‘0.000000’,之后令Suan=false显示原数值等于号‘=’将inputnum和other赋值为‘0.000000’将other赋值为‘0.000000’将小数点以字符的形式赋到ClickOn中将计算结果‘other’以字符串的形式输出到显示框中等待下一个鼠标消息(2)日期计算的N-S图:题目二程序的算法的N-S图:题目三程序的算法描述:首先,构建围墙,设置围墙大小,并将围墙内的空间划分为一系列的小方块,为每个方块设置坐标,坐标与数组的下标相同.voidCSnakeDlg::MakeMap(){//设置窗口大小intcxWnd=GetSystemMetrics(SM_CXFRAME)*2+MAX_X*PANE_LEN-GetSystemMetrics(SM_CXEDGE);intcyWnd=GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYFRAME)*2+MAX_Y*PANE_LEN-GetSystemMetrics(SM_CYEDGE);SetWindowPos(NULL,0,0,cxWnd,cyWnd,SWP_NOZORDER|SWP_NOMOVE);m_img.LoadBitmap(IDB_PANE);for(inti=0;iMAX_X;i++){for(intj=0;jMAX_Y;j++){m_map[i][j].Create(,WS_CHILD|SS_BITMAP|WS_DISABLED,//创建方块CRect(PANE_LEN*i,PANE_LEN*j,PANE_LEN*(i+1),PANE_LEN*(j+1)),this);m_map[i][j].SetBitmap((HBITMAP)m_img);m_map[i][j].SetPoint(i,j);//为每个方块设置坐标,坐标与数组下标相同}}}蛇在运行过程中,以方向键控制蛇的运动.具体程序如下:voidCSnakeDlg::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:Addyourmessagehandlercodehereand/orcalldefault//游戏的控制switch(nChar){case'W':caseVK_UP:m_snake.MoveUp();break;case'S':caseVK_DOWN:m_snake.MoveDown();break;case'A':caseVK_LEFT:m_snake.MoveLeft();break;case'D':caseVK_RIGHT:m_snake.MoveRight();break;caseVK_ESCAPE:EndDialog(1);//退出程序break;default:;}CDialog::OnKeyDown(nChar,nRepCnt,nFlags);}通过以下程序将蛇显示出来:voidCSnakeDlg::ShowSnake(){intlen=m_snake.GetBodyLen();for(inti=0;ilen;i++){m_map[m_snake.m_body[i].x][m_snake.m_body[i].y].ShowWindow(SW_SHOW);}m_map[m_snake.m_preEnd.x][m_snake.m_preEnd.y].ShowWindow(SW_HIDE);}蛇在运动过程中,吃到食物,则蛇身增加一节,这时,食物从新设置,蛇也以新的形态显示出来,在设置食物时,食物不能与蛇身重合,如果运动时撞墙或者撞到自己的身体,则游戏结束.voidCSnakeDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_snake.KeepMoving();//保持原方向移动一步if(!m_snake.IsTouch(MAX_X,MAX_Y)){//撞墙处理KillTimer(1);InitGame();}else{//不撞墙处理//吃到食物处理if(m_snake.IsEat(m_food)){//蛇变长m_snake.Grow();//放置新食物m_food=SetFood();}//显示蛇ShowSnake();}蛇吃掉食物后,按照如下方式重新设置食物:CPointCSnakeDlg::SetFood(){intx=0;inty=0;CPointfood;boolflag=true;//随机产生,合适的坐标while(flag){srand(time(NULL));x=rand()%MAX_X;y=rand()%MAX_Y;food.x=x;food.y=y;for(inti=0;im_snake.GetBodyLen();i++){if(food!=m_snake.m_body[i])//坐标不能与蛇身重合flag=false;}}m_map[x][y].ShowWindow(SW_SHOW);returnfood;}在编写程序的过程中,还应考虑在游戏开始时,蛇头随机出现,但不能出现在食物上,蛇身上和墙上,这样,所编写的程序才能正常运行.四程序运行结果题目一程序运行结果:题目二程序运行结果:题目三程序运行结果:五实验总结通过这次实验,我感觉收获很多.首先,由于我只是在大一上学期学过程序设计与C语言,并且未学其中有关于文件的知识,所以,半年后从新拾起编程的题目,倍感吃力.于是就到图书馆借了几本有关VisualC++程序设计的书,再加上自己大一时的课本,弄到这些资料后,就在寝室研究起来,在上机之前的那几天里,终于把编这三个程序所需要的知识弄明白了.由于在之前的两节课里,老师已经把这三个题目大致讲了,所以在看完资料后,对这三个题目的处理方法已经有所了解,再也不像刚开始接触题目时那样一头雾水了.从这三个程序编写过程中,我感觉自己的自学能力得到了提高,并且眼界得以扩展,学到了很多新的很有用的东西.其次,这次实验,培养了自己勇于面对困难的优良品质,使自己明白,在面对困难时应该勇敢的迎上去而不应该选择逃避,这样才能解决问题.在刚拿到实验题目时,便是一头雾水,感觉实验难度极大,于是便萌生退意,于是在上第一节课时,就和几个同学一起去找老师,看看能不能把课退掉.后来看到不行,就只能硬着头皮去研究这几个题目,最终在自己的努力,同学的帮助和老师的指导下完成了这几个程序的编写.世上无难事,只要肯攀登,这句话的含义在这一刻显得如此刻骨铭心.再次,通过这次实验,自己的思维方式发生了很大的变化.众所周知,C++面向对象程序设计与C语言的面向过程程序设计相比,是一种全新的思维方式,这种思维方式使得我得以以一种全新的方式看待问题,从而以一种科学的方式来处理问题.这将是我一生都受益无穷的.最后,就程序设计方法专题实验课提一点拙见.(1)程序设计方法专题实验课最好不要放在一个学期的学期末开课,因为此时学校放假,大部分学生都回家了,并且夏天天气很热,这时学生无法静下心来好好分析实验题目,更无从谈起做题,这样很多人就会产生应付了事的想法,甚至抄袭他人的程序,以求完成任务,达不到该课程培养学生编程兴趣的目的.因此,对于这门课,最好能放在学期内和其他课程一样开课.(2)对于实验题目,我想,最好能设置一系列难度系数的题目,学生可以在这些题目里面随意选取三个适合自己的题目,提