计算器文档
java计算器程序代码及文档(带异常处理,括号等。注释详细易懂)

四则运算计算器设计说明书一.设计目标本次计算器的程序设计,通过使用JA V A中的AWT包和Swing包的类库设计图形界面的计算器。
此计算器能够完成加减乘除的四则混合运算。
利用面向对象程序设计的思想,将各个组件的事件响应分别用不同的方式表达出来,并且使用了图形界面中的事件委托机制来处理事件响应。
二.设计流程1. 分析该计算器需要完成的功能。
用户能够完成添加括号和负号的四则混合运算,并且计算器能够自动识别运算符的优先级,根据用户输入的运算表达式,自动计算出相应的结果。
同时还完成了计算器中C按钮清屏功能和Backspace退格键。
2. 考虑异常处理。
(1)当输入的表达式中出现除零的操作,显示框将显示“Infinity(无穷大)”。
(2)当输入的表达式错误时,将弹出提示框显示“表达式错误请重新输入”(3)当计算器的显示文本框里为没有输入内容时直接点击等号按钮,将弹出提示框显示“对不起,您没有任何输入,请重新输入:”。
(4)当第一次输入乘号键,除号键,右括号,小数点,求余键,等号键,ce 键,Backspace键时提示错误。
4. 考虑数据的处理目标计算表达式通过点击计算器界面上的按钮进行输入,当按下等号之后,计算器通过调用JA V A中script这个包中的相关类和方法来实现数据的处理。
5. 编码实现计算器的功能。
(1)新建相关的文件。
(2)引入JA V A中相关的包。
(3)新建类Jsq,并继承了类Frame,而且实现了接口ActionListener(4)定义相关的变量,创建相关组件,并对组件的属性进行设置。
(5)对所创建的组件进行布局,完成界面的实现。
(6)为各个组件添加事件监听器。
(7)重写事件接口ActionListener的方法public void actionPerformed(ActionEvent e)。
(8)为各个组件编写事件代码,完成每个按钮的不同功能。
三.测试过程的截图1. 程序初始运行界面2运算测试3.混合运算测试:异常处理测试:1.输入错误的表达式2、除数为0时:四.设计结果此计算器以完成设计,所有功能都以实现,并达到了预想的设计目标。
js-cal网页简易计算器Word文档

JS-简易计算器一、要求:在网页中编程实现一个简单的计算器,它能提供加减乘除四则运算,它支持IE浏览器。
二、实验原理(简单步骤)利用Java Applet图形界面首先开始设计一个计算器的界面,定义计算器所需要的按钮并赋给其按钮名称,使得使用计算器时简单明了,清晰可见,操作轻松。
给各个按钮进行算法,利用鼠标点击事件,当鼠标点击某个按钮时就开始执行那个按钮所定义的算法,生成数据并显示。
除数字的输入为直接进行输入外,其他运算例如+、-、*、/、开平方等算法要求计算时通过内部较为复杂的运算将结果显示在显示屏上。
三、程序界面四、界面编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"<html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>简易计算器</title></head><body><table width="33%" height="193" border="1"><tr><td colspan="4"><input type="text" size="50" name="result" id="result"></td> </tr><tr><td width="24%"><input type="button" value=" 1 " onclick="getNum(1)"></td><td width="23%"><input type="button" value=" 2 " onclick="getNum(2)"></td><td width="26%"><input type="button" value=" 3 " onclick="getNum(3)"></td><td width="27%"><input type="button" value=" + " onclick="getNum('+')"></td></tr><tr><td><input type="button" value=" 4 " onclick="getNum(4)"></td><td><input type="button" value=" 5 " onclick="getNum(5)"></td><td><input type="button" value=" 6 " onclick="getNum(6)"></td><td><input type="button" value=" - " onclick="getNum('-')"></td></tr><tr><td><input type="button" value=" 7 " onclick="getNum(7)"></td><td><input type="button" value=" 8 " onclick="getNum(8)"></td><td><input type="button" value=" 9 " onclick="getNum(9)"></td><td><input type="button" value=" * " onclick="getNum('*')"></td></tr><tr><td><input type="button" value=" 0 " onclick="getNum(0)"></td><td><input type="button" value=" . " onclick="getNum('.')"></td><td><input type="button" value=" = " onclick="getResult()"></td><td><input type="button" value=" / " onclick="getNum('/')"></td></tr></table><script type="text/javascript" language="javascript">//判断是否清空var clearContent=false;//获得数字function getNum(num){if(clearContent){//如果已经有结果存在则将其清空document.getElementById("result").value="";clearContent=false;}//获取结果对象var objresult=document.getElementById("result");//实现数字连接objresult.value+=num;}//获取结果对象值function getResult(){var objresult2=document.getElementById("result");//为结果赋值objresult2.value=objresult2.value+"="+eval(objresult2.value);clearContent=true;}</script></body></html>(注:素材和资料部分来自网络,供参考。
5800计算器使用说明精品文档5页

