You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含三角函数与转换功能的多计算器语法逻辑错误求助

多用途计算器代码错误排查与修正

存在的错误点:

  • 大小写错误:C#是大小写敏感语言,代码中console.ReadLine()应改为Console.ReadLine()(注意C大写)。
  • 无默认返回值:Calculate方法的switch语句未处理未匹配的操作符,且没有默认返回逻辑,会导致编译失败。
  • 未实现的方法:代码中调用了Hypotenuse、CurrencyConverter等7个方法,但未定义这些方法,直接引发编译错误。
  • 无效的break语句:case "OC"中的break永远不会执行,因为前面已经用return返回结果,属于冗余代码。
  • 运行时风险:除法(/)、余切(COT)操作未处理除数为零的情况,会导致运行时异常;此外Math.Cos/Tan/Sin的参数是弧度,若用户输入角度会得到错误结果。
  • 大小写不兼容:switch匹配操作符时区分大小写,用户输入小写(如"a")会无法匹配对应逻辑。

修正后的完整代码

using System;

namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入第一个数字:");
            if (!double.TryParse(Console.ReadLine(), out double num1))
            {
                Console.WriteLine("输入无效,请输入数字!");
                return;
            }

            Console.WriteLine("请输入第二个数字(如无需则输入0):");
            if (!double.TryParse(Console.ReadLine(), out double num2))
            {
                Console.WriteLine("输入无效,请输入数字!");
                return;
            }

            Console.WriteLine("请选择操作:A(绝对值), S(平方根), -, +, M(乘), /, C(余弦), T(正切), H(斜边), L(自然对数), LOG(常用对数), IN(自定义底数对数), DEG(转角度), SYN(正弦), COT(余切), CC(货币转换), VC(体积转换), LC(长度转换), HC(转十六进制), DC(十进制转换), OC(转八进制)");
            string op = Console.ReadLine()?.Trim().ToUpper() ?? "";

            Calculator calc = new Calculator(num1, num2);
            try
            {
                double result = calc.Calculate(op);
                Console.WriteLine($"结果:{result}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"计算出错:{ex.Message}");
            }
        }
    }

    class Calculator
    {
        private double num1;
        private double num2;

        public Calculator(double num1, double num2)
        {
            this.num1 = num1;
            this.num2 = num2;
        }

        public double Calculate(string op)
        {
            switch (op)
            {
                case "A":
                    return Math.Abs(num1);
                case "S":
                    if (num1 < 0) throw new ArgumentException("负数无法计算平方根");
                    return Math.Sqrt(num1);
                case "-":
                    return num1 - num2;
                case "+":
                    return num1 + num2;
                case "M":
                    return num1 * num2;
                case "/":
                    if (num2 == 0) throw new DivideByZeroException("除数不能为零");
                    return num1 / num2;
                case "C":
                    Console.WriteLine("注意:余弦计算使用弧度值");
                    return Math.Cos(num1);
                case "T":
                    Console.WriteLine("注意:正切计算使用弧度值");
                    return Math.Tan(num1);
                case "H":
                    return Hypotenuse(num1, num2);
                case "L":
                    if (num1 <= 0) throw new ArgumentException("自然对数的底数必须大于0");
                    return Math.Log(num1);
                case "LOG":
                    if (num1 <= 0) throw new ArgumentException("常用对数的底数必须大于0");
                    return Math.Log10(num1);
                case "IN":
                    if (num1 <= 0 || num2 <= 0 || num2 == 1) throw new ArgumentException("自定义对数的参数必须满足:num1>0,num2>0且num2≠1");
                    return Math.Log(num1, num2);
                case "DEG":
                    return Math.ToDegrees(num1);
                case "SYN":
                    Console.WriteLine("注意:正弦计算使用弧度值");
                    return Math.Sin(num1);
                case "COT":
                    if (Math.Tan(num1) == 0) throw new DivideByZeroException("余切计算时正切值不能为零");
                    return 1 / Math.Tan(num1);
                case "CC":
                    return CurrencyConverter(num1, num2);
                case "VC":
                    return VolumeConverter(num1, num2);
                case "LC":
                    return LengthConverter(num1, num2);
                case "HC":
                    return HexConverter(num1);
                case "DC":
                    return DecimalConverter(num1);
                case "OC":
                    return OctalConverter(num1);
                default:
                    throw new ArgumentException("未找到对应的操作,请检查输入");
            }
        }

        // 补充实现未定义的方法(示例逻辑,可按需修改)
        private double Hypotenuse(double a, double b)
        {
            return Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2));
        }

        private double CurrencyConverter(double amount, double rate)
        {
            return amount * rate;
        }

        private double VolumeConverter(double value, double conversionFactor)
        {
            return value * conversionFactor;
        }

        private double LengthConverter(double value, double conversionFactor)
        {
            return value * conversionFactor;
        }

        private double HexConverter(double num)
        {
            string hex = Convert.ToString((int)num, 16);
            return Convert.ToDouble(hex, 16);
        }

        private double DecimalConverter(double num)
        {
            return num;
        }

        private double OctalConverter(double num)
        {
            string octal = Convert.ToString((int)num, 8);
            return Convert.ToDouble(octal, 8);
        }
    }
}

额外说明

  • 加入输入验证,避免非数字输入导致程序崩溃;
  • 对所有可能抛出异常的操作添加了错误提示;
  • 统一将操作符输入转为大写,解决大小写匹配问题;
  • 三角函数添加了弧度提示,若需支持角度输入,可将Math.Cos(num1)改为Math.Cos(Math.ToRadians(num1)),正切、正弦同理;
  • 转换类方法添加了基础示例逻辑,可根据实际需求(如具体汇率、转换系数)调整。

内容的提问来源于stack exchange,提问作者John Adams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:16:16