請教關於小算盤運算方式的問題 |
尚未結案
|
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
|
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
|
wbs173
一般會員 發表:12 回覆:26 積分:7 註冊:2005-03-15 發送簡訊給我 |
這是我試做的程式碼 上面那位大大說的是這樣子做嗎 可是我這樣子做 不能做加減的混合運算 只能連加或連減 請會的大大幫忙看一下 感激不盡~
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 發送簡訊給我 |
分析
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |