需求分析
- 由于程序需要在Windows平台和Linux平台都能运行,因此对代码的可移植性有一定的要求
- 由于需要对文件夹进行遍历,因此数据量相对较大,需要选择合适的数据结构,在此项目中,树和哈希表都是可供选择的数据结构
- 由于对字符串的处理很多,因此需要选择一种合适的字符串表达方式,char* or string?
代码规范
核心要求:用代码做到“卒章显志”的作用,代码能说清楚的事情就不要用注释,注释仅提示思路或者注意事项。因此变量名和函数名的设置尤为关键,比如函数名isSamePhrase(),又比如变量名bool isStringStart.
以下根据常用的C/C++编码规范列举了如下要求:
【通用】
- 系统头文件应用:
#include <xxx.h>
- 自定义同文件应用:
#include "xxx.h"
- 函数体类体之间原则上用2个空行,特殊情况下可用一个或者不需要空行。
【注释】
- 调试的代码,加上注释
// only for DEBUG
- 需要引起关注的代码,加上注释
// NOTE ...
- 对于较大的代码块结尾,如
for,while,do
等,可加上// end for|while|do
【命名规范】
- 同一性:在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。
- 标识符组成:标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确,避免用拼音命名。
- 最小化长度 && 最大化信息量原则:在保持一个标识符意思明确的同时,应当尽量缩短其长度。
- 避免过于相似:不要出现仅靠大小写区分的相似的标识符,例如
"i"
与"I"
,"function"
与"Function"
等等。 - 避免在不同级别的作用域中重名:程序中不要出现名字完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但容易使人误解。
- 正确命名具有互斥意义的标识符:用正确的反义词组命名具有互斥意义的标识符,如:
"nMinValue"
和"nMaxValue"
,"GetName()"
和"SetName()"
…. - 避免名字中出现数字编号:尽量避免名字中出现数字编号,如
Value1,Value2
等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
【代码风格】
- 每一行开始处的缩进只能用Tab
- 在代码行的结尾部分不能出现多余的空格
- 除了特别情况,函数体内不能出现两个空行
"if"、"for"、"while"、"do"、"try"、"catch"
等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加"{ }"
。这样可以防止书写和修改代码时出现失误- if语句如果有else语句,用 } else { 编写为一行,不推荐用 3 行代码的方式。
- 多行变量定义,为了追求代码排版美观,可将变量竖向对齐。
- 对于switch语句,若某个case不需要break一定要加注释声明。
设计思路(概述)
- 遍历给定的文件夹,并将文件的绝对路径存在vector中
- 遍历vector,逐文件统计信息
- 为了提高效率,采用边读文件变统计信息的方式
- 由于单词量很大,因此采用平衡二叉树作为数据组织结构
- 由于对单词进行重定义,所以不能直接使用fgets或者fscanf读字符串,而应该逐字符扫描判断是否为单词。
- 由于需要统计词组,因此可以用一个char *存储上次读过的字符串
原文地址:https://www.cnblogs.com/ustctp/p/8672045.html
时间: 2024-11-08 07:30:55