一、程序设计目的
通过调试典型例题或习题积累调试 C 程序的经验,逐渐培养学生的编程能力、用计算机解决实际问题的能力。
针对于本次程序设计,有以下几点目的:
1.程序的逻辑性较强,可以增强学生的罗辑思维;
2.提高学生对题目的理解能力,并能很好地分析题目,将题目转化为图像,从而进行程序的设计;
3.程序中使用了数组(数组的存入、遍历以及比较)、随机数的产生、逻辑判断等重要内容,设计程序的同时对这些重要内容进行复习;
4.学会利用流程图以及伪代码表示算法;
5.掌握书写程设计开发文档的能力(书写课程设计报告)。
二、设计报告正文
1.程序设计原题目
假设你为快递公司设计快递投递路线优化程序。
(1)每个市有个中转分发点,有些城市之间有直通路线,有些城市之间没有直通路线;
(2)城市与城市之间的运费计算公式为:距离*1;
(3)设投递包裹的尺寸、重量都一样,每条运输线路有个运力上限(即只能运输多少个包裹)。
要求:(1)随机产生当天的包裹投递需求;
(2)对所产生的包裹需求,生成运输路线策略。
拓展要求:根据随机测试结果,利用程序优化城市间包裹线路。
2.题目分析
此系统应实现如下功能:
1.设定城市数,道路运量,道路长度。
2.随机产生各城市对包裹的需求量,通过随机数的产生实现。
3.生成一条运输路线(优化城市间的运输路线去,达到最优)。分别对各个城市进行算法运算,最后进行比较以得出最优路线。
3.题目图像化
定义五个城市,分别为A,B,C,D,E,其中A为运输中心
设定道路长度为:
AB=100 AC=60 AD=50 CB=70
CD=50 BE=30 CE=40 ED=100
设定道路运载量:
AB=110 AC=130 AD=150 BE=30
CE=30 DE=20,BC=30 CD=30
![请添加图片描述](https://img-blog.csdnimg.cn/d9cb1987f88948e68ebb691237cb916f.jpeg)
5.设计思路(伪代码)
#include<所需头文件>
Int main()
{定义五个城市的道路长度以及运力大小;
选择模式;
If(mood1){
生成4个城市的运量随机数;
}
If(mood2){
输入4个城市的运量;
}
对四个城市分别进行分析;
输出总费用;
}
6.代码设计
(1).analayseX函数
分析:逐个对城市进行分析,通过if判断语句,比较城市需求量与道路运力,来选择最优路径,例如(以城市B为例):
如果城市B的需求量小于AB之间道路的运力,则AB为最优路线;
如果城市B的需求量大于AB之间道路的运力且小于AB与BC之间运力的总和,则最优路线为AB+(AC+BC);
如果城市B无需求量,则记为运费=0;
其他情况的最优路线为(AB)+(AC+BC)+(AD+CD+BC)。
B城市的代码如下:
void analayseB(void){
if ( countB
a[0]=countBroadAB1;
printf(“到城市B最优路线为AB,费用为%d\n”,a[0]);
}
else if(countB>powerAB&& countB<(powerAB + powerBC) )
{
a[0]=110801+(countB-powerAB)(roadAC+roadBC);
printf(“到城市B最优路线为AB+(AC+BC),费用为%d\n”,a[0]);
}
else if(countB==0)
{
a[0]=0;
}
else
{
a[0]=110801+30(60+70)+(countB-powerAB-powerBC)*(roadAD+roadCD+roadBC);
printf(“到城市B最优路线为(AB)+(AC+BC)+(AD+CD+BC),费用为%d\n”,a[0]);
}
}
(2).mood函数
分析:使用者输入选择的模式。
具体代码如下:
int mood(void){
printf(“请选择模式(1 为手动输入各城市的运量;2 为随机生成个城市的运量)”);
scanf(“%d”,&number);
while(number!=1&&number!=2){ //防输入错误
printf(“输入出错,请重新输入”);
printf(“请选择模式(1 为手动输入各城市的运量;2 为随机生成各城市的运量)”);
scanf(“%d”,&number);
}
return number;
}
(3).主函数
分析:先定义各条道路的长度以及运力,然后定义一个数组(记录各个城市的最优方案所需运费);选择模式,让使用者输入需要选择的模式,通过一个if语句,来判断接下来的程序走向,同时使用while循环来防止错误输入。如果选择模式1,则通过printf、scanf以及while语句来实现四个城市的需求量输入,如果选择模式2,则通过srand((int )time(0)*10)函数来实现生成随机数由于道路运载量对城市需求量的限制,通过对随机数除余再加上某一值来实现,具体方法如下:countB = rand()%31+30; countC = rand()%31+30; countD = rand()%31+30; countE = rand()%(60-max)+40; 然后,分别对四个城市进行分析,将各个运费通过数组存储,算出总运费;最终询问是否重来。
部分程序如下:
int main()
{ while(end1){
int max;
printf(“已知道路长度如下:\n”);
printf(“AB=100,AC=60,AD=50,CB=70,CD=50,BE=30,CE=40,ED=100\n”);
printf(“已知道路运载量如下:\n”);
printf(“AB=110,AC=130,AD=150,BE=30,CE=30,DE=20,BC=30,CD=30\n”);
printf(" \n");
number=mood(); //选择模式
if(number1){
printf(“由于道路运载量有限定,B、C、D城市只能在0到60之间,E城市小于30\n”);
printf(“请输入B城市的运量\n”);
scanf(“%d”,&countB);
while(countB<0||countB>60){ //防输入错误
printf(“输入出错,请再输入范围内的值\n”);
printf(“请输入B城市的运量\n”);
scanf(“%d”,&countB);
}
printf(“请输入C城市的运量\n”);
scanf(“%d”,&countC);
printf(“请输入D城市的运量\n”);
scanf(“%d”,&countD);
printf(“请输入E城市的运量()\n”);
scanf(“%d”,&countE);
}
if(number==2){
srand((int)time(0)*10);
countB = rand()%31+30;
countC = rand()%31+30;
countD = rand()%31+30;
max=countB>countC?countB:countC;
max=max>countD?max:countD;
countE = rand()%(60-max)+40;
}
printf(" \n");
printf(“B城市的运量为 = %d\n”, countB);
printf(“C城市的运量为 = %d\n”, countC);
printf(“D城市的运量为 = %d\n”, countD);
printf(“E城市的运量为 = %d\n”, countE);
printf(" \n");
system(“pause”);
analayseB(); //对城市B
analayseC(); //对城市C
analayseD(); //对城市D
analayseE(); //城市E
printf(" \n");
int price;
price=a[0]+a[1]+a[2]+a[3];
printf(“\n”);
printf(“总费用为%d\n”,price);
system("pause");
printf(" \n");
printf("1 重新模拟一次;2 结束");
scanf("%d",&end);
printf(" \n");
}
return 0;
}
7.运行与检测报告
mood 1结果
Mood2结果
三、总结
程序整体上运行与题目要求吻合,算法大多比较通用,各个函数模块的正确性、完备性、对输入的容错能力以及算法的进一步改进在设计中都有表述,这道题使我熟悉了c语言的基本操作。