首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 計算機程式開發實戰:完整原始碼與核心邏輯(三)

     編輯:關於C語言

完整原始碼:calcForm


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。歡迎完善除零保護、科學運算、歷史記錄等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved