计算器(能识别括号)代码

本文介绍了一个使用C++编写的简易表达式计算器程序。该程序能够解析并计算包含加减乘除及括号的数学表达式。通过读取用户输入的字符串形式的表达式,程序将其转换为数值和操作符,并按运算规则逐步计算得出最终结果。
摘要由CSDN通过智能技术生成
//author:yehongjiang
//date;2012/11/29
#include"stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
	//*********读取字符******************
	const int m=1000;
	char input[m]={0};
	int i=0;
	int t=0;
	for(i=0;i<i+1;i++)
	{
		input[i]=getchar();
		if(input[i]=='=')
		{
			t=i;
			break;
		}
	}
	//********转换算式*********************
	int a=0;
	int b=0;
	int c=0;
	int d=0;
	int e=0;
	int f=0;
	int g=0;
	int h=0;
	int total=0;
	int value[m]={0};
	char symbol[m]={'0'} ;
	int change[m]={0};//储存计算数的权
	for(i=0;i<=t;i++)
	{
		if((input[i]=='+')||(input[i]=='-')||(input[i]=='*')||(input[i]=='/')||(input[i]=='=')||(input[i]=='(')||(input[i]==')'))
		{
ss:
			symbol[a]=input[i];
			symbol[a+1]=' ';
			a++;
			b=i;
			c=i;
			if((input[i+1]=='+')||(input[i+1]=='-')||(input[i+1]=='*')||(input[i+1]=='/')||(input[i+1]=='=')||(input[i+1]=='(')||(input[i+1]==')'))
			{
				i++;
				goto ss;
			}
			else
			{
				for(i=b+1;i<=t;i++)
				{
					if((input[i]=='+')||(input[i]=='-')||(input[i]=='*')||(input[i]=='/')||(input[i]=='=')||(input[i]=='(')||(input[i]==')'))
					{
						d=i;
						break;
					}
				}
				for(f=d-b-2;f>=0;f--)//定义计算数的权
				{
					change[d-b-2-f]=pow(double(10),f);
				}
				f=0;
				for(c=c+1;c<d;c++)//转化
				{     
					total=total+change[f]*(input[c]-48);//将单个数字加上权求和
					f++;
				}
				value[a]=total;//将转化后的值赋给value数组
				a++;
				total=0;
				i--;
			}
		}
		else
		{
			for(i=i+1;i<=t;i++)
			{
				if((input[i]=='+')||(input[i]=='-')||(input[i]=='*')||(input[i]=='/')||(input[i]=='=')||(input[i]=='(')||(input[i]==')'))
				{
					e=i;
					break;
				}
			}
			for(f=e-1;f>=0;f--)//定义计算数的权
			{
				change[e-1-f]=pow(double(10),f);
			}
			f=0;
			for(g=0;g<e;g++)//转化
			{     
				total=total+change[f]*(input[g]-48);//将单个数字加上权求和
				f++;
			}
			value[a]=total;//将转化后的值赋给value数组
			a++;
			total=0;
			i--;
		}
	}
	//****************计算部分***********************
	//**********8括号内的运算*****************
	int q=0;
	int w=0;
	int r=0;
	int y=0;
	int u=0;
	int temp=0;
	int time=0;
	int time2=0;
	for(i=0;i<=a;i++)
	{
		if(symbol[i]==')')
		{
			time++;
		}
	}
	for(y=1;y<=time;y++)
	{
		for(i=0;i<=a;i++)
		{
			while(symbol[i]==')')
			{
				q=i;
				symbol[i]=' ';
				for(u=q;u>=0;u--)
				{
					if(symbol[u]=='(')
					{
						w=u;
						symbol[u]=' ';
						break;
					}
				}
				for(i=w+1;i<q;i++)
				{
					if((symbol[i]=='+')||(symbol[i]=='-')||(symbol[i]=='*')||(symbol[i]=='/'))
					{
						time2++;
					}
				}
				//进行*和/的运算
				for(i=w+1;i<q;i++)
				{
					while(symbol[i]=='*')
					{
						temp=value[i-1]*value[i+1];
						if(time2>1)
						{
							time2--;
							value[i-1]=temp;
							for(r=i+2;r<=a;r++)
							{
								value[r-2]=value[r];
								symbol[r-2]=symbol[r];
							}
							q=q-2;
							i=w+1;
						}
						else
						{
							value[i-2]=temp;
							for(r=i+3;r<=a;r++)//运算成功,将value中的值前移4位,symbol中的值前移4位
							{
								value[r-4]=value[r];
								symbol[r-4]=symbol[r];
							}
							q=q-4;
							i=w;
						}
					}
					while(symbol[i]=='/')
					{
						temp=value[i-1]/value[i+1];
						if(time2>1)
						{
							time2--;
							value[i-1]=temp;
							for(r=i+2;r<=a;r++)
							{
								value[r-2]=value[r];
								symbol[r-2]=symbol[r];
							}
							q=q-2;
							i=w;
						}
						else
						{
							value[i-2]=temp;
							for(r=i+3;r<=a;r++)//运算成功,将value中的值前移5位,symbol中的值前移5位
							{
								value[r-4]=value[r];
								symbol[r-4]=symbol[r];
							}
							q=q-4;
							i=w;
						}


					}
				}
				//进行+和-的运算
				for(i=w+1;i<q;i++)
				{
					while(symbol[i]=='+')
					{
						temp=value[i-1]+value[i+1];
						if(time2>1)
						{
							time2--;
							value[i-1]=temp;
							for(r=i+2;r<=a;r++)
							{
								value[r-2]=value[r];
								symbol[r-2]=symbol[r];
							}
							q=q-2;
							i=w+1;
						}
						else
						{
							value[i-2]=temp;
							for(r=i+3;r<=a;r++)//运算成功,将value中的值前移4位,symbol中的值前移4位
							{
								value[r-4]=value[r];
								symbol[r-4]=symbol[r];
							}
							q=q-4;
							i=w;
						}
					}
					while(symbol[i]=='-')
					{
						temp=value[i-1]-value[i+1];
						if(time2>1)
						{
							time2--;
							value[i-1]=temp;
							for(r=i+2;r<=a;r++)
							{
								value[r-2]=value[r];
								symbol[r-2]=symbol[r];
							}
							q=q-2;
							i=w+1;
						}
						else
						{
							value[i-2]=temp;
							for(r=i+3;r<=a;r++)//运算成功,将value中的值前移4位,symbol中的值前移4位
							{
								value[r-4]=value[r];
								symbol[r-4]=symbol[r];
							}
							q=q-4;
							i=w;
						}
					}				
				}
			}
			time2=0;
		}
	}
	//***************括号外的运算********************
	//进行*和/的运算
	int o=0;
	for(i=1;i<=a;i++)
	{
		while(symbol[i]=='*')
		{
			value[i-1]=value[i-1]*value[i+1];
			for(o=i+2;o<=a;o++)//运算成功,将value中的值前移两位,symbol中的值前移两位
			{
				value[o-2]=value[o];
				symbol[o-2]=symbol[o];
			}
			i=1;
		}
		while(symbol[i]=='/')
		{
			value[i-1]=value[i-1]/value[i+1];
			for(o=i+2;o<=a;o++)//运算成功,将value中的值前移两位,symbol中的值前移两位
			{
				value[o-2]=value[o];
				symbol[o-2]=symbol[o];
			}
			i=1;
		}
	}
	//进行+和-的运算
	for(i=1;i<=c;i++)
	{
		while(symbol[i]=='+')
		{
			value[i-1]=value[i-1]+value[i+1];
			for(o=i+2;o<=a;o++)//运算成功,将value中的值前移两位,symbol中的值前移两位
			{
				value[o-2]=value[o];
				symbol[o-2]=symbol[o];
			}
			i=1;
		}
		while(symbol[i]=='-')
		{
			value[i-1]=value[i-1]-value[i+1];
			for(o=i+2;o<=a;o++)//运算成功,将value中的值前移两位,symbol中的值前移两位
			{
				value[o-2]=value[o];
				symbol[o-2]=symbol[o];
			}
			i=1;
		}
	}
	cout<<value[0]; 
	system("pause");
	return 0;
}


 
为了应付作业而编的,一个新手,请大家多多指教。/** * Title: Calculator * Description: * Copyright: Copyright (c) 2004 * Company: CUIT * Calculator.java * Created on 2004年10月13日, 下午2:35 * @author jacktom * @version 1.0*/import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Calculator extends JFrame implements ActionListener{ Operator oper; String a,result; int type; boolean flag1=false; boolean flag2=false; boolean judge=true; int count=0; JTextField text; JPanel jpanel[]; JPanel jpanel1; JButton jbutton[]; String name[]={"0",".","-/+","+","=","1","2","3","-",")","4","5","6","*","(","7","8","9","/","CE"}; //Construct the JFrame public Calculator() { oper=new Operator(); setSize(250,300); setVisible(true); //Overridden so we can exit when window is closed this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); Container con=getContentPane(); con.setLayout(new GridLayout(5,5)); text=new JTextField(12); text.setHorizontalAlignment(JTextField.RIGHT); jpanel1=new JPanel(); jpanel1.setLayout(new GridLayout(1,1)); jpanel1.add(text); jpanel=new JPanel[4]; for(int i=0;i<4;i++) { jpanel[i]=new JPanel(); jpanel[i].setLayout(new GridLayout(1,5)); } jbutton=new JButton[name.length]; //add button to panel for(int j=0;j=0;i--) { con.add(jpanel[i]); } } public void actionPerformed(ActionEvent e) { for(int i=0;i<10;i++) { if(e.getActionCommand().equals(String.valueOf(i))) if(flag1==false) { text.setText(String.valueOf(i)); flag1=true; } else { text.setText(text.getText()+i); } } if(e.getActionCommand().equals(".")) if(flag2==false&&count==0) { text.setText(text.getText()+"."); count++; flag1=true; } if(e.getActionCommand().equals("+")||e.getActionCommand().equals("-")||e.getActionCommand().equals("*")||e.getActionCommand().equals("/")) { if(judge) { a=text.getText(); oper.EvaluateExpression(a); } else judge=true; flag1=false; flag2=false; count=0; if(e.getActionCommand().equals("+")) { a="+"; oper.EvaluateExpression(a); } if(e.getActionCommand().equals("-")) { a="-"; oper.EvaluateExpression(a); } if(e.getActionCommand().equals("*")) { a="*"; oper.EvaluateExpression(a); } if(e.getActionCommand().equals("/")) { a="/"; oper.EvaluateExpression(a); } } if(e.getActionCommand().equals("=")) { if(judge) { a=text.getText(); oper.EvaluateExpression(a); } else judge=true; oper.EvaluateExpression("#"); text.setText(""); text.setText(String.valueOf(oper.CalculateResult())); flag1=false; flag2=false; count=0; } if(e.getSource()==jbutton[2]) { text.setText("-"+text.getText()); } if(e.getActionCommand().equals(")")) { a=text.getText(); oper.EvaluateExpression(a); oper.EvaluateExpression(")"); judge=false; } if(e.getActionCommand().equals("CE")) { text.setText(""); judge=true; count=0; flag1=false; flag2=false; oper=new Operator(); } if(e.getActionCommand().equals("(")) { oper.EvaluateExpression("("); } } /** * Main method * * @param args String[] */ public static void main(String args[]) { Calculator Cmain=new Calculator(); Cmain.pack(); }}/** * Operator.java * Description:用栈实现计算 * Created on 2004年10月13日, 下午3:35 * @author jacktom*/public class Operator{ StackY optr; //存放操作符 StackY opnd;//存放操作数 Puzhu p; boolean Mark; Operator() { p=new Puzhu(); optr=new StackY(); opnd=new StackY(); optr.push("#"); } public void EvaluateExpression(String s) { boolean mark=true; if(s=="+"||s=="-"||s=="*"||s=="/"||s=="("||s==")"||s=="#") { while(mark) { switch(p.Precede(optr.peek(),s)) { case -1: optr.push(s); mark=false; break; case 0: optr.pop(); mark=false; break; case 1: String theta=optr.pop(); String a =opnd.pop(); String b =opnd.pop(); if(a.indexOf(".",0)==-1&&b.indexOf(".",0)==-1) Mark=true; else Mark=false; double c=Double.valueOf(a).doubleValue(); double d=Double.valueOf(b).doubleValue(); double e=p.Operate(c,theta,d); String f=String.valueOf(e); if(theta=="/") Mark=false; if(Mark) opnd.push(f.substring(0,f.indexOf(".",0))); else opnd.push(f); break; } } } else opnd.push(s); } public String CalculateResult() { //double result=Double.valueOf(opnd.peek()).doubleValue(); return opnd.peek(); }}/** * Description:判断操作符的优先级并计算结果 * Created on 2004年10月13日, 下午4:00 * @author jacktom*/class Puzhu{ public Puzhu() {} public int Precede(String optr1,String optr2) { String[] A={"+","-","*","/","(",")","#"}; int[][] B={ {1,1,-1,-1,-1,1,1}, {1,1,-1,-1,-1,1,1}, {1,1,1,1,-1,1,1}, {1,1,1,1,-1,1,1}, {-1,-1,-1,-1,-1,0,2}, {1,1,1,1,2,1,1}, {-1,-1,-1,-1,-1,2,0}, }; int i=0,j=0,k; while(i<7) { if(A[i]==optr1) { break; } i++; } while(j<7) { if(A[j]==optr2) { break; } j++; } k=B[i][j]; return k; } public double Operate(double a,String oper,double b) { double c=0; if(oper=="+") c=a+b; if(oper=="-") c=b-a; if(oper=="*") c=a*b; if(oper=="/") c=b/a; return c; }}/** * StackY.java * Description:堆栈的基本操作实现 * Created on 2004年10月13日, 下午3:05 * @author jacktom*/public class StackY { private int maxSize; // size of stack array private String[] stackArray; private int top; // top of stack public StackY(int s) // constructor { maxSize = s; // set array size stackArray = new String[maxSize]; // create array top = -1; // no items yet }public StackY() // constructor { maxSize = 20; // set array size stackArray = new String[maxSize]; // create array top = -1; // no items yet } public void push(String j) // put item on top of stack { top++; stackArray[top] = j; // increment top, insert item } public String pop() // take item from top of stack { return stackArray[top--]; // access item, decrement top } public String peek() // peek at top of stack { return stackArray[top]; } public boolean isEmpty() // true if stack is empty { return (top == 0); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值