3

編集-助けてくれてありがとう。私はswitchステートメントを実行することさえ考えていませんでした。どういうわけか、私はC++がJavaとは大きく異なると考え続けています...それはスイッチで多くの意味を成します..それを私の注意を引いてくれてありがとう。

オペレーターを適切に返却し、返却後に使用するにはどうすればよいですか?入力から演算子を取得し、その有効な入力を確認する関数を作成しました。これは、そのために作成したコードです(演算子は、C ++で予約された名前であり、医師が操作を行うため、医師と呼びました。 ...ごめんなさい..ただばかげている)...:

string doctor()
{
    string getDoc;

    cin >> getDoc;

    if (getDoc == "*")
        return "*";

    if (getDoc == "/")
        return "/" ;

    if (getDoc == "-")
        return "-" ;

    if (getDoc == "+")
        return "+" ;

    else 
    {
        cout << "You entered " << getDoc << " please only use +,-,*,/ : ";
        return doctor();
    }
}

値が返されるとき、私は私のmain()に次のことをさせます(それはそれを "operation"変数に返します...:

cout << firstNum << operation << secondNum << " is " << answer;

私はその演算子を除いてすべてが機能しています...どうすればそれが必要なことを実行することができますか..言い換えれば、その*の場合は乗算など...

これが基本的なものである場合は申し訳ありませんが、私はC ++を初めて使用するため、これをグーグルで検索しても結果は得られませんでした...

ありがとう!

4

7 に答える 7

2

Well, you have to compare chars anyway. But the shorter way is to use (if you have sign in char)

switch(sign) { 
    case '*':
    case '/':
    case '+':
    case '-':
        string str; str += sign;
        return str; 
    default:
        return "error message";
}

OR

if(sign == "+" || sign == "-" || sign == "/" || sign == "*")
    return sign;
else
    return "Error message";
于 2012-10-05T11:11:02.730 に答える
1

古典的なアプローチは、ここでスイッチケース構造を使用することです。'*'が与えられ、引数を乗算します。' /'が与えられた場合は、除算します。

double doctored(char operation, double arg1, double arg2) {
    switch (operation) {
        case '+': return arg1+arg2;
        case '-': return arg1-arg2;
        case '*': return arg1*arg2;
        case '/': return arg1/arg2;
        default:  // ignore
            return arg1;
    }
}
于 2012-10-05T11:14:58.563 に答える
0

入力ストリームを取得する関数で行ったのと同じ方法でケースに入れることができます。

float result;
switch(operation) {
    case '*':
        result = firstNum * secondNum;
        break;
    case '/':
        result = firstNum / secondNum;
        break;
    case '+':
        result = firstNum + secondNum;
        break;
    case '-':
        result = firstNum - secondNum;
        break;
}
cout << firstNum << operation << secondNum << " is " << result;
于 2012-10-05T11:14:24.057 に答える
0

返された文字列から、関数または呼び出し可能オブジェクト(ファンクター)を選択できます。たとえば、if-elseを使用することも、。を使用することもできますstd::map。次に、関数または呼び出し可能オブジェクトを使用して、それを呼び出すだけです。

于 2012-10-05T11:14:43.260 に答える
0

すでに検証を行ったのと同じように操作を行うことができます。

if (operation == "*")
    answer = firstNum *secondNum;

など(または、私の仲間の回答者によって提案されたように、スイッチケースで両方を実行します)。ただし、より良いアプローチは、文字列を解析し、演算子情報を(列挙型として)内部に格納するクラスを作成することです。2つの数値に操作を適用して結果を返すメソッドを指定し、テキスト表現を文字列として返す別のメソッドを実装します。次に、データを視覚的表現から切り離しました。(文字列を取得し、そこから目的の演算子を抽出するメソッドを忘れないでください;))

于 2012-10-05T11:16:03.633 に答える
0

doctor(operator)の使用法は、オペランドがクラスのインスタンスである場合はオペランドに依存します。オペランドをオーバーロードする必要がありoperatorます。そうでない場合は、1,2,3引数を取る演算子ごとに1つの関数を記述できると思います。操作の値に応じて必要な関数が呼び出され、必要な結果が返されるswitchステートメントを使用する場合

于 2012-10-05T11:16:08.110 に答える
0

計算を行う別のメソッドを作成し、それを呼び出します。

float doDoctoryStuff(float a, float b, const char op)
{
  switch(op) {
    case '*':
      return a * b:
      break;
    ...
    ...
    ...
 }
}

あなたのメインで

cout << firstNum << operation << secondNum << " is ";
cout << doDoctoryStuff(firstNum, secondNum, doctor().c_str());
于 2012-10-05T11:17:07.843 に答える