5800计算器使用说明Norm 1 指数显示Norm 2 小数显示2.?→x 只显示?字符+?→x 显示字符+??x 显示 x?“字符”?x 显示字符+?有→则不显示该变量当前值3.(判断表达式)语句1 : 语句2。
如果判断表达式为真(或非零),则不跳过语句1.如果判断表达式为假(或是零),则会跳过语句1.4. If...then…else…ifend如果语句为真,则执行then(不执行else),然后执行ifend.如果语句为假,则执行else(不执行then),然后执行ifend.5. Break 中断语句中断For,Do,While循环,并从该循环的下个命令起继续运行6. Dsz使控制变量递减一,在变量的值为零时执行转移7. IszIsz<变量>:<语句1> <语句2>,变量应为A~Z以 1 为增量逐次增加变量的值,当变量的值不等于0 时,执行语句1,否则执行语句28. ClsDsz<变量>:<语句1> <语句2>。
变量应为A~Z。
以1 为减量逐次减小变量的值,当变量的值不等于0 时,执行语句1,否则执行语句29. Locate 定位显示语句句法 1:Locate <列数>, <行数>,<数值>句法2:Locate <列数>, <行数>,<表达式>句法3:Locate <列数>, <行数>, "字符串"fx-5800P 的屏幕最多可以显示4 行、16 列字符,因此定位语句中的列数值应为大于等于1、小于等于16 的整数,行数值应为大于等于1、小于等于4 的整数。
10. Lbi n ~ Goto n Goto n~Lbl n无条件转移至 Lbi n 位置11. Getkey返回与上次按键相对应的代码,Getkey=12. DO ~ LpWhile循环语句Do <语句块> LpWhile<条件>先执行语句块,然后测试条件,条件为真时重复执行语句块,否则执行<条件>后的语句。
计算器设计参考文档

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace jsjq{public partial class Form1 : Form{string op1 = "";string op2 = "";string oper = "";string rs = "";float opv1, opv2, rsv;int opflg = 0, opn;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){numkey_onclik(button1.Text);}private void textBox1_TextChanged(object sender, EventArgs e) {}void numkey_onclik(string nc){if (opflg == 0) op1 += nc;else op2 += nc;textBox1.Text = op1 + oper + op2;}private void button2_Click(object sender, EventArgs e){numkey_onclik(button2.Text);}private void button3_Click(object sender, EventArgs e) {numkey_onclik(button3.Text);}private void button6_Click(object sender, EventArgs e) {numkey_onclik(button6.Text);}private void button5_Click(object sender, EventArgs e) {numkey_onclik(button5.Text);}private void button4_Click(object sender, EventArgs e) {numkey_onclik(button4.Text);}private void button9_Click(object sender, EventArgs e) {numkey_onclik(button9.Text);}private void button8_Click(object sender, EventArgs e) {numkey_onclik(button8.Text);}private void button7_Click(object sender, EventArgs e) {numkey_onclik(button7.Text);}private void button12_Click(object sender, EventArgs e) {numkey_onclik(button12.Text);}private void button11_Click(object sender, EventArgs e) {if (opflg == 0){if ((op1.Length != 0) && (op1.IndexOf('.')== -1)) {op1 += ".";textBox1.Text = op1;}}else{if((op2.Length!=0)&&(op2.IndexOf('.')==-1)){op2+=".";textBox1.Text=op1+oper+op2;}}}private void button10_Click(object sender, EventArgs e) {if ((opflg == 0) && (op1.Length != 0)){op1 = op1.Substring(0, op1.Length - 1);textBox1.Text = op1;}if ((opflg == 1) && (op2.Length == 0)){oper = "";opflg = 0;textBox1.Text = op1;}if ((opflg == 1) && (op2.Length != 0)){op2 = op2.Substring(0, op2.Length - 1);textBox1.Text = op1 + oper + op2;}}void opkey_onclick(string opc){oper = opc;opflg = 1;textBox1.Text = op1 + oper;}private void button13_Click(object sender, EventArgs e) {opkey_onclick(button13.Text);opn = 1;}private void button14_Click(object sender, EventArgs e) {opkey_onclick(button14.Text);opn = 2;}private void button15_Click(object sender, EventArgs e) {opkey_onclick(button15.Text);opn = 3;}private void button16_Click(object sender, EventArgs e) {opkey_onclick(button16.Text);opn = 4;}private void button17_Click(object sender, EventArgs e) {opkey_onclick(button17.Text);opn = 5;}private void button19_Click(object sender, EventArgs e) {if (op2.Length != 0){opv1 = float.Parse(op1);opv2 = float.Parse(op2);switch (opn){case 1: rsv = opv1 + opv2; break;case 2: rsv = opv1 - opv2; break;case 3: rsv = opv1 * opv2; break;case 4:if (opv2 == 0) rsv = 99999;elsersv = opv1 / opv2; break;case 5: rsv = (int)opv1 % (int)opv2; break;}if (rsv == 99999) rs = "error";else rs = rsv.ToString();textBox1.Text = op1 + oper + op2 + "=" + rs;}}private void button18_Click(object sender, EventArgs e) {op1 = "";op2 = "";rs = "";oper = "";opflg = 0;textBox1.Text = "";}}}。
5800计算器使用说明-5页精选文档

