A6:编写计算器界面程序

  • 编写计算器界面程序

一、计算器程序功能

基本运算:

支持加(+)、减(-)、乘(×)、除(÷)、取余(%)运算

  • 完整界面:包含数字键0-9、小数点、等号

  • 控制功能:清除©、退格(⌫)

  • 显示区域:顶部显示计算结果和输入

二、实现

使用鼠标点击按钮,当是数字键时累加显示到edit中。

  • 使用lastNum存储第一个数据。使用op存储运算符。
  • 当按键是=时,计算结果。
  • 退格实现,先检查edit中字符个数是否大于1,大于则去掉最后一位,实现退格。同时更新edit显示,并把isNewNum置为假。

三、import导入库

import 语句将一个外部命名空间导入到当前命名空间。

import 语句首先会在当前命名空间下查找同名对象是否存在,查找时不会触发命名空间的元方法,如果同名对象已经存在并且不是指向相同的库 - 则会报错。import保证不会在同一线程重复加载相同的库。外部库内的代码在一个线程中仅运行一次。

  • import 语句内使用的库命名空间第一个字符不能为下划线 _。
  • aardio的库有三种:
    • 内置库(Builtin Libraries)
    • 公共库(Common libraries)
    • •用户库(User Libraries)

四、程序

复制代码
//创建一个功能完整的aardio计算器界面程序
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio 计算器";right=319;bottom=444;bgcolor=0xFFFFFF;border="dialog";max=false)
winform.add(
btn0={cls="plus";text="0";left=11;top=383;right=164;bottom=431;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=14};
btn1={cls="plus";text="1";left=11;top=328;right=85;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=1};
btn2={cls="plus";text="2";left=90;top=328;right=164;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=2};
btn3={cls="plus";text="3";left=169;top=328;right=243;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=3};
btn4={cls="plus";text="4";left=11;top=273;right=85;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=4};
btn5={cls="plus";text="5";left=90;top=273;right=164;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=5};
btn6={cls="plus";text="6";left=169;top=273;right=243;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=6};
btn7={cls="plus";text="7";left=11;top=218;right=85;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=7};
btn8={cls="plus";text="8";left=90;top=218;right=164;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=8};
btn9={cls="plus";text="9";left=169;top=218;right=243;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=9};
btnAdd={cls="plus";text="+";left=248;top=328;right=308;bottom=376;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=13};
btnBack={cls="plus";text='\u232B';left=92;top=164;right=166;bottom=212;bgcolor=0xCEC0C0;font=LOGFONT(h=-19);z=20};
btnC={cls="plus";text="C";left=11;top=163;right=85;bottom=211;bgcolor=0xC0C0C0;font=LOGFONT(h=-19);z=18};
btnDiv={cls="plus";text="÷";left=248;top=163;right=308;bottom=211;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=10};
btnDot={cls="plus";text=".";left=169;top=383;right=243;bottom=431;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=15};
btnEqual={cls="plus";text="=";left=248;top=383;right=308;bottom=431;bgcolor=0xFF9900;color=0xFFFFFF;font=LOGFONT(h=-19);z=16};
btnMod={cls="plus";text="%";left=168;top=164;right=242;bottom=212;bgcolor=0xEADDDD;font=LOGFONT(h=-19);z=19};
btnMul={cls="plus";text="×";left=248;top=218;right=308;bottom=266;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=11};
btnSub={cls="plus";text="-";left=248;top=273;right=308;bottom=321;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=12};
edit={cls="edit";text="0";left=11;top=21;right=308;bottom=145;align="right";border=1;edge=1;font=LOGFONT(h=-43);readonly=1;z=17}
)
/*}}*/

var lastNum = 0; // 存储上一次输入的数字
var op = ""; // 存储当前操作符
var isNewNum = true; // 标记是否开始输入新数字
var currentNum = 0;  // 存储当前输入的数字

