• 第三次作业:个人项目-小学四则运算“软件”


    本次作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166

     

    一、题目要求:

    像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。


    具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:

    23 - 3 * 4 = 11

     

    二、需求分析:

    1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

    2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。

    初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。

    然后和同学们比较一下各自程序的功能、实现方法的异同等等。

    写博客纪录自己实现的过程和思路。

     

    三、代码提交

     1.定制运算数和运算符

        /** 用于生成指定范围的随机数  **/
        static private int makeRandom(int min, int max){
            return (int)(Math.random()*(max - min) + min + 0.5);
        }

       首先在Lib类中,我选择了这样一个方法,通过Math.random()方法,生成一个 [min, max] 范围中的数。

     2.生成随机的运算式

        static public void makeQuestions(String[] questionList, int sum, int ops){
            /** 用于存放操作符 和 操作数  **/
            char opInQuestion[] = new char[15];
            int numInQuestion[] = new int[15];
            
            /** for循环生成sum个question **/
            for(int i=0; i<sum; i++){
                numInQuestion[0] = makeRandom(1, 100);
                /** 每个问题预生成第一个操作数,然后for循环对应生成之后的ops个操作 和对应的操作数 **/
                for(int j=0; j<ops; j++){
                    /** 乘除不连续出现避免出错 **/
                    if(j!=0 && getw(opInQuestion[j-1])==2)
                        opInQuestion[j] = op[makeRandom(0, 1)];
                    else opInQuestion[j] = op[makeRandom(0, 3)];
                    numInQuestion[j+1] = makeRandom(1, 50);
                    /** 特判除法构造整除 **/
                    if(opInQuestion[j] == '÷') {
                        numInQuestion[j+1] = makeRandom(1, 10);
                        numInQuestion[j] = numInQuestion[j+1]*makeRandom(2, 10);
                    }
                    
                    /** 特判乘法控制范围 **/
                    else if(opInQuestion[j] == '*') {
                        numInQuestion[j] = makeRandom(1, 20);
                        numInQuestion[j+1] = makeRandom(1, 100/numInQuestion[j]);
                    }
                }
                /** 将问题拼接为String **/
                String question = "" + numInQuestion[0];
                for(int j=0; j<ops; j++)
                    question = question + opInQuestion[j] + numInQuestion[j+1];
                
                //System.out.println(question);
                
                question = question + "=" + calQuestion(question);
                
                System.out.println(question);
                questionList[i] = question;
            }
        }

     3.计算表达式的值。

    /** 将question转化为后缀表达式并求值   **/
        static private int calQuestion(String question){
            char[] ch = new char[50];
            char[] oc = new char[15]; 
            int[] num = new int[15];
            int temp = 0, pn = -1, pc = -1;  //temp用于存放中间数值,pn用于在num数组中模拟栈顶, pc用于在ch数组中模拟栈顶
            
            ch = question.toCharArray();
            
            for(int i=0; i<ch.length; i++){
                if(Character.isDigit(ch[i])) {
                    temp = temp*10 + ch[i]-'0'; 
                    if(i == ch.length-1)
                        num[++pn] = temp;   //最后一个数入栈
                }
                else {
                    num[++pn] = temp;       //temp入栈
                    temp = 0;
                    
                    while(pc!=-1 && getw(oc[pc]) >= getw(ch[i]) ) {
                        int num1 = num[pn--];
                        int num2 = num[pn--];
                        char ch1 = oc[pc--];
                        num[++pn] = calc(num2, num1, ch1);
                    }
                    
                    //if(pc == -1) oc[++pc] = ch[i];
                    oc[++pc] = ch[i];
                }
            }

    四、个人软件过程耗时估计与统计表

    PSP2.1 Personal Software Process Stages Time Senior Student Time
    Planning 计划 8 6
    · Estimate 估计这个任务需要多少时间 80 100
    Development 开发 60 80
    · Analysis 需求分析 (包括学习新技术) 10 15
    · Design Spec 生成设计文档 5 6
    · Design Review 设计复审 6 6
    · Coding Standard 代码规范 3 3
    · Design 具体设计 10 15
    · Coding 具体编码 30 25
    · Code Review 代码复审 7 9
    · Test 测试(自我测试,修改代码,提交修改) 13 21
    Reporting 报告 9 6
    · 测试报告 3 2
    · 计算工作量 2 2
    · 并提出过程改进计划 3 3
  • 相关阅读:
    tty 与 多任务的解释备忘
    Oracle 安装时候的fs.filemax参数
    100多个Web2.0在线生成器
    精心整理的微软原版光盘
    WEB3.0开启商务魔法时代
    VBO与Displaylists的进一步讨论 (转)
    基于UML和ASP.NET实现三层B/S结构系统开发(转)
    BYTE* To Float*
    COM高手总结的八个经验和教训(转)
    OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现)(转)
  • 原文地址:https://www.cnblogs.com/lingzihui/p/9759598.html
Copyright © 2020-2023  润新知