Проблемы с сохранением ввода калькулятора и его воспроизведением на следующей строке - PullRequest
1 голос
/ 02 декабря 2011

У меня есть код калькулятора, в котором мне нужно сохранить заданную строку (по одной строке в калькуляторе времени) на основе определенного символа, такого как «М», присутствующего в конце строки.Кроме того, если где-либо в строке есть буква «M», то вместо этой буквы M добавьте последнюю сохраненную строку.

Я думал, что это можно легко сделать с помощью (псевдокода),

foreach input element
  if input element == 'M' && is last element
    save = true
    erase M element

  if input element == 'M' && save != true
    insert saved string into input
    erase 'M' from input

  if save == true
    Set save string = input;

Я пытаюсь сделать это в методе ниже, но он не работает.Я не уверен, где или как сохранить строку, чтобы она не сбрасывалась в каждой строке.Я получаю "строковый индекс вне диапазона" (в другом классе, но из-за этого изменения), когда я пытаюсь использовать 'M' в конце ввода.

const string operators = "*/+-";
const string memorize = "M";

list<string> lex(string input)
{
  list<string> tokens;
  bool save = true;
  string saveInfo = "2";
  string token;

  for (unsigned int i = 0; i < input.length(); i++)
  {
    // Check if we need to save string element to memory
    if ((memorize.find(input[i]) != string::npos) && (i == input.length() - 1))
    {
      save = true;
      // Remove 'M' from end of string
      input.erase(i);
    }

    // Check if 'M' is element
    if (memorize.find(input[i]) != string::npos && !save)
    {
      // Insert saved string
      input.insert(i, saveInfo);

      // Remove M from string
      input.erase(i);
    }

    // Save input
    if (save)
    {
      saveInfo = input;
    }

    if (operators.find(input[i]) != string::npos)
    {
      // Add any token we've created so far
      if (token.length())
      {
        tokens.push_back(token);
        token.clear();
      }

      // Add this operator as a separate token
      token.push_back(input[i]);
      tokens.push_back(token);
      token.clear();
    }
    else
    {
      // Grow the current token
      token.push_back(input[i]);
    }
  }

  // Any stragglers?
  if (token.length())
  {
    tokens.push_back(token);
  }

  // Clean 'em up
  for (list<string>::iterator i = tokens.begin(); i != tokens.end(); ++i)
  {
    *i = clean(*i);
  }

  return tokens;
}

saveInfo в настоящее время просто устанавливается на «2» каждый раз, пока я не выясню, где должна находиться моя строковая переменная, чтобы каждый раз сохранять сохраненный экземпляр строки.

Этоправильный способ решить эту проблему?Есть ли способ лучше?Знаете ли вы, почему это не работает?

РЕДАКТИРОВАТЬ:

пример ввода:

INPUT: 2+1M
OUTPUT: 3  **2+1 is saved
INPUT: M+5  **2+1 is inserted into this input string at 'M'
OUTPUT: 8

Я не работал с C ++ вдолгое время, любая помощь приветствуется!

1 Ответ

2 голосов
/ 02 декабря 2011

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

...