2015-11-09 10 views
-1

Мне нужно сделать proyect, который вычисляет мне молярную массу любой молекулы, введенную пользователем. Например, если пользователь вводит СО2, моя программа должна идентифицировать С (что связано с матрицей с ее массой), затем идентифицировать О (связанное с ее массой) и умножить на два, и добавить их.Программа вычисления массы молекулы в C

Я думал использовать строки символов для каждого элемента.

Im очень новый в программировании, и я узнал только основы в значительной степени.

как бы вы, ребята, рекомендовали мне это сделать? Im довольно потерял

Большое спасибо

+2

1. Таблица имен собственных атомов вместе с их массой - 'struct'. 2. Сканирование на верхний регистр, за которым следуют, возможно, несколько нижних регистров. 3. Сканировать цифры. 4. Умножьте и добавьте. 5. Промойте и повторите до конца строки. 6. Прибыль. – usr2564301

ответ

1

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

Вместо этого попробуйте массив символов.

Некоторые вещи, чтобы рассмотреть следующие вопросы:

  • Насколько велика ли массив должен быть?

  • Какие символы я буду принимать? (пробелы?)

  • Как узнать, когда пользователь выполнил ввод? (что-то с нулевым завершением ...)

  • Как я буду перемещаться по массиву?

  • Что определяет элемент? (Если это заглавные буквы, взгляните на значения ASCII для их сравнения)

  • Что мне делать с элементом, когда я его нахожу?

Вы запросили начальное место, поэтому я не хочу выдавать какой-либо конкретный код. Взгляните на комментарий Jongware для хорошего описания того, что должна делать ваша программа. Одновременно купите кусочек (ответьте на вопросы в этом посте, и с вами все будет в порядке с вводом) и проверьте это, когда закончите. Удачи!

1

Хотя у вас есть один ответ, я бы предложил внимательно рассмотреть первый комментарий, опубликованный после вашего вопроса. Независимо от того, как вы его обрезаете, вам придется проанализировать ввод пользователя в форме строки. Хотя может показаться сложным разобрать что-то вроде "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 

Успехов, дайте мне знать, если вам нужна дополнительная помощь фитинг части вместе.