`

一个简单的计算器

阅读更多

在: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));
  
 }
}

0
0
分享到:
评论

相关推荐

    一个简易计算器

    总之,一个简易计算器虽然看似简单,但其背后涉及了计算机科学中的诸多概念,包括用户界面设计、事件处理、数据结构(如栈)、数学运算以及算法(如表达式解析)。通过理解和实现这样的项目,开发者可以深入理解编程...

    一个简单计算器程序-基于对话框.doc

    该资源是一篇关于使用 MFC 开发一个简单科学计算器程序的教程,通过创建一个基于对话框的应用程序,实现了加、减、乘、除四个基本功能,并在此基础上扩展了平方、开方、三角函数等功能。 知识点一:MFC 基础知识 *...

    用VC编写的一个简单计算器程序

    【标题】"用VC编写的一个简单计算器程序"指的是使用Visual C++(简称VC)开发的简易版计算应用程序。Visual C++是微软公司推出的一种集成开发环境,它支持C++语言,同时也提供了MFC(Microsoft Foundation Classes)...

    用工厂方法模式做的一个简易计算器

    在这个例子中,我们讨论的是如何使用工厂方法模式(Factory Method Pattern)实现一个简易计算器。工厂方法模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂接口或者抽象类...

    java实现的一个简单计算器

    用java语言实现的一个简单计算器,支持加减乘除,小数,带括号运算,不支持负数,该程序带有界面,附带使用方法,算法实现简单,可能有一些小bug未解决,主要是测试有限。。

    C语言编写的简易计算器

    在本文中,我们将深入探讨如何使用C语言在Microsoft Visual Studio 2015环境下构建一个简易计算器。这个计算器是基于栈和队列的数据结构实现,非常适合C语言初学者进行学习和实践。 首先,C语言是一种强大的、低...

    嵌入式实验报告-简易计算器.pdf

    本实验报告的主要目的是设计和实现一个具有加减乘除功能的简易计算器,使用数码管和4X4矩阵式键盘来实现计算器的功能。下面是本实验报告的知识点总结: 1. 计算器的原理:计算器的原理是基于数码管和4X4矩阵式键盘...

    ASP.NET做的一个简单计算器

    在这个"ASP.NET做的一个简单计算器"项目中,我们可以深入理解ASP.NET的核心概念以及C#编程语言在Web开发中的应用。 首先,ASP.NET 提供了多种开发模型,如Web Forms、MVC和ASP.NET Core(现在主要发展的是Core版本...

    用labview编写的一个简易计算器

    本程序采用labview软件,编写了一个简易的计算器,具有加减乘除和开方求倒数功能

    MFC做的一个简易计算器

    在这个“MFC做的一个简易计算器”项目中,我们可以探讨以下几个MFC相关的知识点: 1. MFC框架:MFC提供了一种面向对象的方式来编写Windows应用程序,它封装了许多Windows API函数,使开发者可以更专注于业务逻辑而...

    一个用JS做的简易计算器

    标题中的“一个用JS做的简易计算器”表明这是一个使用...这个简易计算器项目为初学者提供了学习JavaScript基础、DOM操作、事件处理和简单算法的良好实践平台,同时也为有经验的开发者提供了一个扩展和优化的挑战。

    Dw 和 HtmI 制作一个简易计算器

    &lt;!DOCTYPE html&gt; 计算机 table{border:1px solid gray;} td{width: 10px;height: 10px;border:1px groove gray;text-align: right;padding: 5px;margin: 5px;border-radius: 5px 5px 5px 5px;...

    数电实验二:简易计算器(设计报告).pdf

    这篇设计报告详细介绍了在数电实验二中设计一个简易计算器的过程。这个实验旨在让学生们熟练掌握数字电子技术,包括逻辑电路设计、Verilog HDL 数字系统设计、PLD(可编程逻辑器件)实验箱的使用以及Quartus II软件...

    一个简单计算器,实现基本功能

    在编程领域,创建一个简单的计算器是一项基础练习,它可以帮助初学者理解如何处理用户输入、执行数学运算以及构建交互式应用程序。这个"一个简单计算器,实现基本功能"的项目,正如标题所描述,提供了基础的计算功能...

    C语言简易计算器实现编写一个简易计算器

    **简易计算器实现** 在计算机科学领域,学习编程语言如C语言是基础且至关重要的。...通过以上步骤,我们可以创建一个功能齐全的简易计算器,满足课程设计的要求。在实际编程过程中,不断迭代和完善是成功的关键。

    实现一个简易计算器

    在本主题中,我们将探讨如何实现一个简易计算器。这个任务主要涉及编程,特别是与用户交互、解析输入和执行计算相关的技术。在这个过程中,我们将使用基本的编程概念,如变量、运算符、条件语句和循环。 首先,我们...

    java开发的一个简易计算器

    在Java编程环境中,开发一个简易计算器是一项常见的学习任务,它能帮助初学者更好地理解面向对象编程、GUI设计以及数据结构的运用。这个“java开发的一个简易计算器”项目,显然是使用Java语言来实现的,主要涉及了...

    简易计算器(c语言课程设计)

    本简易计算器的设计和实现,展示了 C 语言在图形模式下的编程能力,并提供了一个基本的计算器模型,读者可以根据自己的需求进行修改和扩展。 7. 未来发展 未来可以对计算器的功能进行扩展,例如添加科学计算功能、...

    简易计算器_html_源码

    本案例是一个简单的HTML计算器的实现,旨在帮助初学者理解HTML的基本结构和功能。 在"简易计算器_html_源码"这个项目中,我们可以深入探讨以下几个关键的HTML知识点: 1. **HTML结构**:HTML文档通常由`&lt;!DOCTYPE ...

    66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)

    66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51...

Global site tag (gtag.js) - Google Analytics