软工作业1——实现计算器

本文讲述了作者完成一个具有可视化界面的计算器作业的过程,涉及Gitcode项目管理、HTML/CSS/JS实现、PSP表格的时间管理、解题思路、接口设计、性能优化、单元测试和异常处理,以及开发初学者的心得体会。
摘要由CSDN通过智能技术生成
这个作业属于哪个课程<班级的链接>
这个作业要求在哪里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项目

Gitcode项目地址

二、PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2025
· Estimate· 估计这个任务需要多少时间2015
Development开发600620
· Analysis· 需求分析 (包括学习新技术)3035
· Design Spec· 生成设计文档6055
· Design Review· 设计复审1015
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)4050
· Design· 具体设计4045
· Coding· 具体编码300320
· Code Review· 代码复审5040
· Test· 测试(自我测试,修改代码,提交修改50255
Reporting报告150100
· Test Report· 测试报告3030
· Size Measurement· 计算工作量1515
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划6075
合计14751710

三、解题思路描述

首先,使用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 进行前端单元测试

  1. 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);
            }
        }

九、心得体会

作为一个初次接触开发的人,在此计算器作业任务的设计过程中,我入手时多有迷茫,对于开发的流程也有很多不熟悉甚至不知道的地方。但是努力从多方了解资料,在不断探索的过程中,我学习到了很多前端的知识,但因为学习时间不够长,我只能尽力实现任务要求中的功能,保证了功能的完整性,但是无法做太多性能效率方面的改进,也有很多不合理之处。
同时,这也是我第一次尝试为自己写的代码做单元测试,查找了较多资料,也了解了几种测试的方法,虽然尝试的过程中遇到了很多不懂的地方,花费了大量时间,也出现过实现不了的情况,但不断的尝试也让我对测试的概念和方法有了更多的了解。但是我知道自己写的代码还有很多很多很多不足之处。希望在下一次作业到来之前我能尽可能地学习更多开发知识,真正理解开发的流程,做出更加完整的,符合规范的项目。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值