0

好的。所以我不久前写了一个公式计算器,它有很多不同的功能。我今天打开它,发现每次我访问某个功能并完成该功能时,程序都会返回主菜单。当然这很好,我对其进行了编程来执行此操作,但是当我访问计算器功能(简单数学)并完成一个方程式时,我很生气,我不能马上做另一个。我希望能够停留在某个功能中,直到我按下“q”,然后它会返回主菜单。

真正的问题是我的函数只接受双精度,所以如果我输入一个字符串('q'),程序就会崩溃。我需要一种让用户输入字符串双精度的方法,以便我可以检查它是否是“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

分两步解决:

  1. 编写一个接受任何字符串并且仅在您输入“q”时退出的循环。
  2. 将该字符串传递给一个新函数,该函数仅在字符串可以分解为两个操作数和一个运算符时才执行计算(您可以为此使用 stringstream)。

之后,您可以根据需要自定义功能。一种可能性是将运算符的字符串映射到接受两个操作数并打印结果的回调。然后,您将该映射传递给您的计算函数,以便您支持的运算符数量可以轻松增加。

这是一个非常粗略的示例,仅适用于加法,但演示了这个概念。

#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)。它还使用字符串流来执行非常基本的输入验证。

于 2012-12-13T03:39:01.763 回答