算法 代码规范(C++)&《数学之美》读后感

C++代码规范我遵循的是这本《高质量C++/C编程指南》

http://www.scholat.com/course/V_courseResourceDownload.html?courseId=1227&resourceId=12836

1.头文件的结构

为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。

用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。

用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。

头文件中只存放“声明”而不存放“定义”

在C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。

不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。

2.1 空行

空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。 

在每个类声明之后、每个函数定义结束之后都要加空行。

在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

// 空行

void Function1(…)

{

  …

}

// 空行

void Function2(…)

{

  …

}

// 空行

void Function3(…)

{

  …

}

 

// 空行

while (condition)

{

statement1;

// 空行

if (condition)

{

statement2;

}

else

{

statement3;

}

// 空行

statement4;

}  

2.2 代码行

一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。

2.3 代码行内的空格

关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。

函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。

‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。

赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。

一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。

[]”、“.”、“->”这类操作符前后不加空格。

对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))

void Func1(int x, int y, int z);          // 良好的风格

void Func1 (int x,int y,int z);           // 不良的风格

if (year >= 2000)                         // 良好的风格

if(year>=2000)                            // 不良的风格

if ((a>=b) && (c<=d))                     // 良好的风格

if(a>=b&&c<=d)                            // 不良的风格

for (i=0; i<10; i++)                      // 良好的风格

for(i=0;i<10;i++)                         // 不良的风格

for (i = 0; I < 10; i ++)                 // 过多的空格

x = a < b ? a : b;                        // 良好的风格

x=a<b?a:b;                                // 不好的风格

int *x = &y;                              // 良好的风格  

int * x = & y;                            // 不良的风格  

array[5] = 0;                             // 不要写成 array [ 5 ] = 0;

a.Function();                             // 不要写成 a . Function();

b->Function();                            // 不要写成 b -> Function();

 

2.4 对齐

程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

{ }之内的代码块在‘{’右边数格处左对齐。

 

void Function(int x)

{

… // program code

}

 

void Function(int x){

… // program code

}

 

if (condition)

{

… // program code

}

else

{

… // program code

}

if (condition){

… // program code

}

else {

… // program code

}

for (initialization; condition; update)

{

… // program code

}

for (initialization; condition; update){

… // program code

}

While (condition)

{

… // program code

}

while (condition){

… // program code

}

如果出现嵌套的{},则使用缩进对齐,如:

{

   …

 {

   …

 }

  …

}

 

                                           风格良好的对齐                                                                    风格不良的对齐

这边书有详细全面的代码规范讲解,有助于我们养成良好的代码习惯,在这里不再一一举例;

 

《数学之美》读后感

统计语言模型
  “数学是解决信息检索和自然语言处理的最好工具。”从小到大,我们一直学习数学,在感到枯燥或者乏力之时,我们时常会思考,数学的作用。然而用数学工具解决语言问题,这便是一种数学的美;如何让机器理解人类语言这种最复杂最动态的信息是一大难题,但是人们在研究语法规则的方法上几乎毫无突破,后来随着计算机的发展,用数学方法处理自然语言的方法才得以实现。当时一批杰出的科学家利用大型计算机来处理人类语言问题。统计语言模型就是在那个时候提出的。书中举出了一个简单的统计模型来解决一个文字序列是否能构成一个大家能理解的句子的问题:
句子S出现的概率等于每一个词出现的概率相乘,于是 P(S) 可展开为:
                                                P(S) = P(w1)P(w2|w1)P(w3| w1 w2)…P(wn|w1 w2…wn-1)
假定任意一个词wi 的出现概率只同它前面的词 wi-1 有关(即马尔可夫假设),于是问题就变得很简单了。现在,S 出现的概率就变为:
                                                P(S) = P(w1)P(w2|w1)P(w3|w2)…P(wi|wi-1)… 

事实证明,统计语言模型比任何已知的借助某种规则的解决方法都有效。数学的美妙之处在于把复杂的问题变得简单化,解决实际问题来为人们服务。



 

 

posted @ 2019-09-08 11:59  彭山峰  阅读(217)  评论(0编辑  收藏  举报