微信小程序开发实验五:鸿蒙开发入门及计算器开发
| 姓名和学号? | 李逸俊,23020007064 |
|---|---|
| 本实验属于哪门课程? | 中国海洋大学26夏《移动软件开发》 |
| 实验名称? | 实验5:鸿蒙开发入门及计算器开发 |
| 博客地址? | |
| 代码仓库地址? | https://github.com/nihao3079-commits/wechat-miniprogram05 |
一、实验内容
本次实验基于 DevEco Studio 和 HarmonyOS 开发环境,完成了一个具有科学计算功能的移动端计算器应用。实验首先完成了开发环境配置与 Phone 模拟器创建,并通过运行 Hello World 对开发环境进行验证。在此基础上,使用 ArkTS 完成计算器界面、表达式解析、数学函数和历史记录等功能,实现了从普通四则运算到科学计算器的逐步扩展。
工程主要由以下几个部分组成:
1. 用户界面与交互
主要页面为 entry/src/main/ets/pages/Index.ets。该文件负责计算器页面的整体布局、按钮创建、输入处理、结果显示和历史记录交互。界面采用科学计算器风格,将功能划分为科学函数区、数字键盘区和运算符区域,并支持 AC、DEL、括号、±、小数点和等号等基本操作。
用户输入会先保存为内部真实表达式。例如输入 2 × sqrt(9) 时,内部表达式保存为类似 2*sqrt(9),再交由表达式解析器进行计算。计算结果可以实时预览,按下 = 后保存计算历史。
2. 表达式解析
entry/src/main/ets/utils/ExpressionParser.ets 负责对用户输入的数学表达式进行解析和计算。该模块采用递归下降解析方式,根据运算符优先级逐层解析表达式,从而支持多操作数计算、括号、负数、幂运算和阶乘等功能。
目前支持:
- 加、减、乘、除
- 括号和多层嵌套表达式
- 一元正负号
- 幂运算
^ - 阶乘
! - 常量
pi和e sqrt()、square()、power()、reciprocal()、percent()sin()、cos()、tan()、ln()、log()
对于除零、非法括号、非法函数参数以及超出函数定义域等情况,解析器返回无效结果,由界面统一处理。
3. 数学函数模块
entry/src/main/ets/utils/MathFunctions.ets 对具体数学运算进行封装,包括平方根、平方、幂、倒数、百分数、阶乘以及三角函数和对数函数等。将数学运算从页面逻辑中分离后,可以减少 Index.ets 中的计算代码,提高工程的模块化程度,也方便后续继续增加科学计算功能。
4. 测试与工程验证
项目中增加了 ExpressionParser 和 MathFunctions 对应的测试代码,并通过直接调用生产模块的方式验证计算逻辑。测试覆盖普通四则运算、运算优先级、括号、负数、小数、幂运算、阶乘、科学函数、非法输入和除零等典型情况。
实验过程中还通过 Phone 模拟器进行了实际运行测试,对界面布局、按钮输入、实时预览、历史记录以及异常情况进行了多轮验证。
二、问题总结与体会
实验过程中遇到的问题主要集中在开发环境、表达式解析、负数处理、科学函数输入、界面布局以及异常结果显示等方面。
首先,在环境配置阶段,HarmonyOS Phone 模拟器最初因为虚拟化相关组件配置问题无法启动。经过检查发现当前 Windows 11 Home 环境下无法直接使用完整 Hyper-V,因此改为启用 Windows Hypervisor Platform 和 Virtual Machine Platform,重启后模拟器可以正常启动,最终顺利完成 Hello World 环境验收。
其次,在计算器功能开发过程中,最初的实现只能处理较简单的两个操作数,随着需求增加,需要支持多个操作数、运算优先级和括号嵌套。为解决这一问题,将原本集中在页面中的解析逻辑独立为 ExpressionParser,采用递归下降方法重新组织解析过程,使表达式能够按照优先级正确计算。
负数输入也是实验中的一个难点。例如在 78 - -2 × -6 这种输入中,连续减号容易被误认为连续运算符。最终采用在内部表达式中真实加入负数括号结构的方法,例如形成 78-(-2*(-6,并在用户按下 = 时自动补齐缺失的右括号。这样既保持了表达式结构清晰,也方便解析器进行统一处理。
在加入科学函数后,又遇到了函数输入和普通操作数之间的区别。例如 √、x² 和 1/x 需要能够直接作用于当前操作数,而 sqrt( 等函数又要支持临时未闭合状态。因此对输入逻辑进行了区分,使科学函数可以参与表达式嵌套,同时保留原有的实时预览和括号自动补全机制。
界面方面,随着科学函数数量增加,最初的按钮布局出现过拥挤、历史记录区域被压缩、按钮顺序不合理等问题。通过重新采用统一的五列布局,并调整显示区、历史记录区和按键区的空间比例,使界面更加接近实际科学计算器,同时保证按钮大小和间距基本统一。
另外,在进行大数测试时发现阶乘等运算可能产生非常大的结果。如果仍然直接显示完整数字,会导致结果区域严重溢出。因此增加了科学计数法显示策略:较大的数使用类似 1.8548264226 × 10^134 的方式显示;当结果超过当前数值范围时,则提示“超出范围”,避免错误地显示为普通计算结果。
最后,在测试过程中还发现了结果状态下重复按 =、计算结果后继续进行运算等边界情况。通过对结果状态和内部真实表达式进行区分,避免直接使用格式化后的显示文本参与后续计算,并对重复等号等操作进行专门处理,提高了程序的稳定性。
本次实验最大的收获是对移动端应用开发中的“界面、业务逻辑和计算核心分离”有了更加直观的认识。开始时只需要实现一个简单的计算器,但随着功能不断增加,逐渐发现如果所有代码都写在页面中,会越来越难维护。因此通过拆分 Index.ets、ExpressionParser.ets 和 MathFunctions.ets,体会到了模块化设计的重要性。同时,在不断进行边界测试的过程中,也认识到一个功能能够“正常计算”并不代表程序已经稳定,还需要考虑错误输入、极端数值、连续操作和用户真实使用习惯等情况。这些经历提高了自己分析问题、定位 Bug 和逐步完善程序的能力。
更多推荐



所有评论(0)