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

📄 symbol.java

📁 用JAVA做的一个手机上的计算器
💻 JAVA
字号:
package xcalc;

interface Symbol
{
	public abstract Real eval();	
}

final class Num implements Symbol
{
	private static Num xVar = new Num(Real.ZERO);
	private static Num yVar = new Num(Real.ZERO);
	private Real a;
	
	public static Num getXVar(){
		return xVar;
	}
	
	public static void setXVar(Real x){
		if(x!=null)	xVar.a = x;
	}
	
	public static Num getYVar(){
		return yVar;
	}
	
	public static void setYVar(final Real y){
		if(y!=null) yVar.a = y;
	}

	public Num(final Real a)
	{
		this.a = a;
	}

	public Real eval()
	{
		return new Real(a);
	}
}

final class Exp1 implements Symbol
{
	private final Symbol a;
	private final int operator;
	
	private static Real DegGradToRad(Real val) {
		if (Options.RadDegGrad == 1){
			val.mul(Real.PI);
			val.div(180);
		}			
		else if (Options.RadDegGrad == 2){
			val.mul(Real.PI);
			val.div(200);
		}	
		return val;
	}
	
	private static Real RadToDegGrad(Real val){
		if (Options.RadDegGrad == 1){
			val.mul(180);
			val.div(Real.PI);
		}else if (Options.RadDegGrad == 2){
			val.mul(200);
			val.div(Real.PI);
		}	
		return val;
	}
	
	public Exp1(final int operator, final Symbol a){
		this.a = a;
		this.operator = operator;
	}

	public Real eval() {
		final Real b = a.eval();	
		
		switch(operator){
		case Solver.K_SUB:   b.neg(); break;
		case Solver.K_SQRT:  b.sqrt();break;
		case Solver.K_LOG10: b.log10();  break;
		case Solver.K_LOG2:  b.log2(); break;
		case Solver.K_LN :   b.ln();  break;
		case Solver.K_SIN:   DegGradToRad(b).sin();  break;
		case Solver.K_COS:   DegGradToRad(b).cos(); break;
		case Solver.K_TAN:   DegGradToRad(b).tan(); break;
		case Solver.K_ASIN:  b.asin();RadToDegGrad(b); break;
		case Solver.K_ACOS:  b.acos();RadToDegGrad(b); break;
		case Solver.K_ATAN:  b.atan();RadToDegGrad(b); break;
		case Solver.K_SINH:  b.sinh(); break;
		case Solver.K_COSH:  b.cosh(); break;
		case Solver.K_TANH:  b.tanh(); break;
		case Solver.K_ASINH: b.asinh(); break;
		case Solver.K_ACOSH: b.acosh(); break;
		case Solver.K_ATANH: b.atanh(); break;
		case Solver.K_FAC:   b.fact();break;
		case Solver.K_ABS:	 b.abs(); break;
		}					
		return b;
	}	
}


final class Exp2 implements Symbol
{
	private final Symbol a,b;
	private final int operator;
	
	public Exp2(final int operator,final Symbol a,final Symbol b){
		this.operator = operator;
		this.a = a;
		this.b = b;
	}
	
	public Real eval() {
		final Real left = a.eval();
		final Real right = b.eval();
		switch(this.operator){
		case Solver.K_ADD: left.add(right); break;
		case Solver.K_SUB: left.sub(right); break;
		case Solver.K_MUL: left.mul(right); break;
		case Solver.K_DIV: left.div(right); break;
		case Solver.K_POWER: left.pow(right); break;
		case Solver.K_PER: 
			if (left.isNegative() && right.isIntegral()) {
		      // Special case
		      // Py,x = (-1)^x * fact(-y-1+x)/fact(-y-1)
		      boolean negative = right.isOdd();
		      left.neg();
		      left.sub(Real.ONE);
		      right.add(left);
		      right.fact();
		      left.fact();
		      left.rdiv(right);
		      if (negative)
		      left.neg();
		    } else {
		      // P(a,b) = fact(a)/fact(b-a)
		      System.out.println(left.toString());
		      System.out.println(right.toString());
			  right.neg();
			  right.add(left);
			  right.fact();
		      left.fact();
		      left.div(right);
		      System.out.println(left.toString());
		    }
			break;   
		case Solver.K_COM: 
			final Real rTmp = new Real();
		    if (left.isNegative() && right.isIntegral()) {
		      // Special case
		      // Cleft,right = (-1)^right * fact(-left-1+right)/(fact(-left-1) * fact(right))
		      boolean negative = right.isOdd();
		      rTmp.assign(right);
		      rTmp.fact();
		      left.neg();
		      left.sub(Real.ONE);
		      right.add(left);
		      right.fact();
		      left.fact();
		      left.mul(rTmp);
		      left.rdiv(right);
		      if (negative)
		             left.neg();
		     } else {
		      // Cleft,right = fact(left)/(fact(left-right)*fact(right))
		      rTmp.assign(right);
		      rTmp.fact();
		      right.neg();
		      right.add(left);
		      right.fact();
		      right.mul(rTmp);
		      left.fact();
		      left.div(right);
		    }		
			break;
		}
		return left;
	}
}

⌨️ 快捷键说明

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