关于表达式中除数为0的容错机制的处理

本文介绍了如何在C#中处理表达式时,针对除数可能为0的情况实现容错机制。通过特定的方法,使得当出现除数为0时,表达式能够返回预期值而非抛出异常。例如,在1+2/(A-B)的表达式中,如果A-B等于0,可以避免直接导致程序崩溃,而是让表达式结果为1。
摘要由CSDN通过智能技术生成

说明:对于一个表达式(比如1+2/(A-B)),如果A-B为0,有时我们想这个表达式返回1,而不是0或者抛出异常。也就是局部的除数异常是允许的。这个时候就需要对公式做容错处理。

下面是用C#的处理过程,如有错误,欢迎指正

/// <summary>
    /// 公式容错
    /// 在执行公式时,会有除数为0的情况,此时不应该报错,只是包含除数为0的表达式计算结果为0,整个表达式继续执行
    /// 如1+(2/(4-8/(1+1)))  执行结果应该是1 而不应该报错
    /// 方法:
    /// 1:将原表达式转换为后缀表达式
    /// 2:再将后缀表达式转换为容错之后的中缀表达式
    /// 3:栈顶元素即为结果
    /// </summary>
    public class FormulasConvert {
        //存原始后缀表达式
        Stack<char> _suffixStack = new Stack<char>();
        /// <summary>
        /// 后缀表达式结果
        /// </summary>
        public string _suffixFormula = string.Empty;

        //存容错后中缀表达式
        Stack<string> _infixingStack = new Stack<string>();
        /// <summary>
        /// 容错后中缀表达式结果
        /// </summary>
        public string _infixingFormula = string.Empty;

        /// <summary>
        /// 原始公式
        /// </summary>
        private string _inputFormula = string.Empty;
        /// <summary>
        /// 用字符转换之后的原始公式
        /// 10+10==》A+B
        /// </summary>
        private string _newFormula = string.Empty;

        //操作符
        private string _operator = "+-*/()";

        /// <summary>
        /// 原公式:100+2/300
        /// 对应:
        /// A:100  B:2 C:300
        /// 最终
        /// A+B/C
        /// </summary>
        Dictionary<string, string> _dicCompary = new Dictionary<string, string>();

        public FormulasConvert(string inputFormula) {
            this._inputFormula = inputFormula;
        }

        /// <summary>
        /// 将原始表达式转换成后缀表达式
        /// </summary>
        /// <param name="inputString">原中缀表达式</param>
        /// <returns></returns>
        public string ConvertToSuffix() {
            OperatorFormula();

            for (int i = 0; i < _newFormula.Length; i++) {
                char ch = _newFormula[i];
                if (!IsOperator(ch)) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值