算法第一章作业
腾讯公司C++内部编码规范
3总体原则
所有使用C和C++作为开发语言的软件产品都须遵照本规范的内容进行编码。
4程序的版式
4.1规则:程序块要采用缩进风格编写,缩进的空格数为4个。说明:
由开发工具自动生成的代码可能不一致,但如果开发工具可以配置,则应该统一配置缩进为4个空格
4.2规则:缩进或者对齐只能使用空格键,不可使用TAB键。
使用TAB键需要设置
4.3规则:相对独立的程序块之间、变量说明之后必须加空行。说明:
以下情况应该是用空行分开:
1)函数之间应该用空行分开;
2)变量声明应尽可能靠近第一次使用处,避免一次性声明一组没有马上使用的变量;
3)用空行将代码按照逻辑片断划分;
4)每个类声明之后应该加入空格同其他代码分开。
4.3规则:相对独立的程序块之间、变量说明之后必须加空行。说明:
以下情况应该是用空行分开:
1)函数之间应该用空行分开;
2)变量声明应尽可能靠近第一次使用处,避免一次性声明一组没有马上使用的变量;
3)用空行将代码按照逻辑片断划分;
4)每个类声明之后应该加入空格同其他代码分开示例:
4.4规则:较长的语句(>80字符)要分成多行书写。说明:
以下情况应分多行书写:
1)长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
2)若函数或过程中的参数较长,则要进行适当的划分。
3)循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首
4.5规则:不允许把多个短语句写在一行中
一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
4.6规则:if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。
示例:
4.7规则:代码行之内应该留有适当的空格说明:
采用这种松散方式编写代码的目的是使代码更加清晰。代码行内应该适当的使用空
格,具体如下:
1)关键字之后要留空格。象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字 象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
2)函数名之后不要留空格,紧跟左括号’(’,以与关键字区别。3)‘(’向后紧跟,‘ )’、‘,’、‘;’向前紧跟,紧跟处不留空格
4)‘,’之后要留空格,
如Function(x,y,z)。如果‘;’不是一行的结束符号,后也要留空格,
5)值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<、“^”等二元操作符的前后应当加空格。
6)一元操作符如“!”、“~”、“++”、“–”、“&”(地址运算符)等前后不加空格。
7)象“[]”、“.”、“->” 这类操作符前后不加空格。
4.8建议:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
5注释
5.1规则:源文件头部应进行注释,列出:生成日期、作者、模块目的/功能等
5.2规则:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值等。示例:
下面这段函数的注释比较标准,可以不局限于此格式,但上述信息要包含在内。
5.3规则:注释应该和代码同时更新,不再有用的注释要删除。5.4规则:注释的内容要清楚、明了,不能有二义性。说明:错误的注释不但无益反而有害。
5.5建议:避免在注释中使用非常用的缩写或者术语。
5.6建议:注释的主要目的应该是解释为什么这么做,而不是正在做什么。如果从上下文不容易看出作者的目的,说明程序的可读性本身存在比较大的问题,应考虑对其重构。5.7建议:避免非必要的注释。
5.8规则:注释的版式
说明:注释也需要与代码一样整齐排版
1)注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2)注释与所描述内容进行同样的缩排。
3)将注释与其上面的代码用空行隔开。
4)变量、常量、宏的注释应放在其上方相邻位置或右方。示例:如下例子不符合规范。
5.9规则:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。
5.10规则:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释可放在此域的右方。
5.11建议:对重要变量的定义需编写注释,特别是全局变量,更应有较详细的注释,包括对其功能、取值范围、以及存取时注意事项等的说明。
5.12建议:分支语句(条件分支、循环语句等)需编写注释。说明:
这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
5.13规则:注释不宜过多,也不能太少,源程序中有效注释量控制在20%~30%之间。 说明:
注释是对代码的“提示”,而不是文档,不可喧宾夺主,注释太多会让人眼花缭乱。
6标识符命名
6.1规则:命名尽量使用英文单词,力求简单清楚,避免使用引起误解的词汇和模糊的缩写,使人产生误解。
5.12建议:分支语句(条件分支、循环语句等)需编写注释。说明:
这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
5.13规则:注释不宜过多,也不能太少,源程序中有效注释量控制在20%~30%之间。
说明:注释是对代码的“提示”,而不是文档,不可喧宾夺主,注释太多会让人眼花缭乱
6标识符命名
6.1规则:命名尽量使用英文单词,力求简单清楚,避免使用引起误解的词汇和模糊的缩写,使人产生误解。
6.2规则:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。说明
1)如在UNIX系统,可采用全小写加下划线的风格或大小写混排的方式,但不能使用大小写与下划线混排的方式。
2)用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。
6.3建议:变量的命名可参考“匈牙利”标记法(Hungarian
Notation)
6.4规则:常量、宏和模板名采用全大写的方式,每个单词间用下划线分隔。
6.5建议:枚举类型enum
常量应以大写字母开头或全部大写。
6.6建议:命名中若使用了特殊约定或缩写,则要有注释说明。
6.7规则:自己特有的命名风格,要自始至终保持一致,不可来回变化。
6.8规则:对于变量命名,禁止取单个字符(如i、j、k…),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。
2)避免使用看上去相似的名称,如“l”、“1”和“I”看上去非常相似。
6.9建议:函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么操作以及返回什么内容。说明:
函数在表达式中使用,通常用于if子句,因此它们的意图应一目了然 示例:
不好的命名:if(CheckSize(x))
没有帮助作用,因为它没有告诉我们 CheckSize是在出错时返回true
还是在不出错时返回true
好的命名:if(ValidSize(x))
则使函数的意图很明确
6.10建议:类、结构、联合、枚举的命名须分别以C、S、U、E开头,其他部分遵从一般变量命名规范。
7可读性
7.1规则:用括号明确表达式的操作顺序,避免使用默认优先级。
7.2建议:不要编写太复杂 、多用途的复合表达式。
7.3规则:涉及物理状态或者含有物理意义的常量,避免直接使用数字,必须用有意义的枚举或常量来代替。
7.4规则:禁止使用难以理解,容易产生歧义的语句。
8变量、结构
8.1建议:尽量少使用全局变量,尽量去掉没必要的公共变量。说明:
公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。
8.2规则:变量,特别是指针变量,被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
说明:在C/C++中引用未经赋值的指针,经常会引起系统崩溃。
8.3建议:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。说明:
合理排列结构中元素顺序,可节省空间并增加可理解性。
8.4建议:留心具体语言及编译器处理不同数据类型的原则及有关细节。
8.5建议:尽量减少没有必要的数据类型默认转换与强制转换。
8.6规则:当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题。
9函数、过程
9.1规则:调用函数要检查所有可能的返回情况,不应该的返回情况要用ASSERT来确认。
9.2建议:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量)。说明:
编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。
9.3建议:调用公共接口函数时,调用者有保障调用参数符合要求的义务。作为一种防御性的编程风格,被调用函数也应该对传入参数做必要的安全检查。
9.4建议:函数的规模尽量限制在100行以内。
说明:不包括注释和空格行。
9.5建议:一个函数仅完成一件功能。说明:
多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。
9.6建议:不能用ASSERT代替必要的安全处理代码,确保发布版的程序也能够合理地处理异常情况。
函数的每种出错返回值的意义要清晰、明了、准确,防止使用者误用、理解错误或忽视错误返回码。
10 C++专用规范
10.1规则:在高警告级别下干净地编译。
使用编译器的最高警告级别。要求干净的(没有警告的)构建(build)并理解所有的警告。通过修改代码来消除警告,而不是通过降低警告级别来消除。对于明确理解其含义,确信不会造成任何问题的警告,则可以局部关闭。
10.2规则:确保资源为对象所占有,使用显式的RAII和智能指针。
C++在语言层面强制的构造/析构恰好与资源获取/释放这对函数相对应,在处理需要调用成对的获取/释放函数的资源时,应将该资源封装在对象中,并在对象的析构函数中释放该资源,这样就保证了获取/释放的匹配。
最好用智能指针来保存动态分配的资源,而不要用原始指针。
10.3规则:主动使用const,避免使用宏。
个人编码模板
1 .1排版
1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
1-2:相对独立的程序块之间、变量说明之后必须加空行。
1-3:较长的语句(>80字符)要分成多行书写
1-4::不允许把多个短语句写在一行中,即一行只写一条语句。
1-5:if、for、do、while等语句的执行语句部分无论多少行都要加括号{}。
1-6:对齐只使用空格键,不使用TAB键。
1-7:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。
1-8:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列
1-9:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
1-10:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之 前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符
(如->),后不应加空格。 采用这种松散方式编写代码的目的是使代码更加清晰。
(1) 逗号、分号只在后面加空格。
int a, b, c;
(2)比较操作符, 赋值操作符”=”、”+=”,算术操作符”+”、”%”,逻辑操
作符”&&”、”&”,位域操作符”<<”、”^”等双目操作符的前后加空格。
a = b + c;
(3)”!”、”~”、”++”、”–”、”&”(地址运算符)等单目操作符前后不加
空格。
p = ‘a’; // 内容操作”“与内容之间
flag = !isEmpty; // 非操作”!”与内容之间
p = &mem; // 地址操作”&” 与内容之间
i++; // “++”,”–”与内容之间
(4)”->”、”.”前后不加空格。
p->id = pid; // “->”指针前后不加空格
(5) if、for、while、switch 等与后面的括号间应加空格,使if等关
键字更为突出、明显。
if (a >= b && c > d)
(6)可以用括号来明确运算顺序。
(7).符合赋值运算符汝+=不能用空格空开。
1.2 注释
2-1:一般情况下,源程序有效注释量必须在20%以上。
2-2:文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、修改日志等。
2-3:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
2-4:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
2-5:注释的内容要清楚、明了,含义准确,防止注释二义性。
2-6:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2-7:变量、常量、宏的注释应放在其上方相邻位置或右方。
2-8:对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
2-9:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
2-10:注释与所描述内容进行同样的缩排。
2-11:避免在一行代码或表达式的中间插入注释。
2-12:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。
2-13:注释格式尽量统一,注释格式用//
2-14:将注释与其上面的代码用空行隔开
2-15:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说, 良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
2-16:对于 switch 语句下的case 语句,如果因为特殊情况需要处理完一个 case 后进入下一个 case 处理,必须在该case 语句处理完、下一个 case 语句前加上明确的注释。 有效防止无故遗漏 break 语句。
1.3 命名
3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
3-2:命名中若使用特殊约定或缩写,则要有注释说明。
3-3:对于变量命名,禁止取单个字符(如i、j、k…),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k 作局部循环变量是允许的。
3-4:不用数字或较奇怪的字符来定义标识符。
3-5:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
3-6:自己特有的命名风格,要自始至终保持一致,不可来回变化。
3-7.命名要用英文,可以出现英文、下划线、数字。
3-8.文件命名要用小写字母,名字反映出文件的内容,缩写单词要小写,文件名要用名词不要用动词。
3-9变量命名一律小写,缩写词汇要大写,要使用名词,可以使用“”表示从属关系。局部循环控制变量用 i,j,n,k,指针变量用p开头,加上名词。
3-10.数组命名首字母要大写,其它同变量。
3-11.函数命名单词首字母大写,形式可以是“函数名_描述函数功能的动词”,尽量写出主谓格式。
3-12.使用typedef定义新类型,一个单词首字母大写。
3-13.宏命名全部大写
1.4 函数、过程
4-1:对所调用函数的错误返回码要仔细、全面地处理。
4-2:明确函数功能,精确(而不是近似)地实现函数设计。
4-3:函数的规模尽量限制在200行以内。
说明:不包括注释和空格行。
4-4:一个函数仅完成一件功能,不要设计多用途面面俱到的函数。
说明:多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。
4-5:函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。
4-6:检查函数所有参数输入的有效性。
4-8:检查函数所有非参数输入的有效性,如数据文件、公共变量等。
4-9:函数名应准确描述函数的功能。
4-10:函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
4-11:让函数在调用点显得易懂、容易理解。
4-12:在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换。
4-13:减少函数本身或函数间的递归调用。
4-14:改进模块中函数的结构,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数结构时,要遵守以下原则:
(1)不能影响模块功能的实现。
(2)仔细考查模块或函数出错处理及模块的性能要求并进行完善。
(3)通过分解或合并函数来改进软件结构。
(4)考查函数的规模,过大的要进行分解。
(5)降低函数间接口的复杂度。
(6)不同层次的函数调用要有较合理的扇入、扇出。
(7)函数功能应可预测。
4-15:避免使用BOOL参数。
4-16:对于提供了返回值的函数,在引用时最好使用其返回值。
1.5 宏
5-1:用宏定义表达式时,要使用完备的括号。
5-2:将宏所定义的多条表达式放在大括号中。
数学之美第18章读后感
自从有了搜索引擎,就有了针对搜索引擎网页排名的作弊(SPAM)。以至于用户发现在搜索引擎中排名靠前的网页不一定就是高质量的,用句俗话说,闪光的不一定是金子。搜索引擎的作弊,虽然方法很多,目的只有一个,就是采用不正当手段提高自己网页的排名。
网页作弊就是根据搜索引擎的算法,得到更高的网站排名。作弊方式一:可以提高网站相关词频数,然后隐蔽,这样就能得到较高的TF-IDF值。解决方法:对异常高的网页做一下分析就可以得出“是否作弊”的结论。作弊方法二:出卖网站的链接,根据前面章节知道网站被越多其他网站引用就会得到越高的排名。解决方法:出链的网站到其他网站数目可以作为一个向量,也是这个网站固有的特征,既然是向量,就可以用余弦定理计算相似度,有些网站出链量相似度几乎为1,此时就是可以知道这些是卖链接的网站。总结:提高网站质量才是关键。