资源描述
C语言程序设计课程设计报告(学年 第 学期) 专 业:班 级:姓名学号:姓 名:指导教师:成 绩: 目 录一、课程设计的目的与要求1二、方案实现与调试 12.1 掷骰子游戏12.2 射击游戏32.3 计算存款本息之和52.4 肇事逃逸82.5 礼炮102.6 汽车加油122.8大优惠132.9 金币15三、课程设计分析与总结17附录 程序清单17一、课程设计的目的与要求(一)实验目的C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了学习必须的基本知识,如概念,方法和语法规则之外,更重要的是进行实训,以提高学习者的动手和编程能力,这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该C语言程序设计任务书,以在实训过程中给学生提供帮助。达到如下目的:1 在课程结束之前,让学生进一步了解C程序设计语言的编程功能;2 让学生扎实掌握C程序设计语言的相关知识;3 通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。(二)设计要求根据实验内容的要求自由选定题目。编写程序要求遵循如下基本要求:l 模块化程序设计l 锯齿型书写格式l 必须上机调试通过(三)课程设计报告(按C语言程序设计课程设计报告格式要求完成)1、设计目的2、总体设计(程序设计组成框图、流程图)3、详细设计、模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)。4、调试与测试:调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施。5、源程序清单和执行结果:源程序中应有足够的注释。(四)、检查标准1、学生必须编写可运行的程序,对教师的提问能熟练地当面解释清楚,回答的问题和程序运行的结果作为评分的主要衡量标准;(课程设计当周的周三开始逐一检查)2、按照本文后要求须提交电子内容的清单提交相关内容。二、方案实现与调试2.1掷骰子游戏(注,此题目用了两种方法,方法一:一般的main函数方式;方法二:加入函数分模块的方式。代码见附录)2.1.1 题目内容的描述 两人玩骰子,游戏规则如下:1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。2) 将每人每次的分值累加计分3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。2.1.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:整型;2)内容限制:随机数的产生;3)输出数据:获胜一方。2.1.3主要模块的算法描述 1) 程序流程图如下:开始第一人掷骰子计算第一人得分grade1第二人掷骰子计算第二人得分grade211=i=6一方的成绩的是否大于等于另一方的1.3倍否是获胜方是否初始化grade1=0,grade2=0,i=1i+结束2)语言描述如下: 此题目主要运用了循环语句。首先用随机数产生器产生产生玩家投骰子的点数;接下来根据点数计算玩家的分;接下来判断投掷的次数是否达到5次是的话比较一方的累计分数是不是在另一方的1.3倍以上,是的话则胜利,否的话继续投掷!2.1.4调试过程及实验结果1)调试过程遇到的问题与解决方案:没能正确理解“当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上”这句话的意思,以为是满五或者满十的时候带累计总分一次然后比较分数,确定获胜方!所以将“if(i=6)”z这个语句写成了“if(i=6)”,在后来的调试过程中发现,及时改正了!2)实验结果如下:2.2射击游戏2.2.1题目内容的描述 在程序运行时屏幕上方第一行随机出现一个 符号,要求游戏者输入一个1-80之间的整数,当用户输入一个整数后,一个*立即从屏幕底端的该整数列向上移动,若移动到屏幕的顶端能撞上 符号,则游戏者获胜;若没有撞上,则要求再输入一个整数,共允许输入5次,如果一直没有撞上,则认为游戏者输。 提示: 1)输入 符号可以采用printf(%c,1) 2)显示*号向上移动:输出一些空行;输出*号;以循环的方式增加延时(for(i=0;i100000;i+););clrscr()清屏重新绘制*号。2.2.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:整型、长整型;2)内容限制:键入数字3)输出数据:挑战成功还是失败获胜一方;4)System(“cls”),清屏。2.2.3主要模块的算法描述 1)程序流程图 开始随机产生数,而后令笑脸置顶k玩家键入数字l,i=1k=l i=i+1i=5玩家获胜玩家失败是否否是结束2)简单的语言描述:清屏;然后循环每行输出*;依次循环,判断是否击中目标;5次输入结束,或者击中目标结束。2.2.4调试过程及实验结果1)调试过程遇到的问题与解决方案: 在首次写完代码之后,运行发现无法将 图形置于屏幕第一行,之后查阅资料发现是代码控制不够完整,而后添加代码修改成功!2)实验结果如下:2.3计算存款本息之和2.3.1 题目内容的描述 以“存款利率”为关键字上网搜索目前我国整存整取不同期限我国的银行存款利率,只计算一年、三年和五年三种期限。 问题: (1) 要求输入存钱的本金和期限,求到期能从银行得到的利息与本金合计。 (2)假设存款期限为三十年本金为10万,比较一年、三年和五年滚存三十年后的本息金额。2.3.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:长整型;2)内容限制:键入本金与年限;3)输出数据:本息和PI 2.3.3主要模块的算法描述 (1)1)程序流程图如下: 开始输入本金m,存款年限n,定义本息和PIi=1i=3i=5PI=m*(1+0.0325*1);PI=m*(1+0.0425*3);PI=m*(1+0.0475*5);是否是否是years error!输出结果PI否结束2)语言描述如下:输入限定之内的年份与存款金额,选择对应的年利率计算本息和。 (2) 1) 程序流程图如下 开始m=100000,n,i,sum1,sum2,sum3sum1=m*(1+0.0325*1); m=sum1;i=1i=3i=5i=30i=30isum1&sum2sum3否否否是否否结束2)语言描述如下: 存款期限为三十年,本金为10万,分别计算一年、三年和五年滚存三十年后的本息金额,然后进行比较,输出分别输出一年、三年和五年滚存三十年后的本息金额和最大的本息额。2.3.4调试过程及实验结果1)调试过程遇到的问题与解决方案:(1)在初次编程中,将本金,年份定义成int型,在后来的测试过程中发现不合适,因为年利率有多个小数点,最终更正用float定义!(2)在写代码时,部分代码忘记标下标,导致结果如下,第一次修改时将float改成double未能成功,而后检查后运行正确!2)实验结果如下: (1) (2) 2.4肇事逃逸2.4.1 题目内容的描述 某部闽DT的出租车交通肇事逃逸,现场无人看清后面的四位数字,但三位目击群众提供信息如下:1) 车牌号后两位相同; 2) 车牌号前两位相同; 3) 车牌号是一个整数的平方。请编程查出肇事逃逸车辆的车牌号。2.4.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:整型;2)内容限制:前两位相同,后两位相同,整数的平方;3)输出数据:四位整数2.4.3主要模块的算法描述 2) 程序流程图如下:开始i=0, j=0, k=0, l ,i=9, j=9,k=100l=1000*i+100*i+10*j+j;k*k=li=i+1,j=j+1,k=k=1输出结果l否是2)语言描述如下: 前两位,后两位相同,则前两位用i表示,后两位用均表示,用k是100以内的两位整数,l表示这个四位数,用循环语句依次判断结果适合公式:k*k=l=1000*i+100*i+10*j+j,即为肇事车牌号!2.4.4调试过程及实验结果1)调试过程遇到的问题与解决方案: 书写代码时,定义四位车牌号为l,由于字母l与数字1比较像,结果导致混淆,在vc环境运行后,发现错误,及时改正!在以后,将尽量少使用字母l来定义变量!2)实验结果如下: 2.5礼炮2.5.1题目内容的描述 鸣放礼炮起源于英国。据说400多年前英国海军用的是火炮。当战舰进入友好国家的港口之前,或在公海上与友好国家的舰船相遇时,为了表示没有敌意,便把船上大炮内的炮弹统统放掉,对方的海岸炮舰船也同样做以表示回报。这种做法以后就逐渐成为互致敬意的一种礼仪。由于当时最大的战舰装有大炮21门,所以鸣炮21响就成了一种最高礼节。 有四艘战舰ABCD开始鸣放礼炮各21响,已知A战舰每隔5秒放一次,B 战舰每隔6秒放一次, C战舰每隔7秒放一次, D战舰每隔8秒放一次.假设各炮手对时间掌握非常准确,请问观众共可以听到几次礼炮声?2.5.2输入数据类型、格式和内容限制和输出数据的说明1) 数据类型:整型;2)内容限制:题目依据;3) 用到的主要语句:循环条件判断;4)输出数据:礼炮声(整型)。2.5.3系统主要模块的算法描述 1)程序流程图如下: 初始化i=1,j=0i=160(i%5=0|i%6=0|i%7=0|i%8=0)&i100&i120 & i140&i=160)输出j开始结束是否否否是是是是否i+,j+i+否2) 简要的语言描述如下:根据条件“A战舰每隔5秒放一次,B 战舰每隔6秒放一次, C战舰每隔7秒放一次, D战舰每隔8秒放一次.”确定可能性!依次判断,累计听到的次数,得出结果!2.5.4调试过程及实验结果1) 调试过程遇到的问题与解决方案: 发现定义变i是与int之间没有空格,导致结果如下,调试修改正确。 2) 实验结果如下: 2.6汽车加油2.6.1题目内容的描述 一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。输入:第一行有2 个正整数N和K(1 = N = 100,1 = K = 100),表示汽车加满油后可行驶N公里,且旅途中有K个加油站。接下来的1 行中,有K+1 个整数,表示第K个加油站与第K-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第K+1 个整数表示第K个加油站与目的地的距离。输出:将编程计算出的最少加油次数输出。如果无法到达目的地,则输出 No Solution。(注意:No和Solution之间有一个空格)。例如:输入:8 83 2 3 6 5 4 2 7 2输出:52.6.2输入数据类型、格式和内容限制和输出数据的说明3) 数据类型:数组类型;2)内容限制:键入数据:4) 用到的主要语句:循环条件判断;4)输出数据:加油次数(整型)。2.6.3系统主要模块的算法描述 1)简要的语言描述 按题目要求输入数据;首先判断可行驶的路程是否足够汽车到达加油站;如果不能到达,则需要加油,在此处记录一次并循环;得出累计加油次数之和算得出结果。2.6.4调试过程及实验结果1)实验结果如下: 2.8大优惠2.8.1 题目内容的描述 中国移动推出最新的手机资费优惠方案,按照这个方案Tom的手机每天消费1元,每消费K元就可以获赠1元,一开始Tom有M元,问最多可以用多少天?输入的测试数据为一行,实例包括2个整数M, K(2 = K = M = 1000)。输出一个整数,表示M元可以用的天数。2.8.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:整型;2)内容限制:键入数字M、K;3)输出数据:可以使用的天数。 2.8.3主要模块的算法描述 1) 程序流程图如下: 开始M0i%K=0i+,M=M-1;M=M+1可用天数i是否是结束K,M,i=0,2 = K = M K的,与事实不相符合,在后来的检查调试过程中,加入了限定的条件!2)实验结果如下: 2.9掷骰子游戏2.9.1 题目内容的描述 国王用金币奖励他忠诚的侍从。第一天侍从工作结束后,国王奖励了他一个金币;接着的两天侍从工作中(第二天,第三天)的每一天,国王奖励了他两个金币;接着的三天侍从工作中(第四天,第五天,第六天)的每一天,国王奖励了他三个金币;接着的四天侍从工作中(第七天,第八天,第九天,第十天)的每一天,国王奖励了他四个金币。这种奖励的模式将是固定不变的,即在N天侍从工作中的每一天,国王将奖励他N个金币;接着的N+1天的侍从工作中的每一天,国王将奖励他N+1个金币。要求在给定的天数时,你的程序能够统计国王总共奖励了侍从多少金币。2.9.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:整型;2)内容限制:键入天数;3)输出数据:整型输出金币个数。2.9.3主要模块的算法描述 3) 程序流程图如下: 开始i=1,sum=0sum=0输入天数j, j!=0j=isum=sum+i*i,j=j-i;sum=sum+j*i,j=0;输出金币数sum结束是否i+2)语言描述如下: 了解题意之后得出,主要的数据间的关系为算法为sum=sum+i*i,j=j-i,通过判断j,之间的关系终止进行总求和输出结果。2.9.4调试过程及实验结果1)调试过程遇到的问题与解决方案:在写思考是忘记天数不能为零,再后来的写代码是也没有注意,后来发现不符合实际,添加代码“j!=0”,修改成功!2) 实验结果如下: 二、 课程设计分析与总结 由于上学期在语言的学习方面没有足够的重视,因此,基础功不是很扎实,在这次课程设计中显得特别吃力,不过最终还是基本完成了此次课程设计的内容。 在各个实验中解决问题的基本流程是:分析问题分析解决问题的基本流程选择合适的算法语句书写程序调试修改按要求书写实验报告。在这些过程中,我认为分析问题的解决流程最为重要,分析好解决流程之后,就可以清楚的知道自己这一步要干什么,下一步要干什么,思路就显得十分清楚,按照这个流程解决问题是我感觉做得好的一面。不过也有很多不足,例如:好久没碰C语言了,for语句,while语句的基本功能都模糊了,在选择运用时还要在课本、网络上熟悉这些内容,还有一点就是自己对函数、模块化的思想掌握不够,按照实验要求需运用模块化的方式来解决问题,自己却很少使用这种思想,这就是实验中的不足之处。总而言之,通过这次5天的课程设计我进一步了解C程序设计语言的编程功能,握C程序设计语言的相关知识,体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。众多不足之处我会在大二上学期重修高级语言程序设计时进一步加固,力争将这门基础课真正的学好、用好,摆正思想,为以后的专业课的学习大好基础!最后感谢谢老师的一而再再而三的严格要求及耐心指导,感谢感谢同学们的帮助,谢谢你们!附录:源程序清单(保存在code-.cpp)2.1掷骰子游戏:掷骰子游戏方法一.cpp#include #include #include void main() int i,j,k,l,m,n,grade1=0,grade2=0; srand( (unsigned)time( NULL ) ); /生成随机数产生器 for(i=1; i11; i+) for(l=1;lj)grade1=grade1+j; elsegrade1=grade1+k; printf(第二个人第%d次投出的数n,i); n=rand()%6+1; printf(%dn,n); /rand()产生随机数 m=rand()%6+1; printf(%dn,m); if(m=6|n=6) grade2=grade2+8; if(m=n=5|m=n=4|m=n=3|m=n=2|m=n=1) grade2=grade2+7; else if(mn) grade2=grade2+n; else grade2=grade2+m; if(i=6) if(grade1=1.3*grade2|grade2=1.3*grade1) i=10; printf(第一个人累计分数%dn,grade1); printf(第二个人累计分数%dn,grade2); if(grade1grade2) printf(第一个人获胜); if(grade2grade1)printf(第二个人获胜);掷骰子游戏方法二.cpp#include #include #include int a(int j,int k)int x=0;if(j=k&j=6) x=8; else x=7; if(jk) x=j; else x=k; return x;int b(int m,int n)int y=0;if(m=n&m=6) y=8;else y=7; if(mn) y=m; else y=n; return y;void main() int i=1,j,k,m,n,e,f,grade1=0,grade2=0; srand( (unsigned)time( NULL ) ); while (i=6&(grade1=1.3*grade2|grade2=1.3*grade1) break; printf(n 第一个人的总成绩为%d,grade1); printf(n第二个人总成绩为%dnn,grade2); if(grade1grade2) printf(第一个人获胜); if(grade2grade1)printf(第二个人获胜);2.2射击游戏:射击游戏.cpp#include#include#includevoid main() int i,j,k,l,m; long int n; srand(unsigned)time(NULL); /生成随机数产生器 k=rand()%80+1; for(i=0;ik;i+) printf( ); printf(%cn,1); for(m=0;m0;j-) system(cls); for(i=0;i80;i+) if(i=k) printf(%c,1); else printf( ); for(i=1;ij;i+) printf(n); for(n=0;n80;n+) if(n=l) printf(*); else printf( ); for(n=0;n100000;n+); if(l=k) printf(恭喜你获胜,赏金封侯!n); break; if(m=4) printf(你竟然吃了败仗,当灭九族!n); 2.3计算存款本息之和:(1) 计算存款本息之和(1).cpp #includevoid main() float m,n,PI=0;/定义 m存款本金,n存款年限, printf(Please input the principal:); scanf(%f,&m); printf(Please input the years:); scanf(%f,&n); if(n=1) PI=m*(1+0.0325*1); else if(n=3) PI=m*(1+0.0425*3); else if(m=5) PI=m*(1+0.0475*5); else printf(years error!n); printf(The PI are:%fn,PI);(2) 计算存款本息之和(2).cpp #includevoid main()float m=100000,n,sum1,sum2,sum3;int i;for(i=1;i=30;i+) n=1; sum1=m*(1+0.0325*1); m=sum1; for(i=3;i=30;i+=3) n=3; sum2=m*(1+0.0425*3); m=sum2; for(i=5;isum2&sum1sum3)printf(一年滚存三十年的本息额最多:%fn,sum1);else if(sum2sum1&sum2sum3)printf(二年滚存三十年的本息额最多:%fn,sum2); elseprintf(三年滚存三十年的本息额最多:%fn,sum3);2.4肇事逃逸:肇事逃逸.cpp#includevoid main() int i,j,k,l;/i前两位数,j代表后两位数,k代表100以内任意整数 for(i=0;i=9;i+) for(j=0;j=9;j+) if(i!=j) for(k=0;k=100;k+) l=1000*i+100*i+10*j+j; if(k*k=l) printf(肇事逃逸车辆的车牌号为:%dn,l); 2.5汽车加油:礼炮.cpp #include void main () int i,j=0; for(i=1;i=160;i+) if( (i%5=0|i%6=0|i%7 =0|i%8=0)&i100&i120 & i140&i=160) j+; printf (j=%dn, j); 2.6汽车加油:汽车加油.cpp#include void main()int K,N,i,j,l999,x=0,y=0; /*i表示第几个加油站;j为第K个加油站与第K-1个加油站直接的距离;x表示总距离;*/printf(输入:);scanf(%d%d,&N,&K);for(i=0;i=K;i+)scanf(%d,&j);li=j;for(i=0;i=K;i+)if(Nli) printf(No Solution.n);break; elsex=x+li; if(Nx)y+; x=li;if(i=K)printf(输出:%dn,y);2.8大优惠:大优惠.cpp#includevoid main()int K,M,i=0;printf(Please input K and M n(注意:2 = K = M = 1000,且K与M之间用空格隔开)n);scanf(%d%d,&K,&M); if(2 = K = M 0)i+; M=M-1;if(i%K=0) M=M+1;printf(可用天数%dn,i);elseprintf(Input is error);2.9掷骰子游戏:金币.cpp#includevoid main()int i,j;int sum=0;printf(Please input daysn);scanf(%d,&j);for(i=1;j!=0;i+)if(j=i)sum=sum+i*i,j=j-i;elsesum=sum+j*i,j=0;printf(国王共奖励了侍从%d金币n,sum);设计日志2013-6-24上午:c语言忘了大半,首先在网络上复习了一下c语言的有关内容;2.1的这一题只是画出了流程图,大体代码书写完成,没有完成实验报告内容。2013-6-24下午:完成了2.1,2.2的设计报告内容;画出了2.3的流程图。2013-6-25上午:根据老师所讲,修善了前面几道题的流程图。书写完成2.3的程序代码! 2013-6-25下午:彻底完成2.3,修改了前面实验报告的相关格式。2013-6-26上午:集中注意开始做2.4,2.4不是很难,很快就完成了;下来之后有点心急了,有的同学都做完了,跳到2.8开始做2.8,由于没注意题目中K、M的关系,忙了半天还是做的错的!后来急了就询问同桌,便恍然大悟,一口气做完了2.9。2013-6-26 下午:完成了2.5,初步开始了2.6。2013-6-27上午: 首先用第二种方法模块化的思想从新做了2.1,没有彻底做完。2013-6-27下午:继续完成第2.1的模块化做法!完了之后彻底完成了2.6! 大功告成!2013-6-28上午:完成了此次课程设计的目录与分析与总结,最后再次检查了一下课程设计的格式!(注:指导教师评语和成绩所在表格另起一页)指导教师评 语课程设计成 绩指导教师签字 年 月 日
展开阅读全文