java科学计算器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

package d;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;
import java.io.IOException;

public class D extends JFrame {
/**
*
*/
private static final long serialVersionUID = -6728795026953123509L;

JMenuItem menu[]; // 菜单项
JTextField tf1; // 计算器显示屏
TextField tf2; // 用于显示是否有记忆值

Button bt[] = new Button[45]; // 45个按钮
StringBuffer str; // 显示屏所显示的字符串
String strTmp;// 暂存显示屏的结果,用于复制、粘贴
double x, y; // x和y为两个运算数
static double m; // 记忆值
int op = 23;

/*
* op表示单击了那一个运算符.0-22分别表示: "+", "-", "*", "/", "x^y", "Mod", "And", "Or",
* "Xor", "Lsh", "Rsh", "sqrt", "%", "1/X", "sin", "cos", "tan", "ln",
* "log", "n!", "x^3", "x^2", "Not"
*/

public D() {
// 更换程序图标为计算器图标image.jpg
Toolkit tk = Toolkit.getDefaultToolkit();
Image image = tk.createImage("image.jpg"); /* image.gif计算器图标 */
setIconImage(image);
setTitle("计算器");
setMenu();// 设置菜单项
setLayout(null);
setButtonAndTextField();// 实例化按钮与文本区域

// 创建一个空字符串缓冲区
str = new StringBuffer();
strTmp = new String();

setResizable(false);// 禁止调整框架的大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.white);
setVisible(true);// 显示框架
}

@SuppressWarnings("deprecation")
public void setButtonAndTextField() {
// 定义按钮上显示的字符
String btCmd[] = { "Backspace", "CE", "C", "MC", "MR", "MS", "M+", "7",
"8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3",
"-", "1/X", "0", "+/-", ".", "+", "=", "PI", "sin", "ln",
"x^y", "Mod", "And", "E", "cos", "log", "x^3", "Or", "Xor",
"Lsh", "tan", "n!", "x^2", "Rsh", "Not" };
GridLayout gl1, gl2, gl3, gl4;
JPanel p0, p1, p2, p3, p4;
gl1 = new GridLayout(1, 4, 10, 0);// 实例化四个面板的布局
gl2 = new GridLayout(4, 1, 0, 15);
gl3 = new GridLayout(4, 5, 10, 10);
gl4 = new GridLayout(3, 6, 10, 10);

tf1 = new JTextField(26);// 显示屏
tf1.setHorizontalAlignment(JTextField.RIGHT);

tf1.setEnabled(false);
tf1.setDisabledTextColor(Color.black);
tf1.setText("0");
tf2 = new TextField(5);// 显示记忆的索引值
tf2.setEditable(false);
tf2.disable();

// 实例化所有按钮、设置其前景色并注册按钮和键盘监听器
int i;
for (i = 0; i < 45; i++) {
bt[i] = new Button(btCmd[i]);
bt[i].addActionListener(new btEvent());
bt[i].addKeyListener(new keyEvent());
if (i <= 6 || (i % 5 == 0 && i < 27) || i == 26) {
bt[i].setForeground(Color.red);
} else if (i >= 27) {
bt[i].setForeground(Color.magenta);
} else {
bt[i].setForeground(Color.blue);
}
}
//

实例化四个面板
p0 = new JPanel();
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();

// 添加面板p0中的组件和设置其在框架中的位置和大小
p0.add(tf1);
p0.setFocusable(false);
p0.setBounds(10, 0, 290, 45);
// 添加面板p1中的组件和设置其在框架中的位置和大小
p1.setLayout(gl1);
p1.add(tf2);
p1.add(bt[0]);
p1.add(bt[1]);
p1.add(bt[2]);
p1.setBounds(10, 45, 290, 30);
// 添加面板p2中的组件并设置其的框架中的位置和大小
p2.setLayout(gl2);
p2.add(bt[3]);
p2.add(bt[4]);
p2.add(bt[5]);
p2.add(bt[6]);
p2.setBounds(10, 85, 40, 180);
// 添加面板p3中的组件并设置其在框架中的位置和大小
p3.setLayout(gl3);// 设置p3的布局
for (i = 7; i < 27; i++) {
p3.add(bt[i]);
}
p3.setBounds(60, 85, 240, 180);
// 添加面板p3中的组件并设置其在框架中的位置和大小
p4.setLayout(gl4);
for (i = 27; i < 45; i++) {
p4.add(bt[i]);
}
p4.setBounds(10, 290, 290, 140);
// 设置框架中的布局为空布局并添加5个面板
add(p0);
add(p1);
add(p2);
add(p3);
add(p4);
}

public void setMenu() {
JMenuBar menuBar = new JMenuBar();
menu = new JMenuItem[6];// 共6个菜单项
String mCmd[] = { "复制(C) Ctrl+C", "粘贴(V) Ctrl+V", "◆标准型(T)",
" 科学型(S)", "帮助(H)", "关于计算器(A)" };
setBounds(400, 300, 315, 330);
JMenu editMenu = new JMenu("编辑(E)");
JMenu viewMenu = new JMenu(" 查看(V)");
JMenu aboutMenu = new JMenu(" 帮助(H)");
for (int i = 0; i < 6; i++) {// 创建菜单项并注册监听器
menu[i] = new JMenuItem(mCmd[i]);
menu[i].addActionListener(new mnEvent());
}
// 菜单项加入菜单栏
editMenu.add(menu[0]);
editMenu.add(menu[1]);
viewMenu.add(menu[2]);
viewMenu.add(menu[3]);
aboutMenu.add(menu[4]);
aboutMenu.add(menu[5]);
menuBar.add(editMenu);
menuBar.add(viewMenu);
menuBar.add(aboutMenu);
setJMenuBar(menuBar);
}

public Point loc() {
// 取得当前窗口的位置信息
return this.getLocation();
}

/*
* 运算主干部分
* 入口参数: 计算器按钮上的相应的字串或键盘键入的数字和运算符
* 实现功能: 获得用户输入,进行运算,并显示运算结果
* 主要思路: 定义一字符串数组,内容为运算符键值,根据入口参数的运算符与运算符
* 键值数组比较求得一操作码op,把op分成单目运算符和双目运算符, 根据op进行相应
* 运算并显示结果
*/
public void keyAndButtonAction(String cmd) {
try {
String operation[] = { // 运算符键值
"+", "-", "*", "/", "x^y", "Mod", "And", "Or", "Xor", "Lsh", "Rsh",
"sqrt", "%", "1/X", "sin", "cos", "tan", "ln", "log", "n!",
"x^3",

"x^2", "Not" };
int i;
for (i = 0; i < 23; i++) {
if (cmd == operation[i]) {// 求运算op码
op = i;
break;
}
}
if (op <= 10 && i < 23) {// 如果当前按下的是双目运算符
x = Double.parseDouble(tf1.getText().trim());// 获取用户输入
str.setLength(0);// 清空缓冲区以便接收新的另一个运算数
y = 0d;
} else if (op < 23 && i < 23) {// 如果当前按下的是单目运算符
x = Double.parseDouble(tf1.getText().trim());
str.setLength(0);
y = 0d;
switch (op) {// 根据op进行相应运算,并显示运算结果
case 11:// sqrt
tf1.setText("数字格式异常");
if (x < 0)
tf1.setText("负数没有平方根");
else
tf1.setText("" + Math.sqrt(x));
break;
case 12:// %
tf1.setText("" + (0.01 * x));
break;
case 13:// 1/x
if (x == 0) {
tf1.setText("除数不能为零");
} else {
tf1.setText("" + (1 / x));
}
break;
case 14:// sin
tf1.setText("" + Math.sin(Math.toRadians(x)));
break;
case 15:// cos
tf1.setText("" + Math.cos(Math.toRadians(x)));
break;
case 16:// tan
tf1.setText("" + Math.tan(Math.toRadians(x)));
break;
case 17:// ln
tf1.setText("" + Math.log(x));
break;
case 18:// log10
tf1.setText("" + Math.log10(x));
break;
case 19:// n!
int n = 1;
while (m > 0)
n *= m--;
tf1.setText("" + n);
break;
case 20:// x^3
tf1.setText("" + Math.pow(x, 3));
break;
case 21:// x^2
tf1.setText("" + Math.pow(x, 2));
break;
case 22:// 取反
tf1.setText("" + (~(int) x));
break;
}
} else {// 如果不是运算符
if (cmd == bt[26].getActionCommand())// 单击等号按钮输出计算结果
{
str.setLength(0);
switch (op) {// 根据op把x与y进行相应运算并显示结果
case 0:// +
tf1.setText("" + (x + y));
break;
case 1:// -
tf1.setText("" + (x - y));
break;
case 2:// *
tf1.setText("" + (x * y));
break;
case 3:// /
tf1.setText("" + (x / y));
break;
case 4:// x的y次方
tf1.setText("" + (Math.pow(x, y)));
break;
case 5:// 取模
tf1.setText("" + ((int) x % (int) y));
break;
case 6:
tf1.setText("" + ((int) x & (int) y));
break;
case 7:
tf1.setText("" + ((int) x | (int) y));
break;
case 8:
tf1.setText("" + ((int) x ^ (int) y));
break;
case 9:// 左移
tf1.setText("" + ((int) x << (int) y));
break;
case 10:// 右移
tf1.setText("" + ((int) x >> (int) y));
break;
}
} else if (cmd == bt[1].getActionCommand()
|| cmd == bt[2].getActio

nCommand())// 选择"CE"清零
{
tf1.setText("0");// 把显示屏清零
str.setLength(0);// 清空字符串缓冲区以准备接收新的输入运算数
} else if (cmd == bt[23].getActionCommand())// 单击"+/-"选择输入的运算数是正数还是负数
{
x = Double.parseDouble(tf1.getText().trim());
tf1.setText("" + (-x));
} else if (cmd == bt[27].getActionCommand()) {// PI
x = Math.PI;
tf1.setText("" + x);
} else if (cmd == bt[33].getActionCommand()) {// E
x = Math.E;
tf1.setText("" + x);
} else if (cmd == bt[24].getActionCommand())// 单击"."按钮输入小数
{
if (tf1.getText().trim().indexOf(".") != -1)// 判断字符串中是否已经包含了小数点
{

} else// 如果没数点有小
{
if (tf1.getText().trim().equals("0"))// 如果初时显示为0
{
str.setLength(0);
tf1.setText((str.append("0" + cmd)).toString());
} else if (tf1.getText().trim().equals(""))// 如果初时显示为空则不做任何操作
{
} else {
tf1.setText(str.append(cmd).toString());
}
}
y = 0d;
} else if (cmd == bt[3].getActionCommand())// MC为清除内存
{
m = 0d;
tf2.setText("");
str.setLength(0);
} else if (cmd == bt[4].getActionCommand())// MR为重新调用存储的数据
{
if (tf2.getText().trim() != "")// 有记忆数字
{
tf1.setText("" + m);
}
} else if (cmd == bt[5].getActionCommand())// MS为存储显示的数据
{
m = Double.parseDouble(tf1.getText().trim());
tf2.setText("M");
tf1.setText("0");
str.setLength(0);
} else if (cmd == bt[6].getActionCommand())// M+为将显示的数字与已经存储的数据相加要查看新的数字单击MR
{
m = m + Double.parseDouble(tf1.getText().trim());
} else// 选择的是其他的按钮
{
if (cmd == bt[22].getActionCommand())// 如果选择的是"0"这个数字键
{
if (tf1.getText().trim().equals("0"))// 如果显示屏显示的为零不做操作
{

} else {
tf1.setText(str.append(cmd).toString());
y = Double.parseDouble(tf1.getText().trim());
}
} else if (cmd == bt[0].getActionCommand())// 选择的是“BackSpace”按钮
{
if (!tf1.getText().trim().equals("0"))// 如果显示屏显示的不是零
{
if (str.length() != 1) {
tf1.setText(str.delete(str.length() - 1,
str.length()).toString());// 可能抛出字符串越界异常
} else {
tf1.setText("0");
str.setLength(0);
}
}
y = Double.parseDouble(tf1.getText().trim());
} else// 其他的数字键
{
tf1.setText(str.append(cmd).toString());
y = Double.parseDouble(tf1.getText().trim());
}

}
}
} catch (NumberFormatException e) {
tf1.setText("数字格式异常");
} catch (StringIndexOutOfBoundsException e) {
tf1.setText("字符串索引越界");
}
}

/*
* 菜单事件监听器
* 实现功能: 复制显示屏的运算结果并粘贴到显示屏上,能选择标准型 和科学型计算器设置
* 不同的界面,在关于菜单给出软件及作者信息,并给出 计算器帮助信息
*/
public class mnEvent implements ActionListener {
public void actionPerformed(ActionEvent e1) {
Object obj = e1.getSource();// 获取事件源
if (obj == menu[0]) {
// 复制菜单:获取当前显示屏结果
strTmp = tf1.getText();
} else if (obj == menu[1]) {
// 粘贴菜单:清空显示屏,显示保存的结果
str.setLength(0);
str.append(strTmp);
tf1.setText(strTmp);
} else if (obj == menu[2]) {
// “标准型”菜单,判断是否已选中标准型
if (menu[2].getActionCommand() == " 标准型(T)") {
setBounds(loc().x, loc().y, 315, 330);
// 缩小窗口,隐藏科学计数按钮
menu[2].setText("◆标准型(T)");// 改变菜单选中状态
menu[3].setText(" 科学型(S)");
}
} else if (obj == menu[3]) {
// "科学型“菜单,判断是否已选中科学型
if (menu[3].getActionCommand() == " 科学型(S)") {
setBounds(loc().x, loc().y, 315, 500);
// 扩大窗口,显示科学计数按钮
menu[2].setText(" 标准型(T)");// 重设菜单选中状态
menu[3].setText("◆科学型(S)");
}
} else if (obj == menu[4]) {
// 打开帮助文档
String cmd = "rundll32 url.dll FileProtocolHandler file:ReadMe.txt";
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
} else if (obj == menu[5]) {
// 关于菜单:弹出程序及作者信息
JOptionPane.showOptionDialog(null, "程序名称:\n 计算器\n"
+ "设计者:\n 潘福凯 学号:3107006587\n"
+ " 广东工业大学计算机学院07级计科6班\n\n" + "关于本计算器:\n"
+ " 本计算器可以完成任意的通常借助手持计算器\n"
+ "来完成的标准运算,同时还具有科学计算器的功能。\n"
+ "\n本计算器完全免费,欢迎网友下载研究交流QQ316200364", "关于 计算器",
JOptionPane.DEFAULT_OPTION,
RMATION_MESSAGE, null, null, null);

}
}
}

/*
* 构造按钮事件监听器 调用keyAndButtonAction进行运算处理。
*/
public class btEvent implements ActionListener {
public void actionPerformed(ActionEvent e2) {
keyAndButtonAction(e2.getActionCommand());
}
}

/*
* 构造按键监听器
* 实现功能: 判断用户按键产生相应的数字和操作码

传递给keyAndButtonAction
* 主要思路:
* 构造一数组,记录数字键和加、减、乘、除、小数点、等号 在计算器 按钮bt数组
* 的位置,根据触发的按键值可求出出对应的按钮命令值
*/
public class keyEvent implements KeyListener {

int key[] = { 15, 25, 0, 20, 24, 10, 22, 17, 18, 19, 12, 13, 14, 7, 8,
9, 0, 0, 0, 26 };

public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
char c = e.getKeyChar();
if ((c >= '*' && c <= '9' && c != ',') || c == '=') {
keyAndButtonAction(bt[key[c - 42]].getActionCommand());
} else if (c == '\n') {
keyAndButtonAction("=");
} else if (c == '\b') {
keyAndButtonAction("C");
}
}

public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}

public static void main(String args[]) {
new D();
}
}


相关文档
最新文档