Памагите Даделать

  • Автор темы ivan94
  • Дата начала
I

ivan94

#1
Дана строка, представляющая собой корректное арифметическое выражение, содержащее только имена величин, константы, скобки, и знаки арифметических действий (плюс, минус). Раскройте скобки.

вот что я сделал..(ПРОБЛЕМА в том что если вложенные скобки например -2-(-2-(-2)) выводит бред памагите плиз)
:rolleyes:
C++:
#include <iostream>
#include <string>
using namespace std;

int main(){
string s;
cout << "s: "; getline(cin, s);
cout << s << " = ";


int left[10], right[10], c = 0, c1 = 0;
for (int i = 0; i < s.length(); i++){
if (s[i] == ' ') s.erase(i, 1);
if (s[i] == '(') left[c++] = i;
if (s[i] == ')') right[c1++] = i;
}
int t = 0;
for (int j = 0; j < c; j++){
if (left[j] == 0 || s[left[j] - 1] == '+'){s.erase(left[j], 1); s.erase(right[j] - 1, 1);t += 2;}
else{
if (s[left[j] + 1] != '+' && s[left[j] + 1] != '-') {s[left[j]] = '+'; s.erase(right[j], 1); t += 1;}
else{s.erase(left[j], 1); s.erase(right[j] - 1, 1);t += 2;}
for (int i = left[j] + 1; i < right[j]; i++){
if (s[i] == '+') s[i] = '-'; else
if (s[i] == '-') s[i] = '+';
}
}
left[j+1] -= t;right[j+1] -= t;
}
for (int i = 0; i < s.length(); i++){
if (s[i] == '+' && s[i + 1] == '-') s.erase(i, 1);
if (s[i] == '+' && s[i + 1] == '+') s.erase(i, 1);
if (s[i] == '-' && s[i + 1] == '+') s.erase(i + 1, 1);
if (s[i] == '-' && s[i + 1] == '-'){s[i] = '+'; s.erase(i + 1, 1); }
}
//--------------------------------------------------------

cout << s << endl;
system("pause");
return 0;
}
 
W

Whatka

#2
доделать?? :O_0:
надо полностью переделать
пробелы не все убирает
если внутри 1 скобок хотя бы ещё одни ,то вообще чушь показывает
если перед скобками минус то знаки не всем членам меняет

столько циклов и условий а работает только для примеров типа (1+2)
пересмотри алгоритм
 
W

Whatka

#4
s: - (-2+3) + 5-2- (3-6)
- (-2+3) + 5-2- (3-6) = - -2+3+5-2- +3+6
Для продолжения нажмите любую клавишу . . .
Для продолжения нажмите любую клавишу . . .

s: -1- (2+4+5-3-1-5)-0+ ( 7+2 -9)-2
-1- (2+4+5-3-1-5)-0+ ( 7+2 -9)-2 = -1- +2-4-5+3+1+5-0+ + 7-2 +9-2
Для продолжения нажмите любую клавишу . . .

проверь сам эти примеры(пробелы пораставь между знаками,числами и скобками и посиотри)

у меня Microsoft Visual Studio 2010 на 08 также работает
 
I

ivan94

#5
прочти вниматель........


Дана строка, представляющая собой корректное арифметическое выражение, содержащее только имена величин, константы, скобки, и знаки арифметических действий (плюс, минус). Раскройте скобки.


пробел не включается в ---
C++:
арифметическое выражение, содержащее только имена величин, константы, скобки, и знаки арифметических действий
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
Сложно понять код. Что делает это условие:
C++:
...
if (left[j] == 0 || s[left[j] - 1] == '+'){s.erase(left[j], 1); s.erase(right[j] - 1, 1);t += 2;}
...
? Почему, например left[j] сравнивается с нулем?
 
R

rrrFer

#7
Код:
int	f( char* str, bool fl ) {
int		i, v, j;
bool	fl_;

if( 0 == *str )
return -1;

i = 0;
fl_ = 0;
while( 0 != str[ i ] && ')' != str[ i ] ) {
if( str[ i ] == '+' )
fl_ = 0, i++;
else if( str[ i ] == '-' )
fl_ = 1, i++;
else if( str[ i ] == '(' ) {
if( fl )
fl_ = !fl_;
v = f( &str[ i + 1 ], fl_ );
if( v < 0 )
return -1;
i += v;
}
else {
char *w = new char[ 255 ];
j = 0;
if( fl )
fl_ = !fl_;
while( isalnum( str[ i ] ) || isalpha( str[ i ] ) )
w[ j++ ] = str[ i ++ ];
w[ j ] = 0;

std ::cout << (fl_?'-':'+') << w;
delete[] w;
}
}

if( 0 == str[ i ] )
return -1;

return i + 1;
}
Хотя, по-любому не лучший вариант.
-----------
почти не проверял, МБ неверно работает, но суть ИМХО отражает
 
I

ivan94

#8
пасути эта строка не работает пправильно. уже сам не помню зачем я это писал блин надо посидеть вспомнить((