发表于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