结对编程——小学四则运算练习题小程序

news/2024/5/18 12:17:06

程序要求如下:
小学老师要每周给同学出300道四则运算练习题。两个运算符,100 以内的数字,不需要写答案。
需要检查答案是否正确,并且保证答案在 0..1000 之间。

本程序有Java语言实现:

点击查看代码
import java.util.*;public class Practice {private Random random = new Random();private static final int WEEKLY_QUESTIONS = 301;private static final int DAILY_QUESTIONS = WEEKLY_QUESTIONS / 7;public static void main(String[] args) {Practice quiz = new Practice();quiz.startQuiz();}public void startQuiz() {Calendar calendar = Calendar.getInstance();System.out.println("今天的日期是:" + calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日");System.out.println("今天需要练习的题数为:" + DAILY_QUESTIONS);int questionsToday = 0;while (questionsToday < DAILY_QUESTIONS) {String question = generateQuestion();double correctAnswer = evaluate(question);System.out.printf("题目:" + question.replace("/", "÷").replace("*", "×")+" = ");Scanner scanner = new Scanner(System.in);String userAnswer01 = scanner.nextLine();double userAnswer = parseDoubleSafely(userAnswer01 , 0.0);if (Math.abs(userAnswer - correctAnswer) < 0.001) {System.out.println("回答正确!");} else {System.out.println("回答错误,正确答案是:" + (int)correctAnswer);}questionsToday++;}System.out.println(calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DATE) + "日已经完成" + DAILY_QUESTIONS+ "道题目");}private String generateQuestion() {int a = random.nextInt(100) + 1;int b = random.nextInt(100) + 1;int c = random.nextInt(100) + 1;String[] operators = {"+", "-", "*", "/"};String op1 = operators[random.nextInt(4)];String op2 = operators[random.nextInt(4)];// 确保除法可以整除if (op1.equals("/")) {b = adjustForDivision(b);}if (op2.equals("/")) {c = adjustForDivision(c);}String question = String.format("%d %s %d %s %d", a, op1, b, op2, c);// 验证结果是否在 0-1000 之间if (evaluate(question) < 0 || evaluate(question) > 1000) {return generateQuestion(); // 重新生成}if(evaluate(question)%1!=0){return generateQuestion(); // 重新生成}return question;}private int adjustForDivision(int number) {return number == 0 ? 1 : number;}private double evaluate(String question) {String[] tokens = question.split(" ");int a = Integer.parseInt(tokens[0]);String op1 = tokens[1];int b = Integer.parseInt(tokens[2]);String op2 = tokens[3];int c = Integer.parseInt(tokens[4]);// 根据运算符优先级进行计算double result = 0;if (op1.equals("*") || op1.equals("/")) {result = applyOperation(a, b, op1);result = applyOperation(result, c, op2);} else if (op2.equals("*") || op2.equals("/")) {double temp = applyOperation(b, c, op2);result = applyOperation(a, temp, op1);} else {result = applyOperation(applyOperation(a, b, op1), c, op2);}return result;}private double applyOperation(double x, double y, String operator) {switch (operator) {case "+": return x + y;case "-": return x - y;case "*": return x * y;case "/": return x / y; // 已保证 y 不为 0}return 0;}private static double parseDoubleSafely(String str) {return parseDoubleSafely(str, Double.NaN); // 如果发生错误,返回NaN}private static double parseDoubleSafely(String str, double defaultValue) {try {return Double.parseDouble(str);} catch (NumberFormatException e) {return defaultValue;}}
}

运行结果:


每次用户使用时,会显示实时日期以便记录,随机生成一定数量的练习题,每次回答会有提示,正确或错误,回答错误时会返回正确答案。

以下是对结对编程的见解:
本次结对编程的项目,是设计一个有关小学四则运算练习题的程序,我与XXXXXXX(学号)同学共同完成。
通过本次的程序编写,有了对结对编程的以下理解:

一、好处:
1.减少错误率: 由于两个人共同审查和编写代码,可以减少bug的产生。一个人可能会忽略一些潜在的问题,而结对编程可以让另一个人及时发现并解决。
2.知识共享: 结对编程有助于团队成员之间的知识共享。每个人都能从对方的经验中学习,并且在解决问题时可以共同思考和交流想法。
3.提高代码质量: 结对编程可以促进良好的编码实践,可以编写可维护性更强、逻辑更清晰的代码。
4.增强团队合作能力: 结对编程需要团队成员之间密切合作,这有助于提高团队的协作和沟通能力。
5.即时反馈: 由于两个人一起工作,可以立即给出反馈,这有助于快速解决问题和调整方向,如在XXXXXXX(学号)编程代码的过程中,忽略了生成的随机数要小于100这个条件,我及时发现并反馈。

二、缺点:
1.不适用于所有任务: 结对编程可能不适用于所有类型的任务,例如一些独立性较强的任务可能更适合个人完成。
2.潜在的意见分歧: 在结对编程过程中,可能会出现意见分歧或者沟通不畅的情况,这可能会影响开发效率,如我和XXXXXXX(学号)对运行结果实现的意见不同,题目要求一周为界限,一周300道练习题,我的解决办法是让用户每次使用时输入自己想要的题数来练习,而XXXXXXX(学号)的解决办法是每次用户使用时随机生成小于等于300道数目的练习题。
3.可能导致疲劳: 长时间的结对编程可能会导致开发者疲劳,因为持续的集中和合作需要较高的精力。

三、体会:
1.共同成长: 结对编程是一种共同成长的过程,通过和他人合作,我学会了倾听、解释和接受不同的观点,这对我的成长很有帮助。
2.提高效率: 在结对编程中,我发现两个人共同工作可以更快地解决问题,因为我们可以同时考虑多种解决方案并及时互相提出反馈。
3.更高的代码质量: 结对编程有助于确保代码质量,因为我们在编码过程中不仅仅是编写代码,还在不断审查和改进代码,这有助于减少bug的产生。
4.挑战与成就感: 结对编程也带来了挑战,但当我们共同克服困难并成功完成任务时,也会有一种成就感和团队凝聚力的增强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/22767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

6.常见寄存器和指令

一.寄存器 1.通用寄存器2.特殊寄存器stvec(Supervisor Trap Vector) 内核在这里写入trap处理程序的地址;RISC-V会跳转到stvec中的地址来处理trap,xv6的stvec就是trampoline page的起始地址sepc 发生trap时,RISC-V将当前的pc值存储到这里(pc随后会被stvec中的值覆盖)。从trap…

2.Lab-8 locks

Memory allocator (moderate) 代码地址 https://github.com/INnoVationv2/xv6-labs-2023/commit/6a93f5a9a5fca0627f9d44f185a33f30f3b8cd16 Buffer cache (hard) 创建多个桶 #define NBUCKET 13 struct {struct buf buf[NBUF];struct spinlock bucket_lock[NBUCKET];struct bu…

2.Lab-6 Multithreading

Uthread: switching between threads (moderate) Riscv32 Callee寄存器Name ABI Name Description Saverx0 zero Zero -x1 ra Return address Callerx2 sp Stack pointer Calleex3 gp Global pointer -x4 tp Thread pointer -x5-x7 t0-t2 Temporary registers Callerx8 s0/fp S…

2.CH-4文档学习笔记

一、trap简介 三类 trap系统调用:用户程序执行ecall指令要求内核为其提供服务 异常:(用户或内核)指令做了一些非法的事情,例如除以零或使用无效的虚拟地址; 设备中断,一个设备,例如当磁盘硬件完成读或写请求时,向系统表明需要处理。trap执行流程 1. 强制将控制权转移到内…

3.LAB-5 COW

LAB-5 COW 主要是修改fork和缺页中断处理程序 以前fork时,会直接复制原进程的页表内容到新页表,具体过程是 ​ 对于原页表中的每一页,malloc一个新页,然后复制数据到新页,最后把这一页映射到新页表 现在进行修改: 1. fork复制页表对于新进程,为其创建新页表 直接复用旧页…

南昌航空大学-23201406-第一次OOP博客作业

这个Blog,主要是为了将在面向对象的程序设计课程(Java)中的前三次pta题目集进行一个总结。 一、前言总结三次题目集的题目情况关于题目集 这三次题目集的题量都不大,主要内容都集中在最后的判题程序中。且三次的难度循序渐进,充分起到了锻炼的作用。 题目本身这三次题目集…

30 天精通 RxJS (26):简易实作 Observable(一)

因为实在太多读者在问要如何实作 Observable,所以特别调整了本系列文章最后几篇的内容,空出一天的位置来写如何简易实作 Observable。为什么是简易实作而不完整实作呢? 当然这个系列的文章是希望读者能学会如何使用 RxJS,而 实作 Observable 其实只是帮助我们理解 Observab…

Linux共享库、静态库、动态库详解

1. 介绍使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数…