| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1249 人关注过本帖
标题:调用函数的困惑?请帮忙看一下。
只看楼主 加入收藏
caojulians
Rank: 2
等 级:论坛游民
帖 子:39
专家分:67
注 册:2009-11-15
收藏
得分:0 
作为一个老程序员,我说一些教材上没有重视的东西(对于各位的代码是否正确没有必要说,上机调试一下就知道了):
1.2楼的问题在于一个函数的内容没有做到内聚性强,在prime()函数中聚焦了三个功能,判素数、计数和求累加和。编码规范要求一个函数就完成一个功能。另外没有考虑完整性,当被判断整数为0、为1、甚至为负数时会怎样。
2.4楼的问题在于小细节:a。IfPrime()函数的命名应该为isPrime(),这样就和返回类型bool概念一致了。b.考虑了形参为1的情况,但是为0呢?c.判素数的循环有冗余,循环终值为sqrt(iNum)+1即可。d.prime()函数中true==IfPrime(...)的判断属于一种多余,因为IfPrime()的返回值就是一个bool值(请看看林锐博士的高质量程序设计一书)。e.函数功能的单一性(内聚性),输出值的内容不应该在prime()函数中完成。
3.5楼的代码中有一个程序员大忌,“一定不要返回局部变量的指针!”,p[2]是函数的局部变量,返回p即数组首址,函数结束时,局部变量的存储空间是要被收回的(生命周期已结束),在上一层函数中用指针访问被收回的空间数据是一种不可宽恕的问题,尽管你是在返回上一层函数后立即访问,这个空间还没有再次使用。作为一种编码规范,一定不要养成这个习惯。
4.7楼是LZ吧,有进步了,但prime()函数中的flag变量的命名不规范(教材上就是这样写的,是吧),这个flag是标志的统称,在表示一个算法时可以表明一种方法,但在具体的代码中应该写一个意义更明确的名字如isprime(本身带有一种假定--需要证实),isprime=1;表示确定;isprime=0;表示否定。或者将这个if语句与return语句合并:return (j>sqrt(i))?1:0.不过这里有另一个话题,这个结构不太好,因为否定的结论在for循环中就已经得到了,在循环结束后用j>sqrt(i)的间接证实属于不当行为(是不是教材上就是这样写的呀?)
以上的说法是我作为一个软件公司的考官时,对考生的忠告:不要以教材上的代码作为自己的学习范例--应该看看编码规范了(网上能找到)如林锐的C/C++高质量程序设计,华为编程规范、中兴软件编程规范等。
2009-11-15 22:42
caojulians
Rank: 2
等 级:论坛游民
帖 子:39
专家分:67
注 册:2009-11-15
收藏
得分:0 
刚刚没有注意:7楼的代码有个问题:prime()函数中循环中if判断为真就break了,后面就return flag;此时flag没有赋值或者是上一次中的(flag=1)--结论错了。
2009-11-15 22:57
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
以下是引用caojulians在2009-11-15 22:42:53的发言:

作为一个老程序员,我说一些教材上没有重视的东西(对于各位的代码是否正确没有必要说,上机调试一下就知道了):
1.2楼的问题在于一个函数的内容没有做到内聚性强,在prime()函数中聚焦了三个功能,判素数、计数和 ...
非常感谢前辈的教诲,说的很好,意识上又上了个台阶,我是2S的,其实我平时也是挺注意你说我的那几点的,例如说一个函数一个功能,因为我也学了一个学期多了,期末做课程设计的时候感触很深,本来是写了将近4000多行的,(很烂的),调试的时候很辛苦,后来听了一位前辈的话,对函数进行统一的******(专业的不会讲),缩成了2000多行·(因为前面写的很多内容上的重复)··而且找错的时候很方便
··但因为我贴的代码是帮LZ改错的,所以只是把LZ代码上的错误改过来而已。。。
  不过前辈讲的变量命名上我未被不是很重视,例如标志变量我也一般都是flag 、flag1、ect。。。看来得好好重视下了···
最后···再次谢谢前辈····
2009-11-15 23:20
caojulians
Rank: 2
等 级:论坛游民
帖 子:39
专家分:67
注 册:2009-11-15
收藏
得分:0 
到了人生的米字路口,迷茫中····

QQ: 421244344  欢迎交流···
=========================================
向你推荐一本书:电子工业出版社的《代码大全2》,不过书很厚(900多页),要有毅力啊!
或者直接啃原版的([美]Steve McConnell--Code Complete)网上搜一搜。
我的建议是:泛泛的去找题目、写代码,不如精选一些题目、反复锤炼、有针对性对自己的弱点进行突破。。。
2009-11-17 07:59
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
  ,已下载看了下,153M的pdf, 超级好书,准备入手,非常感谢前辈的指引,向前辈致敬!!!
2009-11-17 13:01
caojulians
Rank: 2
等 级:论坛游民
帖 子:39
专家分:67
注 册:2009-11-15
收藏
得分:0 
回复 15楼 lijm1989
一个篱笆三个桩!
    C语言程序设计(在学习数据结构和算法分析之前)还要加强三个方面:
    1.语言的性质认识--推荐《C与指针》一书
    2.编程规范--推荐《代码大全》一书
    3.算法初步--推荐《程序设计导引及在线实践》一书(入门刚好)、《C语言名题精选百则》一书(难些)。

另外就是调试能力的锻炼:编程环境的语法提示、单(多)步调试、断点和观测点设置、profile剖析等。
2009-11-24 12:25
lll1894
Rank: 2
等 级:论坛游民
帖 子:5
专家分:26
注 册:2008-7-20
收藏
得分:0 
感觉5楼是不是有个小错误啊,p[2]={count,sum}这样赋值不可以吧,是不是该改成p[0]=count;p[1]=sum;????

[ 本帖最后由 lll1894 于 2009-11-24 16:48 编辑 ]
2009-11-24 16:43
快速回复:调用函数的困惑?请帮忙看一下。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034942 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved