北京理工大学 数据结构 实验报告 实验二 简易计算器
简单计算器实验报告

简单计算器实验报告简单计算器实验报告引言:在现代社会,计算器已经成为人们生活中不可或缺的工具之一。
无论是在学校、办公室还是家庭,计算器都扮演着重要的角色。
本实验旨在设计和构建一个简单的计算器,并通过实验验证其功能和准确性。
实验步骤:1. 设计计算器的外观和功能:我们首先对计算器进行了外观设计,选择了简洁、易于使用的界面。
然后确定了计算器的基本功能,包括加法、减法、乘法和除法。
2. 选择合适的硬件和软件:为了构建计算器,我们选择了合适的硬件和软件。
硬件方面,我们选用了一块Arduino开发板、液晶显示屏和按键。
软件方面,我们使用了Arduino编程语言。
3. 连接硬件和编写代码:我们将液晶显示屏和按键与Arduino开发板连接起来,并编写了相应的代码。
代码中包括了计算器的逻辑运算和界面显示。
4. 测试计算器的功能和准确性:在完成硬件连接和代码编写后,我们对计算器进行了测试。
我们输入了一系列的算术表达式,包括简单的加减乘除运算,以及复杂的多步运算。
通过与手动计算的结果进行对比,我们验证了计算器的功能和准确性。
实验结果:经过多次测试,我们的计算器表现出了良好的功能和准确性。
无论是简单的加法还是复杂的多步运算,计算器都能够正确地给出结果。
液晶显示屏清晰地显示了算术表达式和计算结果,而按键的响应速度也非常迅速。
讨论:虽然我们的计算器在功能和准确性方面表现出色,但仍有一些改进的空间。
首先,我们可以增加更多的功能,如开方、求余等。
其次,我们可以改进界面设计,使其更加美观和易于使用。
此外,我们还可以考虑加入更强大的处理器和更大的内存,以提高计算器的性能。
结论:通过本次实验,我们成功设计和构建了一个简单的计算器,并验证了其功能和准确性。
计算器在各种算术运算中表现出色,并且具有清晰的界面和快速的响应速度。
然而,我们也意识到计算器仍有改进的空间,包括增加更多功能和改进界面设计。
总的来说,本次实验为我们深入了解计算器的原理和构造提供了宝贵的经验。
简易计算器实验报告

简易计算器实验报告简易计算器实验报告引言:计算器是我们日常生活中常用的工具之一。
它可以帮助我们进行简单的数学运算,提高计算的效率。
在本次实验中,我们将设计并制作一台简易计算器,通过实践来掌握计算器的原理和工作原理。
实验目的:1. 了解计算器的基本原理和工作原理;2. 掌握计算器的设计和制作方法;3. 提高动手能力和创造力。
实验材料:1. 电路板;2. 按键;3. LED显示屏;4. 电容;5. 电阻;6. 电源。
实验步骤:1. 连接电路板和电源,确保电路板能够正常工作;2. 将按键连接到电路板上,用于输入数字和运算符;3. 连接LED显示屏,用于显示计算结果;4. 添加电容和电阻,用于控制电路的稳定性和电流;5. 调试电路,确保计算器能够正确运行。
实验结果:经过一番调试,我们成功制作出了一台简易计算器。
它可以进行基本的加减乘除运算,并且在LED显示屏上显示结果。
通过按键输入数字和运算符,我们可以进行各种运算,从而得到我们想要的结果。
这台计算器虽然简单,但是它的实用性和便携性都非常高。
实验分析:在本次实验中,我们主要学习了计算器的基本原理和工作原理。
计算器是通过按键输入数字和运算符,然后经过电路的计算和控制,最终在显示屏上显示结果。
在电路中,电容和电阻的作用是为了保证电路的稳定性和电流的控制。
通过这个实验,我们更加深入地了解了计算器的内部结构和工作原理。
实验总结:通过本次实验,我们成功制作了一台简易计算器,并且对计算器的原理和工作原理有了更深入的了解。
实验过程中,我们不仅提高了动手能力和创造力,还培养了解决问题的能力。
计算器作为一种常见的工具,它的设计和制作过程并不复杂,但是它的实用性和便携性却非常高,为我们的生活带来了很大的便利。
未来展望:通过这次实验,我们对计算器的原理和工作原理有了初步的了解。
在未来,我们可以进一步深入研究计算器的更高级功能和更复杂的电路设计。
同时,我们也可以将这种简易计算器的设计思想应用到其他领域,如电子设备、机器人等,从而提高我们的创造力和创新能力。
简单计算器—实训报告

