这个作业属于哪个课程 | <班级的链接> |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/forums/ssynkqtd-05?spm=1001.2014.3001.6685 |
这个作业的目标 | 完成一个具有可视化界面的计算器 |
其他参考文献 | https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html |
前言
本次作业的任务目标是完成一个具有可视化界面的计算器,没有语言限制。考虑到自己没有过开发经验且刚开始了解前端语言,在一些相关网站上学习后,决定尝试使用html,css,js来实现此次作业的任务。
演示视频
一、Gitcode项目
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 25 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 600 | 620 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 35 |
· Design Spec | · 生成设计文档 | 60 | 55 |
· Design Review | · 设计复审 | 10 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 40 | 50 |
· Design | · 具体设计 | 40 | 45 |
· Coding | · 具体编码 | 300 | 320 |
· Code Review | · 代码复审 | 50 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改 | 50 | 255 |
Reporting | 报告 | 150 | 100 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 15 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 75 |
合计 | 1475 | 1710 |
三、解题思路描述
首先,使用HTML创建一个表单和一个只读的文本框,用于显示计算结果。
然后,使用HTML的input标签创建数字按钮、运算符按钮和功能按钮。每个按钮添加一个onclick事件处理程序。当用户单击按钮时,这个事件处理程序将被调用,并执行相应的操作(例如,将数字或运算符添加到文本框中)。
最后,使用JavaScript的eval函数来计算表达式的值,并将结果显示在文本框中。当用户按下等号键时,将调用eval函数进行计算,并将结果显示在文本框中。另外,定义一个JavaScript函数,名为insertDecimalPoint(),用于实现小数点的功能。
通过这个简单的计算器,用户可以执行基本的加、减、乘、除,归零以及三角函数,平方,幂操作。
四、接口设计和实现过程
1.在HTML设计计算器的界面结构:
设计输入框、数字按钮、运算符按钮、等号按钮、清除按钮和退格按钮等元素。每个按钮都有一个onclick事件处理程序,用于响应用户的点击操作。
(1) 当用户点击数字按钮时,onclick事件处理程序将相应的数字添加到输入框中;
(2)当用户点击运算符按钮时,onclick事件处理程序根据当前的运算符进行相应的数学运算,并将结果添加到输入框中;
(3)当用户点击等号按钮时,onclick事件处理程序计算当前表达式的结果并显示在输入框中。
2.使用JavaScript实现计算器的逻辑功能:
设计获取用户输入的表达式、根据运算符执行相应的数学运算、计算表达式的结果并显示在文本框中等功能。定义一个JavaScript函数eval(),用于计算表达式的值。当用户点击等于号按钮时,eval()函数会被调用,计算当前表达式的值并将结果显示在输入框中。
3.样式设计和美化:
(1)定义一个名为".calculator"的类,设计计算器的外框,包括边框(border),边框圆角(border-radius),内边距(padding),背景颜色(background-color),阴影效果等。
(2)设置CSS样式表,用于定义HTML中的的样式,设置display,justify-content,align-items,background-color等属性,修改页面背景色,使页面的内容在水平和垂直方向上都居中显示。
(3)设置CSS样式表,应用于HTML中的标签,并设置type属性为"text",设计文本输入框的样式,包括宽度,内边距,边框圆角和边框颜色等。
(4)设置CSS样式表,应用于HTML中的标签,并设置type属性为"button",设计所有按钮的样式,包括宽度、边框圆角、背景颜色、阴影效果和边框颜色等。再通过style属性修改个别按钮的颜色。
4.html转exe
五、关键代码展示
1.在HTML设计计算器的界面结构,设计输入框、数字按钮、运算符按钮、等号按钮、清除按钮和退格按钮等元素。每个按钮都有一个onclick事件处理程序,用于响应用户的点击操作。
<div class="calculator">
<form name="calculator">
<input type="text" name="display" readonly>
<br><br>
<input type="button" value="1" onclick="calculator.display.value += '1'">
<input type="button" value="2" onclick="calculator.display.value += '2'">
<input type="button" value="3" onclick="calculator.display.value += '3'">
<input type="button" value="+" onclick="calculator.display.value += '+'">
<br><br>
<input type="button" value="4" onclick="calculator.display.value += '4'">
<input type="button" value="5" onclick="calculator.display.value += '5'">
<input type="button" value="6" onclick="calculator.display.value += '6'">
<input type="button" value="-" onclick="calculator.display.value += '-'">
<br><br>
<input type="button" value="7" onclick="calculator.display.value += '7'">
<input type="button" value="8" onclick="calculator.display.value += '8'">
<input type="button" value="9" onclick="calculator.display.value += '9'">
<input type="button" value="*" onclick="calculator.display.value += '*'">
<br><br>
<input type="button" value="." onclick="insertDecimalPoint()">
<input type="button" value="0" onclick="calculator.display.value += '0'">
<input type="button" value="/" onclick="calculator.display.value += '/'">
<br><br>
<input type="button" value="^" onclick="calculator.display.value = Math.pow(calculator.display.value, 2)">
<input type="button" value="^^" onclick="calculator.display.value = Math.pow(calculator.display.value, 3)">
<input type="button" value="CE" onclick="calculator.display.value = calculator.display.value.slice(0, -1)"
style="background-color: rgb(246, 180, 94);">
<input type="button" value="C" onclick="calculator.display.value = ''"
style="background-color: rgb(244, 131, 108);">
<br><br>
<input type="button" value="tan(" onclick="calculator.display.value = Math.tan(calculator.display.value)">
<input type="button" value="sin(" onclick="calculator.display.value = Math.sin(calculator.display.value)">
<input type="button" value="cos(" onclick="calculator.display.value = Math.cos(calculator.display.value)">
</form>
</div>
2.定义一个JavaScript函数eval(),用于计算表达式的值。当用户点击等于号按钮时,eval()函数会被调用,计算当前表达式的值并将结果显示在输入框中。
<input type="button" value="=" onclick="calculator.display.value =val(calculator.display.value)"
style="background-color: rgb(145, 187, 240);">
3.设置CSS样式表,设计页面样式,计算器外框样式,输入框样式,按钮样式等。
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #fbf8f7;
}
.calculator {
border: 2px solid #c6c5c500;
border-radius: 5px;
padding: 40px;
background-color: #eede90;
box-shadow: 10px 10px 4px rgba(0, 0, 0, 0.1);
border-color: rgba(255, 228, 196, 0);
}
input[type=text] {
width: 85%;
margin-bottom: 10px;
padding: 10px;
font-size: 18px;
border-radius: 8px;
border-color: rgba(255, 228, 196, 0);
}
input[type=button] {
width: 20%;
margin: 1%;
padding: 5px;
font-size: 18px;
border-radius: 8px;
background-color: white;
box-shadow: 2px 3px 5px rgb(95, 94, 94);
border-color: rgba(255, 228, 196, 0);
}
</style>
六、性能改进
最开始涉及时主要考虑运算功能的实现,之后发现没有考虑到小数点功能。
定义一个JavaScript函数,名为insertDecimalPoint(),用于实现小数点的功能。
具体执行过程如下:
首先,通过indexOf(‘.’)方法查找输入框内的小数点位置,并将结果存储在变量index中。
如果index的值为-1,表示小数点不存在于输入框内,此时会在输入框内的值末尾添加一个小数点。
如果index的值不为-1,表示小数点已经存在于输入框内,此时会将小数点移动到合适的位置。这是通过截取字符串实现的,将小数点前后的部分分别存储在newValue变量中,然后将newValue赋值给显示屏的值。
<script>
function insertDecimalPoint() {
var index = document.calculator.display.value.indexOf('.');
if (index == -1) {
document.calculator.display.value += '.';
} else {
var newValue = document.calculator.display.value.substring(0, index + 1) + document.calculator.display.value.substring(index + 1);
document.calculator.display.value = newValue;
}
}
</script>
七、单元测试
1.第一次做单元测试,对于怎样设计代码来测试还是有很多不懂之处,只能在各种网站参考很多方式,进行多种尝试,遇到非常多意外的情况,比如安装包下载不了,路径寻找不当等,都无法得出比较满意的结果,最后做出了两种尝试。
(1)在python的flask框架
借鉴了网络上的思路,但是还没有搞懂怎么同时处理,也不太懂得怎么测试覆盖率。
部分测试代码
def test_addition():
with app.test_client() as client:
response = client.get('/')
response = client.post('/', data=b'3+4') # 输入加法表达式并提交
assert b'7' in response.data # 检查计算结果是否正确
def test_multiplication():
with app.test_client() as client:
response = client.get('/')
assert b'*' not in response.data # 检查是否没有显示乘法符号
response = client.post('/', data=b'3*4') # 输入乘法表达式并提交
assert b'12' in response.data # 检查计算结果是否正确
def test_trigonometric_functions(self):
with self.app as client:
response = client.get('/')
response = client.post('/', data=b'sin(') # 输入正弦函数表达式并提交
assert b'0.0' in response.data # 检查计算结果是否正确
response = client.post('/', data=b'cos(') # 输入余弦函数表达式并提交
assert b'1.0' in response.data # 检查计算结果是否正确
response = client.post('/', data=b'tan(') # 输入正切函数表达式并提交
assert b'0.0' in response.data # 检查计算结果是否正确
只能做到逐个功能测试,得到单个结果
(2)在js中使用jest
而后又参考了Jest 进行前端单元测试
- package.json 中的命令
{
"devDependencies": {
"jest": "^29.7.0",
"jsdom": "^22.1.0"
},
"scripts": {
"test": "jest",
"coverage": "jest --coverage"
}
}
2.测试代码
因为我的运算符设计思路和参考的博客不太相同,测试代码自行做了修改,部分展示如下
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Calculator from './Calculator';
test('Calculator', () => {
it('should calculate the cosine of the input value', () => {
const { getByText } = render(<Calculator />);
const input = getByText('input');
fireEvent.change(input, { target: { value: '0' } });
const result = getByText('结果:');
expect(result).toHaveTextContent('1');
});
});
test('Button', () => {
it('should increment the display value by 1', () => {
const calculator = {
display: {
value: ''
}
};
document.querySelector('input[type="button"][value="1"]').click(); // 模拟点击按钮
expect(calculator.display.value).toBe('1'); // 断言计算器的显示值应该增加1
});
});
部分功能测试结果如下
PASS ./Calculator.test.js
Calculator
✓ should clear the input field when the CE button is clicked (2ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.355s
PASS ./Calculator.test.js
Calculator
✓ should calculate the sine of the input value (3ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.456s
覆盖率
八、异常处理
文本框输入异常处理:通过try-catch块来捕获可能发生的异常。在calculate()函数中,首先获取文本框的值,然后执行计算逻辑,并将结果显示在文本框中。如果在任何时候发生异常,它将被catch块捕获,并显示一个包含错误消息的警告。
function calculate() {
try {
// 获取文本框的值
var displayValue = document.calculator.display.value;
//计算逻辑
// ...
// 将结果显示在文本框中
document.calculator.display.value = result;
} catch (error) {
// 处理异常情况
alert("发生错误:" + error.message);
}
}
九、心得体会
作为一个初次接触开发的人,在此计算器作业任务的设计过程中,我入手时多有迷茫,对于开发的流程也有很多不熟悉甚至不知道的地方。但是努力从多方了解资料,在不断探索的过程中,我学习到了很多前端的知识,但因为学习时间不够长,我只能尽力实现任务要求中的功能,保证了功能的完整性,但是无法做太多性能效率方面的改进,也有很多不合理之处。
同时,这也是我第一次尝试为自己写的代码做单元测试,查找了较多资料,也了解了几种测试的方法,虽然尝试的过程中遇到了很多不懂的地方,花费了大量时间,也出现过实现不了的情况,但不断的尝试也让我对测试的概念和方法有了更多的了解。但是我知道自己写的代码还有很多很多很多不足之处。希望在下一次作业到来之前我能尽可能地学习更多开发知识,真正理解开发的流程,做出更加完整的,符合规范的项目。