结对编程
一、实验目的
正文
小学老师要每周给同学出300道四则运算练习题。
这个程序有很多种实现方式:
– C/C++
– C#/VB.net/Java
– Excel
– Unix Shell
– Emacs/Powershell/Vbscript
– Perl
– Python
两个运算符,100 以内的数字,不需要写答案。
需要写答案,并且保证答案在 0..100 之间
二、实验环境
Windows 10
Idea2021
三、实验内容
1:通过java语言实现随机出N道四则运算练习题
2:两个运算符,100以内数字
3:保证答案在0-100之间
4:判断用户输入是否正确并提示错误数量
四、实验步骤(图文方式叙述)
1:运行程序后,提示用户输入要出的题目数量
2:输入答案并判断所输入答案是否正确并提示数量
3:判断题目中运算符优先级(如下图题1)
4:题目中的数字以及答案始终为100以内的整数
五、实验结果及分析(遇到的问题与解决)
我们的思路是将一道题根据符号分成两个仅有一个符号的算式进行计算,在第一版程序设计时直接将一个算式前后分开,没有考虑符号优先级问题,导致程序进行判断的答案是错误的。通过借鉴同学的算法,我们通过定义一个map类型将随机出的符号数字化,使其能够进行比较来解决符号的优先级问题。同时,在一开始没有考虑到受众对象是小学生,导致我们的生成的题目大多含有分数,于是我们针对计算的函数进行了优化,增加了对余数是否为0的判断来筛选出能够进行整除的数字。
六、实验体会
实验过程中,由于第一版的思路太过直接却并不适用,在完成第一版程序发现并不能有效的完成目标时,我们还是较为失落的。随后通过讨论出新的想法并且将其实现后,更是让人兴奋。在过程中,一个人编写代码,一个人进行复查,能够很好的解决当局者迷的问题,在复查的过程中能够及时的发现编写过程中出现的一下小问题,大大减少了代码完成后bug的出现,大大提高了效率。这次的实验让我们认识到也很好的体会到了结对编程在未来的工作中,能够带来巨大便利,能够让我们在代码编写的过程中就找到bug来提升效率。
package jiedui; import java.util.Scanner; public class Main { public static void main(String[] args) { int t; Project pj = new Project(); System.out.println("请输入您要出的题目数量"); Scanner r=new Scanner(System.in); pj.setM( r.nextInt()); pj.getPriority(); int num=0; System.out.println("请依次输入答案,按回车自动进入下一道题"); for(int i=1;i<=pj.getM();i++){ System.out.print("("+i+") "); System.out.print(pj.getA()[i]+pj.getCh1()[i]+pj.getB()[i]+pj.getCh2()[i]+pj.getC()[i]+"="); Scanner sc=new Scanner(System.in); pj.getCheck()[i]=sc.nextInt(); if(pj.getCheck()[i]!=pj.getAns()[i]) pj.getW()[++num]=i; } System.out.println("您一共答对"+(pj.getM()-num)+"道题"+"答错"+num+"道题"); } } package jiedui; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.Scanner; public class Project { private int M=3; private final int N=301; private int[] a = new int[N]; private int[] b = new int[N]; private int[] c = new int[N]; private int[] ans=new int[N]; private int[] check=new int[N]; private int[] w=new int[N]; private boolean flag; private Map<String, Integer> map=new HashMap<>(); private String[] op =new String[]{"+","-","*","/"}; private String[] ch1=new String[N]; private String[] ch2=new String[N]; public Project() { } public int getAnswer(int a, String op, int b) { if (a < 0 || b < 0) return -1; if (a > 100 || b > 100) return -1; if (op == "+") return (a + b); if (op == "-") return (a - b); if (op == "*") return (a * b); if (op == "/") { if (b == 0) return -1; else if (a % b != 0) return -1; else return (a / b); } return 0; } void getPriority(){ map.put("+",0); map.put("-",0); map.put("*",1); map.put("/",1); Random r=new Random(); for (int i=0;i<=M;i++){ flag=false; while (!flag){ a[i]=r.nextInt(101); b[i]=r.nextInt(101); c[i]=r.nextInt(101); ch1[i]= op[r.nextInt(4)]; ch2[i]= op[r.nextInt(4)]; if (map.get(ch1[i])<map.get(ch2[i])){ ans[i]=getAnswer(b[i],ch1[i],c[i]); ans[i]=getAnswer(a[i],ch2[i],ans[i]); } else{ ans[i]=getAnswer(a[i],ch1[i],b[i]); ans[i]=getAnswer(ans[i],ch2[i],c[i]); } if (ans[i]<0||ans[i]>100) flag=false; else flag=true; } } } public int getM() { return M; } public int[] getA(){ return a; } public int[] getB() { return b; } public int[] getC() { return c; } public int[] getAns() { return ans; } public int[] getCheck() { return check; } public int[] getW() { return w; } public boolean isFlag() { return flag; } public Map<String, Integer> getMap() { return map; } public String[] getOp() { return op; } public String[] getCh1() { return ch1; } public String[] getCh2() { return ch2; } public void setM(int m) { M = m; } }