⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compute.java

📁 该计算机工具是采用编译原理中的算符优先分析算法的语法分析方法来实现对输入的任何复合运算式的解析计算。采用Applet中实现的
💻 JAVA
字号:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.*;
import java.util.*;

public class Compute extends Applet{
	
	TextField TXT;
	Button B;
	Label L;
	String Str;
	Stack Stack_Num=new Stack();
	Stack Stack_Act=new Stack();
	
	int fromIndex=1;
	String sub_Num;
	String sub_Act;
	int count=0;
	double Num;
	int end=0;
	int empty=0;
	boolean Greater=false;
	         		     /* +   -   *   /   (   )   i   #  */
	String table[][]={
			   /* + */	  {">",">","<","<","<",">","<",">"},
			   /* - */	  {">",">","<","<","<",">","<",">"},
			   /* * */	  {">",">",">",">","<",">","<",">"},
			   /* / */	  {">",">","<","<","<",">","<",">"},
		 	   /* ( */	  {"<","<","<","<","<","=","<"," "},
		 	   /* ) */	  {">",">",">",">"," ",">"," ",">"},
			   /* i */	  {">",">",">",">"," ",">"," ",">"},
			   /* # */	  {"<","<","<","<","<"," ","<","="},
			  		 };
		
	public void init() {
		GridBagLayout gridbag=new GridBagLayout();
		this.setLayout(gridbag);
		GridBagConstraints c=new GridBagConstraints();
		
		TXT=new TextField(10);
		c.gridy=0;
		c.gridx=0;
		gridbag.setConstraints(TXT,c);
		add(TXT);
		
		B=new Button("=");
		c.gridy=1;
		c.gridx=0;
		gridbag.setConstraints(B,c);
		B.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				equal(e);}
			});
		add(B);
		
		L=new Label("                                        ");
		c.gridy=2;
		c.gridx=0;
		gridbag.setConstraints(L,c);
		add(L);
	}

	public void equal(ActionEvent e){
		Str=String.valueOf(TXT.getText());
		Compute t=new Compute();
		t.fromIndex=0;
		Stack_Act.push("#");
		while(t.fromIndex>=0){
			int i;int j;String subStr;double Num1=0.0;double Num2=0.0;
			if(t.end!=1&&t.Greater==false){t=getStr(t.fromIndex);}			
			j=GetSubscript(t.sub_Act);
			i=GetSubscript(subStr=Stack_Act.peek().toString());
			char c=table[i][j].charAt(0);
			switch(c){
				case '<':Stack_Act.push(t.sub_Act);System.out.println("本次进栈算符"+t.sub_Act);
						if(t.empty!=1&&t.Greater==false){Stack_Num.push(t.sub_Num);System.out.println("本次进栈数符"+t.sub_Num);}			
						t.Greater=false;
				break;
				case '>':if(t.empty!=1&&t.Greater==false){Stack_Num.push(t.sub_Num);System.out.println("本次进栈数符"+t.sub_Num);}
						 String q=Stack_Act.pop().toString();System.out.println("本次出栈算符"+q);
						 try{
						 	String s1=Stack_Num.pop().toString();System.out.println("本次出栈数符s1"+s1);
						 	String s2=Stack_Num.pop().toString();System.out.println("本次出栈数符s2"+s2);
						 	Num1=Double.parseDouble(s1);
						 	Num2=Double.parseDouble(s2);
						 }catch(NumberFormatException err){
						 	System.out.print("输入错误0!"+err);
						 	L.setText("输入错误!");
						 }
						 switch(i){
						 	case 0:Num1=Num2+Num1;break;
						 	case 1:Num1=Num2-Num1;break;
						 	case 2:Num1=Num2*Num1;break;
						 	case 3:if(Num1<0.0||Num1>0.0){Num1=Num2/Num1;}
						 		   else{L.setText("除数不能为0!");
						 		   		System.err.close();System.exit(1);
						 		   }break;
						 	default:L.setText("错误!");System.err.close();System.exit(1);System.out.print("本次算符"+i);
						 }
						 String d=Double.toString(Num1);
						 Stack_Num.push(d);
						 System.out.print("本次计算结果"+Num1);
						 System.out.println("本次比较算符"+t.sub_Act);
						 t.Greater=true;
						 if(j==7||j==5){t.end=1;t.empty=1;System.out.println("@@@@@@");}
				break;
				case '=':if(j==5){
							String w=Stack_Act.pop().toString();
							t.end=0;t.Greater=false;
							System.out.println("本次出栈算符"+w);}
						 else if(j==7){
						 	Stack_Act.pop();
						 	try{
						 		String s=Stack_Num.pop().toString();
						 		t.Num=Double.parseDouble(s);
						 		L.setText("结果是:"+t.Num);
						 	}catch(NumberFormatException err){
						 		System.out.print("输入错误2!"+err);
						 		L.setText("输入错误!");
						 	}
						 	t.fromIndex=-1;
						 }				
				break;
				default:; 
			}
		}	
	}
	
	int GetSubscript(String act){
		int subscript=-1;
		char a=act.charAt(0);
		switch(a){
			case '+':subscript=0;			
			break;
			case '-':subscript=1;			
			break;
			case '*':subscript=2;			
			break;
			case '/':subscript=3; 
			break;
			case '(':subscript=4;
			break;
			case ')':subscript=5;
			break;
			case 'i':subscript=6;
			break;
			case '#':subscript=7;
			break;
			default:; 
		}
		return(subscript);
	}

	Compute getStr(int fromIndex){
		Compute x1=new Compute();	                 
		int z[]={-1,-1,-1,-1,-1,-1};                   
		if(fromIndex<Str.length()){
			z[0]=Str.indexOf("+",fromIndex);z[1]=Str.indexOf("-",fromIndex);z[2]=Str.indexOf("*",fromIndex);
			z[3]=Str.indexOf("/",fromIndex);z[4]=Str.indexOf("(",fromIndex);z[5]=Str.indexOf(")",fromIndex);
		}else{for(int i=0;i<=5;i++){z[i]=-1;}}
		int Min=1000;System.out.println("本次开始查找位:"+fromIndex+"串长:"+Str.length());	
		for(int i=0;i<=5;i++){
			if(0<=z[i]&&z[i]<Min){Min=z[i];System.out.print("本次匹配算符:"+i);}
			else if(z[i]<0){x1.count=x1.count+1;}
		}
		if(x1.count==6){
			if(fromIndex<Str.length()){
				x1.sub_Num=Str.substring(fromIndex).trim();
			}	
			if(x1.sub_Num==""||x1.sub_Num==null){x1.empty=1;System.out.println("本次取得数符:"+x1.sub_Num);}
			x1.end=1;x1.sub_Act="#";System.out.println("本次取得算符 #");
		}
		else{
			x1.sub_Num=Str.substring(fromIndex,Min).trim();
			try{
				double n=Double.parseDouble(x1.sub_Num);
				x1.sub_Num=String.valueOf(n).toString();
			}catch(NumberFormatException err){
				System.out.print("输入空字符!"+err);
				x1.empty=1;
			}
			x1.sub_Act=Str.substring(Min,Min+1);System.out.println("本次取得算符"+x1.sub_Num);
			x1.fromIndex=Min+1;System.out.println("本次取得算符位:"+Min);
		}
		return(x1);	
	}	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -