zoukankan      html  css  js  c++  java
  • 2016012003小学四则运算练习软件项目报告

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

    目录:

    一.需求分析

    二.功能设计

    三.设计实现

    四.算法详解

    五.运行测试

    六.代码展示

    七.PSP

    八.总结


    Coding.net源码仓库地址:https://git.coding.net/chenq971/week2-2.git

    一.需求分析

    通过对题目的分析,我提出了以下5个需求:

    1.程序可从命令行接收一个输入参数n,然后随机产生n道加减乘除练习题。

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

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

    4.所出的练习题在运算过程中不得出现负数与非整数。

    5.将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中。

    二.功能设计

    1.基本功能

    ① 在用户输入错误数据时提示并要求重新输入

    ② 自动随机生成用户输入个数的算式,给出算式答案

    ③ 将式子与答案以文档的形式呈现

    2.扩展功能

    ① 考虑到小学生计算水平,将算式结果约束在0~100间

    ② 算式可能出现括号,但是括号不会超过一个

    三.设计实现

    定义了java“Main”类,其中主方法用来判断用户输入的算式个数是否正确,并调用product()方法生成算式和结果,同时调用change()方法,将结果四则运算中的除号“/”改为“÷”,最后将式子和答案添加到文档中。

    product()方法生成一个算式,并计算出他的结果,同时判断结果是否符合规则。

    其中的product()还调用了decide()方法和decide2()方法,其中decide()是在除号出现的时候确保可以被整除,decide2()方法确保在减号出现的时候,后面的数比前面的数小。

     

    四.算法详解

    编写主函数并通过命令行接受参数,并判断传入参数是否合法,使用for循环调用product()方法,生成一个运算式,调用calculate()判断结果是否符合要求,若符合,则将其存入ArrayList集合中,然后调用change()方法改变除号,最后编写写入txt文件函数。

    对于生成一个式子,先随机生成一个3到5之间的数,决定这个式子的长度,再随机生成数字对应字符数组的运算符,如果是除号,就要调用decide()方法使得可以被整除,如果是减号,调用decide2()使前后不会出现负数。对于这个式子是否有括号,使用一个随机数决定,如果有,就在式子中的随机合适位置添加括号。

    生成结果我是利用JavaScript中的eval()函数,eval()函数可计算某个字符串,最后得出结果。

    对于改变除号,我是先判断字符串中是否有“/”,如果有,就进行更改。

    五.测试运行

    进入src文件夹,在命令行输入javac  Main.java 将类编译成class文件,再输入java Main 20 运行class文件,以下是result.txt部分截图。

    六.代码展示

    主函数代码

     int time = Integer.parseInt(args[0]);
            if (time > 0) {
                ArrayList<String> list = new ArrayList<String>();
                ArrayList<String> test = new ArrayList<String>();
                list.add("2016012003");
                for (int i = 0; i < time;) {
                    String str = product();
                    int index = str.indexOf("=");
                    DecimalFormat df = new DecimalFormat("#0.00");
                    String sss = df.format(Double.parseDouble(str.substring(index + 1, str.length())));
                    if (sss.equals("∞")) {
                        test.clear();
                        continue;
                    }
                    double result = Double.parseDouble(sss);
                    if (result < 100 && result > 0 && result % 1 == 0) {
                        i++;
                        list.add(str);
                    }
                }
    
                File file = new File("../result.txt");
                if (file.exists()) {
                    file.delete();
                }
                if (file.createNewFile()) {
                    FileOutputStream txtfile = new FileOutputStream(file);
                    PrintStream p = new PrintStream(txtfile);
                    for (String src : change(list)) {
                        p.println(src);
                    }
                    txtfile.close();
                    p.close();
                }
            } else {
                System.out.println("您输入的数字有误错误,请重新输入");
            }

    生成一个算式带有括号

    Random random = new Random();
            String[] operator = new String[] { "*", "-", "*", "/" };
            String[] str = null;
            int number = random.nextInt(3) + 3; // 3到5个数
            int kuohao = random.nextInt(2);//是否括号,0没有
            String string = new String();// 返回的结果if (kuohao == 1) {
                int firstKuo = random.nextInt(2) * 2;// 第一个括号的位置
                int secondKuo = firstKuo + 3 + random.nextInt(number - 2) * 2;// 第二个括号的位置
                str = new String[number * 2 + 1];
                int first = random.nextInt(100) + 1;
                str[0] = String.valueOf(first);
                for (int i = 1; i < number * 2 - 2; i += 2) {
                    int ope = random.nextInt(4);
                    if (ope == 3) {
                        str[i] = operator[ope];
                        str[i + 1] = String.valueOf(decide(Integer.parseInt(str[i - 1]), random.nextInt(100) + 1));
                    } else if (ope == 1) {
                        str[i] = operator[ope];
                        str[i + 1] = String.valueOf(decide2(Integer.parseInt(str[i - 1]), random.nextInt(100) + 1));
                    } else {
                        str[i] = operator[ope];
                        str[i + 1] = String.valueOf(random.nextInt(100) + 1);
                    }
                } // 一个式子基本完成,有括号
    
                Boolean se = false;
                for (int i = 0; i < str.length - 2; i++) {
                    if (i == firstKuo) {
                        string += "(";
                        string += str[i];
                    } else if (i == secondKuo) {
                        string += ")";
                        string += str[i];
                        se = true;
                    } else {
                        string += str[i];
                    }
                }
    
                if (se == false) {
                    string += ")";
                }
            } // 加上后括号

    使前后整除

    public static int decide(int a, int b){
            if(a%b!=0){
                b = new Random().nextInt(100)+1;
                return decide(a, b);
            }
            return b;
        }

    使减号前面的数大于后面的

    public static int decide2(int a, int b){
            if(a-b<0){
                b = new Random().nextInt(100)+1;
                return decide2(a, b);
            }
            return b;
        }

    七.PSP

    PSP2.1

    任务内容

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

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

    Planning

    计划

    10

    15

    ·        Estimate

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

    10

    15

    Development

    开发

    79

    158

    ·        Analysis

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

    6

    10

    ·        Design Spec

    ·         生成设计文档

    5

    5

    ·        Design Review

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

    2

    2

    ·        Coding Standard

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

    2

    2

    ·        Design

    ·         具体设计

    8

    10

    ·        Coding

    ·         具体编码

    36

    100

    ·        Code Review

    ·         代码复审

    7

    9

    ·        Test

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

    13

    21

    Reporting

    报告

    6

    11.5

    ·         Test Report

    ·         测试报告

    5

    10

    ·         Size Measurement

    ·         计算工作量

    0.5

    1

    ·         Postmortem & Process Improvement Plan

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

    0.5

    0.5

     

    八.总结

    本程序的主要难点在于运算式的随机生成和运算式的计算,编程重点解决随机生成运算式部分。平时做java程序都是直接在eclipse里面运行,这次在命令提示符运行我并不会,一切都要学习,最后,又学习了git的相关知识,将项目传到encoding.net上面,并作了博客记录,所有工作才算完成。

    通过这次作业我发现我的基础还是很薄弱,很多问题是想着简单,做起来难,有不太明白的我就上网找资料,但是项目还是有很多不足,而且语法很稚嫩,效率不高。我现在充分认识到自己的代码能力很弱,是要更多的学习和练习了。

  • 相关阅读:
    CTF-域渗透--SSH服务
    CTF-域渗透--SMB信息泄露
    CTF-域渗透--FTP服务后门利用
    Codeforces Round #628 (Div. 2)
    模板
    模板
    Educational Codeforces Round 6
    Educational Codeforces Round 5
    模板
    Codeforces Round #627 (Div. 3)
  • 原文地址:https://www.cnblogs.com/chenq971/p/8637776.html
Copyright © 2011-2022 走看看