不过看到那个程序之后,心情就变了个彻底。别的不说,先看看一个代码片断:
还好,这还不是我见过最差劲的校园毕业论文程序,至少还有对齐,也不会一堆的代码写在一行里面。但是,光看这对东西也感觉够怪异的,为什么要修改循环变量j和i?看了半天才明白,其实是想把矩阵中的某一块复制到一个临时数组之中。事实上这样的复制完全没有必要,后来我花了几个小时的时间对这个简单的程序做了一次巨大的重构。其间不断的发现极其重复的代码,甚至有些重复的代码还出现了不一致(即其中某些复制过的代码被修改了,而且还改错了)。我们再来看看这样的代码:for(i=0;i<298;i++)
...{
for(j=0;j<298;j++)
...{
n1=n2=0;
for(m2=0;m2<3;m2++) //*****赋值*****
...{
for(m1=0;m1<3;m1++)
...{
u[n1][n2]=tr1[i][j];
n2++;
j++;
}
![]()
n2=n2-3;
j=j-3;
n1++;
i++;
}
n1=n1-3;
i=i-3;
![]()
a=i+1;
b=j+1;
xx[a][b]=timesx(u,i,j);
yy[a][b]=timesy(u,i,j);
}
}
![]()
妈妈米娅!感觉进入了Matrix电影里面去了,满眼的0和1。还好,最后总算顺利的给拆卸并重新组装了。其实根本就没有显示的那么复杂,里面有很多是属于重复计算。并且由于没有引入一些必要的中间变量,才会出现这么复杂的代码。说实话,我是非常佩服写这样代码的人,在写这样代码的时候能够想得清楚的。不过最后我还是在这段代码里面找到了一些错误——与论文中的公式不符。其实写这样的代码,就很难避免一个不小心看走眼的问题。我认为问题不在于写这样代码的同学身上,问题在于高校!if (((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1])<0.0)
...{
...{
w1[0][0]=w1[1][0]=w2[0][0]=w2[1][0]=e1=e2=0.0;
}
else
if(sqrt((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1])==0.0)
...{w1[0][0]=w1[1][0]=w2[0][0]=w2[1][0]=e1=e2=0.0;}
else
...{
w1[0][0]=(2*s[0][1])/sqrt((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1]);
w1[1][0]=(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))/sqrt((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1]);
w2[0][0]=(2*s[0][1])/sqrt((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1]);
w2[1][0]=(s[1][1]-s[0][0]-sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))/sqrt((s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))*(s[1][1]-s[0][0]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))+4*s[0][1]*s[0][1]);
![]()
//***求特征值***
e1=(s[0][0]+s[1][1]+sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))/2.0;
e2=(s[0][0]+s[1][1]-sqrt((s[0][0]-s[1][1])*(s[0][0]-s[1][1])+4*s[0][1]*s[0][1]))/2.0;
}