5800计算器使用说明Norm 1 指数显示Norm 2 小数显示2.?→x 只显示?字符+?→x 显示字符+??x 显示x?“字符”?x 显示字符+?有→则不显示该变量当前值3.(判断表达式)语句1 : 语句2。
如果判断表达式为真(或非零),则不跳过语句1.如果判断表达式为假(或是零),则会跳过语句1.4. If...then…else…ifend如果语句为真,则执行then(不执行else),然后执行ifend.如果语句为假,则执行else(不执行then),然后执行ifend.5. Break 中断语句中断For,Do,While循环,并从该循环的下个命令起继续运行6. Dsz使控制变量递减一,在变量的值为零时执行转移7. IszIsz<变量>:<语句1> <语句2>,变量应为A~Z以 1 为增量逐次增加变量的值,当变量的值不等于0 时,执行语句1,否则执行语句28. ClsDsz<变量>:<语句1> <语句2>。
变量应为A~Z。
以1 为减量逐次减小变量的值,当变量的值不等于0 时,执行语句1,否则执行语句29. Locate 定位显示语句句法1:Locate <列数>, <行数>,<数值>句法2:Locate <列数>, <行数>,<表达式>句法3:Locate <列数>, <行数>, "字符串"fx-5800P 的屏幕最多可以显示4 行、16 列字符,因此定位语句中的列数值应为大于等于1、小于等于16 的整数,行数值应为大于等于1、小于等于4 的整数。
10. Lbi n ~ Goto n Goto n~Lbl n无条件转移至Lbi n 位置11. Getkey返回与上次按键相对应的代码,Getkey=12. DO ~ LpWhile循环语句Do <语句块> LpWhile<条件>先执行语句块,然后测试条件,条件为真时重复执行语句块,否则执行<条件>后的语句。
4850计算器坐标正反计算程序共8页文档

