四则运算

四则元素

需求分析

  • 控制题目生成个数和题目范围
  • 运算符不超过3个
  • 题目不能重复
  • 支持一万道题目
  • 运算结果为分数
  • 在生成题目的同时,计算出所有题目的答案
  • 能判断答案的正误

功能分析

基本功能

  1. 根据输入的数据,获取运算式的题数和运算式数值的范围。运算式中的数值以及符号随机出现。实现基本的 +、-、*、/ 的计算。
  2. 有分数时,出现的分数都是真分数的形式,输入结果能用带分数进行计算。
  3. 对生成的运算式计算结果,并且能在最后对输入的值进行判断。

扩展功能

  1. 表达式不重复
  2. 结果最简,
  3. 算符不超过三个

设计实现

  1. 生成随机数和随机符号
    生成随机符号 sign()
    生成随机数 ranNum(),约分 Common()
  2. 生成运算式
    生成运算式 ranData(),
  3. 计算结果
    数组转化为字符串 ranChange()
    计算结果 ranRes()
    4.判断计算式重复
    判断函数 checkRepeat()

代码说明

码云代码

HTML5 代码

    <div id="main">
        <label>请输入您要的范围(默认10)</label>
        <input type="number" id="cNum">
        <label>请输入您要的算式数(默认10)</label>
        <input type="number" id="nNum">
        <button id="button1">确认</button>
        <form id="myform">
            <div id="calm"></div>
            <button id="button2" style="display: none;">提交</button>
            <div id="grade" style="display:none;"></div>
        </form>
    </div>

