20175325 第一周结对编程项目 四则运算
一、需求分析:
- 能根据用户输入的数字生成四则运算的题目数量
- 能自动生成规定范围内的四则运算题目(加、减、乘、除)
- 能够判断四则运算的结果是否正确并进行数量统计
- 能多次生成四则运算题目
- 支持多运算符
- 用户能够选择是否开始答题
- 统计题目正确率
- 题目去重
- 多语言支持:简体中文, 繁體中文, English
- 文件:
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判题
二、设计思路:
- 和之前所学的C语言中的四则运算方法作类比,在JAVA中运用了C语言里的一些思维。
- 产生随机数并且考虑符号的优先级。
- 为了计算方便,把整数作为分数计算。
- 根据输入的两个参数决定表达式的数量及四则运算的范围,随机生成其范围内的自然数及运算符。
- 能随机插入左括号并在相应的位置插入右括号。
- 根据四则运算规律进行四则运算,能判断结果是否正确,并输出正确率。
三、UML类图:
四、结果测试:
五、码云链接:
码云链接:https://gitee.com/sgm5/text1/commit/fc8bcd8eb49331286e7d1a31d93c3de07b329154
六、实现过程中的关键代码解释:
- 法则:
1.如果遇到数字,我们就直接将其输出。
2.如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
3.如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
4.如果遇到运算符号且栈非空,查看栈顶元素, 如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
5.如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
- 关键代码与注释:
Random ran = new Random();随机数方法创建对象
str += random.nextInt(B) % range_num + 1; 产生0-B范内围随机数
String signElement = sign[random.nextInt(5)];//产生随机运算符号"+", "-", "x", "÷", "/"
private Stack<String> numStack = null;// 数字栈:存储表达式中的数字
private Stack<Character> charStack = null;// 符号栈:存储表达式中的运算符和括号
//根据输入的两个参数决定表达式的数量及数值范围,随机生成数值范围内的自然数及运算符,随机插入左括号并在相应的位置插入右括号。
import java.util.ArrayList;
import java.util.Random;
public class Create {
String[] sign = {"+", "-", "x", "÷", "/"};
int range_num;
Random random = new Random();
public void setRange_num(int range_num) {
this.range_num =range_num;
}
public String create() {
String str = "";
int local = random.nextInt(3);
for (int j = 0; j < 3; j++) {
if (local == 0 && j == 0) {
str += "(";
} else if (local == 2 && j == 1) {
str += "(";
}
str += random.nextInt(range_num) % range_num + 1; //产生指定范围随机数
if (local == 0 && j == 1) {
str += ")";
}
if (local == 2 && j == 2) {
str += ")";
}
String signElement = sign[random.nextInt(5)];//产生随机运算符号
str += signElement;
if (signElement == "/") {
str += random.nextInt(range_num) % range_num + 1;
signElement = sign[random.nextInt(5)];
while (true) {
if (signElement != "/") {
str += signElement;
break;
}
signElement = sign[random.nextInt(5)];
}
}
}
str = str.substring(0, str.length() - 1);
return str;
}
public void belongFraction(String strfraction) {
//处理分数计算
String[] fractionlist = null;
if (strfraction.contains("+")) {
fractionlist = strfraction.split("\\+");
CalculateFraction(fractionlist, 0);
} else if (strfraction.contains("-")) {
fractionlist = strfraction.split("-");
CalculateFraction(fractionlist, 1);
} else if (strfraction.contains("x")) {
fractionlist = strfraction.split("\\x");
CalculateFraction(fractionlist, 2);
} else if (strfraction.contains("÷")) {
fractionlist = strfraction.split("÷");
CalculateFraction(fractionlist, 3);
}
}
public void CalculateFraction(String[] strlist, int flag) {
//分数的四种基本运算
String[] fraction1 = new String[2];
String[] fraction2 = new String[2];
if (strlist[0].contains("/"))
fraction1 = strlist[0].split("/");
else {
fraction1[0] = strlist[0];
fraction1[1] = "1";
}
if (strlist[1].contains("/"))
fraction2 = strlist[1].split("/");
else {
fraction2[0] = strlist[1];
fraction2[1] = "1";
}
Fraction fr1 = new Fraction(Integer.parseInt(fraction1[0]), Integer.parseInt(fraction1[1]));
Fraction fr2 = new Fraction(Integer.parseInt(fraction2[0]), Integer.parseInt(fraction2[1]));
fr1.print();
switch (flag) {
case 0:
fr1.add(fr2).print();
break;
case 1:
fr1.minus(fr2).print();
break;
case 2:
fr1.multiply(fr2).print();
break;
case 3:
fr1.divide(fr2).print();
break;
}
}
}
七、遇到的问题与解决方法:
问题1:如图所示:
解决方法:我们参考了一些博客(https://www.cnblogs.com/julinhuitianxia/p/6850493.html),添加了JAVA中一些常用的包,类似于C语言中库的用法,使其可以直接调用类。
八、总结:
这次的题目是四则运算,刚看到题目时,由于之前学了的C语言,能有一个大概的思路,但是JAVA语言与C语言不太一样,真正编写代码时,遇到了一些问题。在参考了老师的博客和从网上查找了一些资料以后,程序的编写才稍微能进入正轨,但过程中遇到多次无法编译和运行的情况,如:找不到一些类名和方法调用语句出错,调用的指针函数为空的情况,我们也参考了一些博客:(https://www.cnblogs.com/julinhuitianxia/p/6850493.html)(https://www.cnblogs.com/fuck1/p/5995857.html)等, 帮助我们解决问题,通过这次结对作业,也加深了我对JAVA学习的印象,也弥补了之前学习中的一些不足。
对队友的评价:
队友是室友,两个人的时间能相互调节,我们互相为对方的领航员和驾驶员,遇到困难和问题的时候,一起查资料,分析如何进行运算,在编写程序时,两个人刚开始并不知道如何着手,后来一起摸索学习,讨论解决过程中所遇到的种种问题,也感受到了1+1>2的力量,遇到困难时能一起解决,一起编程,是学习上的伙伴,能互相监督。
九、结对照片:
十、PSP:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 45 |
·Estimate | · 估计这个任务需要多少时间 | 400 | 550 |
Development | 开发 | 60 | 100 |
·Analysis | ·需求分析 (包括学习新技术) | 30 | 45 |
·Design Spec | · 生成设计文档 | 30 | 50 |
·Design Review | ·设计复审 (和同事审核设计文档) | 45 | 80 |
·Coding Standard | ·代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
· Design | · 具体设计 | 60 | 85 |
· Coding | · 具体编码 | 150 | 200 |
·Code Review | ·代码复审 | 20 | 45 |
·Test | ·测试(自我测试,修改代码,提交修改) | 70 | 165 |
Reporting | 报告 | 60 | 80 |
·Test Report | · 测试报告 | 15 | 25 |
·Size Measurement | ·计算工作量 | 20 | 15 |
·Postmortem &Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 20 |
合计 | 1025 | 1535 |
原文地址:https://www.cnblogs.com/sgm5/p/10657315.html