第六周 可执行代码 以及 PSP 燃尽图 等等
转眼已经第六周了。这周主要内容有下:(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 燃尽图 等等的更多相关文章
- 第五周可执行代码 以及 Canvas 制作个人PSP分类饼图
第五周可执行代码已经上传github,地址是https://github.com/yanyige/CourseWork/tree/master/Week4.以及效果在http://yanyige.gi ...
- 第五周 PSP 燃尽图 以及 进度条总结
1.PSP DATE START-TIME END-TIME EVENT DELTA TYPE 3.12 9.30 11.30 环境搭建 音乐30min QQ25min ...
- 201521123061 《Java程序设计》第六周学习总结
201521123061 <Java程序设计>第六周学习总结 ***代码阅读:Child压缩包内 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核 ...
- Scrum立会报告+燃尽图(十月二十五日总第十六次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 第六周PSP&进度条
团队项目PSP 一.表格: C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...
- 第六周PSP &进度条
团队项目PSP 一.表格: C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...
- 软件工程第六周psp
1.psp表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 讲技术文档,分配任务 10月20日16:17 10月20日16:50 0 33分钟 准备工作 根据任务查资料 10月20 ...
- 软工2017第六周团队协作——个人PSP
10.20 --10.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间 结束时间 中断时间 实际用 ...
- 第六周PSP
[week6]psp 工作周期:10.20-10.27 本周PSP C类型 C内容 S开始时间 ST结束时间 I中断时间 T净时间(分) 活动 开事后诸葛亮会议 13:00 14:00 0 ...
随机推荐
- Python2.7-xdrlib
xdrlib模块,用于打包和解包 xdr 数据.XDR 提供了一种与体系结构无关的表示数据,解决了数据字节排序的差异.数据字节大小.数据表示和数据对准的方式.使用XDR的应用程序,可以在异构硬件系统上 ...
- SVN 错误收集
一.the working copy is locked due to a previous error 解决办法:在 Cornerstone 右键本地工程 --> clean.
- HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 委托、事件、匿名方法、Lambda
一.委托(delegate) 定义:public delegate void/类型 DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...
- golang postgresql CRUD
package main import ( "database/sql" "fmt" "log" _ "github.com/li ...
- Hadoop大数据平台构建
基础:linux常用命令.Java编程基础大数据:科学数据.金融数据.物联网数据.交通数据.社交网络数据.零售数据等等. Hadoop: 一个开源的分布式存储.分布式计算平台.(基于Apache) H ...
- 一个评测指标就是MAP(Mean Average Precision)平均精度均值。
一个评测指标就是MAP(Mean Average Precision)平均精度均值. 转载 2017年09月13日 10:07:12 标签: 深度学习 892 来源01:Mean Average Pr ...
- Android与Libgdx入门实例
本文讲解如何实现Android与Libgdx各自的Hello World过程. 1. Android版Hello World 点击Eclipse快捷方式,选择New Android Applicati ...
- 一道面试题来了解线程notifyAll()和wait()的方法
题目:三个线程,分别打印A.B.C,要求按ABC的顺序循环打印10次. package com.slowcity.crud.controller; public class PrintOneTwoTh ...
- effective c++ 笔记 (49-52)
//---------------------------15/04/27---------------------------- //#49 了解new-handler的行为 { /* 1:在o ...