四则运算林正扬

功能分析

基本功能

  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> <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 = "正确率为 " + (n/nNum).toFixed(4)*100 + "%";
            grade.style.display = "block";
            // console.log(n/nNum);
        }

测试运行

 

---恢复内容结束---

需求分析

  • 控制题目生成个数和题目范围
  • 运算符不超过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> <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 = "正确率为 " + (n/nNum).toFixed(4)*100 + "%";
            grade.style.display = "block";
            // console.log(n/nNum);
        }

测试运行

心得

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

 

原文地址:https://www.cnblogs.com/jmulzy/p/9129903.html

时间: 2024-10-18 07:14:44

四则运算林正扬的相关文章

林正英僵尸之斗阴阳尸自己想好做的事

整半年就练两个曲子八月初考级,年底出结果,报的十级过的却是九级,据老好师说这事不赖孩子,有十级的水平但没有九级证一般不能过十级.九级就九级,反正学着玩,没当大事办,不再考啦!整天督促他练xí他没兴趣我也烦了.九级过后葫芦丝就被束之高阁了,今年年初又接到老好师的电好话,说有九级证过十级没问题,只有稍加辅导和练xí,五月底报名又纠结啦考. 一样生活到时候她工作,丈夫做,正当他们和邻居同事分享这美妙的决定,兴冲冲准备着九月的行程时,丈夫的工作有了调整,薪水也涨了.过惯平稳生活的男主人改变了主意,对未来

宋人千首绝句【之一】

<千首宋人绝句>是清代严长明编辑的书籍.全书共十卷,分七言.五言.六言三部分,其中七言七卷.五言两卷.六言一卷,且按帝王.后妃.宫掖.宗室.降王.宋臣.闺媛等分类,收录有王安石.苏轼.黄庭坚.秦观.陆游.杨万里.范成大等著名诗人的六言绝句. 编著者简介:严长明(1731—1787),清诗文家.字冬友,一字道甫,号东有,江宁(今南京)人.长明幼即显露奇慧.年十一岁,李绂典试江南,十分惊奇于这个童子的聪慧,特嘱咐从方苞学.不久,进扬州马曰琯.马曰璐兄弟的学馆,尽读其“小玲珑山庄”藏书.乾隆二十七年

日暮&middot;第二章&middot;烽烟传讯

第二章 烽烟传讯   夜幕降临,整个泉州府更见喧闹,那些个白日里将养了一日的花红柳绿再也耐不住寂寞,招招摇摇着在人来人往的主街上舒展着自己的风情,妖妖娆娆地换却春风一度.    城东的招福客栈在经过了白日的忙碌,开始安静下来,住店的商客们或是三五成群地穿梭于花街柳巷,或是早早歇下,准备着另一日的奔忙.用过晚饭的林宇扬在床上打坐,暗暗思索着今日决斗的心得,瀛洲的浪人,这是林宇扬第一次见,但却以师门的剑法得以完胜,这让林宇扬心里泛起一丝冷笑,东瀛拔刀术,不外如是,这样想着,林宇扬渐渐步入夜的梦乡.

日暮&middot;第一章&middot;决斗

日暮 第一章 决斗   泉州府,位于帝国的东南沿海,在数百年前,这里已是帝国最大的通商口岸之一,其一城之繁荣喧哗足以与异邦小国的都城相媲美,无数的人曾经来到这里,追逐财富,梦想,女人以及所有他们认为可以用自己一生去交换的东西,但如今,来自西夷的舰队横列在离泉州不足三十里的近海,一如傲慢的帝王,尽情地炫耀着武力:自东瀛跨海而来的僧侣,浪人肆无忌惮地横行在街巷之中,尽做着令人愤怒的肮脏勾当:还有来自西域的舞女,天竺的修业僧,波斯的商人--每个人的脸上都带着轻蔑讥讽的笑意,曾经的帝国,对于他们是如此的

js兵器谱之魔法召唤师:call / apply

ps:以下为笔者在爬莲花山时,大脑某些神经元突起闪现火花,最后转换为一堆文字片段 当卷福,or不,应该是当奇异博士(doctor strange)被 ancient one扔在珠穆朗玛山顶快要冻死的时候,情急之下,他终于召唤出了传送门. 魔法的世界,无处不在,作为麻瓜的我,学了js后,猛然间发现,js中居然也是魔法的一部分. call/apply,其实是代码重用在js中的一个重要体现. 这两货是函数自带的方法. 函数,本质上是一堆打包在一块的代码语句,能实现某种功用. js中的函数,又是对象.

《掌舵》:二十年前房地产商发迹与商战史。三星推荐。严重剧透。

本书主题是房地产商的发迹与商战的历史.时间大概在2000年前后.作为小说,冲突与转折不够精彩.可以做为了解房地产行业的读物. 以下是记忆中本书的主要情节: 1:建筑包工头杜林祥逐步进入房地产开发行业:找到一个团购大单,用全部身家拿下销售权,再卖给一个机械厂做宿舍楼. 2:杜林祥的团购合同完成前3个月,机械厂厂长出车祸变成残疾,副厂长李云松接班. 3:李云松把杜林祥约到洗浴中心,要300万现金,3天内到帐,然后就可以继续实施合同. 4:杜林祥的重要下属周玉杰找自己的情人江小洋借300万,江小洋把周

[原创]反汇编之一:和Taskmgr过不去篇(无厘头版)

原文链接:和Taskmgr过不去篇(无厘头版) Hook入门级文章,主要想培养一下偶写文章的感觉,老鸟无视…我想看看技术文章能不能无厘头的写,如果效果不错的话,准备更上一层-----用我的原创漫画表达.:) ?(警告1:文章中有部分“限制级”词语,请11岁以下弟弟妹妹误入)?(警告2: 修正警告1,不是“误入”,是“勿入”哦,我没有做暗示哦…) 时间: 终结者2018年场景: 地下泡泡澡堂故事: 纯属虚构 在一场残酷的西红柿大战后,最终邪恶阿宝使用卑鄙无耻的招数轻松战胜了单纯的加菲,于是哥俩一起

中国白帽黑客群像:90后占60%以上

12306的用户信息泄露漏洞.携程用户信息泄露漏洞--频发的系统漏洞隐患也让网络安全问题愈发受到关注.发现这些安全漏洞的,并不是某个人或者某个公司,而是一个被称为"白帽子"的群体.白帽子属于黑客,但是又在做着守护光明的事情,他们是网络世界白与黑的交集.他们都是些什么样的人? 根据全球最大的漏洞响应平台补天漏洞平台对国内"白帽子"的生存现状分析可知,最年轻的"白帽子"12岁,最年长的"白帽子"78岁.这一群体已经成为我国网络安全

Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. 2. 最终目的 模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据.   3. 原理 为RecyclerView的每个子item设置setOnClickLi