基于Android的科学计算器设计

news/2024/11/22 16:59:01/

资源下载地址:https://download.csdn.net/download/sheziqiong/85721857

科学计算器

一、产品概述

计算器:

它是一个拥有扁平化优雅用户界面的科学计算器,拥有科学计算与基础计算器功能,可以计算是是数学表达式:从一个简单的表达式,如“1+2”到更高级的表达式,如“3+(3*9(80+sin90))” 除了可以实现了系统自带计算器功能外还可以进行基本函数的运算和括号的运算,能根据表达式的优先级来自动区分运算顺序。

它可以记住你的计算,添加强大的容错处理功能,如点击空小数点默认为 0,除数不能为 0,log、根号与 sin 等符号中的数不能为负等。

二、面向人群

高中生,大学生等

三、产品版本及兼容

适用于 Android 操作系统

目标 API 4.1

向下兼容 API 4.0

四、思想

计算器:

计算表达式过程:

获取用户点击按钮输入的表达式的字符串,检验合法性,通过

StringTokenizer expToken = new StringTokenizer(expression,"+-×÷()sctgl!√^");

截取表达式

从左向右扫描,数字入 number 栈,运算符入 operator 栈

优先级定义: ±基本优先级为 1,×÷ 基本优先级为 2,log ln sin cos tan n!基本优先级为 3,√^ 基本优先级为 4 ,括号内层运算符比外层同级运算符优先级高 4

当前运算符优先级高于栈顶压栈,

低于栈顶弹出一个运算符与两个数进行运算

重复直到当前运算符大于栈顶

扫描完后对剩下的运算符与数字依次计算

五、设计

计算器:

用户界面布局:

输入模块,主要描述了计算器键盘以及键盘上的监听即主要负责读取用户的键盘输入以及相应触屏的按键,当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法,具体的处理办法会在相关的地方进行说明。在本项目中,在触屏上提供了各种功能的按键,分别是 C,0,1,2,3,4,5,6,7,8,9,+,-,*,/,=,MC,根号,平方,退格,退出

显示模块,主要描述了计算器的显示区,即该区域用于显示用户输入的数据以及最终的计算结果和一些其他信息。

功能实现:

计算模块的设计的实现,计算模块主要描述了计算器的整体,实现了计算器的界面,定义了用户单击的处理办法,通过定义的处理办法来完成用户的操作命令,实现用户的计算要求,这些要求包括了数值的输入,小数点的输入,正负号的输入,记忆相关功能的完成,加,减,乘,除等各计算功能的完成,运算符的替换,初始化系统等等。

主要类只有一个,里面还有一个内部类:

主要类即:

public class MainActivity extends Activity

该类包含的属性:

private Button[] btn// 0~9十个数字
private EditText input;// 用于显示输出结果
private TextView mem, _drg;//mem显示memory中所存的表达式及结果,_drg:当前是角度还是弧度(DRG是角度,RAD是弧度)
private Button div, mul, sub, add, equal, sin, cos, tan, log, ln, sqrt,square, factorial(阶乘), bksp(退格), left, right, dot, exit, drg(角度弧度键), mc, c;
public String str_old;//原来输入的字符串
public String str_new;//为了便于计算而简化后的字符串
public boolean vbegin = true;// 控制输入,true为重新输入,false为接着输入(清屏后输入

和继续输入)

public boolean drg_flag = true;// true为角度,false为弧度
public double pi = 4 * Math.atan(1);// π值
public boolean tip_lock = true;// true为正确,可以继续输入,false错误,输入锁定
public boolean equals_flag = true;// 是否在按下=之后输入,true为之前,false为之后

方法:

protected void onCreate(Bundle savedInstanceState)
//运行时调用
InitWigdet();
//初始化所有的组件
private void  AllWigdetListener();//为所有按钮绑定监听器
//命令捕捉
private OnClickListener actionPerformed = new OnClickListener()

新建一个对象

