第七周结对编程任务为给出一个300道四则运算计算题并能够完成和检查答案是否正确,我(2152113)邀请到了我计科专业的舍友(2152123)与我一同组队,编程语言选择了我们都较为熟悉的JAVA。
代码初现
先由我来进行了计算题生产器的代码编写
代码如下
import java.util.Random; public class MathExerciseGenerator { private static final int MAX_NUM = 100; private static final int NUM_EXERCISES_PER_WEEK = 300; public static void main(String[] args) { MathExerciseGenerator generator = new MathExerciseGenerator(); String[] exercises = generator.generateExercises(NUM_EXERCISES_PER_WEEK); for (String exercise : exercises) { System.out.println(exercise); } } public String[] generateExercises(int numExercises) { Random random = new Random(); String[] exercises = new String[numExercises]; for (int i = 0; i < numExercises; i++) { int numOperands = random.nextInt(2) + 1; // 1 or 2 operands String operator = "+"; if (numOperands == 2) { operator = "-"; } int operand1 = random.nextInt(MAX_NUM) + 1; int operand2 = random.nextInt(MAX_NUM) + 1; if (operator.equals("-")) { // ensure that the difference is positive while (operand2 > operand1) { operand2 = random.nextInt(MAX_NUM) + 1; } } int result = 0; if (operator.equals("+")) { result = operand1 + operand2; } else if (operator.equals("-")) { result = operand1 - operand2; } exercises[i] = operand1 + " " + operator + " " + operand2 + " = "; } return exercises; } public boolean checkAnswer(String exercise, int answer) { String[] parts = exercise.split(" "); int operand1 = Integer.parseInt(parts[0]); String operator = parts[1]; int operand2 = Integer.parseInt(parts[2]); int result = 0; if (operator.equals("+")) { result = operand1 + operand2; } else if (operator.equals("-")) { result = operand1 - operand2; } return answer == result && answer >= 0 && answer <= 100; } }
然后由他来编写了答题器部分
代码如下
import java.util.Scanner; public class MathExercisesApp { public static void main(String[] args) { MathExerciseGenerator generator = new MathExerciseGenerator(); String[] exercises = generator.generateExercises(300); Scanner scanner = new Scanner(System.in); int numCorrect = 0; for (String exercise : exercises) { System.out.print(exercise); int answer = scanner.nextInt();continue; else if (generator.checkAnswer(exercise, answer)) {
if (answer > 100)
System.out.println("Correct"); numCorrect++; } else { System.out.println("Incorrect"); } } System.out.println("Score: " + numCorrect + " out of 300"); } }
此时我们已经得到了一个可以成功运行的题目自动生成,并可以完成和检测的程序,但在测试中发现,在对于答案超过100的计算题中,依然保留了算式,我认为这非常不合理,应当直接不显示该算式,跳过去显示下一题,于是我们着手修改这一非常不科学的问题。
代码改进
研究过后,我们认为计算题生成器方面无需改动,而需要在答题器模块修改一下结构,首先在循环外部计算每个练习题的答案。然后,在循环内部,我们添加了一个新的条件来检查答案是否大于 100。如果是,则不显示该计算题,并继续进行下一个练习题。否则,显示该计算题并要求用户输入答案。
改进后的答题器代码
import java.util.Scanner; public class MathExercisesApp { public static void main(String[] args) { MathExerciseGenerator generator = new MathExerciseGenerator(); String[] exercises = generator.generateExercises(300); Scanner scanner = new Scanner(System.in); int numCorrect = 0; for (String exercise : exercises) { String[] parts = exercise.split(" "); int operand1 = Integer.parseInt(parts[0]); String operator = parts[1]; int operand2 = Integer.parseInt(parts[2]); int result = 0; if (operator.equals("+")) { result = operand1 + operand2; } else if (operator.equals("-")) { result = operand1 - operand2; } if (result > 100) { continue; // skip the current exercise } System.out.print(exercise); int answer = scanner.nextInt(); if (generator.checkAnswer(exercise, answer)) { System.out.println("Correct"); numCorrect++; } else { System.out.println("Incorrect"); } } System.out.println("Score: " + numCorrect + " out of 300"); } }
进行了50道测试后,并没有再出现答案超过100的情况 ,问题得到解决。
代码完善
最后在队友的建议下,又决定添加做题速率和正确率模块,更直观地展现完成情况。
完善后的答题器代码最终版本
import java.util.Scanner; public class MathExercisesApp { public static void main(String[] args) { MathExerciseGenerator generator = new MathExerciseGenerator(); String[] exercises = generator.generateExercises(300); Scanner scanner = new Scanner(System.in); int numCorrect = 0; for (int i = 0; i < exercises.length; i++) { long timeStart = System.currentTimeMillis(); // start timing String exercise = exercises[i]; String[] parts = exercise.split(" "); int operand1 = Integer.parseInt(parts[0]); String operator = parts[1]; int operand2 = Integer.parseInt(parts[2]); int result = 0; if (operator.equals("+")) { result = operand1 + operand2; } else if (operator.equals("-")) { result = operand1 - operand2; } if (result > 100) { continue; // skip the current exercise } System.out.print(exercise); int answer = scanner.nextInt(); if (generator.checkAnswer(exercise, answer)) { System.out.println("Correct"); numCorrect++; } else { System.out.println("Incorrect"); } double successRate = ((double)numCorrect / (i+1)) * 100; System.out.printf("Success rate: %.2f%% ", successRate); long timeEnd = System.currentTimeMillis(); // end timing double timeElapsed = (timeEnd - timeStart) / 1000.0; // convert time to seconds System.out.printf("Time elapsed: %.2fs\n", timeElapsed); } double finalScore = ((double)numCorrect / exercises.length) * 100; System.out.printf("Final score: %.2f%% (%d out of %d)\n", finalScore, numCorrect, exercises.length); } }
运行截图展示
项目完成心得
第一次体验结对编程任务就充分感受到了其与自己编程的巨大差别,两个人合作能够互相弥补对方的弱势,例如我的代码调整能力较弱,队友较强,他可以很好地将代码调整到我们想要的效果,我的想法比较多,可以提出很多改进意见,这一方面他就不如我。结对编程时,代码会经过更多的检查和审查,从而提高了代码的质量和可读性,并且两个人一起编写代码,可以相互纠正错误并及时发现难以察觉的错误,从而减少错误率。过程中也促进了知识分享和交流,使得团队成员可以在更短的时间内学习和掌握新技术,这也有助于增强团队合作精神,改善氛围。虽然结对编程需要两个人一起工作,但是它可以节省开发时间,并且生成更稳定、更高效的代码,从而提高生产力。
标签:JAVA,String,计算题,int,分析程序,System,result,exercise,out From: https://www.cnblogs.com/b0bxu/p/17309141.html