Linux应用与编程实习报告学院名称专业班级学生姓名学号指导教师山东科技大学一、实习题目: B2-简单计算器二、实习时间:19周~ 20周实习地点: J13- 128三、实习任务:实现一个简单计算器,计算器包括加、减、乘、除四种运算。
用户通过鼠标进行数据输入,输入的数据以及计算结果显示在文本框中四、小组分工说明:独立完成五、实习成绩六、指导教师对实习的评语:指导教师(签章):2015年月日目录1. 概述 -------------------------------------------------------- 42. 相关技术 -------------------------------------------------- 42.1 QT中信号和槽 -------------------------------------- 42.2 字符串输出数据组 -------- 错误!未定义书签。
3. 需求分析 -------------------------------------------------- 54. 总体设计与详细设计 ----------------------------------- 54.1 系统模块划分 --------------------------------------- 54.2 主要功能模块 --------------------------------------- 55. 编码实现 -------------------------------------------------- 6 6.测试情况说明------------------------------------------- 157. 实训中遇到的主要问题及解决方法 ---------------- 168. 实训收获与体会 ---------------------------------------- 161. 概述1.1 实训项目简介本次实训项目是应用Linux系统中的QT编译器编写一个界面简洁,操作简单的简易计算器。
简单计算器实验报告

简单计算器实验报告
《简单计算器实验报告》
实验目的:通过使用简单计算器进行数学运算,探究其在日常生活中的实际应用价值。
实验材料:简单计算器、纸笔
实验步骤:
1. 使用简单计算器进行加法、减法、乘法和除法运算,记录运算过程和结果。
2. 尝试使用计算器进行复杂运算,如求平方根、求倒数等。
3. 计算器的功能和使用方法的讨论。
实验结果:
通过实验,我们发现简单计算器在日常生活中有着非常重要的应用价值。
它可以帮助我们快速准确地进行数学运算,节省时间和精力。
同时,计算器还具有一些高级的功能,如求平方根、求倒数等,这些功能在科学计算和工程计算中也具有很大的作用。
结论:
简单计算器是我们日常生活中必不可少的工具之一,它的实际应用价值是非常高的。
通过这次实验,我们更加深入地了解了计算器的功能和使用方法,对于我们的学习和工作都有着重要的帮助。
通过这次实验,我们不仅对计算器有了更深入的了解,也增加了对数学运算的兴趣,希望我们在日常生活中能够更加灵活地运用计算器,提高我们的数学运算能力。
数据结构计算器实验报告