// 计算逻辑
var calculate = function(){
    currentNum = tonumber(winform.edit.text) || 0;
    select(op) {
        case "+" { lastNum = lastNum + currentNum; }
        case "-" { lastNum = lastNum - currentNum; }
        case "×" { lastNum = lastNum * currentNum; }
        case "%" {lastNum  = lastNum % currentNum; }
        case "÷" { 
            if(currentNum != 0) lastNum = lastNum / currentNum; 
            else {
                winform.edit.text = "Error";
                isNewNum = true;
                return;
            	}
            }
        else { lastNum = currentNum; }
    }
    winform.edit.text = tostring(lastNum);
}

// 批量注册数字键响应
var btns = {
    winform.btn0, winform.btn1, winform.btn2, winform.btn3, 
    winform.btn4, winform.btn5, winform.btn6, winform.btn7, 
    winform.btn8, winform.btn9
};

for(i=1;#btns;1){
    var btn = btns[i];
    btn.oncommand = function(){
        if(isNewNum){
            winform.edit.text = owner.text;
            isNewNum = false;
        }
        else {
            if(winform.edit.text == "0") winform.edit.text = owner.text;
            else winform.edit.text = winform.edit.text ++ owner.text;
        }
    }
}

// 运算符响应
var setOperator = function(nextOp){
    calculate();
    op = nextOp;
    isNewNum = true;
}

winform.btnAdd.oncommand = function(){ setOperator("+") }
winform.btnSub.oncommand = function(){ setOperator("-") }
winform.btnMul.oncommand = function(){ setOperator("×") }
winform.btnDiv.oncommand = function(){ setOperator("÷") }
winform.btnMod.oncommand = function(){ setOperator("%") }

winform.btnEqual.oncommand = function(){
    calculate();
    op = "";
    isNewNum = true;
}

winform.btnDot.oncommand = function(){
    if(isNewNum) {
        winform.edit.text = "0.";
        isNewNum = false;
    }
    elseif( !string.find(winform.edit.text, "\.") ){
        winform.edit.text = winform.edit.text ++ ".";
    }
}

winform.btnC.oncommand = function(){
    winform.edit.text = "0";
    lastNum = 0;
    op = "";
    isNewNum = true;
}

// 退格
winform.btnBack.oncommand = function(){   
        var currentText = tostring(winform.edit.text)
        if(#currentText > 1){
            currentText = string.left(currentText,#currentText-1);
        }
        else {
            currentText = "0";
            isNewInput = true;
        }
       winform.edit.text =currentText ;
       isNewNum = false; 
}

// 设置按钮交互样式
for(name,ctrl in winform.eachControl("plus")) {
    ctrl.skin({
        background = {
            hover = 0xFFDCDCDC;
            active = 0xFFB4B4B4;
          
        }
    })
}

winform.show();
win.loopMessage();
相关推荐
Sarvartha4 小时前
LangChain 入门核心知识学习笔记
笔记·学习·langchain
QZ_orz_freedom4 小时前
后端学习笔记-苍穹外卖
笔记·学习
Lips6117 小时前
2026.1.25力扣刷题笔记
笔记·算法·leetcode
WK100%7 小时前
二叉树经典OJ题
c语言·数据结构·经验分享·笔记·链表
googleccsdn8 小时前
ENSP Pro LAB笔记:配置M-LAG双归接入三层网络(V-STP + Monitor Link + OSPF)
网络·笔记·网络协议
Hello_Embed9 小时前
USB 虚拟串口源码改造与 FreeRTOS 适配
笔记·单片机·嵌入式·freertos·usb
曦月逸霜9 小时前
深入理解计算机系统——学习笔记(持续更新~)
笔记·学习·计算机系统
koo3649 小时前
pytorch深度学习笔记18
pytorch·笔记·深度学习
hetao17338379 小时前
2026-01-22~23 hetao1733837 的刷题笔记
c++·笔记·算法