四则运算计算器
用C++实现的有理数(分数)四则混合运算计算器

⽤C++实现的有理数(分数)四则混合运算计算器实现⽬标⽤C++实现下图所⽰的⼀个console程序:其中:1、加减乘除四种运算符号分别⽤+、-、*、/表⽰, + 和 - 还分别⽤于表⽰正号和负号。
2、分数的分⼦和分母以符号 / 分隔。
3、⽀持括号和括号套括号的情形。
4、⽀持输⼊⼩数(⼩数点⽤符号 . 表⽰)和循环⼩数(循环部分起始位置⽤符号 ` 指定,⽐如:1.12`345表达的是1.12 345 345 345 ...)。
5、输⼊中:允许任意添加空⽩字符;数字中允许任意添加逗号( , )字符;⼩数点前的整数为0时允许省略0。
5、输出中间运算过程和最终运算结果。
6、计算出的最后结果如果不是整数,则采⽤既约分数形式表达,分⼦⼤于分母则采⽤带分数形式表达,带分数的分数部分⽤中括号( [ 和 ])括起来。
构建基础数据结构有理数的四则运算的本质就是两个分数(整数是分母为1的分数)的相加和相乘运算,以及分数化简运算。
因此,⾸先定义出如下表达分数的数据结构:1struct SFraction2 {3 u64 numerator;4 u64 denominator;5bool bNegative;67 SFraction() {8 numerator = 0;9 denominator = 1;10 bNegative = false;11 }1213 std::string toStr(bool bFinal = false) const14 {15 std::ostringstream oStream;16if (bNegative)17 {18 oStream << "-";19 }20if (denominator == 1)21 {22 oStream << numerator;23return oStream.str();24 }25if (!bFinal || numerator < denominator)26 {27 oStream << numerator << "/" << denominator;28return oStream.str();29 }30 u64 quotient = numerator / denominator;31 u64 remainder = numerator % denominator;32 oStream << quotient << "[" << remainder << "/" << denominator << "]";33return oStream.str();34 }35 };SFraction定义很简单,只有三个分量。
计算器使用技巧

计算器使用技巧计算器是一种广泛使用的工具,它能够简化数学运算和计算复杂问题的步骤。
虽然计算器已经普及多年,但仍然有很多人不熟悉其使用技巧。
本文将介绍一些常用的计算器使用技巧,帮助您更加高效地使用计算器。
首先,对于基本的四则运算,计算器通常有专门的按键,包括加号 (+)、减号 (-)、乘号 (×)和除号 (÷)。
使用这些按键,您可以直接输入数学表达式,然后按下等号 (=) 进行计算。
比如,输入 2+3,然后按下等号,计算器将显示结果为 5。
其次,计算器通常还具有存储器功能。
这意味着您可以将一些数字或结果存储在存储器中,以备后续使用。
通常,计算器上会有存储器按钮,标有M 或MR,以及相关的存储器编号键。
例如,按下M+键可以将当前结果存储到存储器中,然后使用MR键可以调用存储器中的数值。
这在多次使用相同数字进行计算时非常方便。
此外,对于一些常见的数学操作,如开方、平方等,计算器通常有指定的按键。
使用这些特殊按键,您可以轻松地进行这些数学操作。
比如,要计算4的平方,可以先输入4,然后按下平方的专用按键 (通常标有 x^2),计算器将给出结果为16。
另外,有一些复杂的数学运算,如三角函数、对数、指数等,计算器也可以处理。
这些功能通常位于计算器上的第二功能键(Shift键) 或第三功能键 (Mode键) 下。
通过按下这些功能键,您可以输入并计算这些复杂的数学运算。
使用这些功能,您可以进行更高级的数学问题求解。
除了以上技巧外,还有一些其他的计算器使用技巧可以帮助您更加高效地进行计算。
比如,您可以使用括号来分组不同的数学运算,这有助于确保正确的优先级。
此外,您还可以使用记忆功能 (MRC键),将当前结果存储到存储器中,并在需要时进行调用。
这在复杂的计算过程中非常有用。
总之,计算器是一个非常方便的工具,可以帮助我们进行各种数学运算和复杂问题求解。
掌握一些计算器的使用技巧,可以让我们更加高效地进行计算,节省时间和精力。
学生计算器使用方法

