C语言推箱子.docx
《C语言推箱子.docx》由会员分享,可在线阅读,更多相关《C语言推箱子.docx(12页珍藏版)》请在冰豆网上搜索。
C语言推箱子
实训报告
题目:
推箱子
院系:
信息科技学院
专业:
通信工程
姓名:
学号:
指导教师:
日期:
2009-9-19
桂林电子科技大学信息科技学院
目录
1问题定义…………………………………………………………………………..3
2详细设计………………………………………………………………………………4
2.1数据结构设计…………………………………………………………4
2.2主控流程…………………………………………………………………………5
2.3输出记录………………………………………………………………….5
2.4数据功能描述………………………………………………………………….6
3系统实现………………………………………………………………………6
3.1编码………………………………………………………………………6
3.1.1程序预处理……….……………………………………………………………6
3.1.2主函数main()……….………………………………………………………7
3.2测试与调试………………………………………………………………………8
4系统维护………………………………………………………………………9
5归纳总结………………………………………………………………………9
5.1开发经验………………………………………………………………………9
5.2实训中遇到的问题及解决方法………………………………………………9
5.3设计中的不足之处……………………………………………………………………9
5.4感想和心得体会……………………………………………………………………10
6参考资料………………………………………………………………………10
推箱子
本题目设计目的是训练学生的基本编程能力,了解推箱子的开发流程,熟悉C语言的文件各种基本操作。
本程序中涉及数组、结构体、公用体及各种语句的运用如for();while();if….等方面的知识。
通过本程序的训练,为进一步应用C语言打下坚实的基础。
1、问题定义
定义二维数组chMap来记录屏幕上各点的状态。
假设地图中图形0表示墙1表示路2表示目标。
通过循环语句for(j=0;j<10;j++)
{
if(chMap[i][j]==0)
printf("#");
if(chMap[i][j]==1)
printf("");
if(chMap[i][j]==2)
printf("X");
}
输出地图,实现相应功能。
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成设计和实现的任务。
2详细设计
2.1数据结构设计
●定义读取键盘码共用体及函数。
unionkeyboard/*定义读取键盘码的共用体类型*/
{
intfnGetKey(void)/*定义读取键盘码的函数*/
{
unionkeyboarduniKey1;/*定义读取键盘码的共用体变量*/
while(bioskey
(1)==0);/*检测用户是否按键*/
uniKey1.iKeyInfo=bioskey(0);/*读取按键信息*/
return(uniKey1.chKeyBit[0]==0?
uniKey1.chKeyBit[1]:
uniKey1.chKeyBit[0]);/*返回ASCII码或扩充码*/
}unsignedintiKeyInfo;
charchKeyBit[2];
};这样就定义了读取键盘码的函数,用于读取按键信息,通过按键信息改变坐标。
2.2.主控main()函数部分执行流程
2.3输出记录
定义二维数组chMap来记录屏幕上各点的状态,移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格。
通过循环语句for(j=0;j<10;j++)
{
if(chMap[i][j]==0)
printf("#");
if(chMap[i][j]==1)
printf("");
if(chMap[i][j]==2)
printf("X");
}
输出地图
2.4函数功能描述
bios.h是turboc下的库文件,其函数有:
intbioscom(intcmd,charabyte,intport);
用于RS232通讯
intbiosmemory(void);
返回内存大小
intbiosdisk(intcmd,intdrive,inthead,
inttrach,intsector,
intnsects,void*buffer);
BIOS磁盘服务
intbiosprintf(intcmd,intabyte,intport);
使用BIOS进行打印机输出
intbiosequip(void)
设备检查
longbiostime(intcmd,longnewtime);
BIOS时间服务入口
intbioskey(intcmd);
按键接口
这几个函数基本上都有相应的API函数或使用Windows下的机制来实现了,没有与之完全相同的头文件,不知道你要使用哪一个接口函数,只能根据你要的函数进行说明了。
3、系统实现
3.1编码
3.1.1程序预处理
包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。
#include"stdio.h"/*标准输入输出函数库*/
#include"bios.h"
#defineLEFT75
#defineRIGHT77
#defineUPPER72
#defineDOWN80
#defineESC27/*宏定义*/
structBoxss/*定义箱子结构体,其中包含坐标属性*/
{
intx,y;
};
3.1.2主函数main()
main()函数主要实现了对整个程序的运行控制,以及功能的运行。
voidmain()
{
intiKey,x=11,y=6,tx=11,ty=6;/*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/
structBoxssBox[4];/*定义箱子数量*/
intchMap[10][10]={/*用二维数组定义地图*/
{0,0,0,0,0,0,0,0,0,0},/*0表示墙1表示路2表示目标*/
{0,1,0,0,0,0,1,1,1,0},
{0,1,0,2,0,0,1,0,1,0},
{0,1,0,1,0,0,1,0,1,0},
{0,1,1,1,0,0,1,0,1,0},
{0,1,0,0,0,0,1,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,0,1,0,0,0,0,2,0},
{0,2,0,1,1,1,1,2,0,0},
{0,0,0,0,0,0,0,0,0,0},
};
iKey=fnGetKey();
if(iKey==LEFT&&chMap[y-5][x-1-10]!
=0)
x--;
if(iKey==RIGHT&&chMap[y-5][x+1-10]!
=0)
x++;
if(iKey==UPPER&&chMap[y-1-5][x-10]!
=0)
y--;
if(iKey==DOWN&&chMap[y+1-5][x-10]!
=0)
调用函数,按读取的按键信息改变坐标。
3.2测试与调试
概述
一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。
在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。
测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。
调试则是确定测试中找到的错误性质并改正错误的过程。
测试与调试通常交替进行,即测试——调试——再测试——再调试。
能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。
测试程序需要测试用例,测试用例可用如下公式表示:
测试用例=测试数据+预期结果。
好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。
要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。
还应分别测试输入合法数据与非法数据时,程序的运行情况,。
对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。
测试可按模块测试、组装测试和确认测试的步骤进行。
(1)模块测试就是分别对各模块进行测试的过程。
在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。
(2)组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。
一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。
(3)确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。
测试程序时,用监视窗口可以随时查看变量或表达式的值,有时还可以将部分程序代码用注释符暂时括起来,缩短程序,以便压缩出错代码测试与调试
4、系统维护
经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。
一般维护的工作有:
更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。
5、归纳总结
5.1开发经验
通过对本题目的开发,体会到要掌握以下几点内容。
程序。
●先进行人工检查,即静态检查。
在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。
这一步是十分重要的,它能发现由于疏忽而造成的多数错误。
而这一步骤往往容易被人忽视。
有人总希望把一切推给计算机系统去做,但这样就会多占用机器时间,应当养成严谨的科学作风,每一步都要严格把关,不把问题留给后面的。
●编写主函数,并进行测试与调试。
当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。
C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。
●定义函数时,应选好参数的个数和数据类型。
5.2实训中遇到的问题及解决方法
提示的出错信息多,应当从上到下一一改正。
有时显示出一大片出错信息往往使人感到问题严重,无从下手。
其实可能只有一二个错误。
例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息;有的是少了“}”或多了“}”有的是书写语句时忘记写“;”或是全角的“;”了,只要加上一个变量定义,或填加“};”就所有错误都消除了。
编程的过程当中找出了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。
综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。
我对做完的习题检查不再是走马观花,而是仔细核对、认真检查。
改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。
5.3设计中尚存的不足之处
所编的程序把学过的一些知识巧妙用上。
不过,程序编的过于简单,应用的新识过少,关于这次的程序,还有些不足的地方。
首先就是该程序界面不够美观大方。
5.4感想和心得体会
程序设计是一项细致深入的工作,需要下功夫,动脑子,善于累积经验。
忙碌了两个多星期,在大家的共同努力下,我们总算将此程序设计出来。
尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。
为了解决此。
类问题,最好就是多向同学,老师请教,不要怕难为情。
尤其是老师,评他们多年的编写程序的经验,来要解决我们的问题,
很感谢这次的课程设计,它使我更加深刻地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;另外,做任何事都要有耐心,不要一遇到困难就退缩;在学习和工作中要时刻谨记“团结”二字,它好比通向成功的铺路石,不可或缺。
总的来说,这次程序设计让我获益匪浅,对C语言也有了进一步的认识:
C语言功能高、表达能力强、使用灵活方便、目标程序效率高。
6、参考资料
[1]黄明等.21世纪进阶辅导C语言程序设计[M].大连理工大学出版社,2005
[2]马靖善等.C语言程序设计[M].清华大学出版社,2005
[3]谭浩强.C语言程序设计(第二版)[M].北京:
高等教育出版社,2002