Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Кто может взглянуть опытным глазом на программу?

Анна Кулаева Знаток (310), закрыт 7 месяцев назад
У меня программа на решение примера в виде слитной строки (со скобками, умножением, делением, сложением и вычитанием) вроде бы правильная, и выдается только одна ошибка:

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase: __pos (which is 18446744073709550490) > this->size() (which is 3)

Я не могу понять почему, не подскажете?

Вот код программы:

#include <iostream>
#include <cctype>
#include <string>
using namespace std;

void UMandDEL(string& s, int i, int j){
for(i; i < j - 1; ++i){
if(s[i] == char(42)){
s[i] = char((int(s[i - 1]) - 48) * (int(s[i + 1]) - 48) + 48);
s.erase(i - 1, 1);
s.erase(i + 1, 1);
}
if(s[i] == char(47)){
s[i] = char((double(s[i - 1]) - 48) / (double(s[i + 1]) - 48) + 48);
s.erase(i - 1, 1);
s.erase(i + 1, 1);
}
}
return;
}

void PLUSandMINUS(string& s, int i, int j){
for(i; i < j - 1; ++i){
if(s[i] == char(43)){
s[i] = char((int(s[i - 1]) - 48) + (int(s[i + 1]) - 48) + 48);
s.erase(i - 1, 1);
s.erase(i + 1, 1);
}
if(s[i] == char(45)){
s[i] = char((int(s[i - 1]) - 48) - (int(s[i + 1]) - 48) + 48);
s.erase(i - 1, 1);
s.erase(i + 1, 1);
}
}
return;
}

void skobki(string& s){
int j = 0;
while(s[j] == char(41)){
j += 1;
}
int i = j;
while(s[i] != char(40)){
i = i - 1;
}
UMandDEL(s, i, j);
PLUSandMINUS(s, i, j);
s.erase(i, 1);
s.erase(j, 1);
return;
}

void reshenie(string& s){
skobki(s);
if(s.size() != 1){
reshenie(s);
}else{
return;
}
}

int main(){
string s;
cin >> s;
s = "(" + s + ")";
reshenie(s);
cout << s;
return 0;
}
Лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264440) 7 месяцев назад
выход за пределы диапазона. после удаления элемента, надо уменьшать i
Анна КулаеваЗнаток (310) 7 месяцев назад
тоесть после удаления уменьшить i и j?
Анна КулаеваЗнаток (310) 7 месяцев назад
чтобы не выходило за указанный диапазон строки?
Анна КулаеваЗнаток (310) 7 месяцев назад
j тоже надо уменьшать?
Анна КулаеваЗнаток (310) 7 месяцев назад
можете пожалуйста исправить
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264440) Анна Кулаева, лучше переписать это г.. код. Переводим строку в Reverse Polish Notation (постфикс) и применяем стек: https://onlinegdb.com/EsV6fX98z
Остальные ответы
Goblin Alive Гуру (3145) 7 месяцев назад
класс out_of_range;
Определяет тип объекта, который будет выдаваться как исключение. Сообщает об ошибках, которые являются следствием попытки доступа к элементам вне определенного диапазона.

Он может быть выдан функциями-членами семейств функций std::bitset и std::basic_string, std::stoi и std::stod, а также функциями доступа к элементам с проверкой границ (например, std::vector::at и std::map::at).
Похожие вопросы