技术开发 频道

让我们暂时远离业界,回到校园…

[IT168 技术文档]最近受朋友之托,帮别人调一个程序,据说是毕业论文。这个论文是本科还是硕士的,我也不清楚,反正是一个对指纹进行增强的题目。离开学校那么多年了,很多理论知识快忘干净了,比如什么偏导数、内积、卷积……第一眼看这个论文的时候,脑子里面蹦出来的是“好复杂啊”,对科学产生了一种肃然起敬的心情!

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