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

Тема в разделе "C/C++/C#", создана пользователем ivan94, 30 ноя 2011.

  1. ivan94

    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;
    }
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    доделать?? :O_0:
    надо полностью переделать
    пробелы не все убирает
    если внутри 1 скобок хотя бы ещё одни ,то вообще чушь показывает
    если перед скобками минус то знаки не всем членам меняет

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

    ivan94 Гость

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

    Вложения:

  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    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 также работает
     
  5. ivan94

    ivan94 Гость

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


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


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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Сложно понять код. Что делает это условие:
    Код (C++):
    ...
    if (left[j] == 0 || s[left[j] - 1] == '+'){s.erase(left[j], 1); s.erase(right[j] - 1, 1);t += 2;}
    ...
    ? Почему, например left[j] сравнивается с нулем?
     
  7. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
    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;
    }
    Хотя, по-любому не лучший вариант.
    -----------
    почти не проверял, МБ неверно работает, но суть ИМХО отражает
     
  8. ivan94

    ivan94 Гость

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

Поделиться этой страницей