第一篇:贪吃蛇C语言课程设计报告
贪吃蛇游戏程序设计报告
贪吃蛇游戏设计
姓名: 张力
学号: 1002032
3完成日期: 月 日1
贪吃蛇游戏程序设计报告
一、设计目的
贪吃蛇游戏程序功能的实现主要是建立在二维数组和图形界面的应用上,通过编写游戏程序能够熟悉掌握相关数组和图形函数的运用,提高编程水平,增加编程的兴趣
二、总体设计
主函数
↓
图形驱动Init 画界面DrawK 游戏具体过程GamePlay 图形结束Close
↓
游戏结束GameOver 输出成绩PrScore
三、详细设计(项目成员及分工、模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)
①主函数main():
定义使用的常数,全局变量及函数原型说明,并调用Init()函数初始化图形系统;然后调用DrawK()函数画界面,调用GamePlay()函数实现游戏的具体过程,游戏结束后调用Close()函数关闭图形系统结束程序。
②画界面函数DrawK():
主界面是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10个单位的矩形小方块,设置成淡青色,背景颜色为黑色。
③游戏具体过程函数GamePlay():
算法过程:
a.设置初始值。为防止食物出现在一个位置上,要设置随机数发生器,真正产生随机数。初始时,蛇只有蛇头,设定一个开始方向;
b.循环执行,直到按Esc键退出; c.没有按键的情况下,循环执行。
如果没有食物,随机出现食物;食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的;如果有食物,则显示食物,蛇
贪吃蛇游戏程序设计报告
移动身体,根据蛇的方向改变坐标值,并判断蛇是否撞到了墙或自己吃到了自己,如果出现这两种情况之一,则蛇死;调用游戏结束函数GamePlay(),结束本次游戏;
判断蛇吃到食物的方法是蛇头的坐标和食物的坐标都相等;如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。
在新位置画出蛇。采用的方法是每次移动的时候从最后一节开始到倒数第二节,将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可。
D.如果有按键,则识别按键值。如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变蛇方向的变量direction的值,相反方向键无效。
④游戏结束函数GameOver():
游戏结束,清除屏幕,调用输出分数函数PrScore(),并显示游戏结束。
⑤输出分数函数PrScore():
在指定位置利用sprintf()将整数转换为字符串,用outtextxy()输出,、bar()函数的应用是为了覆盖原来的值。
⑥图形结束函数Close():
在显示游戏结束信息的画面时,按任意键关闭图形系统,程序结束。
四、调试与测试:调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题和采取的解决措施等;
将源文件在TC3.0环境下调试运行,前期发现错误为游戏界面静止。
五、源程序清单及执行结果:
#include
贪吃蛇游戏程序设计报告
#define UP 0x4800 #define Esc 0x011b #define N 200 /*定义全局变量*/ int i,key;int score=0;/*得分*/ int gamespeed=50000;/*游戏速度可以自己调整*/ struct Food { int x;/*定义食物的横坐标*/ int y;/*定义食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/ struct snake { int x[N];int y[N];int node;/*蛇的节数*/ int direction;/*蛇的移动方向*/ int life;/*蛇的生命,0活着,1死亡*/ }snake;
void Init(void);/*图形驱动*/ void Close(void);/*图形结束*/ void DrawK(void);/*开始画面*/ void GameOver(void);/*结束游戏*/ void GamePlay(void);/*玩游戏的具体过程*/ void PrScore(void);/*输出成绩*/
/*图形驱动*/ void Init(void){ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“D:TC30LIB”);}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){ setbkcolor(LIGHTGREEN);setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/ for(i=50;i<=600;i+=10)/*画围墙*/ {
贪吃蛇游戏程序设计报告
rectangle(i,40,i+10,49);/*上边*/
rectangle(i,451,i+10,460);/*下边*/ } for(i=40;i<=450;i+=10){
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/ } }
/*玩游戏的具体过程*/ void GamePlay(void){ randomize();/*随机数发生器*/ food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life=0;/*蛇还活着^ ^*/ snake.direction=1;/*方向向右*/ snake.x[0]=100;snake.y[0]=100;/*蛇头*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*蛇的节数为2*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,按Esc键结束*/ {
While(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要把它显示出来*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇一个节一个节地往前移*/
{
snake.x[i]=snake.x[i-1];
贪吃蛇游戏程序设计报告
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右左上下四个方向,通过判断这个来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0]+=10;break;
}
/*从蛇的第四节开始判断蛇有没有自己把自己吃掉*/
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示游戏结束*/ snake.life=1;/*蛇死了T T!*/ break; } } If(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*判断蛇是否撞到墙*/ { GameOver();/*游戏结束*/ snake.life=1;/*蛇死了T T!*/ } if(snake.life==1)/*如果蛇死了就跳出内循环,重新开始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃掉食物啦!*/ { setcolor(0);/*把画面上的食物颜色覆盖掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20; snake.y[snake.node]=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食物*/ score+=10;/*加十分!*/ PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i=0;i 贪吃蛇游戏程序设计报告 rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的最后一节*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);}/*endwhile(!kbhit)*/ if(snake.life==1)/*如果蛇死了就跳出循环*/ break;key=bioskey(0);/*接收按键*/ if(key==Esc)/*按Esc键退出*/ break;else if(key==UP&&snake.direction!=4)/*判断是否往相反方向移动*/ snake.direction=3;else if(key==RIGHT&&snake.direction!=2) snake.direction=1;else if(key==LEFT&&snake.direction!=1) snake.direction=2;else if(key==DOWN&&snake.direction!=3) snake.direction=4;}/*endwhile(1)*/ /*游戏结束*/ void GameOver(void){ cleardevice();/*清除屏幕*/ PrScore();/*输出得分*/ setcolor(RED);settextstyle(0, 0,4);outtextxy(200,200,“GAME OVER”);/*显示游戏结束*/ getch();} void PrScore(void)/*输出成绩*/ { char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} 贪吃蛇游戏程序设计报告 void Close(void)/*图形结束*/ { getch();closegraph();} void main(void)/*主函数*/ { Init();DrawK();GamePlay();Close();} 8 高级语言程序设计 课程设计报告 Experiment Designing reporter 课程名称:高级语言程序设计 英文名称 : C Program Experiment Designing 专业:自动化 111 学号: XXX 姓名: XXX 指导教师: XXX 日期: 2012 年 6月 17日至 2011 年6 月 20 日 山东工商学院信电学院 一:课程设计内容 程序功能介绍 贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。设计思路 我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”: 第一步: 寻找到一个真正可以运行的已用C编好的贪吃蛇。因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。第二步: 运行游戏并了解游戏程序。 我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。 同样重要的是了解游戏程序。因为只有看懂了程序,才能实现对他的改编,才能游刃有余。第三步: 寻找模块并分类,而后进行改编。 寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那么就应该找到 void DrawK(void){ setcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH);for(i=200;i<=500;i+=10) rectangle(i,200,i+10,209);} 然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置的模块,让蛇见墙死的模块,让蛇吃苹果加长的模块„„„.并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。对于找到的模块如何进行改编呢?怎么才能知道某个数值或函数代表什么呢? 我们有两个方法: 1.)看名字,比如snakecolor(),很明显他的意思是蛇的颜色。2.)控制变量猜想,比如设置墙的时候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309);中的200,500,300,209 代表什么呢?我们可以猜想:它很像是坐标上的(x,y)的格式,是不是呢?可可以先让其他数值不变,只让309改变,改变后发现上面的墙变粗了,由此可见这个数字控制的是一堵墙的最下面一行的坐标。 关于该程序的相关分析思路答题模板: 1.贪吃蛇程序流程图如下: 二.贪吃蛇程序的改编: 经过小组成员的认真研究我们对其进行了如下改编 第一步加墙 void DrawK(void){ /*setbkcolor(MAGENTA);*/ setcolor(5);// 可以改变颜色 setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/ 横向上的墙: for(i=100;i<=600;i+=10)// 本行代表行坐标上:100代表墙的初始位置,i<=600代表墙的结尾。 { rectangle(i,60,i+10,69);//本行代表纵坐标上:60代表墙的最上面一行的位置,69代表墙最下面一行的位置。69-60=9,9代表墙块的厚度 } 纵向上的墙: for(i=100;i<=400;i+=10)//本行代表纵坐标上:100代表墙的初始位置,i<=400代表墙的结尾 { rectangle(100,i,109,i+10);//本行代表纵坐标上:100代表墙的最左边面一行的位置,69代表墙最右面一行的位置。69-60=9,9代表墙块的宽度 } 我们认为本模块最重要的是for语句控制的坐标代表的意思。只要明白了坐标的意思,就可以实现对游戏的改编。 第二步就是进行对新加入的墙蛇是否撞上死亡 让蛇撞墙死 if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&& snake.y[0]<=215) /*其中,对x,y范围的控制,实际是对蛇撞击的死亡区域的限制。*/ { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } 相应的新添加的墙。 for(i=200;i<=500;i+=10)/*画围墙*/ { rectangle(i,200,i+10,209);/*指定位置*/ 第三步食物的定点出现 if(food.yes==1)/*需要出现新食物*/ 这里说明一下:rand()产生0-65535的数,在limits.h里有定义%400后产生一个0-399的数+60 则为 60 –459,即:%400+60意思是在60~399之间随机产生一个数。 { food.x=rand()%400+60; food.y=rand()%350+60; while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++; while(food.y%10!=0) food.y++; food.yes=0;/*画面上有食物了*/ } 如果将food.x=(常数a)那么食物就会出现在x=a行的随机列,对于food.y=(常数b)那么食物就出现在y=b列的随机行。 第四步对食物墙壁的颜色以及对蛇的运动速个性化调节 setcolor(4);// 对颜色的调整 int gamespeed=50000;/*游戏速度自己调整*/ 通过改变变量的值,就可以个性化选择自己喜欢的颜色,这将是一场别开生面的游戏界面。* 红色代表解析浅蓝代表提示 三.课程设计总结 有言曰:“实践出真知”,在这几天的课程设计实践中,我们组三人真正的体会到了这句话的真谛。 在经历了一学期的C语言学习后,我们从以往的“纸上谈兵”直接过渡到“实际作战”。我们实现了让静态的程序变成动态的游戏效果,虽然我们只是改编了一下别人做好的程序,但我们同样由此获益匪浅,感触颇深,当然也发现了许多自己的不足。 首先,在我们刚刚进行第一步“寻找程序”的时候,就被搁浅了,因为我们发现,在网上能找到一个真正符合我们使用标准的程序很难,就是找到了几个也没有能运行它们的程序。我们花费了前两天的时间来寻找能够使用的程序和软件,但最后还是一无所获,正当我们一筹莫展的时候,我们的导师——杨老师给我们带来了曙光,使得我们在黑暗中找到了希望的光明,杨老师给我们传来了一个上届师哥做好的程序,并且把它的运行软件也给了我们,这对我们来说无疑是雪中送炭,得到这个程序后,我们三个人看到了C语言运行一个游戏的流程和方法,我们脑中也大概有了一个思路。我们三个人以此程序为跳板,直接开始对程序模块进行挑选,因为我们已经浪费了两天,所以我们决定进行分工作业,分别去寻找:筑墙模块,加苹果模块,撞墙死模块。最后我们用了一下午时间完成了三大步中的前两大步和第三步的第一部分,剩下的就是最重要而充满挑战的改编了,从以上的操作中,让我们明白了找对一个平台的重要性,这个平台就是老师给我们的程序,就是我们的前进方向。没有了方向了的征程,一开始就是个错误。在我们寻找程序模块的时候,我们对于程序中的很多东西都是模模糊糊的概念,比如struck是什么,比如for语句的使用,以及for语句的循环体是什么,当然我们也发现了定义字符在长的程序中的方便与重要性。还有就是我们发现程序在编写时的规范性很重要,比如同级别花括号的位置的对应,对应好了,模块就好找,对应不好就很乱。还有定义函数及变量的时候,函数名字和变量名最好是见名知意,比如我们所看的程序中,gamespeed,snakecolour,food.....在最后的攻坚阶段,为了实现对程序的改编,我们使用控制变量猜想法是正确的选择,比如设置墙的时候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309);中的200,500,300,209 代表什么呢?我们猜想:它很像是坐标上的(x,y)的格式,是不是呢?我们先让其他数值不变,只让309改变,改变后发现上面的墙变粗了,由此我们知道这个数字控制的是一堵墙的最下面一行的坐标。我们用这个方法知道了其他很多数值的用途。我们用这种方法先是知道了如何设置一堵墙,在我们欣喜设置一堵墙以后才发现:蛇撞了墙后不死。在我们进行了全局来看以后才知道,原来设计一堵墙,都要再设计一个if语句来使得蛇在这个范围内会死亡。并且我们发现在设计这个if语句的时候,不仅要计算好墙的坐标,而且还要用好逻辑语言(&&,||!)同时语句的运算顺序也很重要。刚一开始我们忽略的&&和关系运算符级别的高低,使得我们设计的墙,总是撞不死蛇,为此我们很是恼火,着急的组员还在这里发生了点小摩擦,由此可见C语言的严谨性! 最后我们又通过在网上查找信息,知道了随机数发生器randomize()的用法:rand()=x%+d 意思是说在d~(x-1)之间随机产生一个数字。我们很自然的联想到,如果把food.x等于常数a;把food.y等于一个;x%+d的随机数,那不就能固定只在某一行出现苹果了吗?所以我们觉得,充分利用手边的资源也是很重要的,毕竟C语言很高深,课本上的东西总是有限的,要想知道更多的东西还需多练习,多查阅资料。总之:革命尚未成功,通知还需努力啊!四个人感受: 汤X: 就我个人而言,这次课程设计,我觉得我最大的收获就是:我明白了,我们其实真的没那么厉害,我们真的还有很多东西不会,我们真的连课本上的基本东西都没掌握,课本上的东西,真的也只是C语言这个大海中的一滴水而已。而在我本人还没有掌握好课本的知识点的情况下,做起这个程序自然很费事,一个简单的课本P293讲到的struct结构体,我一开始竟然忘记它是什么意思,不知道它是什么,就更不用谈怎么用它了。还有逻辑语言的使用。我想,现在肯定有很多同学还不知道逻辑运算的优先次序吧?这个问题我本人在使用逻辑语言的时候也不太会,还查看了书。像这些小的知识点,我个人认为如果掌握不好的话,是不可能让整个大程序运行起来的。还有比如我在遇到程序显示“else多余”的警告时候不不知所措,问了老师才知道是if()后面加了“;”而且if没有用“{}”来固定范围,这个错误原因是分号使得if语句结束了,孤立的else当然是多余的了。一个小小的分号使得程序无法运行,由此可见在今后的编程中,一定要注意谨慎,仔细。同时要注意记住平时编程的时候,出现的错误指示是什么意思。比如这次的“else多余”就是因为if后多了分号。还有在编程时候,书写一定要规范,特别是if语句的花括号的位置要对应起来,因为位置决定范围。注意定义变量和函数要使用规范的英文单词,这样才能见名知意,为以后修改找变量节省时间。对于这次课题中,“设计一个墙,就要对应一个函数舍得蛇撞墙死”,让我明白,C语言程序中各部分的联系性,牵一发而动全身,所以在编程时一定要注意全局的把握。我们最后还要说说在编程中,好好利用网络资源,因为课本里的东西总是有限的,而C语言又那么高深,像随机数发生器,还有颜色的定都是我第一次接触,这些东西的用处可是颇大,以后一定好好学习。多看,多练,多总结。最后还要感谢指导老师,杨老师对我学习的帮助和指导。徐XXX: 刚开始拿到题目时候什么也不会一片茫然,从网上找了一个程序一看,太吓人了,这么长怎么看啊,而且还是错误的。没办法只能硬着头皮去改了,但是在改的过程中才发现其实c语言没有想象的那么难而且还很有意思,只是自己平时没有好好学所以在改的时候非常吃力,有很多简单的知识都不知道,没有记住。没办法只能借助与课本了。但是几天下来发现自己已经不再像以前那样是个菜鸟了,虽然很多知识还没掌握。同时在编改程序的时候切记不能烦躁要静心慢慢来,好几次自己都因心燥出现了很多不该出现的错误浪费了很多时间。 对键盘的熟悉在编程时也是很重要的,自己在写的时候往往就是跟一指禅差不多眼睛盯着键盘打,打错了也不知道最后导致整个程序都是错误的,就因为一个打错了一个字母。 总的来说这次课程设计收获很多,也知道了自己的不足,在以后的学习中要多实践,实践很能提高自己的能力。刘XX: 4天的C语言课程设计上机学习让我感受颇多,每天都发现新的问题,又不得不绞尽脑汁解决问题,心情就像正弦函数,随着问题的出现和解决一起一伏。刚开始接触贪吃蛇的C语言成寻时,看着C-free上面出现的有十几个错误的程序,一片茫然不知所措。只能继续在网上搜索错误较少的程序,并结合书上的基础知识查看错误所在,最终发现是 作为小组中唯一的女生,明显感觉有压力,打字速度不如另外两个男生,对游戏和程序的敏感也不如他们强,有种小小的挫败感。旁边小组的同学也给我很大的压力。他们自己编写程序,我很佩服他们,越是这样想。心里越着急,越不能解决问题,每当感觉有压力的时候,就提醒自己心静,认真的看程序。在学习过程中,深深的发现了自己的不足之处,对于C语言,只学了一点点皮毛东西,想要学好C语言,编好程序,还要付出很多的努力,还要用更多的时间来学习C语言这门深奥的学科。现在只能借用别人已经写好的程序,在别人的基础上,一点点进步和学习,比如程序中筑墙,需要仿照已有的程序,结合逻辑运算,关系运算和数学知识才能让蛇撞墙死。苹果位置的出现也同样需要进一步的搜索,通过更改食物的横纵坐标以及出现的概率来确定食物的位置。编写程序时,也发现书上的东西对于程序的某些部分来说,没有什么作用,显得太浅显,想要实现老师给出的一些要求,还需要实践,通过上机学习,自己摸索才能成功。一次次修改,一次次失败,就像贪吃蛇想方设法吃苹果会Game over,我们只有认真学好基础理论,并结合实践经验才会取得进步。 在这次学习过程中,我很感谢我的组员,虽然有时我们的意见出现分歧,但是通过大家的共同努力,我们收获了很多,一起讨论,一起研究怎样解决问题,对老师提出的要求个个击破,我们拧成一股绳共同应对问题,让我感受了团队的力量希望在以后的学习过程中,我们依然能够互相帮助,共同进步。 五 课程设计修改后的程序.加墙 for(i=200;i<=500;i+=10)/*画围墙*/ { rectangle(i,200,i+10,209);/*指定位置1*/ } for(i=120;i<=200;i+=10)/*画围墙*/ { rectangle(100,i,109,i+10);/*指定位置2*/ } 2.指定位置加苹果 if(food.yes==1)/*需要出现新食物*/ { food.x=rand()60; food.y=rand()%200+60; while(food.x%10!=0) food.x++; while(food.y%10!=0) food.y++; food.yes=0;3.指定地方撞墙死 if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&& snake.y[0]<=215) { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } if(snake.x[0]>90&&snake.x[0]<110&&snake.y[0]>=110&&snake.y[0]<=215) { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } } C语言课程设计报告 Experiment Designing reporter 课程名称 : C语言课程设计 英文名称 : C Program Experiment Designing 专 业 : 学 号 : 姓 名 : 指导教师 : 日 期: 2011年7月18日 至2011年7月22日 《C语言课程设计》报告 C Program Experiment Designing 课程编号:01200308005 学时: 40学时 适用专业:软件工程专业 授课单位:软件学院 一、C语言课程设计目的及要求 目的: 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。 要求: 1. 熟悉Turbo C 的编程环境、主要菜单功能。 2. 通过上机验证运算符、表达式、运算规则、函数使用。3. 熟练使用C语言的典型语句编写简单程序。4. 调试典型例题或习题。5. 提高上机编程能力 二、实验类型 设计类型 三、实验学时 40学时 四、实验设备 微型计算机、WINDOWS98以上版本的操作系统、Turbo C2.0 软件一套 五、C语言课程参考教材: 1.李瑞 C语言程序基础(第二版)清华大学出版社 2.梁旭 C语言课程设计.电子工业出版社 课程设计(报告)任务书 任务及要求: 1.设计(研究)内容和要求 研究内容:C语言课程设计题目相关内容 任务和要求: (1).学习C语言基础知识,掌握C语言编程和程序调试的基本技能。(2).对指导教师下达的题目进行系统分析。(3).根据分析结果完成系统设计。 (4).编程:在计算机上实现题目的代码实现。(5).完成对该系统的测试和调试。(6).提交课程设计报告。(7).指标: 要求完成课程设计报告3千字以上(约二、三十页).完成若干综合性程序设计题目,每个综合设计题目的语句行数的和在300行语句以上.2.原始依据 了解C语言的基础知识,有一定的语言编程基础,能够熟练运用C语言进行程序设计。通过用C语言完成的题目,提高用C语言解决实际问题的能力。3.参考文献 [1] 黄明等.C语言程序设计辅导教材.大连理工大学出版社,2006 [2] 马靖善等.C语言程序设计.清华大学出版社,2005 [3] 谭浩强.C语言程序设计(第二版).北京:高等教育出版社,2002 目录 C语言课程设计报告................................................................................错误!未定义书签。 1. 输出杨辉三角.............................................................................................................1 1.1 系统分析..............................................................................................................1 1.2 设计说明..............................................................................................................1 1.3 程序运行截图......................................................................................................2 1.4 源程序代码..........................................................................................................2 2 汉诺塔求解方法.............................................................................................................3 2.1 系统分析..............................................................................................................3 2.2 设计说明..............................................................................................................3 2.3 程序运行截图......................................................................................................4 2.4 源程序代码..........................................................................................................4 3 输出200以内的素数.....................................................................................................5 3.1功能说明...............................................................................................................5 3.2 设计说明..............................................................................................................5 3.3 程序运行截图......................................................................................................5 3.4 源程序代码..........................................................................................................6 4 进制转换计算器.............................................................................................................6 4.1功能说明...............................................................................................................6 4.2 设计说明..............................................................................................................6 4.3程序运行截图.......................................................................................................7 4.4 源程序代码..........................................................................................................7 5 一元稀疏多项式.............................................................................................................8 5.1 功能说明..............................................................................................................8 5.2 设计说明..............................................................................................................8 5.3 程序运行截图....................................................................................................10 5.4 源程序代码........................................................................................................11 1. 输出杨辉三角 1.1 系统分析 以等腰直角三角形输出杨辉三角 1.2 设计说明 1、包含头文件 #include #include 其中,头文件 2、子函数 函数名:int num(i,j) 函数功能:以递归的方式进行计算,用函数代替二维数组 函数参数:int i;int j; 含义:相当于二维数组的a[i][j] 函数流程 Step1:输出最外行,即三角形两直角边的结果都为 1 ; Step2:讨论其余情况,相当于数组中的 a[i][j] = a[i-1][j-1] + a[i-1][j]。 3、main()函数 1为保证结果完整输出,先进行清屏; ○2输入要打印的行数,由于一行只能显示80个字符,建议不要超过13行; ○3用循环调用函数int num(int i , int j)○ 其中循环为三重循环:i 循环控制行打印 j 循环控制列打印 k 循环控制空格打印 每执行一次i 循环输出一个换行符,直角三角形定点放在第36个字符的位置上。 每个数字占6个字符的格。 1.3 程序运行截图 1.4 源程序代码 #include int num(i,j){ int i,j; if(I == j ||j == 0)return(1); else return(num(i-1 , j-1)+num(i-1 , j));} int main(void){ int n,k,i,j; clrscr(); puts(“input row n:”); scanf(“%d”,&n); for(i = 0;i < n;i++) { { for(k = 0;k < 36-3*i;k++) putchar(' '); } { for(j = 0;j <= i;j++) printf(“%6d”,num(i , j)); } puts(“"); } getch(); return 0; } 汉诺塔求解方法 2.1 系统分析 汉诺塔求解方法 2.2 设计说明 1、包含头文件: #include 其中,#include 2、子函数 函数名:void move(int n , char a , char b) 函数功能:打印移动的主子编号 函数参数:int n , char a , char b; 含义:n为移动的序数,a为源柱号,b目的柱号 函数流程 Step1:输出盘子移动情况; Step2:打印换行。 函数名:void hanoi(int n,char a,char b,char c) 函数功能:以游戏规则求解移动盘子的方法 函数参数:int n,char a,char b,char c; 含义:n移动的序数,a为源柱号,b为目的柱号,c为中间柱号 函数流程 Step1:递归调用函数 hanoi(n-1,a,c,b); Step2:调用函数move(n-1,a,b); Step3:继续递归调用函数hanoi(n-1,c,b,a); 3、主函数main()1为了使程序可以重复运行,定义了变量ch,当ch == N 时,退出游戏; ○2使用while()循环使游戏重复运行; ○3输入盘子的数目以调整游戏的难度; ○3调用函数hanoi()○ 2.3 程序运行截图 2.4 源程序代码 #include ”stdio.h“ #include ”ctype.h“ //应用函数toupper void move(int n,char a,char b) //n为移动的序数,a为源柱号,b目的柱号*/ { printf(”Disc%d move from %c to %c;“,(n+1),a,b); printf(”n“);} void hanoi(int n,char a,char b,char c){ //n移动的序数,a为源柱号,b为目的柱号,c为中间柱号 if(n>0) { hanoi(n-1,a,c,b); //递归调用 move(n-1,a,b); hanoi(n-1,c,b,a); } } main(){ int n; char ch ='Y'; printf(”Now let us play the game of hanoitowern“); while(ch == 'Y') //通用性设计 { printf(”n Input the number of disc[2-15]:“); scanf(”%d“,&n);getchar(); printf(”n The orders of moving %d discs from A to B are:n“,n); hanoi(n,'A','B','C'); //调用函数 printf(”n Continue(Y/N):“); ch=getchar(); getchar(); ch=toupper(ch);} return 0;} 3 输出200以内的素数 3.1功能说明 输出200以内的素数 3.2 设计说明 1、宏定义 #define M 200 //范围,表示输出200以内的素数 #define N((M+1)/2) //奇数的个数 处理流程: Step1:第一步筛选掉所有的偶数,将剩余的奇数存放在a[N]中; Step2:第二部筛选掉多有可以被整除的数 Step3:将得到的素数10个一行打印。 3.3 程序运行截图 3.4 源程序代码 #include ”stdio.h“ #define M 200 //范围 #define N((M+1)/2) //奇数的个数 main(){ int i,j,a[N]; a[0]=2; for(i=1;i //初始数组实现第一步筛选 a[i]=2*i+1; for(i=1;i<(N-1);i++) //第二步筛选 if(a[i]!=0) for(j=i+1;j if((a[j]%a[i]==0)) //倍数时置零筛去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //显示得到素数 { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十个数换行 printf(”n“); } } return 0;} 进制转换计算器 4.1功能说明 进行进制转换。 4.2 设计说明 1、处理流程: Step1:输入原始数值xa,原始权a,已经希望转换的进制b;Step2:逐位取值,将原始数值转换成10进制 Step3:逐位取值,将原始数值转换成b 进制 4.3程序运行截图 4.4 源程序代码 void main()#include ”stdio.h“ main() { int a=0,/*原始进制*/ b=8,/*转换进制,默认为八*/ k=1; /*位权*/ long xa=0,/*原始数值*/ xb=0,/*转换数值*/ x1=0,x2=0; /*十进制数值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*转换为十进制数*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*转换为b进制数*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多项式 5.1 功能说明 求一元稀疏多项式的运算: 1、求两多项式加法; 2、求两多项式减法; 3、求两多项式乘法; 4、求两多项式导数; 5、求两多项式在x=m处的值。 5.2 设计说明 1、链表结点的定义: typedef struct polyn { float coef; //多项式系数 int expn; //多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函数,多项式的基本运算。函数名:linkpolyn CREATEPOLYN()函数功能:创建多项式链表,在输入的时候进行升序排列 返回值:return head,即建立的多项式头结点 参数:linkpolyn head,含义:链表头结点 处理流程: Step1:输入第一个结点,且第一个结点自然有序; Step2:循环输入其余结点,当输入0 0是表示输入结束; Step3:输入过程中进行升幂排序,用二分法,找到新结点插入点; Step4:插入新结点;继续循环,直到输入0 0,循环结束,链表建立成功。Step5:返回建立链表头结点,函数结束。 函数名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函数功能:多项式求导 返回值:return(head),即求导多项式的链表头结点 参数:linkpolyn L,含义:把建立好的链表A和B传递给L 处理流程: Step1:分别用指针指向L的头结点和求导多项式的头结点head; Step2:用循环逐个对L链表中的结点求导,一次存放在求导多项式中的新结点中; Step3:循环中考虑,当L链表中的结点仅存放一个常数,则跳过该结点,继续遍历下一结点; Step4:当循环结束,即L中的各项以被求导,返回求导多项式头结点head。 函数名:linkpolyn INITPOLYN()函数功能:链表初始化 返回值:return(head),即求导多项式生成的链表头结点 参数:无参数 处理流程: Step1:生成一个新的空间作为新结点; Step2:将新节点的coef域赋0,expn域赋-1,以区分其他节点; Step3:将头结点的前去指针和后即指针置空,并返回头结点。 函数名:void PRINTLIST(linkpolyn head)函数功能:以类数学表达式的形式打印 返回值:无返回值 参数:linkpolyn head,含义:处理过的链表头结点 处理流程: Step1:讨论是否链表为空,若为空,则输出0; Step2:若链表不为空,则输出第一个值,第一个值不用输出符号; Step3:用循环依次输出其余各项,附加符号输出; 函数名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函数功能:加法运算 返回值:return ptr,即和多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行加法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 和多项式链表中; 函数名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函数功能:计算A-B的值 返回值:return ptr,即差多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行减法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 差多项式链表中; Step5:返回多项式头结点 函数名:float WORK(float x,int e)函数功能:求x的幂 返回值:return t,即计算幂结果 参数:float x,int e,含义:x为输入的x的值,e为x的指数 处理流程: Step1:分别讨论正指数与负指数的的情况; Step2:若e>0,则累乘e次x; Step3:若e<0,则累除e次x;; Step4:将所求结果返回; 3、主函数main()Step1:依次调用函数进行运算操作; Step2:调用函数创建链表; Step3:调用函数进行运算; 5.3 程序运行截图 5.4 源程序代码 #include ”stdio.h“ #include typedef struct polyn { float coef;//多项式系数 int expn;//多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; void DESTROYPOLYN(linkpolyn head){ //销毁链表 linkpolyn s,p;p=head; while(p->next!= NULL){ s = p; p = p->next; free(s);} } //DESTROYPOLYN linkpolyn INITPOLYN(){ //链表初始化 struct polyn * head;head=(linkpolyn)malloc(sizeof(polyn));head->coef=0.0;//假设头结点系数为0 head->expn=-1;//假设头结点指数为-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //将结点s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //创建多项式链表,在输入的时候进行升序排列 linkpolyn head,s,p,m,r; int num = 1;//计数器 head = INITPOLYN();//初始化链表 head r = head;//设置为指针 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”请输入第%d项系数和指数:“,num);/**输入第一个结点,并且第一个结点自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾结点 r->next = NULL;p = r;//p为s的插入点前一个结点 m = r;//m为拍完结点中间的节点,二分法排序 while(++num)//while # 当将 s->coef 与 s->expn 都赋值为0的时候,认为输入结束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”请输入第%d项系数和指数:“,num);scanf(”%f%d“,&s->coef,&s->expn); if((fabs(s->coef)<= FZ)&&(s->expn == 0))//if @ { free(s); break; } //else @ else //else @ { if(s->expn <= p->expn)//if # { while(p->prior!= NULL && p->expn > s->expn) p = p->prior;//p向前遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入结点s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r = r->next; r->next = NULL; } } } //else # } //else @ } //while # return head;} //CREATEPOLYN void PRINTPOLYN(linkpolyn head){ //以类数学表达式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//链表为空 puts(”0“);else //else @ { //链表不为空,输出第一个结点的值 if(p->expn == 0)printf(”%f“,p->coef);//指数为0时不输出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一项前不需要输出符号**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次输出以后各节点 if(p->coef>0) { //当系数为正时,讨论输出符号问题 if(p->expn == 0)printf(”+%g“,p->coef);else if(p->coef == 1)printf(”+x^%d“,p->expn);else printf(”+%gx^%d“,p->coef,p->expn); } else { //当系数为负时,讨论输出符号问题 if(p->expn == 0)printf(”%g“,p->coef);else if(p->coef ==-1)printf(”-x^%d“,p->expn);else printf(”%gx^%d“,p->coef,p->expn); } p = p->next; } } //else @ } //PRINTPOLYN linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B){ //加法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求和 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef + qb->coef;//系数相加 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多项式的节结点 qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef = qb->coef;//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //减法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求差 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef-qb->coef;//多项式A的系数减去B的系数 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多项式的节结点 q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef =-(qb->coef);//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //SUBTRACTPOLYN linkpolyn MULTIPLYPOLYN(linkpolyn A,linkpolyn B){ //乘法 linkpolyn pa,pb,s,head,m,r,p;pa = A->next;pb = B->next;head = INITPOLYN();r = head; s=(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef;//计算第一个结点,并且第一个结点自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p为插入点前一结点 m=r;//m指向排完结点中间节点 pb=pb->next;// 第一个乘积处理完毕 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 处理其余乘积 { //用A的第一个结点分别与B的其余结点相乘 if(pa == A->next) pb = B->next->next; else pb = B->next; for(;pb!= NULL;pb = pb->next)//for pb { s =(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef; s->expn = pa->expn + pb->expn;if(s->expn <= p->expn)//if # { while(p->prior!=NULL && p->expn > s->expn)p=p->prior;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入结点s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r=r->next; r->next=NULL; } } } //else # } //for pb } //for pa return head;} //MULTIPLYPOLYN linkpolyn DERIVATIONPOLYN(linkpolyn L){ //多项式求导 linkpolyn head,p,s,r;head = INITPOLYN();//head为求导多项式头结点 r = head;p = L->next;while(p!= NULL){ if(p->expn == 0) { p = p->next;continue;} s =(linkpolyn)malloc(sizeof(polyn));s->coef = p->coef * p->expn;s->expn = p->expn-1;s->prior = r; r->next = s; r = r->next; r->next = NULL; p = p->next;} return(head);} //DERIVATIONPOLYN float WORK(float x,int e){ //求x的幂 float t = 1;if(e>0){ while(e) { t *= x;e--;} } if(e<0){ while(e) { t *= 1/x;e++;} } return(t);} //WORK float CALCULATEPOLYN(linkpolyn head,float x){ //计算多项式在x处的值 float t = 0;linkpolyn p;p = head->next;while(p){ t = t +((p->coef)*(WORK(x,p->expn)));p = p->next;} return(t);} //CALCULATEPOLYN int main(void){ linkpolyn A, B,addp,decp,mulp,derp1,derp2;int i;float x;start: system(”cls“);printf(”一元稀疏多项式计算nn“);printf(”1.建立多项式n“);printf(”2.多项式加法n“);printf(”3.多项式减法n“);printf(”4.多项式乘法n“);printf(”5.计算多项式在x处的值n“);printf(”6.对多项式求导n“);printf(”7.清空数据n“);printf(”8.关闭计算器n“);printf(”请输入选项(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多项式nn“);printf(”建立多项式A,当输入0 0 时表示出入完毕n“);A = CREATEPOLYN();printf(”建立多项式成功n“);printf(”建立多项式B,当输入0 0 时表示出入完毕n“);B = CREATEPOLYN();printf(”建立多项式成功n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B); printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多项式加法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多项式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多项式减法nn“);printf(”多项式B:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多项式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多项式乘法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多项式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn输入回车返回上一级“); getchar();getchar();goto start;case(5): system(”cls“);printf(”计算多项式在x处的值n“);printf(”请输入x的值:“);scanf(”%f“,&x);printf(”n多项式A:“);PRINTPOLYN(A);printf(”n值为:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n值为:%f“,CALCULATEPOLYN(B,x));printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多项式求导n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求导后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求导后B':“);PRINTPOLYN(derp2);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(7): system(”cls“);DESTROYPOLYN(A);DESTROYPOLYN(B);DESTROYPOLYN(addp);DESTROYPOLYN(decp);DESTROYPOLYN(mulp);DESTROYPOLYN(derp1);DESTROYPOLYN(derp2);printf(”已清空所有数据n“);printf(”nn输入回车返回上一级“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目录 1前言..............................................................1 2正文..............................................................1 2.1设计目的........................................................1 2.2设计意义........................................................1 2.3设计方案与内容..................................................2 2.3.1设计内容......................................................2 2.3.2程序调试......................................................4 3致谢..............................................................7 4参考文献..........................................................7 5附录..............................................................8 塔里木大学信息工程学院课程设计 前言 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具. 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了 塔里木大学信息工程学院课程设计 其自身的优势,仍然是一种重要的语言,而且它还是通往c++的必由之路。它是融合了控制特性的的现代语言,其设计使得用户可以自然的采用自顶向下的规划、结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。它是一种高级语言,在设计上它充分利用了当前计算机在能力上的优点。C程序往往很紧凑且运行速度快,其还表现出通常只有汇编语言才具有的精细控制能力,可以用于电脑cpu的编程控制语言,如果愿意,可以细调程序以获得最大速度或最大内存使用率。其可移植性的特点,可以使其在不经过太大的修改,便可在其它系统上运行,同时,它也是很多大型系统的编程语言,(比如说UNIX的操作系统就是建立在c之上的)。 2.3设计方案与内容 我此次设计的是一个计算器,主要是利用我们所学的知识,做到进一步掌握c语言的奥秘,使这种功能强大的高级语言走近我们的生活。本计算系统主要是作加减乘除运算。 该计算系统程序包括:main()函数、加函数、减函数、乘函数、除函数和显示函数。2.3.1设计内容 1、加运算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、减运算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘运算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除运算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、显示函数程序: 塔里木大学信息工程学院课程设计 void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } 显示界面程序图如图2-1所示 图2-1显示界面 程序分析: 1)printf(“please choose lower level operation sign n”);/*选择提示*/这句可以根据需要写成时间,一句鼓励自己的话,或者别的什么,都将不影响改程序的正常运行,只要在规定的“n”里,用户可以根据自己的需要把它用一句英文表达出来。 2)printf(“***************************n”);/*分隔号*/此句无关紧要,可以去掉也可以保留,看个人心情,不过个人建议,还是保留的比较好,它能保持计算器界面的美观特点,还能作为分隔运算程序的作用,让使用者能最快的对运算区进行划区。3)printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/此句在运算界面里出现,当用户使用时,不小心输入了一个字符,非1~4以内,则会提示错误,按‘enter’结束该片段,然后根据提示,选择自己所希望使用的运算符号进行运算。 4)printf(“1:apply is additionn”);/*选择加号*/此句是加法运算提示,当输入‘1’后按‘enter’会得到可以使用加法的提示,然后就可以使用加法运算了,使用空格将数字与要加的数字分开,按‘enter’将得到你要的答案。5)printf(“2:apply is subtractionn”);/*选择减号*/这是加法运算提示。它的使用方法和 塔里木大学信息工程学院课程设计 相同。 2.3.2程序调试 1、加法运算 加法运算运行结果如图2-2所示。 图2-2加法运算运行结果 2、减法运算 减法运算结果如图2-3所示。 图2-3减法运算 3、乘法运算 乘法运算如图2-4所示。 塔里木大学信息工程学院课程设计 图2-4乘法运算 4、除法运算 除法运算如图2-5所示 图2-5除法运算 6、主函数程序: int main(){ int a, b; 塔里木大学信息工程学院课程设计 for(;;){ xian();switch(getchar()){ case '0':printf(“ tui chu: ”);getchar();return 0;case '1': printf(“ apply is '+': n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jia(a,b);break;case '2':printf(“ apply is '-':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jian(a,b);break;case '3':printf(“apply is '*':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();cheng(a,b);break;case '4':printf(“ apply is '/':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();chu(a,b);break;default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar();break; 塔里木大学信息工程学院课程设计 } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } 该主函数程序中使用了xian()函数、switch(getchar())语句、getchar()、for、break、return。xian()函数的功能是在程序运行中,具有显示界面的功能。switch(getchar())语句具有多分支选择功能。getchar()是库函数。for循环语句。是break语句是实现跳出循环的功能的语句。Return语句是返回语句,是程序最后一个语句,在int main(void)中int表示main()函数的返回值应该是一个整数。该程序具备的选择功能: (1)选择提示:该计算器编辑界面有5个提示,它们分别是‘0’、‘1’,‘2’、‘3’、‘4’,当使用者在该界面上输入它们其中一个数字,会得到相对应的提示,其中1~4分别表示加、减、乘、除运算。‘0’表示结束工作框结束。 (2)使用方法:进入选择界面后,要选择加法运算,请输入‘1’,然后按下‘enter’键。会得到提示 致谢 在本次课程设计中,首先我要感谢张老师。是他至始至终的教导让我能够在编程方面迅速的入门。在我们对程序语言的学习过程中,是他不断的给我们讲解语句内容并且纠正我们存在的错误。不断的给我们提供帮助并且给我们分析遇到的问题。老师认真负责的工作态度,严谨治学的精神和深厚的理论水平都使我受益匪浅。他们无论在理论上还是实践中都给了我很大的帮助,使我整体水平得到了提高,对于我以后的学习和工作都有一定的帮助,感谢张兵老师的耐心辅导! 参考文献 [1]孙雄勇.Visual C++ 6.0 实用教程.北京:中国铁道出版社,2004.[2]新电脑课堂编委会.Visual C++ 编程篇.北京:电子工业出版社,2004.[3]陈清华.Visual C++课程设计案例精选与编程指导.北京:北京大学出版社,2005.[4]李东玉.Visual C++.NET实用编程100例.北京:中国铁道出版社,2003.[6]张志清.管理信息系统.南京:东南大学出版社,2003. 塔里木大学信息工程学院课程设计 附录 #include int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } int main(){ 塔里木大学信息工程学院课程设计 int a, b; for(;;){ xian(); switch(getchar()) { case '0':printf(“ tui chu: ”); getchar(); return 0; case '1': printf(“ apply is '+': n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jia(a,b); break; case '2':printf(“ apply is '-':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jian(a,b); break; case '3':printf(“apply is '*':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); cheng(a,b); break; case '4':printf(“ apply is '/':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); chu(a,b); break; 塔里木大学信息工程学院课程设计 default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar(); break; } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } C语言课程设计报告 班 级: 10电子本1 学 号: 10303033122 姓 名: 指导老师: 方文森 完成日期: 温州大学城市学院课程设计 目 录 1、课程设计目的和要求.....................................................................................................2 2、课程设计任务内容.........................................................................................................2 3、详细设计说明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2软件设计.................................................................................................................3 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法).....................3 4、软件使用说明.................................................................................................................4 5、课程设计心得与体会.....................................................................................................4 附录1:参考文献................................................................................................................5 附录2:部分程序清单(带有较详细的注释)................................................................5 温州大学城市学院课程设计 C语言课程设计报告 1、课程设计目的和要求 目的:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握(2)掌握C语言编程和程序调试的基本技能(3)利用C语言进行基本的软件设计(4)掌握书写程序设计说明文档的能力(5)提高运用C语言解决实际问题的能力 要求:(1)分析课程设计题目的要求(2)写出详细设计说明 (3)编写程序代码,调试程序使其能正确运行(4)设计完成的软件要便于操作和使用(5)设计完成后提交课程设计报告 2、课程设计任务内容 1)一个班级有4个学生,共学习5门课程(大学英语、高等数学、C语言程序设计、VB程序设计、大学语文)。要求编写程序完成相应功能。2) 输入并保存]5门课程名称; 3) 输入并保存]4个学生的学号及其[个人相关信息]; 4) 输入并保存]每个学生对应的每门课程成绩; 5)求出每门功课的平均分; 6)找出有两门以上功课不及格的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 7)找出平均成绩在90分以上或者全部课程成绩在85分以上的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 8)计算每位学生的总分,并按总分进行排名,按由高到低输出他们的学号及总成绩; 9)对前面问题进行优化,即在一维数驵的基础上,考虑采用二维数组、函数及其参数传递的方式来解决相关问题; 10)对前面问题进行优化,在学号的基础上,增加学生的其它个人信息,包括:学号、姓名、年龄、性别,并采用结构体形式加以表示; 11)利用文件实现对输入及分析输出数据的存取操作。 12)参照教材P27页,3-11题引入选择功能,输入功能编号可以实现以上功能(考虑清屏函数,自查)。 温州大学城市学院课程设计 3、详细设计说明 3.1分析 3.2软件设计 开始菜单(功能选择)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10写入课程名读取课程名输入学生信息读取学生信息建立了学生信息及课程名称?退出程序读取课程、学生、成绩读取课程成绩输出功课的平均分两门以上功课不及格的学生输出高分的学生总分由高到低排序No保存保存Yes输入课程成绩(提示)必须输入课程名称、学生信息才能建立成绩保存清屏 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法) 取地址。 温州大学城市学院课程设计 4、软件使用说明 1.2.3.4.5.6.7.8.9.10.11.12.[99]读取课程、学生、成绩 [1]输入课程名称.[2]读取课程名称.[3]输入学生信息.[4]读取学生信息.[5]输入课程成绩.[6]读取课程成绩.[7]功课的平均分.[8]两门以上功课不及格的学生 [9]-高分的学生-.[10]学生总分排序.[0]退出应用程序.5、课程设计心得与体会 在大家的共同努力下,忙碌了两个星期,我们顺利完成了对此程序的编译及试运行。在设计程序的过程中,我们了解到要设计一个完整的程序,其中最难的可能就属设计整个程序的框架,其中可能会需要经过很多次的修改与调试,所以必须要有耐心,直至最后设计出自己想要的程序。 另外平时学习c语言的基础也很关键,因为如果平时学得就不怎么样,那么你面对这么一个比较有难度的程序,可能会望而却步,看懂他人的程序都是个难点,更别说让自己去设计。为了解决此类问题,最好就是多向同学,老师请教,查找资料。 设计一个程序的过程就是解决一个实际问题的过程,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;在次我们必须捋清思路,逐一的解决问题的各个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。 感谢这次的课程设计,它使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有就是无论做任何事都要有耐心。当然团队合作也是非常重要的一个环节,这会使你在学习过程中倍感轻松 总的来说,这次程序设计让我获益匪浅,对C语言也有了进一步的认识:C语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。C语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认 温州大学城市学院课程设计 识。 附录1:参考文献 《C语言程序设计与实践教程》 附录2:部分程序清单(带有较详细的注释) #include #define N 4 #define M 5 #define Debug 1 typedef struct { char SNo[5];char SName[10];}Student; void ScoreRead(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i 温州大学城市学院课程设计 void ScoreWrite(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i void CoureseRead(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;char ch;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} i=0;j=0;while(1){ ch = fgetc(fp);if(ch==EOF)break;if(ch=='n'){ Cname[i][j]=' ';i++;j=0;6 温州大学城市学院课程设计 } else { Cname[i][j]=ch;j++;} } #if(Debug==1)for(i=0;i void CoureseWrite(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} for(i=0;i第二篇:c语言程序贪吃蛇课程设计报告
第三篇:C语言课程设计报告
第四篇:C语言课程设计报告
第五篇:C语言课程设计报告