计算器软件概要设计说明书
- 格式:doc
- 大小:1.60 MB
- 文档页数:14
Java程序设计说明书设计题目:Java计算器学生姓名:指导教师:专业名称:计算机科学与技术所在院系:目录摘要2第1章计算器概述1.1设计目的 4 1.2功能模块设计 4 1.3系统功能图 4设计实现的详细步骤2.2.1 计算器界面72.2.2 界面设计代码7 2.3程序运行效果9 第3章设计中遇到的重点及难点 (13)3.1 设计中的重点 (13)3.2 设计中的难点 (13)3.2.1 设计难点1:布局 (13)3.2.2 设计难点2:代码 (13)3.2.3设计难点3:运行结果 (14)3.3 本章总结 (14)第4章本次设计中存在不足与改良方案 (15)4.1设计不足 (15)4.2改良方案 (15)4.3本章总结 (18)结论 (19)参考文献 (20)JAVA课程设计说明书摘要一、计算器概述1、1设计计算器的目的:该计算器是由Java语言编写的,可以进行十进制下的四则运算(加、减、乘、除)、开平方、百分号、求倒数,还可以实现其他按钮的功能。
添加了一个编辑、查看、帮助的主菜单并能实现其功能。
Backspace 表示逐个删除,CE 表示全部清除,C 表示一次运算完成后,单击“C”按钮即可清除当前的运算结果,再次输入时可开始新的运算,MC 表示清除储存数据,MR 表示读取储存的数据,MS 表示将所显示的数存入存储器中,存储器中原有的数据被冲走,M+ 表示计算结果并加上已经储存的数。
界面类似Windows 自带的计算器。
该计算器围绕Java编程语言在编程方面的具体应用,论述了使用面向对象方法,对计算器程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。
在编程使用Java语言,是目前比较流行的编程语言。
在当今这个网络的时代,java语言在网络编程方面的优势使得网络编程有了更好的选择。
Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。
关键词:Java语言、标准、计算器第1章标准计算器概述1.1设计目的1)复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
四则运算计算器设计说明书一、设计目标本次计算器的程序设计,通过使用JAVA中的AWT包和Swing包的类库设计图形界面的计算器。
此计算器能够完成加减乘除的四则混合运算。
利用面向对象程序设计的思想,将各个组件的事件响应分别用不同的方式表达出来,并且使用了图形界面中的事件委托机制来处理事件响应。
二、设计流程1.分析该计算器需要完成的功能。
用户能够完成添加负号的四则混合运算,开方,取倒数,并且计算器能够自动识别运算符的优先级,根据用户输入的运算表达式,自动计算出相应的结果。
同时还完成了计算器中C按钮清屏功能和Backspace退格键。
2. 考虑异常处理。
(1)当输入的表达式中出现除零的操作,显示框将显示“Infinity(无穷大)”。
(2)当输入的表达式错误时,将弹出提示框显示“表达式错误请重新输入”(3)当计算器的显示文本框里为没有输入内容时直接点击等号按钮3. 编码实现计算器的功能。
(1)新建相关的文件。
(2)引入JAVA中相关的包。
(3)定义相关的变量,创建相关组件,并对组件的属性进行设置。
(4)对所创建的组件进行布局,完成界面的实现。
(5)为各个组件添加事件监听器。
(6)重写事件接口ActionListener的方法public voidactionPerformed(ActionEvent e)。
(7)为各个组件编写事件代码,完成每个按钮的不同功能。
三、程序截图四、程序代码import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;public class Calc extends JFrame implements ActionListener { JPanel topPanel = null;JPanel midPanel = null;JPanel bottomPanel = null;JTextField tResult = null;JButton backspaceButton = null;JButton ceButton = null;JButton cButton = null;JButton button1 = null;JButton button2 = null;JButton button3 = null;JButton button4 = null;JButton button5 = null;JButton button6 = null;JButton button7 = null;JButton button8 = null;JButton button9 = null;JButton button0 = null;JButton buttonDiv = null;JButton buttonPlus = null;JButton buttonMinus = null;JButton buttonMul = null;JButton buttonSqrt = null;JButton buttonMod = null;JButton buttonPM = null;JButton buttonX = null;JButton buttonPoint = null;JButton buttonEquals = null;StringBuffer str = new StringBuffer();boolean isDouble = false;// 是否为实数int opFlag = -1;static double t1 = 0, t2 = 0, t3 = 0, result = 0;static int opflag1 = -1, opflag2 = -1, flag = 0, resflag = 1;int preOp, currentOp = 0;// 标准位double op1 = 0, op2 = 0;// 操作数double n3;// 取得屏幕对象Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 取得屏幕的宽度int width = screenSize.width;// 取得屏幕的高度int heigth = screenSize.height;public Calc() {tResult = new JTextField("0.");tResult.setColumns(26);tResult.setHorizontalAlignment(JTextField.RIGHT);topPanel = new JPanel();topPanel.add(tResult);backspaceButton = new JButton("Backspace");backspaceButton.addActionListener(this);ceButton = new JButton("CE");ceButton.addActionListener(this);cButton = new JButton("C");cButton.addActionListener(this);midPanel = new JPanel();midPanel.add(backspaceButton);midPanel.add(ceButton);midPanel.add(cButton);bottomPanel = new JPanel(new GridLayout(4, 5, 3, 3));button7 = new JButton("7");button7.addActionListener(this);bottomPanel.add(button7);button8 = new JButton("8");button8.addActionListener(this);bottomPanel.add(button8);button9 = new JButton("9"); button9.addActionListener(this); bottomPanel.add(button9);buttonDiv = new JButton("/"); buttonDiv.addActionListener(this); bottomPanel.add(buttonDiv);buttonSqrt = new JButton("sqrt"); buttonSqrt.addActionListener(this); bottomPanel.add(buttonSqrt);button4 = new JButton("4"); button4.addActionListener(this); bottomPanel.add(button4);button5 = new JButton("5"); button5.addActionListener(this); bottomPanel.add(button5);button6 = new JButton("6"); button6.addActionListener(this); bottomPanel.add(button6);buttonMul = new JButton("*"); buttonMul.addActionListener(this); bottomPanel.add(buttonMul);buttonMod = new JButton("%"); buttonMod.addActionListener(this); bottomPanel.add(buttonMod);button1 = new JButton("1"); button1.addActionListener(this); bottomPanel.add(button1);button2 = new JButton("2"); button2.addActionListener(this); bottomPanel.add(button2);button3 = new JButton("3"); button3.addActionListener(this); bottomPanel.add(button3);buttonMinus = new JButton("-");buttonMinus.addActionListener(this);bottomPanel.add(buttonMinus);buttonX = new JButton("1/x");buttonX.addActionListener(this);bottomPanel.add(buttonX);button0 = new JButton("0");button0.addActionListener(this);bottomPanel.add(button0);buttonPM = new JButton("+/-");buttonPM.addActionListener(this);bottomPanel.add(buttonPM);buttonPoint = new JButton(".");buttonPoint.addActionListener(this);bottomPanel.add(buttonPoint);buttonPlus = new JButton("+");buttonPlus.addActionListener(this);bottomPanel.add(buttonPlus);buttonEquals = new JButton("=");buttonEquals.addActionListener(this);bottomPanel.add(buttonEquals);this.setLayout(new BorderLayout());this.add(topPanel, "North");this.add(midPanel, "Center");this.add(bottomPanel, "South");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(310, 225);this.setResizable(false);// 设置窗体出现在屏幕的中央this.setLocation((width - this.getWidth()) / 2,(heigth - this.getHeight()) / 2);this.setVisible(true);}/*** @param args*/public static void main(String[] args) {new Calc();}@Overridepublic void actionPerformed(ActionEvent e) {String s = e.getActionCommand().trim();if (s.equals("CE")) {// 如果是CE则清除文本框tResult.setText("0.");} else if (s.equals("Backspace")) {if (!tResult.getText().trim().equals("0.")) {// 如果文本框中有内容if (str.length() != 1 && str.length() != 0) {tResult.setText(str.delete(str.length() - 1, str.length()).toString());} else {tResult.setText("0.");str.setLength(0);}}op2 = Double.parseDouble(tResult.getText().trim());} else if (s.equals("C")) {// 如果是C删除当前计算tResult.setText("0.");op1 = op2 = 0;str.replace(0, str.length(), " ");preOp = currentOp = 0;} else if (s.equals("1/x")) {// 如果按键为1/x则将文本框中的数据为它的倒数String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + 1 / dtemp);} else if (s.equals("sqrt")) {// 如果按键为sqrt则将文本框中的内容求平方根String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + Math.sqrt(dtemp));} else if (s.equals("+")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 1;op2 = 0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 1;switch (currentOp) {case 1:op1 += op2;tResult.setText("" + op1);break;case 2:op1 -= op2;tResult.setText("" + op1);break;case 3:op1 *= op2;tResult.setText("" + op1);break;case 4:op1 /= op2;tResult.setText("" + op1);break;}}} else if (s.equals("-")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 2;// op1=op2;op2=0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 2;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("*"))// *{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 3;// op1=op2;op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 3;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("/"))// /{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 4;// op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 4;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("="))// ={if (currentOp == 0) {str.setLength(0);tResult.setText("" + op2);} else {str.setLength(0);currentOp = preOp;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}currentOp = 0;op2 = 0;}} else if (s.equals(".")) {isDouble = true;if (tResult.getText().trim().indexOf('.') != -1);else {if (tResult.getText().trim().equals("0")) {str.setLength(0);tResult.setText((str.append("0" + s)).toString());}// else// if(tResult.getText().trim().equals("")){}//如果初时显示为空则不做任何操作else {tResult.setText((str.append(s)).toString());}}} else if (s.equals("0"))// 如果选择的是"0"这个数字键{if (tResult.getText().trim().equals("0.")) {} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());}} else if (s.equals("%"))// 如果选择的是"0"这个数字键{} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());if (currentOp == 0)op1 = op2;}}}。
计算器说明书1 设计课题任务、功能要求说明及总体⽅案介绍1.1 设计课题任务课题:简易计算器任务:设计⼀个具有特定功能的计算器。
该计算器上电或按键复位后能⾃动显⽰系统提⽰界⾯,进⼊准备⼯作状态。
能实现基本的加、减、乘、除四则运算。
1.2 功能要求说明在本次⼯程实践中,主要完成如下⽅⾯的设计任务:(1)计算器上电或按键复位后能显⽰初始化界⾯(2)2秒后进⼊计算器界⾯(3)按键能进⾏加、减、乘、除运算并显⽰结果(4)按清零键后能进⾏下⼀次计算1.3 设计课题总体⽅案介绍及⼯作原理说明计算器的总体功能原理是以AT89S52单⽚机为主要控制核⼼,通过外接4*4⾏列式键盘作为控制信号输⼊源,⼀块12864液晶作为显⽰器件,通过按键控制,单⽚机实时地去执⾏,在12864液晶上显⽰界⾯。
系统控制原理图如图1所⽰。
液晶显⽰电路AT89S52电源电路复位电路下载电路键盘电路图1系统控制原理图2 设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍2.1.1 AT89S52控制模块考虑到设计功能需要,控制器的功能⽤于外部键盘信号的接收和识别、液晶模块的显⽰控制、复位电路等,我们选择了AT89S52系列单⽚机,具有反应速度极快,⼯作效率特⾼的特点。
AT89S52是⼀种低功耗、⾼性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使⽤Atmel 公司⾼密度⾮易失性存储器技术制造,与⼯业80C51 产品指令和引脚完全兼容。
⽚上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯⽚上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89S52为众多嵌⼊式控制应⽤系统提供⾼灵活、超有效的解决⽅案。
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O ⼝线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,⼀个6向量2级中断结构,全双⼯串⾏⼝,⽚内晶振及时钟电路。
软件概要设计说明书拟制: Prepared by 日期:Date审核: Reviewed by 日期:Date审核: Reviewed by 日期:Date批准: Granted by 日期:Date计算机学院程序设计基础实践专用所有侵权必究目录1 引言1 1.1 编写目的 1 1.2 背景 1 1.3 术语表 1 1.4 参考资料 12 任务概述2 2.1 目标 2 2.2 需求概述 2 2.3 性能需求 2 2.4 条件和限制 23 总体设计2 3.1 模块结构 2 3.2 功能需求与功能模块关系 3 3.3 设计概念及流程处理 34 接口设计8 4.1 数据结构定义8 4.2 接口函数10 4.3 信号、命令和事件列表115 出错处理设计116 未解决的问题11软件概要设计说明书1 引言1.1 编写目的此概要设计说明书对软件的解决方案、功能分配、模块化分、程序的总体结构、输入输出和接口设计、运行设计及出错设计等方面作了全面的概括性的说明,为该软件的详细设计奠定了基础。
此文档为模块主管、设计人员工作的阶段性总结,并提供软件主设计、设计人员和开发人员参考。
1.2 背景✧该项目基于展讯(Spreadtrum)平台模拟器开发。
✧为派生机型,中低端型号。
✧按键式操作。
✧屏显为128*160。
✧由XXXX设计开发。
1.3 术语表MMI :Man Machine Interface 人机接口ADD :加法。
SUB :减法。
MULTI :乘法。
DIVIDE : 除法。
SUM :求和。
EQUAL : 等于。
1.4 参考资料2 任务概述2.1 目标编写一个程序来实现一个单步运算的算术计算器。
通过数组来存放输入的每一数字或运算符号的记录(包括1、2、3等数字,+、--、*、/ 等运算符号),然后将其信息存入缓冲BUFFER中。
输入一个简单算术计算式,就在屏幕上显示结果。
2.2 需求概述2.3 性能需求无2.4 条件和限制由于该终端为中低端,且屏显大小为128X160,为输入数据全部显示,所以计算器输入数据一、输入数据二的位数均设计成14位。
基于插件化软件系统的高等数学计算器软件需求说明书目录目录 (1)1引言 (3)1.1编写目的 (3)1.2背景 (3)1.3定义 (3)1.4参考资料 (3)2任务概述 (4)2.1目标 (4)2.2用户的特点 (4)2.3假定和约束 (5)3需求规定 (5)3.1对功能的规定 (5)3.2对性能的规定 (8)3.2.1精度 (8)3.2.2时间特性要求 (9)3.2.3灵活性 (9)3.3维护保障要求 (9)3.4可移植性要求 (10)3.5故障处理要求 (10)3.6其他专门要求 (10)4运行环境规定 (10)4.1设备 (10)4.2支持软件 (10)4.3接口 (10)4.3.1用户接口 (11)4.4控制 (11)1引言1.1编写目的这份软件需求说明书的目的是:定义软件总体要求,作为用户和软件开发人员之间相互了解的基础;提供性能要求、初步设计和对用户影响的信息,作为软件人员进行软件结构设计和编码的基础;作为软件总体测试的依据。
这份软件需求说明书的预期读者,是系统分析员,用户,软件开发人员等。
1.2背景说明:a.软件系统的名称:基于插件化软件系统的高等数学计算器;b.本项目任务提出者是导师龚俊教授,开发者是刘晓霞和吕胜,用户是学习高等数学的人以及者需要频繁使用高等数学计算的研究人员。
c.该软件系统是基于插件化软件系统开发的,易于维护和功能扩展;该软件也使用了MATLAB的函数库,实现数学计算。
1.3定义列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
表1-1定义列表1.4参考资料2任务概述2.1目标a.开发目的:1、帮助高等数学学习者更好的理解和学习高等数学的相关计算2、方便相关业务人员进行高等数学的计算,提高业务处理能力。
3、帮助相关的数学研究人员通过大量的计算,进行相关的学术研究。
b.应用目标:数学领域c.使用范围:学生,老师,业务人员,研究人员。
d.背景资料:该软件是基于插件化软件系统开发设计的,易于维护和功能扩展;该软件也使用了MATLAB的函数库,实现数学计算。
项目软件概要设计说明书(该文档仅供内部参考)负责单位:研发部门名称协作单位:协作单位名称(如有)作者:研发人员签名批准:研发部门主任签名修改及签收情况记录:**********股份有限公司摘要描述文档的主要内容。
修改历史本模板在格式上有以下的一系列约定:a)用“< >”括起来的内容,是编写指导,在最终的文档中应予以删除。
其它内容应予以保留。
b)如果某章节内容无需填写,而且本模板没有特殊说明的话,则在该章节下写“无”,而不要将该节删除或不填写任何内容。
目录第一篇概述..................................................错误!未定义书签。
1范围...................................................... 错误!未定义书签。
2设计依据.................................................. 错误!未定义书签。
3术语、定义和缩略语 ........................................ 错误!未定义书签。
术语、定义............................................ 错误!未定义书签。
缩略语................................................ 错误!未定义书签。
第二篇系统总体设计..........................................错误!未定义书签。
4系统体系结构.............................................. 错误!未定义书签。
5体系结构概述.............................................. 错误!未定义书签。
6标准化设计................................................ 错误!未定义书签。
卡西欧计算器程序传播软件FA-124用法本日记详细简介将G2M文献导入到计算器操作办法。
第一步:准备工作这里说准备工作,是指:1.将相应软件安装到电脑上;2.准备好连接电缆。
先讲FA-124软件安装。
9750和9860计算器均附带了光盘:光盘文献目录如下,其中FA-124软件就在文献夹“FA-124”中:安装过程不细表,安装完毕后,桌面会生成一种该软件快捷方式图标:双击该图标,进入FA-124软件,程序界面如下:界面重要有两个窗口,左边是计算器窗口,右边是电脑本地窗口。
至此,FA-124软件安装完毕。
再来说计算器与电脑连接电缆,这根电缆9860计算器有配备,而9750计算器则没有。
没有也没关于系,由于电缆很普通,就是咱们惯用USB电缆,插入电脑那一端是大口,插入计算器那一端是小口。
第二步:将G2M文献导入FA-124软件环节如下:1.将收到RDWORK.G2M文献复制到本地电脑适当位置(例如桌面上)2.在右侧窗口,选中“FA-124”,按右键,点击“Add New Image”,新建一种新镜像(Image),这里,一种镜像相称于一台计算器内存(含程序、矩阵、串列、变量等各种定义)3.弹出对话框规定输入新镜像名称,这里键入“RDWORK”确认后,右侧窗口如下4.选取“RDWORK”镜像,按鼠标右键,点击“Import”,表达需要导入G1M或G2M文献5.在弹出窗口,选取需要导入G1M或G2M文献,这里选取桌面RDWORK.G2M文献6.弹出窗口,规定顾客确认与否替代原有文献?点击“Yes to all”,所有替代7.导入完毕,右侧窗口RDWORK镜像显示其所有内容展开Program(程序),可以看到RDWORK下所有程序双击某个程序名,可以阅读和编辑程序代码,下图是RDSET程序代码至此,G2M文献导入到FA-124软件就完毕了。
第三步:将FA-124软件中RDWORK程序传播到计算器1.电脑端打开FA-124软件,计算器端开机,运用USB电缆将计算器连接到电脑。
计算器说明文档1、程序设计(1).图形布局(2).函数调用2、功能介绍注意:开始启动时要先按清零键“C”如:按键“C”后:(1).”+、-、*、÷”运算做加法运算(输入1+2):按“=”结果为:(2).进制转换二进制转换十进制:点二进制按钮(此时只有0、1可按):输入二进制数:选中十进制按钮,结果为:(3).三角函数和log运算注意:先输入度数后,直接按三角函数或log按钮出结果,log是以10为底的作sin运算(输入90)结果为:(4).倒数“/”,百分号“%”,根号“√”运算注意:同样先输入数字后,直接按相应的键出结果:作根号运算(输入4)结果为:(5)按关闭按钮退出源代码:1、Calculator类package .qtech;import java.awt.*;import java.awt.event.*;import java.util.Stack;import javax.swing.Box;import javax.swing.ButtonGroup;import javax.swing.JFrame;import javax.swing.JRadioButton;import javax.swing.JTextField;public class Calculator extends WindowAdapter implements ActionListener {//监听接口private Button btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10,btn11,btn12,btn13,btn14,bt n15,btn16,btn17,btn18,btn19,btn20,btn21,btn22,btn23,btn24,btn_del;JRadioButton rButton1,rButton2,rButton3;TextField tf;Panel p,p2;int M=0,N=0;String number=null;boolean isFirst=true;boolean i= false;//判断是否第一次输入,第一次为truepublic static void main(String args[]){Calculator c = new Calculator();c.jisuan();}public void jisuan(){Frame f = new Frame("Edison的计算器");//构造Frame类对象,并设定窗口标题f.setVisible(true);//设置框架为可见f.setBounds(100,100,250,250);//设置框架大小和位置//f.setDefaultCloseOperation(EXIT_ON_CLOSE);f.setBackground(Color.pink);//设置背景色f.setForeground(Color.red);//设置前景色f.setFont(new Font("Serief",Font.BOLD,18));//字体设置p=new Panel();//创建面板ButtonGroup butgroup=new ButtonGroup();Box box,baseBox;//创建盒式容器及支撑box=Box.createV erticalBox();//创建列式盒式容器baseBox=Box.createHorizontalBox();//创建行式盒式容器p.setLayout(new GridLayout(4,6,2,2));//设置按钮的行数列数,以及水平垂直间距tf=new TextField(20);//实例化按钮//String[]button={"log","7","8","9","+","-","tan","4","5","6","*","/","cos","1","2"," 3",".","=","sin","(","0",")","C","%"};tf.setText("启动请先按清零键:C");btn1= new Button("log");btn2= new Button("7");btn3= new Button("8");btn4= new Button("9");btn5= new Button("+");btn6= new Button("-");btn7= new Button("tan");btn8= new Button("4");btn9= new Button("5");btn10= new Button("6");btn11= new Button("*");btn12= new Button("/");btn13= new Button("cos");btn14= new Button("1");btn15= new Button("2");btn16= new Button("3");btn17= new Button(".");btn18= new Button("=");btn19= new Button("sin");btn20= new Button("(");btn21= new Button("0");btn22= new Button(")");btn23= new Button("√");btn24= new Button("%");btn_del=new Button("C");//单选按钮rButton1=new JRadioButton("二进制");rButton2=new JRadioButton("十进制");rButton3=new JRadioButton("八进制");//设置按钮btn1.setBackground(Color.BLACK);btn1.setForeground(Color.WHITE);btn7.setBackground(Color.BLACK);btn7.setForeground(Color.WHITE);btn6.setBackground(Color.BLACK);btn6.setForeground(Color.WHITE);btn12.setBackground(Color.BLACK);btn12.setForeground(Color.WHITE);btn13.setBackground(Color.BLACK);btn13.setForeground(Color.WHITE);btn18.setBackground(Color.BLACK);btn18.setForeground(Color.WHITE);btn19.setBackground(Color.BLACK);btn19.setForeground(Color.WHITE);btn20.setBackground(Color.BLACK);btn20.setForeground(Color.WHITE);btn24.setBackground(Color.BLACK);btn24.setForeground(Color.WHITE);btn22.setBackground(Color.BLACK);btn22.setForeground(Color.WHITE);btn23.setBackground(Color.BLACK);btn23.setForeground(Color.WHITE);btn5.setBackground(Color.BLACK);btn5.setForeground(Color.white);btn11.setBackground(Color.BLACK);btn11.setForeground(Color.white);btn17.setBackground(Color.BLACK);btn17.setForeground(Color.white);rButton1.setBackground(Color.BLACK); rButton1.setForeground(Color.white);rButton2.setBackground(Color.BLACK); rButton2.setForeground(Color.white);rButton3.setBackground(Color.BLACK); rButton3.setForeground(Color.white);// btn_del.setBounds(70, 10, 10, 10);btn_del.setBackground(Color.yellow);//归组butgroup.add(rButton1);butgroup.add(rButton2);butgroup.add(rButton3);box.add(baseBox);box.add(p);f.add(tf,"North");//把文本区添加到框架的北方f.add(box,"Center");//把面板添加到框架的中间//把按钮添加到面板上p.add(btn1);p.add(btn2);p.add(btn3);p.add(btn4);p.add(btn5);p.add(btn6);p.add(btn7);p.add(btn8);p.add(btn9);p.add(btn10);p.add(btn11);p.add(btn12);p.add(btn13);p.add(btn14);p.add(btn15);p.add(btn16);p.add(btn17);p.add(btn18);p.add(btn19);p.add(btn20);p.add(btn21);p.add(btn22);p.add(btn23);p.add(btn24);baseBox.add(rButton1);baseBox.add(Box.createHorizontalStrut(5)); baseBox.add(rButton2);baseBox.add(Box.createHorizontalStrut(5)); baseBox.add(rButton3);baseBox.add(Box.createHorizontalStrut(5)); baseBox.add(btn_del);f.addWindowListener(this);//为框架添加监听//为按钮添加监听btn1.addActionListener(this);btn2.addActionListener(this);btn3.addActionListener(this);btn4.addActionListener(this);btn5.addActionListener(this);btn6.addActionListener(this);btn7.addActionListener(this);btn8.addActionListener(this);btn9.addActionListener(this);btn10.addActionListener(this);btn11.addActionListener(this);btn12.addActionListener(this);btn13.addActionListener(this);btn14.addActionListener(this);btn15.addActionListener(this);btn16.addActionListener(this);btn17.addActionListener(this);btn18.addActionListener(this);btn19.addActionListener(this);btn20.addActionListener(this);btn21.addActionListener(this);btn22.addActionListener(this);btn23.addActionListener(this);btn24.addActionListener(this);btn_del.addActionListener(this);rButton1.addActionListener(this);rButton2.addActionListener(this);rButton3.addActionListener(this);}//监听程序public void actionPerformed(ActionEvent e){ jinzhiChange M2N=new jinzhiChange();if(e.getSource()==btn4){if(i==true){tf.setText("9");i=false;}else tf.setText(tf.getText()+'9');}if(e.getSource()==btn24){if(i==true){tf.setText("%");i=false;}else tf.setText(tf.getText()+'%');}if(e.getSource()==btn3){if(i==true){tf.setText("8");i=false;}else tf.setText(tf.getText()+'8');}if(e.getSource()==btn2){if(i==true){tf.setText("7");i=false;}else tf.setText(tf.getText()+'7'); }if(e.getSource()==btn10){if(i==true){tf.setText("6");i=false;}else tf.setText(tf.getText()+'6'); }if(e.getSource()==btn9){if(i==true){tf.setText("5");i=false;}else tf.setText(tf.getText()+'5'); }if(e.getSource()==btn8){if(i==true){tf.setText("4");i=false;}else tf.setText(tf.getText()+'4'); }if(e.getSource()==btn16){if(i==true){tf.setText("3");i=false;}else tf.setText(tf.getText()+'3'); }if(e.getSource()==btn15){if(i==true){tf.setText("2");i=false;}else tf.setText(tf.getText()+'2'); }if(e.getSource()==btn14){if(i==true){tf.setText("1");i=false;}else tf.setText(tf.getText()+'1');if(e.getSource()==btn21){if(i==true){tf.setText("0");i=false;}else tf.setText(tf.getText()+'0');}if(e.getSource()==btn20){if(i==true){tf.setText("(");i=false;}else tf.setText(tf.getText()+'(');}if(e.getSource()==btn22){if(i==false){tf.setText(tf.getText()+')');}}if(e.getSource()==btn17){if(i==false){tf.setText(tf.getText()+'.');}}if(e.getSource()==btn5){tf.setText(tf.getText()+'+');i=false;}if(e.getSource()==btn6){tf.setText(tf.getText()+'-');i=false;}if(e.getSource()==btn11){tf.setText(tf.getText()+'*');i=false;}if(e.getSource()==btn12){tf.setText(tf.getText()+'/');i=false;if(e.getSource()== btn18){tf.setText(String.valueOf(Calculator (tf.getText())));i=true;}if(e.getSource()==btn_del){tf.setText("0");i=true;}if(e.getSource()==btn23){if(Double.parseDouble(tf.getText())<=0){tf.setText("无效输入");}else{tf.setText(String.valueOf(Math.sqrt(Double.parseDouble(tf.getText()))));}}if(e.getSource()==btn1){tf.setText(String.valueOf(Math.log10(Double.parseDouble(tf.getText()))));}if(e.getSource()==btn7){if(Double.parseDouble(tf.getText())%90==0){if((Double.parseDouble(tf.getText())/90)%2!=0)tf.setText("无效输入");elsetf.setText("0");}else{tf.setText(String.valueOf(Math.tan(Double.parseDouble(tf.getText())/180.0* Math.PI)));}}if(e.getSource()==btn13){if(Double.parseDouble(tf.getText())%90==0&&(Double.parseDouble(tf.getT ext())/90)%2!=0){tf.setText("0");}else{tf.setText(String.valueOf(Math.cos(Double.parseDouble(tf.getText())/180.0* Math.PI)));}}if(e.getSource()==btn19){if(Double.parseDouble(tf.getText())%90==0&&(Double.parseDouble(tf.getT ext())/90)%2==0){tf.setText("0");}else{tf.setText(String.valueOf(Math.sin(Double.parseDouble(tf.getText())/180.0* Math.PI)));}}if(e.getSource()==rButton1){if(isFirst){if(tf.getText()!=""){N=2;number=tf.getText();tf.setText(putor(M, N, number));isFirst=false;}btn2.setEnabled(false);btn3.setEnabled(false);btn4.setEnabled(false);btn8.setEnabled(false);btn9.setEnabled(false);btn10.setEnabled(false);btn15.setEnabled(false);btn16.setEnabled(false);M=2;isFirst=false;}else{N=2;number=tf.getText();tf.setText(putor(M, N, number));isFirst=true;}}if(e.getSource()==rButton2){btn2.setEnabled(true);btn3.setEnabled(true);btn4.setEnabled(true);btn8.setEnabled(true);btn9.setEnabled(true);btn10.setEnabled(true);btn15.setEnabled(true);btn16.setEnabled(true);if(isFirst){if(tf.getText()!=""){N=10;number=tf.getText();tf.setText(putor(M, N, number));isFirst=false;}M=10;isFirst=false;}else{N=10;number=tf.getText();tf.setText(putor(M, N, number));isFirst=true;}}if(e.getSource()==rButton3){btn8.setEnabled(true);btn9.setEnabled(true);btn10.setEnabled(true);btn15.setEnabled(true);btn16.setEnabled(true);if(isFirst){if(tf.getText()!=""){N=8;number=tf.getText();tf.setText(putor(M, N, number));isFirst=false;}btn3.setEnabled(false);btn4.setEnabled(false);M=8;isFirst=false;}else{N=8;number=tf.getText();tf.setText(putor(M, N, number));isFirst=true;}}}public double Calculator(String f){//科学计算@SuppressW arnings("unused")int i=0,j=0,k;//定义三个整形变量char c;//定义c为字符型变量StringBuffer s= new StringBuffer();//创建一个字符缓冲池实例ss.append(f);//在对象s中显示字符串fs.append('=');String formula=s.toString();char[]anArray;//声明一个数组anArray=new char[50];Stack<Character>mystack=new Stack<Character>();//定义一个mystack 栈while(formula.charAt(i)!='='){c=formula.charAt(i);switch(c){case '(' :mystack.push(new Character(c));//将获得的数据压入栈i++;break;case ')'://若是右括号则进行下面的操作while(mystack.peek().charValue()!='('){anArray[j++]=mystack.pop().charValue();}mystack.pop();//将数据从mystack栈中弹出i++;break;case '%':while(!mystack.empty()&&mystack.peek().charValue()!='('){anArray[j++]=mystack.pop().charValue();}mystack.push(new Character(c));i++;break;case '+':case '-':while(!mystack.empty()&&mystack.peek().charValue()!='('){anArray[j++]=mystack.pop().charValue();}mystack.push(new Character(c));i++;break;case '*':case '/':while(!mystack.empty()&&(mystack.peek().charValue()=='*'||mystack.peek( ).charValue()=='/')){anArray[j++]=mystack.pop().charValue();}mystack.push(new Character(c));i++;break;case ' ':i++;break;default: while((c>='0'&&c<='9')||c=='.'){anArray[j++]=c;i++;c=formula.charAt(i);}anArray[j++]='#';break;}}while(!mystack.empty()){anArray[j++]=mystack.pop().charValue();}i=0;int count;double a,b,d;Stack<Double>mystack1=new Stack<Double>();//定义栈mystack1while(i<j){c=anArray[i];//将数组中的值赋值给cswitch(c){case '%':a=mystack1.pop().doubleValue();//从栈中弹出//b=mystack1.pop().doubleValue();//从栈中弹出d=a*0.01;mystack1.push(new Double (d));//将结果压入栈i++;break;case '+':a=mystack1.pop().doubleValue();//从栈中弹出b=mystack1.pop().doubleValue();//从栈中弹出d=b+a;//实现加法mystack1.push(new Double (d));//将结果压入栈i++;break;case '-':a=mystack1.pop().doubleValue();b=mystack1.pop().doubleValue();d=b-a;mystack1.push(new Double (d));i++;break;case '*':a=mystack1.pop().doubleValue();b=mystack1.pop().doubleValue();d=b*a;mystack1.push(new Double (d));i++;break;case '/':a=mystack1.pop().doubleValue();b=mystack1.pop().doubleValue();if(a!=0){d=b/a;mystack1.push(new Double(d));i++;}else{tf.setText("除数不能为零!");}break;default:d=0;count=0;while((c>='0'&&c<='9')){d=10*d+c-'0';i++;c=anArray[i];}if(c=='.'){i++;c=anArray[i];while((c>='0'&&c<='9')){count++;d=d+(c-'0')/Math.pow(10,count);i++;c=anArray[i];}}if(c=='#'){mystack1.push(new Double(d));i++;break;}}}return(mystack1.peek().doubleValue());//返回栈顶元素}public void windowClosing(WindowEvent e){//关闭窗口功能System.exit(0);//系统退出}}2、jinzhiChange类package .qtech;/*** 功能:将一个数从M进制转换成N进制* MValue:M进制数的字符串表示方法* Shang:保存中间运算结果* M:M进制* N:N进制*/public class jinzhiChange{public static String Shang = null;public static String computor(int M,int N,String MValue) { String nValue = "";Shang = MValue;while(Shang.length() > 0) {nValue = qiuyu(Shang,M,N) + nValue;}System.out.println(nValue);return nValue;}/*** 功能:对给定的M进制字符串对n求余。
设计题目:单片机数字计算器硬软件设计摘要本设计是基于51系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除3位无符号数字的简单四则运算,并在LED上相应的显示结果。
设计过程在硬件与软件方面进行同步设计。
硬件方面从功能考虑,首先选择内部存储资源丰富的AT89C51单片机,输入采用4×4矩阵键盘。
显示采用5位7段共阴极LED静态显示。
软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。
编程语言方面从程序总体设计以及高效性和功能性对C语言和汇编语言进行比较分析,针对计算器四则运算算法特别是乘法和除法运算的实现,最终选用全球编译效率最高的KEIL公司的μVision3软件,采用汇编语言进行编程,并用proteus仿真。
引言简易计算器的原理与设计是单片机课程设计课题中的一个。
在完成理论学习和必要的实验后,我们掌握了单片机的基本原理以及编程和各种基本功能的应用,但对单片机的硬件实际应用设计和单片机完整的用户程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。
单片机课程设计既要让学生巩固课本学到的理论,还要让学生学习单片机硬件电路设计和用户程序设计,使所学的知识更深一层的理解,数字计算器原理与硬软件的课程设计主要是通过学生独立设计方案并自己动手用计算机电路设计软件,编写和调试,最后仿真用户程序,来加深对单片机的认识,充分发挥学生的个人创新能力,并提高学生对单片机的兴趣,同时学习查阅资料、参考资料的方法。
关键词:单片机计算器 AT89c51芯片 74LS164目录摘要 (01)引言 (01)第一章设计任务和要求 (03)1.1 设计要求1.2 设计方案的确定第二章单片机简要原理 (03)2.1 AT89c51介绍2.2 芯片74LS164介绍第三章硬件设计 (08)3.1 键盘电路的设计3.2 显示电路的设计3.3 其他电路设计第四章软件设计 (11)4.1 主程序的设计4.2 显示、读键模块的设计4.3 其他内容说明4.4 源程序代码第五章调试与仿真 (23)5.1 Keil C51单片机软件开发系统5.2 proteus的操作第六章总结 (24)心得体会 (25)参考文献 (26)第一章设计任务和要求1.1 设计要求本次课程设计,我选择的课题是单片机数字计算器硬软件设计,设计任务为:1.扩展4*4键盘,其中10个数字,5个功能键,1个清零2.使用五位数码管接口电路3.完成十进制的四则运算(加、减、乘、除);4.实现低于三位小于255数字的连续运算;5.使用keil C软件编写程序;6.最后用ptoteus仿真;7.具有较强的抗干扰能力;8.体积小、功耗低,便于嵌入其他系统。
摘要单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心。
如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
计算器的出现给我们的生活带来了巨大的便利,计算器在我们的生活中随处可见,也是我们日常生活中不可缺少的工具。
本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除简单的基本四则运算,并在LCD上显示相应的结果。
设计电路采用AT89C51单片机为主要控制电路,利用按键作为计算器的键盘的输入。
显示采用字符LCD 静态显示。
软件方面使用C语言编程,并用PROTUES仿真。
单片微型计算机简称单片机。
它是在一块芯片上集成中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、定时/计数器及I/O接口电路等部件,构成一个完整的微型计算机。
它的特点是:高性能,高速度,体积小,价格低廉,稳定可靠,应用广泛。
单片机比专用处理器最适合应用于嵌入式系统,因此它得到了最多的应用。
本文介绍了单片机的产生发展、功能特点、应用开发等内容。
【关键词】简单计算器单片机 LCD 应用发展背景近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。
与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。
影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。
其中系统的抗干扰性能是系统可靠性的重要指标。
本设计采用80c51 芯片,实现了利用单片机进行了一个简单计算器设计。
允许对输入数据进行加减乘除运算及LCD 显示.如果设计对象是更为复杂的计算器系统,其实际原理与方法与本设计基本相同。
LCD液晶显示器是Liquid Crystal Display 的简称,LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。
软件概要设计说明书
拟制: Prepared by 日期:Date
审核: Reviewed by 日期:Date
审核: Reviewed by 日期:Date
批准: Granted by
日期:
Date
计算机学院程序设计基础实践专用版权所有侵权必究
目录
1 引言1 1.1 编写目的 1 1.
2 背景 1 1.
3 术语表 1 1.
4 参考资料 1
2 任务概述2 2.1 目标 2 2.2 需求概述 2 2.
3 性能需求 2 2.
4 条件和限制 2
3 总体设计2 3.1 模块结构 2 3.2 功能需求与功能模块关系 3 3.3 设计概念及流程处理 3
4 接口设计8 4.1 数据结构定义8 4.2 接口函数9 4.3 信号、命令和事件列表11
5 出错处理设计11
6 未解决的问题11
软件概要设计说明书
1 引言
1.1 编写目的
此概要设计说明书对软件的解决方案、功能分配、模块化分、程序的总体结构、输入输出和接口设计、运行设计及出错设计等方面作了全面的概括性的说明,为该软件的详细设计奠定了基础。
此文档为模块主管、设计人员工作的阶段性总结,并提供软件主设计、设计人员和开发人员参考。
1.2 背景
✧该项目基于展讯(Spreadtrum)平台模拟器开发。
✧为派生机型,中低端型号。
✧按键式操作。
✧屏显为128*160。
✧由XXXX设计开发。
1.3 术语表
MMI :Man Machine Interface 人机接口
ADD :加法。
SUB :减法。
MULTI :乘法。
DIVIDE : 除法。
SUM :求和。
EQUAL : 等于。
1.4 参考资料
2 任务概述
2.1 目标
编写一个程序来实现一个单步运算的算术计算器。
通过数组来存放输入的每一数字或运算符号的记录(包括1、2、3等数字,+、--、*、/ 等运算符号),然后将其信息存入缓冲BUFFER中。
输入一个简单算术计算式,就在屏幕上显示结果。
2.2 需求概述
2.3 性能需求
无
2.4 条件和限制
由于该终端为中低端,且屏显大小为128X160,为输入数据全部显示,所以计算器输入数据一、输入数据二的位数均设计成14位。
3 总体设计
3.1 模块结构
可使用结构图来描述各模块之间的控制与被控制关系。
3.2 功能需求与功能模块关系
无
3.3 设计概念及流程处理
说明本系统的基本设计概念和处理流程,尽量使用图表的形式。
3.3.1 技术简介
无
3.3.2 算法描述
执行基本的加减乘除基本运算。
3.3.3 流程分析
使用流程图、顺序图或状态图对此模块和其他模块之间,或者模块中各子模块间的交互关系进行详细说明
1、数据输入处理模块
2、数据显示模块
4 、接口设计
4.1 数据结构定义
【描述】此为计算器输入操作过程中所处状态的枚举类型。
【数据项】CALC_OP1 //输入数据一和运算操作符 CALC_OP2 //输入数据二中的其它数据
CALC_RESULT
【数据项】CALC_NO_ERROR, 运算正确 CALC_DEVIDED_BY_ZERO, 除0操作
CALC_OVERFLOW, 数据溢出
CALC_IMAGINARY 结果为虚数
【描述】此为计算器计算操作所用缓冲器。
【数据项】s_op_buf[0] 运算符
s_op_buf[1] 运算数据一和计算结果
s_op_buf[2] 运算数据二
【描述】键盘按键键值映射。
【数据项】
'1', //MSG_KEYDOWN_1,
'2', //MSG_KEYDOWN_2 ,
'3', //MSG_KEYDOWN_3 ,
'4', //MSG_KEYDOWN_4 ,
'5', //MSG_KEYDOWN_5 ,
'6', //MSG_KEYDOWN_6 ,
'7', //MSG_KEYDOWN_7 ,
'8', //MSG_KEYDOWN_8 ,
'9', //MSG_KEYDOWN_9 ,
'.', //MSG_KEYDOWN_START,
'0', //MSG_KEYDOWN_0,
'#', //MSG_KEYDOWN_HASH
4.2 接口函数
列出其他模块要调用的以及此模块中各个子模块之间有交互的所有接口函数
【功能】在一个给定的字符串中查找一个给定的字符
【参数】i1_text_ptr:给定的一个字符串。
i2_char :给定的一个字符
【返回值】如果找到,返回该字符的地址,否则返回NULL.
【备注】无
【功能】运算出错信息提示处理
【参数】math_error:错误类型。
【返回值】无
【备注】无
【功能】运算结果处理、显示
【参数】t1_dResult:计算结果。
math_error:错误类型
【返回值】返回错误类型
【备注】无
【功能】对输入的数据按照四则运算法则进行运算
【参数】无。
【返回值】运算错误类型
【备注】无
【功能】计算器的按键操作,形成计算器的输入数据一、输入数据二、以及操作符。
【参数】msg_id:消息ID,包含数字键、*、#以及四个方向键和确认键。
【返回值】该键值被处理,则返回TRUE,否则返回FALSE
【备注】无
【功能】计算器界面显示函数
【参数】无。
【返回值】无
【备注】无
【功能】计算器窗口界面主处理函数,主要处理窗口开启、刷新、关闭、以及其它按键操作处理。
【参数】win_id:窗口ID。
msg_id:消息ID。
param:开启窗口附加的参数。
【返回值】无
【备注】无
4.3 信号、命令和事件列表
无。
5 出错处理设计
错误信息提示,主要包含除0操作提示,以及数据溢出的信息提示。
由于数据长度有限,所以对数据操作要进行某些限制操作
6 未解决的问题
列出所有未解决的问题,并给出解决措施。
对多组数据的输入,并进行混合运算(按乘除优先、加减次之)。