简单的计算器模拟程序的设计和实现

合集下载

简单的计算器模拟程序的设计和实现

简单的计算器模拟程序的设计和实现

简单的计算器模拟程序的设计和实现1.问题描述对任意给定的正确四则运算表达式,程序计算其结果值并输出。

程序无需查错功能,假定所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为 +、-、*、/,表达式以字符 "=" 结束。

程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。

2.设计说明2.1简要的分析根据要求,要先输入包含有+,-,*,/的运算符的表达式,然后经过计算得到正确的答案。

从键盘中输入的是ASCII码,因此要将其转换为十进制的数据然后才能进行计算。

如果输入混合表达式,要将中缀式先变化成后缀式,然后再进行计算。

2.2概要分析2.2.1 定义的数据段用于定义一些中间变量,并将显示在试验界面上,以及提示信息。

data segmentstri db 50 dup(0)exp db 30 dup(0)track db 30 dup(0)instr db 100 dup(0)msg0 db 'please input your formular:',0dh,0ah,'$'msg1 db 0dh,0ah,'wrong input','$'msg2 db 0dh,0ah,') and ( does not match','$'msg3 db 0dh,0ah,'div zero error','$'msg4 db 0dh,0ah,'sorry,minus data appears','$'msg5 db 0dh,0ah,'any key to continue,esc to exit','$'data ends2.2.2 定义的堆栈段声明用于将中缀表达式转换为后缀表达式,以及进行后缀表达式求值过程用到的堆栈段。

简单计算器的制作(实验版)

简单计算器的制作(实验版)
w属性修改为 属性修改为true,才能响应键盘按键 注意:将form1窗体的 窗体的 属性修改为 才能响应键盘按键 的按下消息. 的按下消息.
设计与实现
运算. (13)单个操作数的运算的处理,例如"1/x"运算.在按钮"1/x"的单击 )单个操作数的运算的处理,例如" 运算 在按钮" 的单击 事 件过程OnButton3Click中编写实现代码: 中编写实现代码: 件过程 中编写实现代码
注意: 注意:加,减,乘,除这些按钮都要做相应的处理!! 除这些按钮都要做相应的处理!!
设计与实现
(8)退格键(BackSpace)功能的实现.在按钮"BackSpace"的单击 )退格键( )功能的实现.在按钮" 的单击 事 件过程OnBackSpaceBtnClick中编写实现代码: 中编写实现代码: 件过程 中编写实现代码
设计与实现
当用户按下运算操作符按钮,在按钮" 单击事件过程中编写实现代码 单击事件过程中编写实现代码: 当用户按下运算操作符按钮,在按钮"+"单击事件过程中编写实现代码:
设计与实现
(4)定义一个可以根据不同的操作符进行不同运算的过程: 定义一个可以根据不同的操作符进行不同运算的过程: 定义一个可以根据不同的操作符进行不同运算的过程
设计与分析
混合运算的情况: 混合运算的情况 (1)在没有按下运算操作符按钮之前,通过按钮输入的数 字均作为第一个操作数,保存在opnum1变量中; (2)选择运算的种类,按下运算操作符按钮,首先对上一 次的运算进行求解,并把结果显示出来,同时把该计 算结果作为第一个操作数,存在到opnum1变量中,把 按下的运算操作符也保存在ca_operator变量中; (3)按下运算操作符按钮后(设置一个变量operated来记 录),通过按钮输入的数字均作为第二个操作数保存 在opnum2变量中; (4)按下"="按钮后,根据选择的运算操作符对两个操作数 进行运算,并把结果显示在edit编辑框中.

Java实现简易计算器

Java实现简易计算器

Java实训作业题目:Java实现简易计算器学院:姓名:学号:班级:20 年月一、实验目的通过课程设计,主要要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。

此次课程设计实训主要是Java语言程序设计的实现。

通过该课程设计,可以将课堂上掌握的理论知识与处理数据的业务相结合,以检验自己掌握知识的宽度、深度及对知识的综合运用能力。

