小学生四则运算

小学生四则运算 ?

项目地址

腾讯云:https://dev.tencent.com/u/Sophiamuma/p/CalculateProject/git
GitHub:
https://github.com/SophiaMuma/progect-calculate


一、功能需求

基本功能:

  1. 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号±*÷来表示)练习题。
  2. 每个数字在 0 和 100 之间,运算符在3个到5个之间;
  3. 每个练习题至少要包含2种运算符;
  4. 所出的练习题在运算过程中不得出现负数与非整数,比如3÷5+2=2.6,2-5+10=7等是不合法的;
  5. 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,文件目录与程序目录一致;
  6. 当程序接收的参数为4时,以下为一个输出文件示例。
    2018010203
    13+17-1=29
    11*15-5=160
    3+10+4-16=1
    15÷5+3-2=4

扩展功能:

  1. 支持有括号的运算式,包括出题与求解正确答案。
  2. 扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。
  3. 注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。

二、功能设计

  1. 保证输入的是数字或者特定字符,如果不符合要求,会有提示,并且可以重新输入。
  2. 当输入一个参数n,随机产生n道加减乘除算术题。保证生成的每个练习题至少要包含2种运算符。且保证在算数过程中,不出现负数,和小数。
  3. 将生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。

三、设计实现

在我的src中,我建立了Main类,和main包,包中有四个类。
小学生四则运算_第1张图片

(一)Main类

功能: 是该程序运行的入口,包含 public static void main(String[] args) 方法。该方法可接收一个生成运算式数目n,并且调用intNumber(int num)方法对输入数据n的合法性进行判断并作出响应,不合法调用input()函数,提示用户重新输入。然后调用Outer()方法来实现运算式的生成输出。

public static void main(String[] args) {
    try {
        times = Integer.valueOf(args[0]);//字符串为整型变量
        times = intNumber(times);//用intNumber判断数的范围
    }catch (Exception e){
        System.out.println("请输入一个1~100的数字。");
        times = inPut();
    }
    //异常处理,如果输入不符合整型和intNumber对数范围的规定,就catch错误,输出提示并调用inPut()重新输入
    Outer outer = new Outer(times);//输出调用
}

运用递归重复判断输入数的合法性。

private static int inPut(){
    try {
        Scanner input = new Scanner(System.in);//获取输入数
        times = input.nextInt();//控制台输入说赋给times
        times = intNumber(times);
    }catch (Exception e){
        System.out.println("输入格式不正确,请输入一个1~100的数字。");
        inPut();
    }//异常处理,用于判断输入是否处于1~100,如果还不符合再调用自己
    return times;
}

判断合法性的方法。

private static int intNumber(int num){
    if(num >= 1&&num <=100){
        return num;
    }//判断输入数是否符合要求的方法
    else {
        throw new RuntimeException();//异常处理,抛出运行时异常
    }
}

(二)Maker类

功能: 用于产生运算题目,并调用Tester类的对象对题目进行测试。

题目产生方法。

void makeQuestion(){
    this.question.setNums((int)((Math.random()*3)+2));
    this.question.setNumber(numMaker.makeNumber(question.getNums()));
    this.question.setChars(charMaker.makeChar(question.getNums()));
}

随机制造数字的方法。

lass NumMaker{
    int[] makeNumber(int nums){
        int[] number = new int[nums+1];
        for(int i = 0;i < nums+1;i++){
            number[i] = (int)(Math.random()*99);
        }
        return number;
    }
}

随机制造运算符的方法。

