一、Github地址:https://github.com/BayardM/Four-Fundamental-Operations

(本项目由鲍鱼铭3118004995 和 许铭楷3118005023共同结对完成)

二、效能分析

  性能提升和效率提升主要体现在下图

  

  在实现了1个运算符两个操作数的结果计算之后,原本是打算同样的思路进行2个,3个运算符的计算,但是做到一大半时感觉实在非常麻烦,开发效率及其低下!

  便想到自己可以通过对操作数进行有限的变换来达到对更低层次的1个运算符函数的调用,换成这种嵌套调用之后减少了做运算的操作,也减少了底层对临时栈的调用,既提升了运行效率

  也提升了开发效率!

三、设计实现过程(思路)

    1-9需求均已实现

    此处以流程图展示关键的实现各种算式结果生成的具体思路

    

(前两个流程图最后忘记加得出结果一栏。。)

至于随机生成算式则是分为随机操作数和随机操作符两部分,操作数调用随机数库函数,操作符通过随机数字0123对应+-*/随机生成。

四、关键部分代码

  1.二元算式结果计算函数

 function two_oper(op1, op2 , sel_oper1)
{
var result
var formula = [op1 , sel_oper1 , op2]
switch(sel_oper1)
{
case 0:
result = op1 + op2
break
case 1:
var high_op = op1>op2 ? op1 : op2
var low_op = op1<op2 ? op1 : op2
result = high_op - low_op
break
case 2:
result = op1 * op2
break
case 3:
if(op1%op2 != 0)
{
if(op1/op2 >= 1)
result = parseInt(op1/op2) + "'" + op1%op2 + '/' + op2
else result = op1 + '/' + op2
}else{
result = op1 / op2
}
break
default:break
}
for (var j=0; j<3; j++) {
Formula[j] = formula[j]
}
return result
}

  2.三元算式结果计算

 function thr_oper(op1 , op2 , op3 , sel_oper1 , sel_oper2)
{
var formula = [op1 , sel_oper1 , op2 , sel_oper2 , op3]
var result
switch(sel_oper1)
{
case 0:
switch(sel_oper2)
{
case 0:
result = formula[0] + formula[2] + formula[4]
break
case 1:
var high_op = (formula[0]+formula[2])>formula[4] ? (formula[0]+formula[2]) : formula[4]
var low_op = (formula[0]+formula[2])<formula[4] ? (formula[0]+formula[2]) : formula[4]
result = two_oper(high_op , low_op , sel_oper2)
if(high_op == formula[4])
{
formula[0] = op3
formula[4] = op1
formula[1] = sel_oper2
}
break
case 2:
result = formula[0] + (formula[2] * formula[4])
break
case 3:
result = two_oper((formula[0]*formula[4]+formula[2]) , formula[4] , sel_oper2)
break
default:break
}
break
case 1:
switch(sel_oper2)
{
case 0:
var high_op = (formula[0]+formula[4])>formula[2] ? (formula[0]+formula[4]) : formula[2]
var low_op = (formula[0]+formula[4])<formula[2] ? (formula[0]+formula[4]) : formula[2]
result = two_oper(high_op , low_op , sel_oper1)
if(high_op == formula[2])
{
formula[0] = op2
formula[2] = op1
formula[3] = sel_oper1
}
break
case 1:
var high_op = (formula[2]+formula[4])>formula[0] ? (formula[2]+formula[4]) : formula[0]
var low_op = (formula[2]+formula[4])<formula[0] ? (formula[2]+formula[4]) : formula[0]
result = two_oper(high_op , low_op , sel_oper2)
if(high_op == (formula[2]+formula[4]))
{
formula[0] = op3
formula[4] = op1
formula[1] = sel_oper2-1
}
break
case 2:
var high_op = (formula[2]*formula[4])>formula[0] ? formula[2]*formula[4] : formula[0]
var low_op = (formula[2]*formula[4])<formula[0] ? formula[2]*formula[4] : formula[0]
result = two_oper(high_op , low_op , sel_oper1)
if(high_op == (formula[2]*formula[4]))
{
formula[0] = op3
formula[4] = op1
formula[1] = 2
formula[3] = 1
}
break
case 3:
var high_op = (formula[0]*formula[4])>formula[2] ? formula[0]*formula[4] : formula[2]
var low_op = (formula[0]*formula[4])<formula[2] ? formula[0]*formula[4] : formula[2]
//
result = two_oper((high_op-low_op) ,formula[4] , sel_oper2)
if(formula[2]> (formula[0]*formula[4]))
{
formula[0] = op2
formula[2] = op3
formula[4] = op1
formula[1] = sel_oper2
formula[3] = sel_oper1
}
break
default:break
}
break
case 2:
switch(sel_oper2)
{
case 0:
result = formula[0] * formula[2] + formula[4]
break
case 1:
result = two_oper((formula[0]*formula[2]) , formula[4] , sel_oper2)
if(formula[4]> (formula[0]*formula[2]))
{
formula[0] = op3
formula[4] = op1
formula[1] = sel_oper2
formula[3] = sel_oper1
}
break
case 2:
result = formula[0] * formula[2] * formula[4]
break
case 3:
result = two_oper((formula[0]*formula[2]) , formula[4] , sel_oper2)
break
default:break
}
break
case 3:
switch(sel_oper2)
{
case 0:
result = two_oper((formula[0]+formula[4]*formula[2]) , formula[2] , sel_oper1)
break
case 1:
var high_op = formula[0]>(formula[2]*formula[4]) ? formula[0] : (formula[2]*formula[4])
var low_op = formula[0]<(formula[2]*formula[4]) ? formula[0] : (formula[2]*formula[4])
result = two_oper((high_op-low_op) ,formula[2] , sel_oper1)
if((formula[2]*formula[4]) > formula[0])
{
formula[0] = op3
formula[2] = op1
formula[4] = op2
formula[1] = sel_oper2
formula[3] = sel_oper1
}
break
case 2:
result = two_oper((formula[0]*formula[4]) , formula[2] , sel_oper1)
break
case 3:
result = two_oper(formula[0] , (formula[2]*formula[4]) , sel_oper1)
break
default:break
}
break
default: break
}
for (var j=0; j<5; j++) {
Formula[j] = formula[j]
}
return result
}

  3.四元结果算式代码过长,暂不做展示

  4.ffo函数----算式生成函数

 function ffo(max){
var op_gath = Math.floor(Math.random()*(3)+2)
var sel_oper1 = Math.floor(Math.random()*4)
var sel_oper2 = Math.floor(Math.random()*4)
var sel_oper3 = Math.floor(Math.random()*4)
var result
switch(op_gath)
{
case 2:
var op1 = Math.floor(Math.random()*(max)+1)
var op2 = Math.floor(Math.random()*(max)+1)
result = two_oper(op1 , op2 , sel_oper1)
if((sel_oper1 == 1)&&(op1 < op2))
{
Formula[0] = op2
Formula[2] = op1
}
canswer[cindex] = result
cindex++
myanswer[index] = '答案' + (index+1)+': '+result
index++
Formula[0] = String(Formula[0])
Formula[2] = String(Formula[2])
Formula[1] = operator[Formula[1]]
for(var i=0; i<3; i++)
document.write(Formula[i])
document.write('=' + '<input type="text" />' + '<br />')
break
case 3:
var op1 = Math.floor(Math.random()*(max)+1)
var op2 = Math.floor(Math.random()*(max)+1)
var op3 = Math.floor(Math.random()*(max)+1)
result = thr_oper(op1 , op2 , op3 , sel_oper1 , sel_oper2)
canswer[cindex] = result
cindex++
myanswer[index] = '答案' + (index+1)+': '+result
index++
Formula[0] = String(Formula[0])
Formula[2] = String(Formula[2])
Formula[4] = String(Formula[4])
Formula[1] = operator[Formula[1]]
Formula[3] = operator[Formula[3]]
for(var i=0; i<5; i++)
document.write(Formula[i])
document.write('=' + '<input type="text" />' + '<br />')
break
case 4:
var op1 = Math.floor(Math.random()*(max)+1)
var op2 = Math.floor(Math.random()*(max)+1)
var op3 = Math.floor(Math.random()*(max)+1)
var op4 = Math.floor(Math.random()*(max)+1)
result = four_oper(op1 , op2 , op3 , op4 , sel_oper1 , sel_oper2 , sel_oper3)
canswer[cindex] = result
cindex++
myanswer[index] = '答案' + (index+1)+': '+result
index++
Formula[0] = String(Formula[0])
Formula[2] = String(Formula[2])
Formula[4] = String(Formula[4])
Formula[6] = String(Formula[6])
Formula[1] = operator[Formula[1]]
Formula[3] = operator[Formula[3]]
Formula[5] = operator[Formula[5]]
for(var i=0; i<7; i++)
document.write(Formula[i])
document.write('=' + '<input type="text" />' + '<br />')
break
default: break
}
}

  5.检查对错功能函数

 function checkanswer(){
var right = new Array()
var wrong = new Array()
var r_index=0
var w_index=0
var num=0
var inputtag = document.getElementsByTagName('input')
for (var j=0;j<inputtag.length;j++) {
if(inputtag[j].value == "") continue
else break
}
if(j==inputtag.length) alert("请输入答案再检查")
else {
for (var i=0 ; i<inputtag.length ;i++) {
if(inputtag[i].value == canswer[i])
{
right[r_index] = i+1
r_index++
}
else {
wrong[w_index] = i+1
w_index++
}
}
var show = ['correct:' + (right.length) + '(' , 'wrong:' + (wrong.length) + '(' , ')']
exportRaw('check.txt' , show[0]+right+show[2]+show[1]+wrong+show[2])
}
}

  6.导出文件函数

 function fakeClick(obj) {
  var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    obj.dispatchEvent(ev);
  }   function exportRaw(name, data) {
    var urlObject = window.URL || window.webkitURL || window;
 var export_blob = new Blob([data]);
    var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
    save_link.href = urlObject.createObjectURL(export_blob);
save_link.download = name;
    fakeClick(save_link);
  }

 五、测试运行

  1.定义题目数量

  

  2.定义范围

  

  3.10道题目生成,范围为10以内,答案txt


  4.输入答案检查对错功能

  

  5.10000道题目生成

  

