2016-10-21 3 views
0

私はC#で配列を持つ簡単な電卓を作ろうとしています。まず、2つの整数と1つの演算子だけを使って作ってみました。うまくいきました。今私は、ユーザーが好きなだけ式を作ることができるようにしようとしています。たとえば、1つの演算子と2つの整数だけを含む単純な9 + 8ではなく、7 * 7 + 1/50となります。問題は、複数の数値と演算子を持つ長い式を入力するたびに、最初の2つの数値だけが最初の演算子で計算されることです。この問題の良い解決策は何ですか?前もって感謝します。C#で配列を持つ簡単な計算機を作成する

static void Main() 
    { 
     while (true) 
     { 
      Console.WriteLine("Write an expression with two numbers and an operator with space in-between, for example, 4 + 2"); 
      string expression; 
      string[] array; 
      string[] array1; 
      expression = Console.ReadLine(); 
      array = expression.Split(); 
      array1 = Calculation(array); 
      Console.WriteLine("Press ENTER to write a new expression."); 
      Console.ReadLine(); 
      Console.Clear(); 
     } 

    } 
    static string[] Calculation(string[] arr) 
    { 
     double numLeft= 0.0; 
     double numRight = 0.0; 
     string sign = ""; 
     double result = 0.0; 
     int index = 1; 

     while (true) 
     { 
      numLeft = Convert.ToDouble(arr[0]); 
      sign = Convert.ToString(arr[index]); 
      numRight = Convert.ToDouble(arr[index + 1]); 
      index = index + 2; 
      if (sign == "+") 
      { 
       Console.Clear(); 
       Console.WriteLine(); 
       result= result + numLeft; 
      } 
      else if (sign == "-") 
      { 
       Console.Clear(); 
       result = result + numLeft; 
       numLeft = 0 - numRight; 
      } 
      else if (sign == "*") 
      { 
       Console.Clear(); 
       numLeft = numLeft * numRight; 
      } 
      else if (sign == "/") 
      { 
       Console.Clear(); 
       numLeft = numLeft/numRight; 
      } 
      else 
      { 
       break; 
      } 
      result = result + numLeft; 
      Console.WriteLine("Answer: {0}", result); 
      return arr; 
     } 
     return arr; 
    } 
+0

どのように異なる優先順位の演算子を扱いますか? '/'と '*'は '+'と ' - 'よりも高い優先度を持っています。このような複雑な表現を実装することは、それほど簡単ではないので、SOに関する単一の質問に対しては広すぎる。 – HimBromBeere

+0

@HimBromBeere私はそれについて実際には考えていませんが、正直言ってこの時点では私は本当に解決策がありません。 –

答えて

2

"while true"の最後に配列を戻すので、最初の2つだけが計算されるためです。

また、これは正しくありません。例えば:2 + 3 * 4 = 14、あなたの計算機が計算するように、20ではない。

0

これはいかがですか?

操作文字列を分割してリストに入力します。

7×7 + 1/50 => [7] [*] [7] [+] [1]〜[/] [50]

次にリストを通過し、*および/または操作を解きます。オペレータの1つに出会うと、演算子要素、その前と後の要素を削除し、結果と置き換えます。リストの長さが変わることに注意してください。オペレータ -

最初の反復=> [49] [+] [1]〜[/] [50] 第2の反復=> [49] [+] [0.02]

そして+及びために同じことを行います 最初の繰り返し=> [49.02]

リストに1つの要素しか残っていない場合は、その結果になります。簡単な計算のための

+0

アレイを使用している場合は、アレイのサイズが変わらないため、正確に行うことはできません。しかしそれ以外は、そうです。 – Noctis

+0

@Noctisあなたが正しいです、私はこの[] [] []のように書くだけで読みやすくしています。彼はList <>か何かで行くことができます(または毎回nea配列を作成します)。 – Lidaranis

+0

新しい配列を作ることは無駄でしょう(おそらく手に入るケースは問題ではありませんが、習慣:))。周辺にはたくさんのオプションがあります。彼はなぜそれが動作していない尋ねた、私は彼に理由を与えている:) – Noctis

0

が.NETの方法が存在する:

public static int Compute(string operation) 
{ 
    return new DataTable().Compute("7 * 7 + 1/50", null); 
} 

出典:C# Math calculator

あなたが本当にこれを実装したい場合は、私は、再帰的なバイナリツリーアルゴリズムを示唆しています。

擬似コード:そこに数学演算記号であり、このツリーをバイナリツリー 2.に回すとより大きな優先順位を持って業務を解決(* +の前に来る場所に 1.スプリット、着信文字列) 3.再帰は、2つの子リーフの値を返す必要があります。メインプログラムには1つの値しか得られません。

関連する問題