2017-05-09 10 views
1

私は、複数の数字を入力して文字列を式として読み取るコンソール電卓を構築しています。正規表現のない文字列からの複数の数字

例:

string inputNumber = "190+154+114" 
double[] number = new double[5]; 

私はこのようになりたい:

number[0] = 190; 
number[1] = 154; 
number[2] = 114; 

私は図書館があることを知っているが、それにやるが、私は看板を読み、どのように理解したいですその番号を配列に入れます。

私が考えることができるのは、文字列を単一の文字として読み取ることです。次に、「+」文字を見つけると、文字として次の数字をcharacter!="null" || character=='+'まで読み込みます。しかし、問題は私がコードに変換する方法を知らないということです。

============================================== ========================== EDIT

私は答えを読んで、本当に面白いと感じました。しかし、演算子記号が挿入されたときに新しい文字列を作成するにはどうすればよいですか?

例:オペレータが入力されたとき、新しい文字列は次のようにする必要がありので

string inputNumber = string.Empty; 
string[] number = new string[20]; 
//Input number 
Console.WriteLine("enter a number"); //190+155+220 
inputNumber = Console.ReadLine(); 

ので、どのように、文字列を取得します:

number[0] = "190"; 
number[1] = "155"; 
number[2] = "220"; 
+1

は、それは+常にありますか?私は+が実際にサインですエンコーディングのこの種のを見てきましたし、あなたが得ることができます - だけでなく、負の数のために –

+0

あなたはまた、オペレータを保存すると、その後の数学をしますか?そして、かっこを受け入れ、演算子の優先順位を強制しますか? –

+1

あなたがしようとしていることを明確にすることはできますか? 「+」文字で区切られた数字を分割しようとしているのですか?「1024/16 *(7 + 3)」のような算術式を評価しようとしていますか?後者の場合は、[パーサの書き方](http://stackoverflow.com/questions/7377344/)を参照してください。 –

答えて

2

これは私の作品:

string inputNumber = "190+154+114"; 
double[] number = inputNumber.Split('+').Select(x => double.Parse(x)).ToArray(); 

私はこれを取得します:

number

もちろん、他の数学演算、特に負の数を持つ-と括弧が必要な場合は、これはもっと複雑になります。あなたが本当に必要なもの

は数式を解析し、式ツリーを生成するための方法です。

+0

.Split({'+'、 ' - '、 '/'、 '*'}) –

+0

@AndrewHarris - これは演算子に関する情報を削除します。別々にそれぞれを行い、削除する演算子を追跡する必要があります。 – Enigmativity

+0

あなたは正しいです。私は分割されたアイテムを配列のアイテムとして残したと思った。 –

1

私の元の答えはちょうど '+'文字に分割されていましたが、計算機を作成している場合は演算子を保存してから数学を行う必要があるようです。そうであれば、それを行う別の方法があります。

まず、操作する既知の演算子の配列を作成します。次に、これらの演算子を検索して文字列を分割します。私たちが見つけられるたびに、前の演算子から現在の文字列に至る文字列を取得し、それを '数字' List<double>に格納して、現在の演算子を取得し、 '演算子' List<char>に格納します。最後に、最後の数値(最後の演算子の後の残りの文字列)を取得します。

演算子よりも1つ多い数値があることを確認できます(不一致があると、出力が不正な場合があるため)。文字列が適切な形式であると仮定すると、最初の数値をresultとして保存し、次の演算子と次の数値を読み取り、resultで演算を実行できます。オペレータの優先順位を実装するためにあなたに任せておきます!

たぶんコードはすべてのそれらの言葉よりも読みやすいです:

static void Main() 
{ 
    var knownOperators = new[] { '+', '-', '*', '/' }; 

    // Get input string from user 
    Console.Write("Please input a math string: "); 
    string inputNumber = Console.ReadLine(); // "190+154+114"; 

    var numbers = new List<double>(); 
    var operators = new List<char>(); 
    double tmp = 0; 

    // We will break up the string by searching for operators. Each time we find 
    // one, we grab the string from the previous operator to the current one and 
    // store it in 'numbers' as a double, then we grab the current operator and 
    // store it in 'operators' as a char. At the very end, we grab the last number. 
    var previousOperatorIndex = 0; 
    var operatorIndex = inputNumber.IndexOfAny(knownOperators, previousOperatorIndex); 
    while (operatorIndex > -1) 
    { 
     // Add the number part - the string from the previous operator to this one 
     if (double.TryParse(inputNumber.Substring(previousOperatorIndex, 
      operatorIndex - previousOperatorIndex), out tmp)) 
     { 
      numbers.Add(tmp); 
     } 

     operators.Add(inputNumber[operatorIndex]); 
     previousOperatorIndex = operatorIndex + 1; 
     operatorIndex = inputNumber.IndexOfAny(knownOperators, previousOperatorIndex); 
    } 
    // Add the last number (after the last operator) 
    if (double.TryParse(inputNumber.Substring(previousOperatorIndex), out tmp)) 
    { 
     numbers.Add(tmp); 
    } 

    // Validate we have one more number than operator 
    if (numbers.Count < (operators.Count + 1)) 
    { 
     Console.WriteLine("Error: there were too many operators!"); 
    } 
    else if (numbers.Count > (operators.Count + 1)) 
    { 
     Console.WriteLine("Error: there were too many numbers!"); 
    } 
    else 
    { 
     // Do the math! 
     double result = numbers[0]; 

     for (int i = 1; i < numbers.Count; i++) 
     { 
      switch (operators[i - 1]) 
      { 
       case '+': 
        result += numbers[i]; 
        break; 
       case '-': 
        result -= numbers[i]; 
        break; 
       case '*': 
        result *= numbers[i]; 
        break; 
       case '/': 
        result /= numbers[i]; 
        break; 
       default: 
        break; 
      } 
     } 

     Console.WriteLine("The result is: {0}", result); 
    } 

    Console.Write("\nDone!\nPress any key to exit..."); 
    Console.ReadKey(); 
} 
関連する問題