转眼已经第六周了。这周主要内容有下:(CHECKLIST)

    1.完成未完成的功能点。

    2.PSP。

    3.站立会议。

    4.燃尽图。

    5.各种图(折线,饼图)。

    6.checkList

具体任务如下:

    1.

      i.将用户做过的题目整理到习题本中。

      ii.习题本可以记录用户当时填写的答案。

      iii.规范算式(4个数字)。

      iv.将做过的题目去重。

      v.再次规范化输出算式(生成数目多少,括号位置,括号对数)。

      vi.支持分数运算。

      vii.结果用分数显示。

      viii.结果显示分数的最简形式。

      iX.再次优化界面,以及兼容性。

    这里详细描述一下部分方法的实现。

    关于支持分数运算,首先想到在逆波兰表达式中,只能算一个一个数字的运算结果,这个时候需要把每个数变成一个对象,存分子和分母,然后再进行计算。

    变对象的代码如下:

    

function Fraction(numerator, denominator){
this.numerator = numerator;
this.denominator = denominator;
}

    这里使用构造函数构造一个分数,传递两个参数分子和分母。

    接着是生成算式,在生成算式中,新增了一个参数,标记生成的分母,如果分母传递参数是1,那么将分母赋值成1,否则,分母赋值成一个1-参数大小的随机数,最后把生成的fraction push 进数组。

    修改代码如下:

  for(var i = 0 ; i < NUMDIGIT ; i ++){ //循环生成公式
if(DENOMINATOR == 1){
var numerator = Math.ceil(Math.random() * MAXNUM);
var denominator = 1;
var fraction = new Fraction(numerator, denominator);
}else{
var numerator = Math.ceil(Math.random() * MAXNUM);
var denominator = Math.ceil(Math.random() * DENOMINATOR);
var fraction = new Fraction(numerator, denominator);
}
formula.push(fraction);
if(i != NUMDIGIT - 1){
var index = Math.floor(Math.random() * PUNCTUATION);
formula.push(punctuation[index]);
}
}

    最重要的就是计算结果了,这里我编写了几个函数用于标准化计算结果,分别是normalizationFraction(用于标准化一个fraction对象),outputFraction(用于将一个对象转化成其字符串形式),transforFraction(用于将一个fraction数组中的每一个fraction转化成其字符串形式),除了标准化代码,还需要对fraction对象的加减乘除运算进行重写。具体代码如下:

标准化:

function abs(a){
return a<0?-a:a;
} function checkFraction(a, b){
return outputFraction(a)==b?true:false;
} function gcd(a, b){
return b?abs(gcd(b,a%b)):abs(a);
} function normalizeFraction(fraction){
if(fraction.denominator<0) return new Fraction(-fraction.numerator/gcd(fraction.numerator, fraction.denominator), -fraction.denominator/gcd(fraction.numerator, fraction.denominator));
return new Fraction(fraction.numerator/gcd(fraction.numerator, fraction.denominator), fraction.denominator/gcd(fraction.numerator, fraction.denominator)); } function outputFraction(fraction){
fraction = normalizeFraction(fraction);
return fraction.denominator==1?fraction.numerator:fraction.numerator + '/' + fraction.denominator;
} function transforFraction(fractions){
fractions = fractions.map(function(item, index){
if(item instanceof Fraction) return normalizeFraction(item);
else return item;
});
return fractions.map(function(item, index){
if(item instanceof Fraction) return item.denominator==1?item.numerator:item.numerator+'/'+item.denominator;
else return item;
}).join("");
}

重写四则运算的方法:

function addFraction(a, b){
var denominator = a.denominator * b.denominator;
var numerator = a.numerator * b.denominator + a.denominator * b.numerator;
return new Fraction(numerator, denominator);
} function minusFraction(a, b){
var denominator = a.denominator * b.denominator;
var numerator = a.numerator * b.denominator - a.denominator * b.numerator;
return new Fraction(numerator, denominator);
} function multiplyFraction(a, b){
var denominator = a.denominator * b.denominator;
var numerator = a.numerator * b.numerator;
return new Fraction(numerator, denominator);
} function devideFraction(a, b){
var denominator = a.denominator * b.numerator;
var numerator = a.numerator * b.denominator;
return new Fraction(numerator, denominator);
}

