一、实验要求
1)能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;保存和浏览历史运算记录;
2)能够检验算术表达式的合法性;
3)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
4) 要求交互界面友好,程序健壮。
二、实验内容
1)学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序;
2)能通过界面按钮控件输入并实现算术表达式,输入的表达式即时在控件中显示,按下“=”按钮能实现运算,并将运算结果输出在控件中显示;要求能保存和浏览历史表达式的运算记录。
3)算术表达式求解,是指算术表达式中包括加、减、乘、除、括号等运算符,能求解包含括号的四则混合运算;并且能够检验表达式的合法性。
4)选做:①实现三角函数的运算、对数运算、指数运算、进制转换等;
②设计函数,分别求两个一元多项式的乘积与和。
二、Java图形界面设计
public class Calculate extends JFrame implements ActionListener {
private String[] KEYS = {
"c", "(", ")", "->","7", "8", "9","/", "4", "5", "6", "*", "1", "2", "3","-", ".", "0", "=","+",};
private JButton keys[] = new JButton[KEYS.length];
private JTextField resultText = new JTextField("0.0");
private String b = "";
/**
* @point 若正在输入运算数(即非运算符),则point生效,
* 用于标记当前运算数是否已经输入小数点,以保证
* 每个运算数只能有一个小数点。
*/
private boolean point = false;
private JTextArea History = new JTextArea();// 历史记录文本框初始值设为空
private JLabel label = new JLabel("历史记录");
public Calculate() {
super("计算器");
this.setLayout(null);//设置布局管理器为默认值
resultText.setBounds(20, 85, 255, 40);
resultText.setHorizontalAlignment(JTextField.RIGHT);//右对齐
resultText.setEditable(false);
this.add(resultText);
History.setBounds(20, 25, 255, 60);// 设置文本框大小
History.setAlignmentX(LEFT_ALIGNMENT);// 文本框内容左对齐
History.setEditable(false);// 文本框不允许修改结果
label.setBounds(20, 5, 100, 20);//设置标签位置及大小
History.setLineWrap(true);//自动换行
History.setWrapStyleWord(true);//换行不断字
this.add(History);//将面板添加到总窗体中
this.setLayout(null);
this.add(label);
/**设置按钮
*
*/
int x = 20, y = 125;//按钮布局
for (int i = 0; i < KEYS.length; i++) {
keys[i] = new JButton();
keys[i].setText(KEYS[i]);
keys[i].setBounds(x, y, 60, 40);
if (x < 215) {
x += 65;
} else {
x = 20;
y += 45;
}
this.add(keys[i]);
}
for (int i = 0; i < KEYS.length; i++) {
keys[i].addActionListener(this);//设置监听
}
this.setResizable(false);
this.setBounds(500, 200, 300, 400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
计算界面:
三、内部类实现按钮响应
//内部类实现按钮响应
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();//命令实现
if (label == "=") {
resultText.setText(this.b);
History.setText(History.getText() + resultText.getText());
String s[] = operation(this.b);
String result = Result(s);
this.b = result + "";
resultText.setText(this.b);
History.setText(History.getText() + "=" + resultText.getText() + "\n");//同步历史记录
} else if (label == "c") {
this.b = "";
resultText.setText("0");
}
//删除单个字符
else if(label.equals("->")) {
b=b.substring(0, b.length()-1);
resultText.setText(b);
}
//"."
else if (label == ".") {
char a = label.charAt(0);
if (point) {
//按钮失效
return;
}
else if (b.isEmpty()