您的位置:首页 > 编程语言

20162302 - 20162319 结对编程项目-四则运算(第二周)

2017-05-21 23:24 417 查看

结对编程项目-四则运算(第二周)

需求分析


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.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
· Estimate· 估计这个任务需要多少时间10001000
Development开发
· Analysis· 需求分析 (包括学习新技术)4050
· Design Spec· 生成设计文档4040
· Design Review· 设计复审 (和同事审核设计文档)3030
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)5060
· Design· 具体设计100200
· Coding· 具体编码100200
· Code Review· 代码复审100200
· Test· 测试(自我测试,修改代码,提交修改)200200
Reporting报告
· Test Report· 测试报告2020
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划4020

合作伙伴

姓名:莫礼钟

学号:20162319

主要工作:构思结构,提供思路,检查错误。

博客链接:点击此处→
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: