Я пытаюсь написать простое консольное приложение на C ++, которое может прочитать любую химическую формулу и затем вычислить ее молярную массу, например:
- Na2CO3 или что-то вроде:
- La0,6Sr0,4CoO3 или в скобках:
- Fe (NO 3) 3
Проблема в том, что я не знаю подробно, как я могу справиться с потоком ввода. Я думаю, что чтение входных данных и их сохранение в символьном векторе может быть в этом случае лучшей идеей, чем использование общей строки.
Моей самой первой идеей было проверить все элементы (хранящиеся в символе вектора), шаг за шагом: если после заглавной буквы нет строчных букв, то я нашел, например, такой элемент, как углерод «C» вместо «Co» (кобальт) или «Cu» (медь). В основном я пытался использовать методы isupper (...) , islower (...) или isalpha (...) .
// first idea, but it seems to be definitely the wrong way
// read input characters from char vector
// check if element contains only one or two letters
// ... and convert them to a string, store them into a new vector
// ... finally, compute the molar mass elsewhere
// but how to deal with the numbers... ?
for (unsigned int i = 0; i < char_vec.size()-1; i++)
{
if (islower(char_vec[i]))
{
char arr[] = { char_vec[i - 1], char_vec[i] };
string temp_arr(arr, sizeof(arr));
element.push_back(temp_arr);
}
else if (isupper(char_vec[i]) && !islower(char_vec[i+1]))
{
char arrSec[] = { char_vec[i] };
string temp_arrSec(arrSec, sizeof(arrSec));
element.push_back(temp_arrSec);
}
else if (!isalpha(char_vec[i]) || char_vec[i] == '.')
{
char arrNum[] = { char_vec[i] };
string temp_arrNum(arrNum, sizeof(arrNum));
stoechiometr_num.push_back(temp_arrNum);
}
}
Мне нужен простой алгоритм, который может работать с буквами и цифрами. Также может быть возможность работы с указателем, но в настоящее время я не очень знаком с этой техникой. В любом случае, я открыт для понимания, если кто-то захочет объяснить мне, как я могу использовать их здесь.
Я был бы очень признателен за любую поддержку и, конечно, некоторые фрагменты кода, касающиеся этой проблемы, поскольку я много дней думал об этом без прогресса ... Пожалуйста, имейте в виду, что я скорее новичок, чем промежуточный.