Как в с++ выполняется сложение строк? в чем пробела моего кода? вот его фрагмент: int claculation() {} s = "2+2"; s += "=" + calculation(); //в итоге получается, что s = "2+2pause", хотя calculation возвращает 4. полный код: #include #include #include #include #include #include #include #includeusing 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 < s.length() - 1; i++) { inbrackets += s[i] == '(' ? 1 : s[i] == ')' ? -1 : 0; if (inbrackets < 0) end = true; } return inbrackets == 0 & & ! end & & s.length() > 0 & & s[0] == '(' & & s[s.length() - 1] == ')'; }vector parsing(string s) { vector parse; int inbrackets = 0; string s1 = ""; for (int i = 0; i < s.length(); i++) { if (s[i] == '(') inbrackets++; if (s[i] == ')') inbrackets--; if (inbrackets > 0 || s[i] ! = '+' & & s[i] ! = '*' & & s[i] ! = '-' & & 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 -> framework -> calculation. как исправить? int framework(string s) { if (toupper(s[0]) == 'c') { int inbrackets = 0; //надо ли здесь проверять скобки? string n = "", k = ""; for (int i = 2; i < s.size(); i++) if (s[i] == ',' & & 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. s. : : isdigit)) return stoi(s); cout < < "error"; exit(0); }int calculation(string s) { while (excessbrackets(s)) //удаление лишних внешних скобок: (s) => s. необходимо для parsing s = s.substr(1, s.length() - 2); vector parse = parsing(s); int firstm = -1; //нужна в следующем цикле для случая (a * b) * c => ((a * b) * c) (запомнает положение самой левой скобки в ряде произведений и делений) for (int i = 1; i < parse.size(); i += 2) //расстановка скобок для операций * и /, идущих подряд, чтобы правильно взять производную типа: a * b * c => (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 < 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. "0"); int rez = calculation(parse[0]); for (int i = 0; i < 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 < < "error"; exit(0); } rez /= divider; } else //если после числа идет не знак { cout < < "error"; exit(0); } return rez; }void print(string s) { map> symbols = { { '1',{ "#", "#", "#", "#", "#" } }, { '2',{ "###", " #", "###", "# ", "###" } }, { '3',{ "###", " #", "###", " #", "###" } }, { '4',{ "# #", "# #", "###", " #", " #" } }, { '5',{ "###", "# ", "###", " #", "###" } }, { '6',{ "###", "# ", "###", "# #", "###" } }, { '7',{ "###", "# #", " #", " #", " #" } }, { '8',{ "###", "# #", "###", "# #", "###" } }, { '9',{ "###", "# #", "###", " #", "###" } }, { '0',{ "###", "# #", "# #", "# #", "###" } }, { '+',{ " ", " # ", "###", " # ", " " } }, { '-',{ " ", " ", "###", " ", " " } }, { '*',{ " ", " ", "#", " ", " " } }, { '/',{ " ", " #", " # ", "# ", " " } }, { '(',{ " #", "# ", "# ", "# ", " #" } }, { ')',{ "# ", " #", " #", " #", "# " } }, { '=',{ " ", "###", " ", "###", " " } } }; for (int i = 0; i < 5; i++) { for (int j = 0; j < s.length(); j++) if (s[j] ! = ' ') cout < < symbols[s[j]][i] < < " "; cout < < "\n"; } }int main() { string s, s1; getline(cin, s1); for (int i = 0; i < s1.length(); i++) //удаляю пробелы if (s1[i] ! = ' ') s += s1[i]; //проверить на скобок s += "=" + calculation(s); print(s); system("pause"); return 0; }
278
346
Ответы на вопрос:
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Ven8Kedy12.04.2022 19:37
-
EgorT22228.08.2020 17:57
-
WowRenka13.04.2023 02:30
-
nzotov29917.11.2020 20:58
-
Anna0611103.05.2021 07:02
-
AkaneSan20.03.2021 12:31
-
Sofia111111111181131.01.2023 04:52
-
Vip6longin19.07.2020 21:42
-
дада21125.07.2021 08:04
-
Нурсултан0507201706.06.2020 07:23
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.