算法第一章作业

算法第一章作业

算法规范

格式

1.变量声明应尽可能靠近第一次使用处,避免一次性声明一组没有马上使用的变量;
2.相对独立的程序块之间、变量说明之后必须加空行

1)函数之间应该用空行分开;

2)用空行将代码按照逻辑片断划分;

3)每个类声明之后应该加入空格同其他代码分开。

错误格式:
if (!valid_ni(ni)) 
{
... // program code 
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
正确格式:
  if (!valid_ni(ni)) 
  {
... // program code
  }

repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
3.较长的语句(>80 字符)要分成多行书写

1)长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
	+ STAT_SIZE_PER_FRAM * sizeof( _UL );

act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied 
  = stat_poi[index].occupied;

act_task_table[taskno].duration_true_or_false
	= SYS_get_sccp_statistic_state( stat_item );
4.不允许把多个短语句写在一行中,即一行只写一条语句
5. if、for、 do、while 等语句的执行语句部分无论多少都要加括号{}

命名规范

1.命名尽量使用英文单词,力求简单清楚,避免使用引起误解的词汇和模糊的缩写,使人产生误解。

较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩 写;一些单词有大家公认的缩写。

如下单词的缩写能够被大家基本认可:

temp 可缩写为 tmp;
flag 可缩写为 flg; 
statistic 可缩写为 stat;
increment 可缩写为 inc; 
message 可缩写为 msg;
2.常量、宏和模板名采用全大写的方式, 每个单词间用下划线分隔
枚举类型 enum 常量应以大写字母开头或全部大写
3.对于变量命名,禁止取单个字符(如 i、j、k…),建议除了要有具体􏰂􏰂意义外,还能表明其变量类型、数据类型等,但 i、j、k 作局部循环变量是允许的

变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如 i 写成 j),而编译

时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。

4.函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么 操作以及返回什么内容
不好的命名:if (CheckSize(x))
没有帮助作用,因为它没有告诉我们 CheckSize 是在出错时返回 true 还是在不出错时返回 true。 

好的命名:if (ValidSize(x))
使函数的意图很明确。

可读性

1.用括号明确表达式的操作顺序,避免使用默认优先级
2.不要编写太复杂 、多用途的复合表达式
3.禁止使用难以理解,容易产生歧义的语句。

变量 结构

1.尽量少使用全局变量,尽量去掉没必要的公共变量

公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间

的耦合度。

2.变量,特􏰅􏰅􏰅􏰅是指针变量,被创建之后应当及时把它们初始化,以防止把未被 初始化的变量当成右值使用

在 C/C++中引用未经赋值的指针,经常会引起系统崩溃。

3.仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间, 并减少引起误用现象。

合理排列结构中元素顺序,可节省空间并增加可理解性。

如下结构中的位域排列,将占较大空间,可 读性也稍差。
typedef struct EXAMPLE_STRU
{
	unsigned int valid: 1; 
	PERSON person;
	unsigned int set_flg: 1;
} EXAMPLE;
若改成如下形式,不仅可节省 1 字节空间,可读 性也变好了。
typedef struct EXAMPLE_STRU
{
	unsigned int valid: 1; 
  unsigned int set_flg: 1;
  PERSON person;
} EXAMPLE;
4.留心具体语言及编译器处理不同数据类型的原则及有关细节

函数 过程

1.一个函数仅完成一件功能
2.函数的规模尽量限制在 100 行以内

不包括注释和空格行。

3.检查函数所有参数与非参数的有效性
4.函数实现中不改变内容的参数要定义成 const
int GetStrLen(const char*);
int GetNumberCount(const CString&);
5.函数的返回值要清楚、明了,让使用者不容易忽视错误情况

效率

1.在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率

1)代码效率分为全局效率、局部效率、时间效率及空间效率。全局效率是站在整个系统的角度上的系统效率;局部效率是站在模块或函数角度上的效率;时间效率是程序处理输入任务所需的时间长短;空间效率是程序所需内存空间,如机器代码空间大小、数据空间大小、栈空间大小等。

2)不能一味地为追求代码效率而对软件的正确性、稳定性、可读性及可测性造成影响。

2.通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率

这种方式是解决软件空间效率的根本办法。

如下记录学生学习成绩的结构不合理。 
typedef unsigned char BYTE; 
typedef unsigned short WORD;
typedef struct STUDENT_SCORE_STRU 
{
  BYTE name[8];
  BYTE age;
  BYTE sex;
  BYTE class;
  BYTE subject;
  float score;
     
} STUDENT_SCORE;

因为每位学生都有多科学习成绩,故如上结构将占用较大空间。应作如下改进 (分为两个结构),总的存贮空间将变小,操作也变得更方便。
  
