您好,欢迎访问三七文档
第3章工程数据的处理从总体上说,处理工程数据的方法有以下三种:1.程序化处理:在编程时将数据以一定的形式直接放于程序中。特点:程序与数据结合在一起。缺点:数据无法共享,增大程序的长度。2.文件化处理:将数据放于扩展名为.DAT的数据文件中,需要数据时,由程序来打开文件并读取数据。特点:数据与程序作了初步的分离,实现了有条件的数据共享。缺点:(1)文件只能表示事物而不能表示事物之间的联系。(2)文件较长。(3)数据与应用程序之间仍有依赖关系。(4)安全性和保密性差。3.数据库管理:将工程数据存放到数据库中,可以克服文件化处理的不足。特点:(1)数据共享。(2)数据集中。(3)数据结构化,既表示了事物,又表示了事物之间的联系。(4)数据与应用程序无关。(5)安全性和保密性好。由于CAD作业的性质以及数据处理的规模大小的不同,因而必须根据实际情况选用上述三种数据处理方式的其中一种。方式的选择原则是:有利于提高CAD作业的效率,降低开发的成本。§3.1数表的程序化处理3.1.1一维数表的处理定义:只由一个已知变量查取所需数据的表格,称为一维数表。例:表3-1为由小链轮齿数Z查取齿数系数K的一维数表,试对其进行程序化处理。表3-1Z9111315171921K0.4460.5550.6670.7750.8931.001.12Z23252729313335K1.231.351.461.581.701.811.94用TurboC语言编程如下(yyyy1.c):main(){inti,Z1,ip=20;intZ[14]={9,11,13,15,17,19,21,23,25,27,29,31,33,35};floatK[14]={0.446,0.555,0.667,0.775,0.893,1.00,1.12,1.23,1.35,1.46,1.58,1.70,1.81,1.94};printf(“请输入链轮齿数Z1:”);scanf(“%d”,&Z1);for(i=0;i14;i++)if(Z[i]==Z1){ip=i;i=15;}if(ip20)printf(“\n当Z=%d时,K=%f”,Z[ip],K[ip]);elseprintf(“\n输入错误!”);}3.1.2二维数表的处理定义:需由二个已知条件才能确定一个未知数据的表格,称为二维数表。例:表3-2用于链轮设计中,由节距t和链轮齿数z查取链轮轴孔最大直经dkmax和齿侧凸缘最大直经dh,试对其进行程序化处理。表3-2节距t9.52512.7015.87519.0525.40齿数zdhdkdhdkdhdkdhdkdhdk1122113018372245276038132815382248305736775115352046285837704693611741245434684582531107419472963417951946212684215333714789591077214295235937795199651198015910925654287571097313188175120取变量:齿数z——Z[i]i=1,2,3,……8节距t——T[i]i=1,2,3,……10dh——DH[i,j]i=1,2,3,…,8j=1,2,3,…,10dk——DK[i,j]i=1,2,3,…,8j=1,2,3,…,10节距t31.7538.1044.4550.863.50齿数zdhdkdhdkdhdkdhdkdhdk117650916010671121801521031396641167913591155105193132151178014095164111187129235163171379316511219313222015227519319158108189129221153253177316224211781222141482501752852003572542319913723816527819731822439827825219152263184307217335249438310用TurboC语言编程如下(yyyy2.c):main(){inti,j,Z1,ip=20,jp=20;floatT1;intZ[8]={11,13,15,17,19,21,23,25};floatT[10]={9.525,12.7,15.875,19.05,25.4,31.75,38.1,44.45,50.8,63.5};intDH[8][10]={22,30,37,45,60,76,91,106,121,152,28,38,48,57,77,96,116,135,155,193,35,46,58,70,93,117,140,164,187,235,41,54,68,82,110,137,165,193,220,275,47,63,79,94,126,158,189,221,253,316,53,71,89,107,142,178,214,250,285,357,59,79,99,119,159,199,238,278,318,398,65,87,109,131,175,219,263,307,315,438,};intDK[8][10]={11,18,22,27,38,50,60,71,80,103,15,22,30,36,51,64,79,91,105,132,20,28,37,46,61,80,95,111,129,163,24,34,45,53,74,93,112,132,152,193,29,41,51,62,84,108,129,153,177,224,33,47,59,72,95,122,148,175,200,254,37,51,65,80,109,137,165,196,224,278,42,57,73,88,120,152,184,217,249,310};printf(“请输入链轮齿数Z1:”);scanf(“%d”,&Z1);for(i=0;i8;i++)if(Z[i]==Z1){ip=i;i=9;}printf(“请输入节距T1:”);scanf(“%f”,&T1);for(j=0;j10;j++)if(T[j]==T1){jp=j;j=11;}if(ip20&&jp20)printf(“\n当z=%d,t=%f时,dh=%d,dkmax=%d”,Z[ip],T[jp]),DH[ip][jp],DH[ip][jp]);elseprintf(“\n输入错误!”);}§3.2数表的文件化处理1.用编辑软件产生顺序文件2.用程序生成顺序文件main(){inti;inta[10]={1,2,3,4,5,60,70,80,90,100};FILE*fp;fp=fopen(“AA.DAT”,“w”);for(i=0;i5;i++)fprintf(fp,“%d”;a[i]);fprintf(fp,“\n”);for(i=5;i10;i++)fprintf(fp,“%d”;a[i]);fclose(fp);3.文件的读取和检索以表3-1由小链轮齿数Z查齿数系数K的文件化处理为例:建立数据文件ZK.DAT如下:911131517192123252729313335380.4460.5550.6670.7750.8931.01.121.231.351.461.581.701.811.942.12用TurboC语言编程如下(yyyy3.c):main(){inti,z1,z[15],jp=20;floatk[15];FILE*fp;fp=fopen(“ZK.DAT”,“r”);for(i=0;i15;i++)fscanf(fp,“%d”,&z[i]);for(i=0;i15;i++)fscanf(fp,“%f”,&k[i]);fclose(fp);printf(“请输入链轮齿数z1:”);scanf(“%d”,&z1);for(i=0;i15;i++)if(z[i]==z1){ip=i;i=16;}if(ip20)printf(“\n当z=%d时,k=%f”,z[ip],k[ip]);elseprintf(“\n输入错误!”);}§3.3一维数表的插值处理由于一维数表只给出了结点X1,X2,…,Xn对应的函数值Y1,Y2,…,Yn,而对于非结点上的函数值,如对表3-1,欲取非结点Z1=18或Z1=24时的K值,则必须用插值法解决。1.线性插值法:已知:两点(X1,Y1),(X2,Y2)求:位于X1,X2之间的X坐标对应的Y可用如下的线性插值公式:Y=Y1+(Y2-Y1)(X-X1)/(X2-X1)仍以小链轮齿数Z查齿数系数K为例,具有线性插值功能的文件化处理程序如下(yyyy4.c):main(){inti,z1,z[15],x1,x2,ip=20,key1=0;floaty1,y2,kz,k[15];FILE*fp;fp=fopen(zk.dat,r);for(i=0;i15;i++)fscanf(fp,%d,&z[i]);for(i=0;i15;i++)fscanf(fp,%f,&k[i]);fclose(fp);printf(Inputz1:);scanf(%d,&z1);for(i=0;i15;i++){if(z[i]==z1){kz=k[i];key1=1;i=16;}}if(key1==0){for(i=0;i15;i++){if(z[i]z1){x1=z[i-1];y1=k[i-1];x2=z[i];y2=k[i];kz=y1+(y2-y1)*(z1-x1)/(x2-x1);}}}printf(\nz=%d,k=%f,z1,kz);}2.拉格朗日二次插值(抛物线插值):已知:三点(X1,Y1),(X2,Y2),(X3,Y3)求:位于X1,X2之间或X2,X3之间的X坐标对应的Y可用如下的抛物线插值公式:Y=[(X-X2)(X-X3)]/[(X1-X2)(X1-X3)]*Y1+[(X-X1)(X-X3)]/[(X2-X1)(X2-X3)]*Y2+[(X-X1)(X-X2)]/[(X3-X1)(X3-X2)]*Y3抛物线插值的C语言函数如下:floatlarg(x1,y1,x2,y2,x3,y3,x0)intx1,x2,x3,x0;floaty1,y2,y3;{inti,j,x[3];floatp,y0,y[3];x[0]=x1;y[0]=y1;x[1]=x2;y[1]=y2;x[2]=x3;y[2]=y3;y0=0.0;for(i=0;i3;i++){p=1.0;for(j=0;j3;j++){if(i!=j)p=p*(x0-x[j])/(x[i]-x[j]);}y0=y0+p*y[i];}return(y0);}§3.4线图的处理线图的处理方法有两种,一种是将其转换成表格,对非表格节点采用插值法求得;另一种方法是将其写成公式表示。3.4.1线图的表格化处理如果能把线图转换成表格,那么就可以使用数表的处理方法对其进行处理。现有图3.1所示线图,下
本文标题:工程数据的处理
链接地址:https://www.777doc.com/doc-2483310 .html