【HarmonyOS-ArkTS语言】计算器的实现【合集】

目录

😋环境配置:华为HarmonyOS开发者

🎯学习小目标:

📺演示效果:

📖实验步骤及方法:

1. 在index.ets文件中通过 @Extend(Button) 装饰器扩展Button 组件设置按钮样式函数myButton

2. 设置运算符枚举类型 Operator

3. 设置获取运算符优先级的函数 getOperatorPrecedence

4.设置计算表达式结果的函数 calculateResult

5.设置主界面组件 Index

6.模拟机运行测试 

👋实验小结


😋环境配置:华为HarmonyOS开发者

🎯学习小目标:

  1. 创建一个工程,在index.ets文件中进行编辑

  2. 使用按钮组件设计计算器的布局

  3. 点击按钮后将计算过程显示在Text组件中

  4. 点击等号显示计算结果

📺演示效果:

  

图1 预览器演示效果

📖实验步骤及方法:

1. 在index.ets文件中通过 @Extend(Button) 装饰器扩展Button 组件设置按钮样式函数myButton

@Extend(Button)
function myButton() {
.type(ButtonType.Normal)
.width("270px")
.height("270px")
.backgroundColor(Color.Black)
.border({ color: Color.White, style: BorderStyle.Solid, width: 2 })
.fontSize(40)
.fontColor(Color.White)
.fontWeight(800)
.borderRadius(0)
}

2. 设置运算符枚举类型 Operator

enum Operator {PLUS = '+',MINUS = '-',TIMES = '*',DIVIDE = '/'
}

3. 设置获取运算符优先级的函数 getOperatorPrecedence

function getOperatorPrecedence(operator: string): number {switch (operator) {case Operator.PLUS:case Operator.MINUS:return 1;case Operator.TIMES:case Operator.DIVIDE:return 2;default:throw new Error("Invalid operator: " + operator);}
}

4.设置计算表达式结果的函数 calculateResult

function calculateResult(expression: string): number {// 去除表达式两端可能存在的空白字符expression = expression.trim();// 使用两个栈,一个用于存储操作数,一个用于存储运算符let operandStack: number[] = [];let operatorStack: string[] = [];// 用于临时存储数字字符组成的字符串,以便转换为数字let tempNumber = "";for (let i = 0; i < expression.length; i++) {let char = expression[i];if (char >= '0' && char <= '9' || char === '.') {// 如果是数字字符或小数点,累加到临时数字字符串中tempNumber += char;} else if (char === '+' || char === '-' || char === '*' || char === '/') {// 如果是运算符// 先将之前临时存储的数字转换为实际数字并压入操作数栈if (tempNumber!== "") {operandStack.push(Number(tempNumber));tempNumber = "";}// 处理运算符栈,按照优先级进行运算while (operatorStack.length > 0 &&getOperatorPrecedence(operatorStack[operatorStack.length - 1]) >= getOperatorPrecedence(char)) {let operator = operatorStack.pop();let operand2 = operandStack.pop();+let operand1 = operandStack.pop();// 验证弹出的操作数是否有效if (Operand1 === undefined || operand2 === undefined) {throw new Error("Invalid operation: missing operand(s)");}if (operator === Operator.PLUS) {operandStack.push(Operand1 + operand2);} else if (operator === Operator.MINUS) {operandStack.push(Operand1 - operand2);} else if (operator === Operator.TIMES) {operandStack.push(Operand1 * operand2);} else if (operator === Operator.DIVIDE) {operandStack.push(Operand1 / operand2);}}// 将当前运算符压入运算符栈operatorStack.push(char);} else if (char === '(') {// 如果是左括号,直接压入运算符栈operatorStack.push(char);} else if (char === ')') {// 如果是右括号// 先将之前临时存储的数字转换为实际数字并压入操作数栈if (tempNumber!== "") {operandStack.push(Number(tempNumber));tempNumber = "";}// 处理运算符栈,直到遇到左括号while (operatorStack.length > 0 &&operatorStack[operatorStack.length - 1]!== '(') {let operator = operatorStack.pop();let operand2 = operandStack.pop();let operand1 = operandStack.pop();// 验证弹出的操作数是否有效if (Operand1 === undefined || operand2 === undefined) {throw new Error("Invalid operation: missing operand(s)");}if (operator === Operator.PLUS) {operandStack.push(Operand1 + operand2);} else if (operator === Operator.MINUS) {operandStack.push(Operand1 - operand2);} else if (operator === Operator.TIMES) {operandWordStack.push(Operand1 * operand2);} else if (operator ==Operator.DIVIDE) {operandStack.push(Operand1 / operand2);}}// 弹出左括号operatorStack.pop();}}// 处理表达式末尾可能存在的数字if (tempNumber!== "") {operandStack.push(Number(tempNumber));}// 处理运算符栈中剩余的运算符if (operatorStack.length > 0) {let operator = operatorStack.pop();let operand2 = operandStack.pop();let operand1 = operandStack.pop();// 验证弹出的操作数是否有效if (Operand1 === undefined || operand2 === undefined) {throw new Error("Invalid operation: missing operand(s)");}if (operator === Operator.PLUS) {operandStack.push(Operand1 + operand2);} else if (operator === Operator.MINUS) {operandStack.push(Operand1 - operand2);} else if (operator === Operator.TIMES) {operandStack.push(Operand1 * operand2);} else if (operator ==Operator.DIVIDE) {operandStack.push(Operand1 / operand2);}}// 返回最终的计算结果return operandStack[0];
}