六、PSP表格

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

     50

     50

· Estimate

· 估计这个任务需要多少时间

     20

    20 

Development

开发

     180

     220

· Analysis

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

     125

     140

· Design Spec

· 生成设计文档

     40

     30

· Design Review

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

     10

     10

· Coding Standard

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

     5

     5

· Design

· 具体设计

     120

     100

· Coding

· 具体编码

     120

     160

· Code Review

· 代码复审

     60

     180

· Test

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

     120

     350

Reporting

报告

     60

     60

· Test Report

· 测试报告

     60

     70

· Size Measurement

· 计算工作量

     10

     10

· Postmortem & Process Improvement Plan

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

     20

     45

合计

 

     1000

     1445

七、个人项目总结

许铭楷:

    这次作业用js完成,因为我js掌握还不是很深,大部分功能都是同伴完成的,我主要负责代码的检测和改错。在合作的过程中同伴尽心尽力帮助我解决了很多问题,我也学习到了很多的新知识。总的来说,这次训练带给了我很多进步,让我充分感受到合作的重要性。

鲍鱼铭:

    本次合作我承担的部分是具体编码和功能实现的部分,本以为自己做的不错可以减轻同伴负担,但是没想到交给同伴进行测试和debug的过程中竟然漏洞百出,幸好同伴细心检查,不断测试发现问题。问题主要呈现在减法不能存在负数与除法的真分数实现,在同伴的帮忙下自己很快得到改进。本次合作除了项目开发上的收获以外,更重要的是收获了与人合作的经历,深刻地明白了自己一个人做事总是会考虑不周全,也充分锻炼了以后到了真正工作时期与人沟通交流和接受意见的能力,收获颇丰!

