结对编程 2352111 2352133
结对编程分组(2352111、2352133)
https://www.cnblogs.com/zmy2352111
结对编程设计要求设计一个随机生成四则运算,并检查输入结果是否正确的程序。以下为我们的设计思路
设计思路:
首先分析题目要求,我们总结出了以下
一. 核心功能:
1.生成算术表达式:随机生成3个数字和两个运算符,组合成表达式。
2.计算正确结果:根据运算符优先级计算表达式的正确答案。
3.判断输入结果是否正确:接受用户输入的答案,判断是否正确,错误时显示正确答案。
二. 主要模块和流程
1.表达式生成
- 随机数字生成:使用Random生成1-100的整数(num1,num2,num3)。
while (questions.size() < questionNum){ int num1 = random.nextInt(100) + 1; int num2 = random.nextInt(100) + 1; int num3 = random.nextInt(100) + 1; - 随机运算符选择:通过GetRandomOpearator方法随机选择四则运算符号。
private static String getRandomOperator(Random random) { int operatorNum = random.nextInt(4); switch (operatorNum){ case 0: return "+"; case 1: return "-"; case 2: return "*"; case 3: return "/"; default: return ""; } } } - 表达式拼接:将数字和运算符组合成字符串形式。
String expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;
2.结果计算
- 运算符优先级处理:通过getOperatorPriority方法判断运算符优先级(乘除优先于加减)
private static int getOperatorPriority(String op) { switch (op){ case "+": case "-": return 1; case "*": case "/": return 2; default: return 0; } } - 中间结果检查:若中间结果为负数或超出范围(0-1000),则丢弃该表达式。
if(getOperatorPriority(op1) >= getOperatorPriority(op2)){ //先计算第一个运算符 double tempresult = calculate(num1,num2,op1); if(tempresult <0 || tempresult > 1000){ return -1; } result = calculate(tempresult,num3,op2); }else{ //先计算第二个运算符 double tempresult = calculate(num2,num3,op2); if(tempresult <0 || tempresult > 1000){ return -1; } result = calculate(num1,tempresult,op1); } - 最终结果保留两位小数:使用Math.round对结果进行四舍五入。
三.问题解决
在第一次完成代码的测试时,我们意识到了我们并没有考虑到四则运算法则的运算顺序,而是单一的按照了从左往右的顺序进行计算,这也导致了计算出来的答案不正确,我们重新调整的代码,添加了先检测运算符的优先级,再进行计算程序。
实现了基本的运算程序后,我们考虑使用输出一个表达式用户回答一个的形式进行输出,在此过程中,为了防止用户等待的时间过长,我们选择建立数组,在程序运行开始时将所有运算结果存入数组,但我们忘记考虑了,当最终结果不在0-1000时这个表达式会被删除,所以导致最后表达式的结果和存入数组的结果不同,这个我们的解决方式在判断了运算结果是否在0-1000之后才存入数组,这样可以保证表达式和运算结果能够保持一致。
四.程序代码
点击查看代码
package aec;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class acc {
public static void main(String[] args) {
int questionNum = 300;
List<String> questions = new ArrayList<>();
//创建答案集合
List<Double> Result = new ArrayList<>();
Random random = new Random();
while (questions.size() < questionNum){
int num1 = random.nextInt(100) + 1;
int num2 = random.nextInt(100) + 1;
int num3 = random.nextInt(100) + 1;
String operator1 = getRandomOperator(random);
String operator2 = getRandomOperator(random);
String expression = num1 + " " + operator1 + " " + num2 + " " + operator2 + " " + num3;
double result = calculateExpression(num1,num2,num3,operator1,operator2);
if (result >=0 && result <= 1000){
//将Result保留两位小数,四舍五入
result = Math.round(result * 100.0) / 100.0;
//存入Result集合
Result.add(result);
questions.add(expression + " = ?");
}
}
//每次输出一道题,然后用户从键盘输入答案,系统判断答案是否正确,如果错误则输出正确答案
for (String question : questions){
System.out.println(question);
Scanner scanner = new Scanner(System.in);
String answer = scanner.nextLine();
//判断答案是否与Result集合中相等
if(Double.parseDouble(answer) == Result.get(questions.indexOf(question))){
System.out.println("正确");
}else{
System.out.println("错误,正确答案为:" + Result.get(questions.indexOf(question)));
}
}
}
private static double calculateExpression(int num1, int num2, int num3, String op1, String op2) {
double result = 0;
//检查op1和op2的优先级
if(getOperatorPriority(op1) >= getOperatorPriority(op2)){
//先计算第一个运算符
double tempresult = calculate(num1,num2,op1);
if(tempresult <0 || tempresult > 1000){
return -1;
}
result = calculate(tempresult,num3,op2);
}else{
//先计算第二个运算符
double tempresult = calculate(num2,num3,op2);
if(tempresult <0 || tempresult > 1000){
return -1;
}
result = calculate(num1,tempresult,op1);
}
return result;
}
private static int getOperatorPriority(String op) {
switch (op){
case "+":
case "-":
return 1;
case "*":
case "/":
return 2;
default:
return 0;
}
}
private static double calculate(double a, double b, String operator) {
switch (operator){
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
if(b==0){
return -1;
}
return a / b;
default:
return -1;
}
}
private static String getRandomOperator(Random random) {
int operatorNum = random.nextInt(4);
switch (operatorNum){
case 0:
return "+";
case 1:
return "-";
case 2:
return "*";
case 3:
return "/";
default:
return "";
}
}
}
五.运算结果

六.结对编程体会
结对编程就是两个人一起写代码,感觉就像两个人一起搭积木,互相出主意,互相帮忙。刚开始可能会有点不习惯,两个人的想法不一样,有时候还会争来争去。但写着写着,就发现这样其实挺好的,一个人想不通的问题,另一个人可能会有办法。而且两个人一起写代码,代码更规范,错误也少很多。遇到特别难的问题时,两个人一起讨论,思路就打开了,问题也迎刃而解。虽然有时候会有点小摩擦,比如想法不一致,最后还是会找到一个大家都认可的办法。总的来说,结对编程让我觉得写代码不再是一个人的战斗,而是一个团队的合作。
结对编程是一起面对各种挑战。两个人的想法不可能完全一样,有时还会因为该怎么做而争得面红耳赤。但随着合作的深入,会发现这种模式其实很有趣。一个人卡住的难题,另一个人可能会有灵感,两个人一起讨论,思路就打开了,问题也迎刃而解。而且两个人一起写代码,感觉压力也没那么大了,就像有人在旁边帮你分担一样。
浙公网安备 33010602011771号