zoukankan      html  css  js  c++  java
  • 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

    九.不足

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

  • 相关阅读:
    assembly 基础
    自定义编写0号内中断除法错误的中断处理程序
    Codeforces Round #573 (Div. 2) D. Tokitsukaze, CSL and Stone Game (博弈,思维)
    Codeforces Round #573 (Div. 2) E. Tokitsukaze and Duel (博弈)
    Schedule HDU
    牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
    洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day 牛客假日团队赛5 A (单调栈)
    「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)
    树状数组求LIS模板
    牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)
  • 原文地址:https://www.cnblogs.com/lvgx/p/8645762.html
Copyright © 2011-2022 走看看