一、 实验环境
1.1 编程语言和开发工具语言采用ANSI C++(C++11)
开发工具:vim,g++,git,Visual Stdio(用于生成exe文件)
1.2 编码规范
编码规范中所有没有涉及到的内容,参见googlestyle C++
类名
类名采用开头大写的方式命名
变量
局部变量采用小驼峰法命名
类私有和保护的成员变量末尾加下划线
类公用变量命名同局部变量
函数
函数采用大驼峰命名法命名
类的私有成员函数末尾加下划线,如 voidshrink_();
get/set/isXXX等函数采用开头小写get/set/is,其后接开头大写单词的方式命名.如isValid, setName
其他
常量采用字母k + 大驼峰命名法命名。但类中的const变量依旧采用类变量的方式命名
类型名称(typedef)采用下划线命名法命名。单词最后加_t。如name_t
左大括号“{”与前一语句在同一行
二、分析与设计
2.1 需求分析系统储存多项式
多项式相加
多项式相减
多项式与常数 数乘运算
多项式代入某点求值
系统显示储存的多项式
显示帮助
2.2 系统功能图
2.3 类结构设计
2.4 细节设计
以下+表示public,-表示private,#表示protected
以 [+-#] operation(type param) : return-type
或 [+-#] attribute : type等形式给出。self代表类本身(Polynomial)
接口设计:
+typedef vector coefficient_t;
+typedef Polynomial self;
+Polynomial(string); // 构造函数,对输入作parsing。输入应形为”(1, 3)(2, 4)(4, 6)”
+operator rel(const self&) : bool //关系运算符。rel 为 == 与 !=,判断两个多项式是否相等。
+operator op(const self&) : self //运算符。op为+,-,*中的一个
+operator op(const self&) : self& //运算符。op为+=,-=,*=中的一个
+operator op(double) : self //数乘运算符。op为,=中的一个
+operator<
+getDegree() : size_t // 返回该多项式的次数
+setDegree(int) : void // 设置多项式的次数。若设置的次数低于多项式原本的次数,设置被拒绝。
+getCoefficient(): vector // 返回一个数组,储存多项式系数
+derivation() : self // 返回该多项式求导后得到的多项式
+evaluate(double) : double // 返回多项式代入某点值后的值
成员函数:
-shrink_() : void // 简化多项式。即将多项式系数为零且没有必要储存的项舍去。
数据成员:
-coefficient : vector //储存多项式的系数
静态成员:
+isValid(string) : bool // 接受一个代表多项式的字符串,判断其是否合法
+pattern_ : const string // 用于正则表达式的字符串。判断多项式输入是否合法。用于isValid
+regex_ : regex //判断输入是否合法的正则。使用了pattern_
+pattern_iterate_ : string //用于正则表达式的字符串。用于提取括号。
+regex_iterate_ : const regex // 提取括号。使用了pattern_iterate_
+poly_name_pattern_ : const string //用于正则表达式。检测用户提供的多项式的名字是否合法
+regex_poly_name_ : regex // 正则表达式。判断用户提供的多项式的名字是否合法。
2.5 正则匹配匹配一个单词
提取一个括号
判断输入是否合法
三、测试心得
本次项目相比于前几次项目,难度较低。唯一的难点是parsing,即如何将用户的输入正确地转换为多项式。parsing可以用灵活的正则表达式完成。其次的难点是用户交互界面,即如何用尽量简短的代码完成交互界面的需求,写出DRY(don’t repeat yourself)的代码。
相比之下,多项式类的实现反而显得难度较低。可以采用vector储存按索引储存系数,或采用足够大的double[]储存系数。(本项目不考虑指数为负的情况)。
本次项目有些地方可以更加细致。例如根据“面向接口编程”思想,“交互”应该与“数据”和“接口”分离开。Polynomial类应该从一个Interface_Polynomial类继承而来。由前者作为接口,后者作为实现。main函数中所有函数的参数都使用Interface_Polynomial而非Polynomial。
本次项目还可以拓展成允许矩阵运算的计算器。将两者结合在一起。
本次项目让我对C++的使用更加熟练。让我对正则的书写更为了解。加深了我的对面向对象的理解。