JAVA程序设计课程作业 - 标准计算器的实现报告

更新时间:2024-06-11 15:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

JAVA程序设计课程作业

——关于计算器的设计说明

电信06XX班 王XX 012006012XXX 郭XX 012006012XXX 陈 X 012006012XXX 一 实验目的

1、通过编写计算器程序,以达到熟悉和掌握JAVA的目的。 2、在编程的过程中,提升自己的能力。

3、能够有效的增强团队合作的能力。

二 实验内容

1、编写一个计算器,应该有如图类似的图形用户界面。

2、能够实现普通的加减乘除运算。

3、可以适当的增加一些科学计算器的功能。

三.程序设计及源码实现:

程序设计结构:

copyItem

editItem

pasteItem

tItem

mainMenu viewMenu sItem

(NORTH)

numberGroup

topHelp

helpMenu

aboutHelp

Panel textAnswer (CENTER)

textMemory labelMenSpace Panel2 buttonN

(NORTH) buttonBk

button Ce

button C

Panel1 (SOUTH)

button MC 7 8 9 Div Sqrt

button MR 4 5 6 * %

Panel3 button MS 1 2 3 - Dao

(CENTER)

button M+ 0 +/- Dot + +

Calculator面板 数字按钮触发事件 加减乘除按钮触发事件 = 输出结果事件 Sqr,%,+/-,CE,C,Backspace 按钮触发MR,MC,MS,M+按钮触发的事件 源码如下:

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

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

import java.text.DecimalFormat;

public class Calculator implements ActionListener //导入动作监听接口 {

//设计面板中的组件 JFrame frame;

JTextField textAnswer;

JPanel panel, panel1, panel2, panel3; JMenuBar mainMenu; JTextField textMemory;

JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状 JButton buttonBk, buttonCe, buttonC; JButton button[];

JButton buttonMC, buttonMR, buttonMS, buttonMAdd;

JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod ,buttonN;

JButton buttonSqrt, buttonDao, buttonEqual; JMenu editMenu, viewMenu, helpMenu;

JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal; DecimalFormat df; //设置数据输出精度 boolean clickable; //控制当前能否按键 double memoryd; //使用内存中存储的数字 int memoryi;

double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算

String copy; //做复制用 JTextArea help; //帮助 JScrollPane scrollHelp; //构造函数

public Calculator() {

clickable = true; answerd = 0;

frame = new JFrame(\计算器\

df = new DecimalFormat(\设置数据输出精度(对于double型值) textAnswer = new JTextField(15); textAnswer.setText(\

textAnswer.setHorizontalAlignment(JTextField.RIGHT); //文本右对齐 textAnswer.setEditable(false); //设置为不可编辑

textAnswer.setBackground(new Color(255, 255,255));//白底色

panel = new JPanel();

frame.setContentPane(panel); // panel1 = new JPanel(); panel2 = new JPanel();

panel.setLayout(new BorderLayout()); //设计整个面板

mainMenu = new JMenuBar();

editMenu = new JMenu(\编辑(E)\ viewMenu = new JMenu(\查看(V)\ helpMenu = new JMenu(\帮助(H)\

copyItem = new JMenuItem(\复制(C) Ctrl+C\

copyItem.addActionListener(this); //增加动作事件监听 pasteItem = new JMenuItem(\粘贴(V) Ctrl+V\

pasteItem.addActionListener(this); //增加动作事件监听 editMenu.add(copyItem); editMenu.add(pasteItem);

tItem = new JMenuItem(\●标准型(T)\

tItem.addActionListener(this); //增加动作事件监听

sItem = new JMenuItem(\科学型(S)\

sItem.addActionListener(this); //增加动作事件监听 numberGroup = new JMenuItem(\数字分组(I)\

numberGroup.addActionListener(this); //增加动作事件监听 viewMenu.add(tItem); viewMenu.add(sItem);

viewMenu.add(numberGroup);

topHelp = new JMenuItem(\帮助主题(H)\

topHelp.addActionListener(this); //增加动作事件监听 help = new JTextArea(5, 20);

scrollHelp = new JScrollPane(help); help.setEditable(false);

help.append(\执行简单计算\\n\

help.append(\键入计算的第一个数字。\\n\ help.append(\单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。\\n\ help.append(\键入计算的下一个数字。\\n\

help.append(\输入所有剩余的运算符和数字。\\n\ help.append(\单击“=”。\\n\

aboutCal = new JMenuItem(\关于计算器(A)\ aboutCal.addActionListener(this); helpMenu.add(topHelp); helpMenu.add(aboutCal);

mainMenu.add(editMenu); mainMenu.add(viewMenu); mainMenu.add(helpMenu);

panel.add(mainMenu, BorderLayout.NORTH); //利用布局管理器来布局面板,菜单在最上面

panel.add(textAnswer, BorderLayout.CENTER); panel.add(panel1, BorderLayout.SOUTH); panel1.setLayout(new BorderLayout()); textMemory = new JTextField(3); textMemory.setEditable(false);

textMemory.setBackground(new Color(217, 217, 217)); labelMemSpace = new JLabel(\ \ buttonBk = new JButton(\

buttonBk.setForeground(new Color(255, 0, 0)); buttonCe = new JButton(\

buttonCe.setForeground(new Color(255, 0, 0)); buttonC = new JButton(\

buttonC.setForeground(new Color(255, 0, 0)); buttonN = new JButton(\

buttonN.setForeground(new Color(255, 0, 0));

buttonBk.addActionListener(this); //增加动作事件监听

break; default:

answerd = Double.parseDouble(textAnswer.getText()); }

textAnswer.setText(\ prekey = key = 2; }

//为'/'操作时

if (temp == buttonDiv) { switch (prekey) {

case 0:

answerd += Double.parseDouble(textAnswer.getText()); break; case 1:

answerd -= Double.parseDouble(textAnswer.getText()); break; case 2:

answerd *= Double.parseDouble(textAnswer.getText()); break; case 3:

if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText(\除数不能为零\ clickable = false; } else

answerd /= Double.parseDouble(textAnswer.getText()); break; default:

answerd = Double.parseDouble(textAnswer.getText()); }

textAnswer.setText(\ prekey = key = 3; } }

//当输入'='操作时

if (temp == buttonEqual && clickable == true) { //如果连续按'=',则进行连续运算 if (prekey == 5) {

if (key == 0)//最后一次是加法计算,所以连续加 {

answerd += vard;

textAnswer.setText(df.format(answerd));

}

if (key == 1) {

answerd -= vard;

textAnswer.setText(df.format(answerd)); }

if (key == 2) {

answerd *= vard;

textAnswer.setText(df.format(answerd)); }

if (key == 3) {

if (Double.parseDouble(textAnswer.getText()) == 0) {

textAnswer.setText(\除数不能为零\ clickable = false; //禁用键盘 } else {

answerd /= vard;

textAnswer.setText(df.format(answerd)); } } }

else {

vard = Double.parseDouble(textAnswer.getText());//vard为最后一次输入的数 if (key == 0) {

answerd += Double.parseDouble(textAnswer.getText());// 计算结果 textAnswer.setText(df.format(answerd)); //answerd格式化 }

if (key == 1) {

answerd -= Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); }

if (key == 2) {

answerd *= Double.parseDouble(textAnswer.getText());

textAnswer.setText(df.format(answerd)); }

if (key == 3) {

if (Double.parseDouble(textAnswer.getText()) == 0) {

textAnswer.setText(\除数不能为零\ clickable = false; } else {

answerd /= Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); } } }

prekey = 5; }

//'%'操作,对第二个操作数除以100即可

if (temp == buttonMod && clickable == true) {

if (answerd == 0)//为零时仍为零 {

String s = textAnswer.getText(); textAnswer.setText(s); } else {

//检查有无小数点 boolean isDot = false;

for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) {

isDot = true; break; }

//如果有‘.‘是double数,除100 if (isDot == true) {

double dtemp = Double.parseDouble(textAnswer.getText()); dtemp = dtemp / 100.0;

textAnswer.setText(Double.toString(dtemp)); } else

{

//如果是int数但能被100整除,则去掉末尾两个零

if (Integer.parseInt(textAnswer.getText()) % 100 == 0) {

int itemp = Integer.parseInt(textAnswer.getText()); itemp /= 100;

textAnswer.setText(Integer.toString(itemp)); }

//如果是int数,但不能被100整除,则按double数处理 else {

double dtemp = Double.parseDouble(textAnswer.getText()); dtemp = dtemp / 100.0;

textAnswer.setText(Double.toString(dtemp)); } } } }

//开根号运算

if (temp == buttonSqrt && clickable == true) {

String s = textAnswer.getText();

if (s.charAt(0) == '-') //判断是否为负数,即第一位为负数 {

textAnswer.setText(\负数不能开根号\ clickable = false; } else

textAnswer.setText(Double.toString(java.lang.Math.sqrt(Double.parseDouble(textAnswer.getText())))); }

//倒数运算

if (temp == buttonDao && clickable == true) {

if (textAnswer.getText().charAt(0) == '0' && textAnswer.getText().length() == 1)//'0'为char类型要一致 {

textAnswer.setText(\零不能求倒数\ clickable = false; } else {

boolean isDec = true;

int i, j, k;

String s = Double.toString(1 / Double.parseDouble(textAnswer.getText())); for (i = 0; i < s.length(); i++) if (s.charAt(i) == '.') break;

for (j = i + 1; j < s.length(); j++) //小数点后有无数字 if (s.charAt(j) != '0') {

isDec = false; break; }

if (isDec == true) {

String stemp = \ for (k = 0; k < i; k++)

stemp += s.charAt(k); //取出整数部分

textAnswer.setText(stemp); //将stemp传给textAnswer } else

textAnswer.setText(s); } }

//按下'+/-'按钮时处理

if (temp == buttonAddAndSub && clickable == true) {

boolean isNumber = true;

String s = textAnswer.getText(); for (int i = 0; i < s.length(); i++)

if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' || s.charAt(i) == '-')) {

isNumber = false; break; }

if (isNumber == true)

{ //如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉

if (s.charAt(0) == '-') {

textAnswer.setText(\

for (int i = 1; i < s.length(); i++)//从符号后一位把s考到textAnswer中 {

char a = s.charAt(i);

textAnswer.setText(textAnswer.getText() + a); }

}

//如果当前字符串第一个字符不是符号,则添加一个符号在首字母处 else

textAnswer.setText('-' + s); } }

//计算器有关内存操作 //'MC'的操作,将内存清0

if (temp == buttonMC && clickable == true) {

memoryd = memoryi = 0; textMemory.setText(\ }

//'MS'的操作,将当前文本框内容保存入内存,显示'M' if (temp == buttonMS && clickable == true) {

boolean isDot = false;

textMemory.setText(\小文本框显示M

for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) {

isDot = true; break; }

//如果是double,则存入memoryd(double存储器) if (isDot == true) {

memoryd = Double.parseDouble(textAnswer.getText()); memoryi = 0; //保证存储器中存放最新的值 }

//如果是int,则存入memoryi(int存储器) else {

memoryi = Integer.parseInt(textAnswer.getText()); memoryd = 0; //保证存储器中存放最新的值 } }

//'MR'的操作,将存储器中的信息输出 if (temp == buttonMR && clickable == true) {

if (memoryd != 0)

textAnswer.setText(Double.toString(memoryd)); if (memoryi != 0)

textAnswer.setText(Integer.toString(memoryi));

}

//'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器 if (temp == buttonMAdd && clickable == true) {

boolean isDot = false;

for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) {

isDot = true; break; }

if (memoryi != 0)

{ //存储中是一个int型数

if (isDot == false) //被加数是一个int型数

memoryi += Integer.parseInt(textAnswer.getText()); else

{//被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int存储器清零

memoryd = memoryi + Double.parseDouble(textAnswer.getText()); memoryi = 0; } } else

memoryd += Double.parseDouble(textAnswer.getText()); }

//按下n!按钮,计算当前阶乘

if (temp == buttonN && clickable == true) { boolean isDot=false; int i,j,k; for (i=0;i

} } if(isDot==true||textAnswer.getText().charAt(0)=='-'){ textAnswer.setText(\负数或小数不能求阶乘!\ clickable=false; } else {

vard = Double.parseDouble(textAnswer.getText()); answerd=1;

for(int counteri=1;counteri<=(int)vard;counteri++) {

answerd *= counteri; }

textAnswer.setText(Integer.toString((int)answerd)); prekey=5; }

} //按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除 if (temp == buttonBk && clickable == true) {

String s = textAnswer.getText(); textAnswer.setText(\

for (int i = 0; i < s.length() - 1; i++)//只要前面s.length() - 1位即最后一位删除 {

char a = s.charAt(i);

textAnswer.setText(textAnswer.getText() + a); } }

//按下'CE'按钮,将当前文本框内数据清除 if (temp == buttonCe) {

textAnswer.setText(\ clickable = true; }

//按下'C'按钮,文本框内数据清除,同时var,answer清0 if (temp == buttonC) {

vard = answerd = 0; textAnswer.setText(\ clickable = true; }

//按下'复制'菜单栏 if (temp == copyItem) {

copy = textAnswer.getText(); }

//按下'粘贴'菜单栏 if (temp == pasteItem) {

textAnswer.setText(copy); }

if (temp == sItem) {

JOptionPane.showMessageDialog(panel, \非常抱歉,当前只能是标准型计算器\ }

//按下'帮助主题'菜单栏 if (temp == topHelp) {

JOptionPane.showMessageDialog(panel, scrollHelp); }

//按下'数字分组'菜单栏 if (temp == numberGroup) {

if (numberGroup.getText().compareTo(\数字分组(I)\ numberGroup.setText(\√数字分组(I)\ else

numberGroup.setText(\数字分组(I)\ }

//按下'关于'菜单栏 if (temp == aboutCal) {

JOptionPane.showMessageDialog(panel, \计算器-开发人员 王韩波 郭朝晖 陈自寅 \ }

}//end of try

//输入中如果有操作非法,捕获异常 catch (Exception e) {

textAnswer.setText(\操作非法\ clickable = false; //键盘禁用 } }

//主函数

public static void main(String args[]) {

Calculator cl = new Calculator(); } }

四 程序运行、调试结果:

1、当运行该程序时,就会弹出下面的对话框:

2、当在对话框中输入数字12时,对话框会如下:

3、可以任意输入运算符,然后输入另一个数字即可。该程序执行该算式:12+34=?

4、输入以上结果后,计算器会显示如下结果:

五 实验中的问题

此次实验虽然仅仅是实现了一个简单的标准计算器,但其中遇到不少问题。尽管道路有点小曲折,可仔细回想一下收获颇丰。以下简要的列出其中几个有代表性的问题:

1) 关于“+,-,*,/”的优先级,参考了Windows XP中的计算机,考虑到其为标准计算

机,所以一律从左往右算;

2)关于String 和 double类型的转换,开始时未意识到这个问题,可是显示时一定要用toString方法转为String型,如 textAnswer.setText(Double.toString(dtemp)),而计算时一定要变为double型,如answerd *= Double.parseDouble(textAnswer.getText());

3) textAnswer.getText().charAt(0) == '0'不能直接用textAnswer.getText()== '0' 一定要转

为char;

六 实验收获:

1) 2) 3) 4)

深入了解java语言,熟悉Swing组件的基本应用; 掌握软件开发的基本流程,为软件课设打好基础; 摒弃眼高手低的坏习惯,看似不复杂的东西,具体实践时总有各种各样的意料之外; 通过讨论分工等协作手段,培养了团队合作能力。

七 实验分工

? 王XX:数字输入、+、-、*、/、=、%、1/x、sqrt、+/-运算实现、程序说明文档

? 郭XX:界面实现、程序说明文档

? 陈XX:菜单栏、MR、MC、M+、MS、CE、C、backspace、n!、运算实现、介绍PPT

五 实验中的问题

此次实验虽然仅仅是实现了一个简单的标准计算器,但其中遇到不少问题。尽管道路有点小曲折,可仔细回想一下收获颇丰。以下简要的列出其中几个有代表性的问题:

1) 关于“+,-,*,/”的优先级,参考了Windows XP中的计算机,考虑到其为标准计算

机,所以一律从左往右算;

2)关于String 和 double类型的转换,开始时未意识到这个问题,可是显示时一定要用toString方法转为String型,如 textAnswer.setText(Double.toString(dtemp)),而计算时一定要变为double型,如answerd *= Double.parseDouble(textAnswer.getText());

3) textAnswer.getText().charAt(0) == '0'不能直接用textAnswer.getText()== '0' 一定要转

为char;

六 实验收获:

1) 2) 3) 4)

深入了解java语言,熟悉Swing组件的基本应用; 掌握软件开发的基本流程,为软件课设打好基础; 摒弃眼高手低的坏习惯,看似不复杂的东西,具体实践时总有各种各样的意料之外; 通过讨论分工等协作手段,培养了团队合作能力。

七 实验分工

? 王XX:数字输入、+、-、*、/、=、%、1/x、sqrt、+/-运算实现、程序说明文档

? 郭XX:界面实现、程序说明文档

? 陈XX:菜单栏、MR、MC、M+、MS、CE、C、backspace、n!、运算实现、介绍PPT

本文来源:https://www.bwwdw.com/article/q4r6.html

Top