劣质代码评析——刻舟求剑的故事

【题目】

  将一个5*5的矩阵中最大的元素中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,网站空间,从上到下依次从小到大存放),写一函数实现之,用main函数调用。

    ——谭浩强 ,《C程序设计(第四版)学习辅导》,香港服务器,清华大学出版社,美国空间,2010年7月,p108【评析】  这其实是一个相当复杂的问题,题目作者自己大概根本没意识到,更没有真正想清楚这个问题的解决,拍拍脑袋就出题了。  题目中明显的问题是语义不清,比如什么是“最大”?什么是“最小”?什么是倒数第二小?这些含义都不明确。所以如果不进一步对问题进行补充说明,题目的解并不能保证唯一。客气点说题目不严格,如果事实求是说,题目本身就是错误的。  例如,1、1、2、2、3、3这6个数中,究竟1是这组整数中第二小的数,还是2是第二小的整数?这个问题的答案很可能有歧义,更有歧义的是究竟哪个位置上的数是第2小的数?  “写一函数实现之”完全是一个过分的要求,也是一个外行的要求,就跟要求别人用脚指头敲键盘一样。【原代码】

View Code

0. #include <stdio.h>1. int main()2. {void change(int *p);3. int a[5][5],*p,i,j;);5. for(i=0;i<5;i++)6. for(j=0;j<5;j++),&a[i][j]);8. p=&a[0][0];9. change(p););11. for(i=0;i<5;i++)12. {for(j=0;j<5;j++),a[i][j]););15. }16. return 0;17. }18. void change(int *p)19. {int i,j,temp;20. int *pmax,*pmin;21. pmax=p;22. pmin=p;23. for(i=0;i<5;i++)24.for(j=i;j<5;j++)25.{if(*pmax<*(p+5*i+j))pmax=p+5*i+j;26.if(*pmin>*(p+5*i+j))pmin=p+5*i+j;27.}28. temp=*(p+12);29. *(p+12)=*pmax;30. *pmax=temp;31. temp=*p;32. *p=*pmin;33. *pmin=temp;34. pmin=p+1;35. for(i=0;i<5;i++)36.for(j=0;j<5;j++)37.if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;38. temp=*pmin;39. *pmin=*(p+4);40. *(p+4)=temp;41. pmin=p+1;42. for(i=0;i<5;i++)43.for(j=0;j<5;j++)44.if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))45.pmin=p+5*i+j;46. temp=*pmin;47. *pmin=*(p+20);48. *(p+20)=temp;49. pmin=p+1;50. for(i=0;i<5;i++)51.for(j=0;j<5;j++)52.if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&53.(*pmin>*(p+5*i+j))) pmin=p+5*i+j;54. temp=*pmin;55. *pmin=*(p+24);56. *(p+24)=temp;57. }如果心在远方,只需勇敢前行,梦想自会引路,

劣质代码评析——刻舟求剑的故事

相关文章:

你感兴趣的文章:

标签云: