參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類 題目:小青的數學作業 小青最近外務很忙,但是最近學校課業繁重,尤其是數學,計算作業特別多,請您寫一個程式,來幫她自動算她的數學計算作業。 程式功能要求: 請利用上述說明,寫一個程式,能完成以下功能要求: (1) 能讓小青輸入需要計算的數學運算式(運算式只能有 0~9、+、* 這 12 種字元,輸入長度最多 1,500 字元)。 (2) 能將小青所輸入的數學運算式的運算結果正確顯示出來。 (3) 您的程式要能讓小青重複輸入數學運算式,當小青想要結束程式時,可以輸入@來結束。 程式執行範例: 執行結果 using System; using System.Linq.Expressions; using System.Numerics; using System.Text.RegularExpressions; class Program { /// <summary> /// 將運算式分割成運算元與運算子 /// </summary> /// <param name="expression">運算式</param> /// <returns>分割後的運算式</returns> static string[] SplitExpression(string expression) { // 使用正則表達式找出所有的數字和運算子 MatchCollection matches = Regex.Matches(expression, @"\d+|[\+\*]"); string[] elements = new string[matches.Count]; int index = 0; foreach (Match match in matches) { elements[index] = match.Value; index++; } return elements; } /// <summary> /// 執行運算式的結果 /// </summary> /// <param name="expression">運算式</param> /// <returns>執行結果</returns> static BigInteger EvaluateExpression(string[] expression) { BigInteger a, b; Stack<BigInteger> exp = new Stack<BigInteger>(); for(int index=0; index<expression.Length; index++) { if (expression[index] == "*")//是運算元 { a = exp.Pop(); b = BigInteger.Parse(expression[++index]); exp.Push(a * b); } else { exp.Push(BigInteger.Parse(expression[index])); } } a = exp.Pop(); while (exp.Count > 0) { b = exp.Pop(); a += b; } return a; } static void Main() { while (true) { Console.WriteLine("請輸入數學運算式:(輸入 @ 結束)"); string input = Console.ReadLine().Replace(" ", "");//防呆去空白; input = input.Replace(" ", "");//防呆去空白 if (input == "@") { Console.WriteLine("程式結束,謝謝使用。"); break; } try { string[] expression = SplitExpression(input); BigInteger result = EvaluateExpression(expression)%10000; Console.WriteLine($"妳輸入的數學運算式為:\n{input}\n運算結果 = {result}"); } catch (Exception ex) { Console.WriteLine("發生錯誤:" + ex.Message); } } } } |