学生计算器使用方法学生是每个国家的希望与未来,而计算器作为学生的得力助手,是学习中不可或缺的工具之一、计算器的功能多样,使用方法也各有不同。
下面我将详细介绍学生计算器的使用方法。
首先,学生计算器主要有基本四则运算、科学计算和统计运算三大类功能,我们可以根据需要选择相应的功能模式。
以下是详细的使用方法:1.基本四则运算:基本四则运算是计算器最常用的功能,包括加、减、乘、除四种运算。
使用基本四则运算功能,首先需要将计算器设置为基本计算模式。
一般来说,计算器上会有加、减、乘、除四个按键,我们可以依次按下需要进行的运算符号,然后输入数字,最后按下等号键得到结果。
例如,计算3加4的结果可以按下3+4=。
2.科学计算:科学计算是计算器的高级功能,适合进行复杂的数学运算,例如开平方、乘方、三角函数等。
使用科学计算功能,我们需要将计算器设置为科学计算模式。
一般来说,计算器上会有sin、cos、tan、x^2、√等按键,我们可以按下这些按键进行相应的运算。
例如,计算2的平方可以按下2^2=,计算sin30度可以按下sin30=。
3.统计运算:统计运算适合进行数据统计和分析,例如计算平均值、标准差、方差等。
使用统计运算功能,我们需要将计算器设置为统计计算模式。
一般来说,计算器上会有sum、avg、sd等按键,我们可以按下这些按键进行相应的运算。
例如,计算一组数据的平均值可以按下1,2,3,4,sum=4,avg=。
除了以上三大类功能,学生计算器还具有其他实用的功能,如百分数计算、倒数计算、阶乘计算、分数计算等等。
使用这些功能,我们可以更方便地进行各种数值计算和转换。
此外,学生计算器还具有存储记忆功能,可以存储一个数值或一个运算结果。
我们可以使用M+、M-、MR等按键将数据存储到存储器中,然后使用MR按键进行读取。
这个功能可以很方便地保存和调用计算结果,节省时间和精力。
总结一下,学生计算器的使用方法分为基本四则运算、科学计算、统计运算和其他实用功能。
四则混合运算计算器C语言程序