typedef struct STUDENT_STRU 
{
    BYTE name[8];
    BYTE age;
    BYTE sex;
    BYTE class;
} STUDENT;

typedef struct STUDENT_SCORE_STRU 
{
	WORD student_index;
	BYTE subject;
	float score;
} STUDENT_SCORE;
4.循环体内工作量最小化

1)应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小, 从而提高程序的时间效率。

2)在多重循环中,应将最忙的循环放在最内层,这样可以减少 CPU 切入循环层的次数,从而提高效率。

5.对模块中函数的划分及组织方式进行分析、优化,改进模块中函数的组织结构, 提高程序效率
6.避免循环体内􏰂􏰂􏰂􏰂判断语句,应将循环语句置于判断语句的代码块之中。

目的是减少判断次数。

循环体中的判断语句是否可以移到循环体外,要视程序的具 体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。

7.在逻辑清楚且不影响可读性的情况下,代码越少越好

质量保证

1.防止内存操作越界

内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主

要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。

2.要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符, 以防止拼写错误

形式相近的操作符最容易引起误用,如 C/C++中的“=”与“==”、“|”与“||”、“&”与“&&” 等,若拼写错了,编译器不一定能够检查出来。

如把“&”写成“&&”,或反之。
ret_flg = (pmsg->ret_flg & RETURN_MASK);
被写为:
ret_flg = (pmsg->ret_flg && RETURN_MASK);

3.有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待; switch 语句必须有 default 分支
4.时刻注意表达式是否会上溢、下溢
如下程序将造成变量下溢。 
unsigned char size;
while (size-- >= 0) // 将出现下溢
{
... // program code
}
当 size 等于0时,再减1不会小于0,而是0xFF,故程序是一个死循环。应如下修改。 char size; // 从 unsigned char 改为 char
while (size-- >= 0)
{
... // program code 
}

参考资料:https://www.cnblogs.com/juking/p/5469324.html 腾讯c++代码规范

关于「《数学之美》第14章 余弦定理和新闻的分类」

​ 经过一年在信息学院的学习,虽然早已深知数学的重要性(无论是数学课程的学分还是编程中运用数学的频率),但当我看到余弦定理和新闻的分类这个标题时,还是想不到两者之间的必然联系。兴趣趋势阅读,于是我仔细研究了这一章的内容,由衷的感叹隐藏在生活中无数个角落的数学的美。

​ 该章节主要讲解了让计算机来整理、分类和聚合各个新闻网站的内容——新闻的自动分类。具体做法是将新闻中的实词部分根据他们的TE-IDF值(单文本词汇频率)转化为数字后,将所有词组成一个N维的向量,该向量称为新闻的特征向量。每一篇新闻都可以对应这样一个特征向量,向量中每一个维度的大小代表每个词对这篇新闻主题的贡献。不同的新闻因为文本长度不同,它们特征向量各个维度的数值也不同。所以单纯的比较唯独大小没有太大意义,但如果两篇新闻特征向量的方向一致,说明相应的新闻用词的比例基本一致。因而要计算两个向量的夹角,就要用到余弦定理了。在得知了「余弦定理」和「新闻」的关系后,又怎样把「分类」与之联系起来呢?该章节介绍了一种自底向上不断合并的办法,大致思想时先计算所有新闻之间两两的余弦相似性,把相似性大于一个阈值的新闻合成一个小类,再把每个小类中的所有新闻作为一个整体,计算小类的特征向量,再计算小类之间两两的余弦相似性,然后合并成一个大一点的小类,这样不断下去类别就会越来越少而每个类就会越来越大。当某一类太大时,这一类里一些新闻之间的相似性就很小了,这时停止迭代,自动分类就完成了。「余弦定理」就这样通过新闻的特征向量和「新闻分类」联系在一起了。

​ 这些内容让我充分体会到了数学的重要性以及其与各领域联系之紧密。我感触最深的是该章节的延伸阅读「计算向量余弦的技巧」中,对该新闻分类算法的简化部分。在利用余弦公式计算N篇新闻之间两两的相关性时,计算复杂度为O(N^2*|a|),计算量非常大。但这里可以简化的地方很多,如分母部分是不需要重复计算的,只计算分子部分上面的计算量可以节省2/3。其次在计算分子时,只需要考虑向量中的非0元素即可,计算的复杂度往往就取决于两个向量中非0元素的个数的最小值。这样计算的复杂度大约可以下降100倍。最后,可以考虑删去所有的虚词,因为虚词对新闻的特征向量的计算没有贡献。这样又可以将复杂度缩短几倍。上述内容同样教会了身为计算机专业的我在敲代码时需要时刻注意降低复杂度,优化算法和代码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值