class CharMaker{
    private char[] box = {'+','-','*','÷'};
    char[] makeChar(int nums){
        char[] chars = new char[nums];
        for(int i = 0;i < nums;i++){
            chars[i] = box[(int)(Math.random()*4)];
        }
        return chars;
    }

(三)Tester类

功能: Tester类对产生数及符号进行运算。

判断优先级,实现先乘除后加减。

private int getResult(Box box){
    //用于判断优先级的部分
    if(box.listC.indexOf('*')>box.listC.indexOf('÷'))
        box = function(new Multiplication(),box);
    else if(!(box.listC.indexOf('÷')==(-1)))
        box = function(new Division(),box);
    else if(box.listC.get(0) == '+')
        box = function(new Plus(),box);
    else if(box.listC.get(0) == '-'){
        box = function(new Subtraction(),box);
    }
    //实现递归的部分
    if(box.listC.isEmpty()){
        if(box.listN.get(0)==-1)
            questionTest.setUseful(false);
        return box.listN.get(0);
    }
    else {
        return getResult(box);
    }
}

其他的不做过多展示了。

(四)Outer类

功能: 完成输出内容

public Outer(int times){
    this.times = times;
    this.boxs = new String[times+1];
    boxs[0] = ID;
    for (int  i = 1;i <= times;){
        maker.makeQuestion();
        maker.testQuestion();
        if(!maker.getQuestion().isUseful())
            continue;
        String box = maker.getQuestion().toString();
        boxs[i] = box;
        i++;
    }
    outQuestion(boxs);
}

(五)Question类

功能: get、set方法用于修改获取。


四、测试运行

1.用idea运行测试

小学生四则运算_第2张图片

小学生四则运算_第3张图片

2.用命令提示符

用UTF-8编码防止中文乱码。
小学生四则运算_第4张图片

小学生四则运算_第5张图片


五、代码提交

  1. 用idea直接推。
    我的idea已经配置了git。
    ①在GitHub上建好仓库。
    ②改连接的仓库。
    VCS->Checkout from Version Control
    ③推项目。
    VCS->Import into Version Control->Share Project on GitHub
  2. 提交到coding.net上
    ①注册并建好仓库。
    ②用Git Bash上传.

git config --global user.email "[email protected]"
git config --global user.name “Sophiamuma”
git remote remove origin
git init
git remote add origin https://git.dev.tencent.com/Sophiamuma/CalculateProject.git
git add src
git add result.txt
git commit -m’你的注释’
git push -u origin master


六、PSP

PSP 任务内容 计划时长(h) 实际时长(h)
Planning 计划 1 3
·Estimate 估计时长,规划大致任务步骤 2 3
Development 开发 28 60
·Analysis 需求分析(包括新技术学习) 3 5
·Coding Standard 代码规范(为目前的开发制定合适的规范) 0 0
·Design 具体设计 2 4
·Coding 具体编码 20 42
·Code Review 代码复审 1 3
·Test 测试(自我测试,修改代码,提交修改) 2 6
Reporting 报告 6 7
·Size Measurement 计算工作量 2 1
·Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 2 2
写博客 2 4

七、总结

这个作业对于我来说难度挺大的,遇到的问题也特别多,以前在学习语言的时候只会书本知识,实践太少,一个完整的项目更是没有独立完成过。
起初我不知道要怎么实现,只是初步想了几个分块就动手了,一个主函数就花了挺多时间,判断段输入合法性什么的弄好了,我就写了生成随机数和符号的函数,但是完全不知道要怎么联合,大脑一片空白,那就学习呗,我看了很多博客,大概有了想法,但是代码基础太过薄弱,有些代码读懂都困难,更不用说自己写了,于是我借鉴了很多学长学姐的方法,基本上是现学现做,整个基础功能就花了好几天空闲,然后,单纯的整合再学会是不行的,会有很多bug一堆,于是我又调试了很久。编辑器的怎样建本地仓库、cmd怎样运行生成txt、git上传coding.net也是从网上现学的。
虽然这次实践作业我完成的并不好,但是真的让我提升了很多,我发现人的自学吸收能力是很强的,只要再多花些时间动手实践,我的代码能力一定能有所提升。通过本次作业,我对一个完整的项目实行流程有了清晰的认识,也深刻认识到了动手能力对于我们学技术的同学是多么的重要。
万事开头难,我已经硬着头皮基本完成了此次项目作业的基本功能,我会继续努力完成后续功能,相信经过日后的学习,我的能力一定会有所提升,很期待通过一段时间的学习和练习,我能感受到自己的进步。

你可能感兴趣的:(小学生四则运算)