地产行业网站建设图片,c 网站开发 环境配置,棋牌游戏网站模板下载安装,网站开发地图Gorsonpy的计算器 0.页面及功能展示1. PSP表格2.解题思路描述3.设计实现过程4.程序性能改进5.异常处理6.单元测试展示7.心路历程和收获 这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd-05这个作业要求在哪里https://bbs.csdn.net/topics/617294583这个作业的目标完… Gorsonpy的计算器 0.页面及功能展示1. PSP表格2.解题思路描述3.设计实现过程4.程序性能改进5.异常处理6.单元测试展示7.心路历程和收获 这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd-05这个作业要求在哪里https://bbs.csdn.net/topics/617294583这个作业的目标完成一个具有可视化界面的计算器。其他参考文献…
0.页面及功能展示
源代码地址
1. PSP表格
PSPPersonal Software Process Stages预估耗时分钟实际耗时分钟Planning计划6060• Estimate• 估计这个任务需要多少时间1515Development开发700700• Analysis• 需求分析 (包括学习新技术100100• Design Spec• 生成设计文档6060• Design Review• 设计复审3030• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3030• Design• 具体设计6060• Coding• 具体编码300300• Code Review• 代码复审4545• Test• 测试自我测试修改代码提交修改6060Reporting报告9090• Test Repor• 测试报告3030• Size Measurement• 计算工作量1515• Postmortem Process Improvement Plan• 事后总结, 并提出过程改进计划4545合计850850
2.解题思路描述
数据结构课上说过运算式的表达本质是一个栈的过程。因为一个表达式往往会含有非常多的匹配情况加上三角函数、阶乘等尤其如此优先级、合不合法等很难判断清楚所以在一个短暂的工期内想自己实现出一个不出纰漏、完美的轮子是很困难且几乎不可能的。所以后端计算的逻辑有必要用现成的计算库。语言的选择一开始我选用的GoFyne图形库的方案。然而因为Go本身GUI的基础薄弱Fyne库提供的页面也很差强人意。后遂考虑HTMLCSSJS的方案。中途有考虑过要不要用Go-webview2把计算逻辑移到Go来做。发现实现较为困难且有些大材小用遂放弃。原先没学过JS但听说过精度很差需要寻找一个精度比较高的计算库来完成计算。
3.设计实现过程
写一个Toy计算器并不是很大的工程核心思路其实就是创建两个字符串一个字符串作为显示给用户看的字符串一个字符串作为最后扔给JS计算库计算的字符串。
var expression ; //实际运算的表达式整体的HTML结构是一个表单
div classcenterh1$Gorsonpy$ 的 计算器/h1a hrefhttps://github.com/guuibayer/simple-calculator target_blanki classfa fa-github/i/aform namecalculatorbutton typebutton idclear classbtn other valueclear onclickclear();$CE$/buttonbutton typebutton idclear classbtn other valueBACK onclickback();⌫/buttoninput typetext iddisplaybrinput typebutton classbtn number value7 onclickget(this.value);input typebutton classbtn number value8 onclickget(this.value);input typebutton classbtn number value9 onclickget(this.value);input typebutton classbtn operator value onclickget(this.value);input typebutton classbtn operator value( onclickget(this.value);input typebutton classbtn operator valuelog onclickget_with_left_bracket(this.value);input typebutton classbtn operator valuetan onclickget_with_left_bracket(this.value);input typebutton classbtn operator valueatan onclickget_with_left_bracket(this.value);brinput typebutton classbtn number value4 onclickget(this.value);input typebutton classbtn number value5 onclickget(this.value);input typebutton classbtn number value6 onclickget(this.value);input typebutton classbtn operator value* onclickget(this.value);input typebutton classbtn operator value) onclickget(this.value);button typebutton classbtn operator valuex^y onclickpow();$x^y$/buttoninput typebutton classbtn operator valueasin onclickget_with_left_bracket(this.value);input typebutton classbtn operator value!
...按钮关联一些函数:
/* recebe os valores */function get(value) {if (document.getElementById(display).value errMsg) {document.getElementById(display).value ;}document.getElementById(display).value value;expression value;}function pow() {if (document.getElementById(display).value errMsg) {document.getElementById(display).value ;}document.getElementById(display).value ^;expression ^;}...按下等号的时候计算:
function calculates() {document.getElementById(display).value ;var result ;if (expression ) {document.getElementById(display).value ;expression ;} else {try {result math.evaluate(expression, customSymbols);} catch (error) {console.error(An error occurred while evaluating the expression: error);result errMsg; // 设置一个错误提示}document.getElementById(display).value result;expression ;}};4.程序性能改进
主要是选一个好轮子。因为性能的瓶颈一定是在于正则匹配和解析表达式。自己去胡乱优化也不会有什么效果。我选用的是Math.js库而非原生的eval()因为原生的eval()算的不准而且会有安全问题因为eval总是试图解析字符串内容无论其是否具有危害。
math.config({number: BigNumber,precision: 64,});下面是一个 0.1 0.2 ? 0.1 0.2 ? 0.10.2?的问题对比一下 原生的eval math. evaluate:
5.异常处理
就是在math.evaluate解析的时候catch异常并赋予用户一个提示信息.此外对于除0溢出等情况evaluate自动会给出一个infinity。
try {result math.evaluate(expression, customSymbols);
} catch (error) {console.error(An error occurred while evaluating the expression: error);result errMsg; // 设置一个错误提示
}6.单元测试展示
在单元测试这里我遇到了一些困难主要是JS的这个引文件功能实在太bug了会遇到各种各样难以明说的错误。因为要做单元测试用Jest框架就要把之前内嵌在html的js文件分离出来然而这样又会有新的问题就是js之间互相引用的问题。经过一番折腾我得出一个折中的办法要做单元测试的时候把文件分离出来做单元测试要运行的话把js代码贴回去。 因为我的代码很短所以单元测试很快就做好了
test(test add 7 8 15, () {clearf();get(7)get()get(8)calculates()expect(document.getElementById(display).value).toBe(15)
})test(test sub 1 - 2 -1, () {clearf();get(1)get(-)get(2)calculates()expect(document.getElementById(display).value).toBe(-1)
})
...7.心路历程和收获 为了设计一个比较美观的前端页面我去学习了HTMLCSSJS这前端三件套。体验到了前端的魅力所在。我学习了如何让自己的代码变得用户友好能够考虑到各种错误情况并给予用户错误信息而不是程序崩溃同时学习了如何对代码做好单元测试。