• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

ivan94

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

вот что я сделал..(ПРОБЛЕМА в том что если вложенные скобки например -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

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

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

ivan94

Работает тока если скобки не вложеные я незнаю что у тебя с билдэром!
 

Вложения

  • Безымянный.png
    Безымянный.png
    8,3 КБ · Просмотры: 513
W

Whatka

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

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


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


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

lazybiz

Сложно понять код. Что делает это условие:
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

Код:
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

пасути эта строка не работает пправильно. уже сам не помню зачем я это писал блин надо посидеть вспомнить((
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!