5.设置主界面组件 Index

@Entry
@Component
struct Index {@State result: string = ""@State number: number = 0build() {Column() {Row() {Text(this.result).fontSize(50)}Row() {Column() {Button("7").onClick(() => {this.result += "7"}).myButton()}Column() {Button("8").onClick(() => {this.result += "8"}).myButton()}Column() {Button("9").onClick(() => {this.result += "9"}).myButton()}Column() {Button("+").onClick(() => {this.result += "+"}).myButton()}}Row() {Column() {Button("4").onClick(() => {this.result += "4"}).myButton()}Column() {Button("5").onClick(() => {this.result += "5"}).myButton()}Column() {Button("6").onClick(() => {this.result += "6"}).myButton()}Column() {Button("-").onClick(() => {this.result += "-"}).myButton()}}Row() {Column() {Button("1").onClick(() => {this.result += "1"}).myButton()}Column() {Button("2").onClick(() => {thisresult += "2"}).myButton()}Column() {Button("3").onClick(() => {this.result += "3"}).myButton()}Column() {Button("*").onClick(() => {this.result += "*"}).myButton()}}Row() {Column() {Button("0").onClick(() => {this.result += "0"}).myButton()}Column() {Button(".").onClick(() => {this.result += "."}).myButton()}Column() {Button("=").onClick(() => {try {this.result = calculateResult(this.result).toString();} catch (e) {this.result = "Error: " + e.message;}}).myButton()}Column() {Button("/").onClick(() => {this.result += "/"}).myButton()}}Row() {Column() {Button("C").onClick(() => {this.result = "";this.number = 0;}).myButton()}}}}
}

6.模拟机运行测试   
  

👋实验小结

        本次计算器应用开发实验主要围绕 index.ets 文件展开。利用按钮组件顺利完成布局设计,数字、运算符及功能按钮排列有序,操作逻辑清晰直观。点击事件处理精准,计算过程能实时且无误地呈现在 Text 组件,点击等号后计算函数高效解析表达式并给出准确结果,达成核心功能要求。然而,实验中也发现一些待改进之处,例如错误提示不够详尽,难以助力用户快速定位输入错误;界面美观性欠佳,颜色与样式缺乏精致感;响应式设计不足,在不同屏幕规格下适配性差。总体而言,本次实验已成功构建起基本功能框架,后续将针对上述问题深入探究优化方案,不断打磨细节,在完善计算器功能与提升用户体验的道路上持续精进,进而提升自身编程与应用开发的综合能力水平。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503255.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…

【连续学习之LwM算法】2019年CVPR顶会论文:Learning without memorizing

1 介绍 年份&#xff1a;2019 期刊&#xff1a; 2019CVPR 引用量&#xff1a;611 Dhar P, Singh R V, Peng K C, et al. Learning without memorizing[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 5138-5146. 本文提…

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…

【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站

为了实现一个基于Spring和Spring MVC的汉服文化宣传网站,我们需要创建一个简单的Web应用程序来展示汉服文化和相关信息。这个系统将包括以下几个部分: 数据库表设计:定义文章、用户和评论的相关表。实体类:表示数据库中的数据。DAO层接口及MyBatis映射文件:用于与数据库交…

Apache Celeborn 在B站的生产实践

