week_2 四则运算

coding地址: https://git.coding.net/lvgx/week_2.git

一. 需求分析

  1.接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题

  2.每个数字在 0 和 100 之间,运算符在3个到5个之间。

  3.每个练习题至少要包含2种运算符。

  4.所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。

  5.练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。

       附加需求(改进部分):

    1.支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。

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

二.功能设计

  实现点击可执行程序,出现提示词“请输入要生成的运算式”,运行结束,显示运算式,且运算式满足题目要求。最后计算结束,可以点击文件“result.txt”,对照答案。

三.设计实现

  设计了三个类

    main:主函数,实现输出运算式,运算的功能

    symbol:随机实现运算符

    randomnumber:随机生成随机数

四.算法详解

  1.生成随机数

    有Math类的random()方法以及Random类生成随机数两种方式,选择了第一种较为熟悉便捷的方法,并将生成随机数的方法装入一个类,便于调用,实现模块化

  2.生成随机符号

    将四种运算符装入一个数组中,通过生成随机数,对应到数组的检索值,并且个数满足设定范围,当几个随机符号一致时,将最后一个重新生成且不同于其他符号,并且覆盖掉最后一个字符,实现生成随机运算符的步骤

  3.生成运算式

    将生成的随机数放在一个数组里,将生成的运算符放在一个数组里,将二者合并,去除逗号括号,输出

  4.获取生成个数N

    通过函数获取输入数字,并判断其是否为正整数,且满足设定范围。

  5.运算式的计算

    通过迭代进行运算符优先级的判定,进行正常的运算

  6.txt文件的生成

五.测试运行

  

六.代码

  

int results;
        int n=numberTest();
        //生成问题----------------------------------------------------
        Result result = new Result();
        String[] boxs = new String[n];

        for(int j=0; j<n;) {
                //随机生成运算符的个数
                int Snum = (int) (Math.random() * 4 + 2);
                //随机生成的数字个数
                int Nnum = Snum + 1;

                //创建一个链表,并填入随机数
                int[] nums = new int[Nnum];
                for (int i = 0; i <= nums.length - 1; i++) {
                    nums[i] = (int) (Math.random()*101);
                }

                //创建一个字符链表,并填入随机运算符
                char[] sysmbols = new char[Snum];
                for (int i = 0; i <= sysmbols.length - 1; i++) {
                    sysmbols[i] = Symbol.symbol();
                }

                //连接两个链表,获得运算式
                Object[] temp = new Object[Snum + Nnum+3];
                for (int i = 0; i <Snum + Nnum; i += 2) {
                    temp[i] = nums[i / 2];
                }
                for (int i = 1; i <Snum + Nnum; i += 2) {
                    temp[i] = sysmbols[i / 2];
                }

                List<Integer>resultN = new ArrayList<>();
                for (int i = 0; i < nums.length; i++) {
                    resultN.add(nums[i]);
                }
                List <Character>resultS = new ArrayList<>();
                for (int i = 0; i < sysmbols.length; i++) {
                    resultS.add(sysmbols[i]);
                }

                Box box = new Box(resultN,resultS);
                results = result.getResult(box);
                if(results > 0 ) {
                    temp[Snum + Nnum] = '=';
                    temp[Snum + Nnum+1] = results;
                    temp[Snum + Nnum+2]= "
";
                    boxs[j] = Arrays.toString(temp).replace(',', ' ').replace('[', ' ').replace(']', ' ') ;
                    j++;
                }
                else
                    continue;
            //生成完毕--------------------------------------------------------
            //输出
                result.outQuestion(boxs);
                System.out.println(Arrays.toString(temp).replace(',', ' ').replace('[', ' ').replace(']', ' '));

七.总结

  其实对于java我并不是非常熟悉,可以说非常薄弱了,对于一个程序,我可能有一定的思维,但是因为不熟悉这门语言而不能熟练的运用相关函数,所以觉得这次作业对我来讲比较困难。通过这次作业,我深深的明白自己的代码能力有多薄弱,别人很快能编辑好的函数方法,我却要查询尝试多次才能实现。这促使我对java学习,有了一个微小的提高,因为只有不断应用,才能更加深刻的了解他的含义。所以我个人觉得,通过项目可以较好的促进个人的学习。还有非常感谢课代表张航同学,是他的耐心和帮助,才能使我在规定时间完成作业。故而有些内容是借鉴张航同学的博客http://www.cnblogs.com/zanghh/

  还有我觉得讨论式学习有助于大家共同的提高,就比如说大家交流,互相学习发现还可以通过js成熟的eval函数可以简化运算过程等

八.PSP

  

SP2.1

任务内容

计划共完成需要的时间(h)

实际完成需要的时间(h)

Planning

计划

25

50

·        Estimate

·   估计这个任务需要多少时间,并规划大致工作步骤

25

50

Development

开发

20

45

·        Analysis

·         需求分析 (包括学习新技术)

3

5

·        Design Spec

·         生成设计文档

0

0

·        Design Review

·         设计复审 (和同事审核设计文档)

0

0

·        Coding Standard

·         代码规范 (为目前的开发制定合适的规范)

0

0

·        Design

·         具体设计

3

5

·        Coding

·         具体编码

10

25

·        Code Review

·         代码复审

2

4

·        Test

·         测试(自我测试,修改代码,提交修改)

2

6

Reporting

报告

5

5

·         Test Report

·         测试报告

4

4

·         Size Measurement

·         计算工作量

0.5

0.5

·         Postmortem & Process Improvement Plan

·         事后总结, 并提出过程改进计划

0.5

0.5

九.不足

  通过这次小小的项目,我认识到自己知识储备量的不足,也意识到不动手,只会一些理论的东西,并不能提高自己的能力。我会更加努力,做出更好的程序

原文地址:https://www.cnblogs.com/lvgx/p/8645762.html