文本计算器

Java真方便,还有自己的堆栈的定义,不用自己写了,那个输入一串数字就可以计算出结果的计算器我是没看懂(也懒的看,不喜欢看别人的东西,毛病,得改尴尬),自己就看着堆栈的定义,写了一个文本计算器,不知道还有没有毛病,有一个不会改的毛病就是没法提示错误,输入不正确的时候怎么让它提示啊?用try和catch不管用,郁闷,下面是源码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class TxtCalculator implements ActionListener
{
	JFrame f;
	JPanel pTxt = new JPanel();
	JTextField txt;
	JPanel pShow = new JPanel();
	JTextArea show;
	JMenu mEdit;
	JMenu mView;
	JMenu mHelp;
	JMenuItem mSave;
	JMenuItem mClear;
	JMenuItem mHelpItem;
	JMenuItem mAbout;
	JButton start;
	String strAll[][]=new String[100][100];
	public TxtCalculator()
	{	
		f = new JFrame("文本计算器");
		JMenuBar mBar = new JMenuBar();
		mBar.setOpaque(true);
		mEdit = new JMenu("编辑");
		mSave = new JMenuItem("保存历史");
		mSave.addActionListener(this);
		mEdit.add(mSave);
		mClear = new JMenuItem("清空历史");
		mClear.addActionListener(this);
		mEdit.add(mClear);
		mHelp = new JMenu("帮助");
		mHelpItem = new JMenuItem("帮助主题");
		mHelpItem.addActionListener(this);
		mHelp.add(mHelpItem);
		mAbout = new JMenuItem("关于计算器");
		mAbout.addActionListener(this);
		mHelp.add(mAbout);
		mBar.add(mEdit);
		mBar.add(mHelp);
		f.setJMenuBar(mBar);
		txt = new JTextField();
		pTxt.setLayout(new BorderLayout());
		pShow.setLayout(new BorderLayout());
		start = new JButton("开始计算");
		start.setForeground(Color.blue);
		txt.addKeyListener(new KeyListener()
		{
			public void keyPressed(KeyEvent e)
			{
				int keyCode = e.getKeyCode();
				if (keyCode == KeyEvent.VK_ENTER)
				{
					System.out.println("用户按下了回车键");
					start.doClick();
				}
			}
			public void keyReleased(KeyEvent args) {}
			public void keyTyped(KeyEvent args) {}
		});
		start.addActionListener(this);
		show = new JTextArea("");
		show.setLineWrap(true);
		show.setEditable(false);
		txt.requestFocus();
		pTxt.add(txt,BorderLayout.CENTER);
		pTxt.add(new JScrollPane(start),BorderLayout.EAST);
		pShow.add(pTxt,BorderLayout.NORTH);
		JScrollPane show2=new JScrollPane(show);
		pShow.add(show2,BorderLayout.CENTER);
		f.add(pShow);
		f.setSize(new Dimension(300,270));
		f.setResizable(false);
		f.setVisible(true);
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("用户已经成功关闭软件!");
				System.exit(0);
			}
		});
	}
	public void actionPerformed(ActionEvent e)
	{
		String s = e.getActionCommand();
		if(s.equals("保存历史"))
		{
			System.out.println("用户按下了“保存历史”菜单");
			try
			{
				FileWriter txtWriter=new FileWriter("History.txt");
				BufferedWriter writer=new BufferedWriter(txtWriter);		
				String S=show.getText();
				S="/*文本计算器*/\r\n/*制作人:曹晨曦*/\r\n/*欢迎交流使用!*/\r\n/*E-mail:2.236068@gmail.com*/\r\n/*这是文本计算器的保存文件,可以根据您的需要在这里面保存记录*/\r\n"+S;
				writer.write(S);
				writer.close();
				System.out.println("历史History.txt已经保存到CLASS文件根目录!");
				JOptionPane.showMessageDialog(null,"历史History.txt已经保存到CLASS文件根目录!","提示",JOptionPane.WARNING_MESSAGE);
				Runtime.getRuntime().exec("cmd /c start .\\");
			}catch(IOException ee){}
   		}
   		else if(s.equals("清空历史"))
   		{
   			System.out.println("用户按下了“清空历史”菜单");
   			show.setText("");
   		}
   		else if(s.equals("帮助主题"))
		{
			System.out.println("用户按下了“帮助主题”菜单");
			JOptionPane.showMessageDialog(null,"输入表达式即可,只支持有理数和括号\"(\",\")\"","帮助主题",JOptionPane.WARNING_MESSAGE);
		}
		else if(s.equals("关于计算器"))
		{
			System.out.println("用户按下了“关于计算器”菜单");
			JOptionPane.showMessageDialog(null,"由曹晨曦制作,欢迎使用","关于计算器",JOptionPane.WARNING_MESSAGE);
		}
   		else if(s.equals("开始计算"))
   		{
   			System.out.println("用户按下了“开始计算”按钮");
   			String exp=txt.getText().trim();
   			int strLength[]=new int[1000];
   			for(int i=0;i<100;i++)
			{
				for(int j=0;j<100;j++)
				{
					strAll[i][j]=null;
				}
			}
			String expBr;
			expBr=SeparateAllString("#"+exp+"#",strLength);
			SeparateString("#"+expBr+"#",strAll[99]);
			for(int k=0;k<100;k++)
			{
				if(strAll[99][k]==null)
				{
					strLength[99]=k;
					break;
				}
			}
			txt.setText(""); 
			if(exp.compareTo("")!=0)
			{	
				String stemp;
				stemp=doubleTrans(CalculatorAlgorithm(strAll[99],strLength[99]));
				if(stemp.compareTo("Infinity")==0)
				{
					stemp="+∞";
					show.append(exp+"="+stemp+"\r\n");
					System.out.println(exp+"="+stemp);
				}
				else if(stemp.compareTo("-Infinity")==0)
				{
					stemp="-∞";
					show.append(exp+"="+stemp+"\r\n");
					System.out.println(exp+"="+stemp);
				}
				else
				{
					show.append(exp+"="+stemp+"\r\n");
					System.out.println(exp+"="+stemp);
				}	
			}
			txt.requestFocus();
   		}
   	}
   	String doubleTrans(double d)
	{
  		if(Math.round(d)-d==0)
  		{
			return String.valueOf((long)d);
		}
		return String.valueOf(d);
	}
	double CalculatorAlgorithm(String str[],int strLength)
	{
		if(strLength==3)
		{
			double n;
			n=Double.parseDouble(str[1]);
			return n;
		}
		Stack stkNum=new Stack();
		Stack stkOp=new Stack();
		Stack stkNumTaken=new Stack();
		Stack stkOpTaken=new Stack();
		double operateNum1=0.0,operateNum2=0.0;
		int pOp=0,cOp=0;
		boolean LastFirst=false;
		String ptempOp,ctempOp;
		String FirstOp,EndOp;
		int pPriority=0,cPriority=0;
		for(int i=strLength-1;i>=0;i--)
		{
			if(str[i].charAt(str[i].length()-1)>='0'&&str[i].charAt(str[i].length()-1)<='9')
			{
				double n;
				n=Double.parseDouble(str[i]);
				stkNum.push(n);
			}
			else stkOp.push(str[i]+"");
		}
		FirstOp=(String)stkOp.pop();
		while(!stkOp.empty())
		{
			if(!stkOpTaken.empty()&&!LastFirst)
			{
				operateNum1=(Double)stkNumTaken.pop();
				ptempOp=(String)stkOpTaken.pop();
			}
			else
			{
				operateNum1=(Double)stkNum.pop();
				ptempOp=(String)stkOp.pop();
			}
			if(ptempOp.compareTo("+")==0)
			{
				pPriority=20;
				pOp=1;
			}
			else if(ptempOp.compareTo("-")==0)
			{
				pPriority=20;
				pOp=2;
			}
			else if(ptempOp.compareTo("*")==0)
			{
				pPriority=50;
				pOp=3;
			}
			else if(ptempOp.compareTo("/")==0)
			{
				pPriority=50;
				pOp=4;
			}
			else if(ptempOp.compareTo("#")==0)
			{
				pPriority=1;
				pOp=0;
			}
			if(!stkOpTaken.empty()&&!LastFirst)
			{
				operateNum2=(Double)stkNumTaken.pop();
				ctempOp=(String)stkOpTaken.pop();
			}
			else
			{
				operateNum2=(Double)stkNum.pop();
				ctempOp=(String)stkOp.pop();
				LastFirst=false;
			}
			if(ctempOp.compareTo("+")==0)
			{
				cPriority=20;
				cOp=1;
			}
			else if(ctempOp.compareTo("-")==0)
			{
				cPriority=20;
				cOp=2;
			}
			else if(ctempOp.compareTo("*")==0)
			{
				cPriority=50;
				cOp=3;
			}
			else if(ctempOp.compareTo("/")==0)
			{
				cPriority=50;
				cOp=4;
			}
			else if(ctempOp.compareTo("#")==0)
			{
				cPriority=1;
				cOp=0;
			}
			if(pPriority>=cPriority)
			{
				
				switch(pOp)
				{
				case 1:
					operateNum2=operateNum1+operateNum2;break;
				case 2:
					operateNum2=operateNum1-operateNum2;break;
				case 3:
					operateNum2=operateNum1*operateNum2;break;
				case 4:
					operateNum2=operateNum1/operateNum2;break;
				}
			}
			else
			{
				stkNumTaken.push(operateNum1);
				stkOpTaken.push(ptempOp+"");
				LastFirst=true;
			}
			stkNum.push(operateNum2);
			stkOp.push(ctempOp+"");
			if(stkOpTaken.empty()&&ctempOp.compareTo("#")==0)break;
		}
		double m=0.0;
		m=(Double)stkNum.pop();
		return m;	
	}
	void SeparateString(String s,String str[])
	{
		int i;
		int j;
		boolean bSNum;
		boolean bSOp;
		boolean bSLFunc;
		boolean bSRFunc;
		boolean bSBra;
		boolean bSNumF;
		boolean bSOpF;
		boolean bSLFuncF;
		boolean bSRFuncF;
		boolean bSBraF;
		boolean bSEnd;
		boolean bSEndF;
		str[0]=""+s.charAt(0);
		j=0;
		for(i=1;i<s.length();i++)
		{
			bSEndF=(s.charAt(i-1)=='#');
			bSEnd=(s.charAt(i)=='#');
			bSNumF=(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')||(s.charAt(i-1)=='.')||(s.charAt(i-1)=='-');
			bSNum=(s.charAt(i)>='0'&&s.charAt(i)<='9')||(s.charAt(i)=='.')||(s.charAt(i)=='-');
			bSOpF=((s.charAt(i-1)=='+')||(s.charAt(i-1)=='*')||(s.charAt(i-1)=='/'));
			bSOp=((s.charAt(i)=='+')||(s.charAt(i)=='*')||(s.charAt(i)=='/'));
			bSLFuncF=(s.charAt(i-1)>='a'&&s.charAt(i-1)<='z');
			bSLFunc=(s.charAt(i)>='a'&&s.charAt(i)<='z');
			bSRFuncF=((s.charAt(i-1)=='!'));
			bSRFunc=((s.charAt(i)=='!'));
			bSBraF=((s.charAt(i-1)=='(')||(s.charAt(i-1)==')'));
			bSBra=((s.charAt(i)=='(')||(s.charAt(i)==')'));
			if(bSNumF&&bSNum)
			{
				if(
					(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'||(s.charAt(i-1)=='.')||(s.charAt(i-1)=='-'))
					&&
					s.charAt(i)=='-'
					&&
					(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||(s.charAt(i+1)=='.')||(s.charAt(i+1)=='-'))
					)
					j++;
				if((s.charAt(i-2)>='0'&&s.charAt(i-2)<='9')&&s.charAt(i-1)=='-'&&(s.charAt(i)>='0'&&s.charAt(i)<='9'))
					j++;
			}
			else if(bSOpF&&bSOp){}
			else if(bSLFuncF&&bSLFunc){}
			else if(bSRFuncF&&bSRFunc){}
			else if(bSBraF&&bSBra){}
			else if(bSEndF&&bSEnd){}
			else j++;
			if(str[j]!=null)str[j]=str[j]+s.charAt(i);
			else str[j]=""+s.charAt(i);
		}
	}
	String SeparateAllString(String s,int strLength[])
	{
		String str[]=new String[1000];
		Stack stkString=new Stack();
		Stack stkStringTaken=new Stack();
		int i=1;
		int count=1;
		while(s.charAt(i)!='#')
		{
			stkString.push(s.charAt(i));
			i++;
		}
		i=0;
		while(count!=0)
		{
			count=0;
			while(!stkString.empty())
			{
				
				char temp;
				
				temp=(Character)stkString.pop();
				stkStringTaken.push(temp);
				if(temp==')')count++;
				if(temp=='(')
				{
					count--;
					stkStringTaken.pop();
					while((Character)stkStringTaken.peek()!=')')
					{
						if(str[i]!=null)str[i]=str[i]+(Character)stkStringTaken.pop();
						else str[i]=""+(Character)stkStringTaken.pop();
					}
					
					stkStringTaken.pop();
					SeparateString("#"+str[i]+"#",strAll[i]);	
					for(int j=0;j<100;j++)
					{
						if(strAll[i][j]==null)
						{
							strLength[i]=j;
							break;
						}
					}
					String swap;
					swap=""+CalculatorAlgorithm(strAll[i],strLength[i]);
					for(int iii=swap.length()-1;iii>=0;iii--)
						stkStringTaken.push(swap.charAt(iii));
					i++;
				}
			}
			while(!stkString.empty())stkString.pop();
			while(!stkStringTaken.empty())
			{
				char swap;
				swap=(Character)stkStringTaken.pop();
				if(swap=='('&&swap==')')count++;
				stkString.push(swap);
			}
		}
		s="";
		while(!stkString.empty())
			s=(Character)stkString.pop()+s;
		return s;
	}
	
	public static void main(String[] args)
	{
		new TxtCalculator();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文本计算器》是一款为经常需要使用计算器的用户而设计的软件,该软件使用简单、方便,不在注册表中写入任何字节,实为是一款绿色软件。 当需要计算数据时,在窗口中输入整个表达式(表达式可以是加+、减-、乘*、除/、平方^、括号(),以及数学函数组合),按回车后可自动计算出结果,计算方法一目了然,便于查找计算中可能出现的错误。 支持的数学函数:cos(), sin(), tg(), ctg(), abs(), sgn() or sign(), sqrt(), ln(),sh() or sinh(), ch() or cosh(), th() or tanh(),cth() or coth(), heaviside()。 文本计算器采用多语言界面,方便国外朋友使用。 一、用法: 1、文本计算器具有关闭时是否保存计算结果的功能、计算结果的小数位选择功能,以及自动更新功能; 2、文本计算器打开时,将会自动加载上次的计算结果; 3、公式按钮中加入公式计算功能,公式框按回车可进行公式固定而数值变化的计算;; 4、输入数学表达式后,按回车键,自动计算结果; 5、一个表达式必须在一行内全部输入; 6、表达式可以是加+、减-、乘*、除/、平方^、括号(),以及数学函数组合。 二、支持的数学函数: 1、cos(), sin(), tg(), ctg(), abs(), sgn() or sign(), sqrt(), ln(),sh() or sinh(), ch() or cosh(), th() or tanh(),cth() or coth(), heaviside(); 2、示例:1+sin(30)(其中30为弧度)按回车键后显示1+sin(30)=0.012。 2010-03-06 21:11 V4.73 1、增加清除的快捷方式CTRL+D 2010-5-19 21:01 V4.76 1、去除按键声音功能,减少文件体积。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值