结对作业
结对项目
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230
这个作业的目标 结对项目——实现一个自动生成小学四则运算题目的命令行程序
项目成员
本次结对项目由
林涛 学号 3122004618
林浩全 学号 3122004491
共同完成
正文
github地址 https://github.com/lTsasa/computer/tree/main/3122004618
本次作业的代码已上传github,地址: 结对项目
PSP表格
根据作业要求,我们使用PSP表格预测并记录下队伍完成各部分的时间
设计实现过程
通过命令行获取参数 然后获取算式
算式通过空格分开 以便区别分数和除法
创建一个mynum类 当他的flag为1 的时候 代表是整数 用integer存储
当他的flag为0的时候 代表分数 用up代表分子 down代表分母
然后设计加减乘除算法
对于算式循环两次 一次做乘除法 一次做加减法
对于括号情况 需要先对存在括号进行判别
然后递归括号内容先行获取答案
直到没有括号为止
代码说明
效能分析
重新审视题目,发现对“计算过程中不能产生负数”这一要求的实现有误,代码中对重新生成算式的依据是算式结果的判负。于是对此进行改进
对于每一次算式情况的最新结果进行判别处理
check函数 以及 checkDiv
设计实现过程
Main类 主类,负责接收并分析命令行参数与调用其他模块
IOUtil类 读取文件类,根据路径读取文件的文本内容并返回
MyNum 设置数据类 同时处理加减乘除的逻辑以及通过这个返回字符串的情况
简要流程
代码说明
本部分是生成算式的代码部分,随机循环1到3次,生成1到3个运算符的算式,其中也有随机生成括号的功能
生成算式具体代码
点击查看代码
private static String createPromble() {
StringJoiner stringBuilder = new StringJoiner(" ", " ", " ");
String e0 = getNum(random.nextInt(2));
stringBuilder.add(e0);
int flag = random.nextInt(2);
//flag==1 可创建括号
for (int i = 0; i < random.nextInt(t)+1; i++) {
String fuHao = strArr[random.nextInt(strArr.length)];
String e1 = getNum(random.nextInt(2));
if (fuHao.equals("/") && e1.equals("0")) {
i--;
continue;
}
stringBuilder.add(fuHao);
if (flag==1){
if (random.nextInt(2)==1) {
flag++;
stringBuilder.add("(");
}
}
stringBuilder.add(e1);
}
if (flag==2) stringBuilder.add(")");
String s = stringBuilder.toString();
//这里之前是生成算式
return s;
}
计算具体代码
点击查看代码
private static MyNum compute(String s) throws Exception {
// String s = e0.replaceAll(" ", "");
// System.out.println(s);
List<MyNum> list = new ArrayList<>();
List<String> stringList = new ArrayList<>();
for (String s1 : s.split(" ")) {
if (s1.length() == 0 || s1.equals("")) continue;
if (s1.equals("+") || s1.equals("*") || s1.equals("-") || s1.equals("/")) {
stringList.add(s1);
continue;
}
if (s1.contains("/")) {
String[] split = s1.split("/");
Integer up = Integer.valueOf(split[0]);
Integer down = Integer.valueOf(split[1]);
list.add(new MyNum(up, down));
} else {
list.add(new MyNum(Integer.valueOf(s1)));
}
}
//这里直接计算可行?
//两次for循环 一次乘除 一次加减
int current = 0;
for (int i = 0; i < stringList.size(); i++) {
String s1 = stringList.get(i);
if (s1.equals("*") || s1.equals("/")) {
list.get(current).operator(list.remove(current + 1), s1);
if (list.get(current).check()||(s1.equals("/")) && list.get(current).checkDiv() ) {
throw new Exception();
}
} else {
current++;
}
}
current = 0;
for (int i = 0; i < stringList.size(); i++) {
String s1 = stringList.get(i);
if (s1.equals("+") || s1.equals("-")) {
list.get(current).operator(list.remove(current + 1), s1);
if (list.get(current).check()) {
throw new Exception();
}
}
}
//将所有数字转化为加减乘除
//我很好奇 括号怎么处理
//0 * 2 * 1 * 5 / 4
MyNum myNum = list.get(0);
myNum.gcd();
return myNum;
}
测试情况
默认情况 是 里面存了一个文件路径 作为文件题目和答案的传入
算式错误情况
项目小结
林涛:在做项目中,我感受到了很多,不止专业知识的提升、扎实,动手的能力也增强,还有自身也收获到了许多,感觉项目其实没有想象中的那么不可能,我还能回想起开始做项目的时候,感觉自己就是什么也不会,有一种无从下手的错觉。当我真正的开始去写,发现没有做不到,只有不想做。项目虽然看着简单,去做的时候就会发现其实不简单,处理其中的逻辑更是要仔细。
林浩全:让我学习到了更多,小组之间的合作、互助。在项目答辩时,感觉表现的不够好,有很多不足的地方。能获得优秀,自己其实挺惊讶的。希望下次自己表现的更加好