• 2016012053小学四则运算练习软件项目报告


    Coding.net源码仓库地址:https://git.coding.net/ma744191948/mayue.git

    一、需求分析

    1、用JAVA编程语言写一个小学四则运算练习

    2、程序可接收一个输入参数n,随机生成N道小学四则运算题

    3、每个数字在0~100之间,运算符在3个~5个之间。

    4、每个练习至少包含两种运算符,运算符为+-*÷

    5、题目中不能出现负数和正整数

    6、要将学号和n道练习题以及答案输出到文件“result.txt”中

    二、功能设计

    基本功能:根据用户需要用java编程语言写一个四则运算,数字在100以内,运算符3个到5个之间,每个练习至少包含两种运算符,运算符为+-*÷,且题目中不能出现负数和正整数,然后式子和答案以文档的形式呈现在用户面前。

    拓展功能:支持有括号的运算

    三、设计实现

    我共设计了四个类:Main、Demo1、Demo2、ToolDemo

    Main:主类,将学号、练习题以及答案输入到文件“result.txt”文件中

    Demo1:输出表达式,对表达式的条件进行判断,对表达式进行验证

    Demo2:判断左右子树是否有孩子,判断随机产生的符号以及是否有括号的运算。

    ToolDemo:获取随机的四种符号和0~100的随机数。

    四、算法详解

    1.生成题目
    (1)随机获取运算符
    char sign = 0;
            Random num = new Random();
            int i = num.nextInt(4);
            switch (i) {
            case 0:
                sign = '+';
                break;
            case 1:
                sign = '-';
                break;
            case 2:
                sign = '*';
                break;
            case 3:
                sign = '/';
                break;
            }
            return sign;
    (2)根据输入的范围(0-100)获取随机数
    int number = 0;
            Random num = new Random();
            number = num.nextInt(max + 1);
            return number;
    2.获取表达式验证并计算结果
    获取每个节点的运算结果,并检验除法
         1)除数为0
         2)不能整除
         出现以上两种情况的话将该运算符转换成其他三种运算符
    public String toString(){
                String str = root.toString();
                str = str.substring(1, str.length()-1);
                return str;
            }

    3.结果写入
    使用BufferedWriter写入文本
    File file = new File("result.txt");
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
                bw.write("学号:2016012053" + " ");
                for (int i = 0; i < n; i++) {
                    Integer number = null;
                    Random num = new Random();
                    number = num.nextInt(3) + 2;
                    bTree = new YunsuanVo(number);
                    bTree.buildBTree();
                    String result = bTree.CalAndVal();
                    System.out.println(bTree.toString() + "=" + result);
                    bw.write(bTree.toString() + "=" + result + " ");
                }
                System.out.println("---------------------------");
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            

        }

    五:测试运行

     

    后来改进后的命令行输入为

    六、优秀代码展示

    public class Main {
        public static void main(String[] args) {
    
            Scanner scan = new Scanner(System.in);
            int n;
            System.out.println("请输入您想要得到的题目个数:
    ");
            n = scan.nextInt();
            Demo1 bTree;
            System.out.println("
    ");
            System.out.println("2016012053");
            System.out.println("---------------------------");
    
            File file = new File("result.txt");
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
                bw.write("2016012053" + "
    ");
                for (int i = 0; i < n; i++) {
                    bTree = new Demo1(2);
                    bTree.buildBTree();
                    String result = bTree.Verification();
                    System.out.println(bTree.toString() + "=" + result);
                    bw.write(bTree.toString() + "=" + result + "
    ");
    
                }//把输出结果写入到result.txt文件中
                System.out.println("---------------------------");
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
    
        }
    
    }
    /**
         * 生成二叉树
         * 
         */
        public void buildBTree() {
            Demo2 lchild, rchild, lnode, rnode;
    
            if (num == 1) {
                lchild = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                rchild = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                root = new Demo2(String.valueOf(ToolDemo.getSign()), lchild, rchild);
            } else {
                int num1 = 0;
                int n = getDeep() - 3;
                boolean[] place = ToolDemo.getChildPlace(num);
                root = new Demo2(String.valueOf(ToolDemo.getSign()), null, null);
                opeList.add(root);
    
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < (int) Math.pow(2, i); j++, num1++) {
                        lchild = new Demo2(String.valueOf(ToolDemo.getSign()), null, null);
                        rchild = new Demo2(String.valueOf(ToolDemo.getSign()), null, null);
                        opeList.get(j + num1).setChild(lchild, rchild);
                        opeList.add(lchild);
                        opeList.add(rchild);
                    }
                }
    
                for (int i = 0; i < place.length; i++) {
                    if (place[i]) {
                        lnode = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                        rnode = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                        if (i % 2 == 0) {
                            lchild = new Demo2(String.valueOf(ToolDemo.getSign()), lnode, rnode);
                            opeList.add(lchild);
                            opeList.get(num1).setLchild(lchild);
                        } else {
                            rchild = new Demo2(String.valueOf(ToolDemo.getSign()), lnode, rnode);
                            opeList.add(rchild);
                            opeList.get(num1).setRchild(rchild);
                        }
                    } else {
                        if (i % 2 == 0) {
                            lchild = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                            opeList.get(num1).setLchild(lchild);
                        } else {
    
                            rchild = new Demo2(String.valueOf(ToolDemo.getNumber(10)), null, null);
                            opeList.get(num1).setRchild(rchild);
                        }
                    }
                    num1 = num1 + i % 2;
                }
            }
        }
    
    }
    /**
         * 获取每个节点的运算结果
         * 
         * @return result
         */
        public String getResult() {
            if (hasChild()) {
                switch (str) {
                case "+":
                    return String.valueOf(Integer.parseInt(getLchild().getResult()) + Integer.parseInt(getRchild().getResult()));
                case "-":
                    if (Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()) < 0) {
                        while (str.equals("-")) {
                            str = String.valueOf(ToolDemo.getSign());
                        }
                        return this.getResult();
                    } else {
                        return String.valueOf(Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()));
                    }
                case "*":
                    return String.valueOf(Integer.parseInt(getLchild().getResult()) * Integer.parseInt(getRchild().getResult()));
                case "/":
                    if (getRchild().getResult().equals("0")) {
                        while (str.equals("/")) {
                            str = String.valueOf(ToolDemo.getSign());
                        }
                        return this.getResult();
                    } else if (Integer.parseInt(getLchild().getResult()) % Integer.parseInt(getRchild().getResult()) != 0) {
                        while (str.equals("/")) {
                            str = String.valueOf(ToolDemo.getSign());
                        }
                        return this.getResult();
                    } else
                        return String.valueOf(Integer.parseInt(getLchild().getResult()) / Integer.parseInt(getRchild().getResult()));
                }
            }
            return str;
        }
    /**
         * 根据输入的范围获取随机数
         * 
         * @param max
         * @return number
         */
        public static int getNumber(int max) {
            int number = 0;
            Random num = new Random();
            number = num.nextInt(max + 1);
            return number;
        }
    
        /**
         * 随机产生子节点
         * 
         * @param num
         * @return childPlace
         */
    
        public static boolean[] getChildPlace(int num) {
            int d = 0;
            int size = 0, j = 1;
            while (num >= (int) Math.pow(2, j)) {
                j++;
            }
            d = (int) Math.pow(2, j) - 1 - num;
            size = (int) Math.pow(2, j - 1);
            boolean[] k = new boolean[size];
            for (int i = 0; i < size; i++) {
                k[i] = true;
            }
            for (int i = 0; i < d; i++) {
                Random ran = new Random();
                int f = ran.nextInt(size);
                while (k[f] == false) {
                    f = ran.nextInt(size);
                }
                k[f] = false;
            }
            return k;
        }
    
        
        
    
    }

    七、PSP

    PSP2.1

    任务内容

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

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

    Planning

    计划

    1500

    7200

    ·        Estimate

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

    1500

    7200

    Development

    开发

    1300

    6000

    ·        Analysis

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

    30 300

    ·        Design Spec

    ·         生成设计文档

    30

    300

    ·        Design Review

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

    30

    300

    ·        Coding Standard

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

    20

    400

    ·        Design

    ·         具体设计

    50

    500

    ·        Coding

    ·         具体编码

    800

    3000

    ·        Code Review

    ·         代码复审

    30

    500

    ·        Test

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

    200

    1000

    Reporting

    报告

    200

    1200

    ·         Test Report

    ·         测试报告

    70

    400

    ·         Size Measurement

    ·         计算工作量

    60

    200

    ·         Postmortem & Process Improvement Plan

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

    70

    600

    八、总结

           这次项目比我想象中的要难很多,如果说用c语言来写就会简单很多,而Java编程语言相对我来说难很多,也比预想中做的时间长了很多很多,原本觉得自己一两天就可以完成,但实际是一个星期每天都有再弄这个项目,考虑这个项目应该如何实现,代码应该如何写?以前觉得算法并没有什么太大的用处,也觉得自己可能不会去学算法之类的东西,但做完这个项目之后就发现,算法实在是太重要了。经过这一个星期,我明白了自己在Java方面还有很多很多不足的地方,在算法和思维方面也有很多不足,在接下来的学习生活中,我应该更加努力地去学习,让自己一天比一天更优秀。

  • 相关阅读:
    NodeJs操作MongoDB之分页功能与常见问题
    NodeJs之word文件生成与解析
    NodeJs之EXCEL文件导入导出MongoDB数据库数据
    NodeJs之文件上传
    NodeJs之定时器与队列
    NodeJs操作MongoDB之多表查询($lookup)与常见问题
    Windows下安装配置MongoDB
    关于fastJson的几个问题
    (转)java并发编程:CopyOnWriteArrayList
    java并发编程:锁的相关概念介绍
  • 原文地址:https://www.cnblogs.com/mayue-/p/8645602.html
Copyright © 2020-2023  润新知