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