3.2功能需求 支持四则混合运算,详细的运算符列表见下表,还需支持表达式的嵌套,嵌套括号限定为小括号,但允许任意层嵌套。 运算符形式 功能描述 x + y 求x与y的和 x ...
引言:计算器 abacus 2 完成几个月了,越来越不满足于 abacus 的结构逻辑,总觉得好多地方不够完美,早就有全部重写的打算,苦于工作繁忙,一直没有机会,趁着清明节小假的机会,准备把 abacus 3 的设计给做了。
1.简介
abacus 3 是一个小型简易计算器,可以用它作为计算机上的日常计算器使用,比系统自带计算器强大得多,比如它支持用户自定义运算符或者函数,支持使用变量和符号常量等。
2.总体描述
2.1 产品目标
abacus 3 的目标是打造一个日常使用的计算器,用于代替系统自带计算器,并提供更多实用的数学功能。
2.2 产品功能
abacus 3 需要具备如下功能:
支持四则混合运算支持常用数学函数支持符号常量支持用户自定义变量并参与运算支持用户自定义运算符与函数3.详细需求
3.1 界面需求
abacus 3 暂不使用 GUI 界面,以命令行的方式运行程序。程序启动后,用户逐条输入计算命令,并等待计算器输出结果。
3.2 功能需求
支持四则混合运算,详细的运算符列表见下表,还需支持表达式的嵌套,嵌套括号限定为小括号,但允许任意层嵌套。

运算符形式功能描述
x + y求x与y的和
x - y求x减去 y 的差
x * y求x与y的积
x / y求x除以 y 的商
x % y求x除以 y 的余数
- x求x的相反数
x ^ y求x的y次方
x!求x的阶乘
x!!求x的双阶乘

支持常用数学函数,需要支持三角函数、指对函数等常用的数学函数,函数的详细列表见下表。

函数形式功能描述
abs(x)求x的绝对值
pow(x, y)求x的y次方
pow10(x)
求10 的x次方
exp(x)
求e的x次方,e 是自然对数的底数
log(x, y)求x的以 y 为底的对数
log10(x)求x的以 10 为底的对数
ln(x)求x的以 e 为底的对数,e 是自然对数的底数
sqrt(x)求x的算术平方根
sin(x)求x的正弦,x 采用弧度制
cos(x)求x的余弦,x 采用弧度制
tan(x)求x的正切,x 采用弧度制
arcsin(x)求x的反正弦
arccos(x)求x的反余弦
arctan(x)求x的反正切
sinh(x)求x的双曲正弦
cosh(x)
求x的双曲余弦
tanh(x)
求x的双曲正切
max(x1, x2, ..., xn)
求x1, x2, ..., xn 中的最大值
min(x1, x2, ..., xn)求x1, x2, ..., xn 中的最小值
ceil(x)
求不小于 x 的最小整数
floor(x)求不大于 x 的最大整数

支持符号常量,在表达式中可以使用圆周率、自然对数的底数等符号常量,例如求半径为 2.3 的圆的面积可以输入表达式 PI * 2.3 * 2.3,用户可以定义自己的符号常量并永久保存并使用,计算器内置符号常量列表如下:

标识符
描述值
PI圆周率3.141592654
E自然对数的底数2.718281828

