Java程序设计带有函数功能的计算器
《Java程序设计》课程设计报告
课题名称:带有函数功能的计算器设计
系别:
班级:
姓名:
学号:
Java程序设计带有函数功能的计算器
1. 课程设计题目
基于带有函数功能的计算器设计
2. 课程设计目的
1. 巩固和加深课堂所学知识;
2. 将课本上的理论知识和实际应用有机的结合起来,培养分析和解决实际问题的能力;
3. 通过对java语言程序代码的阅读、修改、设计,理解和掌握复杂的java语言应用程序的编程,提高实践编程能力。
3. 程序运行环境
本程序在windows visit的pc机上利用jdk-6u7-windows-i586-p软件运行通过。
4. 程序功能使用说明
运行该程序后,参与运算的操作数可有鼠标点击相应按钮输入,但操作符应有鼠标点击相应的按钮,当:
1. 在简易计算中可以按照常规输入计算,基本无bug,“%”未设置其用途;
2. 简易计算中,可以进行+、-、*、/、乘方(√)及阶乘(!)运算;
3. 科学计算中有许多功能为实现,主要能进行加、减、乘、除、乘方、开方、幂、开n次方、倒数、阶乘、ln、e的x次幂、三角函数等高级运算;
4. 例如:
Java程序设计带有函数功能的计算器
(1).1+8=9
(2).20+-5=15
(3).36-6=30
(4).2*8=16
(5).36/6=6
(6)4^2=16
(7).100√=10
(8).-9√=不能执行此操作!
(9).3!=6
(10).-20!=不能执行此操作!
(11).0!=1
(12).6In=1.791759469
(13).2Exp=7.38905609893065
(14).8x^y3=512
(15).20x^2=400
(16).6n!=872
(17)30sin=0.5 其它(cost,tan)依次类推;
(18).1/x计算有bug;
(19).3 x√8=2(求8开3次方);
(20).85mod10=5(85对10求余)
5. 关键算法与技术:
1. 大数阶乘;
Java程序设计带有函数功能的计算器
2. 界面切换;
3. GirdLayout布局管理器的使用;
4. 事件响应;
5. 匿名内部类的使用;
6. 设计思路:
本程序采用模块化设计,调试方便,程序的可读性好。在老师的指导下,由主程序启动简易计算器,根据使用者的需要可以在简易计算器中进行运算操作,若不能满足用户功能,可以选择使用科学计算器,具体操作与目前市面上的计算器差不多,用户还可以选择使用说明进行查看具体操作。由于时间及个人水平的问题,科学计算中还有很多功能未实现。
具体思路:用户输入(点击)某一数字或操作符,程序将自行判断是操作数还是操作符,
1. 若为一操作数的首次输入,则将显示区的“0”替换,若该操作数不为首次输入则将显示区的数字串接上此次输入的数字;
2. 若为操作符,将判断是否为带符号操作数,若是则保存符号,反之为纯操作符:若为二元操作符就将显示区的字符串转化为双精度数;若为等号就进行计算结果并显示结果;若为一目操作符就进行相应的一目运算并显示结果;
3. 进行相应的初始化操作,为下一次输入做准备;
Java程序设计带有函数功能的计算器
4. 根据自己的理解画了下面的简单的流程图。略
7. 编码实现:
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) 2009</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("编辑");//创建菜单
Java程序设计带有函数功能的计算器
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("使用说明");
Java程序设计带有函数功能的计算器
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 (e.getActionCommand().equals("基本计算")) {
new EasyFrame();//切换到简易计算器窗口
AdvanceFrame.frame.setVisible(false);
}
else if (e.getActionCommand().equals("科学计算")) {
new AdvanceFrame();//切换到高级计算界面
EasyFrame.frame.setVisible(false);
}
else if (e.getActionCommand().equals("复制")) {
//
}
else if (e.getActionCommand().equals("粘贴")) {
//
}
else if (e.getActionCommand().equals("使用说明")) {
try{
FileInputStream fis=new FileInputStream("使用说明.txt");
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
Java程序设计带有函数功能的计算器
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开发时间:2009-05-16\n个人空间:http:///731001587/infocenter?ptlang=2052\n");
JOptionPane.showMessageDialog(null,aboutArea,"关于 计算器",JOptionPane.PLAIN_MESSAGE);
}
}
}
class AdvanceCalPanel extends JPanel//创建高级计算面板
{
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));
Java程序设计带有函数功能的计算器
//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 //操作基本等同于创建高级计算面板
{
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));
Java程序设计带有函数功能的计算器
}
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;//保存运算符
Java程序设计带有函数功能的计算器
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;
}
Java程序设计带有函数功能的计算器
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)));
}
Java程序设计带有函数功能的计算器
else if (opChar.equals("Exp")) {
Calculat.show.setText(""+Math.exp(n));
}
}
}
class Factorial//计算大数阶乘
{
protected static ArrayList table=new ArrayList();
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);
}
}