曲线任意里程中边桩坐标正反算(CASIO fx-4850P计算器)程序(修改版)一、程序功能及原理1.功能说明:本程序由一个主程序(XYZ)和两个子程——正算子程序(A)、反算子程序(B)序构成,可以根据曲线段——直线、圆曲线、缓和曲线(完整或非完整型)的线元要素(起点坐标、起点里程、起点切线方位角、线元长度、起点曲率半径、止点曲率半径)及里程边距或坐标,对该曲线段范围内任意里程中边桩坐标进行正反算。
另外也可以将本程序中核心算法部分的两个子程序移植到其它相关的程序中,用于对曲线任意里程中边桩坐标进行正反算。
本程序也可以在CASIO fx-4500P计算器及 CASIO fx-4850P计算器上运行。
2.计算原理:利用Gauss-Legendre 5点通用公式计算线路中边桩坐标并计算放样数据。
二、源程序1、主程序(XY-ZD)Defm 2:F=1:(F=1正算,F=2反算)Z[1]=90(右边线与路中线右夹角)Prog”THB”:Fix 3:”X=”:X▲”Y=”:Y▲(F=2时,为“KM=“:Z▲”D=“:D ▲)2次程序:THBZ“KM“:A=第一段线终点桩号:B=第二段线终点桩号:C=第三段线终点桩号:E=第四段线终点桩号:F=第五段线终点桩号:……(有多少段就加多少段;超过十五段,要另加子程序转过来)Z<A=>Prog”C1”:≠>Z<B=>Prog”C2”: ≠>Z<C=>Prog”C3”: ≠> Z<E=>Prog”C4”: ≠>Z<F=>Prog”C5”ΔΔΔΔΔ……(有几段线,则打几个三角)C=1÷P:S=(P-R)÷(2HPR):E=180÷π:F=1=>Goto 1:≠>Goto 2Δ←Lbl 1:D:W=Z-O:Prog "A":Goto 3Lbl 2:{XY}:XY:I=X:J=Y:Prog "B":Z=O+W:D=D:Goto 3Lbl 3:F=1=>X:Y :≠>Z:D:3. 正算子程序(A)A=0.1184634425:B=0.2393143352:N=0.2844444444:K=0.0469100770:L=0.230765 3449:M=0.5:X=U+W(Acos(G+QEKW(C+KWS))+Bcos(G+QELW(C+LWS))+Ncos(G+QEMW(C +MWS))+Bcos(G+QE(1-L)W(C+(1-L)WS))+Acos(G+QE(1-K)W(C+(1-K)WS))): Y=V+W (Asin(G+QEKW(C+KWS))+Bsin(G+QELW(C+LWS))+Nsin(G+QEMW(C+MWS))+Bsin(G+QE (1-L)W(C+(1-L)WS))+Asin(G+QE(1-K)W(C+(1-K)WS))):Z[2]=G+QEW(C+WS)+Z[1]:X=X+Dcos Z[2]:Y=Y+Dsin Z[2]4. 反算子程序(B)T=G-90:W=Abs((Y-V)cosT-(X-U)sinT):D=0:Lbl 0:Prog "A":L=T+QEW(C+WS):Z=(J-Y)cosL-(I-X)sinL:AbsZ<1E-6=>Goto1:≠>W=W+Z:Goto 0Δ←┘Lbl 1:Z=0:Prog "A":Z=(J-Y)÷sinZ[2]5.曲线元要素数据库:C1~C5…….O=xxxx.xxx:U=xxxx.xxx:V=xxxx.xxx:G=xxxx.xxx:H=xxxx.xxx:P=xxxx.xxx:R=xx xx.xxx:Q=x (注:一段线一个子程序,分别提供这几个要素数据。
《小型计算器》Word文档
实验报告课程名称算法与数据结构姓名何劼专业计算机科学与技术部别指导教员日期年月日实验项目列表实验报告姓名:何劼学号:专业:计算机科学与技术部别:实验地点:实验时间: 2012、3、20 设备编号:同组人员:指导教员签字:成绩:教员评语:一、实验名称编写模拟小型计算器功能的程序。
二、实验目的1.掌握栈的应用。
2.掌握“拼数”技术。
3.掌握字符串处理方法。
三、实验内容和要求(1)完成对正整数的加减乘除运算,不进行错误检查。
输入一个数,一个运算符和另一个数,按=键和Enter键。
输出计算结果。
例如,输入:123+305=按Enter键后,输出计算结果。
(2)完成正整数的混合四则运算,要考虑优先级,但算式中不带括号,程序不作错误检查。
例如,输入:12+34*54-21/3=按Enter键后,输出计算结果。
(3)完成实数的混合四则运算,不作错误检查。
(4)完成带括号的混合四则运算,不作错误检查。
例如,输入:12*(2+4)/5=按Enter键后,输出计算结果。
(5)完成带负数,带数学函数的混合四则运算。
例如,输入:-12.3+sin(0.12)=按Enter键后,输出计算结果。
这一层主要练习如何处理负数和函数等“一目”运算。
(6)完成带错误检查的.用于任一数学表达式的计算。
当检查到错误时.最好指明错误的位置和出错原因。
例如,在第5个字符处少右括号、或少运算符、多运算符、数值中出现字母等非数值字符。
四、实验环境1.硬件环境:PC机2.软件环境:Windows操作系统,VC++集成开发环境五、算法设计思想题目的第一级即一个简单的整数拼数函数,所以程序主要问题是从第二级开始的。
模拟人脑的进行正整数四则运算的过程,设计者发现,运算符的运算优先次序与栈的“后进先出”特点是相切合的,所以整个程序是建立在栈结构的基础之上的。
但是,运算式是由数字和和运算符构成的,所以建立了一个数栈(num)一个符号栈(symb)。
当扫描指针扫描到数时,调用拼数函数,然后将得到的数字进入数栈;反之扫描到符号时,则需调用优先级比较函数(judge),比较符号栈顶的符号和扫描到的符号的优先级。
双色球聪明组合计算器(精品文档)
01 02 04 19 29 32 087 08
第03注
01 02 05 08 09 19 044 06
第04注
01 02 05 17 18 29 072 07
第05注
01 02 08 12 18 23 064 07
第06注
01 02 09 12 15 29 068 08
第07注
01 02 17 19 21 23 083 06
第14注
01 04 12 15 19 32 083 08
第15注
01 04 15 23 29 32 104 07
第16注
01 05 08 15 17 23 069 09
第17注
01 05 09 21 23 29 088 07
第18注
01 05 12 15 19 21 073 07
第19注
01 08 12 17 19 29 086 08
第20注
01 08 15 18 21 29 092 06
第21注
01 09 12 17 18 21 078 07
第22注
01 09 15 18 19 23 085 07
第23注
12 码 输 入 区
ABCDEFGHIJKL
01 07 10 12 15 18 21 23 26 28 30 32
自动生成聪明组合10注区域
首先,将您最看好的一码(胆码)输入到“A” 下方的单元格内(运气好的话,从小到大顺序输入 时,也有中出5、6红的机会);第二,将其余号码按 从小到大顺序输入到“B、C、D、E、F、G、H、I、J 、K、L、M、N、O”下方单元格内即可得到“自动生 成聪明组合(23注、10注)。
第08注
01 04 05 12 29 32 083 08
计算器源代码文档
南京信息工程大学C++面向对象程序设计课程作业报告设计课题:计算器的设计专业班级:自动化2班学生姓名:学生学号:指导教师:成绩:二○一一年六月二十日计算器的设计一、设计目的学会用MFC设计一个简易计算器,能够求实数的四则运算以及求倒数和平方根,可自己增加功能。
二、需求分析系统目标:设计的计算器至少能够进行简单的四则运算和求倒数求反以及开方运算。
主体功能:实现简单的四则运算和求倒数求反以及开方运算。
开发环境:操作系统:windows XP;编程环境:microsoft visual C++ 6.0 。
三、总体设计思路系统流程图:鼠标单机左键,响应相应的函数选择第一第二个操作数选择所需的运算显示结果图1(流程图)基本功能划分:1.加法运算2.减法运算3.乘法运算4.除法运算5.求倒数6.求平方根7.求余数8.取反9.Backspace 功能 10.清零功能 11.操作帮助四、详细设计流程图:图2(流程图)创建工程(创建一个对话框应用程序)设计对话框界面设置各控件属性为编辑框连接成员变量为类添加数据成员,初始化构造函数。
为所有按钮添加事件对类添加成员函数(更新编辑框)并进行实现实现对各按钮事件的实现(1)创建工程启动Microsoft Visual利用AppWizard向导,创建一个工程“Calculator”。
选择基本表,Click完成。
(2)设计对话框界面①看到如下界面,Delete删除页面上全部原配控件。
②利用MFC自带的控件选项编辑计算器界面③设计的界面如下当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,界面是否整洁明了甚至会影响用户的心情。
各控件的属性设置见下表:表1:各个控件控件类型控件的ID 控件的CaptionButton Button Button Button Button Button Button Button Button Button Button Button Button Button Button Button Button IDC_Num0IDC_Num1……IDC_Num9IDC_DotIDC_SignIDC_SubIDC_MulIDC_DivIDC_ClearIDC_SqrtIDC_ReciIDC_EqualIDC_ModIDC_BackspaceIDC_ClearIDC_Help1……9.+/-+-*/sqrt1/x=%BackspaceClearHelp(3)为编辑框“IDC_DISPLAY”连接成员变量为编辑框“IDC_DISPLAY”连接一个CString类型的成员变量m_display,用来显示操作数和运算结果。
科学计算器2.7.4中文帮助文档
1.0引言单键可以有一个或多个命令,每个命令将根据按下的组合键激活。
符号表示计算器中的一个键。
按钮。
录。
2.0科学模式2.1转向科学模式计算器的默认模式是科学模式。
通过按下MODE(模式)键并从弹出的窗口中选择“Scientific”,可以将模式设定为科学模式。
2.2改变角度单位按下DRG 按钮,从菜单中选择角度单位2.3转换角度例如,将90度转换为弧度。
按DRG 键并选择“Radian”,转换到“弧度角度”模式按9 + 0 + drg. 。
然后选择“Degrees”(度)并按= 。
那么答案将以1.5707963267949弧度给出。
2.4获取数学常数按CONST按钮,从弹出的窗口中选择所需的常量。
常量名称和常量值将显示在列表中。
2.5换算单位长按CONV按钮并选择转换类别例如,将1英寸转换为厘米按 1 +SHIFT+CONV,选择“in→cm”,按= ,答案为2.54。
2.6科学操作人员这个计算器提供了最常用的科学数学运算器,其中大部分是明晰的,不会详细提及。
2.6变量中的存储和调用值值可以存储在名为“A”、“B”、“C”、“D”、“E”、“F”、“X”、“Y”、“Z”、“M”的10个变量中。
例如,要将15+47的结果存储到变量“A”中,请按以下组合键。
1 + 5 + + + 4 + 7 + shift + Sto + A要回忆变量“A”中的值,请按以下组合键。
RCL + A2.7使用分数分数可以用d/c 按钮输入。
当按下该按钮时,显示屏将显示两个块来输入分子和分母。
按= 键计算完后,再按d/c 键即可得到分数格式的答案。
2.8以度分秒格式输入角度与DMS格式的角度可通过°′″按钮输入。
再按一下°′″按钮,计算出的答案就可以转换成DMS格式。
2.9更改答案格式。
答案有三种形式。
1。
Fix-(固定小数点)2。
Sci-(答案将以10的幂表示)3。
Norm(答案显示为正常。
如果空间不足,无法显示完整值,则可从SCI格式显示答案)长按0.00 键或按SHIFT+ (*),然后获取菜单并选择格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算术计算器(带括号)目的:输入一个算式表达式,能够运算出此表达式的结果。
如算出(2+3*8)+2。
程序工作任务:此程序没有划分模块,由个人完成开发平台:VC++6.0 开发语言:C或C++ 系统类型:控制台(有能力的可以界面)知识领域:数据结构中的栈的符合匹配和树的逆波兰式等基本操作,基础C或C++语言知识。
负责人:班委、TC人员TC is stand for technicistA 组:阮柳春(TC)、贺双凤、李煌斌(小组长)、李扬、B 组:胡振洋(TC)、王相、贺艺伟、C 组:刘伶俐(TC)、王建军、付铁兰(小组长)、范徐、刘波D 组:李云高(TC)、邓名仲(TC)、方朝军、黄辉颖(小组长)、E 组:侯晓清(TC)、朱福玲、邵晴(小组长)任务要求:1、TC负责技术,各组中的小组长负责组织,每个人都参与(主攻硬件和Java等其他方面的同学不做要求)2、TC负责上交最终代码到班长这(以E-mail的形式)模块任务安排:核心思想:栈操作下的符号匹配操作(具体的思想见数据结构书52-54)和树的逆波兰式(后序表达示)的操作(具体的思想见书128-130)具体操作:将输入的算术表达式读入到一个字符串中,然后再对此字符串进行操作,即借助栈操作下的符号匹配转化成逆波兰式(后序表达示)存到新的字符串中,然后对利用栈对后序表达示进行运算。
得到最终结果。
(加粗部分为两个核心步骤)void TranslateExpress(char str[],char exp[]); //将原字符串转化成逆波兰式存到另一个字符串中double ComputeExpress(char a[]); //对新的字符串(后序表达示)进行运算操作当然大家也可以拥有自己创新的算法。
转化思想实行例子:a+b*(c-d)-e/f,1、将表达示转化成后序序列:abcd-*+ef/- (原因:后序表达示中不用涉及到括号)(1) 第一个数是’a’,是数字,直接写入数组exp中。
exp状态:a. 符号栈状态:NULL.(2) 第二个数是’+’, 是符号,首先判断栈是否为空,如果为空,则直接进符号栈,如果不为空并且栈顶元素为”(“,则也直接进入符号栈,如果为不为空并且栈顶元素不为”(“,则将符号栈中的符号全部出栈存入exp中。
exp状态:a.符号栈状态:+。
(3) 第三个数是’b’ ,是数字,直接写入exp中。
exp状态:a b。
符号栈状态:+。
(4) 第四个数是’*’ ,是符号,首先判断栈顶元素是否为“*“或者”/“,如果是,则出栈放入到exp中,这里要循环,一直到栈顶元素不是“*“或者”/“为止。
如果栈顶元素不为“*“或者”/“。
则直接进栈。
exp状态:a b。
符号栈状态:+ *。
(5) 第五个数是’(‘,是符号,这个不需任何判断,直接进栈。
exp状态:a b。
符号栈状态:+ * (。
(6) 第六个数是’c’,是数字,直接写入exp中。
exp状态:a b c。
符号栈状态:+ * (。
(7) 第七个数为’—‘,判断条件同(2)。
exp状态:a b c。
符号栈状态:+ * ( --。
(8) 第八个数为’d’ , 直接进exp。
exp状态:a b c d。
符号栈状态:+ * ( --。
(9) 第九个数为’)’,则一直退栈寻找’(‘,将退栈的符号全放入exp中。
如果找到了,则消掉’(‘,’)’。
如果没有这输出表达式错误。
exp状态:a b c d --。
符号栈状态:+ *。
(10) 第十个数为‘—‘ ,判断同(2)。
exp状态:a b c d -- * +。
符号栈状态:--。
(11) 第十一个数为‘e’,直接进exp。
exp状态:a b c d -- + * e。
符号栈状态:--。
(12) 第十二个数为‘/‘,判断同(4)。
exp状态:a b c d -- + * e。
符号栈状态:-- /。
(13) 第十三个数为’f’,直接进exp。
exp状态:a b c d -- + * e f。
符号栈状态:-- /。
(14) 最后将栈中剩余的放入exp中。
exp状态:a b c d -- + * e f / --。
符号栈状态:NULL。
2、用栈的相关操作运算后序表达示:(1)操作数入栈:a b c d(2)遇到‘-’ 则 c d 出栈,然后以(c-d)形式入栈,此时栈为:a b (c-d)(3)遇到*,b 和(c-d)出栈,然后以(b*(c-d))入栈,此时栈为:a (b*(c-d))(4)遇到+ 则a, (b*(c-d))出栈,然后以(a+b*(c-d))入栈,此时栈为:a+b*(c-d)(5)遇到e ,e为操作数,直接入栈。
此时栈为:(a+b*(c-d)) e……最后栈中的元素就是a+b*(c-d)-e/f,也就是我们最终的求解决,为一个数值。
程序的数据结构:/*=============================================================*/#define DataType char // 栈元素类型#define MaxSize 256typedef struct{double data[MaxSize];int top;}OpStack;#define StackSize 100typedef struct{DataType stack[StackSize];int top;}SeqStack;/*===========================基本的操作函数==================================*/void InitStack(SeqStack &s) // 初始化栈{ s.top = 0; }int StackEmpty(SeqStack &s) // 判断栈是否为空{ return s.top == 0; }int GetT op(SeqStack &s,DataType &e) // 得到栈顶元素{if(s.top == 0){printf("SeqStack is empty !\n"); return 0;}e = s.stack[s.top-1]; return 1;}int PushStack(SeqStack &s,DataType e) // 入栈{if(s.top == StackSize - 1){printf("SeqStack is full .\n"); return 0;}s.stack[s.top] = e; s.top ++; return 1;}int PopStack(SeqStack &s,DataTy pe &e) //出栈{if(s.top == 0){ printf("SeqStack is empty !\n"); return 0; }s.top --; e = s.stack[s.top]; return 1;};int StackLength(SeqStack &s) // 栈长度{ return s.top; }void ClearStack(SeqStack &s) //清空栈{ s.top = 0; }/*算法:1,建立一个com函数,用树的结构,逐层算出答案(假设该表达式没有括号)。
2,建立一个comt函数,调用com,遇到括号,调用comt返回该括号表达式的值。
*/#include<stdio.h>struct data{double aa[1000];char bb[1000];int xa;int xb;}int com(data a[]){data b[1000];int i,j;}int main(){data a[1000];int i;/*算法:1,建立一个com函数,逐层算出答案(假设该表达式没有括号)。
2,建立一个cul函数,调用com,遇到括号,调用cul返回该括号表达式的值。
*/#include<stdio.h>#include<string.h>#include<stdlib.h>struct data{double aa[1000];char bb[1000];int la;int lb;};double com(data a)//计算一个不存在括号,只有四则运算的表达式{double sum,temp;int i,j,k;for(k=0;k<+a.lb;k++)//算出乘除,并更新该表达式{for(i=0;i<;i++){if(a.bb[i]=='*' || a.bb[i]=='/'){if(a.bb[i]=='x'){temp=a.aa[i]*a.aa[i+1];}else{temp=a.aa[i]/a.aa[i+1];}for(j=i+1;j<-1;j++){a.aa[j]=a.aa[j+1];}--;for(j=i;j<a.lb-1;j++){a.bb[j]=a.bb[i+1];}a.lb--;}}}//乘除已算完,直接从左向右算加减法if(a.bb[0]=='+')sum=a.aa[0]+a.aa[1];elsesum=a.aa[0]-a.aa[0];for(i=1;i<-1;i++){if(a.bb[i]=='+')sum=sum+a.aa[i+1];elsesum=sum-a.aa[i+1];}return sum;}double cul(data a)//递归函数,将括号中的表达式看成新的式子,调用自己计算,直到递归到没有括号,再调用com{int i,j,p=0,pl=0,f=0,len=0,llen,lpl,first,flag;double sum,tempsum;data b;for(i=0;i<a.lb;i++){if(a.bb[i]=='('){f=1;p++;pl++;}if(f==1&&len==0)first=i;if(a.bb[i]==')'){p--;pl++;}if(f==1)len++;if(p==0 && f==1)//调用自己算出括号中表达式的值,并更新该表达式{llen=len;lpl=pl;f=0;len=0;pl=0;b.lb=llen;=b.lb-lpl+1;for(j=0;j<b.lb;j++){b.bb[i]=a.bb[i];}for(j=0;j<;j++){b.aa[i]=a.aa[i];}for(j=first+1;j<;j++){a.aa[i]=a.aa[i+-1];}for(j=first;j<a.lb-b.lb;j++){a.bb[j]=a.bb[j+b.lb];}tempsum=cul(b);a.aa[first]=tempsum;}}flag=0;for(i=0;i<a.lb;i++){if(a.bb[i]=='(' ||a.bb[i]==')')flag=1;}if(flag==0)//如果没有括号,调用com{sum=com(a);return sum;}return false;}int main(){data a;int i,lena=0,lenb=0,lenchar,temp=0;char c[1000];double sum;gets(c);//以字符的形式输入lenchar=strlen(c);for(i=0;i<lenchar-1;i++)//解析字符串{if(c[i]<'0' || c[i]>'9'){a.bb[lenb]=c[i];lenb++;}else{temp=temp*10+c[i]-'0';if(i==lenchar-2){a.aa[lena]=(double)temp;temp=0;lena++;}else if(c[i]<'0' || c[i]>'9'){a.aa[lena]=(double)temp;temp=0;lena++;}}}sum=com(a);// sum=cul(a);if(sum!=false)printf("%lf\n",sum);elseprintf("出错了\n");return 0;}/*算法:1,建立一个com函数,逐层算出答案(假设该表达式没有括号)。