我在接受采访时被问到一个问题,想知道解决问题的方案方法。
Que:我们有一个文本文件,其中包含需要在程序中执行的操作。用户可以更新此文本文件并更改操作,即文本文件可以包含+用于添加或 - 用于减法。程序有两个变量即a和b,读取文本文件,执行操作和显示结果。如果文本文件包含+,则程序应返回a和b的总和,如果文本文件有 - 则程序应返回a-b。用户可以将任何操作放在文本文件中。
我给出了两种方法:
程序中可以包含switch语句。如果文本文件有+,程序检查switch语句并按照switch语句执行+ b操作,就像其他操作一样明智。这个答案被拒绝,因为我们必须在交换机中硬编码所有可能的操作。
我可以使用oracle并对任何操作运行查询,即如果文本文件有+,那么我可以创建一个sql字符串,如'select a + b into:result from dual;'并在程序中运行嵌入式sql。数据库将执行sql并返回任何有效操作的输出,程序不需要硬编码所有可能的操作。当我接受C ++ / C和pro * c的采访时,我给出了这个答案。但小组对此方法也不满意。
那么通过程序解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
可能是这样的,具有类似原型的函数的查找表
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
typedef int (*function_cb)(int,int);
std::map<string, function_cb> callBacks;
.....
void init_lookup()
{
callBacks["+"] = &add;
callBacks["-"] = ⊂
}
然后根据您的文本文件使用它
int res = callBacks["-"](8,4);
-
,8
,4
来自您的文字文件
答案 1 :(得分:0)
要从输入文件中读取表达式,您可以使用标准库提供的标准读取方法:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
cout << line << '\n';
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
(代码取自cplusplus.com)
关于翻译从文件中获得的字符串...你会深入到表达式树中。要使用表达式树,您可以查看下面的代码。这是我过去写的一个解释这个概念的人:
class Token
{
public:
enum TokenTypes { operator_token, operand_token };
Token();
Token( std::string token );
~Token(); // we are not inheriting, so no need to be virtual
Token(const Token &in);
Token& operator=(const Token &in);
TokenTypes getId() const;
// you need to set the left/right from addToken(), see class Tree
void setLeft(Token* left);
void setRight(Token* right);
const Token* getLeft();
const Token* getRight();
private:
// when creating the Token you need to be able to identify
// what TokenType the string is
TokenTypes tokenId( std::string token );
TokenTypes m_id; // type of token
std::string m_token; // the actual string token e.g. "+", "12", ..
Token* m_left; // the pointers to the children left or right in a binary tree
Token* m_right;
};
class Tree
{
public:
Tree();
~Tree(); // clean up
void addToken( std::string token ); // this adds a token to the tree
private:
Token* m_root;
};
然后你可以像这样使用它......
std::string strToken
Tree T;
while ( getNextStringToken(strToken) )
{
Token* newToken = new Token(strToken);
T.addToken(newToken);
}
您可以在Wikipedia上了解有关此概念的更多信息。
我希望这可以帮到你!
答案 2 :(得分:0)
在我看来,他们只想读取字符+, - ,*并将此字符放在变量之间并执行语句。
有关如何将字符串转换为表达式的信息,请参阅此答案Convert string to mathematical evaluation
答案 3 :(得分:-1)
我认为这些问题更像是运算符重载,你可以定义当操作数是函数/非标准变量时正常运算符会做什么。