chat gpt3.5写程序,真是很好用

文章讲述了作者使用ChatGPT在短时间内创建了一个C#表达式解析器,该解析器支持加减乘除运算及括号优先级,简化了传统编程中编写和调试此类功能的时间
摘要由CSDN通过智能技术生成

        后知后觉,chatgpt刚出来的时候就是简单测试一下聊天什么的,刚想起是不是能用来写一点稍微复杂一点的程序。

        提示词:用c#语言实现加法、减法、乘法、除法四则运算,并支持有括号优先级以及负数的表达式解析器,优先级运算是按照括号、乘除法、加减法的先后顺序执行,例如:1+2-3/(3-1)*3+1=-0.5。

        向gpt提问,系统给出答案如下,蓝色的是我微调了一下,总共不用30分钟,如果自己写这程序调试,以前的话怎么说也要1整天:

 public class ExpressionResolver
 {
     public static double ResolveExpression(string expression)
     {
         return EvaluateExpression(FormatExpression(expression));
     }

     private static string FormatExpression(string expression)
     {
         // Remove spaces and normalize negative signs
         expression = expression.Replace(" ", "");

         // Normalize negative signs (e.g., "2*(-3)" becomes "2*(0-3)")
         expression = NormalizeNegatives(expression);

         return expression;
     }

     private static string NormalizeNegatives(string expression)
     {
         // If there's a negative sign after an operator or opening parenthesis,
         // convert it to a subtraction from zero.
         char[] operators = { '+', '-', '*', '/' };
         bool f = false;
         
         for (int i = 0; i < expression.Length; i++)
         {
             if (expression[i] == '-' && (i == 0 || expression[i - 1] == '(' || Array.Exists(operators, op => op == expression[i - 1])))
             {                    
                 for (int i0 = i+1; i0 < expression.Length; i0++)
                 {
                     if (Array.Exists(operators, op => op == expression[i0]))
                     {
                         expression = expression.Substring(0, i) + "(0" + expression.Substring(i,i0-i)+ ")" + expression.Substring(i0);
                         i += i0 - i + 3;
                         f = true;
                         break;
                     }
                 }

                 if(!f)
                 {
                     expression = expression.Substring(0, i) + "(0" + expression.Substring(i) + ")";
                     i += 2;
                 }

                  // Skip past the inserted "(0"
             }
         }

         return expression;
     }

     private static double EvaluateExpression(string expression)
     {
         Stack<double> operands = new Stack<double>();
         Stack<char> operators = new Stack<char>();

         for (int i = 0; i < expression.Length; i++)
         {
             if (expression[i] == '(')
             {
                 operators.Push(expression[i]);
             }
             else if (expression[i] == ')')
             {
                 while (operators.Peek() != '(')
                 {
                     EvaluateTop(operands, operators);
                 }
                 operators.Pop(); // Discard '('
             }
             else if (IsOperator(expression[i]))
             {
                 while (operators.Count > 0 && operators.Peek() != '(' && Precedence(operators.Peek()) >= Precedence(expression[i]))
                 {
                     EvaluateTop(operands, operators);
                 }
                 operators.Push(expression[i]);
             }
             else
             {
                 // Read operand
                 string operand = "";
                 while (i < expression.Length && (char.IsDigit(expression[i]) || expression[i] == '.'))
                 {
                     operand += expression[i];
                     i++;
                 }
                 i--; // Backtrack one position
                 operands.Push(double.Parse(operand, CultureInfo.InvariantCulture));
             }
         }

         while (operators.Count > 0)
         {
             EvaluateTop(operands, operators);
         }

         return operands.Peek();
     }

     private static void EvaluateTop(Stack<double> operands, Stack<char> operators)
     {
         double b = operands.Pop();
         double a = operands.Pop();
         char op = operators.Pop();
         double result = PerformOperation(a, b, op);
         operands.Push(result);
     }

     private static double PerformOperation(double a, double b, char op)
     {
         switch (op)
         {
             case '+': return a + b;
             case '-': return a - b;
             case '*': return a * b;
             case '/':
                 if (b == 0)
                 {
                     throw new DivideByZeroException("Cannot divide by zero");
                 }
                 return a / b;
             default: throw new ArgumentException("Invalid operator");
         }
     }

     private static bool IsOperator(char c)
     {
         return c == '+' || c == '-' || c == '*' || c == '/';
     }

     private static int Precedence(char op)
     {
         switch (op)
         {
             case '+':
             case '-':
                 return 1;
             case '*':
             case '/':
                 return 2;
             default:
                 return 0;
         }
     }
 }

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值