JAVA程序设计课程作业 - 标准计算器的实现报告
更新时间:2024-06-11 15:04:01 阅读量: 综合文库 文档下载
- java程序设计课程总结推荐度:
- 相关推荐
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
正在阅读:
JAVA程序设计课程作业 - 标准计算器的实现报告06-11
财务估价的基础概念答案01-27
音标课教程 - 图文04-03
北师大版2018-2019学年山东省枣庄市峄城区七年级(下)期末数学试卷含解析12-02
最高人民法院民商事司法解释溯及力问题研究解析 - 图文04-03
SWOT 分析技巧与国际安全案例分析07-28
高考地理热点试题考前预测5(含解析)12-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 计算器
- 程序设计
- 作业
- 课程
- 实现
- 标准
- 报告
- JAVA
- 2018年易制爆化学品管理制度
- 华东师范大学学前教育考研复试专业课——儿童心理学
- 高二数学2013北师大版选修2-3第二章 概率检测题及答案解析
- “幼儿园未来教育理念”的思考
- 林霞个人简历
- 2018新高考改革背景下如何通过课堂细节成就学生必备品格
- 案例1~7
- 利用Bcdedit工具修改windows7启动菜单
- 石棉纤维制品投资项目可行性报告(投资分析)
- 2012年浙江省第九届大学生财会信息化竞赛(本科组) - 图文
- 半导体物理综合练习题(2)
- 课程练习
- 山东省宁阳第四中学2018届高三高考5月第四次模拟文综地理试题
- 计算机组成原理作业1-10章答案(唐朔飞)
- R0421136 资本充足率对信贷行为的影响 2
- 江苏省清江中学2015-2016学年高二上学期期末考试数学试题
- 比较初等教育
- 新视野大学英语第三版第二册课文Journey through the odyssey ye
- 鬼手一次性解答PUA新手基础问题!
- 评刘颂浩著《对外汉语教学研究》