背景介绍 Shuffle 演进 随着B站业务的飞速发展,数据规模呈指数级增长,计算集群也逐步从单机房扩展到多机房部署模式。多个业务线依托大数据平台驱动核心业务,大数据系统的高效性与稳定性成为公司业务发展的重要基石。如图1,目前在大数据基础架构下,我们主要采用 Spark、Fl…

计算机网络:网络层知识点及习题(一)

网课资源&#xff1a; 湖科大教书匠 1、概述 网络层实现主机到主机的传输&#xff0c;主要有分组转发和路由选择两大功能 路由选择处理机得出路由表&#xff0c;路由表再生成转发表&#xff0c;从而实现分组从不同的端口转发 网络层向上层提供的两种服务&#xff1a;面向连接…

深入刨析数据结构之排序(上)

目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版&#xff0c;后头用完了删了 用习惯的2019图标 给兄弟我干没了&#xff1f;&#xff1f;&#xff1f; 其他老哥说什么卸载关联重新下 &#xff0c;而且还要什么撤销保存原来的备份什么&#xff0c;兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…

huggingface 下载方法 测试ok

目录 python下载方法&#xff1a; 设置环境变量 ~/.bashrc 缓存目录&#xff0c;默认模型下载目录 安装方法&#xff1a; python 下载无token&#xff1a; python 下载带token 常见报错 登录后创建Read token 2.3 创建token 使用token登录 python下载方法&#xff1…

【网络安全技术与应用】(选修)实验8 入侵检测

参考内容:【入侵检测】window下安装snort_windows安装snort-CSDN博客 一、实验目的 深入理解入侵检测系统的原理和工作方式,熟悉入侵检测工具Snort在Windows操作系统中的安装、配置及使用方法。二、实验内容 安装WinPcap及Snort;启动Snort;自编写简单的报警规则并进行测试;…

Linux驱动开发 gpio_get_value读取输出io的电平返回值一直为0的问题

当时gpio子系统进行读取时返回必定是0 因此&#xff0c;首先必须使用platform驱动来管理gpio和pinctrl子系统&#xff0c;然后如果按照正点原子所教的设备树引脚设置为0x10B0则会导致读取到的电平值为0。 解决方法&#xff1a; 将设备树中的引脚设置为 pinctrl_gpioled: gpio…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…

常用LabVIEW算法及应用

在LabVIEW项目中&#xff0c;算法的应用是提高系统性能、实现特定功能、完成复杂任务的核心。LabVIEW作为一种图形化编程语言&#xff0c;允许用户通过直观的图形编程来实现各种复杂的算法。这些算法广泛应用于控制系统、数据采集、信号处理、图像处理、机器学习等领域。了解常…

AI Agent 开发共学招募 | 来 Sui 上探索自治智能的边界

Agent 一词源自拉丁语 “Agere”&#xff0c;意为“行动&#xff08;to do&#xff09;”。在大语言模型&#xff08;LLM&#xff09;的语境下&#xff0c;Agent 指的是能够感知环境、进行决策并执行任务的智能实体。 与传统的 RPA 相比&#xff0c;后者只能在预设的条件下执行…

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式&#xff0c;一种从新创建整个项目&#xff0c;一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目&#xff1a; 选择包名、API版本与算法交互的语言&#xff1a; 选择C版本&#xff1a; 创建完之后&#xff0c;可…

计算机网络 —— 网络编程实操(1)(UDP)

计算机网络 —— 网络编程实操&#xff08;UDP&#xff09; 套接字端口套接字的定义为什么需要套接字&#xff1f; 套接字的分类1. 按照通信协议分类2. 按照地址族&#xff08;Address Family&#xff09;分类3. 按照通信模式分类 socket APIsockaddr结构 使用接口套接字初始化…

【HarmonyOS-ArkTS语言】面向对象【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f3af;学习小目标&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1.在entry/src/main/ets/utils下创建MyClass.ets和MyConfig.ets文件​编辑 2.在MyConfig.ets中创建Interface Config 和enum l…

Excel | 空格分隔的行怎么导入excel?

准备工作&#xff1a;windows&#xff0c;一个记事本程序和微软的Excel软件。 打开记事本&#xff0c;选中所有内容&#xff0c;按CtrlA全选&#xff0c;然后复制(CtrlC)。 在Excel中&#xff0c;定位到你想粘贴的单元格&#xff0c;按CtrlV进行粘贴。粘贴后&#xff0c;你会在…

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…