支持用户自定义变量并参与运算,要求如下:变量的名称中只能包含字母和数字,并且必须以字母开头允许一次定义多个变量定义变量的时候可以指定值也可以不指定需有变量赋值的功能如果使用未经赋值的变量参与运算,程序应当给出出错提示允许用户定义符号常量并永久存储使用支持用户自定义运算符与函数,要求如下:函数名称只能包含字母和数字,并且必须以字母开头允许一次定义多个运算符或函数,运算符需指定优先级定义运算符或函数时必须指定完成计算的表达式自定义的运算符或函数不得与内置运算符或函数同名冲突提供自定义运算符或函数的永久存储使用
3.3 非功能需求
程序应该跨平台运算响应速度应得到保证应具有简短易理解的错误提示
转载于:https://my.oschina.net/zhcosin/blog/119886
计算器可以大大的降低运算难度,提高准确率和精确率。 2.操作系统 Windows、 3.开发环境 Android studio 4.功能描述 良好的界面,简约美观的效果,快捷简单的操作,简单的加减乘除,计算器上数字0-9为一个控件...
1.项目背景
计算器是日常生活中十分便捷有效的工具,能实现加减乘除等简单运算。计算器可以大大的降低运算难度,提高准确率和精确率。
2.操作系统
Windows、
3.开发环境
Android studio
4.功能描述
良好的界面,简约美观的效果,快捷简单的操作,简单的加减乘除,计算器上数字0-9为一个控件数组,加减乘除为一个控件数组,其余为单一的控件。
5.性能需求
用户提交查询时,得到返回结果的延时不能超过5秒
6.运行需求
在用户界面部分,界面应该简洁大方,易于操作,直观明了,突出显示重要及出错信息
转载于:https://www.cnblogs.com/liqinsqzr/p/6586334.html
需求分析 : 我们利用JS脚本来完成简易计算器,那么需要一个js文件以及相关项目demo,需要有 加减乘除 四个功能。> 既然我们明白了功能需求,那我们就开始动手把! 类的定义: 创建一个数字信息 (NumberData...

Java利用JavaScript脚本计算器

介绍
利用JAVA面向对象思想快速开发脚本计算器
准备工作
教程基于JDK1.8开发
需求分析:
我们利用JS脚本来完成简易计算器,那么需要一个js文件以及相关项目demo,需要有加减乘除四个功能。
既然我们明白了功能需求,那我们就开始动手把!
类的定义:
创建一个数字信息(NumberData)类用来储存数据项和 数字计算接口(NumberCalculation) 以及相关实现类(NumberAdapter)

代码如下

NumberData(数字数据类)package cn.marinda.data; public class NumberData { private int num1; private int num2; public NumberData(int num1 ,int num2) { this.num1 = num1; this.num2 = num2; } public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } }NumberAdapter(实现类)package cn.marinda.handle; import cn.marinda.data.NumbersCalculation; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.io.FileReader; public class NumberAdapter implements NumbersCalculation { public static NumberAdapter adapter = new NumberAdapter(); private NumberAdapter() { } /** * 计算返回整数结果 * * @param num1 数字一 * @param num2 数字二 * @param mode 方式 * @return */ @Override public int getIntResult(int num1, int num2, String mode) { String thisMode = isMode(mode); int result = jsInvoke(num1, num2, mode); return result; } /** * 计算返回小数结果 * * @param num1 数字一 * @param num2 数字二 * @param mode 方式 * @return */ @Override public int getDoubleResult(int num1, int num2, String mode) { return 0; } /** 验证类型 * * @param mode 类型 * @return 计算类型 * 返回类型 */ private String isMode(String mode) { switch (mode) { case "+": return "+"; case "_": return "_"; case "*": return "*"; case "/": return "/"; } return null; } /** 通过JS脚本来快速计算结果 * 计算器 * @param num1 数字1 * @param num2 数字2 * @param mode 类型 * @return 计算结果 * use JavaScrip */ public int jsInvoke(int num1,int num2,String mode) { ScriptEngineManager mannager = new ScriptEngineManager(); ScriptEngine engine = mannager.getEngineByName("javascript"); String jsFiles = "src/invoke.js"; double results = 0.0; try { FileReader reader = new FileReader(jsFiles); engine.eval(reader); if(engine instanceof Invocable){ Invocable invokes = (Invocable) engine; results = (double)invokes.invokeFunction("invoke",num1,num2,mode); }else{ reader.close(); } }catch (Exception e){ e.printStackTrace(); } return (int)results; } }NumberCalculation(数字计算接口)package cn.marinda.data; public interface NumbersCalculation { /** 计算返回整数结果 * * @param num1 数字一 * @param num2 数字二 * @param mode 方式 * @return */ public int getIntResult(int num1,int num2,String mode); /** 计算返回小数结果 * * @param num1 数字一 * @param num2 数字二 * @param mode 方式 * @return */ public int getDoubleResult(int num1,int num2,String mode); }index.jsfunction invoke(a, b,mode) { var c = (a + mode + b); var num1 = Number(c.substr(0,1)); var num2 = Number(c.substr(c.length-1)); var r = 0; switch (mode) { case "+": r = (a + b); break; case "*": r = (a * b); break; case "/": r = (a / b); break; case "-": r = (a - b); break; } return r; }
由于我们这里的 JavaScript 读出来的 mode不能被直接进行运算,我们就通过JavaScript 的SubString方法来分贝取Number1和Number2然后再通过switch来取mode进行计算

