Разобрать int и string - PullRequest
       0

Разобрать int и string

1 голос
/ 14 января 2011

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

Например, если я введу "H2O", я получу для массива атомов значение {"H", "O"} и в количествемассив я получу {2, 1}.Я не учел количество больше 9, так как не думаю, что есть молекула, которая может связываться с чем-то большим, чем 8.

В любом случае, я довольно новичок, поэтому мне интересноесли этот кусок кода можно сделать лучше?

   string formula = "H2O";
   int no, k = 0, a = 0;
   string atom[10];
   int amount[10];
   bool flag = true;
   stringstream ss(formula);

   for(int i = 0; i < formula.size(); ++i)
   {

      no = atoi(&formula[i]);
      if(no == 0 && (flag || islower(formula[i]) )  )
      {
         cout << "k = " << k << endl;
         atom[k] += formula[i];
         flag = false;
         cout << "FOO1 " << atom[k] << endl;
         amount[a] = 1;
      }
      else if(no != 0)
      {
         amount[a] = no;
         cout << "FOO2 " << amount[a] << endl;
         a++;
         flag = true;
         k++;
      }
      else
      {
         k++;
         a++;
         atom[k] = formula[i];
         cout << "FOO3 " << atom[k] << endl;
         amount[a] = 1;

         flag = false;
      }

      cout << no << endl;
   }

Ответы [ 3 ]

2 голосов
/ 14 января 2011

Рассматривали ли вы подход с регулярными выражениями? У вас есть доступ к регулярным выражениям Boost или TR1? Отдельный атом и его количество легко представить в виде:

(после редактирования на основе комментариев)

([A-Z][a-z]{0,2})([0-9]*)

Тогда вам просто нужно несколько раз найти этот шаблон во входной строке и извлечь различные части.

1 голос
/ 14 января 2011

Что если вы изменили его так, чтобы он был похож на этот алгоритм? Это может быть меньше кода, но определенно будет более ясным:

// while not at end of input
     // gather an uppercase letter
     // gather any lowercase letters
     // gather any numbers
     // set the element in your array

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

1 голос
/ 14 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...