首页 正交表程序说明书

正交表程序说明书

举报
开通vip

正交表程序说明书正交表程序说明书 正交表程序设计说明书 指导老师:-- 班级:-- 姓名:-- 学号:-- 开始 正交表主程序流程图 输入水平数p 和向量维数n d=p^n; k=(d-1)/(p-1) Switch(d) 8 16 25 9 27 4 fun2() fun3() fun4() fun5() fun6() fun1() 否 n=2? 是 输出2输出2水输出4水输出2水输出5输出3水输出3水 水平2平3维正平2维正平4维正水平2平2维正平3维正 交表 交表 交表 交表 交表 维正交维正...

正交表程序说明书
正交表程序说明 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 正交表程序设计说明书 指导老师:-- 班级:-- 姓名:-- 学号:-- 开始 正交表主程序流程图 输入水平数p 和向量维数n d=p^n; k=(d-1)/(p-1) Switch(d) 8 16 25 9 27 4 fun2() fun3() fun4() fun5() fun6() fun1() 否 n=2? 是 输出2输出2水输出4水输出2水输出5输出3水输出3水 水平2平3维正平2维正平4维正水平2平2维正平3维正 交表 交表 交表 交表 交表 维正交维正交表 表 结束 子程序流程图以 开始 L9(3^4)为例 定义包含生成正交表所需要的数组h[9][2],a[4][2],b[9][4],变量i,j,k和对应的标记数组bool flag[9] for循环输出向量 域内的所有向量 用for循环、if else 语句及标记向量找 出独立向量并输出 将独立向量放入 a[4][2]里 用for循环给正交表数组赋值b[i][k]=h[i][0]*a[k][0]+h[i][1]*a[k] [1]; 输出正交 表数组 b[9][4] 结束 #include #include #include void main() { int d,n,p,c; void fun1(); 函数声明 void fun2(); void fun3(); void fun4(); void fun5(); void fun6(); printf("本程序包含7个无交互作用的常见正交表\n请输入实验水平数和向量维数中间用空格隔开\n"); scanf("%d",&p); scanf("%d",&n); d=int (pow (p,n)); 求p的n次幂,即实验组数 c=(d-1)/(p-1); 求独立向量个数,即正交表列数 switch(d) 以实验组数为变量,用swith语句判断,调用对应的子函数,输出对应实验组数的正交表 {case 9 : fun1();break; case 8 : fun2();break; case 4 : fun3();break; case 16: fun4();break; case 27: fun5();break; case 25: fun6();break; default : printf("此程序不包含这个正交表\n"); } system("PAUSE"); } 子程序以输出L9(3^4),L16(2^4),L16(4^2)正交表为例,其他子程序除了寻找独立向量部 分程序段略有不同,变量定义,赋值,循环,正交表数组生成原理都一样void fun5() {int h[9][2]={0,0,0,1,0,2,1,0,1,1,1,2,2,0,2,1,2,2},a[4][2], b[9][4],i,j,k=0; 定义生成正交表的所需的数组和变量 bool flag[9]; 定义一个有标记作用的数组 for (i=0;i<9;i++) for循环输出所有向量域里的二维向量 printf("%d\t(%d,%d)\n",i,h[i][0],h[i][1]); for (i=0;i<9;++i) 用for循环一步一步找出不是独立向量的向量,并使flag[i]=0; { if((h[i][0]==0) && (h[i][1]==0)) { flag[i]=0; }else if(h[i][0]==0) { for(j=0;j<9;++j) { if(flag[j] && j!=i && (h[j][0]==0) && (h[j][1]>h[i][1]) && (h[j][1]%h[i][1]==0)) { flag[j]=0; } } }else if(h[i][1]==0) { for(j=0;j<9;++j) { if(flag[j] && j!=i && (h[j][1]==0) && (h[j][0]>h[i][0]) && (h[j][0]%h[i][0]==0)) { flag[j]=0; } } }else if(h[i][0]==1) { for(j=0;j<9;++j) { if(flag[j] && j!=i && (h[j][0]>h[i][0]) && (h[j][0]*h[i][0]==h[j][1]*h[i][1])) { flag[j]=0; } } }else { for(j=0;j<9;++j) { if(flag[j] && j!=i && (h[j][0]>h[i][0]) && (h[j][0]*h[i][1]==h[j][1]*h[i][0])) { flag[j]=0; } } } } for (i=0;i<9;++i) 用for循环输出flag[i]为真的向量即独立向量 { if (flag[i]) { printf("第%d个向量是独立向量:(%d,%d)\n",i,h[i][0],h[i][1]); a[k][0] = h[i][0]; 把找出来的独立向量的值放入a[4][2]这个新数组里 a[k][1] = h[i][1]; k++; } } for (i=0;i<9;i++) for(k=0;k<4;k++) { b[i][k]=h[i][0]*a[k][0]+h[i][1]*a[k][1]; 正交表数组生成,2个向量对应值相乘再相加 if(b[i][k]>2) 如果数值大于二就要对水平数求余,再整体加1 b[i][k]=b[i][k]%3; b[i][k]=b[i][k]+1; } printf("3水平,2维向量的正交表是\n"); 输出3水平,2维向量的正交交表 for (i=0;i<9;i++) printf("%d\t%d\t%d\t%d\t\n",b[i][0],b[i][1],b[i][2],b[i][3]); } void fun3() {int h[16][2]={0,0,0,1,0,2,0,3,1,0,1,1,1,2,1,3,2,0,2,1,2,2,2,3,3,0,3,1,3,2,3,3},b[16][5],a[5][2];int y[16][4]={0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1 ,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1};int c[16][15],d[15][4];bool flag[16];int i,j,k=0,n; printf("请再次输入向量维数\n"); scanf("%d",&n); if(n==2) {for (i=0;i<16;i++) printf("%d\t(%d,%d)\n",i,h[i][0],h[i][1]); for (i=0;i<16;++i) { if((h[i][0]==0) && (h[i][1]==0)) { flag[i]=0; }else if(h[i][0]==0) { for(j=0;j<16;++j) { if(flag[j] && j!=i && (h[j][0]==0) && (h[j][1]>h[i][1]) && (h[j][1]%h[i][1]==0)) { flag[j]=0; } } }else if(h[i][1]==0) { for(j=0;j<16;++j) { if(flag[j] && j!=i && (h[j][1]==0) && (h[j][0]>h[i][0]) && (h[j][0]%h[i][0]==0)) { flag[j]=0; } } } else if(h[i][0]==0) { for(j=0;j<16;++j) { if(flag[j] && j!=i &&(h[j][1]==0) && (h[j][0]>h[i][0]) && (h[j][0]*h[i][0]==h[j][1]*h[i][1])) { flag[j]=0; } } }else if(h[i][0]==2) { for(j=0;j<16;++j) { if(flag[j] && j!=i && (h[j][0]>h[i][0]) && (h[j][0]*h[i][0]==h[j][1]*h[i][1])) { flag[j]=0; } } }else if(h[i][0]==1) { for(j=0;j<16;++j) { if(flag[j] && j!=i && (h[j][0]>h[i][0]) && (h[j][1]%h[i][1]==0)) { flag[j]=0; } } } else { for(j=0;j<16;++j) { if(flag[j] && j!=i && (h[j][0]>h[i][0]) && (h[j][0]*h[i][1]==h[j][1]*h[i][0])) { flag[j]=0; } } } } for (i=0;i<16;++i) { if (flag[i]) {printf("第%d个向量是独立向量:(%d,%d)\n",i,h[i][0],h[i][1]); a[k][0] = h[i][0]; a[k][1] = h[i][1];k++; } } for (i=0;i<16;i++) for(k=0;k<5;k++) { b[i][k]=h[i][0]*a[k][0]+h[i][1]*a[k][1]; if(b[i][k]>1) b[i][k]=b[i][k]%4; b[i][k]=b[i][k]+1; } printf("4水平,2维向量的正交表是\n"); for (i=0;i<16;i++) printf("%d\t%d\t%d\t%d\t%d\n",b[i][0],b[i][1],b[i][2],b[i][3],b[i][4]); } if(n==4) { for (i=0;i<16;i++) printf("%d\t(%d,%d,%d,%d)\n",i,y[i][0],y[i][1],y[i][2],y[i ][3]); for (i=0;i<16;++i) { if((y[i][0]==0) && (y[i][1]==0)&& (y[i][2]==0)&& (y[i][3]==0)) { flag[i]=0; } } for (i=0;i<16;++i) { if (flag[i]) { printf("第%d个向量是独立向量:(%d,%d,%d,%d)\n",i,y[i][0],y[i][1],y[i][2],y[i][3]); d[k][0] = y[i][0]; d[k][1] = y[i][1]; d[k][2] = y[i][2]; d[k][3] = y[i][3]; k++; } } for (i=0;i<16;i++) for(k=0;k<15;k++) { c[i][k]=y[i][0]*d[k][0]+y[i][1]*d[k][1]+y[i][2]*d[k][2]+y[i][3]*d[k][3]; if(c[i][k]>1) c[i][k]=c[i][k]%2; c[i][k]=c[i][k]+1; } printf("2水平,4维向量的正交表是\n"); for (i=0;i<16;i++) printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",c[i ][0],c[i][1],c[i][2],c[i][3],c[i][4],c[i][5],c[i][6],c[i][7],c[i][8],c[i][9],c[i][10],c[i][11],c[i][12],c[i][13 ],c[i][14]); } } 此程序包含常见的7个无交互作用的正交表,需要指出的是在fun3()这个子函数里有2个正交表的生成,因为实验组数为16的有L16(2^4)和L16(4^2)2个正交表,而switch语句是以实验组数作为判断变量,调用子函数的,因而在fun3()里面需要再次输入向量维数进行判断,输出对应正交表。 设计体会 编写C 程序之初,曾试图采用统一的输入入口,将参数一并输入,把所有正交表编成一个通用的程序来处理,再由输出端程序输出。但由于各正交表规格不同,设置参数较多,不仅给算法的统一带来麻烦,也为输入输出端程序设计带来很大的困难,无法找到一个通用的可以兼容所有正交表的方法,而我们在学习c语言时只学了静态数组,对动态数组的定义、使用很陌生,所以只好把套每张正交表的算法编成一个个相对独立的子程序后,采用主函main ()调用子程序名void fun()的形式,把每个正交表编写一个程序,然后整理成一个子程序库。 开始觉得设计这样的一个程序不是很难,但是自己去做才发现远不是想的那么容易。一个算法,一个赋值语句,在脑子里想的很容易,但是计算机是一个非常死的东西,没有人的脑子那么灵活,它必须是你输入什么他就执行什么,因而怎么把自己心中的想法转化为代码就是一个很大的问题,就如主函数中有一个求p的n次幂的算法,这个算法需要调用数学函数库pow函数,而我不知道,走了许多弯路,最后才在网上找到一个类似的程序代码,可是还有问题,网上用这个函数时变量都是double型,而我定义的变量都是int型,我想把变量类型统一一下应该就可以了,可是我改变了数据类型,程序仍然调试有错误,不得已我只好用了强制类型转换,在程序编写过程中是尽量避免使用强制类型转换的,这也算是我程序代码编写之中的一个瑕疵。 在编写根据实验组数调用子程序的代码时,我开始采用的是if else的嵌套语句,后来发现用if语句编写代码太多,不利于程序的执行,才想起swith语句正好可以消除这些缺点, 而且代码相对简单、清晰、明了。 编写子程序的过程中,我是先在另一个文件里编写、调试,然后再复制粘贴汇总,这样做即能在程序编译、调试中更快更迅速的找到错误,也避免了程序代码过多让人眼花的弊端。 每段子程序代码的编写最难的就是寻找独立向量的代码,每一个正交表的向量维数,水平数都不相同,这给独立向量的寻找带来很大的麻烦,我寻找独立向量是通过for循环和if语句及标记向量的方法,标记向量这一招很好用,定义bool类型的数组这个方法是热心网友给我提供的,独立向量找出来以后要把它重新放入一个有序数组里面,这部分我也花了将近一天时间,这一部分代码对于循环使用,赋值语句的使用必须很熟练,稍微错一点,就不能正常输出正交表,输出的全是乱码,我是通过不断的改变赋值语句,不断的调试,才完成这一部分代码的正确编写。最后一部分是对生成正交表的数组赋值 ,算法也比较简单,只要前面独立向量寻找正确,正交表的生成就水到渠成,只是需要注意一点,如果值超出了向量域里面的数值就需要对水平数求余数,然后再赋值给正交表数组,最后将正交表数组输出。 程序设计体会最深的是,设计生成正交表的程序必须对正交表的特点要了解透彻,均衡搭配、综合可比以及独立向量的特点等.还有就是要对正交表生成途径有一个清晰的认识,弄清楚程序的算法,程序要实现什么样的功能,只有对这些都清楚你才能实现正交表。其次正交表代码编写过程中要敢于尝试,要有信心,遇到困难要想法设法解决,程序调试过程总会遇到这样或那样的问题,这时需要的是静下心来去分析代码,从代码本身及c语言的语法、语句、格式等方面去查找问题并解决。再者,写程序代码过程中要细心再细心,多一个标点符号少一个标点符号,程序就调试就会有错误。花了将近一个星期的时间来做这个工作,从开始各种尝试到确定主函数,然后一个表格一个表格的编写子程序段的代码,坚持做了下来,感觉很值,对正交表的理解更加深刻,也对c语言的语法,控制语句,循环语句更加熟练,计算机二级考的很浅,要想熟练运用c语言编程,要学的还有很多。
本文档为【正交表程序说明书】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:doc
大小:32KB
软件:Word
页数:15
分类:互联网
上传时间:2017-09-18
浏览量:20