#include <stdio.h>#include <stdlib.h>#define OK 10000001#define ERROR 10000002int flag_1=0; //正负号处理标志struct node{int data;struct node *next;};typedef struct node Node;struct stack{Node *top;int count;};typedef struct stack Stack;int InitStack(Stack *l){l->top = NULL;l->count = 0;return OK;}int EmptyStack(Stack *s){return (s->count == 0) ? OK : ERROR;}int Push(Stack *s, int e){Node *p = (Node *)malloc(sizeof(Node));if(p == NULL){return ERROR;}p->data = e;p->next = s->top;s->top = p;s->count++;return OK;}int GetTop(Stack *s){if(NULL == s->top){return ERROR;}return (s->top->data); }int Priority(char s){switch(s){case '(':return 3;case '*':case '/':return 2;case '+':case '-':return 1;default:return 0;}}int Pop(Stack *s){int e;if(NULL == s->top){return ERROR;}Node *p = s->top;e = s->top->data;s->top = p->next;free(p);s->count--;return e;}int main(){Stack num, opt;char str[100]={0};int i = 0, tmp = 0, j;if(InitStack(&num) != OK || InitStack(&opt) != OK){printf("Init Failure!\n");exit(1);}printf("Please Input Operator :\n");scanf("%s",str);while(str[i] != '\0' || EmptyStack(&opt) != OK){if((str[i] == '-'||str[i] == '+' )&& EmptyStack(&opt) == OK && EmptyStack(&num) == OK){Push(&num,0);if(str[i] == '-' )Push(&opt,'-');elsePush(&opt,'+');i++;}else if(str[i] >= '0' && str[i] <= '9'){if(GetTop(&opt)=='(')flag_1=1;tmp = tmp * 10 + str[i] - '0';i++;if(str[i] < '0' || str[i] > '9'){Push(&num,tmp);tmp = 0;}}else{if((EmptyStack(&opt) == OK) || (GetTop(&opt) == '(' && str[i] != ')') || Priority(str[i]) > Priority(GetTop(&opt)))//进栈不参与运算{if((str[i]=='-'||str[i]=='+')&&flag_1==0&&GetTop(&opt) == '(' ){Push(&num,0);flag_1=1;}Push(&opt,str[i]);i++;continue;}if(GetTop(&opt) == '(' && str[i] == ')')//出栈不参与运算{Pop(&opt);i++;flag_1==0;continue;}if((str[i] == '\0' && EmptyStack(&opt) != OK) || (str[i] == ')' && GetTop(&opt) != '(') || Priority(str[i]) <= Priority(GetTop(&opt)))//出栈并参与运算{switch(Pop(&opt)){case '+':Push(&num, Pop(&num) + Pop(&num));break;case '-':j = Pop(&num);Push(&num, Pop(&num) - j);break;case '*':Push(&num, Pop(&num) * Pop(&num));break;case '/':j = Pop(&num);Push(&num, Pop(&num) / j);}continue;}}}printf("%d",Pop(&num));printf("\n");return 0;}。
计算器的正确使用方法

计算器的正确使用方法计算器是一种便携式的电子计算工具,能够进行各种数学运算。
它的使用方法简单方便,但是一些人在使用过程中可能会遇到困惑。
本文将介绍计算器的正确使用方法,以帮助大家更好地利用计算器进行计算。
一、基本操作1. 打开计算器。
通常计算器的开关位于正面或背面,找到开关位置按下即可打开。
2. 数字输入。
计算器通常具有数字键盘,直接按下相应的数字键即可输入具体的数值。
3. 运算符输入。
计算器上通常还配备了各种运算符,如加号、减号、乘号、除号等,根据需要按下相应的运算符。
4. 进行计算。
按下等号键即可得到计算结果。
二、基本功能1. 四则运算。
使用计算器最基本的功能是进行四则运算。
通过输入数字和运算符,按下等号键即可得到计算结果。
2. 百分数计算。
计算器通常具备百分数计算功能。
输入一个数值,按下百分号键,再输入一个百分数,按下等号键即可得到计算结果。
3. 开方和平方。
许多计算器都配备了开方和平方功能。
输入一个数值,按下相应的开方或平方键,再按下等号键即可得到计算结果。
4. 小数的转换。
计算器通常具备小数之间的转换功能。
输入一个小数,按下相应的转换键,再按下等号键即可得到转换结果。
三、注意事项1. 保持计算器干净。
计算器上的按键容易受到灰尘、污垢等影响,应定期清洁计算器,保持按键灵敏。
2. 避免暴露在阳光下。
长时间暴露在阳光下会使计算器受热,可能影响计算器的正常使用。
3. 避免使用尖锐物品敲击计算器。
计算器的外壳通常是塑料制品,敲击或使用尖锐物品可能导致计算器损坏。
4. 购买正规厂家的计算器。
选择质量可靠的计算器品牌,确保使用过程中的准确性和稳定性。
四、常见问题解答1. 为什么计算结果不准确?答:可能是因为输入错误或者按键故障。
请检查输入的数字和运算符是否正确,如果经过核对仍然不准确,可能需要修理或更换计算器。
2. 如何清零计算器?答:计算器通常具有清零功能,可以通过按下"C"或"CE"键来清零。
得力DL-D82ES计算器使用说明书

