Как исправить неверный вывод файла после чтения символов из стека - PullRequest
0 голосов
/ 06 мая 2019

Моя программа записывает неверные данные в мой выходной файл, и я не уверен, почему это происходит.По сути, я пытаюсь проверить, сбалансировано ли уравнение, определив, есть ли пропущенные скобки или скобки.Эти уравнения читаются из входного файла.Чтобы проверить, сбалансированы ли они, я использую стек.По какой-то причине моя программа либо переоценивает количество пропущенных символов, либо даже не распознает, что пропущен символ.

По результатам тестирования, которое я пытался сделать, моя программа может зацикливаться большераз, что это должно быть в некоторых местах.Однако я не совсем уверен.Я также пытался протестировать свою программу с меньшим размером ввода, но это не сработало.

Вот соответствующий код.Следует отметить, что это для задания, в котором мне предлагается не использовать шаблон STL.Мои функции для стека в основном работают так же.Моя поп-функция удаляет все, что находится наверху стека, и копирует его в символьную переменную

//create stack
DynStack mystack;

//pushes elements to stack
for (int i=0; i<size; i++) {
    if (array[i] == '(' || array[i] == '[') {

        mystack.push( array[i] );
        continue;
    }

    // Stack will remain empty until an
    // an open character is reached.
    // While empty, opening characters are missing
    if ( mystack.isEmpty() ) {

        if (array[i] == ')') {

            closedP++;
        }

        else if ( array[i] == ']' )
      ;
        ClosedB++;
    }



    //compares stack to elements in array.
    // if the do not match, then an element is missing.
    if (array[i] == ')') {
        mystack.pop(c);

        if ( c == '[' ) {
            openP++;
        }
    }

    if ( array[i] == ']' ) {
        mystack.pop(c);

        if (c == '(') {
            OpenB++;
        }
    }
}


//if there is still an element left in the stack
//after checking the entire expression, it is either
//missing a ')' or a ']'
if (!mystack.isEmpty()) {
    mystack.pop(c);
    if (c == '(') {
        closedP++;
    }
    else if (c == '[')
        ClosedB++;
}

// cout<<"OP: "<<openP<<endl<<"CP: "<<closedP<<endl<<
// "OpenB "<<OpenB<<endl<<"CB: "<<ClosedB<<endl;
//  cout<<"total: "<<totalmissing<<endl;

totalmissing=openP+closedP+OpenB+ClosedB;

//prints valid expression
if (totalmissing == 0) {
    outfile<<math<<" "<< "=== "
    <<"valid expression"<<endl;
}

//prints the amount of each element missing to output file
//if the number of missing elements is less than 6
if ( totalmissing >= 1 && totalmissing < 6 ) {
    outfile<<math<<" "<< "=== "<<"missing "
    <<"("<<openP<<") "<<"('s"<<" and "<<"("<<closedP<<") "<<")'s"
    <<" and "<<"("<<OpenB<<") "<<"['s"<<" and "<<"("<<ClosedB
    <<") "<<"]'s"<<endl;
}

// expression is missing 6 or more elements
if (totalmissing >= 6 || OpenB >=6
    || ClosedB>=6 ||openP >=6 || closedP >=6 ) {
    outfile<<math<<" "<<"6 or more elements are missing"<<endl;
}

Учитывая мой ввод чего-то вроде этого:

a+(b/c)*abcd(efgh
(60+[efg]+[efm)
70+1]
)aphids(
]dkdjsfg-4tw[abds()

Я долженскажите пользователю, если выражение допустимо, а если нет, скажите, что отсутствует.Если пропущено более 6, я должен сказать им об этом.

Как вы увидите, основываясь на том, что я вам дал, мои выводы о том, что не так с предоставленными мною выражениями, неверны.

a+(b/c)*abcd(efgh 6 or more elements are missing
(60+[efg]+[efm) === missing (1) ('s and (1) )'s and (0) ['s and (0) ]'s
70+1] 6 or more elements are missing
)aphids( 6 or more elements are missing
]dkdjsfg-4tw[abds() 6 or more elements are missing

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 06 мая 2019

Правильный отступ важен для чтения кода.Эта часть выглядит подозрительно:

if ( mystack.isEmpty() ) {

    if (array[i] == ')') {

        closedP++;
    }

    else if ( array[i] == ']' )
  ;
    ClosedB++;
}

На самом деле это:

if ( mystack.isEmpty() ) {

    if (array[i] == ')') {

        closedP++;
    }

    else if ( array[i] == ']' )
        ;        // noop here
    ClosedB++;   // always executed (if stack is empty)because outside of inner if block
}

Чтобы избежать таких ошибок, я настоятельно рекомендую вам быть последовательными для блоков if: всегда используйте фигурные скобки ({}), если только одно утверждение не находится в той же строке, что и if (или else if или else).

Этого достаточно, чтобы объяснить неверный результат, но вы этого не сделалиприведите минимальный, полный и проверяемый пример. Я не смог проверить, достаточно ли исправления для получения ожидаемого результата.

...