课程设计(大作业)报告
1 课程设计介绍........................................................................................................... 1
1.1 课程设计内容........................................................................................................ 1
1.2 课程设计要求........................................................................................................ 1
2 总体设计................................................................................................................... 2
2.1 课设题目总体设计、算法描述............................................................................ 2
2.2功能模块图、流程图分析..................................................................................... 2
3 调试与性能分析..................................................................................................... 6
4 参考文献................................................................................................................... 8
附 录(程序清单)................................................................................................. 10
2.总体设计
2.1题目总体设计、算法描述。
总体设计:
Calculator中的各个主要的操纵设计的对象
描述:我们设计的算法主要分两大块,一块运用于整体模块,框架的设计,其中有一构造方法用于引用计算;而另一块运用于数据的计算,其中用到数据结构的知识;
在class PostFix中,我们用了数据结构栈的算术表达式转换,用于保存输入的数据,用于进行运算,主要分两部分,一个是保存算术符号,另一个使用与两个数的计算,这两部分相互联系,进行复杂的计算。
在class Calculator中,一开始设计了框架,以及一些菜单栏的按键,并且把各个框架的按钮进行设计,其中采用了整体布局的方法,再做了一些按钮的提示话。
最后就只是一个主类。
2.2功能模块图、程序流程图分析。
流程图:
这个流程图,只是个人对该题目的做法设计,其中有不足之处,还请老师多多谅解。
其中体现了整个程序的部凑,应该已经是一目了然了。
3.调试与性能分析
标准型
标准型主要进行简单的+、-、*、/,的运算,就不多说了。
科学型
科学型除了有基本运算还添加了进制转换,括号运算,三角函数,一元和二元运算,工程计算等功能;其中三角函数,一元二元运算属于比较有难度的调试。
我们做栈时,由于学的是C的数据结构,对于把C的代码改为JAVA的并且还要做构造,对于我们组员来说是有难度的幸好我们之中杨照海C的基础很好,于是在我们的努力下解决了该问题
4. 参考文献
《JAVA从入门到实践》——清华大学出版社——刘升华 等编著
《算法设计与分析》——清华大学出版社——王晓东 编著
《软件设计师教程》——清华大学出版社——陈平 褚华 编著( 参考其中一部分 )
《JAVA语言程序设计》——机械工业出版社——(美)Y. Daniel Liang 著
《数据结构》——云南大学出版社——主编 王震江 副主编 何英
附 录(程序清单)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Stack;
class PostFix{
public String converttoPostfix(String infix) {
if(infix == null) {
return null;
}
char[] ch = infix.toCharArray();
Stack<Character> stack1 = new Stack<Character>();
StringBuilder sb = new StringBuilder(ch.length);
boolean appendSeparator = false;
boolean sign = true;
for(int i = 0; i < ch.length; i++) {
char c = ch[i];
if(c == ' ') {
continue;
}
if(appendSeparator) {
sb.append(' ');
appendSeparator = false;
}
if((c == '-' || c == '+') && sign) {
sb.append(c);
continue;
}
if((c >= '0' && c <= '9') || c == '.') {
sign = false;
sb.append(c);
continue;
}
if(c == '(') {
stack1.push(c);
continue;
}
if(c == ')') {
sign = false;
while(stack1.peek() != '(') {
sb.append(' ');
sb.append(stack1.pop());
}
stack1.pop();
continue;
}
appendSeparator = true;
if(c == '+'||c == '-' ||c == '*' ||c == '/'||c == '^') {
sign = true;
if(stack1.isEmpty() || stack1.peek() == '(') {
stack1.push(c);
continue;
}
while(!stack1.isEmpty() && getCiXu(stack1.peek()) >= getCiXu(c)) {
sb.append(' ');
sb.append(stack1.pop());
}
stack1.push(c);
}
}
while(!stack1.isEmpty()) {
sb.append(' ');
sb.append(stack1.pop());
}
return sb.toString();
}
public int getCiXu(char operator){
switch(operator){
case '(':case ')': return 0;
case '+':case '-': return 1;
case '*':case '/': return 2;
case '^':return 3;
}
return -1;
}
//输入数据的运算
public double jiSuan(String postfix) {
String str=postfix;
String[] strs = str.split("\u0020");
Stack<String> stack = new Stack<String>();
String element;
double n1,n2,result;
for(int i = 0; i < strs.length;i++){
element = strs[i];
if(isOperator(element)){
n1 = Double.parseDouble(stack.pop()); //第二个操作数
n2 = Double.parseDouble(stack.pop()); //第一个操作数
result = doOperate(n2,n1,element);
stack.push(new Double(result).toString());
}else{
stack.push(element); }
}
return Double.parseDouble(stack.pop());
}
private double doOperate(double n1, double n2, String operator) {
if(operator.equals("+"))
return n1 + n2;
else if(operator.equals("-"))
return n1 - n2;
else if(operator.equals("*"))
return n1 * n2;
else if(operator.equals("^"))
return Math.pow(n1, n2);
else
return n1/n2;
}
private boolean isOperator(String str){
return str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")|| str.equals("^");
}
}
class Calculator{
static final int WIDTH = 500;
static final int HEIGHT = 400;
public static int jinzhi = 10;//默认初始为十进制
public double df = 0d;//一元运算和进制转换时用到
public double d1 = 0d;//二元运算时第一个操作数
public double d2 = 0d;//二元运算时第二个操作数
PostFix pf = new PostFix();
public double dm = 0d;//实现记忆功能
JButton bA = new JButton("A");
JButton bB = new JButton("B");
JButton bC = new JButton("C");
JButton bD = new JButton("D");
JButton bE = new JButton("E");
JButton bF = new JButton("F");
JButton b0 = new JButton("0");
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
JButton b6 = new JButton("6");
JButton b7 = new JButton("7");
JButton b8 = new JButton("8");
JButton b9 = new JButton("9");
JTextField tf = new JTextField("0",30);
JTextField tf1 = new JTextField("",30);
JTextField tf2 = new JTextField(2);
JRadioButton jr1 = new JRadioButton("十六进制");
JRadioButton jr2 = new JRadioButton("十进制",true);
JRadioButton jr3 = new JRadioButton("八进制");
JRadioButton jr4 = new JRadioButton("二进制");
JMenuItem item1 = new JMenuItem("复制");
JMenuItem item2 = new JMenuItem("粘贴");
JMenuItem item3 = new JMenuItem("标准型");
JMenuItem item4 = new JMenuItem("科学型");
JMenuItem item5 = new JMenuItem("使用说明");
JPanel p0 = new JPanel(new BorderLayout());
JPanel p1 = new JPanel(new GridLayout(1,4));
JPanel p2 = new JPanel(new GridLayout(5,5));
JPanel p3 = new JPanel(new GridLayout(5,5));
JFrame jf = new JFrame("科学计算器");
boolean newdigital = true;
JButton bco;
public Calculator(){
jf.setSize(WIDTH,HEIGHT);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int width = screenSize.width;
int height = screenSize.height;
int x = (width-WIDTH)/2;
int y = (height-HEIGHT)/2;
jf.setLocation(x, y);
//菜单栏的设计
JMenuBar menubar = new JMenuBar();
jf.setJMenuBar(menubar);
JMenu menu1 = new JMenu("查看");
JMenu menu2 = new JMenu("功能");
JMenu menu3 = new JMenu("帮助");
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
menu1.add(item1);
menu1.addSeparator();
menu1.add(item2);
menu2.add(item3);
menu2.addSeparator();
menu2.add(item4);
menu3.add(item5);
//3个文本框的设计
tf.setBackground(Color.white);
tf1.setBackground(Color.white);
tf2.setBackground(Color.white);
tf.setHorizontalAlignment(JTextField.RIGHT);
tf1.setHorizontalAlignment(JTextField.RIGHT);
tf2.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
tf1.setEditable(false);
tf2.setEditable(false);
//进制转换栏的设计(4个单选按钮)
ButtonGroup bg = new ButtonGroup();
bg.add(jr1);
bg.add(jr2);
bg.add(jr3);
bg.add(jr4);
//49个按钮的设计
//8个控制按钮
JButton bmc = new JButton("MC");
JButton bmr = new JButton("MR");
JButton bms = new JButton("MS");
JButton bmp = new JButton("M+");
JButton bmd = new JButton("M-");
JButton bbac = new JButton("BackSpace");
JButton bce = new JButton("CE");
JButton bc0 = new JButton("C");
//17个标准计算的按钮
JButton bp = new JButton("+");
JButton bd = new JButton("-");
JButton bm = new JButton("*");
JButton be0 = new JButton("/");
JButton bpd = new JButton("+/-");
JButton bpo = new JButton(".");
JButton beq = new JButton(" = ");
//24个科学计算的按钮
JButton bsqrt = new JButton("sqrt");
JButton blog = new JButton("log");
JButton bex = new JButton("e^x");
JButton bx2 = new JButton("x^2");
JButton bx3 = new JButton("x^3");
JButton bnj = new JButton("n!");
JButton blm = new JButton("(");
JButton brm = new JButton(")");
JButton bpi = new JButton("PI");
JButton byu = new JButton("%");
JButton bdao = new JButton("1/x");
JButton babs = new JButton("abs");
JButton bax = new JButton("a^x");
JButton bgy = new JButton("关于");
JButton bfe = new JButton("联系作者");
JButton bsin = new JButton("sin");
JButton bcos = new JButton("cos");
JButton btan = new JButton("tan");
//四个面板的设计
p0.add(tf,BorderLayout.CENTER);
p0.add(tf1,BorderLayout.NORTH);
p1.add(jr1);
p1.add(jr2);
p1.add(jr3);
p1.add(jr4);
p2.add(tf2);
p2.add(bbac);
p2.add(bce);
p2.add(bc0);
p2.add(bgy);
p2.add(bmc);
p2.add(b7);
p2.add(b8);
p2.add(b9);
p2.add(bp);
p2.add(bmr);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.add(bd);
p2.add(bms);
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(bm);
p2.add(bpd);
p2.add(b0);
p2.add(bpo);
p2.add(beq);
p2.add(be0);
p3.add(bmd);
p3.add(bsin);
p3.add(bcos);
p3.add(btan);
p3.add(bsqrt);
p3.add(bmp);
p3.add(bex);
p3.add(bx2);
p3.add(bx3);
p3.add(bnj);
p3.add(blm);
p3.add(brm);
p3.add(bpi);
p3.add(byu);
p3.add(bA);
p3.add(bB);
p3.add(bC);
p3.add(bD);
p3.add(bE);
p3.add(bF);
p3.add(bdao);
p3.add(babs);
p3.add(bax);
p3.add(bfe);
p3.add(blog);
p0.setVisible(true);
p1.setVisible(true);
p2.setVisible(true);
p3.setVisible(true);
//整体布局的设计(先箱式,后边界)
//箱式:先四水平,再一个垂直
Box vbox = Box.createVerticalBox();
Box hbox0 = Box.createHorizontalBox();
Box hbox1 = Box.createHorizontalBox();
Box hbox2 = Box.createHorizontalBox();
Box hbox3 = Box.createHorizontalBox();
hbox0.add(p0);
hbox0.add(Box.createVerticalStrut(20));
hbox1.add(p1);
hbox0.add(Box.createVerticalStrut(20));
hbox2.add(p2);
hbox3.add(p3);
vbox.add(hbox0);
vbox.add(hbox1);
vbox.add(hbox2);
vbox.add(hbox3);
jf.add(vbox,BorderLayout.CENTER);
jf.setVisible(true);
jf.pack();
//注册事件监听者对象
ActionListener ac = new ActionHandler();
//四个进制转换
jr1.addActionListener(ac);
jr2.addActionListener(ac);
jr3.addActionListener(ac);
jr4.addActionListener(ac);
//49个按钮
bmc.addActionListener(ac);
bmr.addActionListener(ac);
bms.addActionListener(ac);
bmp.addActionListener(ac);
bmd.addActionListener(ac);
bbac.addActionListener(ac);
bce.addActionListener(ac);
bc0.addActionListener(ac);
bp.addActionListener(ac);
bd.addActionListener(ac);
bm.addActionListener(ac);
be0.addActionListener(ac);
bpd.addActionListener(ac);
b0.addActionListener(ac);
b1.addActionListener(ac);
b2.addActionListener(ac);
b3.addActionListener(ac);
b4.addActionListener(ac);
b5.addActionListener(ac);
b6.addActionListener(ac);
b7.addActionListener(ac);
b8.addActionListener(ac);
b9.addActionListener(ac);
bpo.addActionListener(ac);
beq.addActionListener(ac);
bsqrt.addActionListener(ac);
blog.addActionListener(ac);
bex.addActionListener(ac);
bx2.addActionListener(ac);
bx3.addActionListener(ac);
bnj.addActionListener(ac);
blm.addActionListener(ac);
brm.addActionListener(ac);
bpi.addActionListener(ac);
byu.addActionListener(ac);
bdao.addActionListener(ac);
bA.addActionListener(ac);
bB.addActionListener(ac);
bC.addActionListener(ac);
bD.addActionListener(ac);
bE.addActionListener(ac);
bF.addActionListener(ac);
babs.addActionListener(ac);
bax.addActionListener(ac);
bgy.addActionListener(ac);
bfe.addActionListener(ac);
bsin.addActionListener(ac);
bcos.addActionListener(ac);
btan.addActionListener(ac);
//菜单栏
item1.addActionListener(ac);
item2.addActionListener(ac);
item3.addActionListener(ac);
item4.addActionListener(ac);
item5.addActionListener(ac);
}
class ActionHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
if(s.equals("关于")){//showConfirmDialog(Component parentComponent, Object message, String title, int optionType)
JOptionPane.showConfirmDialog(null, "计算机09级2班 学号:200911012XX", "本计算器作者信息", JOptionPane.OK_OPTION);
}
if(s.equals("联系作者")){
JOptionPane.showConfirmDialog(null, "昆明学院计算机系09级2班" +
+'\t'+"计算机09级2班", "联系作者信息", JOptionPane.OK_OPTION);
}
if(s.equals("复制")){
JOptionPane.showConfirmDialog(null, "本功能暂不开放", "信息提示", JOptionPane.OK_OPTION);
}
if(s.equals("粘贴")){
JOptionPane.showConfirmDialog(null, "本功能暂不开放", "信息提示", JOptionPane.OK_OPTION);
}
if(s.equals("使用说明")){
JOptionPane.showConfirmDialog(null, "请查阅计算机自带的使用说明", "信息提示", JOptionPane.OK_OPTION);
}
if(s.equals("BackSpace")){
String s1 = tf.getText();
String s2 = tf1.getText();
tf.setText(s1.substring(0,s1.length()-1));
tf1.setText(s2.substring(0,s2.length()-1));
}
if(s.equals("CE")){
tf.setText("");
tf1.setText("");
newdigital = true;
}
if(s.equals("C")){
tf.setText("");
tf1.setText("");
newdigital = true;
}
if(s.equals("+/-")){
String s2 = tf1.getText();
df = Double.parseDouble(tf.getText().trim());
tf.setText(String.valueOf(-df));
tf1.setText(s2.substring(0,s2.length()-1));
tf1.setText(tf1.getText()+String.valueOf(-df));
}
if(s.equals("0")||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||
s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
if(newdigital == false){tf.setText(tf.getText()+s);tf1.setText(tf1.getText()+s);
}
else{tf.setText(s); newdigital = false;
tf1.setText(tf1.getText()+s);
}
}
//一元运算的设计与处理
if(s.equals("sqrt")){
df = Double.parseDouble(tf.getText().trim());
if(df>0){tf.setText(Double.toString(Math.sqrt(df)));}
else{JOptionPane.showConfirmDialog(null, "非负数不可开方", "计算错误提示", JOptionPane.OK_OPTION);
}
}
if(s.equals("sin")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.sin(df)));
}
if(s.equals("cos")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.cos(df)));
}
if(s.equals("tan")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.tan(df)));
}
if(s.equals("abs")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.abs(df)));
}
if(s.equals("log")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.log(df)));
}
if(s.equals("e^x")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(Math.exp(df)));
}
if(s.equals("x^2")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(df*df));
}
if(s.equals("x^3")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(df*df*df));
}
if(s.equals("PI")){
tf.setText(Double.toString(Math.PI));
}
if(s.equals("1/x")){
df = Double.parseDouble(tf.getText().trim());
if(df == 0){
JOptionPane.showConfirmDialog(null, "除数不可为零", "计算错误提示", JOptionPane.OK_OPTION);
}else{tf.setText(Double.toString(1/df));}
}
if(s.equals("%")){
df = Double.parseDouble(tf.getText().trim());
tf.setText(Double.toString(0.01*df));
}
if(s.equals("n!")){
df = Double.parseDouble(tf.getText().trim());
if(df == 0){tf.setText("1");}
else{double sum = 1d;
for(int i = 1;i<= df;i++){
sum = sum*i;
}
tf.setText(Double.toString(sum));
}
}
//二元运算的设计与实现
if(s.equals("+")){
newdigital = true;
tf1.setText(tf1.getText()+"+");
tf.setText("");
}
if(s.equals("-")){
newdigital = true;
tf1.setText(tf1.getText()+"-");tf.setText("");
}
if(s.equals("*")){
newdigital = true;
tf1.setText(tf1.getText()+"*");tf.setText("");
}
if(s.equals("/")){
newdigital = true;
tf1.setText(tf1.getText()+"/");tf.setText("");
}
if(s.equals("(")){
newdigital = true;
tf1.setText(tf1.getText()+"(");tf.setText("0");
}
if(s.equals(")")){
newdigital = true;
tf1.setText(tf1.getText()+")");tf.setText("");
}
if(s.equals(".")){
if(tf.getText().contains(".") != true){
tf.setText(tf.getText()+s); newdigital = false;tf1.setText(tf1.getText()+".");
}
}
if(s.equals("a^x")){
newdigital = true;
tf1.setText(tf1.getText()+"^");
}
if(s.equals(" = ")){
newdigital = true;
String s0 = tf1.getText();
String s1 = pf.converttoPostfix(s0);
tf.setText(Double.toString(pf.jiSuan(s1)));
tf1.setText(tf1.getText()+'='+tf.getText());
}
//记忆功能的设计与实现
if(s.equals("MC")){
tf2.setText("");
dm = 0d;
newdigital = true;
}
if(s.equals("MR")){
if(tf2.getText().trim() != ""){
tf.setText(Double.toString(dm));
}
}
if(s.equals("MS")){
dm = Double.parseDouble(tf.getText().trim());
tf2.setText("M");
newdigital = true;
}
if(s.equals("M+")){
dm = dm+Double.parseDouble(tf.getText().trim());
}
if(s.equals("M-")){
dm = dm-Double.parseDouble(tf.getText().trim());
}
//进制转换功能的设计与实现
if(s.equals("十六进制")){
bA.setEnabled(true);
bB.setEnabled(true);
bC.setEnabled(true);
bD.setEnabled(true);
bE.setEnabled(true);
bF.setEnabled(true);
b8.setEnabled(true);
b9.setEnabled(true);
b8.setEnabled(true);
b7.setEnabled(true);
b6.setEnabled(true);
b5.setEnabled(true);
b4.setEnabled(true);
b3.setEnabled(true);
b2.setEnabled(true);
b1.setEnabled(true);
b0.setEnabled(true);
Integer i = new Integer((tf.getText().trim()));
String temp = "";
int j;
switch(jinzhi){
case 16: temp = tf.getText();break;
case 10: temp = Integer.toHexString(i); break;
case 8: j = Integer.valueOf(tf.getText(),8);
temp = Integer.toHexString(j); break;
case 2: j = Integer.valueOf(tf.getText(),2);
temp = Integer.toHexString(j); break;
}
tf.setText(temp);
jinzhi = 16;
}
if(s.equals("十进制")){
bA.setEnabled(false);
bB.setEnabled(false);
bC.setEnabled(false);
bD.setEnabled(false);
bE.setEnabled(false);
bF.setEnabled(false);
b9.setEnabled(true);
b8.setEnabled(true);
b7.setEnabled(true);
b6.setEnabled(true);
b5.setEnabled(true);
b4.setEnabled(true);
b3.setEnabled(true);
b2.setEnabled(true);
b1.setEnabled(true);
b0.setEnabled(true);
String temp = "";
int j;
switch(jinzhi){
case 16: j = Integer.valueOf(tf.getText(),16);
temp = String.valueOf(j);break;
case 10: temp = tf.getText();
case 8: j = Integer.valueOf(tf.getText(),8);
temp = String.valueOf(j);break;
case 2: j = Integer.valueOf(tf.getText(),2);
temp = String.valueOf(j);break;
}
tf.setText(temp);
jinzhi = 10;
}
if(s.equals("八进制")){
bA.setEnabled(false);
bB.setEnabled(false);
bC.setEnabled(false);
bD.setEnabled(false);
bE.setEnabled(false);
bF.setEnabled(false);
b9.setEnabled(false);
b8.setEnabled(false);
b7.setEnabled(true);
b6.setEnabled(true);
b5.setEnabled(true);
b4.setEnabled(true);
b3.setEnabled(true);
b2.setEnabled(true);
b1.setEnabled(true);
b0.setEnabled(true);
Integer m = new Integer((tf.getText().trim()));
String temp = "";
int j;
switch(jinzhi){
case 16: j = Integer.valueOf(tf.getText(),16);
temp = Integer.toOctalString(j);
case 10: temp = Integer.toOctalString(m); break;
case 8: temp = tf.getText();
case 2: j = Integer.valueOf(tf.getText(),2);
temp = Integer.toOctalString(j); break;
}
tf.setText(temp);
jinzhi = 8;
}
if(s.equals("二进制")){
bA.setEnabled(false);
bB.setEnabled(false);
bC.setEnabled(false);
bD.setEnabled(false);
bE.setEnabled(false);
bF.setEnabled(false);
b9.setEnabled(false);
b8.setEnabled(false);
b7.setEnabled(false);
b6.setEnabled(false);
b5.setEnabled(false);
b4.setEnabled(false);
b3.setEnabled(false);
b2.setEnabled(false);
b1.setEnabled(true);
b0.setEnabled(true);
Integer n = new Integer((tf.getText().trim()));
String temp = "";
int j;
switch(jinzhi){
case 16: j = Integer.valueOf(tf.getText(),16);
temp = Integer.toBinaryString(j);
case 10: temp = Integer.toBinaryString(n); break;
case 8: j = Integer.valueOf(tf.getText(),8);
temp = Integer.toBinaryString(j); break;
case 2: temp = tf.getText(); break;
}
tf.setText(temp);
jinzhi = 2;
}
if(s.equals("标准型")){
p0.setVisible(true);
p1.setVisible(false);
p2.setVisible(true);
p3.setVisible(false);
jf.pack();
}
if(s.equals("科学型")){
p0.setVisible(true);
p1.setVisible(true);
p2.setVisible(true);
p3.setVisible(true);
jf.pack();
}
}
}
}
public class G{
public static void main(String[] args){
new Calculator();
}
}