程序设计实验周r005h小车过沙漠(南邮)
- 格式:doc
- 大小:80.00 KB
- 文档页数:8
R005H卡车过沙漠程序设计报告
一、问题描述:
一辆重型卡车欲通过1000公里的沙漠,卡车耗油量为1公升/公里,卡车总载油量为500公升,显然卡车装一次油是通过不了沙漠的。
因此司机必须在沿途设立几个储油点,使卡车能顺利通过沙漠。
试问司机如何建这些储油点?每个储油点应该储多少升油?才能使用卡车以最小耗油量的代价通过沙漠?
二、问题分析:
由终点倒推,递推每个储油点的储油量和两个储油点间车行驶距离
分析:上面是最原始的递推可得第一个程序,相对较简单,但是由这个程序(什么都已知的,路程,每公里耗油量,以及汽车最多载油量)怎么改编成什么都可以改变的,即都由用户来输入数据,需解决以下问题。
1、每个储油点(place)需储油(oil)和每次最大载油量(max)间的关系。
2、怎样表示出离起点最近的储油点的距离。
3、最重要的是让计算机做出判断,任意两个相邻储油点之间汽车需来回多少次,可以确定的是,这个数字一定是奇数。
解决以上三个问题,特别是第三点,程序自然能出来。
三、结构图
四、数据结构的设计
编程计算及打印建立的贮油点序号,各贮油点距沙漠边沿出发的距离以及存油量。
设dist 为第i个贮油点至终点(i=0)的距离;
oil 为第i个贮油点的存贮油量;
我们可以用倒推法来解决这个问题。
从终点向始点倒推,逐一求出每个贮油点的位置及存油量。
下图表示倒推时的返回点:
从贮油点i向贮油点i+1倒推的策略是,卡车在点i和点i+1间往返若干次。
卡车每次返回i+1处时正好耗尽500公升汽油,而每次从i+1出发时又必须装足500公升汽油。
两点之间的距离必须满足在耗油最少的条件下使i点贮足i*500分升汽油的要求(0<=i<=n-1)。
具体地讲,第一个贮油点i=1应距终点i=0处500km且在该处贮藏500公升汽油,这样才能保证卡车能由i=1处到达终点i=0处,这就是说
dist=500 oil=500;
为了在i=1处贮藏500公升汽油,卡车至少从i=2处开两趟满载油的车至i=1处。
所以i=2处至少贮有2*500公升汽油,即从终点算第二个储油点需要油:oil=500*2=1000。
另外,再加上从i=1返回至i=2处的一趟空载,合计往返3次。
三次往返路程的耗油量按最省要求只能为500公升。
d12=500/3 dis= dist+500/3
为了在i=2处贮存1000公升汽油,卡车至少从i=3处开三趟满载油的车至i=2处。
报以i=3处至少贮有3*500公升汽油,即oil=500*3=1500。
加上i=2至i=3处的二趟返程空车,合计5次。
路途耗油量也应为500公升,即d23=500/5, Dist=dist +500/5;
依此类推,为了在i=place处贮藏place*500公升汽油,卡车至少从i=place+1处开place趟满载车至i=place处,即
oil=oil+500,加上从i=k处返回i=k+1的k-1趟返程空间,合计2k-1次。
这2k-1次总耗油量按最省要求为500公升,即
dk,k+1=500/(2k-1)
dist=dist+dk,k+1
=dist+500/(2k-1);
最后,i=n至始点的距离为1000-dist,从终点开始数第n个储油点需要油:oil=500*n。
为了在i=n处取得n*500公升汽油,卡车至少从始点开n+1次满载车至i=n,加上从i=n返回始点的n趟返程空车,合计2n+1次,2n+1趟的总耗油量应正好为(1000-dist)*(2n+1),即始点藏油为oil+(1000-dist)*(2n+1)。
double total,dist,oil,max,cost,place=1.0; //total 总距离
dist 储油点离终点距离
oil储油点要的油量max 最大储油量
cost 每公里耗油量
int k=1; //前往下一储油点的次数
printf("请输入总的距离:\n");
scanf("%lf",&total); //输入总距离total
printf("请输入每公里耗油: \n");
scanf("%lf",&cost); //输入每公里耗油
printf("车一次最多能装多少油:\n");
scanf("%lf",&max); //输入车最多一次能装多少油
dist=max; //第一个储油点距终点的距离
oil=max*cost*place;//距离第一个储油点需要多少油
六、源程序:
#include <stdio.h>
#include<math.h>
void main( )
{
printf(" 自动化\n 启东哥\n 学号\n");
while(1)
{
double total,dist,oil,max,cost,place=1.0;//total 总距离dist 储油点离终点距离oil储油点要的油量max 最大储油量cost 每公里耗油量
int k=1,p,w=1;
printf("请输入总的距离:\n");
scanf("%lf",&total);
printf("请输入每公里耗油: \n");
scanf("%lf",&cost);
printf("车一次最多能装多少油:\n");
scanf("%lf",&max);
dist=max/cost;
oil=max*cost*place;
do
{
printf("储油点%.0lf\t距离%lf\t油量%lf\n",place, total-dist, oil );
a:
if ((k*max>cost*place*max))//假设离得很近,每次把车油全部运过去
max*k 但是不可能所以需k的出的整数加
一,所以max*(2(k-1)-1)大于下一储
油点需的油量max*cost*place p=k;
if(abs(k*max-cost*place*max)<0.0000000001)
p=k+1;
else
{
k++;
goto a;
}
place = place + 1;
dist=dist+max/( 2 * p - 1 )/cost;
oil = max*place*cost;
while ( dist < total);
dist=dist-max/( 2 * p - 1 )/cost;
b:
if(w*max>cost*place*max)
p=w;
if(abs(w*max-cost*place*max)<0.0000000001)
p=w+1;
else{
w++;
goto b;
}
oil = max * ( place - 1 )*cost+ ( total-dist) * ( 2 * p- 1 )*cost;
dist=(int)(dist/100000000000000000);
printf("储油点%.0lf\t距离%6.2lf\t油量%6.2lf\n",place, dist, oil) ;
printf("\n");
}
}
十、软件说明:
1、程序人机交互性好,审美观较好。
2、第二个源程序针对性强,可以输入任意可控制的量。
3、计算机自己可以判断相邻两个储油点的距离。
十一、课程设计总结:
这次的设计课是我们第一次动手与同学合作进行的程序设计!自己发现问题、解决问题,其中不仅对C和C++的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
对于这个课题来说,重点在于对于程序的算法了解,以及建立基本算法后的程序建立。
我们通过倒推法建立了本程序的基本框架,并运用数形结合的方法加以丰富和改建。
但在最终模拟时还是因为一些小失误导致了程序的颠倒,经过大家的讨论和努力最终得以克服。
总的来说,这个程序虽不是十分复杂但也有许多要思考的地方,不但对一些基本的语法进一步的熟悉掌握了而且还有了新的体会,两个星期的努力还是换来了不少的收获!。