一个简单的计算器

在:http://saberhaha.iteye.com/ 看到一个计算器的算法, 我也提供一个简单的计算器,可处理四则运算,加数学函数,程序中只支持 sin(x) 一个函数,可更加需要,自己修改,加入,运用了递归,速度还是不错的,欢迎交流。

 

 

package test;

import java.lang.StrictMath;

/**
 * 一个简单的计算器
 * @author q
 *
 */
public class Calculator {
 
 public static String cal(String exp){
  
  if(exp==null || exp.length()==0){
   return "0";
  }
  
  boolean b=true;
  while(b){
   b=false;
   if(exp.indexOf("(")>=0){ //有括号的先计算-包括函数如: sin(x)
    exp=cal_kh(exp);
    b=true;
   } 
  }
  b=true;
  while(b){
   b=false;
   if(exp.indexOf("*")>=0){ //有*的先计算
    exp=cal_cc(exp,"*");
    b=true;
   }
   if(exp.indexOf("/")>=0){ //有/的先计算
    exp=cal_cc(exp,"/");
    b=true;
   }
  }
  
  b=true;
  while(b){
   b=false;
   if(exp.indexOf("+")>=0){ //有*的先计算
    exp=cal_jj(exp,"+");
    b=true;
   }
   if(exp.indexOf("-")>=0){ //有*的先计算
    exp=cal_jj(exp,"-");
    b=true;
   }
   if(isNumber(exp)){
    break;
   }
  } 
  return exp;
 }
 
 static boolean isNumber(String exp){
  int i=exp.indexOf("-");
  if(i==0){
   if(exp.lastIndexOf("-")!=0){
    return false;
   }
  }
  i=exp.indexOf("+");
  if(i==0){
   if(exp.lastIndexOf("+")!=0){
    return false;
   }
  }
  return true;
 }
 
 
 static String cal_kh(String exp){
  int from=exp.indexOf("(");
  if(from<0) return exp;
  int num=0;
  char c;
  int to=0;
  for(int i=from;i<exp.length();i++){
   c=exp.charAt(i);
   if(c=='(') num++;
   if(c==')') num--;
   if(num==0){
    to=i;
    break;
   }
  }
  if(to<from) return exp;
  String fun=null;
  String sub=exp.substring(from+1,to);//取得括号中间的串
  if(from>0){
   c=exp.charAt(from-1);
   if(c>'a' && c<'z' || c>'A' && c<'Z'){ //是一个数学函数
    fun=getFunctionName(exp,from-1);
   }
  }
  if(fun!=null){
   from-=fun.length();
  }
  String v=cal(sub);
  if(fun!=null){
   v=fun(fun,v); //数学函数计算
  }
  sub=String.valueOf(v); //注意科学计数发的表达会出错
  
  exp=exp.substring(0,from)+sub+exp.substring(to+1);
  return exp;
 }
 
 
 static String cal_jj(String exp,String sg){
  int index=exp.indexOf(sg);
  if(index<0) return exp;
  String s1=getNumber(exp,index,-1);
  String s2=getNumber(exp,index,1);
  System.out.println(s1+","+s2);
  float f=0;
  String sub="";
  if(sg.equals("+")){
   f=Float.parseFloat(s1)+Float.parseFloat(s2);
  }
  if(sg.equals("-")){
   f=Float.parseFloat(s1)-Float.parseFloat(s2);
  }
  sub=String.valueOf(f);
  String pre="";
  if(index-s1.length()>0){
   pre=exp.substring(0,index-s1.length());
  }
  String tail="";
  if(index+s2.length()+1<exp.length()){
   tail=exp.substring(index+s2.length()+1);
  }
  String ret=pre+sub+tail;
  return ret;
 }
 
 static String cal_cc(String exp,String sg){
  int index=exp.indexOf(sg);
  if(index<0) return exp;
  String s1=getNumber(exp,index,-1);
  String s2=getNumber(exp,index,1);
  float f=0;
  String sub="";
  if(sg.equals("*")){
   f=Float.parseFloat(s1)*Float.parseFloat(s2);
  }
  if(sg.equals("/")){
   f=Float.parseFloat(s1)/Float.parseFloat(s2);
  }
  sub=String.valueOf(f);
  String ret=exp.substring(0,index-s1.length())+sub+exp.substring(index+s2.length()+1);
  return ret;
 }
 
 static String getNumber(String exp,int pos,int inc){
  System.out.println("-getNumber:"+exp+",Pos="+pos+",Dir="+inc);
  int from=pos+inc;
  if(from<0) return "0";
  char c=exp.charAt(from);
  String one="";
  while(c>='0' && c<='9' || c=='.'){
   if(inc>0){
    one=one+c;
   }else{
    one=c+one;
   }
   
   from+=inc;
   if(from<0 || from>=exp.length()){
    break;
   }
   c=exp.charAt(from);
  }
  return one;
 }
 
 static String fun(String name,String v){
  if(name==null) return v;
  Double d=Double.parseDouble(v);
  if(name.equalsIgnoreCase("sin")){
   d=StrictMath.sin(d);
  }
  if(name.equalsIgnoreCase("cos")){
   
  } 
  return String.valueOf(d);
 }
 
 static String getFunctionName(String exp,int to){
  int from=to+1;
  char c;
  for(int i=to;i>=0;i--){
   c=exp.charAt(i);
   if(c=='+' || c=='-' || c=='*' || c=='/'){
    from=i+1;
    break;
   }
  }
  if(from>to){
   return null;
  }
  return exp.substring(from,to+1);
 }
 
 public static void main(String []args){
  String exp="3-10*sin(1)";
  int i=exp.indexOf("*");
  
  System.out.println(getNumber(exp,i,-1));
  System.out.println(getNumber(exp,i,1));
  System.out.println(cal(exp));
  
 }
}

你可能感兴趣的:(C++,c,算法,F#,C#)