[如果我有字符串4+6*7/2
,我想要一个计算值的函数,在这种情况下为25。为此,我编写了一个递归函数,该函数逐个字符地分析字符串。
基本算法如下(或应该这样):如果我们现在分析的字符是正常密码,并且没有遇到运算符(+,-,*,/),但是我们将其存储在名为first_nr
的字符串中,该字符串最终将成为该字符的左侧。运营商。直到遇到操作员之前,我们都会这样做。如果遇到运算符,我们将存储哪个运算符,以便我们以后知道要做什么。因为遇到了一个运算符,所以我们现在必须将以下数字添加到另一个名为second_nr
的字符串中,该字符串最终将成为该运算符右侧的数字。 [直到这里我都实现了]当然,我们还需要考虑计算的顺序,因此我将首先忽略所有的优缺点,直到分析所有的时间和除数。
这样,例如,如果我有以下操作字符串:123+789+4
。我的函数首先将123
放在first_nr
中,然后查看一个运算符并将+
存储在operator
中。因为现在operator != NULL
会将以下数字添加为789
到second_str
。结合这三个参数,在这种情况下,我们可以形成first_nr + operator + second_str
。我的程序需要在遇到下一个运算符之前执行该程序,因此在这种情况下它将形成123+789
并且重复递归。
我做了一些努力,但仍然有很多漏洞。现在,如果我能运行字符串912+4
,我将很高兴。因此,请忽略加号之外的所有运算符,忽略计算顺序(第一次加和除,再加上加号和最小值),并忽略一个字符串中的多个运算符。
如果我可以运行最基本的字符串,那么我将改进算法,使其也可以处理更复杂的字符串。
我的努力:
12+5
问题是#include <iostream>
#include <string>
#include <algorithm>
//Enumeration of all the possible
//math operators
enum Operator {
PLUS,
MIN,
TIMES,
DIVIDE,
UNDEFINED
};
/************************IGNORE********************/
Operator charToOperator(char c) {
switch(c) {
case '+':
return Operator::PLUS;
break;
case '-':
return Operator::MIN;
break;
case '*':
return Operator::TIMES;
break;
case '/':
return Operator::DIVIDE;
break;
default:
return Operator::UNDEFINED;
break;
}
}
/***************************************************/
/*
* Recursive function performing all the calculations from an action string.
* For example, if the string actions has value "5+7" in the first recursive run
* result should contain 12 after the last recursion.
*
* :param result: Double containing the calculated result after the last recursion
* :param actions: Action string (what you type in your calculator; e.g: 5+5). We analyze the first character of this string each time and add it to first_nr, second_nr, or make it the operator. First character gets deleted after each recursion
* :param first_nr: Empty at first recursion, number of left side of the operator. So in 55+77 this paramater will be "55". Gets resetted at the next operator
* :param second_nr: Idem as first_nr but for the right side of the operator.
* :param oper: Operation to calculate the first_nr and second_nr
*/
int calculate(double& result, std::string& actions, std::string& first_nr, std::string& second_nr, Operator& oper) {
//Base-condition:
//If action string is empty return
if (actions == "") {
return result;
}
//Get first character from action string
char c = actions[0];
//If first character is an operator
char operatorInChar[] = {'+', '-', '*', '/'};
if (std::find(std::begin(operatorInChar), std::end(operatorInChar), c) != std::end(operatorInChar)) {
//If operator is not yet set in a previous recursion
if (oper == NULL || oper == Operator::UNDEFINED) {
oper = charToOperator(c);
//If second_nr is not empty, we need to calculate the two numbers together
if (second_nr != "") {
//Update result
result = std::stod(first_nr) + std::stod(second_nr); //For now we only implement plus
//Calculation is done, so reset first_nr, second_nr and operator
//for the next 'first_nr [operator] second_nr' block in the action string
first_nr = "";
second_nr = "";
oper = Operator::UNDEFINED;
}
}
} else {
//If the character is not a operator but a number we append it to the correct nr
//we add to first_nr if the operator is not yet set, if we already encountered an operator
//we add to second_nr.
//e.g: actions = "123+789"
if (oper == NULL || oper == Operator::UNDEFINED) {
first_nr += c;
} else {
second_nr += c;
}
}
//Remove first character from action string because it's analysed in this recursion
actions = actions.erase(0, 1);
//Make recursive call
return calculate(result, actions, first_nr, second_nr, oper);
}
int main() {
//String we want to calculate
std::string str = "5+7";
std::string str_copy_for_output = str;
//Variables
double result = 0;
std::string first_nr = "";
std::string second_nr = "";
Operator oper = Operator::UNDEFINED;
//Call function
int calculation = calculate(result, str, first_nr, second_nr, oper);
//Output
std::cout << str_copy_for_output << " = " << calculation << std::endl;
return 0;
}
始终为0。将不胜感激!
oper是未定义的(由于它不是指针,因此不能为NULL;编译器会警告您),first_nr为“”,second_nr为“”,动作为“ 5 + 7”。
printf
被执行。first_nr += c;
被执行。oper = charToOperator(c);
中,因此actions
将永远不会出现在actions[0]
中,并且该分支也将不再执行。您可能需要在字符串末尾另外执行它。