main方法

package cn.marinda; import cn.marinda.data.NumberData; import cn.marinda.handle.NumberAdapter; import java.util.Scanner; public class Application { public static void main(String[] args) { applications(); } private static void applications() { while (true) { System.out.println("欢迎使用白云计算器"); System.out.println("请输入一个整数"); Scanner scanner = new Scanner(System.in); int num1 = scanner.nextInt(); System.out.println("请输入再输入一个整数"); int num2 = scanner.nextInt(); System.out.println("请输入操作符"); String mode = scanner.next(); NumberData data = new NumberData(num1,num2); System.out.println("计算结果是:" + NumberAdapter.adapter.getIntResult(data.getNum1(),data.getNum2(),mode)); System.out.println("要退出请按q键,按其他键继续!"); String str = scanner.next(); if(!str.equalsIgnoreCase("q")){ continue; }else{ System.out.println("good bye!"); break; } } } }
功能效果

结束语

功能实现完毕

主要还是用到Java内置的ScriptEngineManager和ScriptEngine 来与JavaScript搭桥牵线。
关于ScriptEngineManager和ScriptEngineManager
可以看CSDN其他博主文章以及自行百度初次发布对内容有疑问的欢迎评论指出
*需求:做一个简单的计算器 * 1、能够实现加、减、乘、除* 2、能够连续的计算,例如:3+2 ,*6,-20 * 3、计算器开机的时候显示0 * 4、按下“=”号的时候,能够显示结果 * *分析: * 1,...
package com.yuxinyicheng.calculator;
* 需求:做一个简单的计算器
* 1、能够实现加、减、乘、除
* 2、能够连续的计算,例如:3+2 ,*6,-20
* 3、计算器开机的时候显示0
* 4、按下“=”号的时候,能够显示结果
* 分析:
* 1,属性:
* 两个整数型的变量;
* 一个static类型的整型变量,用来存放结果,是static的原因是为了实现连续加
* 一个char类型的变量,用来存放操作符
* 2,方法:
* 一个main方法
* 一个静态的代码块(在没有对象的时候,计算机开机的时候就显示0)
* 一个用来计算的方法
* 三个重载的构造方法
* 1,一个是传递两个整数型的参数(输入两个的时候)
* 2,一个是传递两个整形的参数和操作符(输入完整的表达式)
* 3,一个是猪传递操作符(用来实现按下“=”)
public class Calculator {
private int integer1;
private int integer2;
private char operator; //定义操作符
private static int result=0;//用来存放计算的结果,是static类型
//刚开始的时候计算器显示0
static{
System.out.println("计算器开机显示:"+result);
}
//当输入操作符和一个数时候
public Calculator(char operator,int integer2){
this.integer1=result;
this.operator=operator;
this.integer2=integer2;
}
//当输入一个完整的表达式的时候
public Calculator(int integer1,char operator, int integer2){
this.integer1=integer1;
this.integer2=integer2;
this.operator=operator;
}
//按下等于号的情况
public Calculator(char operator){
if(operator=='='){
System.out.println("计算的结果为:"+result);
}
else{
throw new UnsupportedOperationException();
}
}
//加、减、乘、除的计算
public int calculate() throws UnsupportedOperationException,
ArithmeticException{
if(operator=='+'){
result=integer1+integer2;
}
else if(operator=='-'){
result=integer1-integer2;
}
else if(operator=='*'){
result=integer1*integer2;
}
else if(operator=='/'){
if(integer2==0){
throw new ArithmeticException();
}
else{
result=integer1/integer2;
}
}
else{
throw new UnsupportedOperationException();
}
return result;
}
public char getOperator() {
return operator;
}
public void setOperator(char operator) {
this.operator = operator;
}
public int getInteger1() {
return integer1;
}
public void setInteger1(int integer1) {
this.integer1 = integer1;
}
public int getInteger2() {
return integer2;
}
public void setInteger2(int integer2) {
this.integer2 = integer2;
}
public static int getResult() {
return result;
}
public static void setResult(int result) {
Calculator.result = result;
}
public static void main(String[] args) {
// 主方法捕获异常,并且进行测试
try {
//完成的表达式
Calculator cl1=new Calculator(3,'+',5);
int reslut=cl1.calculate();
System.out.println("计算的结果为:"+result);
//连续的计算
Calculator cl2=new Calculator('+',5);
result =cl2.calculate();
System.out.println("连续计算的结果是:"+result);
//测试除法
Calculator cl3=new Calculator('/',5);//除数不是0
result =cl3.calculate();
System.out.println("除数不是0的结果是:"+result);
// Calculator cl4=new Calculator('/',0);//除数为0
// result =cl4.calculate();
// System.out.println("除数不是0的结果是:"+result);
//测试"="
Calculator cl5=new Calculator('=');//是=
//Calculator cl6=new Calculator('*');//是=
} catch (UnsupportedOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我这个项目的码云地址是... 表格记录了我预期做这个项目的时间和实际上消耗的时间 PSP2.1 Personal Software ProcessStages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 440 410 ...
关键词:C#.NET计算器词法分析语法分析表达式计算 ConExpress Calculator写在前面的话其实很早之前就想写点关于这个的话题了,可总觉得其中的逻辑有点乱,不敢贸然动手。前一阵看了设计模式的书,心血...
一、需求实现 1、实现功能: 支持运算符:+, - , *, /, %(百分号), ^(幂次方), | |(绝对值),!(阶乘)。其他符号:( ) [ ] { } 支持数据类型:正负数、小数。 2、实现方法 符号优先级处理方法:符号等级制 ...
用Python3写一个计算器:实现基本功能如+,-,*,/,^, 要注意的是:输入含有括号( ),小数点 .思路就是逆波兰表达式的算法: 从中缀式的左端开始逐个读取字符x,逐序进行如下步骤: 1.若x是操作数,将x直接压...
基于jsf框架编写的简单计算器,有完整的需求分析报告
Reverse Polish Calculator (逆波兰计算器)方案的分析——如何解决问题,从需要到实现
Java实报告_实现基本功能的简单计算器《Java实习报告》题目系别:计算机班级:学号:姓名:时间:目 录前言及问题定义3第一章需求分析3第二章总体设计32.1系统模块结构图32.2 系统运行流程图3第三章详细设计33.1 ...
文章目录1计算器程序界面分析2计算器界面程序实现2.1计算器界面程序初步实现2.2计算器界面代码重构 1计算器程序界面分析 程序界面如下: 界面设计: 定义组件间的间隔: Space = 10px 定义按钮组件的大小...
这是个完整的课程设计,包括设计所需的各个部分,运行结果,数据分析,截图,以及完整的c++源代码
功能点:计算器 加法功能测试点:1)是否可以正常输入数据2)是否可以修改输入的数据3)是否数字相加结果正确4)是否可以多个数相加,并且数据正确测试计算器的加法功能,请考虑你讲如何让进行,写出你能想到的测试点!...
2.掌握和分析需求,并根据需求实现相应的功能 。 3.熟悉系统调试等相关能力,形成初步的有实用意义的计算器程序。计算器运行结果如下: public static ListinputStr = new List(1000); /...
原标题:FRM考试时所用计算器的操作指南FRM考试费用采取"Early ...这些计算机和我们以前在中学期间常用的计算器使用起来还是有所不同的,对于金融相关计算非常方便。这些都是比较符合中国人思维习惯的专业财务计算器...
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! ...