算法第一章作业

一、代码规范

参照公司:腾讯

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:将宏所定义的多条表达式放在大括号中。

 

二、《数学之美》节选读后感

   

   在阅读《数学之美》中,偶然间被与数学概率相关的职场应聘的故事所吸引,并有所收获与思考。

 

   作者在假设面试官面试应聘者只能当场给出“yes””“no”的情况下,该如何最终挑选出心怡的那一位应聘者而作出了数学概率上的分析,得出最好的策略是放过37%的应聘者,然后遇到一个比前面都好的人录取,这样取到的最优人选的概率最大。我原的想法是认为这个随机事件的偶然性太大,优秀者出现完全随机而定,这应该并不会能成为一种大概率的策略。而结果让我有震惊同时感到不可思议,而运用这种方法面试官能在基数比较大的情况下真的能找到前三或前四的能力排名的应聘者。

   这结合生活的示例也给我惊讶同时也带来一定思考,社会这个不确定的大事件中运用数学的真的能得到一些意想不到的较为高概率的可能,这虽然不能百分百保证一定的效果或者就能得到我们想要的答案,却能为我们的生活带来很有意义的参考价值,带来指导性的作用。比如知道此百分之37策略,我们去比赛或面试时顺序可以尝试不去成为前面那百分之37,或许真的带来意想不到的效果。同时也是印证了数学在我们真的无处不在,与我们的生活密切相关,只是等待我们去发现,去开发更为优美的算法。

 

posted @ 2021-09-29 10:37  菜习好学  阅读(28)  评论(0编辑  收藏  举报