四则运算计算器
用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. 百分数计算:计算器可以计算百分数和百分之一的计算。
用户只需输入数字和百分号,计算器会自动计算百分数和百分之一的值。
4. 常用函数计算:一些高级计算器还提供常用函数的计算功能,如三角函数(正弦、余弦、正切)、反三角函数、对数函数等。
用户只需按下相应的功能键,输入参数,计算器会进行函数计算并给出结果。
5. 统计功能:一些计算器还提供统计功能,如求平均值、标准差、方差等。
用户只需输入一系列数据,计算器会自动进行统计计算并给出结果。
6. 货币换算:一些计算器还可以进行货币换算,如人民币和美元的兑换。
用户只需输入相应的汇率和金额,计算机会自动进行计算并给出结果。
7. 时间计算:计算器可以计算时间差和日期计算。
用户只需输入日期和时间,计算器会自动进行计算并给出结果,如计算两个日期之间的天数,计算某个日期之后的几天。
8. 单位换算:计算器还可以进行单位换算,如长度单位、面积单位、体积单位等。
用户只需输入相应的换算关系和数值,计算器会自动进行计算并给出结果。
9. 方程求解:一些高级计算器还提供方程求解功能,可以求解一元方程、二元方程等。
用户只需输入方程,计算器会自动进行计算并给出结果。
10. 进制转换:计算器还可以进行不同进制之间的转换,如十进制和二进制的转换。
用户只需输入相应的进制和数值,计算器会自动进行计算并给出结果。
总之,计算器是一种功能强大的电子设备,可以进行各种复杂的数学计算和其他相关的功能。
实验五 整数四则混合运算计算器

