今天一同学问我一道数学题,要用代码求出结果。题目如下图:

我感觉题目的主要要处理的地方就是变量,有点多。下面是我写的代码,采用暴力方式寻找alpha,很臃肿。
这些是用到的一些数据,名字和题目中对应,都是全局变量。本来没这么多,后来写着写着发现参数传来传去把我搞晕了,索性都全局了。
1 #define PI 3.1415926 2 double D=860,LC=3200,d=430,b=5,LE=330; 3 double a;//a(alpha) 4 int n,N;
下面是求解题目中第一个式子,这个很好处理:
1 float res_t(void) 2 { 3 float temp; 4 temp = 2*LC*tan(a)/D+2*(PI/2+asin((2*LE*tan(a)-d)/D)); 5 return temp; 6 }
然后是求解题目中第二个式子,这个写的一团糟:
1 //这几个变量也是全局的 2 int k[4]; 3 int num; 4 float n_res[4]; 5 float p_res[4]; 6 7 void res_T_temp(float kn) 8 { 9 k[num] = kn*n; 10 p_res[num] = ((kn+N)*2*PI+2*b/(n*D*cos(a))); 11 n_res[num] = ((kn+N)*2*PI-2*b/(n*D*cos(a))); 12 ++num; 13 } 14 15 //处理各个k/n 16 void res_T(void) 17 { 18 switch (n) 19 { 20 case 2: 21 res_T_temp(1.0/2);break; 22 case 3: 23 res_T_temp(1.0/3); 24 res_T_temp(2.0/3);break; 25 case 4: 26 res_T_temp(1.0/4); 27 res_T_temp(3.0/4);break; 28 case 5: 29 res_T_temp(1.0/5); 30 res_T_temp(2.0/5); 31 res_T_temp(3.0/5); 32 res_T_temp(4.0/5);break; 33 case 6: 34 res_T_temp(1.0/6); 35 res_T_temp(5.0/6);break; 36 default :break; 37 } 38 }
因为k,n的个数比较少,所以他要求的k/n为最简真分数我是自己找出来的,即代码中的kn,没有写代码。简化了一些代码,但到后面要求输出k时我就傻眼了,只好又弄了个k[4]数组,将kn*n计算出k。。。。这里遇到两个个问题,一个是最开始我写的是 k[num] = (int)kn*n; 作了强制转换,但结果输出的k全都是0,很是费解。另一个问题是,我做单步调试的时候到了这一步,总是出现这个提示,没法在调试了,查了很多资料也没搞明白。
剩下的便是主函数了,主要嵌套循环,代入各个变量,寻找最佳alpha:
1 int main() 2 { 3 //为了便于计算,角度都化成了弧度,式子相应化简 4 //输出结果也是弧度 5 float T,t;//T(theta n-k),t(theta t) 6 double lmt = 0.001*2*PI/360; 7 8 cout<<"alpha\t\tn\tk\tN"<<endl; 9 10 for(a=0;a<PI/2;a+=0.00001) 11 { 12 t = res_t(); 13 14 for(N=1;N<9;N++) 15 { 16 for(n=2;n<7;n++) 17 { 18 num=0; 19 res_T(); 20 for(int i=0;i<num;i++) 21 { 22 T = n_res[i]; 23 if(fabs(T-2*t)<lmt) 24 cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; 25 T = p_res[i]; 26 if(fabs(T-2*t)<lmt) 27 cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; 28 } 29 } 30 } 31 } 32 return 0; 33 }
完整的代码如下:
1 #include<iostream> 2 #include<math.h> 3 4 #define PI 3.1415926 5 double D=860,LC=3200,d=430,b=5,LE=330; 6 double a;//a(alpha) 7 int n,N; 8 9 int k[4]; 10 int num; 11 float n_res[4]; 12 float p_res[4]; 13 14 using namespace std; 15 16 float res_t(void) 17 { 18 float temp; 19 temp = 2*LC*tan(a)/D+2*(PI/2+asin((2*LE*tan(a)-d)/D)); 20 return temp; 21 } 22 23 void res_T_temp(float kn) 24 { 25 k[num] = kn*n; 26 p_res[num] = ((kn+N)*2*PI+2*b/(n*D*cos(a))); 27 n_res[num] = ((kn+N)*2*PI-2*b/(n*D*cos(a))); 28 ++num; 29 } 30 31 void res_T(void) 32 { 33 switch (n) 34 { 35 case 2: 36 res_T_temp(1.0/2);break; 37 case 3: 38 res_T_temp(1.0/3); 39 res_T_temp(2.0/3);break; 40 case 4: 41 res_T_temp(1.0/4); 42 res_T_temp(3.0/4);break; 43 case 5: 44 res_T_temp(1.0/5); 45 res_T_temp(2.0/5); 46 res_T_temp(3.0/5); 47 res_T_temp(4.0/5);break; 48 case 6: 49 res_T_temp(1.0/6); 50 res_T_temp(5.0/6);break; 51 default :break; 52 } 53 } 54 55 int main() 56 { 57 //为了便于计算,角度都化成了弧度,式子相应化简 58 //输出结果也是弧度 59 float T,t;//T(theta n-k),t(theta t) 60 double lmt = 0.001*2*PI/360; 61 62 cout<<"alpha\t\tn\tk\tN"<<endl; 63 64 for(a=0;a<PI/2;a+=0.00001) 65 { 66 t = res_t(); 67 68 for(N=1;N<9;N++) 69 { 70 for(n=2;n<7;n++) 71 { 72 num=0; 73 res_T(); 74 for(int i=0;i<num;i++) 75 { 76 T = n_res[i]; 77 if(fabs(T-2*t)<lmt) 78 cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; 79 T = p_res[i]; 80 if(fabs(T-2*t)<lmt) 81 cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; 82 } 83 } 84 } 85 } 86 return 0; 87 }
运行结果如下:

虽然是个小程序,但还是发现了许多问题要解决,很多细节掌握的还不好,有待改进学习。
浙公网安备 33010602011771号