Найти - Пользователи
Полная версия: Вам дан список молекул и их атомная масса Посчитайте молярную массу молекул, используя методы функционального программирования. Выведите значения в порядке возрастания молярной массы.
Начало » Python для новичков » Вам дан список молекул и их атомная масса Посчитайте молярную массу молекул, используя методы функционального программирования. Выведите значения в порядке возрастания молярной массы.
1 2
ant976
Спасибо большое!
xam1816
py.user.next
Я добавил соляную кислоту в код xam1816
CL - так не записывают хим.элементы, иначе СO - это угарный газ или кобальт?

NO и No cсоответственно оксид азота и нобелий
py.user.next
xam1816
CL - так не записывают хим.элементы, иначе СO - это угарный газ или кобальт?

NO и No cсоответственно оксид азота и нобелий
ant976
Входные данные
список формул молекул:
['H2-S-O4', 'H2-O', 'NA-CL', 'H-CL', 'K-CL']
ant976
Вывод программы

H2-O 18.015
H-CL 36.461
NA-CL 58.443
K-CL 74.551
H2-S-O4 98.078
Как видишь, по условию задачи натрий и хлор подаются на вход алгоритма в верхнем регистре. Значит, задача определяет свой язык формул на входе. Как видишь, в серной кислоте у него разделены сера и кислород, хотя обычно их пишут слитно, так как считают сульфатом. Так что можно предположить, что в этом языке входных формул алгоритма кобальт будет так же изолирован в отдельный атом через дефис, а в монооксиде углерода углерод и кислород будут разделены дефисом. Благодаря этому коллизии не будет.
vic57
py.user.next
 улучшенная версия с обработкой ошибок
 import re
d ={}
d['H'] = 1.008
d['O'] = 15.999
d['S'] = 32.066
d['NA'] = 22.990
d['CL'] = 35.453
d['K'] = 39.098
d['C'] = 10
d['L'] = 5#пример
arr = ['H2-S-O4','H-CL','NA-CL','Y-CL','K-CL','H2-O','C-O2','H2U']
            
def mass(d,i):
    t = i.split('-')
    summ = 0
    for j in t:
        match = re.search(r'\d',j)
        if match:
            idx = match.start()
            m,n = j[:idx],j[idx:]
        else: m,n = j,1
        try: 
            summ += d[m]*int(n)
        except:
            summ = -1
            i='Error:'+ i
            break
    return i,round(summ,3)
out = []
for i in arr: out.append(mass(d,i))
out.sort(key=lambda x: x[1])
for i in out: print('{0:24}{1:>5}'.format(*i))
py.user.next
vic57
улучшенная версия с обработкой ошибок
Сначала надо удалить ошибки из списка и составить чистый список, в котором все молекулы без ошибок, а потом подавать этот чистый список в алгоритм, который не занимается ничем посторонним, а только преобразует молекулы в молярные массы.

У тебя получилось, что ошибки участвуют в сортировке. Если там будет миллион молекул в списке и не будет ни одной правильной молекулы, то твой алгоритм будет сортировать миллион ошибок. То есть алгоритм будет сортировать ошибки.

Так вот, в реальных пограммах, когда ты их пишешь и они для чего-то нужны, не для обучения и не для развлечения или тренировки в кодинге, ошибки обычно нужно записать в отдельный журнал ошибок, чтобы потом прийти в конце месяца или полугодия туда, где установлена программа физически, и прочитать всё то, чем занимались какие-то учёные химики и когда, кто и почему там наделал неправильных формул. Бывает так, что программы следят за людьми, а бывает так, что программы следят за программами. То есть журналирование проводится не просто так, не ради прикола, а оно может быть единственным способом узнать, что что-то происходило когда-то.

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


tags: function errors
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB