0

わかった。そこで、私は少し前に、さまざまな機能を実行する数式計算機を作成しました。今日それを開いたところ、特定の機能にアクセスしてその機能を終了するたびに、プログラムがメイン メニューに戻ることに気付きました。もちろんこれは問題なく、これを行うようにプログラムしましたが、電卓機能 (簡単な数学) にアクセスして方程式を完成させたときにイライラして、すぐに次のことができませんでした。「q」を押すまで特定の機能にとどまりたいと思います。その後、メインメニューに戻ります。

本当の問題は、関数が double しか受け入れないため、文字列 ('q') を入力すると、プログラムがクラッシュすることです。ユーザーに文字列またはdouble のいずれかを入力させる方法が必要です。これにより、それが「q」であり、ユーザーが終了したいかどうかを確認できます。

最終的にはすべての関数でこれを実行したいのですが、ここでは "calc" 関数 (最も単純なもの) だけを示します。

    int calculation()
{
  double x=0, y=0, answer=0;
  char o;//operator variable
  cout<<"calculation: ";
  cin>>x>>o>>y; //I just don't know what to use here so that the user can enter a  
  cin.ignore(); //double or a string.
  if (o=='+') answer=x+y;
  else if (o=='-') answer=x-y;
  else if (o=='*') answer=x*y;
  else if (o=='/') answer=x/y;
  else if (o=='^') answer= pow(x, y);
  else if (o=='%') {
        answer= (100/x)*y; 
        cout<<"answer= "<<answer<<"%";
  }
  if (o!='%') cout<<"answer= "<<answer;
  cin.get();
  return 0;
}

ユーザーが単一の「q」を入力するまで繰り返し続ける機能が必要です。言葉ばかりですみません。

4

1 に答える 1

2

次の 2 つの手順で解決します。

  1. 任意の文字列を受け入れ、「q」を入力したときにのみ終了するループを作成します。
  2. その文字列を新しい関数に渡します。この関数は、文字列を 2 つのオペランドと演算子に分解できる場合にのみ計算を実行します (これには stringstream を使用できます)。

その後、必要に応じて機能をカスタマイズできます。1 つの可能性は、演算子の文字列を、2 つのオペランドを取り、結果を出力するコールバックにマッピングすることです。次に、サポートする演算子の数を簡単に増やすことができるように、そのマッピングを計算関数に渡します。

これは、足し算でのみ機能する非常に大まかな例ですが、概念を示しています。

#include <iostream>
#include <cmath>
#include <sstream>
#include <map>
using namespace std;

typedef double (*p_fn)(double,double);

double add(double x, double y)
{
    return x + y;
}

typedef map<string,p_fn> operators;

double execute( const operators &op, double x, double y, const string& o )
{
    operators::const_iterator i = op.find(o);
    if( i != op.end())
    {
        p_fn f = i->second;
        double const result = f(x,y);
        return result;
    }
    cout<<"unknown operator\n";
    return 0;
}

bool get_data( double& x, double&y, string& o )
{
    string s1,s2,s3;
    cin>>s1;
    if(s1=="q")
        return false;
    cin>>s2>>s3;
    stringstream sstr;
    sstr<<s1<<" "<<s2<<" "<<s3;
    sstr>>x>>o>>y;
    stringstream sstr2;
    sstr2<<x<<" "<<o<<" "<<y;
    return sstr.str() == sstr2.str();
}

double calculation2( const operators& op )
{
    double x,y;
    string o;
    while(get_data(x,y,o))
        cout<<execute(op, x, y, o)<<"\n";
    return 0;
}

int main(int argc, char* argv[])
{
    operators o;
    o["+"]=add;
    calculation2(o);
    return 0;
}

この例では、関数へのポインターを使用して、文字列 "+" を関数 add(x,y) にマップします。また、stringstreams を使用して、非常に基本的な入力検証を実行します。

于 2012-12-13T03:39:01.763 に答える