含三角函数与转换功能的多计算器语法逻辑错误求助
多用途计算器代码错误排查与修正
存在的错误点:
- 大小写错误: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
相关产品推荐
相关产品推荐

