2011-01-14 6 views
1

Привет, я не уверен, что это подходящее место, чтобы задать этот вопрос. Так или иначе, я написал этот код, чтобы разобрать формулу молекулы и разбить ее на атомы и количество каждого атома.Parse int and string

Например, если я ввожу "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; 
    } 
+2

«Я не думаю, что есть молекула, которая может связываться с чем-то большим, чем 8». Длинноцепочечные углеводороды могут быть выражены как CNHM, при больших N и M. – Raedwald

+0

«Интересно, может ли этот фрагмент кода стать лучше?» Вы можете быть более конкретным? Есть ли что-нибудь, в частности, вы недовольны? – Raedwald

+0

Это, безусловно, правильное место, чтобы задать свой вопрос :-) Btw не должен быть массивом количества '{2, 1}' для ввода «H2O»? –

ответ

1

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

+0

A hardcoded предназначен только для тестирования, я не хотел вводить формулу молекулы все время ^^ – user575701

+0

, но вы могли бы использовать текстовый файл с некоторыми тестовыми таблицами –

+0

Для таких целей я обычно делаю программу такой значения в качестве параметров командной строки и установить отладчик для запуска с требуемым тестовым вводом. В моей ситуации это типичные пути к файлам для обработки, которые были бы еще более громоздкими, чтобы всегда вводить вручную. ;) – Mephane

2

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

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

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

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

+0

У меня нет доступа к этим вещам, и я не так хорош с регулярным выражением :( – user575701

+1

Я думаю, что я тоже буду использовать этот подход. Как обычно, регулярное выражение никогда не бывает таким простым, как кажется. Я предлагаю [ AZ] [az] {0,2} [0-9] {1,2}, чтобы покрыть начальный капитал и необязательный, один или два строчных буквы и две цифры. Я уверен, что это не идеально, t хочу, чтобы числа начинались с нуля.Я нахожу более легким, чтобы улучшить регулярное выражение, чем многие строки кода для синтаксического анализа. – T33C

+0

@ T33C: Хороший запрос на изменения. Я отредактировал свой ответ, чтобы включить ваши предложения. – JaredC

1

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

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

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