数据结构计算器实验报告1. 引言数据结构是计算机科学的基础,它提供了一种组织和存储数据的方式,以便能够高效地访问和操作这些数据。
计算器是一种常见的应用程序,它可以执行各种数学运算。
本实验的主要目的是设计和实现一个简单的数据结构计算器,用于实现基本的四则运算功能。
2. 设计思路在设计数据结构计算器时,我们需要考虑以下几个方面的问题:2.1 数据结构选择为了实现四则运算功能,我们首先需要选择合适的数据结构来存储和操作数学表达式。
在本实验中,我们选择使用栈作为数据结构,因为栈具有后进先出的特性,非常适合处理运算符和操作数的顺序。
2.2 表达式解析在计算器中,我们需要将用户输入的数学表达式解析成运算符和操作数,以便进行计算。
为了实现表达式解析功能,我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。
2.3 运算符优先级在进行四则运算时,运算符的优先级非常重要。
我们需要确保高优先级的运算符先于低优先级的运算符进行计算。
为了实现这一功能,我们可以使用栈来存储运算符,并在遇到运算符时进行比较和计算。
2.4 计算结果输出最后,我们需要将计算结果输出给用户。
为了实现这一功能,我们可以使用一个变量来存储计算结果,并在计算完成后将结果输出到屏幕上。
3. 实现步骤基于上述设计思路,我们可以按照以下步骤来实现数据结构计算器:3.1 定义栈数据结构首先,我们需要定义一个栈数据结构来存储运算符和操作数。
栈可以使用数组或链表来实现,具体选择取决于实际需求。
3.2 解析数学表达式接下来,我们需要编写代码来解析用户输入的数学表达式。
我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。
3.3 实现运算符优先级比较和计算在解析数学表达式的过程中,我们需要实现运算符的优先级比较和计算功能。
每当遇到一个运算符时,我们可以将其与栈顶的运算符进行比较,如果栈顶的运算符优先级较高,则可以进行相应的计算。
简单的计算器实验报告

