结对编程项目-四则运算 第二周

20175227张雪莹 2018-2019-2《Java程序设计》

结对编程项目-四则运算 第二周

需求分析

  • 自动生成小学四则运算题目(加、减、乘、除)
    • 支持整数
    • 支持多运算符(比如生成包含100个运算符的题目)
    • 算式含括号
    • 支持真分数
    • 当无真分数计算时,让被除数尽量可以被除数整除
  • 统计正确率
  • 将算式写入文件

设计思路

  • 读取用户希望做的习题数目,存于后台
  • 读取用户希望练习的题目类型:1——无真分数计算,2——有真分数计算
  • 产生1-100随机数字和随机运算符(“+ - * / ()”)
    • 算式长度要随机
  • 后台要计算产生的随机式子的正确答案并存储
  • 将算式(不含正确结果)输出至文件中
  • 在用户输入数字后,要与正确答案进行比较
    • 若用户做对,则记录正确题数
    • 若用户做错,则输出正确答案
  • 输出用户此次练习的正确率

UML类图

实现过程中的关键代码解释

  • 控制括号代码:
int flag=random.nextInt(2);//随机控制有无括号
                ……
   switch(flag){
                case 0:
                      s[0]= random.nextInt(4);//随机生成运算符下标
                      ex += String.valueOf(number[j]) + String.valueOf(op[s[0]]);//添加一对数字和运算符
                      if(s[0]==3){number[j+1]=f.decide(number[j],number[j+1]);}
                      break;
                case 1:
                      s[1]= random.nextInt(4);//随机生成运算符下标
                      ex+="("+String.valueOf(number[j]) + String.valueOf(op[s[1]]);//添加左括号和数字和运算符
                      if(s[1]==3){number[j+1]=f.decide(number[j],number[j+1]);}
                      flag++;
                      break;
                case 2:
                      s[2]=random.nextInt(4);
                      ex+=String.valueOf(number[j]) + ")"+String.valueOf(op[s[2]]);//添加右括号和数字和运算符
  • 尽量使得除数整除被除数:
if(s[2]==3){
            switch(s[1]){//区分之前括号里运算结果对后面数取整
            case 0:
                  number[j+1]=f.decide(number[j]+number[j-1],number[j+1]);
                  break;
            case 1:
                  number[j+1]=f.decide(number[j]-number[j-1],number[j+1]);
                  break;
            case 2:
                  number[j+1]=f.decide(number[j]*number[j-1],number[j+1]);
                  break;
            case 3:
                  number[j+1]=f.decide(number[j]/number[j-1],number[j+1]);
                  break;
            default:;
             }

decide方法:

 public int decide(int x,int y){//判断是否整除,返回能整除数
        Random random=new Random();
        if(x%y!=0){
            y=random.nextInt(100)+1;
            return decide(x,y);
        }
        else{
            return y;
        }
    }
  • 将算式输出于文件:
public class WAndRFile {
    String ua=new String();//用户答案
    public void writeToFile(String str){
        File fw=new File("practice.txt");//写入的文件
        try{
            Writer out=new FileWriter(fw);//指向目的地输出流
            BufferedWriter bw=new BufferedWriter(out);
            bw.write(str);//写入字符串str
            bw.newLine();//换行
            bw.close();//高级流关闭
            out.close();//关闭底层流
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

功能截图

  • 不含真分数

  • 写入文件

  • 含真分数

测试方法

遇到的困难及解决办法

  • 问题1:计算真分数时,出现负数的情况下,输入判题会有问题。比如:用户计算出答案-4/3,正确答案为-4/3,但程序判错,显示正确答案为:4/-3。
  • 问题1解决办法:将程序中出现负数情况先取反,再求最大公因子进行分式约分。程序为:
if(nu_2[0]<0){//分子为负数时
             nu_2[0]=-nu_2[0];//取反
             ca=ex+"-"+f.yuefen(nu_2[0],nu_2[1]);//加上负号
             }
  • 问题2:计算真分数时,会出现正确答案未约分就输出的情况。
  • 问题2解决办法:
Boolean result=ua.equals(ca);
jud.judgeFormula(result,ca);

将以上代码放到最外层循环体中,之前误将该语句放到switch语句中。

  • 问题3:由于第一周编程时未考虑除数与被除数整除关系,使得非真分数计算时有些小数位数过长,不便于用户输入答案,如下图:

  • 问题3解决办法:尽量将除数整除被除数,分为除数前为+、-、*、()的情况分别调用decide方法取整。

public int decide(int x,int y){//判断是否整除,返回能整除数
        Random random=new Random();
        if(x%y!=0){
            y=random.nextInt(100)+1;
            return decide(x,y);
        }
        else{
            return y;
        }
    }

代码托管

四则运算

结对总结

  • 在本周结对学习过程中,我们合力解决了许多问题:在对于添加“()”的问题上,我的结对伙伴想出了用产生随机flag并作为控制添加左右括号的判断条件(并不会出现多个括号叠加输出的情况)和switch语句来控制括号有无的好办法。这使得我们在产生含括号的算式上少走了很多弯路,我借此机会对他道一声:谢谢!
  • 其实学习过程中会遇到很多自己解决不了的问题,这时候就需要上网寻找答案,或是通过调试程序来解决问题。
  • 结对学习的好处就是,能在学习过程中通过互相讨论、纠错、提供解决办法,获得更好的学习效果。

结对学习照片

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 5
Estimate 估计这个任务需要多少时间 10 20
Analysis 需求分析(包括学习新技术) 30 30
Design Spec 生成设计文档 40 60
Design Review 设计复审 90 60
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 40
Design 具体设计 30 40
Coding 具体编码 400 600
Code Review 代码复审 90 60
Test 测试(自我测试,修改代码,提交修改) 60 40
Size Measurement 计算工作量 10 5
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
合计 810 990

参考资料

原文地址:https://www.cnblogs.com/zxy20175227/p/10702725.html