Хотя у вас есть один ответ, я бы предложил внимательно рассмотреть первый комментарий, опубликованный после вашего вопроса. Независимо от того, как вы его обрезаете, вам придется проанализировать ввод пользователя в форме строки. Хотя может показаться сложным разобрать что-то вроде "Li3Co4CO2"
, чтобы получить атомный вес для каждого элемента, умножить его на правильный множитель и сохранить текущую сумму, это можно сделать с помощью двух указателей и вложенного цикла while.
Возьмите, например, ваш пользовательский ввод в argv[1]
и присвоить его указателю p
:
char *p = argv[1];
Все, что вам сейчас нужно это while
цикл для проверки каждого символа в строке:
while (*p) {
В цикл, все, что вам нужно будет сделать, это идентифицировать каждый элемент заглавную букву, за которой следует нижний регистр и оканчивающаяся цифра (если есть) перед следующей Cap или нуль-завершающим символом (конец строки). Поэтому присвойте конечный указатель скажите ep
и обработайте строку с вложенным контуром while
. (мы добавим множитель для хранения цифры и длину символа для использования позже). Мы пропускаем первый символ в p
, (char *ep = p + 1;
), поэтому мы будем инициализировать длину символа до 1
(множитель всегда начинается с 1):
char *ep = p + 1; /* end pointer */
char m = 1; /* multiplier */
size_t symlen = 1; /* symbol len */
...
/* for each char in p until next CAP */
while (*ep && (*ep < 'A' || 'Z' < *ep)) {
/* if digit */
if ('0' <= *ep && *ep <= '9')
m = *ep - '0'; /* set multiplier */
else
symlen++; /* increment len */
ep++;
}
Теперь у вас есть все сведения, необходимые для копирования/поиска для символа, а затем добавить вес к текущей сумме. Для завершения выделения символа, вы можете просто использовать свой symlen
вместе с strncpy
скопировать символ временного массива/строки:
char srchsym[8] = {0}; /* search sym */
strncpy (srchsym, p, symlen);
srchsym[symlen] = 0; /* null-terminate */
(ручной нуль-терминации технически не требуется, так как вы инициализируется srchsym[8] = {0};
, но является хорошей привычкой)
Теперь все, что осталось, - это поиск srchsym
в вашей периодической таблице (массив структур) и возврат указателя на элемент массива, соответствующий элементу, который соответствует вашему поисковому символу (атомный символ). Если у вас есть указатель на данные в вашей таблице Менделеева, сохраняя бегущую сумму в wt
так просто, как:
wt += (float)m * ptp->atwt;
(где ptp
- указатель на периодическую таблицу и элемент stucture atwt
атомный вес). При расчете на первый элемент делается, просто заранее указатель p
к следующему Cap в строке, и повторите:
p = ep;
}
Когда это сделано, вы можете распечатать результаты:
printf ("\n %s (atomic weight) : %.3f\n\n", argv[1], wt);
Если вам нравится, вы можете также распечатать петлю каждый элемент, который он добавляет к сумме, поскольку он возвращается вашим поиском с помощью srchsym
. Пример для гипотетического "Li3Co4CO2"
будет:
$ ./bin/ptable Li3Co4CO2
element : Lithium
symbol : Li
atomic num : 3
atomic wt. : 6.941
element : Cobalt
symbol : Co
atomic num : 27
atomic wt. : 58.933
element : Carbon
symbol : C
atomic num : 6
atomic wt. : 12.011
element : Oxygen
symbol : O
atomic num : 8
atomic wt. : 15.999
Li3Co4CO2 (atomic weight) : 300.565
Успехов, дайте мне знать, если вам нужна дополнительная помощь фитинг части вместе.
1. Таблица имен собственных атомов вместе с их массой - 'struct'. 2. Сканирование на верхний регистр, за которым следуют, возможно, несколько нижних регистров. 3. Сканировать цифры. 4. Умножьте и добавьте. 5. Промойте и повторите до конца строки. 6. Прибыль. – usr2564301