第一次解决实际问题
交通规划原理课上的题目。第六章的第三题。
有同学说迭代次数太多,手算麻烦。
我决定用机器来完成。
什么软件好呢?C、matlab、VFP、python?都有了解,了解最深,接触比较多还就C了,于是就选C了,其他未免太专业、、、
然后开始干活。
----------------------------------------------------------
先自己用笔算了一次,基本方法找到了。
转化为代码的时候有这么几个问题:书上的表格把基础数据和合计数据合在一起,实际写代码的时候要分开成几张表。怎么表达是个问题。
交通增长系数的判定,让数组里面的数限制在一个范围内,怎么限定。
#include "stdio.h"//用平均增长系数法计算分布交通量
int main(void)
{
float q[3][3]={{4,2,2},
{2,8,4},
{2,4,4}};//赋初值
float OD[2][3]={{16,28,40},
{16,28,40}};
float OD1[2][3];
float F[2][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
printf("%.1f\t",q[i][j]);
printf("\n");
}//打印测试初始值
printf("\n");
for(int i=0;i<3;i++)
OD1[0][i]=q[i][0]+q[i][1]+q[i][2];
for(int i=0;i<3;i++)
OD1[1][i]=q[0][i]+q[1][i]+q[2][i];//计算出行发生量与吸引交通量
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
printf("%.3f\t",OD1[i][j]);
printf("\n");
}
printf("\n");
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{F[i][j]=OD[i][j]/OD1[i][j];
printf("%.4f\t",F[i][j]);}
printf("\n");
}//计算发生交通量与吸引交通量的增长系数
printf("\n");
float max=4,min=2;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
{if(F[i][j]>=max)
max=F[i][j];
if(F[i][j]<=min)
min=F[i][j];}
printf("\n%.4f %.4f\n\n\n",max,min);
while(max>1.01||min<0.99)
{
q[0][0]=q[0][0]*(F[0][0]+F[1][0])/2;
q[0][1]=q[0][1]*(F[0][0]+F[1][1])/2;
q[0][2]=q[0][2]*(F[0][0]+F[1][2])/2;
q[1][0]=q[1][0]*(F[0][1]+F[1][0])/2;
q[1][1]=q[1][1]*(F[0][1]+F[1][1])/2;
q[1][2]=q[1][2]*(F[0][1]+F[1][2])/2;
q[2][0]=q[2][0]*(F[0][2]+F[1][0])/2;
q[2][1]=q[2][1]*(F[0][2]+F[1][1])/2;
q[2][2]=q[2][2]*(F[0][2]+F[1][2])/2;
for(int i=0;i<3;i++)
{for(int j=0;j<3;j++)
printf("%.3f\t",q[i][j]);
printf("\n");}
printf("\n");
for(int i=0;i<3;i++)
OD1[0][i]=q[i][0]+q[i][1]+q[i][2];
for(int i=0;i<3;i++)
OD1[1][i]=q[0][i]+q[1][i]+q[2][i];
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
printf("%.3f\t",OD1[i][j]);
printf("\n");
}
printf("\n");
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{F[i][j]=OD[i][j]/OD1[i][j];
printf("%.4f\t",F[i][j]);}
printf("\n");
}
max=0,min=5;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
{if(F[i][j]>=max)
max=F[i][j];
if(F[i][j]<=min)
min=F[i][j];}
printf("\n%.4f %.4f\n\n",max,min);
}
return 0;
}
看起来好长,看都不想看,要不是我写出来的,我自己都不想看、、、
question:代码重用性不高,有些代码复制粘贴,搞的看的比较晕和长,可以做个函数来减少冗余。比如那个输出的,几个for下来,看的脑壳晕。至少能降低20-30行代码。(话说以行来计算代码量、、、==)。具体迭代了多少次,没做统计,只能自己数。
用了19个for、、、、我是for的狂热爱好者!
规划的时候,模模糊糊的,想着边写边搞,就没弄具体,就画了个架子,输入-处理-迭代 最后花了2个小时才写完。输入我还自己定义了,收敛标准也是自己来改。当然现在写完了,再改还是比较容易的。
tips:考虑使用函数来对一些重用性比较高的代码进行封装(?)。
开始规划的时候尽量深入代码层,不要学客户学领导的方式,先把主要功能实现,然后逐步加附加模块。
其实到现在都可以看到这个逻辑还是混乱的,不正规、、、
虽然就使用了几个循环,什么高级的语法结构算法什么的都没用,但是我很高兴,因为这是我第一次用计算机代码把自己脑袋中想的东西变成了现实并且是有用的,虽然她是那么简单。
在走廊里,徘徊踱步呀,哈哈哈。