一段尘封已久的代码,当年的课程设计。《java程序设计》课程设计报告
课题名称:GUI计算器设计
1. 课程设计题目
基于GUI的计算器设计
2. 课程设计目的
1. 巩固和加深课堂所学知识;
2. 将课本上的理论知识和实际应用有机的结合起来,培养同窗们分析和解决实际问题的能力;
3. 经过对java语言程序代码的阅读、修改、设计,理解和掌握复杂的java语言应用程序的编程,提升实践编程能力。
3. 程序运行环境及开发工具
本程序在Windows XP的PC机上利用Jbuilder9.0的软件开发实现,在Windows XP平台上Jbuilder9.0及Eclipse环境中运行经过。
4. 程序功能使用说明
运行该程序后,参与运算的操做数可有鼠标点击相应按钮输入,也可有键盘输入,但操做符应有鼠标点击相应的按钮,当:
1.在简易计算中能够按照常规输入计算,基本无bug,“%”未设置其用途;
2.简易计算中,能够进行+、-、*、/、乘方(^)、开方(√)及阶乘(!)运算;
3.科学计算中有许多功能为实现,主要能进行加、减、乘、除、乘方、开方、幂、开n次方、倒数、阶乘、ln、e的x次幂、三角函数等高级运算;
4.例如:
(1). 1 + 9 = 10
(2). 25 + -8 = 17
(3). 98 - 35 = 63
(4). 96 * 2 = 192
(5). 96 / 4 = 24
(6). 4 ^ 3 = 64
(7). 100 √ = 10
(8). -9 √ = 不能执行此操做!!
(9). 20 ! = 2432902008176640000
(10). -20 ! = 不能执行此操做!!
(11). 0 ! = 1
(12). 8 ln = 2.0794415416798357
(13). 2 Exp = 7.38905609893065
(14). 8 x^y 3 = 512
(15). 20 x^2 = 400
(16). 100 n! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
(17). 30 sin = 0.49999999999999994(0.5) (求sin30度)
其余(cos,tan)依次类推;
(18).1/x计算有bug;
(19). 3 x√ 8 = 2 (求8开3次方);
(20). 95 Mod 10 = 5 (95对10求余)
5. 关键算法与技术:
1.大数阶乘;
2.界面切换;
3.GirdLayout布局管理器的使用;
4.事件响应;
5.匿名内部类的使用;
6.
6. 设计思路:
本程序采用模块化设计,调试方便,程序的可读性好。在老师的指导下,由主程序启动简易计算器,根据使用者的须要能够在简易计算器中进行运算操做,若不能知足用户功能,能够选择使用科学计算器,具体操做与目前市面上的计算器差很少,用户还能够选择使用说明进行查看具体操做。因为时间及我的水平的问题,科学计算中还有不少功能未实现。
具体思路:用户输入(点击)某一数字或操做符,程序将自行判断是操做数仍是操做符,
1. 若为一操做数的首次输入,则将显示区的“0”替换,若该操做数不为首次输入则将显示区的数字串接上这次输入的数字;
2. 若为操做符,将判断是否为带符号操做数,如果则保存符号,反之为纯操做符:若为二元操做符就将显示区的字符串转化为双精度数;若为等号就进行计算结果并显示结果;若为一目操做符就进行相应的一目运算并显示结果;
3. 进行相应的初始化操做,为下一次输入作准备;
4. 根据本身的理解画了下面的简单的流程图。
略
7.编码实现:
//package 计算器;java
package org.csmn.app; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.math.*; import java.util.*; /** * <p>Title: 用户应用界面计算器</p> * <p>Description: 包含简易计算与功能更增强大的科学计算</p> * <p>Copyright: Copyright (c) 2008</p> * <p>Company: </p> * @author 车水码农 * @version 1.0 */ public class Calculat { static JTextField show;//设置输入区,显示区 static double opNum = 0;//存放操做数 static String opChar = "=";//存放操做符 static boolean flag = true;//设置标志 public static void main(String[] args) { new EasyFrame();//产生首界面——简易计算器 } } class EasyFrame { //构建简易计算器框架界面 static JFrame frame; public EasyFrame() { frame = new JFrame("简易计算器"); Toolkit kit = Toolkit.getDefaultToolkit();//设置图标 //下面这条语句很差,不具备可移植性 Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg"); frame.setIconImage(image); frame.addWindowListener(new WindowAdapter() {//响应关闭事件 public void windowClosing(WindowEvent e) { System.exit(0); } }); JMenuBar mb = new JMenuBar();//建立菜单栏 JMenu m1 = new JMenu("编辑");//建立菜单 JMenu m2 = new JMenu("操做"); JMenu m3 = new JMenu("帮助"); JMenuItem mi1c = new JMenuItem("复制", KeyEvent.VK_C);//建立菜单项 JMenuItem mi1v = new JMenuItem("粘贴", KeyEvent.VK_V); JMenuItem mi21 = new JMenuItem("基本计算"); JMenuItem mi22 = new JMenuItem("科学计算"); JMenuItem mi31 = new JMenuItem("使用说明"); JMenuItem mi32 = new JMenuItem("About..."); frame.setJMenuBar(mb);//添加菜单到窗口 mb.add(m1); mb.add(m2); mb.add(m3); m1.add(mi1c); m1.add(mi1v); m2.add(mi21); m2.add(mi22); m3.add(mi31); m3.add(mi32); /*菜单项监听事件 */ mi1c.addActionListener(new MenuItemListener());//监听复制 mi1v.addActionListener(new MenuItemListener());//监听粘贴 mi22.addActionListener(new MenuItemListener()); mi31.addActionListener(new MenuItemListener()); mi32.addActionListener(new MenuItemListener()); Container cp = frame.getContentPane();//获取内容窗格 cp.add(new easyCalPanel());//将简易计算器面板加入到框架中 frame.setSize(280, 250); //frame.pack();//将框架设置合适的大小 frame.setVisible(true);//设置框架可见 } } class AdvanceFrame { //构建高级计算器框架界面 static JFrame frame; public AdvanceFrame() { frame = new JFrame("科学计算器"); Toolkit kit = Toolkit.getDefaultToolkit();//设置图标 Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg"); frame.setIconImage(image); JMenuBar mb = new JMenuBar();//建立菜单栏 JMenu m1 = new JMenu("编辑"); JMenu m2 = new JMenu("操做"); JMenu m3 = new JMenu("帮助"); JMenuItem mi1c = new JMenuItem("复制", KeyEvent.VK_C); JMenuItem mi1v = new JMenuItem("粘贴", KeyEvent.VK_V); JMenuItem mi21 = new JMenuItem("基本计算"); JMenuItem mi22 = new JMenuItem("科学计算"); JMenuItem mi31 = new JMenuItem("使用说明"); JMenuItem mi32 = new JMenuItem("About..."); frame.setJMenuBar(mb);//添加菜单栏 mb.add(m1); mb.add(m2); mb.add(m3);//添加菜单 m1.add(mi1c); m1.add(mi1v); m2.add(mi21); m2.add(mi22); m3.add(mi31); m3.add(mi32); mi1c.addActionListener(new MenuItemListener());//监听复制 mi1v.addActionListener(new MenuItemListener());//监听粘贴 mi21.addActionListener(new MenuItemListener());//监听简易计算 mi31.addActionListener(new MenuItemListener());//监听使用说明 mi32.addActionListener(new MenuItemListener());//监听关于 Container cp = frame.getContentPane();//获取框架的内容窗格 cp.add(new AdvanceCalPanel());//添加高级计算面板 frame.pack();//设置适当的大小 frame.setVisible(true);//可见 frame.addWindowListener(new WindowAdapter() {//响应关闭按钮 public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class MenuItemListener implements ActionListener {//响应菜单事件 public void actionPerformed(ActionEvent e) { if ("基本计算".equals(e.getActionCommand())) { new EasyFrame();//切换到简易计算器窗口 AdvanceFrame.frame.setVisible(false); } else if ("科学计算".equals(e.getActionCommand())) { new AdvanceFrame();//切换到高级计算界面 EasyFrame.frame.setVisible(false); } else if ("复制".equals(e.getActionCommand())) { // } else if ("粘贴".equals(e.getActionCommand())) { // } else if ("使用说明".equals(e.getActionCommand())) { try { FileInputStream fis = new FileInputStream("使用说明.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); JTextArea helpArea = new JTextArea(15, 48); //helpArea.enable(false); helpArea.setEditable(false); helpArea.setDisabledTextColor(Color.black); JScrollPane scroll = new JScrollPane(helpArea); String s; while ((s = br.readLine()) != null) { helpArea.append(s); helpArea.append("\n"); } JOptionPane.showMessageDialog(null, scroll, "帮助主题", JOptionPane.PLAIN_MESSAGE); br.close(); } catch (IOException ex) { ex.printStackTrace(); } //System.exit(0); //若是加上此句,当关掉JOptionPane时就会关掉JFrame; } else if (e.getActionCommand().equals("About...")) { JTextArea aboutArea = new JTextArea(); aboutArea.setText("版权拥有者:车水码农\n开发时间:2008-12-16\n"); JOptionPane.showMessageDialog(null, aboutArea, "关于 计算器", JOptionPane.PLAIN_MESSAGE); } } } class AdvanceCalPanel extends JPanel { //建立高级计算面板 private static final long serialVersionUID = 2696716054985506500L; public AdvanceCalPanel() { setLayout(new BorderLayout());//设置布局方式 Calculat.show = new JTextField("0", 27);//显示文本区 Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 16));//设置字体 Calculat.show.setHorizontalAlignment(JTextField.RIGHT);//设置光标位置 JPanel ps = new JPanel();//建立面板加载显示区文本框 ps.add(Calculat.show); JPanel pbl = new JPanel();//建立面板加载按钮 pbl.setLayout(new GridLayout(10, 5, 1, 1));//设置按钮面板的布局 pbl.setBorder(BorderFactory.createEtchedBorder());//设置边框 //pbr.setLayout(new GridLayout(5,6,1,2)); //pbr.setBorder(BorderFactory.createEtchedBorder()); String[] larr = { //按钮 "Sta", "F-E", "(", ")", "MC", "clr", "Avg", "dms", "Exp", "ln", "MR", "Dec", "Sum", "sin", "x^y", "log", "MS", "Bin", "E(x)", "cos", "x^2", "n!", "M+", "Oct", "D(x)", "tan", "x√", "1/x", "PI", "Hex", "D", "E", "F", "/", "Mod", "And", "A", "B", "C", "*", "Or", "Xor", "7", "8", "9", "-", "Lsh", "Not", "4", "5", "6", "+", "Int", "shift", "1", "2", "3", ".", "0", "=" }; for (int i = 0; i < larr.length; i++) { addButton(pbl, larr[i]);//建立按钮 } setBorder(BorderFactory.createEtchedBorder());//设置边框 add(pbl, BorderLayout.CENTER);//分别添加两面板到框架中 add(ps, BorderLayout.NORTH); } private void addButton(Container c, String s) { //建立按钮,加入到面板并监听按钮事件 JButton bt = new JButton(s); c.add(bt); bt.addActionListener(new buttonListener()); } } class easyCalPanel extends JPanel {//操做基本等同于建立高级计算面板 private static final long serialVersionUID = 3224376138339105930L; public easyCalPanel() { setLayout(new BorderLayout()); Calculat.show = new JTextField("0", 17); Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 18)); Calculat.show.setHorizontalAlignment(JTextField.RIGHT); JPanel ps = new JPanel(); ps.add(Calculat.show); JPanel pb = new JPanel(); pb.setLayout(new GridLayout(5, 4, 1, 1)); pb.setBorder(BorderFactory.createEtchedBorder()); String bts = "%^√!789/456*123-0.=+"; for (int i = 0; i < bts.length(); i++) { addButton(pb, bts.substring(i, i + 1)); } add(pb, BorderLayout.CENTER); add(ps, BorderLayout.NORTH); } private void addButton(Container c, String s) { JButton bt = new JButton(s); bt.setFont(new Font("Dialog", Font.PLAIN, 18));//设置字体 c.add(bt); bt.addActionListener(new buttonListener()); } } class buttonListener implements ActionListener {//响应按钮事件 public void actionPerformed(ActionEvent e) { String s = e.getActionCommand();//获取命令 if ('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) {//该命令为正操做数 if (Calculat.flag) { //若初次输入该操做数(如:输入“123”中的“1”) Calculat.show.setText(s); } else { //(如:输入“123”中的"2"或"3") Calculat.show.setText(Calculat.show.getText() + s); } Calculat.flag = false;//修改标志 } else {//命令为操做数为负数或操做符 if (Calculat.flag) {//初次输入 if (s.equals("-")) {//为负数 Calculat.show.setText(s); Calculat.flag = false; } else {//连续输入几个操做符 Calculat.opChar = s; /// } } else {//为操做符 calculate cal = new calculate();//建立计算类实例 double x = Double.parseDouble(Calculat.show.getText());//将输入的操做数转换为double型 cal.calopr1(x);//双目运算及处理单目运算的操做数 Calculat.opChar = s;//保存运算符 if (Calculat.opChar.equals("!") || Calculat.opChar.equals("√")//操做数必须为正的单目运算 || Calculat.opChar.equals("n!")) { if (Calculat.opNum < 0) { Calculat.show.setText("不能执行此操做!!"); } else { cal.calopr2((int) Calculat.opNum, Calculat.opChar);//单目运算 } Calculat.opChar = "=";//保存符号为下一次运算作准备 } else if (Calculat.opChar.equals("1/x") || Calculat.opChar.equals("x^2") || Calculat.opChar.equals("ln") || Calculat.opChar.equals("log") || Calculat.opChar.equals("sin") || Calculat.opChar.equals("cos") || Calculat.opChar.equals("tan") || Calculat.opChar.equals("Exp")) {//普通单目运算 cal.calopr2((int) Calculat.opNum, Calculat.opChar);//单目运算 Calculat.opChar = "=";//保存符号为下一次运算作准备 } Calculat.flag = true;//设置标志为下一次运算作准备 } } } } class calculate {//计算处理 public void calopr1(double n) {//处理双目运算及单目运算的操做数 String str = ""; if (Calculat.opChar.equals("+")) { Calculat.opNum += n; } else if (Calculat.opChar.equals("-")) { Calculat.opNum -= n; } else if (Calculat.opChar.equals("*")) { Calculat.opNum *= n; } else if (Calculat.opChar.equals("/")) { if (n == 0) { str = "除数为0!!!"; } else { Calculat.opNum /= n; } } else if (Calculat.opChar.equals("^") || Calculat.opChar.equals("x^y")) { Calculat.opNum = Math.pow(Calculat.opNum, n); } else if (Calculat.opChar.equals("x√")) { Calculat.opNum = Math.pow(n, 1 / Calculat.opNum); } else if (Calculat.opChar.equals("=")) { Calculat.opNum = n; } else if (Calculat.opChar.equals("Mod")) { Calculat.opNum = Math.abs(Math.IEEEremainder(Calculat.opNum, n)); } Calculat.show.setText(str + Calculat.opNum); } public void calopr2(int n, String opChar) { //处理单目运算 if (opChar.equals("!") || opChar.equals("n!")) { Calculat.show.setText(new Factorial().factorial((int) Calculat.opNum).toString()); } else if (opChar.equals("√")) { Calculat.show.setText("" + Math.sqrt(n)); } else if (opChar.equals("1/x")) { Calculat.show.setText("" + (1.0 / n)); } else if (opChar.equals("x^2")) { Calculat.show.setText("" + Math.pow(n, 2)); } else if (opChar.equals("ln")) { Calculat.show.setText("" + Math.log(n)); } else if (opChar.equals("log")) { //Calculat.show.setText("" + Math.log10(n)); } else if (opChar.equals("sin")) { Calculat.show.setText("" + Math.sin(Math.toRadians(n))); } else if (opChar.equals("cos")) { Calculat.show.setText("" + Math.cos(Math.toRadians(n))); } else if (opChar.equals("tan")) { Calculat.show.setText("" + Math.tan(Math.toRadians(n))); } else if (opChar.equals("Exp")) { Calculat.show.setText("" + Math.exp(n)); } } } class Factorial { //计算大数阶乘 protected static ArrayList<BigInteger> table = new ArrayList<BigInteger>(); static { table.add(BigInteger.valueOf(1)); } /** Creates a new instance of factorial */ public static synchronized BigInteger factorial(int x) { if (x < 0) { throw new IllegalArgumentException("x must be non-negative."); } for (int size = table.size(); size <= x; size++) { BigInteger lastfact = (BigInteger) table.get(size - 1); BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size)); table.add(nextfact); } return (BigInteger) table.get(x); } }
8.程序运行结果截图:算法
参考文献:
[ 1 ]. 幸运帏等编著. Java程序设计(第二版). 北京:清华大学出版社,2006.8
[ 2 ]. 葛朝军等编著. java2使用培训教程. 北京:清华大学出版社,2005.1编程