Как в С++ производится сложение строк? В чем пробела моего кода?
Как в С++ производится сложение строк? В чем пробела моего кода? Вот его кусок:
int Claculation() ...
s = "2+2";
s += "=" + Calculation(); //В итоге выходит, что s = "2+2pause", желая Calculation отдаёт 4.
Полный код:
includelt;iostreamgt;
includelt;stringgt;
includelt;cstringgt;
includelt;vectorgt;
includelt;cstdlibgt;
includelt;algorithmgt;
includelt;mapgt;
includelt;setgt;using namespace std;int Factorial(int a)
return a == 0 ? 1 : Factorial(a - 1) * a;
bool ExcessBrackets(string s) //Поправить так, чтоб удаление излишних скобок происходило за 1 цикл
int inBrackets = 0;
bool end = false;
for (int i = 1; i lt; s.length() - 1; i++)
inBrackets += s[i] == '(' ? 1 : s[i] == ')' ? -1 : 0;
if (inBrackets lt; 0)
end = true;
return inBrackets == 0 amp;amp; !end amp;amp; s.length() gt; 0 amp;amp; s[0] == '(' amp;amp; s[s.length() - 1] == ')';
vectorlt;stringgt; Parsing(string s)
vectorlt;stringgt; parse;
int inBrackets = 0;
string s1 = "";
for (int i = 0; i lt; s.length(); i++)
if (s[i] == '(')
inBrackets++;
if (s[i] == ')')
inBrackets--;
if (inBrackets gt; 0 s[i] != '+' amp;amp; s[i] != '*' amp;amp; s[i] != '-' amp;amp; s[i] != '/')
s1.push_back(s[i]);
else
parse.push_back(s1);
parse.push_back(string(1, s[i]));
s1 = "";
parse.push_back(s1);
return parse;
int Calculation(string s); //Необходимо для рекурсивного вызова Calculation -gt; Framework -gt; Calculation. Как поправить?int Framework(string s)
if (toupper(s[0]) == 'C')
int inBrackets = 0; //Надо ли здесь проверять скобки?
string n = "", k = "";
for (int i = 2; i lt; s.size(); i++)
if (s[i] == ',' amp;amp; inBrackets == 0)
n = s.substr(2, i - 2);
k = s.substr(i + 1, s.size() - i - 2);
break;
else
inBrackets += s[i] == '(' ? 1 : s[i] == ')' ? -1 : 0;
return Factorial(Calculation(n)) / Factorial(Calculation(k)) / Factorial(Calculation(n + "-" + k));
if (all_of(s.begin(), s.end(), ::isdigit))
return stoi(s);
cout lt;lt; "Error";
exit(0);
int Calculation(string s)
while (ExcessBrackets(s)) //Удаление излишних наружных скобок: (s) =gt; s. Нужно для Parsing
s = s.substr(1, s.length() - 2);
vectorlt;stringgt; parse = Parsing(s);
int firstm = -1; //Нужна в последующем цикле для варианта (a * b) * c =gt; ((a * b) * c) (запомнает положение самой левой скобки в ряде творений и разделений)
for (int i = 1; i lt; parse.size(); i += 2) //Расстановка скобок для операций * и /, идущих подряд, чтоб правильно брать производную типа: a * b * c =gt; (a * b) * c
if (parse[i] == "*" parse[i] == "/") //Учитывать, что может быть унарный знак
if (firstm == -1)
firstm = i - 1;
parse[i + 1] += ")";
parse[firstm] = "(" + parse[firstm];
s = "";
for (int i = 0; i lt; parse.size(); i++)
s += parse[i];
while (ExcessBrackets(s)) //Если были только умножения
s = s.substr(1, s.length() - 2);
parse = Parsing(s);
if (parse.size() == 1)
return Framework(parse[0]);
if (parse[0] == "-" parse[0] == "+")
parse.insert(parse.begin(), "0");
int rez = Calculation(parse[0]);
for (int i = 0; i lt; parse.size() - 1; i += 2) //Проверить два попорядку идущих знака
if (parse[i + 1] == "-")
rez -= Calculation(parse[i + 2]);
else if (parse[i + 1] == "+")
rez += Calculation(parse[i + 2]);
else if (parse[i + 1] == "*")
rez *= Calculation(parse[i + 2]);
else if (parse[i + 1] == "/")
int divider = Calculation(parse[i + 2]);
if (divider == 0) //Проверка на деления на ноль
cout lt;lt; "Error";
exit(0);
rez /= divider;
else //Если после числа идет не знак
cout lt;lt; "Error";
exit(0);
return rez;
void Print(string s)
maplt;char, vectorlt;stringgt;gt; symbols = '1', "",
"",
"",
"",
"" , '2', "",
" ",
"",
" ",
"" , '3', "",
" ",
"",
" ",
"" , '4', " ",
" ",
"",
" ",
" " , '5', "",
" ",
"",
" ",
"" , '6', "",
" ",
"",
" ",
"" ,
'7', "",
" ",
" ",
" ",
" " , '8', "",
" ",
"",
" ",
"" , '9', "",
" ",
"",
" ",
"" , '0', "",
" ",
" ",
" ",
"" , '+', " ",
" ",
"",
" ",
" " , '-', " ",
" ",
"",
" ",
" " , '*', " ",
" ",
"",
" ",
" " , '/', " ",
" ",
" ",
" ",
" " , '(', " ",
" ",
" ",
" ",
" " , ')', " ",
" ",
" ",
" ",
" " , '=', " ",
"",
" ",
"",
" " ;
for (int i = 0; i lt; 5; i++)
for (int j = 0; j lt; s.length(); j++)
if (s[j] != ' ')
cout lt;lt; symbols[s[j]][i] lt;lt; " ";
cout lt;lt; "\n";
int main()
string s, s1;
getline(cin, s1);
for (int i = 0; i lt; s1.length(); i++) //Удаляю пробелы
if (s1[i] != ' ')
s += s1[i];
//Проверить на баланс скобок
s += "=" + Calculation(s);
Print(s);
system("pause");
return 0;
-
Вопросы ответы
Статьи
Информатика
Статьи
Математика.
Физика.
Математика.
Разные вопросы.
Разные вопросы.
Математика.
Разные вопросы.
Математика.
Физика.
Геометрия.