计算器

这个计算器可以计算包含括号的加减乘除四则混合运算。是用string实现的,没有用栈,也算是一种实现吧。虽然算法很乱。

Code:
  1. import java.io.*;   
  2.   
  3. public class Ca3 {     
  4.   
  5. //主计算方法参数为一个混合运算字符串   
  6.  public  String cacluteMain(String str){   
  7.      String []str1=str.split("[+-]");   //将字符串用“+-”拆分   
  8.      for(int i=0;i<str1.length;i++){    //若拆分的子串包含“*/”高级运算,怎调用高级运算函数   
  9.          if(str1[i].indexOf("/")>0||str1[i].indexOf("*")>0){   
  10.                 str1[i]=caculateUnder(str1[i]);   
  11.    }   
  12.   }     
  13.      char stdfc[]=str.toCharArray();    //将次字符串转成字符数组   
  14.      char stdf[]=new char[50];     //用于存放字符数组中符号   
  15.      int j=0,count=1;     
  16.   for(int i=0;i<stdfc.length;i++){   //记录字符数组中的运算符号及其次序   
  17.     if(stdfc[i]=='+')   
  18.         {stdf[j]='+';j++;count++;}   
  19.    if(stdfc[i]=='-')   
  20.        {stdf[j]='-';j++;count++;}       
  21.   }   
  22.   double stdd[]=new double[50];     
  23.   for(int i=0;i<str1.length;i++)    //将子串转换成实数   
  24.    stdd[i]=Double.parseDouble(str1[i]);   
  25.   for(int i=1;i<stdf.length;i++){    //将转换成的实数数组结合记录的符号数组计算结果   
  26.    if(stdf[i-1]=='+')   
  27.        stdd[0] += stdd[i];     
  28.    if(stdf[i-1]=='-')   
  29.        stdd[0] -=stdd[i];   
  30.   }   
  31.   Double d=new Double(stdd[0]);   
  32.   String result=d.toString();   
  33.   return result; //返回值为计算结果的字符串对象   
  34.  }   
  35.   //此方法为私有方法只有主方法caculateMain()能调用;此方法用于计算含有“*/”高级字符串   
  36.  private  String caculateUnder(String str){//此函数用于计算包含“/*”高级运算   
  37.   //String stds[];   
  38.   char stdf[]=new char[50];     //用于记录所传字符串中的运算符号   
  39.   double stdd[]=new double[50];    //用于存放所拆分成的字符串的实数转换   
  40.   String stds[]=str.split("[/*]");      //拆分所传的字符串参数   
  41.   for(int i=0;i<stds.length;i++)    //将分开的子串转换成实数   
  42.    stdd[i]=Double.parseDouble(stds[i]);   
  43.   char stdfc[]=str.toCharArray();    //将所传字符串转成字符数组   
  44.   int j=0,count=1;     
  45.   for(int i=0;i<stdfc.length;i++){   //用数组stdf[]记录字符数组中运算符号的位置   
  46.     if(stdfc[i]=='/')   
  47.     {stdf[j]='/';j++;count++;}   
  48.    if(stdfc[i]=='*')   
  49.        {stdf[j]='*';j++;count++;}       
  50.   }    
  51.   for(int i=1;i<count;i++){     //根据转换成的实数数组和记录符号的数组来计算   
  52.    if(stdf[i-1]=='/'){   
  53.        if(stdd[i]!=0)  stdd[0] /= stdd[i];   
  54.        else  
  55.           System.out.println("除数为零!!");   
  56.          
  57.    }   
  58.    if(stdf[i-1]=='*')   
  59.     stdd[0] *=stdd[i];    
  60.   }   
  61.   Double d =new Double(stdd[0]);   
  62.   String result=d.toString();   
  63.   return result;        //返回值为结果的字符串对象   
  64.  }   
  65.     
  66.  //此函数用于计算包含括号的字符串   
  67.     
  68.  public String caculateHigh(String str){    
  69.   
  70.      while (containsKh(str)){   
  71.      int i=0,j=0;   
  72.        
  73.      j=str.lastIndexOf('(');   
  74.      i=containsKh(str,j);   
  75.      if(i!=0){   
  76.      String str1=str.substring(j+1, i);   
  77.      String str2=cacluteMain(str1);   
  78.      str=str.substring(0, j)+str2+str.substring(i+1, str.length());   
  79.      }   
  80.      }   
  81.      return str;   
  82.  }   
  83.  public  boolean containsKh(String str){   
  84.      char[] str1=str.toCharArray();   
  85.      for(int i=0;i<str1.length;i++){   
  86.          if(str1[i]==')')   
  87.              return true;   
  88.      }   
  89.      return false;   
  90.         
  91.  }   
  92.  public  int containsKh(String str,int i){   
  93.      char[] str1=str.toCharArray();   
  94.      for(int k=i;k<str.length();k++){   
  95.          if(str1[k]==')'){   
  96.              return k;   
  97.          }   
  98.        
  99.      }   
  100.      return 0;   
  101.  }   
  102.  public  boolean  checkKh(String str){   
  103.      char[] temp=str.toCharArray();   
  104.      int i=0,j=0;   
  105.      for(int k=0;k<temp.length;k++){   
  106.          if(temp[k]=='(')i++;   
  107.          if(temp[k]==')')j++;   
  108.      }   
  109.      if(i==j)return true;   
  110.      else return false;   
  111.         
  112.  }   
  113.  public boolean checkExp(String str){   
  114.      char[] str1=str.toCharArray();   
  115.      for(int k=0;k<str1.length;k++){   
  116.          if(!isLagal(str1[k]))   
  117.              return false;   
  118.             
  119.      }   
  120.      return true;   
  121.  }   
  122.  public boolean isLagal(char c){   
  123.      if(Character.isDigit(c))return true;   
  124.      else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')   
  125.          return true;   
  126.      else return false;   
  127.  }   
  128.     
  129.  public static void main(String[] args)throws IOException {   
  130.      Ca3 c=new Ca3();   
  131.      BufferedReader input = new BufferedReader(new InputStreamReader(   
  132.                 System.in));   
  133.         System.err.println("请输入表达式");   
  134.         while(true){   
  135.         System.err.flush();   
  136.         String an= input.readLine();   
  137.         if(c.checkKh(an)&&c.checkExp (an)){   
  138.   System.out.println(c.cacluteMain(c.caculateHigh(an)));   
  139.      
  140.   System.err.println("请输入表达式");   
  141.            
  142.         }   
  143.         else {   
  144.             System.err.println("表达式错误!!!请输入表达式");   
  145.             continue;   
  146.         }   
  147.            
  148.     }      
  149.     
  150.  }   
  151.     
  152. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值