- 浏览: 216920 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (121)
- 投资杂记 (6)
- Java技术 (46)
- 记忆 (7)
- 科技随笔 (6)
- 随感 (8)
- 漫谈云计算 (4)
- 生活点滴 (1)
- andriod笔记 (13)
- mysql-数据库 (2)
- OSGI (1)
- Spring Data JPA (1)
- gradle maven nexus (1)
- Java性能优化 多核线程 优化 (2)
- Open-Erp (oe) (8)
- Java技术 camel (1)
- jetty camel dynamicRouter (1)
- karaf (1)
- amqp apollo camel karaf (1)
- Java技术 MyCat (1)
- Java技术 并行调用 线程池 (1)
最新评论
-
白云天:
主机网络端口使用命令: netstat -nplt
centos7.4上安装mysql5.7记录 -
白云天:
登录到 容器内部 docker ps -a查询容器IDsudo ...
docker初探 -
白云天:
export jars to local directory ...
Camel的direct,Bean测试 -
白云天:
location /esb/ { proxy_ ...
Camel的direct,Bean测试 -
白云天:
centos 中添加 shell_script.sh 为开机启 ...
Camel的direct,Bean测试
在: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));
}
}
发表评论
-
docker初探
2017-08-17 16:49 6231、docker , 先从仓库中下载一个和自己的 ... -
java-nio的hello-word
2017-04-27 17:55 504重点注意:有说明的地 ... -
Java NIO 系列教程
2015-07-02 14:28 885Java NIO提供了与标准IO不同的IO工作方式: ... -
随手记录-设计目录中的jar到类路径
2015-05-07 18:01 791@echo off color 7 SetLocal Enab ... -
gradle和maven结合nexus服务解决jar包依赖
2014-07-17 11:00 16361、架设 nexus nexus 的基础不多讲了,去官网下载 ... -
利用注解定义SQL语句,实现类是iBatis的数据库访问
2014-06-25 18:04 3541import java.lang.annotation.*; ... -
使用 Spring Data JPA 简化 JPA 开发(Spring Data JPA 开发指南)
2014-06-11 15:46 710从一个简单的 JPA 示例开始 本文主要讲述 Spring D ... -
My-sql批量更新或者插入的SQL
2013-09-25 17:03 1386My-sql批量更新或者插入的SQL,高效, MyBatis中 ... -
加减的艺术用于工作学习管理
2013-02-17 17:12 746回顾做过的事情,总结起来,就是先加,后减,再加。 不是吗? ... -
记录到内存的Logger,可用于web动态显示内容的来源
2013-02-17 09:35 1835import java.io.ByteArrayOutputS ... -
一个表达式计算工具
2012-11-21 12:57 783可以计算: 加减乘除,余数,括号 , 结果为整数,操作数全部为 ... -
ms-sql-server获取某表的当前可用的自增值
2012-01-10 09:46 921执行 SQL : select IDENT_CURRENT( ... -
一个加密数字和逗号且减少空间的算法
2010-11-09 17:19 1337注意本算法只能处理由 0,1,2,3,4,5,6,7,8, ... -
云计算笔记
2010-09-01 14:13 810最近得闲,去了解下 hadoop系统,下面为过程记录: 1、 ... -
在MySql上实现Replication(Master 与 Slave 数据同步)
2010-04-23 17:54 1150假设这里有三个数据库分别为 d1、d2、d3,其中d ... -
在一台windows机器上如何安装多个Mysql
2010-04-23 17:41 34171、将mysql程序直接拷贝到某个目录(假设目录为d:\mys ... -
MySQL复制配置步骤文档(主从备份机制)
2010-03-30 10:14 1881本文档主要对一个主服务器,一个从服务器(简称一主一从)的复制配 ... -
如何得到SqlServer的自增ID
2010-03-16 11:09 5959转自:http://hi.baidu.com/vc60/blo ... -
J2EE集群
2010-01-04 15:29 3634对于理解J2EE集群技术不 ... -
JDBC 调用存储过程的整理
2010-01-04 14:30 1055String sqls = this.getSqls().ge ...
相关推荐
总之,一个简易计算器虽然看似简单,但其背后涉及了计算机科学中的诸多概念,包括用户界面设计、事件处理、数据结构(如栈)、数学运算以及算法(如表达式解析)。通过理解和实现这样的项目,开发者可以深入理解编程...
该资源是一篇关于使用 MFC 开发一个简单科学计算器程序的教程,通过创建一个基于对话框的应用程序,实现了加、减、乘、除四个基本功能,并在此基础上扩展了平方、开方、三角函数等功能。 知识点一:MFC 基础知识 *...
【标题】"用VC编写的一个简单计算器程序"指的是使用Visual C++(简称VC)开发的简易版计算应用程序。Visual C++是微软公司推出的一种集成开发环境,它支持C++语言,同时也提供了MFC(Microsoft Foundation Classes)...
在这个例子中,我们讨论的是如何使用工厂方法模式(Factory Method Pattern)实现一个简易计算器。工厂方法模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂接口或者抽象类...
用java语言实现的一个简单计算器,支持加减乘除,小数,带括号运算,不支持负数,该程序带有界面,附带使用方法,算法实现简单,可能有一些小bug未解决,主要是测试有限。。
在本文中,我们将深入探讨如何使用C语言在Microsoft Visual Studio 2015环境下构建一个简易计算器。这个计算器是基于栈和队列的数据结构实现,非常适合C语言初学者进行学习和实践。 首先,C语言是一种强大的、低...
本实验报告的主要目的是设计和实现一个具有加减乘除功能的简易计算器,使用数码管和4X4矩阵式键盘来实现计算器的功能。下面是本实验报告的知识点总结: 1. 计算器的原理:计算器的原理是基于数码管和4X4矩阵式键盘...
在这个"ASP.NET做的一个简单计算器"项目中,我们可以深入理解ASP.NET的核心概念以及C#编程语言在Web开发中的应用。 首先,ASP.NET 提供了多种开发模型,如Web Forms、MVC和ASP.NET Core(现在主要发展的是Core版本...
本程序采用labview软件,编写了一个简易的计算器,具有加减乘除和开方求倒数功能
在这个“MFC做的一个简易计算器”项目中,我们可以探讨以下几个MFC相关的知识点: 1. MFC框架:MFC提供了一种面向对象的方式来编写Windows应用程序,它封装了许多Windows API函数,使开发者可以更专注于业务逻辑而...
标题中的“一个用JS做的简易计算器”表明这是一个使用...这个简易计算器项目为初学者提供了学习JavaScript基础、DOM操作、事件处理和简单算法的良好实践平台,同时也为有经验的开发者提供了一个扩展和优化的挑战。
<!DOCTYPE html> 计算机 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;...
这篇设计报告详细介绍了在数电实验二中设计一个简易计算器的过程。这个实验旨在让学生们熟练掌握数字电子技术,包括逻辑电路设计、Verilog HDL 数字系统设计、PLD(可编程逻辑器件)实验箱的使用以及Quartus II软件...
在编程领域,创建一个简单的计算器是一项基础练习,它可以帮助初学者理解如何处理用户输入、执行数学运算以及构建交互式应用程序。这个"一个简单计算器,实现基本功能"的项目,正如标题所描述,提供了基础的计算功能...
**简易计算器实现** 在计算机科学领域,学习编程语言如C语言是基础且至关重要的。...通过以上步骤,我们可以创建一个功能齐全的简易计算器,满足课程设计的要求。在实际编程过程中,不断迭代和完善是成功的关键。
在本主题中,我们将探讨如何实现一个简易计算器。这个任务主要涉及编程,特别是与用户交互、解析输入和执行计算相关的技术。在这个过程中,我们将使用基本的编程概念,如变量、运算符、条件语句和循环。 首先,我们...
在Java编程环境中,开发一个简易计算器是一项常见的学习任务,它能帮助初学者更好地理解面向对象编程、GUI设计以及数据结构的运用。这个“java开发的一个简易计算器”项目,显然是使用Java语言来实现的,主要涉及了...
本简易计算器的设计和实现,展示了 C 语言在图形模式下的编程能力,并提供了一个基本的计算器模型,读者可以根据自己的需求进行修改和扩展。 7. 未来发展 未来可以对计算器的功能进行扩展,例如添加科学计算功能、...
本案例是一个简单的HTML计算器的实现,旨在帮助初学者理解HTML的基本结构和功能。 在"简易计算器_html_源码"这个项目中,我们可以深入探讨以下几个关键的HTML知识点: 1. **HTML结构**:HTML文档通常由`<!DOCTYPE ...
66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51单片机C语言实例Proteus仿真和代码)66-矩阵键盘简易计算器(51...