JAVA计算器(有无限加括号功能)+string与double互相转化

本文介绍了作者完成的一个Java计算器项目,具备处理括号、负数、乘除优先级等功能,核心算法处理字符串计算逻辑,约600行代码。计算器能够自动检查输入合法性,支持鼠标点击和键盘输入,但不支持跳跃修改。作者在实现过程中,原本自定义了string到double和double到string的转换函数,后来发现Java已有内置方法,感到懊恼。文章分享了内置转换方法的使用,并提供了代码片段。
摘要由CSDN通过智能技术生成

java老师布置的作业,要我们编个计算器,而且要有括号功能。。。编的恶心哪,600多行代码,调试来调试去终于能用了,但是估计还有bug。

有一个bug我自己知道,但是不影响正常使用:可以存在前导零,就是说可以有0087这种数字,计算器会认为这就是87,。

下面是两个截图,左边是输入,右边是输出。


这个计算器的核心算法就是对左边的字符串进行处理,得出右边的结果,其中要考虑到括号匹配、负号、乘除优先级等等问题,这一个算法写了200行。

因为字符串比较短,最多就几十,所以我的算法比较暴力,没有考虑时间和空间复杂度,大量地对字符串进行遍历(不符合我这样一个ACMer严谨治学的精神啊。。。其实是因为有点懒)。

除此之外,计算器还能自动识别输入内容的合法性,如果不合法,你是输入不进去某些符号的

for example:如果你已经输入了8+9,此时你再按’)‘或者’(‘,计算器会没反应,你只有再写个’+‘或者把’9‘去掉才能输入’(‘。这个功能我是在输入的时候把每个位置的东西记录在了一个F[][]二维数组里,每次输入一个键,判断一下。

另比如你当前的式子不构成一个完整的表达式,按回车或者’=‘是无效的,你可以按’Backspace‘回去一点点修改,但是不支持跳着改,只能改上一个(本人能力和精力实在有限,要是加上跳着改,还要把左右箭头加进去,太麻烦)。

这个计算器支持鼠标点按钮和键盘输入,按’=‘或者’回车‘可以出结果,按’c‘可以清零。

还有一个让我要抓狂的事情!!!!因为是初学者,不咋会java,一开始还不知道字符串和double之间相互转化的算法系统早就给弄好了,我还自己编了change_to_double()和change_to_string()两个函数,写了几百行代码,调试这俩函数调了半天也没弄好,然后我知道可以用系统现成的函数的时候,简直要崩溃。。。

下面是double和string互相转化的实现方式。

string转double:

double a;

string ls="1.23"

a=Double.parseDouble(ls);

然后a就变成了double型的1.23。


double转string:两种方法(不知道区别是啥,都能用把)

方法1:直接在s后面+a(我觉得这个写起来简单)

String s="";

double a=1.23

s=s+a;

方法2:用String.valueOf(double);

String s="";

double a=1.23;

s==s.valueOf(a);


下面是我实现的代码。有些地方有注释。


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Calculator extends JFrame {
	static char A[]={'0','1','2','3','4','5','6','7','8','9'};
//	static double k[]={0.1,0.001,0.0001,0.00001,0.000001,0.0000001};//什么破java软件,这个东西放到别的地方都报错

	private JTextField textField1;
	private JButton b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,
	BACK,C,jia,jian,cheng,chu,deng,dian,zuok,youk;
	public Calculator(){
		super("计算器");
		Container container=getContentPane();
//		container.setLayout(new FlowLayout());
		container.setLayout(null);
		
		//文本框
		textField1=new JTextField("");
		textField1=new JTextField(35);
		textField1.setBounds(20, 20, 290, 30);
		container.add(textField1);
		
		
		//各种按钮
		
		BACK=new JButton("Backspace");
		BACK.setBounds(20, 60, 110, 40);
		container.add(BACK);
		C=new JButton("C");
		C.setBounds(140, 60, 50, 40);
		container.add(C);
		zuok=new JButton("(");
		zuok.setBounds(200, 60, 50, 40);
		container.add(zuok);
		youk=new JButton(")");
		youk.setBounds(260, 60, 50, 40);
		container.add(youk);
		jia=new JButton("+");
		jia.setBounds(200, 110, 50, 40);
		container.add(jia);
		jian=new JButton("-");
		jian.setBounds(260, 110, 50, 40);
		container.add(jian);
		cheng=new JButton("*");
		cheng.setBounds(200, 160, 50, 40);
		container.add(cheng);
		chu=new JButton("/");
		chu.setBounds(260, 160, 50, 40);
		container.add(chu);
		dian=new JButton(".");
		dian.setBounds(140, 260, 50, 40);
		container.add(dian);
		deng=new JButton("=");
		deng.setBounds(200, 210, 110, 90);
		container.add(deng);
		b0=new JButton("0");
		b0.setBounds(20, 260, 110, 40);
		container.add(b0);
		b1=new JButton("1");
		b1.setBounds(20, 210, 50, 40);
     	container.add(b1);
		b2=new JButton("
好的,我可以帮您实现这个计算器。您需要使用Dev-C++集成开发环境,以便在Windows上编写和运行C++代码。以下是一个基本的框架,您可以根据您的需求进行修改和扩展: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; // 判断一个字符是否为操作符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取操作符的优先级 int getPriority(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } else { return 0; } } // 计算两个数的结果 double calculate(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 计算中缀表达式的值 double evaluate(string expr) { stack<double> operandStack; // 操作数栈 stack<char> operatorStack; // 操作符栈 for (int i = 0; i < expr.length(); i++) { char c = expr[i]; if (isdigit(c)) { // 如果是数字,压入操作数栈 int j = i; while (j < expr.length() && (isdigit(expr[j]) || expr[j] == '.')) { j++; } operandStack.push(stod(expr.substr(i, j - i))); // 将字符串换为浮点数 i = j - 1; } else if (isOperator(c)) { // 如果是操作符 while (!operatorStack.empty() && isOperator(operatorStack.top()) && getPriority(operatorStack.top()) >= getPriority(c)) { // 如果操作符栈顶的操作符优先级大于等于当前操作符,就弹出栈顶操作符并计算 double b = operandStack.top(); operandStack.pop(); double a = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(a, b, op)); } operatorStack.push(c); // 将当前操作符压入操作符栈 } else if (c == '(') { // 如果是左括号,压入操作符栈 operatorStack.push(c); } else if (c == ')') { // 如果是右括号,弹出操作符栈中的操作符并计算,直到遇到左括号 while (!operatorStack.empty() && operatorStack.top() != '(') { double b = operandStack.top(); operandStack.pop(); double a = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(a, b, op)); } operatorStack.pop(); // 弹出左括号 } } // 处理剩余的操作符 while (!operatorStack.empty()) { double b = operandStack.top(); operandStack.pop(); double a = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(a, b, op)); } return operandStack.top(); // 返回最终结果 } int main() { string expr; cout << "请输入一个包含加减乘除和括号的中缀表达式:" << endl; cin >> expr; double result = evaluate(expr); cout << "计算结果为:" << result << endl; return 0; } ``` 这个程序可以接受用户输入一个包含加减乘除和括号的中缀表达式,并计算它的值。您可以根据需要进行扩展,例如添GUI界面和输入框,以便用户可以通过单击按钮输入表达式。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值