Four Fundamental Operations(JS) --结对项目的更多相关文章

  1. 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~

    结对项目:Web复利计算 搭档博客地址:25江志彬  http://www.cnblogs.com/qazwsxedcrfv/ 个人摘要: (2016-04-09-12:00)补充:之前传送门没做好, ...

  2. 结对项目:四则运算web

    1)Coding.Net项目地址 https://git.coding.net/DandelionClaw/WEB_Calculator.git 注:本项目为web端,并且需要连接SQL Server ...

  3. 201871030110-何飞 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030110-何飞 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 ...

  4. 8 步搭建 Node.js + MongoDB 项目的自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...

  5. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  6. 高级四则运算器—结对项目总结(193 &105)

    高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界 ...

  7. js获取项目根路径

    //js获取项目根路径,如: http://localhost:8083/uimcardprj function getRootPath(){ //获取当前网址,如: http://localhost ...

  8. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  9. 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)

    Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...

  10. WordCount结对项目

    合作者:201631062124,201631062423 代码地址:https://gitee.com/yryx/WordCount 作业地址:https://edu.cnblogs.com/cam ...

随机推荐

  1. Java复习总结(二)Java SE 面试题

    Java SE基础知识 目录 Java SE 1. 请你谈谈Java中是如何支持正则表达式操作的? 2. 请你简单描述一下正则表达式及其用途. 3. 请你比较一下Java和JavaSciprt? 4. ...

  2. Microsoft Cloud App Security 微软的云应用安全

    1.概述 微软2015年收购的一家云安全创业公司 Adallom 正式推出产品,同时更名为微软 Cloud App Security.Adallom 成立于 2012年,是一家 SaaS 云安全公司, ...

  3. Python 字典(Dictionary) str()方法

    Python 字典(Dictionary) str()方法 描述 Python 字典(Dictionary) str() 函数将值转化为适于人阅读的形式,以可打印的字符串表示.高佣联盟 www.cge ...

  4. 使用FreeSurfer进行脑区分割

    FreeSurfer 是美国哈佛-麻省理工卫生科学与技术部和马萨诸塞州总医院共同开发的一款磁共振数据处理软件包,是基于 Linux 平台的全免费开源软件.FreeSurfer 能完成对高分辨率的 MR ...

  5. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树...

    上篇文章我们主要介绍了线性数据结构,本篇233酱带大家康康 无所不在的非线性数据结构之一:树形结构的特点和应用. 树形结构,是指:数据元素之间的关系像一颗树的数据结构.我们看图说话: 它具有以下特点: ...

  6. js数组中如何去除重复值?

    在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...

  7. 一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

    [一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. 很多人学习python,不知道从何学起.很多人学习python,掌握了 ...

  8. puppet单机模型

    puppet配置 命令 facter -p: 显示所有的变量 puppet apply [-v] [--noop] [-e 'puppet expression: 一般为include httpd等' ...

  9. PHP基础之查找

    前言 之前的文章介绍了PHP的运算符.流程控制.函数.排序等.有兴趣可以去看看. PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 PHP入门之数组 PHP基础之排序 下面简单介绍一下 ...

  10. 智能问答中的NLU意图识别流程梳理

    NLU意图识别的流程说明 基于智能问答的业务流程,所谓的NLU意图识别就是针对已知的训练语料(如语料格式为\((x,y)\)格式的元组列表,其中\(x\)为训练语料,\(y\)为期望输出类别或者称为意 ...