function getAns(formula){
  var ansArr = []; //存储结果的栈

  for(var i = 0 ; i < formula.length ; i ++){
    //console.log('formula[i]='+formula[i]);
    // if(!isNaN(formula[i])){
    if(formula[i] instanceof Fraction){
      ansArr.push(formula[i]);
    }else{


      var p1 = ansArr.pop();
      var p2 = ansArr.pop();
      // console.log(p1);
      // console.log(p2);
      var tAns;
      switch (formula[i]){
        case '+': tAns = addFraction(p2, p1); break;
        case '-': tAns = minusFraction(p2, p1); break;
        case '*': tAns = multiplyFraction(p2, p1); break;
        case '/': tAns = devideFraction(p2, p1); break;
      }
    ansArr.push(tAns);
    }
  }
  return ansArr.pop();
}

 

    其实以上函数代码都可以转化成一行实现,但是由于部分浏览器对js支持不是很好,这里使用了兼容性比较好的写法。

    

    通过这次完成杨老师布置的功能点和自己想出来的功能点,我的感触很多。我很庆幸自己阅读了构建之法以及精读Javascript高级编程这两本书,前者告诉我工程中结构化的重要性,编写代码要有注释,并且要将实现功能的函数封装起来,这次在修改代码的途中,我并没有重构整个项目的代码,只是添加了几个函数,修改了函数中的返回值就扩展了原代码的效果。后者则给了我足够的基础完成整个js的编写。事实证明,原生js还是很重要的。

    所有的可执行代码已经更新到https://github.com/yanyige/CourseWork/tree/master/Week6,效果的展示在http://yanyige.github.io/Week6/中展示。

2.PSP(新版PSP不追踪休息时间)

    

DATE START-TIME END-TIME EVENT           DELTA TYPE
3.12 9.30 11.30 环境搭建 音乐30min QQ25min       65min  
  21.23 2.35 代码 接水0min WC 5min 音乐30min 新闻15min   252min  
                     
3.13 21.30  0.22  升级calcv1.2  博客5min+3min  QQ语音20min  音乐10min  聊天20min    143min  
 3.14  9.00  11.15  实现添加括号功能  音乐30min  聊天20min        85min  
 3.21  15.16  15.53  站立会议            37min  
 3.22  15.30  15.50  站立会议            20min  
 3.33  9.00   11.00  看构建之法  上网30min 音乐30min  走神5min       55min  
  14.23  17.55  编写这周内容  上网60min 音乐30min  走神20min       102min  
  22.00 22.27 写博客           27min

 
3.25 15.05 15.26 站立会议           21min  
  17.33 23.50 完成“小试牛刀” 上网60min 音乐30min 走神20min 聊天30min   237min  
3.26 20.33 0.03 完成“小试牛刀” 音乐30min 英雄联盟60min       120min  
  0.03 0.27 写博客 上网10min         14min

 
4.2 8.00 11.00 学车           180min 学习
  13.00 15.30 睡午觉           150min 休息
  15.40 17.00 读书看论文           80min 学习
  18.00 21.00 完成留日预校网站 上网60min 音乐30min       90min 编程
  21.10 24.00 英雄联盟           180min 游戏
4.3 7.00 11.00 学车           240min 学习
  13.00 16.00 睡午觉           180min 休息
  16.10   16.50 晚餐           40min 休息
  17.00 22.30 结对编程 聊天60min 讨论20min       250min 学习
  22.40 23.05 编写博客 发呆10min         15min 休息
4.4 7.00 11.00 学车           180min 学习
  11.30 12.00 吃饭           30min 休息
  12.30 15.00 英雄联盟           210min 游戏
  15.30 18.20 午觉           170min 休息
  18.20 18.50 吃饭           30min 休息
  19.00 23.00 编程 聊天60min 讨论30min       150min 编程
4.5 17.00 23.00 编程 聊天60min 上网60min 音乐30min     210min 编程
4.6 7.00 9.00 学车           120min 学习
  12.00 14.00 学车           120min 学习
  18.20 22.10 编程 上网30min 聊天20min       120min 编程
  22.15 22.33 博客            

4.9 13.10 16.20 C语言刷题 上网30min         160min 编程
  18.10 18.50 读‘构建之法’           40min 读书
  19.00 23.00 英雄联盟           240min 游戏
4.10 8.30 12.00 C语言刷题 上网60min 听歌30min       120min 编程
  13.30 17.30 CCF认证           240min  
  20.30 21.30 编程 上网30min         30min 编程
  21.35 23.30 英雄联盟           115min 游戏
4.11 9.00 11.00 编程 上网30min         90min 编程
  15.40 17.00 编程           80min 编程
  18.00 22.00 英雄联盟           240min 游戏
4.12 19.00 22.30 编程 上网30min         180min 编程
  22.33 23.03 博客           30min  
