计算器代码的分析

  最近几天都想搞一个小程序,但总是编写不出来,觉得自己与代码还是太生疏啦。拿来网上的一个计算器代码,慢慢细看,也好加强一下自己的代码本领。

代码如下————————————————————————————————————————————

package 计算器;


import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.JOptionPane;


@SuppressWarnings("serial")
public class Calculator extends Applet implements ActionListener {


Button backButton = new Button("退格");      // 创建退格按钮
Button clearButton = new Button("清除");     //創建清零按鈕
Panel p1 = new Panel(new FlowLayout());    // 创建面板,流布局
Panel p2 = new Panel(new GridLayout(2, 1));     // 布局处理器
Panel p3 = new Panel(new GridLayout(4, 5, 5, 5));
TextField t = new TextField("0");        // 创建文本组件
float num1 = 0;
char ch = '#';
boolean can = false;                          //定義變量


public void init() { // 构造方法
t.setFont(new Font("宋体", Font.BOLD, 25)); // 呈现文本


backButton.setFont(new Font("黑体", Font.BOLD, 15)); // 设置颜色,大小
backButton.setForeground(Color.red); // 创建健按钮
clearButton.setFont(new Font("黑体", Font.BOLD, 15));
clearButton.setForeground(Color.red);


p1.add(backButton);
p1.add(clearButton); // 加载按钮到面板上
backButton.addActionListener(this);
clearButton.addActionListener(this); // 加载监视器


p2.add(t); // 加载文本框和按钮到p2中
p2.add(p1);
p2.setBackground(Color.black);


p3.setBackground(Color.black); // 设置p3的颜色


this.setLayout(new BorderLayout()); // this引用成员变量
this.add(p2, "North");
this.add(p3, "Center"); // 面板的东西


String buttonStr = "789/A456*B123-C0.D+="; // 键盘数字,用字符串格式
for (int i = 0; i < buttonStr.length(); i++)
this.addButton(p3, buttonStr.substring(i, i + 1));  // 加载到按钮上,靜態方法
}


private void addButton(Container c, String s) // 构建加鍵方法
{
Button b = new Button(s);
if (s.equals("A")) // 对应
b.setLabel("sqrt");
else if (s.equals("B"))
b.setLabel("1/x");
else if (s.equals("C"))
b.setLabel("%");
else if (s.equals("D"))
b.setLabel("+/-");


b.setForeground(Color.blue); // 设置颜色,大小,字体
b.setFont(new Font("黑体", Font.BOLD, 15));
c.add(b);
b.addActionListener(this);
}


// 分割线上面是界面,下面是实现方法——————————————————————————————————————————


public void actionPerformed(ActionEvent e) { // 第一个监听器
String act = e.getActionCommand(); // 监听按钮,讓程序知道按下按鈕的標籤


if (e.getSource() == backButton) { // 退格键
if (t.getText().length() > 1)
t.setText(t.getText().substring(0, t.getText().length() - 1)); // 返回字串,
else
t.setText("0");
return;
}


if (e.getSource() == clearButton) // 请零健
{
t.setText("0");
ch = '#';                 //
return;
}


if (act.equals("+/-")) { // 符号键
if (t.getText().charAt(0) != '-')   //charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
t.setText("-" + t.getText());
else
t.setText(t.getText().substring(1));  //substring() 方法用于提取字符串中介于两个指定下标之间的字符。
return;
}



if (act.equals(".")) // 小数点
{
t.setText(t.getText() + act); // 加载小数点
return;


if (act != "1/x" && act.charAt(0) >= '0' && act.charAt(0) <= '9') {               //如何判斷輸入數據
if (can) {               //判斷如果can為真的話,就執行下一步,加載按鈕數據
t.setText(act);
can = false;
} // 加载键入的数值
else {                    
try {
if (Float.parseFloat(t.getText()) == 0) {  //按下“0”按鈕
if (t.getText().equals("0."))
t.setText(t.getText() + act);  //加載按鈕數據和“0” ;
else
t.setText(act);        //加載按鈕數據
return;

else {
t.setText(t.getText() + act);    //如果不為“0”,則加載按鈕數據和之前數據
return;
}
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
}
}
}


if (act.equals("+") || act.equals("-") || act.equals("*")
|| act.equals("/") || act.equals("%")) {
if (ch != '#') {             //確保沒有清零
try {
num1 = cacu(num1, ch, Float.parseFloat(t.getText()));  //執行cacu方法
t.setText(String.valueOf(num1));         //將num1轉化為字符串,再確定t里的內容標籤
ch = act.charAt(0);             
can = true;
return;
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
}
} else {
try {
num1 = Float.parseFloat(t.getText());
ch = act.charAt(0);
can = true;
return;
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
}
}
}


if (act.equals("sqrt")) {
try {
float num = (float) Math.sqrt(Float.parseFloat(t.getText()));   //將字符轉化成float型數值
t.setText(String.valueOf(num));                //將num1轉化為字符串,再確定t里的內容標籤
can = true;
return;
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
}
}


if (act.equals("1/x")) {
try {
float num = 1 / Float.parseFloat(t.getText());
t.setText(String.valueOf(num));
can = true;
return;
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
} catch (ArithmeticException e1) {
JOptionPane.showMessageDialog(null, "除0错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return;
}
}


if (act.equals("=")) {
can = true;
try {
if (ch == '#')
return;
float num = Float.parseFloat(t.getText());   //將字符轉化成float型數值
num1 = cacu(num1, ch, num);                  //引用cacu方法
t.setText(String.valueOf(num1));            //將num1轉化為字符串,再確定t里的內容標籤
ch = '#';
return; 
} catch (NumberFormatException e1) {              //当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
JOptionPane.showMessageDialog(null, "输入格式错误!", "警告!", 
JOptionPane.ERROR_MESSAGE);
return;
}
}
}
public float cacu(float a, char c, float b) { //定義cacu方法
float sum;
switch (c) {
case '+':
sum = a + b;
break;
case '-':
sum = a - b;
break;
case '*':
sum = a * b;
break;
case '/':
if (b == 0) {
JOptionPane.showMessageDialog(null, "除0错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return 0;
}
sum = a / b;
break;
case '%':
if (b == 0) {
JOptionPane.showMessageDialog(null, "除0错误!", "警告!",
JOptionPane.ERROR_MESSAGE);
return 0;
}
sum = a % b;
break;
default:
return 0;
}
return sum;               //返回值為sum
}
}

——————————以上为代码——————————————————————————————————

     上面我已经加些了一些批注了,但还是来一个讲讲我对这个程序的大概理解吧。

      这个小程序主体可分为两部份,一部份主要是计算器界面的编写,界面编写有可分为3个part,part1是定义按钮Button,面板panel,文本框TextField,变量等,也就是定义一堆组件和变量。part2是一个init方法,主要是设置

各种组件的大小,颜色,位置等属性,以及加载组件到面板上!part3则是将part2未加上标签的按钮加上标签,构建容器,设置容器的大小,颜色等等属性,还有加载监视器。

       第二部分可分为监听器actionPerformed的方法和cacu方法,监听器方法比较复杂,但在上面有所注释,也就不细讲啦。监听器方法用了9个并列if语句来对计算器上的若干按钮进行加载监视的反映。而cacu方法则是进行计算器的基本运算加减乘除,在监听器方法中被应用。

      因为理解有限,一些知识点如果细究可能会太长了,所以也就写到这里。

      努力让自己更优秀!每天背自己更优秀一点!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值