得力DL-D82ES计算器使用说明书得力 DLD82ES 计算器使用说明书一、产品概述得力 DLD82ES 计算器是一款功能强大、操作简便的电子计算器,适用于各种数学计算、财务运算、科学研究等领域。
它具有高精度的计算能力、丰富的功能按键和清晰的显示屏,能够满足您多样化的计算需求。
二、外观及按键介绍1、显示屏计算器的显示屏采用高清液晶显示,能够清晰地显示数字、运算符号和计算结果。
2、数字按键0-9 的数字按键排列整齐,方便您快速输入数字。
3、功能按键(1)四则运算按键:包括加(+)、减()、乘(×)、除(÷),用于进行基本的数学运算。
(2)平方根(√)、百分比(%)、倒数(1/x)等按键,方便进行特定的数学计算。
(3)存储功能按键:M+(存储加)、M(存储减)、MR(存储读取)、MC(存储清除),用于数据的存储和调用。
(4)清除按键:包括CE(清除当前输入)、C(清除全部计算),帮助您及时修正输入错误或重新开始计算。
三、基本操作方法1、开机与关机按下“ON”键开机,按下“OFF”键关机。
2、数字输入直接点击数字按键输入相应的数字。
3、四则运算输入第一个数字后,按下相应的运算符号,再输入第二个数字,最后按下“=”键得出计算结果。
例如:计算 2 + 3,先输入 2,再按下“+”键,输入 3,最后按下“=”键,显示屏将显示 5 。
四、功能操作详解1、平方根计算输入要计算平方根的数字,然后按下“√”键,即可得到平方根的结果。
2、百分比计算输入数字后,按下“%”键,可将数字转换为百分比形式。
例如:输入 05,按下“%”键,显示屏将显示 50% 。
3、倒数计算输入数字后,按下“1/x”键,可得到该数字的倒数。
五、存储功能使用1、 M+ 键在进行计算时,如果需要将当前结果加上之前存储的数值,可以按下“M+”键。
2、 M 键若要将当前结果减去之前存储的数值,按下“M”键。
3、 MR 键当需要读取存储的数值时,按下“MR”键。
计算器的使用与技巧

计算器的使用与技巧计算器是一种常见的电子设备,被广泛应用于各行各业。
无论是在学习、工作还是日常生活中,计算器都可以帮助我们进行各种数值计算和数据处理。
本文将为大家介绍使用计算器的一些基本技巧和注意事项。
一、基本操作与功能1.1 打开与关闭计算器将计算器的电源开关调至“ON”位置即可打开计算器。
通常,在不使用计算器时,建议将电源开关调至“OFF”位置,以节省电池电量并延长电池使用寿命。
1.2 四则运算计算器最基本的功能之一就是进行四则运算。
通过按下数字键、加减乘除符号键和等号键,可以轻松进行加法、减法、乘法和除法运算。
例如,要计算3加5等于几,只需按下“3 + 5 =”即可得出结果。
1.3 百分比计算计算器可以非常方便地进行百分比计算。
要计算一个数的百分之几,只需将该数乘以百分数,然后按下等号键即可得出结果。
例如,要计算100的30%,只需输入“100 × 30 =”。
1.4 括号计算在复杂的数学运算中,括号的使用可以改变运算顺序。
计算器同样支持括号计算。
要进行括号计算,只需按下左括号键、输入相应的运算式,再按下右括号键即可。
例如,要计算(3 + 5) × 2,只需输入“(3+ 5)× 2 =”。
二、高级操作与技巧2.1 科学计数法科学计数法是一种用于表示非常大或非常小的数的方法。
计算器可以方便地进行科学计数法的运算。
要输入一个科学计数法,可以使用“EE”键(表示10的幂)。
例如,要输入3×10^5,可以输入“3 × 10 EE5 =”。
2.2 统计与数据处理除了基本的四则运算,计算器还可以进行统计和数据处理。
一些高级的计算器具备统计功能,可以计算均值、标准差等统计指标。
此外,还可以使用计算器进行数据排序、查找和删除等操作。
2.3 单位转换一些计算器具备单位转换功能,可以进行长度、重量、温度等单位之间的转换。
通过输入数值和原始单位,再选择目标单位,计算器可以迅速完成单位转换计算,非常便捷。
计算器的基本操作