4.13 19.00 21.30 研究自动化测试           150min 学习

    4.燃尽图(全部燃尽):

      在燃尽之时,已经出现了新的功能点。

      1.制作快乐运算二级页面。

      2.折线图的制作。

  

    5.饼图如下(使用上次Week5中作品,修改传入的参数):

    

          折线图: 打算实现一个自动生成折线图的代码,已经有思路。

  代码行数 博客字数 知识点
第一周 71+123 603 js数组的操作方法,图片瀑布流布局,逆波兰表达式,js基本包装类型,js单体内置对象
第二周 36 + 55 510  
第三周 112 + 233 143  
第四周 212(html)+268(js)+css(46) 84  
第五周 528 79  
第六周 40+(html)+132(js) 1155+512  

    6.checkList已经完成。

第六周 可执行代码 以及 PSP 燃尽图 等等的更多相关文章

  1. 第五周可执行代码 以及 Canvas 制作个人PSP分类饼图

    第五周可执行代码已经上传github,地址是https://github.com/yanyige/CourseWork/tree/master/Week4.以及效果在http://yanyige.gi ...

  2. 第五周 PSP 燃尽图 以及 进度条总结

    1.PSP DATE START-TIME END-TIME EVENT           DELTA TYPE 3.12 9.30 11.30 环境搭建 音乐30min QQ25min       ...

  3. 201521123061 《Java程序设计》第六周学习总结

    201521123061 <Java程序设计>第六周学习总结 ***代码阅读:Child压缩包内 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核 ...

  4. Scrum立会报告+燃尽图(十月二十五日总第十六次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  5. 第六周PSP&进度条

    团队项目PSP 一.表格:     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...

  6. 第六周PSP &进度条

    团队项目PSP 一.表格:     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...

  7. 软件工程第六周psp

    1.psp表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 讲技术文档,分配任务 10月20日16:17 10月20日16:50 0 33分钟 准备工作 根据任务查资料 10月20 ...

  8. 软工2017第六周团队协作——个人PSP

    10.20 --10.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间                结束时间 中断时间 实际用 ...

  9. 第六周PSP

    [week6]psp  工作周期:10.20-10.27  本周PSP     C类型 C内容 S开始时间 ST结束时间 I中断时间 T净时间(分) 活动 开事后诸葛亮会议 13:00 14:00 0 ...

随机推荐

  1. Javascript跨浏览器的事件对象

    一.跨浏览器的事件对象 var EventUtil = { ///添加事件 addHandler: function (element, type, handler) { if (element.ad ...

  2. java中sleep()方法的解析

    Thread.sleep(3000); 就是指让当前正在运行的占用cpu时间片的线程挂起3000ms,把cpu的时间片交给其他线程,但是并没有指定把CPU的时间片接下来到底交给哪个线程,而是让这些线程 ...

  3. OC分类(类目/类别) 和 类扩展 - 全解析

    OC分类(类目/类别) 和 类扩展 - 全解析   具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...

  4. samba服务器配置及window网络磁盘映射

    1. Samba服务器工作原理 客户端向Samba服务器发起请求,请求访问共享目录,Samba服务器接收请求,查询smb.conf文件,查看共享目录是否存在,以及来访者的访问权限,如果来访者具有相应的 ...

  5. 在AspNetCore 中 使用Redis实现分布式缓存 (转载)

    文章概念描述 分布式缓存描述:分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有 ...

  6. MapReduce -- 最短路径

    示例: 给出各个节点到相邻节点的距离,要求算出初始节点到各个节点的最短路径. 数据: A (B,) (D,) B (C,) (D,) C (E,) D (B,) (C,) (E,) E (A,) (C ...

  7. 20155229《网络对抗技术》Exp3:免杀原理与实践

    实验预习 免杀: 看为一种能使病毒木马避免被杀毒软件查杀的技术. 免杀的分类: 开源免杀:指在有病毒.木马源代码的前提下,通过修改源代码进行免杀.. 手工免杀:指在仅有病毒.木马的可执行文件(.exe ...

  8. 2017-2018-2 20155231《网络对抗技术》实验五: MSF基础应用

    2017-2018-2 20155231<网络对抗技术>实验五: MSF基础应用 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实验内容 (1)各种搜索技巧的应用 比如IP2L ...

  9. EZ 2018 04 01 ZJOI2018模拟赛04.01

    现在开始填以前的坑 这次老叶强制我们打一下这次省选题,然后我已经做好了掉Rating到死的准备 然后考完--莫名涨了 Orz 题目链接 由于很多东西我都不会,所以详细请看:dalao的题解 T1 我T ...

  10. PostgreSQL基础知识与基本操作索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...