20162302 - 20162319 结对编程项目-四则运算(第二周)
结对编程项目-四则运算(第二周)
-
需求分析
1、实现真分数算式的生成
2、在运算符中增加括号
3、调用相关类进行真分数字符串,转化格式并计算
4、修改之前的代码,增加兼容性,使其支持分数
5、支持括号的运算
6、支持多语言
-
设计思路
-
一、分数部分
为了支持分数式的生成,首先要保证分数的生成,所以要修改
NumOpeGenerator
类,也就是以前的四则运算类,具体措施就是在里面加上一个生成分数的方法generateFraction()
。
public String generateFraction() {
//一个生成分数的方法
int numerator=1 , denominator=0;
while (denominator == 0 || numerator >= denominator) {
numerator = generateNum();
//生成分子
fraction = fmt.format(numerator);
fraction = fraction.concat("/");
denominator = generateNum();
//生成分母
fraction = fraction.concat(fmt.format(denominator) + " ");
}
return fraction;
}
然后需要生成算式,原来的类不能直接用,所以就建立了新的
FormulaGenerator_F
类,类似于FormulaGenerator
类。
接下来就是转制和计算部分,转制可以直接调用InfixToSuffix
类,但是在计算的时候就需要专门的计算类了,计算直接引用的书上的RationalNumber
类,但是两个类没有接口,不能直接连接,FractionCalculator
类就起到了连接他们的作用。
通过evalSingleOp
方法实现调用
private String evalSingleOp(char operation, String op1, String op2) {
String result = null;
String n,d;
n = getNumer(op1);
d = getDenom(op1);
int n1 = Integer.parseInt(n);
String d2 = String.valueOf(d);
int d1 = Integer.parseInt(d2);
RationalNumber op3 = new RationalNumber(n1, d1);
n = getNumer(op2);
d = getDenom(op2);
n1 = Integer.parseInt(n);
d2 = String.valueOf(d);
d1 = Integer.parseInt(d2);
RationalNumber op4 = new RationalNumber(n1, d1);
switch (operation) {
case ADD:
result = (op3.add(op4)).toString();
break;
case SUBTRACT:
result = (op3.subtract(op4)).toString();
break;
case MULTIPLY:
result = (op3.multiply(op4)).toString();
break;
case DIVIDE:
result = (op3.divide(op4)).toString();
}
这样,分数的问题就解决了
-
二、括号部分
生成括号虽然想起来很容易,但是在实际的操作中就会出现各种各样的问题。比如必须成对出现,左括号前和右括号后必须有运算符等。
首先我将括号作为第五种运算符生成。
public void solveOpe(int a){
//把运算符的代号翻译成运算符并输出
if (a==0)
operator = "+";
else if(a==1)
operator = "-";
else if (a==2)
operator = "*";
else if (a==3)
operator = "/";
else if (a==4)
operator = bracket();
}
为了达到成对出现的目的,设置一个direction变量,单数左括号,双数右括号,在执行的过程中符号会变化。
public String bracket (){
//成对生成括号
direction ++;
if (direction % 2 ==0) {
creativeOpe1();
return ") "+operator1;
}
else {
creativeOpe1();
return operator1+" " +"( ";
}
}
还有一个问题,就是只生成左括号,没有右括号,不能成对出现,所以要对左右括号数量进行统计
public int count (String string, char operate){
//用于统计符号出现次数
int countNumber = 0;
for (int i=0; i<string.length(); i++ ){
if (operate == string.charAt(i))
countNumber++;
}
return countNumber;
}
判断并补全不足的括号
public String check(String toCheck){
//检查左右括号数量是否相等
int a = count(toCheck, '(');
int b = count(toCheck, ')');
while (a != b){
toCheck = toCheck.concat(" )");
a = count(toCheck, '(');
b = count(toCheck, ')');
}
return toCheck;
}
-
三、多语言
多语言的问题就相对简单的多,直接把文字设置成变量,再选用不同的语言的时候直接赋不同的值就可以了
System.out.print("请选择语言:简体中文(1)繁體中文(2)English(3):");
int choice = scan2.nextInt();
if (choice == 1) {
} else if (choice == 2) {
t = "是否使用分式(y/n):";
n = "請輸入算式個數:";
l = "請輸入算式階數:";
an = "答案是:";
rig = "正確率:";
} else if (choice == 3) {
t = "Whether the fraction is used(y/n): ";
n = "Please enter the number of the expression: ";
l = "Please enter the order of the expression: ";
an = "The answer is: ";
rig = "Correct rate: ";
} else if (choice == 4) {
t = "小数を使用するかどうか (y/n) : ";
n = "数式番号を入力してください: ";
l = "計算順序を入力してください: ";
an = "答えは:";
rig = "精度: ";
} else if (choice == 5) {
t = "следует ли использовать дробные (y/n): ";
n = "пожалуйста, введите номер формула: ";
l = "введите, пожалуйста, порядок вычисления: ";
an = "Ответ заключается в: ";
rig = "Точность: ";
} else {
System.out.println("没有那种语言!默认语言为简体中文,祝您愉快");
}
-
UML图
-
运行截图
-
分数部分
- 支持多运算符
-
Junit测试图
测试InfixToSuffix类转制分式成功
测试FractionCalculator类分数后缀式计算成功
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 1000 | 1000 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 40 | 50 |
· Design Spec | · 生成设计文档 | 40 | 40 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 50 | 60 |
· Design | · 具体设计 | 100 | 200 |
· Coding | · 具体编码 | 100 | 200 |
· Code Review | · 代码复审 | 100 | 200 |
· Test | · 测试(自我测试,修改代码,提交修改) | 200 | 200 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 20 |
-
合作伙伴
-
姓名:莫礼钟
-
学号:20162319
-
主要工作:构思结构,提供思路,检查错误。
-
博客链接:点击此处→