计算器表达式计算程序设计

合集下载

用C++编写计算器程序

用C++编写计算器程序

1.2计算器的介绍(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1 计算器界面(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2 输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。

图1.3 计算后的结果(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。

图1.4 输入一个十进制数100图1.5 100转化为二进制后的结果图1.6 100转化为十六进制后的结果(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。

1算法的实现2.1把字符串转化为数字和运算符的算法(1)如果字符串中只有数字。

这个情况用来实现一些简单函数的运算。

在进行简单函数的运算时,都是先输入一个数字,再单击要进行运算的按钮,然后编辑框显示运算的结果。

程序用了一个函数double GetaStr(CString str)来实现这个功能,该函数以编辑框变量m_strResult为实参,再得到m_strResult的值后,调用GetAt函数,一个字符一个字符的读取,如果碰到整数,执行“itemp=itemp*rate+(str.GetAt(i)-'0');”,其中变量itemp初始值为0,变量rate初始值为10,如果碰到了小数点,改变rate的值,使其等于0.1,再向后继续读取,再碰到整数时执行“itemp=itemp+rate*(str.GetAt(i)-'0');rate=rate/10;”,函数的最后确定返回值为itemp。

(完整版)数学表达式计算(c语言实现)

(完整版)数学表达式计算(c语言实现)

一、设计思想计算算术表达式可以用两种方法实现:1.中缀转后缀算法此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算.具体实现方法如下:(1)中缀转后缀需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。

首先,得到用户输入的中缀表达式,将其存入str数组中。

对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。

如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。

然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。

结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空.到此在exp数组最后加结束字符\0。

我们就得到了后缀表达式。

(2)后缀表达式计算此时需要一个数值栈od来存放数值。

对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。

当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。

继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。

2。

两个栈实现算法此算法需要两个栈,一个值栈od,一个操作符栈op。

将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。

当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。

如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op 栈。

数据结构课程设计-计算器

数据结构课程设计-计算器

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。

通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。

本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。

一、需求分析首先,我们需要明确计算器程序的功能需求。

这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。

用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。

此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。

在这个计算器程序中,我们可以使用栈这种数据结构。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。

我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。

当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。

如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。

在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。

三、算法设计1、表达式解析算法从左到右扫描表达式。

如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。

如果遇到操作符(+、、、/),则将其压入操作符栈。

如果遇到左括号“(”,则将其压入操作符栈。

如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。

2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。

根据操作符的类型,从操作数栈中弹出相应数量的操作数。

进行计算,并将结果压回操作数栈。

C语言程序设计-第四章简单计算器小程序-分支程序设计

C语言程序设计-第四章简单计算器小程序-分支程序设计

P1 逻辑运算符 P2

逻辑运算符 P2
课堂练习: 求下面逻辑表达式的值: 2>1 && 4 && 7<3+!0
值为0
等价于((2>1)&&4)&&(7<(3+(!
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算的重要规则
a&&b:当a为0时,不管b为何值,结果为0
课堂练习:有下面定义的语句和逻辑表达式: int a=0,b=10,c=0,d=0 a && b && (c=a+10,d=100) 逻辑表达式执行后,a,b,c,d的值各为多少?
任务实现效果演示 例题源代码:switchcalculator.c
相关知识 1. switch语句 2. break语句
1 switch多分支选择结构
❖ 尽管用if…else if结构可以实现多分支,注但意当:分常支量较表多达时式,必程须序是结整构型较、复字杂符。型或枚举类型,不能是 实型表达式,每个case关键字后的常量表达式应互不相同
值为0 等价于i==(k>j),值为1
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算符与逻辑表达式
&&(逻辑与)、||(逻辑或)、!(逻辑非)(单目)
逻辑表达式的一般形式:
优先级: 1.由低到高: ||→ && → !; 2.多种运算符一起: = →|| →&& →关系运算符 →算术运算符→ !。
【】 简单计算器小程序:由用户输入运算数和四则运算符(+、-、*、/),输出计算结果。
【】

flutter 数学表达式计算

flutter 数学表达式计算

flutter 数学表达式计算【实用版】目录1.Flutter 简介2.数学表达式计算需求3.Flutter 中的数学表达式计算方法4.实际应用案例5.总结正文【1.Flutter 简介】Flutter 是 Google 推出的一款开源的移动应用程序开发框架,它可以帮助开发者使用一套代码库快速构建美观且高性能的 Android 和 iOS 应用程序。

由于 Flutter 采用了 Dart 编程语言,使得开发者在编写代码时能够获得较高的灵活性和效率。

【2.数学表达式计算需求】在数学、物理等科学领域,常常需要进行各种复杂的数学表达式计算。

例如,求导、积分、求解微分方程等。

在 Flutter 应用程序中,实现这些功能可以提高用户的体验,使得学术研究和学习更加便捷。

【3.Flutter 中的数学表达式计算方法】在 Flutter 中,可以使用第三方库进行数学表达式计算。

例如,MathExpresso 是一个功能强大的数学表达式库,可以满足各种计算需求。

使用该库,开发者可以轻松地在 Flutter 应用程序中实现数学表达式的输入、显示和计算。

【4.实际应用案例】假设我们要实现一个简单的计算器,可以计算乘法和除法。

首先,需要在项目中引入 MathExpresso 库:```dartdependencies:mathexpresso: ^2.0.1```在 Flutter 中创建一个简单的计算器界面,包括输入框、按钮和结果显示区域:```dartclass MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text("计算器")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[TextField(decoration: InputDecoration(labelText: "请输入表达式"),onChanged: (value) {// 在这里处理输入的表达式},),ElevatedButton(onPressed: () {// 计算表达式},child: Text("计算"),),Text(// 显示计算结果),],),),),);}}```接下来,需要处理输入的表达式并进行计算。

c语言制作简单的计算器

c语言制作简单的计算器

c语言制作简单的计算器在计算机编程领域中,C语言是一种广泛使用的编程语言之一。

它具有简单易学的特点,并且能够进行复杂的计算和逻辑处理。

今天,我们就来学习一下如何使用C语言来制作一个简单的计算器。

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

本次制作的计算器将具有基本的四则运算功能,即加法、减法、乘法和除法。

我们将在控制台中实现计算器的操作,并通过简单的用户界面进行交互。

接下来,我们需要创建一个C语言程序的框架。

首先,我们需要包含头文件,以便在程序中使用各种函数和变量。

我们可以使用"#include" 来引入头文件,例如:```c#include <stdio.h>```然后,我们需要定义主函数 `main()`。

在这个函数中,我们将编写计算器的逻辑代码。

让我们开始编写函数吧!首先,我们需要声明一些变量来存储用户输入的数字和运算符。

我们可以使用 `int` 来定义整数变量,并用 `char` 定义字符变量。

例如:```cint num1, num2, result;char operator;```接下来,我们需要提示用户输入要进行的运算,并读取用户输入的数字和运算符。

我们可以使用 `printf` 和 `scanf` 函数来完成这个任务,例如:```cprintf("请输入第一个数字: ");scanf("%d", &num1);printf("请输入运算符(+, -, *, /): ");scanf(" %c", &operator);printf("请输入第二个数字: ");scanf("%d", &num2);```注意,我们在读取运算符之前添加了空格,这是为了消除输入缓冲区中可能残留的换行符等字符。

接下来,我们需要编写代码来进行实际的计算操作。

Python之实现一个简易计算器

Python之实现一个简易计算器

Python之实现⼀个简易计算器⾃⼰动⼿写计算器⼀、功能分析 ⽤户输⼊⼀个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式⾥⾯除了包含空格、'+'、'-'、'*'、'/'和括号再⽆其他特殊符号,然后⾃⼰动⼿写代码解析其中的表达式,实现加减乘除,最后得出的结果与真实的计算机所算的结果必须⼀致。

⼆、所需的知识点字符串的处理正则表达式的运⽤函数递归三、程序实现流程分析1. ⽤正则表达式处理字符串,只提取其中的数字和运算符,并转换成列表2. 编写⼀个函数,处理没有括号的基本运算的基本表达式3. 再写⼀个函数递归处理带有括号的函数,先计算最内部括号中的表达式, 然后将最内部的括号替换为计算后的结果, 在递归外部⼀层的,最后返回的就是所需的结果四、具体实现过程1.正则表达式处理⽤户输⼊字符串 这⾥我不会讲正则表达式具体的⽤法,要将的话都可以讲⼀本书了,我只讲本⽂⽤到的正则表达式。

根据需求,我们需要提取出⽤户输⼊字符串中的数字和运算符到⼀个列表中,⽽空格将会被忽略掉,假设⽤户输⼊的表达式是 expression,我们可以写出下⾯的代码:1 2 3 4import reexpression='(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)'l=re.findall('([\d\.]+|/|-|\+|\*)',expression)print(l) #['100', '+', '40', '*', '5', '/', '2', '-', '3', '*', '2', '*', '2', '/', '4', '+', '9', '*', '3', '+', '4', '-', '4', '-', '4'] ⾸先我们先看⼀下 findall 的⽤法,findall可以匹配所有符合规律的内容,返回包含结果的列表。

C语言实现计算器功能

C语言实现计算器功能

实验一多功能计算器一、问题描述设计一个多功能计算器,可以完成基本的计算。

设计要求:1.具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。

依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。

结果可以作为下一个运算的第一运算数。

按‘C’清屏,按‘R’返回菜单。

例如:输入:2+5输出:72.实现单运算符表达式计算的功能。

输入的操作数可以包含整数或浮点数。

输入表达式如下:例如:输入:2+5输出:7二、算法说明1.数据结构说明(可以图示说明,也可以文字说明)本程序主要根据选择菜单编写了六个自定义函数,用于在main()函数中调用,在main()中,用一个字符变量num1来记录下菜单选项的标号,根据num1的值来决定调用哪个函数。

程序要完成的功能及所要用到的函数如下:下面是整个程序的流程图:2.算法说明(即函数说明)void suanshuyunsuan()二组测试用例测试输入:测试目的:测试单运算符表达式函数结果输出:3.第三组测试用例测试输入:c测试目的:测试输入c是否能清屏测试输出:4.第四组测试用例测试输入:r测试目的:测试返回菜单函数测试输出:5. 第五组测试用例测试输入:t测试目的:测试是否能正确退出程序测试输出:附录:源代码(附上全部源代码,且不能雷同)#include<>#include""double z; ");p rintf("1.否\n");p rintf("请选择0或1>:");}术运算\n");p rintf("b.表达式运算\n");p rintf("c.清屏重做\n");p rintf("r.返回菜单\n");p rintf("t.退出程序\n");}void main(){c har num1; 术运算\n");p rintf("b.表达式运算\n");p rintf("c.清屏重做\n");p rintf("r.返回菜单\n");p rintf("t.退出程序\n");w hile(1){rewind(stdin); //清除键盘缓冲区printf("\nplease chose one letter from \"a,b,c,r,and t\"\n");scanf("%c",&num1); //输入一个数用于判断是选择了哪一个菜单项if(num1=='a') //选择了做算术运算{suanshuyunsuan();panduan();scanf("%d",&pd);while(pd) //继续做算术运算时就循环{suanshuyunsuan2();panduan();scanf("%d",&pd);}}if(num1=='b') //选择了做单运算符表达式运算biaodashiyunsuan();if(num1=='c') //清屏qingping();if(num1=='r') //显示菜单fanhuicaidan();if(num1=='t') //退出程序break;}}。

简易计算器(二叉树)

简易计算器(二叉树)

实验三——简易计算器(二叉树)05111341班李凌豪 11201312631.需求分析1.1.问题重述(1)问题描述由键盘输入一算术表达式,以中缀形式输入,试编写程序将中缀表达式转换成一棵二叉表达式树,通过对该的后序遍历求出计算表达式的值。

(2)基本要求a.要求对输入的表达式能判断出是否合法。

不合法要有错误提示信息。

b.将中缀表达式转换成二叉表达式树。

c.后序遍历求出表达式的值(3)数据结构与算法分析一棵表达式树,它的树叶是操作数,如常量或变量名字,而其他的结点为操作符。

a.建立表达式树。

二叉树的存储可以用顺序存储也可用链式存储。

当要创建二叉树时,先从表达式尾部向前搜索,找到第一个优先级最低的运算符,建立以这个运算符为数据元素的根结点。

注意到表达式中此运算符的左边部分对应的二叉绔为根结点的左子树,右边部分对应的是二叉绔为根结点的右子树,根据地这一点,可用递归调用自己来完成对左右子树的构造。

b.求表达式的值。

求值时同样可以采用递归的思想,对表达式进行后序遍历。

先递归调用自己计算左子树所代表的表达式的值,再递归调用自己计算右子树代表的表达式的值,最后读取根结点中的运算符,以刚才得到的左右子树的结果作为操作数加以计算,得到最终结果。

(4)测试1.2.问题分析本实验要求我们编写一个程序,利用二叉树,实现简易计算器的功能。

实现实数范围内的四则混合运算,而且要考虑括号对运算顺序的影响。

而且,题目要求用二叉树的知识来实现程序功能,因此需要将输入的中序表达式转换成逆波兰序列,然后就以此序列建立二叉链表,之后通过后序遍历实现运算的功能。

大概要求就是这样的。

2.概要设计2.1.抽象数据类型的定义考虑到,算符为字符型变量,算数为单精度浮点型变量。

考虑先讲输入的浮点数替换为char型的符号。

Struct jd为二叉链表的节点类型。

每一个节点都有字符域data,数字的话会有数值域shuzi为单精度浮点数。

struct jd{char data;float shuzi;struct jd *next1;struct jd *next2;};Struct haha 类型的数组ka[20]用来存放运算数,如果是运算数,就存进来,然后用字符域fuhao来代替数值域的单精度shuzi。

计算机表达式求值算法的最优化方法研究

计算机表达式求值算法的最优化方法研究

计算机表达式求值算法的最优化方法研究计算机表达式求值是计算机程序设计中十分基本的操作。

表达式求值在程序设计中的应用非常广泛,例如计算器程序、科学计算、图形处理等等。

在大量数据计算的情况下,表达式求值的优化是非常重要的。

本文将就计算机表达式求值算法的最优化方法进行研究,探讨其优化方法和实现方式。

一、算法概述计算机表达式求值算法主要有两种方法:前缀表达式求值和中缀表达式求值。

在计算表达式的过程中,计算机需要将表达式转化为计算机可读的二进制数据,然后进行运算。

传统的计算机表达式求值算法大多使用栈结构来实现,但是随着计算机处理速度的不断提升,上述算法逐渐显现出一定的性能瓶颈。

为了改善传统算法性能不足的问题,目前提出了一些优化思路,包括减少计算机的内存使用、提高编译器的运算速度、优化数据结构等。

优化算法的出现大大提升了计算机表达式求值的效率。

二、优化算法1. 前缀表达式求值前缀表达式求值算法是一种把算符写在操作数前面的表达式求值方法。

例如“+12”就是一个前缀表达式,它的值为3。

前缀表达式求值算法通过遍历表达式求值,使用栈来存储数据。

在栈的处理过程中,函数的调用开销会增加计算的时间,因此针对这一问题,推出了一种堆栈分配的优化方法,将堆栈的内存分配给表达式节点,避免了大量栈的函数调用带来的额外计算时间。

2. 中缀表达式求值中缀表达式求值是一种把算符写在操作数中间的表达式求值方法。

例如“1+2”就是一个中缀表达式,它的值为3。

中缀表达式求值的优化方法主要有两种:使用树型结构、使用逆波兰表达式。

通过使用树型结构,可以将计算的过程分解成多个阶段,提高计算效率。

而逆波兰表示法则可以进行一定的计算优化,避免了括号与优先级的操作。

三、算法实现在实现过程中,应尽可能减少计算机的计算量和内存使用。

具体实现中,可以使用动态规划或者分治法等算法来减少计算量;使用位运算或者类似的实现方法来优化内存使用。

同时,要适当考虑代码的复杂度,提高代码可读性,利于后期维护和修改。

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

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

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

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

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

在本文中,我们将使用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("谢谢使用,再见!")```在这个示例代码中,我们使用了一个无限循环来持续接收用户输入。

C语言简易计算器的实现

C语言简易计算器的实现

C语言简易计算器的实现C语言简易计算器是一种用于进行基本数学运算的程序。

实现一个简易计算器的关键是要能够解析用户输入的数学表达式,并将其转化为计算机可以理解的形式,然后进行计算,并输出结果。

下面是一个大约1200字以上的示例实现。

```c#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <ctype.h>#define MAX_SIZE 100//定义操作符的优先级int getPriority(char op)if (op == '+' , op == '-')return 1;else if (op == '*' , op == '/')return 2;elsereturn 0;//进行四则运算int calculate(int a, int b, char op)switch (op)case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;default: return 0;}//将中缀表达式转换为后缀表达式void infixToPostfix(char* infixExp, char* postfixExp) char stack[MAX_SIZE];int top = -1;int j = 0;for (int i = 0; infixExp[i] != '\0'; i++)if (isdigit(infixExp[i])) { // 数字直接输出到后缀表达式while (isdigit(infixExp[i]))postfixExp[j++] = infixExp[i++];}postfixExp[j++] = ' ';i--;}else if (infixExp[i] == '(') { // 左括号压入栈stack[++top] = infixExp[i];}else if (infixExp[i] == ')') { // 右括号弹出栈内所有操作符并输出到后缀表达式,直到遇到左括号while (top != -1 && stack[top] != '(')postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}top--; // 弹出栈顶的左括号}else { // 操作符while (top != -1 && getPriority(stack[top]) >=getPriority(infixExp[i]))postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';stack[++top] = infixExp[i];}}while (top != -1) { // 将栈内剩余操作符弹出并输出到后缀表达式postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}postfixExp[j] = '\0';//计算后缀表达式的值int evaluatePostfix(char* postfixExp)char stack[MAX_SIZE];int top = -1;for (int i = 0; postfixExp[i] != '\0'; i++)if (isdigit(postfixExp[i])) { // 数字压入栈int num = 0;while (isdigit(postfixExp[i]))num = num * 10 + (postfixExp[i++] - '0');stack[++top] = num;i--;}else if (postfixExp[i] == ' ')continue;}else { // 操作符,弹出栈顶的两个数进行计算,并将结果压入栈int b = stack[top--];int a = stack[top--];int result = calculate(a, b, postfixExp[i]);stack[++top] = result;}}return stack[top];int maichar infixExp[MAX_SIZE];printf("请输入中缀表达式:");fgets(infixExp, sizeof(infixExp), stdin); // 读取用户输入//将中缀表达式转换为后缀表达式char postfixExp[MAX_SIZE];infixToPostfix(infixExp, postfixExp);printf("后缀表达式为:%s\n", postfixExp);//计算后缀表达式的值并输出int result = evaluatePostfix(postfixExp);printf("计算结果为:%d\n", result);return 0;```这个简易计算器的实现基于栈的数据结构。

C语言实现简单计算器程序

C语言实现简单计算器程序

C语⾔实现简单计算器程序这两天在看⼀个C语⾔写的计算器程序,做了不少的功夫,跟着作者⼀步步的进⾏完善,了解了许多细节性的东西,在此⾃⼰做个总结,加深⾃⼰对程序的印象,也算是梳理。

在该计算器程序,能进⾏加减乘除、sin、cos、exp等操作,同时能进⾏数值保存功能。

⽽该计算器使⽤逆波兰表⽰法。

即所有运算符都跟在操作数的后⾯,⽐如下列表达式:(1 - 2) * (4 + 5)采⽤逆波兰表⽰法表⽰为:1 2 - 4 5 + *逆波兰表达法中不需要圆括号,只要知道每个运算符需要⼏个操作数就不会引起歧义。

计算器程序实现很简单,具体原理如下:while(/* 下⼀个运算符或操作数不是⽂件结束指⽰符 */)if(/* 是数 */)/* 将该数压⼊到栈中 */else if (/* 是运算符 */)/* 弹出所需数⽬的操作数 *//* 执⾏运算 *//* 将结果压⼊到栈中 */else if (/* 是换⾏符 */)/* 弹出并打印栈顶的值 */else/* 出错 */在程序设计中,使⽤模块化思想,getop函数来进⾏读⼊,该函数返回⼀个标识,⽤来标识读⼊的是什么类型。

主循环体中根据该标识执⾏相应的动作。

以下是该程序:(我将所有函数和变量放在同⼀⽂件)#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读⼊的是数字#define NAME 'n' //标识读⼊的是字符串(函数名或⾮法字符串)#define ALPHA 26int getop(char []);void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执⾏相应的数学函数sin、cos、exp等int main(void){int type;int i, var = 0;double op1, op2,v;char s[MAXOP];double variable[ALPHA];for (i = 0; i < ALPHA; i++) //初始化⽤于保存数值的变量数组variable[i] = 0.0;while ((type = getop(s)) != EOF) //读取输⼊{switch (type){case NUMBER:push (atof(s));break;case NAME:mathfnc(s);break;case '+':push (pop() + pop());break;case '*':push (pop() * pop());break;case '-':op2 = pop();push (pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push (pop() / op2);elseprintf ("error: zero divisor\n");break;case '%':op2 = pop();if (op2 != 0.0)push (fmod(pop(), op2));elseprintf ("error: zero divisor\n");break;case '?': //打印栈顶元素op2 = pop();printf ("\t%.8g\n", op2);push (op2);break;case '=': //保存数值pop();if (var >= 'A' && var <= 'Z')variable[var - 'A'] = pop();elseprintf ("error: no variable name\n");break;case 'c':clear();break;case 'd': //复制栈顶元素op2 = pop();push(op2);push(op2);break;case 's': //交换栈元素op1 = pop();op2 = pop();push(op1);push(op2);case '\n':v = pop(); //v保存最后的⼀次结果printf ("\t%.8g\n", v);break;default:if (type >= 'A' && type <= 'Z')push(variable[type - 'A']);else if (type == '@') //输⼊的字符@表⽰最近⼀次结果值 push(v);elseprintf ("error: unknown command %s\n", s);break;}var = type;}return 0;}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f){if (sp < MAXVAL)val[sp++] = f;elseprintf ("error: stack full, can't push %g\n", f);}double pop(void){if (sp > 0)return val[--sp];else{printf ("error: statck empty\n");return 0.0;}}void clear(void){sp = 0;}void mathfnc (char s[]){double op2;if (strcmp (s, "sin") == 0)push(sin(pop()));else if(strcmp (s, "cos") == 0)push(cos(pop()));else if(strcmp (s, "exp") == 0)push(exp(pop()));else if(strcmp (s, "pow") == 0){op2 = pop();push (pow(pop(), op2));}elseprintf ("error: %s not supported\n", s);}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空⽩字符;s[1] = '\0';i = 0;if (islower(c)) //判断是否为⼩写字母,也即读取由⼩写字母组成的字符串 {while (islower(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);if (strlen (s) > 1)return NAME;elsereturn c;}if (!isdigit(c) && c != '.' && c != '-')return c;if (c == '-') //⽤于判断是负数还是减操作{if (isdigit(c = getch()) || c == '.')s[++i] = c;else{if (c != EOF)ungetch(c);return '-';}}if (isdigit(c)) //收集整数部分while (isdigit(s[++i] = c = getch()));if (c == '.') //收集⼩数部分while (isdigit(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}/* ----------------------------------------------------------- *//** 引⽤以下两个函数是因为:程序不能确定它已经读⼊的输⼊是否⾜够 ** 除⾮超前多读⼊⼀些输⼊,在本程序中,读⼊⼀些字符合成⼀个数字 ** 所以在看到第⼀个⾮数字字符之前,已经读⼊的数的完整性是不能确定的* 由于程序要超前读⼊⼀个字符,这样就导致最后⼜⼀个字符不属于当前所要读⼊的数*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch (int c){if (bufp >= BUFSIZE)printf ("ungetch: too many characters\n");elsebuf[bufp++] = c;}该程序虽然简单,但是还是存在⼀些⼩⼩的问题,⽐如没有数据时进⾏pop的话,会打印栈中⽆数据同时返回数值0.0,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。

简易计算器实验报告

简易计算器实验报告

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

二、实验原理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、步了解类的设计方法,初步了解词法分析、表达式求值的算符优先算法等 内容。 要求:
cout<<"程序错误,0作为除数出现!";
} else
a=a/b; }break; case '+':a=a+b;break; case '-':a=a-b;break; default:{}break; } Operand oper(a); sOperand.push(oper);
//cout<<"计算,并将结果压:"<<sOperand.getTop().get()<<"入栈\n";
char ch=temp[0]; double a,b; if(ch=='(') {
Operator oper('('); sOperator.push(oper);
//cout<<"符号:"<<sOperator.getTop().get()<<"入栈\n";
} else if(ch==')') {
//cout<<"计算,并将结果压:"<<sOperand.getTop().get()<<"入栈\n";

数据结构算术表达式求值实验报告

数据结构算术表达式求值实验报告

软件技术基础实验报告实验名称:表达式计算器系别:通信工程年级:班级:学生学号:学生姓名:数据结构》课程设计报告题目简易计算表达式的演示【题目要求】要求:实现基本表达式计算的功能输入:数学表达式,表达式由整数和“ +”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值基本操作:键入表达式,开始计算,计算过程和结果记录在文档中难点:括号的处理、乘除的优先级高于加减1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-* 、/、=,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1 。

2.2算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符” #”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为” #”)。

C语言程式设计sum=2+4+6+8……96+98+100

C语言程式设计sum=2+4+6+8……96+98+100

C语言程式设计sum=2+4+6+8……96+98+100C语言程式设计sum=2+4+6+8……96+98+100#include<stdio.h>main(){int i,sum;sum=0;for(i=2;i<=100;i+2)sum+=i;printf("%d\n",i);}2+4+6+8+...+100的C语言程式设计#include<stdio.h>int main(){ int i=2; int iSum = 0; for (i=2;i<=100; i+=2) { iSum += i; } printf("The result is:%d\n", iSum); return 0;}C语言程式设计求sum=1+4+9+16+...+100int main(){ int i=1,s=0; while( i*i<=100 ) { s+=i*i; i++; } printf("%d\n",s); getch(); return 0;}2+4+6+8…+96+98+1002+4+6+8…+96+98+100=(2+100)+(4+98)+(6+96)+...(50+52)=25*102=25502+4+6+8……96+98+100=( )25501×2×3×4×5×....×100C语言程式设计#include <stdio.h>__int64 run(int num);int main(void){printf("1×2×3×4×5×....×10计算的结果是:%lld\n",run(1));return 0;}__int64 run(int num){if (num >= 10){return num;}num *= run(num+1);return num;}求得的数字太大,就先加到10吧,结果是对的,望采纳!C语言程式设计2*4*6*8*……100,为何结果总是0?这是因为这个计算结果太大了,应该有几百位数吧,如果以米为单位已经远远超过目前已知的宇宙直径了,用天文数字也无法形容这个数的巨大了。

设计代码实验报告

设计代码实验报告

一、实验目的1. 掌握编程语言的基本语法和编程思想。

2. 培养逻辑思维和问题解决能力。

3. 提高编程实践能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容本次实验主要设计一个简单的计算器程序,实现以下功能:1. 输入两个数字;2. 输入运算符(加、减、乘、除);3. 计算并输出结果。

四、实验步骤1. 定义一个函数用于获取用户输入的两个数字和运算符;2. 定义一个函数用于计算并返回结果;3. 在主函数中调用这两个函数,并输出结果。

五、实验代码```pythondef get_input():# 获取用户输入的两个数字和运算符num1 = float(input("请输入第一个数字:"))num2 = float(input("请输入第二个数字:"))operator = input("请输入运算符(加、减、乘、除):") return num1, num2, operatordef calculate(num1, num2, operator):# 计算并返回结果if operator == '+':return num1 + num2elif operator == '-':return num1 - num2elif operator == '':return num1 num2elif operator == '/':return num1 / num2else:return "输入的运算符不正确!"def main():# 调用函数,获取用户输入和计算结果num1, num2, operator = get_input()result = calculate(num1, num2, operator)print("结果是:", result)if __name__ == "__main__":main()```六、实验结果与分析1. 运行程序,按照提示输入数字和运算符;2. 程序输出计算结果。

简单计算器程序设计

简单计算器程序设计

《网络编程技术》结课论文2012 — 2013学年第二学期题目:简单计算器程序专业班级:网信10-2学号:************姓名:-----------指导老师:---------日期:2013-06-25目录1引言 (3)2基础理论 (3)2.1 AWT 组件 (3)2.2 Swing 组件 (3)2.3 java事件处理机制 (4)3 功能设计 (5)3.1计算器系统概述 (5)3.2功能模块设计 (6)3.3详细设计 (6)4 系统实现 (7)4.1需求分析 (7)4.2设计思路 (8)4.3主要代码展示及说明 (8)4.4调试与分析 (12)5 总结 (12)参考文献 (13)1引言近年来随着计算机和网络在社会领域的发展,java的应用正在不断地走向深入, Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。

Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。

Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。

特别是Java企业应用编程接口为企业计算及电子商务应用系统提供了有关技术和丰富的类库。

本次设计是通过java编程技术来设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算,该计算器可以实现加法、减法、乘法、除法的简单运算,也可以实现一些简单的扩展运算,这次课程设计的主要目的在于检测对java 应用的熟练程度,发现问题并及时改正和提高,同时扩展对java知识的进一步了解和认识,强化自己的编程能力,为将来在新的旅途中能更好的发挥自身的才能!2基础理论2.1 AWT 组件布局管理器管理组件如何放置在容器中,AWT 中最常用的四种布局类:FlowLayout、BorderLayout、GridLayout、CardLayout。

本项目主要采用了GridLayout 布局。

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

课程设计说明书课程名称:数据结构设计题目:表达式计算程序设计院系:计算机科学与信息工程系学生姓名:学号:专业班级:指导教师:2010年06月12日课程设计任务书计算器摘要:按照要求构造运算符优先级表,编写优先级比较算法。

利用栈结构和优先级编写表达式计算方法,只是运行环境不是在DOS界面下,而是在VC的可是化编程下运行的,使界面更直接美观。

首先构建了一个数据栈,此栈是以数组为存储结构的(当时选的这种简单的方式),栈中增加了两套处理压栈的函数,一个就是PushO压操作符,PushD压数据(及表达式中的计算的对象),同样的由他们的出栈PopO,和 PopD,分别出操作符,和所压入的数据。

然后就是怎样来表示表达式中的优先级的问题,是用了一个二维数组(int)使用1代表>,2代表<….这样方便了后期对运算的处理。

这样计算器的程序设计基本上完成了。

关键词:优先级表优先级比较算法栈VC界面数组目录1.设计背景 (5)1.1设计背景 (5)1.2设计步骤 (5)2.设计方案 (6)3.方案实施 (6)4.结果与结论 (7)5.收获与致谢 (9)6.参考文献 (9)7.附件 (9)设计背景1. 设计背景表达式求值应该说是对堆栈的一个很好的练习,他要求能够灵活的使用堆栈,了解以这种方式作为存储结构的数据特点(先进后出)。

而对于一个拥有+,-,*,\,()等混合运算时,他要求不同的表达式可能会有不同的求解顺序,而采用什么样的存储结构能够胜任这种随机变化的顺序呢,显然堆栈就是这个问题的最好解决方式。

2. 设计步骤计时,我一直在想怎样做一个界面,能够时操作更加的富有人性话,由于当时正在做VC的课程设计,我就想何不就使用VC做一个window的界面,甩掉DOS 界面的枯燥?于是就着手做了这个基于VC的小应用程序“计算器”。

在可视化处理的过程中我已经增强了程序的健壮性,所以如果用户直接通过我的界面使用鼠标进行输入的话,就不会出现任何错误,而且会提醒用户正确的输入表达式。

然后重点就在数据结构的处理上。

首先构建了一个数据栈,此栈是以数组为存储结构的(当时选的这种简单的方式),栈中增加了两套处理压栈的函数,一个就是PushO压操作符,PushD压数据(及表达式中的计算的对象),同样的由他们的出栈PopO,和 PopD,分别出操作符,和所压入的数据。

实现过程很简单。

然后就是怎样灵活的使用栈的问题,这儿首先遇到的问题就是怎样来表示表达式中的优先级的问题,然后我参考我们的教材,它的优先级表,但是其中<.>…等不好做后期的判断,所以我就是用了一个二维数组(int)使用1代表>,2代表<….这样方便了后期对运算的处理。

在处理这个表达式的时候,又有一个问题出现了,那就是如果我直接就使用这个栈按部就班的判断,还是得不出结果。

然后我自己在草稿本上写了一个简单的表达式,跟踪程序的流程,结果发现我的式子根本没有完成,及在运算的过程中有产生了后边的优先级高于前边的没有做处理,然后我就使用一个While循环一直判断当时的优先级是否一直高于前面的优先级,直到不成立才继续压栈处理。

最后结果就正确了。

设计方案采用VC的可视化编程的特点,设计一个界面,免去DOS的枯燥的界面。

新建一个Push栈操作类,用它来对我的表达式进行记录,并实现优先级的正确处理顺序构建优先级表,使用一个二维整形的数组用来存储我们每个操作符的优先级,主要是后者与前者的比较。

(比如+,+,那么后边的加就小于前面的加……)处理运算的过程。

方案实施分组构建栈的任务由我和朱路遥完成设计优先级的过程由王世杰完成处理表达式的过程由关一峰等完成谢富强做的是使用VC将各个模块组合起来,并调试组合成一个完整的程序结果与结论结果为:1,首先打开程序界面,刚开始时只能做十进制的混合运算,这是默认的状态,其中的像and,or ,not运算符时不起作用的,如图1图1:程序的主界面,十进制为默认选项,与,或,非失效2,然后用户就可已使用鼠标进行操作了,当然也可以直接从我们的‘直接输入表达式’Edit框中输入表达式,不过这样的话必须在输入完成之后才能做合法性的验证,为了保证用户的不必要的输入,我尽我所能减少了用户的输入量,。

当然了用鼠标输入的话是可以引导用户正确输入表达式的。

比如图图2当出现括号不匹配的时候就会出现如图所示的警示框3,如果一切正确的话就可正确的输出我们的所要求的表达式的值了。

比如计算2+(8*6)/3+6就会得出24的最终结果图3:计算结果举例收获与致谢本次课程设计并没有完全符合老师的要求(逻辑运算),因为c++ 处理二进制对我来说比较麻烦,因为涉及到十进制和二进制的转换问题,如果可以直接给我提供二进制的运算工具,我可以直接添加即可,其中我在操作符的优先级表中已经加入了逻辑运算符,也尝试过,其中的注释就是尝试代码,但是总是达不到要求。

同时谢谢其他几位同学的帮忙才完成了这次的课程设计,谢谢。

参考文献《数据结构与算法》严蔚敏清华大学出版社《Visual C++教程》郑阿奇丁有和机械工业出版社附件1、Push.cpp: implementation of the Push class.#include "stdafx.h"#include "计算器.h"#include "Push.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif// Construction/DestructionPush::Push(){Shead=0;head=0;operater=new char[100];data=new double[100];}Push::~Push(){}void Push::pushinD(double data1) {data[head]=data1;head++;}void Push::pushinO(char operater1) {operater[Shead]=operater1;Shead++;}double Push::popinD(){if(head==0)AfxMessageBox("栈已经空了");else{head--;int n=head+1;return data[n-1];}}char Push::popO(){if(Shead==0){AfxMessageBox("符号栈已经空了");exit(1);}else{Shead--;return operater[Shead];}}bool Push::IsEmpty(){if(Shead==0||head==0)return 0;return 1;}char Push::GetTop(){return operater[Shead-1];}2,优先级表的构造int youxianji[7][7]={{1,1,2,2,2,1,1},{1,1,2,2,2,1,1},{1,1,1,1,2,1,1},{1,1,1,1,2,1,1},{2,2,2,2,2,3,1},{2,2,2,2,4,4,1},{2,2,2,2,2,2,5}};//下面这个数组用于定义符号,按照+-*、()#的顺序char caozuofu[7]={'+','-','*','/','(',')','#'};3,表达式处理double CMyDlg::chuliBDS(CString m_biaodashi1,Push &CaoZuoFu,Push &ShuZi){//首先声明两个栈的对象,一个用于存放数据,一个用于存放操作符char flag;int size;double jieguo=0;int m=0;m_biaodashi1=m_biaodashi1+"#";//21*3+4size=m_biaodashi1.GetLength();CaoZuoFu.pushinO('#');for(int i=0;i<size;i++){char a=m_biaodashi1.GetAt(i);//a=2//为当前表达式中的字符for(int j=0;j<7;j++){if(a==caozuofu[j])//如果栈不为空,而且是操作符,那么对操作符入栈{//先处理是数据的东西,并将它们if(flag=='o'){ShuZi.pushinD(jieguo);m=0;jieguo=0;}flag='c';//关闭char b;//a为当前栈顶的操作符b=CaoZuoFu.GetTop();//找第二个操作符的位置for(int k=0;k<7;k++){if(b==caozuofu[k]){while(youxianji[k][j]==1)//如果现在的操作符优先级//小于原先栈顶的操作符,那么执行运算{double pre,fol;fol=ShuZi.popinD();pre=ShuZi.popinD();m_biaodashi2=caozuofu[k];jieguo=jisuan(pre,caozuofu[k],fol);ShuZi.pushinD(jieguo);jieguo=0;CaoZuoFu.popO();char d=CaoZuoFu.GetTop();for(int l=0;l<7;l++)if(d==caozuofu[l])k=l;}//while//kuohao 5if(youxianji[k][j]==2){CaoZuoFu.pushinO(a);}if(youxianji[k][j]==3){CaoZuoFu.popO();//如果出现()那么就把这一对括号//给去掉}if(youxianji[k][j]==5){// MessageBox("到法国的风格");return ShuZi.popinD();}//跳出这一级循环}}}}if(a!='+'&&a!='-'&&a!='*'&&a!='/'&&a!='('&&a!=')'&&a!='#'){char c=m_biaodashi1.GetAt(i);int f=c;jieguo=jieguo*pow(10,m)+(f-48);m++;flag='o';}}}3,对表达式直接判断出错的代码int KuoHaoCount=0;for(int j=0;j<m_biaodashi.GetLength();j++){char jiancha=m_biaodashi.GetAt(j);if(jiancha!='1'&&jiancha!='2'&&jiancha!='3'&&jiancha!='4'&&jianch a!='5'&&jiancha!='6'&&jiancha!='7'&&jiancha!='8'&&jiancha!='9'&&jianc ha!='0'&&jiancha!='+'&&jiancha!='-'&&jiancha!='*'&&jiancha!='/'&&jian cha!='('&&jiancha!=')'&&jiancha!='#'){CString ss=jiancha;MessageBox("输入了不合法的'"+ss+"'符号,或者你的输入法为中文,请检查在改正");m_biaodashi=m_biaodashi.Left(j);UpdateData(0);return ;}if(m_biaodashi.GetAt(j)=='('){KuoHaoCount++;}if(m_biaodashi.GetAt(j)==')'){KuoHaoCount--;}for(int k=0;k<10;k++){if(m_biaodashi.GetAt(0)==caozuofu1[k]){MessageBox("不能直接以运算符开头","表达式错误");m_biaodashi="";UpdateData(0);return ;}if(m_biaodashi.GetAt(j)==caozuofu1[k])for(int s=0;s<10;s++)if(m_biaodashi.GetAt(j+1)==caozuofu1[s]){CString strs;strs=m_biaodashi.Left(j+2);MessageBox("不能连续出现两个操作符,( "+strs+" )请检查后重新输入","表达式错误");m_biaodashi=strs.Left(j+1);UpdateData(0);return ;}}}//判断直接输入的表达式是否合法if(KuoHaoCount<0||KuoHaoCount>0){MessageBox("你所输入的表达式括号不匹配,请检查","表达式错误");m_biaodashi="";UpdateData(0);return ;}//判断括号是否匹配if(KuoHao!=0||m_biaodashi.Right(1)=="+"||m_biaodashi.Right(1)=="-"||m_biaodashi.Right(1)=="*"||m_biaodashi.Right(1)=="/"){AfxMessageBox("表达式没有结束,不能完成计算");return ;}//判断表达式是否完成。

相关文档
最新文档