计算器的基本操作在我们日常生活中,计算器是一个非常常见和实用的工具。
不论是在工作中还是在学习中,计算器的基本操作都是我们必须掌握的。
本文将介绍计算器的基本操作方法,以帮助读者更好地使用计算器。
1. 开机与关机计算器的开机和关机是使用计算器的第一步。
通常,计算器上会有一个开关按钮,我们只需要按下开关按钮即可实现开机功能,同样地,按下开关按钮一段时间可以实现关机功能。
2. 数字输入计算器的最基本功能是进行数字的计算,因此我们需要掌握数字的输入方法。
通常,计算器上会有一个十个数字的按钮,分别代表0到9的数字。
我们只需要按下相应的数字按钮,计算器上就会显示相应的数字。
3. 四则运算计算器不仅可以进行数字的输入,还可以进行各种数学运算,包括加法、减法、乘法和除法。
在计算器上,通常有四个基本运算符号的按钮,分别是加号(+)、减号(-)、乘号(×)和除号(÷)。
我们只需要按下相应的运算符号按钮,然后输入要计算的数字,最后按下等号(=)按钮,计算器就会给出计算结果。
4. 小数与分数计算除了整数计算之外,计算器还可以进行小数和分数的计算。
在计算小数时,我们可以输入小数点(.)来分隔整数部分和小数部分。
在计算分数时,通常会有一个分数键或者倒数键,通过按下相应的按钮,我们可以输入分子和分母的数值,计算器就会给出相应的结果。
5. 百分数计算百分数是日常生活中经常应用到的一种计算方式,计算器也可以帮助我们进行百分数的计算。
在计算器上,通常有一个百分号(%)的按钮,我们可以按下该按钮,然后输入相应的数字,计算器就会将其转换成对应的百分数。
6. 平方、开方与倒数计算器还具有求平方、开方和倒数的功能。
在计算器上,通常会有一个平方(x²)按钮、一个开方(√)按钮和一个倒数(1/x)按钮。
我们只需要按下相应的按钮,然后输入要进行计算的数字,计算器就会给出计算结果。
7. 清零功能在使用计算器时,我们可能会输入错误或者需要重新计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。
本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。
通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。
通过对各种指令的合理使用,熟悉并加深对各种指令的用法。
学会使用汇编语言设计各个功能模块。
当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。
1中文摘要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。
如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。
在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算关键字:计算器、四则运算、进位、错位、清屏目录1系统分析 -------------------------------------------------2系统总体设计----------------------------------------------3详细设计-------------------------------------------------- 4统测试 ---------------------------------------------------5软件使用说明书 ------------------------------------------- 设计总结----------------------------------------------------参考文献----------------------------------------------------致谢———————————————————————————————————31.系统分析本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,我要解决的是输入时是用INT 21H的10号功能调用还是用INT 21H 的1号功能调用来进行输入。
若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。
我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。
在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
第三步,根据计算器程序所要实现的功能完成各个功能模块。
设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。
子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div 除法运算模块,input输入模块等。
最后还要对这个简易计算器进行功能完善。
为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。
如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。
在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算52.系统总体设计73.详细设计B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTRCODE SEGMENTASSUME CS:CODE,DS:CODEORG 100H;主程序开始NEWSTAR:JMP STAREVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEARCLDPUSH AXOVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET;输出一个制表符TAB LABEL NEARMOV AL,9JMP SHORT DISP ;输出一个回车换行符CRLF LABEL NEARMOV AL,13CALL DISPMOV AL,10;显示一个字符DISP LABEL NEARPUSH AXPUSH DXMOV AH,2MOV DL,ALINT 21HPOP DXPOP AXRET;检查是否为运算符ISYSF LABEL NEARCLDLODSBCALL ISJJJZ ISYSF1CALL ISIIJZ ISYSF1DEC SI9ISYSF1:RET;检查是否是加减运算ISJJ LABEL NEARCMP AL,'+'JZ ISYSF1CMP AL,'-'RET;检查是否为乘除运算ISII LABEL NEARCMP AL,'*'JZ ISYSF1CMP AL,'/'JZ ISYSF1CMP AL,'\'RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEARPUSH AXPUSH BXPUSH DXPUSH BPXOR BP,BP DOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1 DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BXPOP AXRET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DX11MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'JA DATE6DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4 DATE3:ADD DI,BXADC DX,BPDATE4:ADD AX,DIADC DX,0JMP DATE1DATE5:ADD AL,9JMP DATE2JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEARMOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2 JSJJ1:ADD NUM1,AXADC NUM1+2,DX JSJJ2:13RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEARMOV BX,OFFSET NUM1JMP SHORT JSII2_1 ;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEARMOV BX,OFFSET NUM2 JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3 JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AXJSII2_3:DB 66HMOV [BX],AXRET;显示结果XUJG LABEL NEARMOV AX,JGV4MOV DX,JGV4+2MOV CX,10CMP UV,10JZ XUJG0MOV CX,16XUJG0:TEST DX,8000HJZ XUJG1CMP UV,10JZ XUJG2CALL DOUTXUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISPXUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,1015JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRETXUJG1:CALL DOUTRET;计算结果放入DX:AX中JSJG LABEL NEARCALL JSJJMOV AX,NUM1MOV DX,NUM1+2RET;从DS:SI处取一个数据LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRETLOADATE1:PUSH NUM1 ;保存数据1数据2及运算符PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0;进行四则运算SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DXSZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AXSZYS3:MOV YSF1,ALMOV YSF2,AL17CALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算JMP SZYS1 ; 结果保存在数据1中SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DXSZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算JMP SZYS4_1 ; 结果保存在数据2中SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1+2POP NUM1RETSZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AXMOV JGV4+2,DXJNZ SZYS12SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7SZYS10:MOV NUM1,AXMOV NUM1+2,DXJMP SZYS1SZYS11:19STCRETSZYS12:CLCRET;数制处理UVIL LABEL NEARPUSH SI UVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1 UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11CMP AX,'01'JNZ SZYS11PUSH SIMOV UV,10 UVIL3:MOV AL,13MOV [BX-1],AL UVIL4:POP SICLCRET;预置结果YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,DS:[0CH]MOV CS:JGV4,AXMOV AX,DS:[0EH]MOV CS:JGV4+2,AXPUSH CSPOP DSPUSH CSPOP ESRET;保存结果BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,CS:JGV4MOV DS:[0CH],AXMOV AX,CS:JGV4+2MOV DS:[0EH],AXPUSH CS21POP DSPUSH CSPOP ESRETSTAR:MOV SI,81HCLDCALL OVERSJNZ STAR1STAR0:MOV DX,OFFSET MESS1JMP STAR4STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3 STAR4:MOV AH,9INT 21HINT 20HSAVESP DW 0MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$' MESS2 DB 'Error in expression !$'MESS3 DB 13,10,'$'CODE ENDSEND NEWSTAR234.系统测试4.1 运行界面分析将源程序输入编辑程序中,检查无误后经汇编、连接后装入系统运行界面如图4-1所示:图4-1 运行界面程序的运行界面显示成功,屏幕上显示“input a suanshi(input q exit):”提示用户输入一个算式。