全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1960
推到 Plurk!
推到 Facebook!

請教關於小算盤運算方式的問題

尚未結案
wbs173
一般會員


發表:12
回覆:26
積分:7
註冊:2005-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-27 22:25:01 IP:218.165.xxx.xxx 未訂閱
各位高手大大安安 我想用BCB實作一個小算盤 像WINDOWS的一樣 但是我想了好久 我還是想不到 WINDOWS的小算盤 是如何按下 -*/就馬上做運算呢 我自己做計算機的方式 是在= 的按鈕中 寫4個CASE 分別代表 -*/ 再以 -*/ 4個按鈕去選擇運算方式 但是這樣的方式好像很不好 只能連加或連減 不能加減混合運算 所以我想用像小算盤一樣的方式 請問有哪位大大知道 WINDOWS 小算盤是用什麼方式來做運算的嗎 會的請交一下 小弟感激不盡~
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-27 22:35:19 IP:218.172.xxx.xxx 未訂閱
宣告一個變數儲存運算子 假設為op 兩個int變數 一個a 一個b 然後把=要做的事寫成一個計算結果的function 當按 -*/時 如果op為空 則把op存入現在的運算子 當不為空 則呼叫計算結果的function function() { 裡面要判斷op是 -*/哪個 然後把 a b 做運算 把結果放回 a 把 b 清空 再把op設為空 }
wbs173
一般會員


發表:12
回覆:26
積分:7
註冊:2005-03-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-28 00:13:29 IP:218.165.xxx.xxx 未訂閱
這是我試做的程式碼 上面那位大大說的是這樣子做嗎 可是我這樣子做 不能做加減的混合運算 只能連加或連減 請會的大大幫忙看一下 感激不盡~     
int compute; //暫存用
int op; //判斷 -/*用
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------------------    void __fastcall TForm1::Button5Click(TObject *Sender)
{// = 的按鈕
switch (op)
 {
   case 1:
      Edit1->Text=compute StrToInt(Edit1->Text);          
      break;
   case 2:
      Edit1->Text=compute-StrToInt(Edit1->Text);            
      break;
   case 3:
      Edit1->Text=compute*StrToInt(Edit1->Text);
      break;
   case 4:
      Edit1->Text=compute/StrToInt(Edit1->Text);
      break;
 }
}
//-------------------------------------------------------------------
//   號的按鈕
void __fastcall TForm1::Button1Click(TObject *Sender)
{     int temp=StrToInt(Edit1->Text);
  if (op==0)
   {
    compute=StrToInt(Edit1->Text);
   }
  else
  compute=compute temp;      Edit1->Text="";
  Edit2->Text=compute;
  op=2;
 
}
//-------------------------------------------------------------------
 //-號
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int temp=StrToInt(Edit1->Text);
  if (op==0)
   {
    compute=StrToInt(Edit1->Text);
   }
  else
  compute=compute-temp;      Edit1->Text="";
  Edit2->Text=compute;
  op=2;
}
//------------------------------------------------------------------ 
發表人 - wbs173 於 2005/04/28 00:25:18
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-28 12:54:52 IP:61.229.xxx.xxx 未訂閱
分析 1 運算時需要兩個數值以及一個運算符號,所以 int operand1, operand2; // 運算數值 int op; // 運算符號    2 一開始時,計算機最初狀況會先顯示 0,所以
void Init() {
  operand1 = 0; 
  Edit1->Text = operand1;
}
3 考慮使用者案的狀況一: 直接按了 =,但目前應該不能計算。在此,我們先讓 op = 不知名的運算符號 來表示不能計算,所以
enum OpType { OpUnknown = 0, OpPlus, OpMinus, OpMul, OpDiv, OpEqual }; // 放在 global 區
void Init() {
  operand1 = 0;
  Edit1->Text = operand1;
  op = opUnknown;
}
4 狀況二: 直接按 , -, *, / 時,因為 operand1 = 0, 所以很合理,但是表示下一個要輸入的必須是 operand2 5 狀況三: 輸入 1 ,表示目前 Edit1->Text 已經有 1, 而目前的 op 必須要設為 opPlus 狀況 4, 5 的結果,我們以加法為例
ClickPlus(...) {
  operand1 = StrToInt(Edit1->Text);
  op = OpAdd;
} 
6 狀況三: 輸入 1 2 到此時, operand1 = 1, op = OpAdd, Edit1->Text =2 很正常 7 狀況四: 輸入 1 2 = 遇到 = 時,必須先把 Edit1->Text 的值放到 operand2,然後計算
ClickEqual(...) {
  operand2 = StrToInt(Edit1->Text);
  Calc(); // 後面才撰寫
}
8 狀況五: 輸入 1 2 時;真糟糕,無法判斷第一個 與第二個 ,有何不同? 在仔細觀察後發現,在第一個 時,op = OpUnknown, 而第二個 時, op = OpPlus;因此我們可以改寫成
ClickPlus(...) {
  if ( op==OpUnknown ) { 
    operand1 = StrToInt(Edit1->Text);
  }
  else {
    operand2 = StrToInt(Edit1->Text); // 取得第二個值,準備計算
    Calc();
  }
  op = OpAdd;
}
9 其他運算符號的都大致相同 10 撰寫 Calc()
// 計算兩數的運算
// 所有資料 (operand1, operand2, op) 都已經準備好了
void __fastcall TForm1::Calc() {
  switch( op ) {
    case OpPlus: operand1  = operand2; break; // 處理加法
    case OpMinus: operand1 -= operand2; break; // 處理減法
    case OpMul: operand1 *= operand2; break; // 處理乘法
    case OpDiv: operand1 /= operand2; break; // 處理除法
    //case OpUnknown: // 因為什麼事都不做,因此只當成註解
  }
  Edit1->Text = operand1; // 將計算的值,顯示給使用者知道
}
11 程式碼總結 ( 不含 Calc() )
int operand1, operand2; // 運算數值
int op; // 運算符號
enum OpType { OpUnknown = 0, OpPlus, OpMinus, OpMul, OpDiv, OpEqual };
void Init() {
  operand1 = 0;
  Edit1->Text = operand1;
  op = opUnknown;
}
// ClickEqual(...) { 就是 Button5Click()
void __fastcall TForm1::Button5Click(TObject *Sender)
  operand2 = StrToInt(Edit1->Text);
  Calc(); // 後面才撰寫
}
// 將 ClickPlus(...) 改成
// void __fastcall TForm1::ButtonXXClick(TObject *Sender)
// 必須針對所有運算符號都加以調整修改
ClickPlus(...) {
  if ( op==OpUnknown ) { 
    operand1 = StrToInt(Edit1->Text);
  }
  else {
    operand2 = StrToInt(Edit1->Text); // 取得第二個值,準備計算
    Calc();
  }
  op = OpAdd;
}
12 結論: 儘可能將所有的狀況找出,並且分析其差異點,將可以得到蛛絲馬跡,這樣下筆就很快!! 發表人 - windblown 於 2005/04/28 13:02:04
wbs173
一般會員


發表:12
回覆:26
積分:7
註冊:2005-03-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-28 13:26:17 IP:218.165.xxx.xxx 未訂閱
@@" 非常感謝windblown大大的教學 真的很用心而且很仔細 給了我非常大的幫助 謝謝~! 那剩下的部份就靠小弟我自己鑽研囉 如果還有不懂的 就還要麻煩各位大大不吝賜教 再次謝謝各位高手的回應~
系統時間:2024-06-16 14:18:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!