Logo

郎哥编程

完善四则运算器功能代码

2018-02-18 907

上节内容讲述了如何建立四则运算器项目,并建立了程序的基本框架。本节内容根据10.1节的需求分析和10.2设计内容继续完善四则运算器的程序流程控制、语法扫描、算式计算功能。

程序流程控制

10.2节程序流程控制功能一段给出了流程描述。按照流程描述,需要实现如下功能。

(1)建立run方法,在main方法中调用。

public static void main(String[] args) {
// 设置帮助内容
Arithmetic  tempArithmetic = new Arithmetic();
tempArithmetic.run();
}
public void run()
{
}

在main方法中,声明类型为Arithmetic类成员变量tempArithmetic,并调用new方法初始化,然后调用Arithmetic类的run方法。

(2)显示帮助内容

10.1节需求部分要求帮助内容及显示格式如下:

***欢迎使用四则运算器***

算式计算:输入算式后,按下回车键,程序给出答案。算式仅限于包含单个运算符和两个运算数的算式。例如: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方法添加如下代码:

    /**
     * Function  scanFormula
     * Description: 扫描formula算式,返回扫描结果
     * input: 无输入参数
     * return: formula算式无语法错误,返回sucess,否则返回语法错误
     */
 
 
    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方法添加如下代码:

    /**
     * Function  calculateFormula
     * Description: 计算formula存储的算式,返回计算后的结果
     * input: 无输入参数
     * return: 返回计算后的结果
     */
    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);
 
    }

至此,程序编写完成。


■ 知识点拨

本节内容主要是根据10.2节的设计内容完成代码编写,设计内容没有给出伪代码,只是给出了程序框架和业务流程。因此,还需要同学们在理解程序业务流程的基础上,运用前面学过的编程知识,使用循环、判断等语句完成程序的编写。

■ 思考与练习

请同学们根据上述内容完成四则运算其项目V2.0版的代码编写。



代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论