HUNAN UNIVERSITY程序设计训练——简单的计算器报告学生姓名田博鑫学生学号***********专业班级工业工程(1)班指导老师吴蓉晖2012年6月16日至2012年7月10日1.程序设计目的和要求目的:此次程序设计的目的主要是为了我们能更好的理解和熟悉C语言这门计算机课程,自己有对计算机程序设计的的初步认识。
要求:运用相关知识,查阅相关资料,编写一个简单的计算器,能够实现简单的基本的加减乘除运算,在计算器工作时利用键盘或鼠标进行相应操作。
程序基本功能要求实现完整,并有简单的验证。
在计算器运行中,输入数据时如果输入错误的情况,能够通过键盘上的退格键进行删除,并且重新输入正确的数据。
在数据输入完成,如果需要放弃本次计算操作,可以利用程序中设置好的按键进行调整。
2.程序设计的任务和内容这个简单的计算器要求能够进行简单的四则运算,要求运用所学的知识和查阅相关的资料来完成这个简单的计算器的设计,要求这个简单的计算器尽量在windows界面下进行,计算器界面不做要求。
该简单的计算器包含有基本的四则运算、正弦函数、余弦函数、正切函数、余切函数、平方、开方,以及平均值、标准差、方差的运算。
3.程序设计说明该简单的计算器能进行基本的四则运算和乘方,开方,以及三角函数的运算。
操作需要逐步根据提示来完成所要进行的运算。
比如要进行81的开方运算的话首先在屏幕上可以看到开放运算的命令是5,所以先要输入5,然后再输入要开方的数据81可以在屏幕上看到运行的结果。
4.详细设计说明包含流程图5.程序的调试及结果调试与运行(没有错误)主界面加法运算减法运算乘法运算平方运算平均值,方差,标准差6.程序设计心得与体会本次程序设计我的是设计一个简单的计算器,我以为是很简单的,但是做起来就不是那么容易了,首先参考网上的有不怎么看懂,自己想自己做但却没有思路,就拿那个c++6.0的程序软件来说吧,刚开始的时候还不知道怎么用,只好花时间到网上去现学现卖。
数据结构计算器实验报告
数据结构计算器实验报告数据结构计算器实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方式,以及对数据进行操作和处理的算法和技术。
在本次实验中,我们设计了一个基于数据结构的计算器,旨在通过实践应用数据结构的知识,提高我们的编程能力和算法思维。
一、设计思路我们的计算器主要有两个功能:进行四则运算和进行括号匹配。
为了实现这两个功能,我们选择了栈这一数据结构。
栈是一种具有后进先出(LIFO)特点的数据结构,非常适合用来处理括号匹配和运算符的优先级。
二、括号匹配算法在进行四则运算之前,我们首先需要对输入的表达式进行括号匹配的检查。
我们使用了一个栈来实现这一功能。
算法的基本思路是,遍历表达式中的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,将栈顶元素出栈,并判断出栈的元素是否与当前右括号匹配。
如果匹配,则继续遍历下一个字符;如果不匹配,则说明表达式存在括号不匹配的错误。
三、四则运算算法当表达式通过了括号匹配的检查后,我们就可以进行四则运算了。
我们使用两个栈来实现这一功能,一个栈用来存储操作数,另一个栈用来存储运算符。
算法的基本思路是,遍历表达式中的每个字符,当遇到数字时,将其入操作数栈;当遇到运算符时,将其入运算符栈,并根据运算符的优先级进行相应的操作。
四、运算符优先级为了正确计算表达式的值,我们需要定义运算符的优先级。
一般来说,乘法和除法的优先级高于加法和减法。
为了实现这一功能,我们可以使用一个优先级表来存储运算符的优先级。
在进行运算时,我们可以通过比较栈顶运算符和当前运算符的优先级来决定是否进行运算。
五、实验结果经过我们的努力,我们成功地实现了一个基于数据结构的计算器。
我们对该计算器进行了多组测试,包括括号匹配、四则运算等不同情况。
在所有的测试中,我们的计算器都能正确地输出结果,并且在处理大规模表达式时也能保持较好的性能。
六、总结与展望通过本次实验,我们深入理解了数据结构的应用和算法的设计。
北京理工大学数据结构与算法设计实验二
《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:06111001学号:**********姓名:宝竞宇一、实验目的掌握栈的建立,输入,删除,出栈等基本操作。
应用栈解决实际问题。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;②输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计抽象数据类型定义:两个栈结构,分别用来储存数据和计算符号宏定义:函数“成功”,“失败的返回值”在主程序程序中先依次输入各表达式,存入相应各栈,然后,调用“判断函数”来判断计算符的优先次序,然后再利用计算函数来计算,表达式值。
其中还有,取栈顶元素函数,存入栈函数。
2、详细设计数据类型实现:struct t{ char dat[200];int top;}prt;入栈函数:存入数组,栈顶指针上移void pushd(long int a){ prd.dat[prd.top++]=a;}出栈:取出对应值,栈顶指针下移long int popd( ){ return prd.dat[--prd.top];}比较优先级:建立数组,比较返回大于小于号。
计算函数:以字符型输入,运算符号,用switch来分支计算判断,返回计算数值long int operation ( long int x, long int y, char a){ s witch(a){ case '+': return x+y;case '-': return x-y;case '*': return x*y;case '/': if ( y )return x/y;else{ printf("Divide 0.\n");return 0;}case '%': return (long int) fmod(x,y);case '^': if (y>=0 ) return (long int) pow(x,y);else return (0);default: printf("Error No. 3\n");return 0;}}主程序:在主程序内,以字符串的形式输入表达式,然后分别调用函数存入各相应栈,然后用数组判断,比较运算符的优先顺序。
北理工数据结构实验计算器
本科实验报告实验名称:计算器课程名称:数据结构实验时间:任课教师:实验地点:良乡机房实验教师:实验类型:□原理验证■综合设计□自主创新学生姓名:学号/班级:组号:学院:同组搭档:专业:成绩:一、实验目的1、熟悉VC环境,学习使用C语言实现链表的存储结构。
2、通过编程、上机调试,进一步理解线性表、链表、栈的基本概念,并了解进栈,退栈和运用栈的思想解决问题的能力。
3、锻炼动手编程,独立思考的能力。
二、实验题目简易计算器(栈)(1)问题描述通过模拟一个简单的计算器来进行+、-、*、/、%、^(乘方)等运算,从键盘上输入一算术表达式(一般为中缀表达式),计算出表达式的值。
(2)基本要求编写程序,要求可对一实数算术表达式进行简单的数学运算。
可以识别带加减乘除等运算符及括号的中缀表达式。
a. 按照四则运算规则,求表达式的值。
一般规则如下:1)先括号内,再括号外。
2)先乘方,再乘除,后加减。
b. 同级运算从左到右顺序执行。
c.如表达式有误,应给出相应的提示信息。
(3)数据结构与算法分析解决表达式求值问题的方法之一是:第一步将中缀表达式转换为后缀表达式,第二步按后缀表达式求值。
解题时可以结合字符串的相关知识。
(4)测试4.5+5+6.5*1.06=16.39三、实验基础知识线性表、链表、栈的基本概念的熟练掌握并实际运用。
并了解进栈,退栈和运用栈的思想解决问题的能力四、实验设计方法1、概要设计InitStack(OPTR); Push(OPTR,'#');initStack(OPND); c=getchar();while(c!='#'||GetTop(OPTR)!='#'){if(!In(c,OP)){Push((OPND,c);c=getchar();} //不是运算符则进栈elseswitch(Precede(GetTop(OPTR),c)){case '<': //栈顶元素优先级低Push(OPTR,c); c = getchar();break;case '=': //脱括号并接受下一字符Pop(OPTR,x); c = getchar();break;case '>': //退栈并将运算结果入栈Pop(OPTR,theta);Pop(OPND,b); Pop(OPND,a);Push(OPND, Operate(a,theta,b));break;}//switch}//return GetTop(OPND);4.详细设计:(1)栈的建立#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define TempLen 20#define ERROR 0#define OK 1#define TRUE 1#define FALSE 0#include<stdio.h>#include<stdlib.h>#include<math.h>typedef int count;typedef double opndElem;typedef char optrElem;typedef struct //运算符栈{optrElem *base;optrElem *top;int stacksize;}SqStack_OPTR;typedef struct //运算数栈{opndElem *base;opndElem *top;int stacksize;}SqStack_OPND;建立头文件,建立算数栈和算符栈,可以考虑使用算符优先算法来实现运算。
简易计算器实训报告
简易计算器实训报告
一、实训目的:熟悉基本的Python编程知识和数据类型的使用,掌握基本的计算器功能实现
二、实训步骤:
1.首先导入math模块,因为本次实训中需要使用到math模块中的一些函数,如sqrt()
2.定义四个基本运算函数:add()、sub()、mul()、div(),并使用if语句判断用户需要执行的运算操作
3.如果用户输入的操作符不是四个基本运算符之一,则提示用户输入正确的操作符,直到用户输入正确的符号为止
4.通过while循环实现:如果用户输入的数字不是float类型或者用户输入的操作符不是字符串类型,则一直提示用户输入正确的数字或者操作符
5.通过格式化字符串实现结果的输出,保留两位小数
6.通过input()函数实现用户输入数字和操作符的交互
三、实训感想:
通过本次实训,我对Python编程语言有了更深入的了解和掌握,并且熟练掌握了Python中的数据类型、运算符和基本函
数的使用方法。
另外,本次实训也提高了我对问题解决的能力和编程思路,让我更加深入地理解了编程思维的本质。
最后,我希望自己能够不断地学习和探索,进一步扩展自己的编程知识,提升自己的实践能力和创新能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二简易计算器姓名:任子龙学号:1120140167 班级:05111451一.需求分析1.程序要求可对一实数算术表达式进行简单的数学运算,可以识别带+、-、*、/、%、^(乘方)等等运算符及括号的中缀表达式,从键盘上输入一算术表达式(一般为中缀表达式),计算出表达式的值。
2.按照四则运算规则,求表达式的值。
一般规则如下:1)先括号内,再括号外。
2)先乘方,再乘除,后加减。
b.同级运算从左到右顺序执行。
3.有良好的提示信息,引导用户在键盘上输入规定的运算指令;如表达式有误,也应给出相应的提示信息。
4.建立两个工作栈,分别保存运算符,操作数或运算结果。
二.概要设计1.抽象数据类型的定义为实现上述功能,建立两个工作栈;算符为字符型变量,算数为单精度浮点型变量,则需要定义两种数据类型分别存储。
typedef struct StackChar{char c;struct StackChar*next;}SC;typedef struct StackFloat{float f;}SF;2.本程序包含两个模块(1)主程序模块主函数只包含了输入输出部分。
流程为:首先输入算式,然后调用算符优先算法函数EvaluateExpression(s)进行计算,结果输出;然后循环下去,直到输入OUT指令,退出程序;(2)链栈单元模块——实现栈的链式存储的抽象数据类型。
各函数之间的调用关系:三.详细设计1.结点类型typedef struct StackChar{char c;struct StackChar*next;}SC;float f;struct StackFloat*next;}SF;2.子函数(1)算符优先算法的主干函数float EvaluateExpression(char*e)实现算符优先算法主干的函数。
首先判断是算符还是算数,如果是算符,与算符栈栈顶元素进行优先级比较,如果该算符优先级比原栈顶元素优先级高,则进栈,否则进行运算;如果是算数,则入算数栈。
(2)进栈出栈函数SC*Push(SC*s,char c);//使算符c进入算符栈SF*Push(SF*s,float f);//使数值f进入数值栈SC*Pop(SC*s);//使算符栈的栈顶元素出栈SF*Pop(SF*s);//使数值栈的栈顶元素出栈分别实现算符和数值的进栈和出栈操作,由EvaluateExpression函数直接调用。
(3)运算函数float Operate(float a,unsigned char t,float b);进行运算,a,b为数,t为运算符,进行加减乘除或乘方运算,返回值为运算的结果。
(4)类型判断函数Status In(char Test,char*TestOp);判断是不是运算符,返回是或不是。
(5)优先级判断函数char precede(char Aop,char Bop);判断两个算符的优先级,返回'>'或'<'或'='。
(6)运算符识别函数int ReturnOpOrd(char op,char*TestOp);判断是哪个运算符。
3.主函数int main()//主函数,用来输入输出和调用子函数{char s[128],a[4]="OUT";提示信息;k:printf("\n请输入计算表达式:");scanf("%s",s);if(strcmp(s,a)){printf("\n%s\b=%g\n",s,EvaluateExpression(s));//调用算符优先算法函数goto k;}else exit(0);}四.调试分析1.为了提高程序的健壮性,在switch语句中加了case为“?”的情况,对其它非法输入也进行考虑;2.对关于栈的基本操作,在编写过程中暴露出问题;2.如何实现按照运算法则进行计算真的特别难,好在老师在课堂上讲过算符优先算法,看到题目并不是很慌;同时也说明了编程时,好的算法意味着成功了一半。
五.测试结果1.对给定的测试数据4.5+6.5*1.06=11.39,测试通过;2.对于非法的输入,如2*(1+8*9(,给出错误提示;3.输入大写OUT,直接退出程序。
六.附录#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>typedef int Status; //将int定义为自定义数据类型typedef struct StackChar{char c;struct StackChar *next;}SC;//存放算符的栈typedef struct StackFloat{float f;struct StackFloat *next;}SF;//存放数值的栈char OPSET[9]={'+','-','*','/','(',')','#','^','%'};unsigned char Prior[9][9]={//算符间的优先级表,用于算符优先算法的判断//'+' '-' '*' '/' '(' ')' '#' '^' '%'/*'+'*/'>','>','<','<','<','>','>','<','<',/*'-'*/'>','>','<','<','<','>','>','<','<',/*'*'*/'>','>','>','>','<','>','>','<','>',/*'/'*/'>','>','>','>','<','>','>','<','>',/*'('*/'<','<','<','<','<','=','?','<','<',/*')'*/'>','>','>','>','?','>','>','>','>',/*'#'*/'<','<','<','<','<','?','=','<','<',/*'^'*/'>','>','>','>','<','>','>','>','>',/*'%'*/'>','>','>','>','<','>','>','<','>'};//函数的声明float EvaluateExpression(char* e);//实现算符优先算法的函数SC* Push1(SC *s,char c);//使算符c进入算符栈SF* Push2(SF *s,float f);//使数值f进入数值栈SC* Pop1(SC *s);//使算符栈的栈顶元素出栈SF* Pop2(SF *s);//使数值栈的栈顶元素出栈float Operate(float a,unsigned char t, float b); //进行运算,a,b为数,t 为运算符Status In(char Test,char* TestOp);//判断是不是运算符,返回是或不是char precede(char Aop,char Bop);//判断优先级,返回'>'或'<'或'='int ReturnOpOrd(char op,char *TestOp);//判断是哪个运算符float EvaluateExpression(char* e) //算术表达式求值的算符优先算法。
{ //设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
SC *OPTR=NULL;//算符栈,字符元素SF *OPND=NULL;//数值栈,实数元素char TempData[20];float Data,a,b;char theta,*c,x,Dr[]={'#','\0'};OPTR=Push1(OPTR,'#');c=strcat(e,Dr);strcpy(TempData,"\0");while (*c!='#'||OPTR->c!='#'){if(!In(*c,OPSET))//In(*c)判断是不是运算符;不是运算符则进栈{Dr[0]=*c;strcat(TempData,Dr);//字符串连接函数c++;if (In(*c,OPSET)){Data=atof(TempData);//字符串转换函数OPND=Push2(OPND, Data);strcpy(TempData,"\0");}}else{switch(precede(OPTR->c,*c))//precede(char a,char b)函数比较下一个字符和栈顶元素的优先级{case '<'://栈顶元素优先权低OPTR=Push1(OPTR,*c);c++;break;case '='://脱括号并接收下一字符OPTR=Pop1(OPTR);c++; break;case '>'://退栈并将运算结果入栈theta=OPTR->c;OPTR=Pop1(OPTR);b=OPND->f;OPND=Pop2(OPND);a=OPND->f;OPND=Pop2(OPND);OPND=Push2(OPND,Operate(a,theta,b));break;case '?'://输入非法,报错提示printf("请输入正确的算术表达式!\n");exit(0);}}}return OPND->f;}SC* Push1(SC *s,char c)//使算符c进入算符栈{SC *p=(SC*)malloc(sizeof(SC));p->c=c;p->next=s;return p;}SF* Push2(SF *s,float f)//使数值f进入数值栈{SF *p=(SF*)malloc(sizeof(SF));p->f=f;p->next=s;return p;}SC* Pop1(SC *s)//使算符栈的栈顶元素出栈{ SC *q=s;s=s->next;free(q);return s;}SF* Pop2(SF *s)//使数值栈的栈顶元素出栈{SF *q=s;s=s->next;free(q);return s;}float Operate(float a,unsigned char t, float b)//进行运算,a,b为数,t 为运算符{switch(t){case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;case '^': return pow(a,b);case '%': {int c,d;c=b/1;d=a/1;return d%c;}default : return 0;}}Status In(char Test,char* TestOp)//判断是不是运算符,返回是或不是{int i=0;int flag=0;for(i=0;i<9;i++){if(Test==TestOp[i])flag=1;}return flag;}char precede(char Aop, char Bop)//判断优先级,返回'>'或'<'或'=' {return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]; }int ReturnOpOrd(char op,char *TestOp)//判断是哪个运算符{ int i=0;for(i=0; i<9; i++)if(op ==TestOp[i])return i;}int main()//主函数,用来输入输出和调用子函数{char s[128],a[4]="OUT";printf("*******************************************\n");printf(" 简易计算器\n");printf("*******************************************\n\n");printf("使用说明:\n");printf("1.输入法为英文输入法;\n");printf("2.由于不能区分负号和减号,不支持负数计算;\n");printf("3.退出程序请输入大写OUT.\n");printf("\n");k:printf("\n请输入计算表达式:");scanf("%s",s);if(strcmp(s,a)){printf("\n%s\b=%g\n",s,EvaluateExpression(s));//调用算符优先算法函数goto k;}else {printf("\n已退出计算器!");exit(0);} }。