public void onClick(View v) {

按键上的命令获取

显示器上的字符串

检测输入是否合法

检测显示器上的字符串是否合法(调用后面的 right()函数),若输入正确,则将输入信息显示到显示器上

如果点击了“DRG”,则切换当前弧度角度制,并将切换后的结果显示到按键上方。

如果输入时退格键,并且是在按=之前: 一次删除 3 个字符,2 个,1 个,之前输入不合法则删除全部(调用后面的 right()函数判断是否合法,调用后面的函数 private int TTO (String str)判断是一个两个还是三个)

如果是在按=之后输入退格键则将显示器内容设置为 0

如果输入的是清除键则将显示器内容设置为 0,重新输入标志置为 true,表明可以继续输入,表明输入=之前

如果输入的是”MC“,则将存储器内容清 0

如果按”exit“则退出程序:弹出一个对话框“请确认记录必要数据后再退出系统”

如果输入的是=号,并且输入合法(调用后面的 right()函数)表明不可以继续输入,表明输入=之后,保存原来算式样子,替换算式中的运算符,便于计算,重新输入标志设置 true

将-1x 转换成-

计算算式结果(调用 calc()里面的函数),表明可以继续输入

private void print(String str) //将信息显示在显示屏上

核心:

内部类 public class calc {

public calc()//构造函数
final int MAXLEN = 500;//栈的大小
public void process(String str)

计算过程:

获取用户点击按钮输入的表达式的字符串,检验合法性,通过

StringTokenizer expToken = new StringTokenizer(expression,"+-×÷()sctgl!√^");

截取表达式

从左向右扫描,数字入 number 栈,运算符入 operator 栈

优先级定义: ±基本优先级为 1,×÷ 基本优先级为 2,log ln sin cos tan n!基本优先级为 3,√^ 基本优先级为 4 ,括号内层运算符比外层同级运算符优先级高 4

当前运算符优先级高于栈顶压栈,

低于栈顶弹出一个运算符与两个数进行运算

重复直到当前运算符大于栈顶

扫描完后对剩下的运算符与数字依次计算

·变量:

int weightPlus = 0, topOp = 0, topNum = 0, flag = 1, weightTemp = 0;// weightPlus为同一()下的基本优先级,weightTemp临时记录优先级的变化
// topOp为weight[],operator[]的计数器;topNum为number[]的计数器
// flag为正负数的计数器,1为正数,-1为负数
int weight[]; // 保存operator栈中运算符的优先级,以topOp计数
double number[]; // 保存数字,以topNum计数
char ch, ch_gai,operator[];// operator[]保存运算符,以topOp

计数

String num;// 记录数字,str以+-×÷()sctgl!√^分段,+-×÷()sctgl!√^字符之间的字符串即为数字
weight = new int[MAXLEN];//符号栈中符号对应的优先级
number = new double[MAXLEN];
operator = new char[MAXLEN];
String expression = str;
StringTokenizer  expToken = new StringTokenizer(expression,"+-×÷()sctgl!√^");//按符号分割字符串

取得字符串后:

判断正负数

取得数字,并将正负符号转移给数字

取得整个数字

将指针退回之前的位置

将正负符号转移给数字

计算运算符的优先级

如果当前优先级大于堆栈顶部元素,则直接入栈

否则将堆栈中运算符逐个取出,直到当前堆栈顶部运算符的优先级小于当前运算符(取出数字数组的相应元素进行运算( sin 等三角函数计算时要进行角度弧度的判断及转换))

依次取出堆栈的运算符进行运算

得到结果后:

如果是数字太大,提示错误信息

输出最终结果

public double FP(double n) ;

FP = floating point 控制小数位数,达到精度 否则会出现

-0.2=0.39999999999999997 的情况,用 FP 即可解决,使得数为 0.4 本格式精度为 15 位

public double N(double n);//阶乘算法
public void showError(int code, String str)//错误提示,按了"="之后,若计算式在process()过程中,出现错误,则进行提示

六、调试及测试

计算器:

各类表达式计算与清零:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjP5Genx-1655787177530)(https://www.writebug.com/myres/static/uploads/2022/6/20/1b1a01893c92d861d1685d135fce0642.writebug)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hPSDA01P-1655787177530)(https://www.writebug.com/myres/static/uploads/2022/6/20/f039fe888baa36f969499b1e3087513b.writebug)]

在这里插入图片描述

容错处理与退出:

资源下载地址:https://download.csdn.net/download/sheziqiong/85721857
资源下载地址:https://download.csdn.net/download/sheziqiong/85721857


http://www.ppmy.cn/news/480757.html

相关文章

量子计算更适用于优化:专访首家量子计算上市公司IonQ创始人 克里斯·门罗

​ IonQ创始人兼首席科学家克里斯门罗(Chris Monroe) 从更准确的天气预报到更快的药物开发,量子计算机的未来令人兴奋。但在此过程中,我们必须解决一些问题。 美国首家量子计算上市公司IonQ最近获得了一份价值1340万美元的合同&…

10、格密码-抗量子计算

目录 格密码 格的定义 格密码背景 格问题 格密码发展 格密码特点 LLL算法 LWE(Learning With Errors) 参考推荐: ***格密码学习笔记(一)_中科院大学网安学院五班的博客-CSDN博客_格密码-格、简介、LLL、LWE …

量子计算入门学习笔记(六 量子测量-上 )

经过了万恶的期末考试 之后,我们再次重新踏上量子学习的不归路(手动狗头)! 如果您是第一次观看我的博客,如果您也是和我一样刚入门量子力学或是量子计算相关的学习,纠结于量子计算的抽象与晦涩难懂&#xf…

63 岁老工程师设计一屏双计算器软件工具,一起看看?

近日,据外媒 The Mainichi 报道,一位来自日本的 63 岁老工程师 Hiroyuki Ueda 在退休之后,捣鼓起了计算机上的计算器。或许有人说,像手机、电脑上的计算器早已出现,再去重复研究,那岂不是再一波造轮子&…

量子计算(十):量子计算原理

文章目录 量子计算原理 一、酉变换 二、矩阵的指数函数 三、单位矩阵 四、单量子比特逻辑门 五、泡利矩阵 六、常见逻辑门 量子计算原理 经典计算中,最基本的单元是比特,而最基本的控制模式是逻辑门,可以通过逻辑门的组合来达到控制电…

DevExpress WPF功能区控件,更轻松创建商业应用工具栏!(下)

在上文中(点击这里回顾>>),我们主要介绍了DevExpress WPF的Ribbon、Toolbar和Menus组件支持MVVM、功能区命令栏和视图等,本文将继续介绍这些组件的自定义功能等。 DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超…

如何做好一门兴趣变现课

哈喽,大家好,我是海哥,知识付费变现创业教练,教育公司培训总监,从事知识付费变现咨询10年,已助力3000人实现知识付费变现。 之前海哥哥说过,在网课的三种常见模式中,兴趣和能力变现的…

一文说透!华熙生物如何步步为营炼就品牌势能?

据华熙生物2022年财报,华熙生物2022年营收同比增长28.53%,净利润同比增长24%,成为全球最大的。同时,近年来也在C端也大展身手。华熙生物此前与故宫博物院合作,推出6 款故宫国宝色口红和2款“故宫美人面膜”。凭借精美的…