20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
小组成员
- 20172313 余坤澎
- 20172332 于欣月
- 20172326 康皓越
小组编程照片
设计思路
- 通过一个Element和Num类来作为基本元素获得表达式
- 通过一个Expression来将各个元素组合起来
- 通过Cal将表达式计算出来
通过用户类将结果计算出来,并判断其正负
重要代码
public void getNum() {
Random num = new Random();
numerator = num.nextInt(9);//分子
denominator = num.nextInt(9)+1;//分母
if (denominator == 1 && numerator != 0)//分母为1,结果为分子。
number = numerator + "";
else if (numerator == 0)//分子为0,结果为分母。
number = denominator + "";
else if (denominator == numerator )
number = 1 + "";
else {
reduce();//约分
if (numerator < denominator)//约分后分子小于分母
number = " ( "+ numerator + "/" + denominator+" ) ";
else if (numerator > denominator)//约分后分子大于分母,交换分子分母
number = " ( "+denominator + "/" + numerator+" ) ";
}
}
//约分的方法
private int gcd(int num1,int num2)
{
while (num1 !=num2) {
if (num1 > num2)
num1 = num1 - num2;
else
num2 = num2 - num1;
}
return num1;
}
private void reduce()
{
if (numerator !=0)
{
int common = gcd(Math.abs(numerator),denominator);
numerator = numerator/common;
denominator = denominator/common;
}
}
本段为生成分数以及通分,提取公约数
Random a = new Random();
//是否有括号
int or = a.nextInt(2);
//无括号
if (or == 0) {
通过随机数来判断表达式中是否有括号0为没有,1为有。
for (int index = 0; index <= times; index++) {
int c = time.nextInt(4);
Elements q = new Elements();
//开始生成表达式
if (c == 0) {
num.getNum();
q.add();
result += num.toString() + q;
count1++;
}
if (c == 1) {
num.getNum();
q.sub();
result += num.toString() + q;
count1++;
}
if (c == 2) {
num.getNum();
q.mul();
result += num.toString() + q;
count2++;
}
if (c == 3) {
num.getNum();
q.div();
result += num.toString() + q;
count2++;
}
通过0,1,2,3来选择加减乘除
public List<String> work(String str){
List<String> list = new ArrayList<String>();
char c;
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
c = str.charAt(i);
if(isDigit(c)){
sb.append(c);
}
if(isOp(c)){
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
list.add(c+"");
}
}
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
return list;
}
public void printList(List<String> list){
for(String o:list){
System.out.print(o+" ");
}
}
将生成的表达式数字与符号分别存入数组与栈中
if(s.equals("+")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2+a1;
stack.push(v);
}else if(s.equals("-")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2-a1;
stack.push(v);
}else if(s.equals("*")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2*a1;
stack.push(v);
}else if(s.equals("/")||s.equals("÷")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2/a1;
stack.push(v);
表达式的计算,包含了优先级的选择,以及栈操作使得计算得以使用。
项目链接
小组结对博客
代码贡献度
余坤澎 | 于欣月 | 康皓越 | |
---|---|---|---|
个人贡献度 | 30% | 40% | 30% |
遇到的困难及解决方法
- 运算符的生成问题,一开始时打算使用随机数来表示输出,但是后续的括号无法进行合并,遂放弃。解决方法:将所有符号改为单个方法,例如,加方法只有加号。而值得说的是括号方法有两个,一个左一个右。
- 表达式类中的第三等级,因为同样是使用随机数来决定各个加减乘除运算的位置以及个数,但是会出现只有加减或者只有乘除的情况。解决方法:运用一个int型的count变量来监控加减或乘除,如果没有,自动生成相应的缺失运算。
- 优先级的问题,是继续在element方法中定义还是怎样?解决方法:直接在cal中计算前,也就是进栈时,规定谁优先。
文件扩展
- 判断正确率
- 将生成的题目用IO流输入一个文件,生成一个题库
转载于:https://www.cnblogs.com/326477465-a/p/9011498.html