發(fā)表于2008年08月02日 00:21
如果計算器程序是一個命令行程序,那么完全可以要求用戶先輸入第一個操作樓,后輸入一個運算符,在輸入第二個操作數(shù),隨后程序就可以給出結(jié)果了。
然而對于一個Windows應(yīng)用程序,用戶是一個鍵一個鍵地輸入數(shù)據(jù),程序在接到一個鍵輸入以后,根據(jù)這個鍵是什么來決定自己的下一動作。這樣,程序的行為就可以用一個“狀態(tài)機”來表達。
狀態(tài)機是計算機中常用到的分析工具,它可以表達成一個程序在運行時,如何根據(jù)輸入來在不同的狀態(tài)之間轉(zhuǎn)換。

狀態(tài)轉(zhuǎn)換
操作數(shù)一初始為0,如果開始輸入的第一個操作數(shù)的第一個鍵是操作符,之后就會接受第二個操作數(shù)。

接受第一個操作數(shù)子狀態(tài)

接受第二個操作數(shù)子狀態(tài)
在程序?qū)崿F(xiàn)中,使用一個boolean變量 bNumBegins來判斷是否處在接受第一個數(shù)字的狀態(tài)。
If(bNumBegins)
{
iCurrent = I;
bNumBegins = false;
}
Else
{
//要求檢查運算溢出的情況
Checkd{
iCurrent = (iCurrent * 10 ) +I;
}
}
而判斷在接受第一個還是第二個操作數(shù)狀態(tài)的方法,則是看前一個運算符 -----如果前一個運算符是 = ,則現(xiàn)在接受的是第一個操作數(shù),否則是第二個操作數(shù)。
計算的方法:
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;
}
/////////////////////////////////////////////////////////////////////////
以上是見到本子個記下的一些看書的筆記,程序是一些片斷但盡顯了整個設(shè)計。
以下則是自己想的,自己想出的程序和人家的還是有一段距離。
1. 先判斷是數(shù)字還是操作符,再判斷所處狀態(tài),再跟據(jù)不同的狀態(tài)有不同的操作.
Int Num1 = 0;
Int Num2 = 0;
Int ResultNum = 0;
Int CurrentNum = 0;
Boolean IsNum1 = true;
Boolean NumBegin = true;
Switch (key) //輸入字符
{
Case 數(shù)字:
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; //變狀態(tài)
Println(CurrentNum); //打印
}
Else
{
ResultNum = Num1 + Num 2;
CurrentNum = ResultNum;
IsNum1 = false; //變狀態(tài)
Println(CurrentNum); //打印
}
- , * , / , ……
= “
If(IsNum1)
{
IsNum1 = false; //變狀態(tài)
Println(CurrentNum); //打印
//這里不太清楚具體要怎么樣,就自己定這樣
}
Else
{
ResultNum = Num1 + Num 2;
CurrentNum = ResultNum;
IsNum1 = false; //變狀態(tài)
Println(CurrentNum); //打印
}
}
2. 先判斷狀態(tài),再判斷輸入是數(shù)字還是操作符
代碼應(yīng)該同上面差不多;
3. 設(shè)定具體狀態(tài)的值,之后在一個方法中跟據(jù)不同的參數(shù)值做不同的事
如:接受第一操作數(shù)__接受第一個數(shù)字 = 1
接受第一操作數(shù)__接受其余的數(shù)字 = 2
接受第二操作數(shù)__接受第一個數(shù)字 = 3
接受第二操作數(shù)__接受第二個數(shù)字 = 4
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/ap0406708/archive/2009/03/19/4004322.aspx