發表于2008年08月02日 00:21

如果計算器程序是一個命令行程序,那么完全可以要求用戶先輸入第一個操作樓,后輸入一個運算符,在輸入第二個操作數,隨后程序就可以給出結果了。

然而對于一個Windows應用程序,用戶是一個鍵一個鍵地輸入數據,程序在接到一個鍵輸入以后,根據這個鍵是什么來決定自己的下一動作。這樣,程序的行為就可以用一個“狀態機”來表達。

狀態機是計算機中常用到的分析工具,它可以表達成一個程序在運行時,如何根據輸入來在不同的狀態之間轉換。 
 


狀態轉換
操作數一初始為0,如果開始輸入的第一個操作數的第一個鍵是操作符,之后就會接受第二個操作數。

 


接受第一個操作數子狀態

 


接受第二個操作數子狀態

在程序實現中,使用一個boolean變量 bNumBegins來判斷是否處在接受第一個數字的狀態。

If(bNumBegins)
{
iCurrent = I;
bNumBegins = false;
}
Else
{
//要求檢查運算溢出的情況
Checkd{
iCurrent = (iCurrent * 10 ) +I;
}
}

而判斷在接受第一個還是第二個操作數狀態的方法,則是看前一個運算符 -----如果前一個運算符是 = ,則現在接受的是第一個操作數,否則是第二個操作數。

計算的方法:
Switch(jOperator)
{
Case ‘+’ :
Checked{ iResult = iNum1 + iCurrent;}
Break;
Case ‘-’ :
Checked{ iResult = iNum1 - iCurrent;}
Break;
Case ‘*’ :
Checked{ iResult = iNum1 * iCurrent;}
Break;
Case ‘/’ :
Checked{ iResult = iNum1 / iCurrent;}
Break;
Default:  // ‘=’
        iResult = iCurrent;
break;
}

/////////////////////////////////////////////////////////////////////////

以上是見到本子個記下的一些看書的筆記,程序是一些片斷但盡顯了整個設計。
以下則是自己想的,自己想出的程序和人家的還是有一段距離。

1.       先判斷是數字還是操作符,再判斷所處狀態,再跟據不同的狀態有不同的操作.

Int Num1 = 0;
Int Num2 = 0;
Int ResultNum = 0;
Int CurrentNum = 0;
Boolean IsNum1 = true;
Boolean NumBegin = true;

Switch (key)   //輸入字符
{
Case 數字:
         If(IsNum1)
         {
                     If(NumBegin)
                           {
                                   Num1 = key;
                                CurrentNum = Num;
                                   NumBegin = false;
                                   Println(CurrentNum);   //打印
                 }
                     Else
                            {
                                   Num1 = Num1+10 + key;
                                   CurrentNum = Num1;
Println(CurrentNum);   //打印
                            }
                     }
              Else
                     {
                     If(NumBegin)
                           {
                                   Num2 = key;
                                CurrentNum = Num;
                                   NumBegin = false;
                                   Println(CurrentNum);   //打印
                 }
                     Else
                            {
                                   Num2 = Num1+10 + key;
                                   CurrentNum = Num2;
                                   Println(CurrentNum);   //打印
                            }
}

Case (運算符)
            +:
        If(IsNum1)
                     {
                            IsNum1 = false;    //變狀態
                            Println(CurrentNum);   //打印
                     }
              Else
                     {
                            ResultNum = Num1 + Num 2;
                            CurrentNum = ResultNum;
                            IsNum1 = false;    //變狀態
                            Println(CurrentNum);   //打印
                     }
-          , *  , / ,  ……
           = “
                 If(IsNum1)
                     {
                            IsNum1 = false;    //變狀態
                            Println(CurrentNum);   //打印
                    //這里不太清楚具體要怎么樣,就自己定這樣
                     }
                     Else
                     {
                            ResultNum = Num1 + Num 2;
                            CurrentNum = ResultNum;
                            IsNum1 = false;    //變狀態
                            Println(CurrentNum);   //打印

                     }

}

2.       先判斷狀態,再判斷輸入是數字還是操作符
代碼應該同上面差不多;

3.       設定具體狀態的值,之后在一個方法中跟據不同的參數值做不同的事

如:接受第一操作數__接受第一個數字  = 1
接受第一操作數__接受其余的數字  = 2
接受第二操作數__接受第一個數字  = 3
接受第二操作數__接受第二個數字  = 4

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ap0406708/archive/2009/03/19/4004322.aspx