本课根据需求分析和设计内容继续完善项目的程序流程控制、语法扫描、算式计算功能。
程序流程控制
《程序设计》课的“程序流程控制功能”一段给出了流程描述。按照流程描述,需要实现如下功能:
(1)建立run()方法。
在Arithmetic类添加run()方法,代码如下:
/**
* Function run
* Description: 程序主要的运行方法
* input: 无输入参数
* return: 无返回值
*/
public void run()
{
}后面的内容会逐步完善run方法内的代码。
(2)显示帮助内容
在《功能流程图》课,给出了帮助内容及显示格式。
***欢迎使用四则运算器*** 算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于算式仅支持包含单个运算符和两个运算数的算式。例如:15+20、8*9、20/5等。 退出程序:请输入“quit”命令,按下回车键。 查看帮助:请输入“help”命令,按下回车键。
Arithmetic类属性“help”存储帮助内容,showHelp()方法显示帮助内容。在Arithmetic类方法run中添加如下代码:
public void run()
{
String strHelp = "***欢迎使用四则运算器***\n"
+ "算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于算式仅支持包含单个运算符和两个运算数的算式。例如:15+20、8*9、20/5等。\n"
+ "退出程序:请输入“quit”命令,按下回车键。"
+ "查看帮助:请输入“help”命令,按下回车键。";
setHelp(strHelp);
showHelp();
}(3)循环等待用户输入
在程序顶部导入java.util包,在run方法中添加while循环代码,在循环体添加获取用户输入代码。
public void run()
{
/**
* 初始化help,并显示help
*/
String strHelp = "***欢迎使用四则运算器***\n"
+ "算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于算式仅支持包含单个运算符和两个运算数的算式。例如:15+20、8*9、20/5等。\n"
+ "退出程序:请输入“quit”命令,按下回车键。"
+ "查看帮助:请输入“help”命令,按下回车键。";
setHelp(strHelp);
showHelp();
/**
* 循环等待用户输入
*/
//声明Scanner变量,并用new运算符实例化Scanner
Scanner sc = new Scanner(System.in);
do {
String strInput = sc.next();
}while(true);
}在run方法中,添加do-while循环语句,循环接收用户的输入,该循环为无限循环,后续代码需要添加退出循环语句。
(4)判断用户输入内容,选择不同程序分支
根据用户输入的内容,程序流程有三个分支。若输入的内容为“quit”,调用Arithmetic类的quit方法退出程序;若输入的内容为“help”,调用Arithmetic类的showHelp方法;若不是前两项内容,调用Arithmetic类的calculateFormula方法。在run方法do-while循环语句中增加if-else语句。
public void run()
{
/**
* 初始化help,并显示help
*/
String strHelp = "***欢迎使用四则运算器***\n"
+ "算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于算式仅支持包含单个运算符和两个运算数的算式。例如:15+20、8*9、20/5等。\n"
+ "退出程序:请输入“quit”命令,按下回车键。"
+ "查看帮助:请输入“help”命令,按下回车键。";
setHelp(strHelp);
showHelp();
/**
* 循环等待用户输入
*/
//声明Scanner变量,并用new运算符实例化Scanner
Scanner sc = new Scanner(System.in);
do {
String strInput = sc.next();
//判断用户输入内容,执行不同分支程序
if( strInput.equals("quit") )
quit();
else if( strInput.equals("help") )
showHelp();
else
{
setFormula(strInput);
calculateFormula();
}
}while(true);
}算式计算
计算算式并返回计算结果,计算前先对算式做语法判断,若算式语法错误,返回错误信息,终止计算功能。若算式语法正确,计算算式并返回计算结果。
(1)语法扫描
扫描用户输入的算式,检查算式语法是否符合程序要求。语法正确与否判断规则如下:
● 算式的开始和结束字符必须是数字;
● 算式只能包含数字和‘+’、‘-’、‘*’、‘/’运算符;
● 运算符不能连续;
●运算符有且只能包含一个。
在Arithmetic类的scanFormula方法添加如下代码:
public String scanFormula() {
String result = "sucess";
String strFormula = getFormula();
char ch;
//声明count变量,存储运算符的出现的次数
int count=0;
//遍历strFormula
for( int i = 0; i < strFormula.length(); i++ )
{
//获取strFormula的第i个字符
ch = strFormula.charAt(i);
/**
* 判断ch是否是合法字符
* 合法字符为数字和‘+’、‘-’、‘*’、‘/’运算符
*/
if(ch >='0' && ch <='9')
{
continue;
}
else if( ch=='+' || ch=='-' || ch=='*' || ch=='/' )
{
count++;
//算式的第一个字符和最后一个字符不能是运算符
if( i == 0 || i == strFormula.length()-1 )
{
result = "算式的第一个字符和最后一个字符不能是运算符";
break;
}
//算式只能包含一个运算符
if( count >= 2 )
{
result = "输入的算式只能包含一个运算符";
break;
}
}
else
{
result = "输入的算式包含非法字符,算式的第(" + i + ")个字符为非法字符";
break;
}
}
return result;
}语法扫描采用遍历算式所有字符的算法,对算式的每个字符进行判断。for循环遍历算式的所有字符,for循环体的if-else语句判断算式的单个字符是否符合语法要求,如果不符合要求,设置语法错误信息并跳出循环。
(2)计算算式
具体算法为:遍历并解析算式,得到运算数和运算符,然后利用switch语句控制不同的计算分支,得到计算结果。
在Arithmetic类的calculateFormula方法添加如下代码:
public String calculateFormula() {
String result = "";
//声明num1和num2变量,用于存储运算数
String num1 = "";
String num2 = "";
//声明op,用于存储运算符
String op = "";
char ch;
//判断
boolean bFirst = true;
String strFormula = getFormula();
//遍历strFormula
for( int i = 0; i < strFormula.length(); i++ )
{
//获取strFormula的第i个字符
ch = strFormula.charAt(i);
if(ch >='0' && ch <='9')
{
if( bFirst )
num1 += ch;
else
num2 += ch;
}
else if( ch=='+' || ch=='-' || ch=='*' || ch=='/' )
{
bFirst = false;
op += ch;
}
}
//计算算式
//获取运算符
ch = op.charAt(0);
//将字符串强制转换为double类型
double dNum1 = Double.parseDouble(num1);
double dNum2 = Double.parseDouble(num2);
double dResult = 0.0;
switch(ch)
{
case '+':
dResult = dNum1 + dNum2;
break;
case '-':
dResult = dNum1 - dNum2;
break;
case '*':
dResult = dNum1 * dNum2;
break;
case '/':
{
if( (int)dNum2 == 0 )
{
dResult = 0.0;
break;
}
dResult = dNum1 / dNum2;
}
break;
}
return String.valueOf(dResult);
}完善Arithmetic类的run()方法
在Arithmetic类run()方法循环体中增加算式语法扫描、计算算式、输出计算结果的代码。
public void run()
{
/**
* 初始化help,并显示help
*/
String strHelp = "***欢迎使用四则运算器***\n"
+ "算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于算式仅支持包含单个运算符和两个整数运算数的算式。例如:15+20、8*9、20/5等。\n"
+ "退出程序:请输入“quit”命令,按下回车键。"
+ "查看帮助:请输入“help”命令,按下回车键。";
setHelp(strHelp);
showHelp();
/**
* 循环等待用户输入
*/
//声明Scanner变量,并用new运算符实例化Scanner
Scanner sc = new Scanner(System.in);
do {
String strInput = sc.next();
//判断用户输入内容,执行不同分支程序
if( strInput.equals("quit") )
quit();
else if( strInput.equals("help") )
showHelp();
else
{
setFormula(strInput);
//语法扫描
String ret = scanFormula();
//语法正确
if( ret.equals("sucess") )
{
ret = calculateFormula();
printResult(ret);
}
else
{
//输出语法错误信息
printResult(ret);
}
}
}while(true);
}至此,Arithmetic类代码编写完成。