实验五整数四则混合运算计算器一、实验目的掌握具有一定实用功能的汇编程序开发思路。
二、实验原理和内容1、在数据段上开辟:1个叫OP的字数组,长度为10个字;1个叫OPERATOR 的字节数组,长度为10个字节;以及1个RESULT字数组,长度1个字。
如下图:OP OPERATOR RESULT共10 共10个字个字节2、在数据段定义一个字符串缓冲区。
编写程序,输入字符串(该字符串有多个操作数和运算符,例如:12+34*56)到缓冲区中,然后从缓冲区把所有操作数转换为补码并分别保存到OP数组中,把所有运算符保存到OPERATOR中。
3、编写四则混合运算程序,结果以补码方式存放在RESULT上。
并在屏幕上输出结果。
三、实验器材:Windous 7系统下的Masm 2009汇编软件四、实验步骤:1、先画框图(如下)输入字符是“=”小于28H 大于39H 小于30H 输入结束是否是是是否否否是符号,执行相应处理是数值,执行相应处理输入是数值结果作为新的原值保存减30H与原值的10倍相加输入是符号是“(”是“)”否配对标志加1配对标志减1是是保存符号否输入结束配对标志为0出错,退出进行计算是否1212*34+563456*+数值存储符号存储(a)1212*(34+56-8)3456*(数值存储符号存储(b)8+-)1212*21-((34+56-8)+1)2134*(数值存储符号存储(c)56+-)81-(+)21优先级2优先级332优先级55132、 编写程序:;----------------------------------------------------------------------------- ;----------------------------数据定义----------------------------------------- DSEG SEGMENTSIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 NUMB DW 20H DUP (0) ;保存输入的数值 MARK DB 'A' ;保存输入的运算符 DB 10H DUP (0) ;ERROR DB ' YOUR INPUT ARE WRONG$' DSEG ENDS;----------------------------宏定义-----------------------------------------DISP MACRO M ;字符串输出LEA DX,M ;将M的偏移地址传送给DX寄存器MOV AH,9 ;其中09H是字符串输出INT 21H ;通过给AH寄存器赋值,再调用INT 21H指令,根据AH寄存器中的值执行相应的操作ENDMCHOICE MACRO ASC1,HAO1,HH ;宏定义,给运算符赋权值CMP AL,ASC1 ;比较键盘输入的运算符(运算符的ASC码存放在AL寄存器)与ASC1JNE OTHER&HAO1 ;若不等,则往下执行OTHER1,如此类推MOV CH,HH ;将运算符的权值(即优先级高低值)传送到CH 寄存器JMP OTHER7 ;执行后,返回ENDM;----------------------------------------------------------------------------CSEG SEGMENT;ASSUME CS:CSEG,DS:DSEGSTART: CALL CLEARMOV AX,DSEG ;MOV DS,AX ;LEA DI,NUMB ;将NUMB的偏移地址传送到DI,NUMB存储单元中存放输入的数值LEA SI,MARK ;将MARK的偏移地址传送到SI,MARK存储单元中存放输入的运算符MOV AX,0;数据寄存器清零MOV DX,0MOV BX,0MOV CX,0STA1 : CALL CR ;回车换行;--------------------------------初始化-------------------------------------INPUT:MOV AH,1 ;其中1H是键盘输入并回显,AL中有输入字符INT 21H ;通过给AH寄存器赋值,再调用INT 21H指令,根据AH寄存器中的值执行相应的操作;--------------------------------输入字符-----------------------------------CMP AL,'q'JE J_SHU;----------------------------若输入q,则返回dos状态--------------------------CMP AL,'=';JE PD ;判断配对标志位;--------------------是等号,进一步判断输入括号是否配对---------------------- CMP AL,28H ;JB BC ;JB为小于就跳转CMP AL,39H ;JA BC ;JA为大于就跳转;-------------------输入字符的ASC码小于28H或大于39H,则继续输入-------------- CMP AL,2FH ;判断是数字还是符号JBE JUD ;是符号转入响应操作;----------------------------------------------------------------------------INC WORD PTR SIGN1 ;将数字标志位加1SUB AL,30H ;将ASC码转16进制MOV AH,0 ;XCHG AX,[DI] ;互换两个操作数的存放位置,实现字交换MOV BX,10 ;MUL BX ;无符号数乘法指令XCHG AX,[DI] ;ADD [DI],AX ;JMP INPUT ;;-------------------------输入为数值时的操作----------------------------------PD: CMP WORD PTR SIGN2,0 ;判断配对标志位JE JUD ;跳到判断数值是否输入完毕JMP BC ;不配对则显示ERROR;----------------------------------------------------------------------------JUD: CMP WORD PTR SIGN1,0 ;判断数值是否输入完毕JE FUH1 ;跳到判断优先级ADD DI,2 ;DI向下移一个字MOV WORD PTR SIGN1,0;数值标志位清零;----------------------------------------------------------------------------FUH1: CALL ADV ANCE ;判定优先级CMP CH,5 ;判断输入的运算符中是否有左括号JNE PY ;不是,则判断输入的运算符中是否有右括号;----------------------------------------------------------------------------INC WORD PTR SIGN2 ;是左括号,括号标志位加1;----------------------------------------------------------------------------PY: CMP CH,1 ;判断输入的是否是右括号JNE AGAIN ;跳到判断运算存储区是否为空DEC WORD PTR SIGN2 ;是右括号,括号标志位减1;----------------------------------------------------------------------------AGAIN: CMP BYTE PTR[SI],'A';判断运算符存储区是否为空JE SA VE ;判断输入是否为=CMP CH,[SI] ;JA SA VE ;计算高优先级的SI指向运算符,每个运算符都有相应的权值CMP BYTE PTR[SI],'('JNE YIDO;寻找左括号DEC SI;是左括号,还是向上移,判断左括号前边是否还有运算符JMP INPUT;;----------------------------------------------------------------------------YIDO: DEC SI ;SI向上移MOV CL,[SI] ;将运算符传送给CLCALL MATCH ;判断是什么运算符并进行相应的计算JMP AGAIN ;判断运算符存储区是否为空;----------------------------------------------------------------------------SA VE: CMP CH,0 ;JE OVER ;=时,则输出结果CMP CH,1 ;JE INPUT ;“)”不保存,输入下一个数INC SI ;MOV [SI],AL ;INC SI ;CMP CH,5 ;JNE GO_ON ;MOV CH,2 ;改变(的权值GO_ON: MOV [SI],CH ;JMP INPUT ;;----------------------------------------------------------------------------BC: LEA DX,ERROR ;将ERROR的偏移地址给DXMOV AH,9 ;INT 21H ;CALL CRJMP J_SHU1 ;;----------------------------四则运算子程序---------------------------------- MATCH PROC ;子程序,进行相应的运算PUSH AX ;XOR AX,AX;异或XOR BX,BX;----------------------------乘法运算---------------------------------------CMP CL,2AH ;乘法运算JNE NEXT1SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXMOV [DI],AXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------除法运算--------------------------------------- NEXT1: CMP CL,2FH ;除法运算JNE NEXT2SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXMOV [DI],AXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------加法运算--------------------------------------- NEXT2: CMP CL,2BH ;加法运算JNE NEXT3SUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------减法运算--------------------------------------- NEXT3: CMP CL,2DH ;减法运算JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH: POP AXRETMATCH ENDP;----------------------------------------------------------------------------;----------------------------定义优先级-------------------------------------- ADV ANCE PROCCHOICE 28H,1,5 ;( 28H为( 的ASCII码OTHER1: CHOICE 29H,2,1 ;)OTHER2: CHOICE 2AH,3,4 ;*OTHER3: CHOICE 2FH,4,4 ;/OTHER4: CHOICE 2BH,5,3 ;+OTHER5: CHOICE 2DH,6,3 ;-OTHER6: CHOICE 3DH,7,0 ;=OTHER7: RETADV ANCE ENDP;----------------------------------------------------------------------------;----------------------------***清屏***-------------------------------------- Clear PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,06HMOV AL,00HMOV CH,0MOV CL,0MOV BH,0FHMOV DH,18HMOV DL,4FHINT 10HMOV BH,0MOV DX,0MOV AH,02HINT 10HPOP DXPOP CXPOP BXPOP AXRETClear ENDP;----------------------------------------------------------------------------;----------------------------****回车换行****-------------------------------- CR PROCPUSH AXPUSH DXMOV AH,2MOV DL,13;回车INT 21HMOV AH,2MOV DL,10;换行INT 21HPOP DXPOP AXRETCR ENDP;----------------------------------------------------------------------------OVER:SUB DI,2CMP WORD PTR[DI],0JGE W1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21H;---------------------------------------------------------------------------- W1: MOV BX,10000MOV CX,5MOV SI,0;---------------------------------------------------------------------------- W2: MOV AX,[DI]MOV DX,0DIV BXMOV [DI],DXCMP AL,0JNE W3CMP SI,0JNE W3CMP CX,1JE W3JMP W4;---------------------------------------------------------------------------- W3: MOV DL,ALADD DL,30HMOV AH,2INT 21HMOV SI,1;---------------------------------------------------------------------------- W4: MOV AX,BXMOV DX,0MOV BX,10DIV BXMOV BX,AXLOOP W2;---------------------------------------------------------------------------- J_SHU1: MOV WORD PTR[DI],0CALL CRMOV NUMB,0MOV SIGN1,0LEA DI,NUMB ;LEA SI,MARKJMP STA1;----------------------------****返回DOS状态****-----------------------------J_SHU: MOV AH,4CH;返回DOS状态INT 21H;----------------------------------------------------------------------------CSEG ENDSEND START3、显示结果五、实验总结:在本次的课程设计中,我遇到了很多难题,在通过翻看书本和上网找资料后,我渐渐的接触到一点眉目,开始进行尝试的编程,在不断的尝试、失败和修改中,我慢慢的懂得汇编一个计算器的基本原理和所需要的一些细节问题。
C语言简单计算器实现四则运算可带括号

C语言简单计算器实现四则运算可带括号```c#include <stdio.h>#include <stdlib.h>int priority(char op)if (op == '+' , op == '-')return 1;else if (op == '*' , op == '/')return 2;else if (op == '(')return 0;elsereturn -1;void calculate(char op, int *numStack, int *top, char *opStack, int *opTop)int num2 = numStack[(*top)--];int num1 = numStack[(*top)--];switch (op)case '+':numStack[++(*top)] = num1 + num2; break;case '-':numStack[++(*top)] = num1 - num2; break;case '*':numStack[++(*top)] = num1 * num2; break;case '/':numStack[++(*top)] = num1 / num2; break;}int eval(char *expr)int numStack[100];char opStack[100];int numTop = -1;int opTop = -1;int num = 0;int sign = 1;while (*expr != '\0')if (*expr >= '0' && *expr <= '9')num = num * 10 + (*expr - '0');} else if (*expr == '+' , *expr == '-')numStack[++numTop] = num * sign;num = 0;sign = (*expr == '+') ? 1 : -1;} else if (*expr == '*' , *expr == '/')while (opTop >= 0 && priority(*expr) <=priority(opStack[opTop]))calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}opStack[++opTop] = *expr;} else if (*expr == '(')opStack[++opTop] = '(';} else if (*expr == ')')while (opStack[opTop] != '(')calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}opTop--;}expr++;}numStack[++numTop] = num * sign;while (opTop >= 0)calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}return numStack[0];int maichar expr[100];printf("请输入表达式:");scanf("%s", expr);int result = eval(expr);printf("计算结果:%d\n", result);return 0;```以上是一个简单的C语言四则运算计算器的实现。
c语言四则运算计算器

c语言四则运算计算器C语言四则运算计算器摘要:计算器是我们日常生活中常见和实用的工具之一。
本文将介绍如何使用C语言编写一个简单的四则运算计算器。
首先,我们将了解四则运算的定义和原则。
然后,我们将逐步介绍计算器的实现,包括用户输入、运算符识别和运算结果输出。
最后,我们将通过示例演示计算器的使用,并讨论一些功能的改进。
1.引言计算器是一种用于执行基本数学运算的设备或工具。
它通常可以进行加法、减法、乘法和除法等四个基本运算符的操作。
许多计算器还具有其他功能,如求平方根、百分比计算等。
编写一个计算器程序涉及到基本的输入、运算和输出。
2.四则运算的定义与原则四则运算是指加法、减法、乘法和除法四个基本运算。
这些运算符有一定的运算规则和优先级,如乘法和除法优先于加法和减法。
在编写计算器程序时,我们需要遵循这些原则来确保正确的运算结果。
3.计算器的实现3.1 用户输入使用C语言编写计算器程序的第一步是获取用户的输入。
通常,用户可以通过控制台或图形用户界面输入计算表达式。
在本文中,我们将使用控制台输入。
用户输入应该是一个合法的表示式,其中包含数值和运算符。
3.2 运算符识别在得到用户输入后,我们需要识别表达式中的运算符,以便进行运算。
常见的运算符有加号(+)、减号(-)、乘号(*)和除号(/)。
我们可以使用条件语句或函数来判断输入的运算符,并将其转化为相应的计算操作。
3.3 运算结果输出一旦我们完成了运算,我们需要将结果输出给用户。
输出可以是一段文字或数字,可以打印在控制台上,也可以显示在图形界面上。
在C语言中,我们可以使用printf函数来输出结果。
根据需要,我们可以将结果四舍五入,设置特定的精度或格式。
4.示例演示让我们通过一个示例来展示计算器的使用。
假设用户输入表达式\。
网页版计算器

前面我已经在WIN32平台中用C语言实现了加减乘除四则运算的计算器,现在我把它移植到网页中,使用HTML+Javascript语言实现它。
一、需求:在网页中编程实现一个简单的计算器,它能提供加减乘除四则运算,它支持IE 浏览器或火狐浏览器。
二、界面原型三、界面编码<html><head><title>加减乘除四则运算器</title></head><body><input type="text" width="50" value="" id="result" ><br><input type="button" style="width:30" style="height:25" value="1" id="One" onclick="Bt1()" /> <input type="button" style="width:30" style="height:25" value="2" id="Two" onclick="Bt2()" /> <input type="button" style="width:30" style="height:25" value="3" id="Three" onclick="Bt3()" /> <input type="button" style="width:30" style="height:25" value="+" id="Add" onclick="BtAdd()" /><br><input type="button" style="width:30" style="height:25" value="4" id="Four" onclick="Bt4()" /> <input type="button" style="width:30" style="height:25" value="5" id="Five" onclick="Bt5()" /> <input type="button" style="width:30" style="height:25" value="6" id="Six" onclick="Bt6()" /><input type="button" style="width:30" style="height:25" value="-" id="Sub" onclick="BtSub()" /> <br><input type="button" style="width:30" style="height:25" value="7" id="Seven" onclick="Bt7()" /> <input type="button" style="width:30" style="height:25" value="8" id="Eight" onclick="Bt8()" /> <input type="button" style="width:30" style="height:25" value="9" id="Nine" onclick="Bt9()" /> <input type="button" style="width:30" style="height:25" value="*" id="Mud" onclick="BtMud()" /><br><input type="button" style="width:30" style="height:25" value="0" id="Zero" onclick="Bt0()" /> <input type="button" style="width:30" style="height:25" value="." id="Point" onclick="BtPoint()" /><input type="button" style="width:30" style="height:25" value="=" id="Equal" onclick="BtEqual()" /><input type="button" style="width:30" style="height:25" value="/" id="Div" onclick="BtDiv()" /><input type="button" style="width:68" style="height:25" value="CLEAR" id="Clean" onclick="BtClean()" /></body></html>四、功能部分编码<script language="javascript">var rlt = 0.0;var middle = 0.0;var flag = 0; //1:+ 2:- 3:* 4:/var equalflag = 1; //0:button equal not pressed 1:button equal pressedvar changeflag = 0;function Bt1(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0){tmp.value += "1";}else{tmp.value = "1";}}else{tmp.value = "1";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt2(){var tmp = document.getElementById("result");if(changeflag == 0)if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "2";}else{tmp.value = "2";}}else{tmp.value = "2";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt3(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "3";}else{tmp.value = "3";}}else{tmp.value = "3";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt4()var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "4";}else{tmp.value = "4";}}else{tmp.value = "4";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt5(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "5";}else{tmp.value = "5";}}else{tmp.value = "5";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt6(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "6";}else{tmp.value = "6";}}else{tmp.value = "6";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt7(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "7";}else{tmp.value = "7";}}else{tmp.value = "7";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt8(){var tmp = document.getElementById("result");if(changeflag == 0){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "8";}else{tmp.value = "8";}}else{tmp.value = "8";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt9(){var tmp = document.getElementById("result");if(changeflag == 0 ){if( parseFloat(tmp.value) != 0 || tmp.value.indexOf(".") > 0) {tmp.value += "9";}else{tmp.value = "9";}}else{tmp.value = "9";changeflag = 0;}middle = parseFloat(tmp.value);}function Bt0(){var tmp = document.getElementById("result");if(changeflag == 0){if(tmp.value.indexOf(".") > 0 || parseFloat(tmp.value) != 0) {tmp.value += "0";}else{tmp.value = "0";}}else{tmp.value = "0";changeflag = 0;}middle = parseFloat(tmp.value);}function BtPoint(){var tmp = document.getElementById("result");if( (tmp.value.indexOf(".") < 0) && (tmp.value.length > 0)) {tmp.value += ".";}}function BtAdd(){var tmp = document.getElementById("result");if(equalflag){rlt = parseFloat(middle);}else{switch(flag){case 1:rlt += parseFloat(middle);break;case 2:rlt -= parseFloat(middle);break;case 3:rlt *= parseFloat(middle);break;case 4:if( parseFloat(middle) != 0){rlt /= parseFloat(middle);}break;}}changeflag = 1;middle = 0.0;flag = 1;equalflag = 0;tmp.value = parseFloat(rlt);}function BtSub(){var tmp = document.getElementById("result"); if(equalflag)rlt = parseFloat(middle);}else{switch(flag){case 1:rlt += parseFloat(middle);break;case 2:rlt -= parseFloat(middle);break;case 3:rlt *= parseFloat(middle);break;case 4:if( parseFloat(middle) != 0){rlt /= parseFloat(middle);}break;}}changeflag = 1;middle = 0.0;flag = 2;equalflag = 0;tmp.value = parseFloat(rlt);}function BtMud(){var tmp = document.getElementById("result");if(equalflag){rlt = parseFloat(middle);}else{switch(flag)case 1:rlt += parseFloat(middle);break;case 2:rlt -= parseFloat(middle);break;case 3:rlt *= parseFloat(middle);break;case 4:if( parseFloat(middle) != 0){rlt /= parseFloat(middle);}break;}}changeflag = 1;middle = 0.0;flag = 3;equalflag = 0;tmp.value = parseFloat(rlt);}function BtDiv(){var tmp = document.getElementById("result");if(equalflag){rlt = parseFloat(middle);}else{switch(flag){case 1:rlt += parseFloat(middle);break;case 2:rlt -= parseFloat(middle);break;case 3:rlt *= parseFloat(middle);break;case 4:if( parseFloat(middle) != 0){rlt /= parseFloat(middle);}break;}}changeflag = 1;middle = 0.0;flag = 4;equalflag = 0;tmp.value = parseFloat(rlt);}function BtEqual(){var tmp = document.getElementById("result");switch(flag){case 1:rlt += parseFloat(middle);break;case 2:rlt -= parseFloat(middle);break;case 3:rlt *= parseFloat(middle);break;case 4:if( parseFloat(middle) != 0){rlt /= parseFloat(middle);}break;}changeflag = 1;middle = rlt;flag = 0;equalflag = 1;tmp.value = parseFloat(rlt);}function BtClean(){var tmp = document.getElementById("result");tmp.value = "";middle = 0.0;rlt = 0.0;flag = 0;equalflag = 1;changeflag = 1;}</script>将它们放到</head>之前,然后保存一个文件名xx.html五、测试使用IE浏览器或者火狐浏览器,把xx.html 打开,按事先编写好的测试用例进行测试。
python中计算器四则运算功能代码

python中计算器四则运算功能代码Python是一种功能强大的编程语言,它提供了丰富的库和模块,可以用于各种不同的应用场景。
其中,计算器是Python中常见的一个功能,可以用来进行四则运算。
本文将为大家介绍如何使用Python实现一个简单的计算器,并进行四则运算。
在Python中,可以使用基本的数学运算符号来进行四则运算,包括加法(+)、减法(-)、乘法(*)和除法(/)。
下面我们通过一个实例来演示如何使用Python编写一个计算器。
我们需要使用input()函数来获取用户输入的两个数字和运算符号。
代码如下所示:```pythonnum1 = float(input("请输入第一个数字:"))operator = input("请输入运算符号:")num2 = float(input("请输入第二个数字:"))```接下来,我们需要根据用户输入的运算符号来进行对应的运算操作。
使用if语句来判断运算符号,并执行相应的计算操作。
代码如下所示:```pythonif operator == "+":result = num1 + num2elif operator == "-":result = num1 - num2elif operator == "*":result = num1 * num2elif operator == "/":result = num1 / num2else:print("输入的运算符号不正确!")```我们将计算结果输出给用户。
代码如下所示:```pythonprint("运算结果为:", result)```至此,我们完成了一个简单的计算器的编写。
用户可以输入两个数字和运算符号,程序将输出计算结果。
JavaScript实现计算器的四则运算功能

JavaScript实现计算器的四则运算功能⽬录⼀、需求 + 最终实现1. 需求2. 说明:利⽤了字符串(split、replace)和数组(splice)的⽅法。
3. 代码实现⼆、实现步骤1. 版本⼀:实现基础加减乘除2. 版本⼆:实现⾼位数的运算3. ⽀持多次的运算三、思考后端思维前端思维结束⼀、需求 + 最终实现注:只是前端实现1. 需求需求来源是因为有⼀个做嵌⼊式 C/C++的基友做了⼀个远程计算器。
需求是要求⽀持输⼊⼀个四则混合运算公式的字符串,返回计算后的结果。
想看看⽤ C/C++封装过的 JavaScript 如果要实现这样⼀个功能最终效果(⽂章后我会讨论这两种实现思路,还望各位看官可以提出⼀些优化⽅案以及建议之类的~)。
2. 说明:利⽤了字符串(split、replace)和数组(splice)的⽅法。
主要是⽤到字符串切分为数组的⽅法 split、以及数组中插⼊删除的⽅法 splice。
字符串正则 replace ⽅法是考虑到⽤户的输⼊习惯可能有所不同,例如 1+2*3/4与 3 * 7 + 229。
⽀持:基础四则运算 3+6*5/6-3;⼩数四则运算 3.14 + 6 * 5 / 6 - 3.5;⾼位四则运算 99 * 94 - 6.35 + 100 / 1024;多次四则运算 3 * 3 + 3 * 16 - 7 - 5 + 4 / 2 + 22;以上综合不⽀持:带括号的运算 1 * (2 - 3);其他数学运算3. 代码实现/*** js四则混合运算计算器功能实现(约20⾏+ ⾯条代码)* @param {string} str 输⼊的四则运算字符串* @return {number} 输出结果*/const calculator = (str) => {// 定义添加字符函数const add = (arr, symbol) => {let length = arr.length;while (length > 1) {arr.splice(length - 1, 0, symbol); // 在每⼀项后⾯添加对应的运算符length--;}return arr; // ⽬的是得到⼀个改变长度的数组}const array = add(str.replace(/\s*/g,"").split('+'), '+').map(it => add(it.split('-'), '-').map(it => add(it.split('*'), '*').map(it => add(it.split('/'), '/')))).flat(3);;// 先运算乘除法['*', '/'].map(it => {while (array.includes(it)) {const index = array.findIndex(o => o === it);index > 0 && it === '*' ? array.splice(index - 1, 3, (Number(array[index - 1]) * Number(array[index + 1]))) : array.splice(index - 1, 3, (Number(array[index - 1]) / Number(array[index + 1])));}})// 再执⾏加减法,即从左⾄右的计算while (array.length > 1) {array[1] === '+' ? array.splice(0, 3, (Number(array[0]) + Number(array[2]))) : array.splice(0, 3, (Number(array[0]) - Number(array[2])));}return Number(array[0]).toFixed(2);}如果对 ES6 语法还算熟悉的话,应该可以轻松阅读代码的。
四则运算计算器程序设计javagui

四则运算计算器程序设计(java-gui) 四则运算计算器程序是一种常见的计算机程序,用于执行基本的数学运算,包括加法、减法、乘法和除法。
本文将介绍如何设计一个使用Java GUI实现的四则运算计算器程序。
首先,我们需要创建一个Java GUI窗体,用于显示计算器的界面。
可以使用Java Swing或JavaFX来创建窗体,本文以Java Swing为例。
可以使用JFrame类来创建一个窗体,并添加各种组件,如按钮、标签和文本框等。
在窗体中,我们需要添加一个文本框用于输入表达式和显示结果。
可以使用JTextField类来创建一个文本框,并设置合适的大小和位置。
另外,我们还需要添加一些按钮来表示数字和运算符,可以使用JButton类来创建按钮,并将其添加到窗体中。
接下来,我们需要为按钮添加事件监听器,以便在用户点击按钮时执行相应的操作。
例如,当用户点击数字按钮时,我们需要将相应的数字添加到文本框中;当用户点击运算符按钮时,我们需要将相应的运算符添加到文本框中;当用户点击等号按钮时,我们需要解析文本框中的表达式,并执行相应的运算。
为了实现四则运算,我们可以使用Java的数学库来执行相应的运算。
例如,可以使用Integer.parseInt方法将文本框中的字符串转换为整数,使用加法运算符执行加法运算,使用乘法运算符执行乘法运算等。
在解析和执行表达式时,我们需要考虑一些错误情况,例如除数为零或表达式不合法等。
可以使用try-catch语句来捕获这些异常,并显示相应的错误信息。
最后,我们需要将计算结果显示在文本框中,并提供清除按钮,以便用户可以清除文本框中的内容。
可以使用setText方法将计算结果显示在文本框中,使用setText("")方法来清除文本框中的内容。
综上所述,一个基本的四则运算计算器程序的设计包括创建窗体、添加组件、添加事件监听器、解析和执行表达式、处理异常和显示结果等步骤。
ASP 四则混合运算计算器

<td><input type="text" size=5 name="ca">
/ <input type="text" name="cb" size=5></td>
<td> = <input type="text" name="total3" size=5></td>
<td><input type="button" value="计算" onClick="equa3()"></td>
<tr><td>
<input type="text" size=5 name="aa">
- <input type="text" name="ab" size=5>
</td>
<td> = <input type="text" name="total1" size=5></td>
<td><input type="button" value="计算" onClick="equa1()"></td>
(2)左键单击【文件】|【存】命令,弹出另存为对话框。在对话框的【文件名】中输入Calculator.asp,【保存类型】的下拉列表框中选择“Active Server Pages(*.asp;*.asa)”,单击【保存(S)】按钮。
- 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):”提示用户输入一个算式。