二、实验要求用Java编写一个简单的计算器,使其能够实现最基本的功能,如简单的加、减、乘、除;平方根,倒数,平方等功能。

三、详细内容1.界面设计界面设计使用GUI,其中有用到swing组件的TextField和Button,用到awt中的BorderLayout和GridLayout布局管理方式,其图形界面如图1-1所示:图1-1其中主要代码为:public mainWindow(){this.setTitle("计算器");//用户图形界面标题this.setVisible(true);//用户图形界面可缩小this.setResizable(false);//用户图形界面不可放大this.setSize(350,300);//设置用户图形界面的大小this.setLocation(400,150);//用户图形界面在屏幕中的显示位置JPanel panel1 = new JPanel();//新建一个画板JPanel panel2 = new JPanel();button1 = new JButton("1");...reset = new JButton("CE");Container container = this.getContentPane();container.add(panel2,BorderLayout.NORTH);container.add(panel1);panel1.setLayout(new GridLayout(5,4));//将画板1分为4行5列result.setEnabled(false);result.setFont(new Font("Dialog",Font.BOLD,25));//运算结果的字体大小result.setEditable(false);result.setHorizontalAlignment(SwingConstants.RIGHT);panel1.add(reciprocal);//分别将20个按钮依次添加到画板panel1中,并设置各自的大小reciprocal.setFont(new Font("Dialog",Font.PLAIN,20));...panel1.add(divide);divide.setFont(new Font("Dialog",Font.PLAIN,20));panel2.setLayout(new GridLayout());panel2.add(result);//画板panel2添加运算结果2.四则运算较为简单的实现了简单的加、减、乘、除运算,主要代码如下:ActionListener equal1 = new ActionListener(){ //实现四则运算public void actionPerformed(ActionEvent e){String str = result.getText();b = DatatypeConverter.parseDouble(str);{if(flag == "+")c = a + b;else if(flag == "-")c = a - b;else if(flag == "*")c = a * b;else if(flag == "/" || b != 0)c = a / b;}if(flag != "=")result.setText("" + c);elseresult.setText("零不能做除数!");a = 0;b = 0;c = 0;flag = "";}};3.其他功能另外添加了平方根,倒数,平方等功能,主要代码如下:平方根运算的实现:ActionListener sqrt1= new ActionListener(){public void actionPerformed(ActionEvent e){String str = result.getText();double i = DatatypeConverter.parseDouble(str);i = Math.sqrt(i);result.setText("" + i);}};倒数运算的实现:ActionListener reciprocal1 = new ActionListener(){ public void actionPerformed(ActionEvent e){String str = result.getText();double i = DatatypeConverter.parseDouble(str);i = 1/i;result.setText("" + i);}};平方运算的实现:ActionListener square1 = new ActionListener(){public void actionPerformed(ActionEvent e){String str = result.getText();double i = DatatypeConverter.parseDouble(str);i = i*i;result.setText("" + i);}};4.程序测试经测试发现本计算器基本功能均能实现,可正常运行计算,针对功能实现的代码部分过于简单,可以对其进行改善提高,方便用户使用!5.实训小结通过对计算器窗体的编写,熟悉了java图形用户界面的设计原理和程序结构,熟悉了java中awt和swing的组合。

简易计算器的设计与实现

简易计算器的设计与实现

简易计算器的设计与实现设计一个简易计算器涉及以下几个方面:1.需求分析:-定义计算器的功能-确定计算器支持的数学运算,如加法、减法、乘法、除法等2.用户界面设计:-设计计算器的界面布局,包括数字按键、运算符按键、等号按键等-考虑使用框架或库来构建用户界面3.输入处理:-设计解析用户输入的算式-处理用户点击按键时的输入4.运算处理:-实现各种数学运算的算法-将用户输入的算式传入运算处理函数进行计算5.显示结果:-将计算结果显示在计算器的界面上下面是一个简易计算器的实现示例,使用Python语言和PyQt库来构建:```pythonimport sysfrom PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGridLayout, QPushButton, QLineEdit class Calculator(QWidget):def __init__(self):super(.__init__self.setWindowTitle("简易计算器")yout = QVBoxLayoutself.input_box = QLineEdityout.addWidget(self.input_box)self.buttons =['7','8','9','/'],['4','5','6','*'],['1','2','3','-'],['0','.','=','+']self.grid_layout = QGridLayoutfor i in range(4):for j in range(4):button = QPushButton(self.buttons[i][j])button.clicked.connect(self.button_clicked)self.grid_layout.addWidget(button, i, j)yout.addLayout(self.grid_layout)self.setLayout(yout)self.equal_clicked = Falsedef button_clicked(self):button = self.sendertext = button.textif text == '=':self.calculateelse:self.input_box.setText(self.input_box.text( + text) def calculate(self):expression = self.input_box.texttry:result = eval(expression)self.input_box.setText(str(result))except Exception as e:self.input_box.setText("错误:{}".format(e))if __name__ == '__main__': app = QApplication(sys.argv) calculator = Calculator calculator.showsys.exit(app.exec_()。

编写一个简单的计算器程序

编写一个简单的计算器程序

编写一个简单的计算器程序计算器程序是一种非常实用的工具,它可以帮助我们进行数学计算,并简化复杂的运算过程。

本文将介绍如何编写一个简单的计算器程序,实现基本的加减乘除运算。

首先,我们需要确定计算器程序的功能和界面设计。

在本文中,我们将使用Python编程语言来编写计算器程序,并使用命令行界面(CLI)进行交互。

这意味着我们将在终端窗口中输入表达式,并显示结果。

接下来,我们需要考虑计算器程序的基本运算功能。

一个简单的计算器需要实现四个基本的运算:加法、减法、乘法和除法。

我们将使用函数来实现每个运算功能。

以下是一个示例代码:```pythondef add(x, y):return x + ydef subtract(x, y):return x - ydef multiply(x, y):return x * ydef divide(x, y):return x / y```在这个示例代码中,我们定义了四个函数,每个函数接受两个参数,并返回计算结果。

接下来,我们需要处理输入表达式并调用相应的运算函数。

我们将使用一个循环来持续接收用户输入,并在用户输入“exit”时退出程序。

以下是一个示例代码:```pythonwhile True:expression = input("请输入一个表达式:")if expression == "exit":break#解析表达式,提取运算符和操作数operator = Nonefor op in ["+", "-", "*", "/"]:if op in expression:operator = opbreakif not operator:print("表达式错误,请重新输入!") continueoperands = expression.split(operator) x = float(operands[0])y = float(operands[1])if operator == "+":result = add(x, y)elif operator == "-":result = subtract(x, y)elif operator == "*":result = multiply(x, y)elif operator == "/":result = divide(x, y)print("运算结果:", result)print("谢谢使用,再见!")```在这个示例代码中,我们使用了一个无限循环来持续接收用户输入。

实操考核:设计并实现一个简单的计算器

实操考核:设计并实现一个简单的计算器

实操考核:设计并实现一个简单的计算器
简介
本文档将详细介绍如何设计并实现一个简单的计算器。

计算器是一种用于进行基本数学运算的电子设备或程序。

我们将使用 Python 编程语言来实现该计算器,并通过命令行界面与用户进行交互。

功能需求
计算器需要实现以下基本功能:
1.支持加法、减法、乘法和除法运算;
2.具备输入验证功能,确保用户输入的是有效的数值;
3.能够处理不同类型的数值,如整数和浮点数;
4.提供清除操作,以便用户能重新进行计算;
5.具备退出功能,用户可以选择退出计算器。

设计思路
为了实现上述功能需求,我们可以按照以下步骤来设计和实现这个简单的计算器:
1.接收用户输入的数值和运算符,并进行输入验证;
2.根据输入的运算符执行相应的运算操作;
3.输出结果并询问用户是否继续计算;
4.如果用户选择继续计算,则返回第一步,否则退出计算器。

代码实现
下面将逐步介绍如何使用 Python 代码实现这个简单的计算器。

首先,我们需要引入sys模块,以便在退出计算器时能够使用sys.exit()方法。

然后,我们定义一个函数calculator(),用来进行计算。

```python import sys
def calculator(): while True: try: num1 = float(input(。

单片机设计实验报告简单计算器的设计

单片机设计实验报告简单计算器的设计

目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (3)2.1主控模块 (3)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (5)2.1.4 STC89C52单片机的定时/计数器 (5)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (6)2.3 LCD液晶显示器简介 (7)2.3.1液晶模块简介 (7)2.3.2液晶显示部分与89S52的接口 (8)3系统软件设计 (10)3.1系统软件流程图 (10)3.2系统整体原理图 (11)4.系统调试 (12)4.1硬件调试 (12)4.2软件调试 (12)4.3调试结果 (13)5.心得体会131.总体方案选择1) 1.1 实验要求:2)通过小键盘实现数据的输入, 并在LED数码管上显示3)实现+、-、*、/4)在LED数码管上显示结果并有清零, 退出功能1.2方案设计本系统以STC89C52单片机为控制核心, 对系统进行初始化, 主要完成对键盘的响应、液晶显示灯功能的控制, 起到总控和协调各模块之间工作的作用。

单片机通过检测键盘读取使用者按下对用功能的按键, 然后通过单片机内部运放把运算的结果显示在液晶屏幕上。

图1-1系统结构框图本系统结构如图1-1所示, 本设计可分为以下模块: 单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。

下面对各个模块的设计方案逐一进行论证分析。

2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚, 4个8位并行I/O口, 1个全双工异步串行口, 同时内含5个中断源, 2个优先级, 2个16位定时/计数器。

STC89C52的存储器系统由4K的程序存储器(掩膜ROM), 和128B的数据存储器(RAM)组成。

简易计算器实验报告

简易计算器实验报告

简易计算器实验报告一、实验目的本次实验的目的是设计并实现一个简易计算器,能够进行基本的四则运算(加、减、乘、除),以及处理括号的优先级运算,提高对程序设计和逻辑思维的理解与应用能力。

二、实验原理1、四则运算的优先级规则在数学运算中,先计算括号内的表达式,然后按照先乘除后加减的顺序进行计算。

乘除法的优先级高于加减法,如果在同一级运算中,按照从左到右的顺序进行。

2、数据结构的选择使用栈(Stack)数据结构来存储操作数和运算符。

栈具有先进后出的特点,非常适合处理表达式中的括号和优先级。

3、算法思路首先,将输入的表达式进行解析,将数字和运算符分别存储到不同的栈中。

然后,根据运算符的优先级进行计算,将计算结果重新压入栈中,直到表达式计算完毕。

三、实验设备及环境1、编程工具:选择了 Python 语言作为主要的编程工具,使用PyCharm 集成开发环境进行代码编写和调试。

2、操作系统:Windows 10 操作系统。

四、实验步骤1、定义数据结构定义两个栈,一个用于存储操作数(operandStack),一个用于存储运算符(operatorStack)。

2、表达式解析遍历输入的表达式字符串,将数字转换为整数并压入操作数栈,将运算符压入运算符栈。

遇到左括号直接压入运算符栈,遇到右括号则进行括号内的运算。

3、运算处理当运算符栈不为空时,取出栈顶的运算符和两个操作数进行计算。

根据运算符的优先级进行相应的运算,将结果压入操作数栈。

4、最终结果当表达式解析完毕后,操作数栈中的唯一元素即为表达式的计算结果。

五、代码实现```pythonclass SimpleCalculator:def __init__(self):selfoperandStack =selfoperatorStack =def calculate(self, expression):for char in expression:if charisdigit():selfoperandStackappend(int(char))elif char in '+/()':if char =='(':selfoperatorStackappend(char)elif char ==')':while selfoperatorStack-1!='(':operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackpop()else:while selfoperatorStack and selfhasHigherPrecedence(selfoperatorStack-1, char):operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackappend(char)while selfoperatorStack:operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)return selfoperandStackpop()def hasHigherPrecedence(self, op1, op2):if op1 in '/' and op2 in '+':return Trueelif op1 in '+' and op2 in '+':return Falseelif op1 in '/' and op2 in '/':return Falsereturn Falsedef performOperation(self, operand1, operand2, operator):if operator =='+':return operand1 + operand2elif operator =='':return operand1 operand2elif operator =='':return operand1 operand2elif operator =='/':if operand2 == 0:raise ValueError("除数不能为 0")return operand1 / operand2if __name__ =="__main__":calculator = SimpleCalculator()expression ="2 + 3 (4 1) / 2"result = calculatorcalculate(expression)print("计算结果:", result)```六、实验结果与分析1、测试用例及结果输入表达式:"2 + 3 4",计算结果:14输入表达式:"(2 + 3) 4",计算结果:20输入表达式:"5 2 3",计算结果:-1输入表达式:"10 / 2 + 1",计算结果:62、结果分析对于简单的四则运算表达式,计算器能够正确计算出结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单的计算器模拟程序的设计和实现1.问题描述对任意给定的正确四则运算表达式,程序计算其结果值并输出。

程序无需查错功能,假定所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为 +、-、*、/,表达式以字符 "=" 结束。

程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。

2.设计说明2.1简要的分析根据要求,要先输入包含有+,-,*,/的运算符的表达式,然后经过计算得到正确的答案。

从键盘中输入的是ASCII码,因此要将其转换为十进制的数据然后才能进行计算。

如果输入混合表达式,要将中缀式先变化成后缀式,然后再进行计算。

2.2概要分析2.2.1 定义的数据段用于定义一些中间变量,并将显示在试验界面上,以及提示信息。

data segmentstri db 50 dup(0)exp db 30 dup(0)track db 30 dup(0)instr db 100 dup(0)msg0 db 'please input your formular:',0dh,0ah,'$'msg1 db 0dh,0ah,'wrong input','$'msg2 db 0dh,0ah,') and ( does not match','$'msg3 db 0dh,0ah,'div zero error','$'msg4 db 0dh,0ah,'sorry,minus data appears','$'msg5 db 0dh,0ah,'any key to continue,esc to exit','$'data ends2.2.2 定义的堆栈段声明用于将中缀表达式转换为后缀表达式,以及进行后缀表达式求值过程用到的堆栈段。

stack segment para stackdw 256 dup(0)stack ends2.2.3 用到的子过程2.2.3.1 compare子过程作用:用于判断键盘输入的符号是否合法,若合法,则在屏幕上显示,否则报错。

2.2.3.2 mult子过程作用:用于对输入的数字进行乘10累加操作,以便将连续输入的数字字符串转换为相对应的数值。

2.2.3.3 trans子过程作用:将输入的中缀表达式转换为后缀表达式。

2.2.3.4 value子过程作用:将后缀表达式结合堆栈结构进行表达式求值。

2.2.3.5 divi子过程作用:通过除以10以及进一步处理将某数值转换为相应的ASCII字符串。

2.2.3.6 print子过程作用:将表达式求值结果输出到屏幕上。

3.详细的算法描述3.1.程序运行流程3.2程序代码STACK SEGMENT PARA STACKDW 256 DUP(0)STACK ENDSDATA SEGMENTSTRI DB 50 DUP(0)EXP DB 30 DUP(0)TRACK DB 30 DUP(0)INSTR DB 100 DUP(0)MSG0 DB 'please input the formular:',0DH,0AH,'$'MSG1 DB 0DH,0AH,'sorrry,wrong input','$'MSG2 DB 0DH,0AH,') and ( does not match','$'MSG3 DB 0DH,0AH,'div by zero error','$'MSG4 DB 0DH,0AH,'sorry,minus data appears','$'MSG5 DB 0DH,0AH,'any key to continue,esc to exit','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,STACKMOV SS,AXMOV AX,DATAMOV DS,AXMOV DX,OFFSET MSG0MOV AH,9INT 21HXOR AX,AX;READMOV BX,OFFSET INSTRMOV DL,20HJMP L2COMPARE PROC NEARCMP AL,0DHJZ L2MOV DL,ALMOV AH,2INT 21HRETCOMPARE ENDPL2: MOV AH,8INT 21HCALL COMPARECMP AL,3DH ;end with '='JZ L2_OVERMOV AH,39HCMP AH,AL ;del the wrong data ( > 9 )JNB CONTIMOV AH,2MOV DL,8INT 21HMOV DL,20HINT 21HMOV DL,8INT 21HJMP L2CONTI: CMP AL,28H ;'('JZ L2_YESCMP AL,29HJZ L2_YES ;')'CMP AL,2AH ;'*'JZ L2_YESCMP AL,2BH ; '+'JZ L2_YESCMP AL,2DH ; '-'JZ L2_YESCMP AL,2FH ; '/'JZ L2_YES; back function ' <- 'CMP AL,08HJNZ NO_8L2_NEXT: PUSH DXMOV DL,20HMOV AH,2INT 21HMOV DL,8MOV AH,2INT 21HCMP BX,OFFSET INSTRJZ L2DEC BXMOV AL,0MOV [BX],ALPOP DXJMP L2;NO_8: MOV AH,2FHCMP AH,AL ;del the wrong data ( < 0 )JB L2_YESMOV AH,2MOV DL,8INT 21HMOV DL,20HINT 21HMOV DL,8INT 21HJMP L2L2_YES: MOV DH,DLMOV DL,ALCMP DL,20HJNZ L2_NO20CMP DH,20HJZ L2L2_NO20: MOV [BX],ALINC BXJMP L2L2_OVER: MOV AH,3DHMOV [BX],AH;check inputMOV SI,OFFSET INSTRMOV AH,30HMOV CH,0 ;record ( )MOV CL,0L3: MOV AL,[SI]INC SICMP AL,3DHJZ L3_OVERCMP AL,2AHJNB MAY_WRONGCMP AL,29HJZ L3_29INC CHJMP L3_RIGHTL3_29: INC CLJMP L3_RIGHTMAY_WRONG: CMP AL,30HJNB L3_RIGHTCMP AL,28HJZ L3_RIGHTCMP AH,29HJZ L3_RIGHT;cmp ah,28h;jz L3_rightCMP AH,30HJNB L3_RIGHTMOV DX,OFFSET MSG1MOV AH,9INT 21HJMP OVER3L3_RIGHT: MOV AH,ALJMP L3L3_OVER: CMP CH,CLJZ INPUT_WRIGHTMOV DX,OFFSET MSG2MOV AH,9INT 21HJMP OVER3;;chech overINPUT_WRIGHT: MOV BX,OFFSET STRIMOV SI,OFFSET INSTR;readREAD: ;mov ah,1;int 21hMOV AL,[SI] ;reserve the data by decimal{test}INC SIMOV AH,28H ;(CMP AH,ALJZ IN_STRIMOV AH,29H ;)CMP AH,ALJZ IN_STRIMOV AH,2AH ;*CMP AH,ALJZ IN_STRIMOV AH,2BH ;+CMP AH,ALJZ IN_STRIMOV AH,2DH ;-CMP AH,ALJZ IN_STRIMOV AH,2FH ;/CMP AH,ALJZ IN_STRIMOV AH,2FH ;delete the wrong inputCMP AH,ALJNB READMOV AH,3DH ;=CMP AH,ALJZ IN_STRIMOV AH,39H ;delete the wrong inputCMP AH,ALJB READCALL NEAR PTR MULTJMP READ ; the end of reserve;IN_STRI: MOV AH,0CMP AH,[BX]JZ NO_BX ;inc bxINC BXNO_BX: MOV [BX],ALMOV AH,3DHCMP AH,ALJNZ NO_OVERSUB AL,25 ;transplant '=' to '$'MOV [BX],ALJMP OVERNO_OVER: JMP READMULT PROC NEAR ;mult data*10,add upPUSH DXPUSH CXPUSH AXMOV AH,0CMP [BX],AHJZ NO_INC_BXMOV AH,30HCMP [BX],AHJNB NO_INC_BXINC BXNO_INC_BX: MOV DX,0MOV CX,10MOV AH,[BX]CMP AH,30HJB NO_SUBSUB AH,30HNO_SUB: MOV [BX],AHNEXT: ADD DX,[BX]LOOP NEXTSUB AL,30H ;tras to decimalADD DL,ALMOV [BX],DLMOV AH,[BX]ADD AH,30HMOV [BX],AHPOP AXPOP CXPOP DXRETMULT ENDP;;end of readOVER: CALL NEAR PTR TRANS ;the outlet of the programOVER1: CALL NEAR PTR VALUE ;jmp instead of ret inprocedure transOVER2: CALL NEAR PTR PRINTOVER3: MOV AH,9MOV DX,OFFSET MSG5INT 21HMOV AH,8INT 21HCMP AL,1BHJZ OVER4MOV CX,210MOV BX,OFFSET STRIMOV AL,0OVER_LOOP: MOV [BX],ALINC BXLOOP OVER_LOOPMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HJMP STARTOVER4: MOV AH,4CHINT 21H;;transTRANS PROC NEAR ;PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIXOR CX,CXMOV BX,OFFSET STRIMOV SI,OFFSET EXPMOV DI,OFFSET TRACKTRANS_WHILE:MOV AL,[BX]INC BXMOV AH,24H ;'$'CMP AH,ALJZ TRANS_OVER ;end with '='MOV AH,2FH ;judge L digitalCMP AH,ALJNB NO_DIGITALMOV [SI],ALINC SIJMP TRANS_WHILENO_DIGITAL: MOV AH,28H ;judge L '('CMP AH,ALJNZ NO_9MOV [DI],AL ;push alINC DIJMP TRANS_WHILENO_9: MOV AH,29H ;judge L ')'CMP AH,ALJNZ NO_0POP_WHILE: DEC DIMOV AL,[DI] ; pop alMOV AH,28HCMP AH,ALJZ OVER_POP_WHILEMOV [SI],ALINC SIJMP POP_WHILEOVER_POP_WHILE:;mov al,dlJMP TRANS_WHILENO_0: MOV AH,2BHCMP AH,ALJZ OR1_YESMOV AH,2DHCMP AH,AL ;if al is '+' or '-'JNZ NO_OR1OR1_YES:CMP DI,OFFSET TRACK ;jmp if stack is blankJZ STACK_BLANKDEC DI ;pop alMOV CL,[DI]MOV AH,28HCMP AH,CLJZ OVER_OR1_YESMOV [SI],CLINC SIJMP OR1_YESOVER_OR1_YES: MOV [DI],CLINC DI;reserve the ')'STACK_BLANK: MOV [DI],AL ;push alINC DIJMP TRANS_WHILENO_OR1: MOV AH,2AHCMP AH,ALJZ OR2_YESMOV AH,2FHCMP AH,ALJNZ NO_OR2 ;if al is '*' or '/' OR2_YES: DEC DI ;push dlMOV CL,[DI]MOV AH,2AHCMP AH,CLJZ OR2_YES_ORMOV AH,2FHCMP AH,CLJNZ OR2_OVEROR2_YES_OR: MOV [SI],CLINC SIJMP OR2_YESOR2_OVER: MOV [DI],CLINC DI ;push alMOV [DI],ALINC DINO_OR2: ;mov al,[bx];inc bx;JMP TRANS_WHILETRANS_OVER: CMP DI,OFFSET TRACKJZ POP_OVERDEC DIMOV AL,[DI]MOV [SI],ALINC SIJMP TRANS_OVERPOP_OVER: MOV AL,24H ;end with '='MOV [SI],ALPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXJMP OVER1TRANS ENDP; end of trans;start valueVALUE PROC NEAR ;get the valuePUSH AXPUSH BXPUSH CXPUSH DXPUSH SIMOV BX,OFFSET EXPMOV SI,OFFSET TRACKXOR AX,AXVALUE_WHILE: MOV AL,[BX]INC BXMOV AH,24HCMP AH,ALJZ VALUE_OVERMOV AH,2FH ;judge L digitalCMP AH,ALJNB VALUE_NO_DIGITALSUB AL,30HMOV [SI],ALINC SIJMP VALUE_WHILEVALUE_NO_DIGITAL: MOV AH,2BH ;+ CMP AH,ALJNZ NO_ADDDEC SIMOV DL,[SI]DEC SIMOV DH,[SI]ADD DH,DLMOV [SI],DHINC SIJMP VALUE_WHILENO_ADD: MOV AH,2DH ;-CMP AH,ALJNZ VALUE_NO_SUBDEC SIMOV DL,[SI]DEC SIMOV DH,[SI]CMP DH,DLJNB SUB_RIGHTMOV DX,OFFSET MSG4MOV AH,9INT 21HJMP OVER3SUB_RIGHT: SUB DH,DLMOV [SI],DHINC SIJMP VALUE_WHILEVALUE_NO_SUB: MOV AH,2AH ;*CMP AH,ALJNZ NO_MULDEC SIMOV DH,[SI]DEC SIMOV AL,[SI]MUL DHMOV [SI],ALINC SIJMP VALUE_WHILENO_MUL: MOV AH,2FH ;/CMP AH,ALJNZ NO_DIVDEC SIMOV DH,[SI]DEC SIMOV AL,[SI]XOR AH,AHCMP DH,0JNZ DIV_RIGHTMOV DX,OFFSET MSG3MOV AH,9INT 21HJMP OVER3DIV_RIGHT: DIV DHMOV [SI],ALINC SINO_DIV: JMP VALUE_WHILE;VALUE_OVER: POP SIPOP DXPOP CXPOP BXPOP AXRETVALUE ENDP; end value procedure;;start printPRINT PROC NEARPUSH AXPUSH DX;mov dl,al;mov ah,2;int 21h;mov dl,0dh;mov ah,2;int 21h;mov dl,0ah;mov ah,2;int 21hMOV BX,OFFSET TRACKCALL NEAR PTR DIVIDEC ALOK: POP DXPOP AXRETPRINT ENDP ;end of print;DIVI PROC NEAR ;div data/10 funtion:print the data PUSH BXPUSH AXPUSH DXMOV AL,[BX]XOR AH,AHXOR CX,CXNEXT1: MOV BL,0AHDIV BLMOV DL,AHADD DL,30HXOR DH,DHPUSH DXINC CXMOV DH,0H ;judge L the endCMP DH,ALJNB DIVI_OVER1XOR AH,AHJMP NEXT1DIVI_OVER1: POP DXMOV AH,2INT 21HLOOP DIVI_OVER1MOV DL,20HMOV AH,2INT 21HPOP DXPOP AXPOP BXRETDIVI ENDP; end of printCODE ENDSEND START 4.测试结果进行加法运算得到的结果为进行结果为负数的减法运算进行除数为0的除法运算进行加减乘除混合运算5.使用说明当进入操作界面后,提示输入正确的表达式,以等号结束,然后程序给出正确结果。

相关文档
最新文档