using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace WinCalc {
public class CalcForm : Form {
// 控件宣告
Button btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9;
Button btnClr, btnDot, btnPlus, btnSub, btnMul, btnDiv, btnEqu;
TextBox txtCalc;
// 狀態變數
double acc = 0, sec = 0;
bool clear = true, first = true;
string oper = "=";
Container components = null;
public CalcForm() {
InitializeComponent();
// 初始化狀態
acc = 0; sec = 0; first = true; clear = true; oper = "=";
}
protected override void Dispose(bool disposing) {
if (disposing && components != null) components.Dispose();
base.Dispose(disposing);
}
// InitializeComponent 由設計器產生,含所有控件屬性與事件綁定
// 關鍵綁定:
// btn0~9, btnDot.Click += btn_clk;
// btnPlus, btnSub, btnMul, btnDiv.Click += btn_Oper;
// btnEqu.Click += btn_Equ;
// btnClr.Click += btn_Clr;
// 數字鍵與小數點處理
void btn_clk(object sender, EventArgs e) {
if (clear) txtCalc.Text = "";
Button b = (Button)sender;
txtCalc.Text += b.Text;
if (txtCalc.Text == ".") txtCalc.Text = "0.";
sec = double.Parse(txtCalc.Text);
clear = false;
}
// 運算子按鈕處理
void btn_Oper(object sender, EventArgs e) {
Button b = (Button)sender;
oper = b.Text;
if (first) acc = sec;
else Calc();
first = false; clear = true;
}
// 等號按鈕處理
void btn_Equ(object sender, EventArgs e) { Calc(); }
// 核心計算邏輯
void Calc() {
switch (oper) {
case "+": acc += sec; break;
case "-": acc -= sec; break;
case "*": acc *= sec; break;
case "/": acc /= sec; break;
}
oper = "="; first = true;
txtCalc.Text = acc.ToString();
sec = acc; // 連續運算支援
}
// 清除按鈕
void btn_Clr(object sender, EventArgs e) { Clear(); }
void Clear() {
acc = 0; sec = 0; first = true;
txtCalc.Text = ""; txtCalc.Focus();
}
[STAThread]
static void Main() { Application.Run(new CalcForm()); }
}
}
| 變數 | 含義 |
|---|---|
acc | 累積運算結果(運算元 A) |
sec | 當前輸入數值(運算元 B) |
oper | 待執行運算子(+ - * / =) |
first | 是否為第一個運算子(決定 acc 初始化) |
clear | 下一個數字鍵是否清空顯示(新數值輸入) |
txtCalc.RightToLeft = Yes:數字右對齊,符合計算機慣例。txtCalc.ReadOnly = true:禁止鍵盤直接輸入,僅透過按鈕。. 自動補為 0.。1 + 2 + 3 = 正確得 6,歸功於 sec = acc 更新。try/catch 或預檢 sec != 0。編譯環境:VS.NET Beta 2 + Windows 2000 Pro。歡迎完善除零保護、科學運算、歷史記錄等功能。