私はコンソール電卓で作業しているビジュアルC ++を使用しています。ユーザーがカスタム線形関数を定義できるようにする方法を作成しています。ここで困惑します。ユーザーが希望する関数の名前、勾配、および y 切片を取得したら、そのデータを使用して、muParser に渡すことができる呼び出し可能な関数を作成する必要があります。
muParser では、次のようにカスタム関数を定義します。
double func(double x)
{
return 5*x + 7; // return m*x + b;
}
MyParser.DefineFun("f", func);
MyParser.SetExpr("f(9.5) - pi");
double dResult = MyParser.Eval();
ユーザーが入力した値「m」と「b」に基づいてこのような関数を動的に作成し、それを「DefineFun()」メソッドに渡すにはどうすればよいですか? これは私がこれまでに持っているものです:
void cb_SetFunc(void)
{
string FuncName, sM, sB;
double dM, dB;
bool GettingName = true;
bool GettingM = true;
bool GettingB = true;
regex NumPattern("[+-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?");
EchoLn(">>> First, enter the functions name. (Enter 'cancel' to abort)");
EchoLn(">>> Only letters, numbers, and underscores can be used.");
try
{
do // Get the function name
{
Echo(">>> Enter name: ");
FuncName = GetLn();
if (UserCanceled(FuncName)) return;
if (!ValidVarName(FuncName))
{
EchoLn(">>> Please only use letters, numbers, and underscores.");
continue;
}
GettingName = false;
} while (GettingName);
do // Get the function slope
{
Echo(">>> Enter slope (m): ");
sM = GetLn();
if (UserCanceled(sM)) return;
if (!regex_match(sM, NumPattern))
{
EchoLn(">>> Please enter any constant number.");
continue;
}
dM = atof(sM.c_str());
GettingM = false;
} while (GettingM);
do // Get the function y-intercept
{
Echo(">>> Enter y-intercept (b): ");
sB = GetLn();
if (UserCanceled(sB)) return;
if (!regex_match(sB, NumPattern))
{
EchoLn(">>> Please enter any constant number.");
continue;
}
dB = atof(sB.c_str());
GettingB = false;
} while (GettingB);
// ------------
// TODO: Create function from dM (slope) and
// dB (y-intercept) and pass to 'DefineFun()'
// ------------
}
catch (...)
{
ErrMsg("An unexpected error occured while trying to set the function.");
}
}
ユーザー定義関数ごとに個別のメソッドを定義する方法はないと考えていました。vector<pair<double, double>> FuncArgs;
適切な勾配と y 切片を追跡し、関数から動的に呼び出す必要がありますか? に渡すときに使用するペアを指定するにはどうすればよいDefineFun(FuncStrName, FuncMethod)
ですか?