Goblin Alive
Гуру
(3145)
7 месяцев назад
класс out_of_range;
Определяет тип объекта, который будет выдаваться как исключение. Сообщает об ошибках, которые являются следствием попытки доступа к элементам вне определенного диапазона.
Он может быть выдан функциями-членами семейств функций std::bitset и std::basic_string, std::stoi и std::stod, а также функциями доступа к элементам с проверкой границ (например, std::vector::at и std::map::at).
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;
}