沙漠穿越问题_c语言课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
学院、系:
专业名称:计算机科学与技术
课程设计科目C语言程序课程设计所在班级:
学生学号:
学生姓名:
指导教师:
完成时间:2012年4月15日
穿越沙漠问题
一、设计任务与目标
穿越沙漠问题:一辆吉普车穿越1000公里的沙漠,吉普车的总装耗油量为500加仑,耗油率为每小时1加仑。
由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。
请编程求解,若让吉普车用最少的耗油量穿越沙漠,应该在那些地方建立临时油库,在每个临时油库存储的油量应该是多少。
具体要求如下;
(1) 运行程序后直接输出结果;
(2) 显示输出界面;
(3) 分条显示结果。
二、方案设计与论证
穿越沙漠问题,是一个极值问题。
为达到让吉普车用最少的耗油量穿越沙漠,则说明该问题只有唯一解。
而从问题中我们可以看出,显然吉普车是不能一次就穿越沙漠的,需要采取推进的方法,也就是在沙漠中前进一定的距离后就要建立临时油库为接下的路程做准备。
而我们从题目中可以知道最基本的信息,比如必须要走奇数次,这样才能确保最后到达终点方向。
然而我们又要保持效率,就要满足向终点时要满载和每个储油点都要储油点需要的和路上消耗的油量。
而针对这个问题,我们可以采取倒推的方法进行求解,从终点往起点推,然后记录每个储油点的位置和储油量。
而相反,正推是不可能的,因为我们不知道第一个储油点与起点的距离,但却可以知道最后一个储油点与终点相距500km。
而我们可以推出,详细情况如下图:
我们必须要做到i与i+1点之间往返若干次,而且每次到达i+1处,吉普车的油要消耗完,每次从i+1处出发的时候,又要装满油。
所以我们可以知道,两点之间的距离必须满足在耗油最少的条件下,使i点存够i*500加仑汽油的要求。
取第一个例子来说,第一个储油点i=1应该距离终点i=0处500km,而且应该在那个储油点存放500加仑汽油,这样才能保证吉普车能从i=1处到达终点i=0处。
此时我们将距离设为distance,储油点存放油量设为oil。
那么从这个例子中我们知道,distance[1]=500,oil[1]=500。
那么继续推导,为了在i=1处存放500加仑汽油,那么吉普车至少从i=2处开两趟满载油的车道i=1处。
所以我们可以知道i=2处至少要存放2*500=1000加仑汽油,即oil[2]=1000。
加上从i=1返回至i=2处一趟空载,总共往返三次。
而在这三次往返路程的耗油量按要求只能为500加仑,即distance12=500/3km。
那么我们可以继而推出distance[2]=distance[1]+distance12=500+500/3。
为了直观的了解情况,详情情况如下图:
而同样的,为了在i=2处存放1000加仑汽油,吉普车至少从i=3处开三趟装满油的车至i=2处。
所以i=3处至少存放3*500=1500加仑汽油,即oil[3]=1500。
加上前面一段的返程空车,总共五次往返。
路途的耗油量也应为最低标准的500仑,即distance23=500/5。
而可以得出distance[3]=distance[2]+distance23=500+500/3+500/5。
详情情况如下图:
所以我们继续推导下去的话,我们可以发现:为了在i=k处存放k*500加仑汽油,吉普车至少要从i=k+1处开k趟载满油的车到i=k处。
而我们根据前面例子的公式可以推出:oil[k+1]=(k+1)*500=oil[k]+500,加上从i=k处返回i=k+1的返趟,总共2k-1次。
而同样的这2k-1次的总耗油量都按照最低标准,即distancekk+1=500/(2k-1),distance[k+1]=distance[k]+distancekk+1=distance[k]+500/(2k-1)。
而我们现在可以知道最后i=n至终点的距离为1000-distance[n],oil[n]=500*n。
为了在i=n处取得n*500加仑汽油,吉普车至少从始点开n+1次满载车到i=n,加上i=n返回始点的n趟返程空车,总共2n+1次,而这总耗油量为(1000-distance[n])*(2n+1),即始点存放油量为oil[n]+(1000-distance[n])*(2n+1)。
则我们可以通过输入代码来求出我们想得到的值。
三、程序框图或流程图,程序清单与调用关系
int 定义整型变量float 定义浮点型变量do-while 循环体
k 储油点的序号
d累计终点至当前储油点的距离
d1 i=n至始点的距离
oil 储油点存放的油量
distance 距离
四、全部源程序清单
#include<stdio.h>
void main()
{
int k; /*定义每个储油点的序号*/
float d,d1; /*定义d为累计终点至当前贮油点的距离,定义d1为i=n至始点的距离*/
float oil[10],dis[10]; /*oil为每个储油点存放的油量,distance为该储油点离终点的距离*/
int i;
printf("NO.\tdistance(km)\toil(cc)\n");
k=1; /*赋值k为1*/
d=500; /*从i=1处开始向始点倒推导*/
dis[1]=500; /*第一段距离为500km*/
oil[1]=500; /*第一个储油点的储油量为500cc*/
do{ /*进入循环体*/
k=k+1;
d=d+500/(2*k-1);
dis[k]=d;
oil[k]=oil[k-1]+500;
}while(!(d>=1000)); /*达到起点,跳出循环*/
dis[k]=1000; /*置始点至终点的距离值*/
d1=1000-dis[k-1]; /*求i=n处至始点的距离*/
oil[k]=d1*(2*k+1)+oil[k-1]; /*得出始点藏油量*/
for(i=0;i<k;i++) /*进入循环体,得出每个储油点的位置 */
printf("%d\t%f\t%f\t\n",i,1000-dis[k-i],oil[k-i]); /*逐一输出*/
} /*程序结束*/
五、程序运行结果测试与分析
如程序没有错误,得出的结果应该为:
NO. distance(km)oil(cc)
0 500.000000 500.000000
1 334.000000 1000.000000
2 234.000000 1500.000000
3 163.000000 2000.000000
4 108.000000 2500.000000
5 63.000000 3000.000000
6 25.000000 3500.000000
7 0.000000 3925.000000
而我们在Microsoft Visual C++ 6.0软件运行该代码,得出的结果如下图:
由该图我们可以得出,我们应设置七个点,第一个点在距离终点500km处,存放500cc汽油;第一个点在距离起点500km处,存放500cc汽油;
第二个点在距离起点334km处,存放1000cc汽油;
第三个点在距离起点234km处,存放1500cc汽油;
第四个点在距离起点163km处,存放2000cc汽油;
第五个点在距离起点108km处,存放2500cc汽油;
第六个点在距离起点63km处,存放3000cc汽油;
第七个点在距离起点25km处,存放3500cc汽油;
在起点处存放3925cc汽油。
由调试结果得出答案。
六、结论与心得
1.一开始将所有的数据定为int,以至于有时候会导致数据出现错误,直到改变
为类型float,问题才得以解决。
所以以后再设计代码的过程中,要懂得如何区分数据类型,并定义一个正确的数据类型以防止程序出错和数据丢失。
2.输出语句printf("%d\t%f\t%f\t\n",i,1000-dis[k-i],oil[k-i],一开始将k写成了i,导致了数据的上下颠倒,找了很久都没发现,最后发现应该改为k,问题才得以解决,所以在以后设计代码的过程中,什么都要严谨,逻辑性要强。
要不然到最后会出现很严重的调试问题。
3.一开始我并没有选择do-while的循环语句,导致了要不然就循环体出现错误,要不然就无法运行的问题。
直到上网询问,得到了帮助,才发现do-while语句是最佳方案,并将我之前的代码加以改进,得出了最优方案。
所以以后设计代码的时候,除了自己的想法以外,还要多问多借鉴别人的方法,从而得出最优的代码。
七、参考资料
[1] 刘斌等编著,面向对象程序设计 Visual C++,清华大学出版社,44-45页。
[2] 余江等编著,C语言程序设计,天津科学技术出版社,14-15页,34-35页,78页
[3] 百度知道,/
[4] 编程中国,/
八、致谢
程序设计至此,已告了一段落,在整个程序设计的过程中,除了自身的努力外,还有很多外部的力量一点点的指引我和帮助我完成。
有老师,有同学,有网友。
在此,我衷心的跟他们说一声谢谢。
虽然成功调试,但是我依然觉得我的能力不足以解决很多问题,这个问题我花了很多时间去理解去解决,当今社会追求效率,给了如此长的时间,换作别人也是可以完成的。
所以在以后的学习过程中,要注意代码运用的熟悉度,多训练尽量做到熟练运用,那么才可以在设计程序的过程中减少不必要的时间损耗。
课堂中,我调试代码的时候发现了错误,询问老师,老师都很乐意一点点的帮助我走出困境并告诉我应该怎么样去做,让我走少了许多弯路。
在宿舍中,不懂得积极询问同学,从同学们身上学习到不一样的知识与理解。
在网络中,我将问题发布在网上都能得到热心的网友的解答。
所以很开心与荣幸能够得到你们的帮助。
这次程序设计是个很不错的锻炼机会,在以后的学习过程中,我也要好好抓紧,锻炼自己,提高自己。
这样才能让我在学计算机的路上更加成功。
课程设计成绩评定表。