js代码

        var div = document.getElementById('calm');
        var n = 0;
        var asd, nNum, cNum;
        var button1 = document.getElementById('button1');
        var button2 = document.getElementById('button2');
        var grade = document.getElementById("grade");

        var rpt = [];            // 定义变量存储运算数值(用于判重)
        var ret;            // 定义存储当前运算式
        var result = [];         // 定义变量存储结果
        var result1;        // 存储当前结果

        // 随机符号
        var sign = function(){
            var str = ['+','-','x','÷'];
            var a =Math.floor(Math.random()*4);
            return str[a];
        }

        var Common = function(a,b){
            var c = a % b;
            if (c == 0) {
                return b;
            } else {
                return Common(b, c);
            }
        }

        // 随机数据(分数和整数)
        var ranNum = function () {
            var a, b; 
            var math = [];
            var isFraction = Math.floor(Math.random() * 10);
            // 随机设置为分数
            if (isFraction > 5) {
                var divisor;
                a = Math.floor(Math.random() * cNum);
                b = Math.floor(Math.random() * cNum + 1);
                if (a == 0) {
                    math = 0;
                } else {
                    if (a < b) {
                        divisor = Common(b ,a);
                        math = "(" + (a/divisor) + "/" + (b/divisor) + ")";
                    } else if (a > b) {
                        divisor = Common(a ,b);
                        math = "(" + (b/divisor) + "/" + (a/divisor) + ")";
                    } else {
                        math = 1;
                    }
                }
            } else {
                a = Math.floor(Math.random() * cNum)
                math = a;
            }
            // console.log(math + "number");
            return math;
        }

        // 判断答案
        var answer = function(a,b){
            var c;
            if(a.indexOf("-") == -1){
                a = a.replace(/'/,"+");
                console.log(a);
                console.log(eval(a));
            }else{
                a = a.replace(/'/,"-");
                console.log(a);
                console.log(eval(a));
            }
            a = eval(a);
            if(a == b ){
                c = 'right';
                n++;
            }else{
                c = 'wrong';
            }
            return c;
        }

        // 产生运算,随机运算式,放入数组
        var ranData =function(){
            // 随机运算式的长度
            var data = Math.floor(Math.random()*3 + 1);
            if(cNum >= 100){
                data = 1;
            }
            var str = [];
            var num1 = ranNum();
            str.push(num1);
            var num2;
            var sin;
            for(var i = 0; i < data;i++){
                sin = sign();
                str.push(sin);
                num2 = ranNum();
                if(sin == "÷"){
                    // 除数为0时,重新赋值
                    while(num2 == 0){
                        num2 = ranNum();
                    }
                }
                str.push(num2);
            }
            return str;
        }

        // 将运算时合并成字符串
        var ranChange =function(data){
            return data.join('');            
        }

        // 计算式子的结果
        var ranRes =function(data){
            var str = [];
            // console.log(data);
            for(var i = 0;i<data.length;i++){
                if(data[i] == 'x'){
                    data[i] = '*';
                }
                if(data[i] == '÷'){
                    data[i] = '/';
                }
                str.push(data[i]);
            }          
            var res = str.join('');
            return eval(res);
        }
        

        // 判断重复函数
        var checkRepeat =function(ret,result1){
            for(var i = 0;i < rpt.length;i++){
                // 判断长度
                if(ret.length == rpt.length){
                    // 判断内容
                    if(ret.join == rpt[i].join){
                        // 判断结果
                        if(result[i] == result1){
                            return 1;
                        }
                    }
                }
            }
            rpt.push(ret);
            // console.log(rpt)
            result.push(result1);
            return 0;
        }
        // 运行主函数
        var main =function(cNum,nNum){
            var res = [];
            for(var i = 0; i < nNum;i++){
                var li = document.createElement('li');
                var input =document.createElement('input');
                // input.type = 'number';
                // input.className = name;
                input.setAttribute("class", "name"); 
                do{
                    var data = ranData();           //产生运算,随机运算式,放入数组
                    var putData = ranChange(data);  // 将运算时合并成字符串
                    res.push(ranRes(data));         // 计算式子的结果
                    result1 = ranRes(data);
                    ret = data.sort();
                }while(checkRepeat(ret,result1))
                while(putData.indexOf("(") >= 0 || putData.indexOf(")") >= 0){
                    putData =putData.replace(")","");
                    putData =putData.replace("(","");
                }
                li.innerHTML ="<span class= 'liSpan'>第" + (i + 1) + "题</span>&#x3000;<span class= 'liSpan1'>" + putData + " = </span>";
                li.appendChild(input);
                div.appendChild(li);
            }
            return res;
        }

        // 确认运算式的范围和数量,生成运算式
        button1.onclick = function(e){
            e.preventDefault();
            if(button2.style.display == "none"){
                div.innerHTML = "";
                grade.style.display = "none";
                n = 0;
            }
            nNum = document.getElementById('nNum').value;
            if(nNum <= 0){
                nNum = 10;
            }
            cNum = document.getElementById('cNum').value;
            if(cNum <= 0){
                cNum = 10;
            }
            asd = main(cNum, nNum);
            button1.disabled  = true;
            button2.style.display = "inline-block";
        }

        // 判断计算的结果,计算正确率
        button2.onclick = function(e){
            e.preventDefault();
            var input =document.querySelectorAll('form input');
            var li =document.querySelectorAll("form li")
            for(var i = 0 ; i < input.length;i++){
                var a = input[i].value;
                var b = asd[i];
                // console.log(answer(12));
                var check = answer(a,b);
                var span = document.createElement('span');
                span.setAttribute("class", "span"); 
                if(check == "right"){
                    span.style.color = "green";
                }else{
                    span.style.color = "red";
                }
                span.innerHTML = check;
                li[i].appendChild(span);
            }
            button2.style.display = "none";
            button1.disabled = false;
            grade.innerHTML = "正确率为&#X3000;" + (n/nNum).toFixed(4)*100 + "%"; 
            grade.style.display = "block";
            // console.log(n/nNum);
        }

测试运行

运行

PSP表格

PSP2.1 Personal Software Process Stages Time Senior Student Time
Planning 计划 10 12
* Estimate 估计这个任务需要多少时间 10 10
Development 开发 770 1440
* Analysis 需求分析 (包括学习新技术) 30 30
* Design Spec 生成设计文档 40 30
* Design Review 设计复审 20 20
* Coding Standard 代码规范 15 20
* Design 具体设计 60 65
* Coding 具体编码 245 785
* Code Review 代码复审 150 200
* Test 测试(自我测试,修改代码,提交修改) 150 200
Reporting 报告 60 90
测试报告 40 60
计算工作量 30 25
并提出过程改进计划 40 60

心得

第一次这样计算自己的项目耗时,时间不能很好的进行估算。特别是代码的用时,远远超过自己预计的时间。对于项目功能的划分,也不是很理想,在实际执行过程中产生了不少的问题,这也是导致代码耗时过长的原因之一。后期在自己原先规划的模块上面进行了不少的修改。

这个题目,第一眼看上去,好难,好麻烦。想了好久,想通了,觉得不是很麻烦,结果做起来的时候,发现问题一大堆。一些原以为简单的计算,由于对方法的理解不够透彻,导致在使用的过程中不尽人意,所求的结果不是自己需要的,使用的方式也不对。

在编程时,发现了许多自己在计划时遗漏的问题。比如除数不能为0,输出的计算式数目为负值时等等,细节地方没有考虑清楚。
也发现了许多自己的缺点和不足,基础不够扎实,思路不够开阔。但也通过这次的小作业,给自己了一些信心,也给自己更多的勉励和动力。

这次作业,算是做出来了,但是功能不够全,还有一些细节上的问题,还有待改进。

posted @ 2017-09-18 00:55  被水淹死的大白鲨  阅读(413)  评论(4编辑  收藏  举报