Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2019, 17:32   #1
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию Некорректный вывод данных.

Здравствуйте.

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

import re # Импортируем модуль для сопоставления регулярных выражений.

Код:
elements ={} # Содаем массив элементов.
# Заполняем мссив.
elements["H"] = 1
elements["C"] = 12
elements["O"] = 16
elements["Cl"] = 35.45
formula = input() # Ждём ввод формулы.
 
 
myRegEx = re.compile(r"(\()(\w*)(\))(\d*)",re.I)
 
myMatches = myRegEx.findall(formula)
 
while myMatches:
    myMatches = myRegEx.findall(formula)
    for match in myMatches:
        print (match[1], match[3])
        count = match[3]
        text =""
        if (count == ""):
            count = 1
        else:
            count = int(match[3])
        while (count >= 1):
            text = text + match[1]
            count -= 1
            print(text)
        formula = formula.replace('(' + match[1] + ')' + match[3], text)
        print("Replaced formula: ",formula)
 
myRegEx = re.compile("(C[laroudsemf]?|Os?|N[eaibdpos]?|S[icernbmg]?|P[drmtboau]?|H[eofgas]?|A[lrsgutcm]|B[eraik]?|Dy|E[urs]|F[erm]?|G[aed]|I[nr]?|Kr?|L[iaur]|M[gnodt]|R[buhenaf]|T[icebmalh]|U|V|W|Xe|Yb?|Z[nr])(\d*)")
 
myMatches = myRegEx.findall(formula)
 
molecularFormula =""
MW = 0
W = {} # массовая доля каждого элемента
text =""
 
for match in myMatches:
    #Ищем символы.
    symbol = match[0]
    #Ищем индексы.
    number = match[1]
    print(symbol,number)
    if (number == ""):
        number = 1
    else:
        number = int(match[1])
    MW = MW + float(elements[symbol])*number
    W[symbol] = (float(elements[symbol])*number)/MW
    print("Массовая доля элемента ", symbol, "= " + str(W[symbol]))
    while (number >=1):
        molecularFormula = molecularFormula + symbol
        number -= 1
 
print("Бруто-форула вещества: ", molecularFormula)
print("Формула вещества: " + formula + ". Его молекулярная масса = " + str(MW))
Дело в том, что для первого элемента массовая доля выводится со значением в единицу, а это не верно. Помогите пожалуйста это исправить.
Изображения
Тип файла: png Безымянный.png (4.8 Кб, 21 просмотров)
Solver`s вне форума Ответить с цитированием
Старый 17.11.2019, 19:49   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Молекулярная масса соединения - это сумма масс всех элементов.
Её следует посчитать отдельно. Но у вас:
Код:
MW = MW + float(elements[symbol])*number
W[symbol] = (float(elements[symbol])*number)/MW
Т.е. получили в MW вес первого элемента и следом на него делим вес первого элемента.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.11.2019, 20:06   #3
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Молекулярная масса соединения - это сумма масс всех элементов.
Её следует посчитать отдельно. Но у вас:
Код:
MW = MW + float(elements[symbol])*number
W[symbol] = (float(elements[symbol])*number)/MW
Т.е. получили в MW вес первого элемента и следом на него делим вес первого элемента.
Молекулярная масса считается верно. Вот она:
Код:
MW = MW + float(elements[symbol])*number
.
А это:
Код:
W[symbol] = (float(elements[symbol])*number)/MW
- массовая доля каждого элемента в соединении.

Вот формула расчета: w(элемента) = (n· Ar(элемента)) / Mr(вещества)
где

w – массовая доля элемента в веществе,

n– индекс в химической формуле,

Ar– относительная атомная масса,

Mr– относительная молекулярная масса вещества.

Она считается правильно для всех элементов, кроме первого. В этом и состоит мой вопрос. Как сделать так, чтобы массовая доля считалась корректно и для первого элемента.
Solver`s вне форума Ответить с цитированием
Старый 17.11.2019, 20:18   #4
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Т.е. получили в MW вес первого элемента и следом на него делим вес первого элемента.
Простите, сперва не вчитался.
Solver`s вне форума Ответить с цитированием
Старый 17.11.2019, 20:25   #5
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию

Вроде исправил.
Код:
import re # Импортируем модуль для сопоставления регулярных выражений.


elements ={} # Содаем массив элементов.
# Заполняем мссив.
elements["H"] = 1
elements["C"] = 12
elements["O"] = 16
elements["Cl"] = 35.45
formula = input() # Ждём ввод формулы.


myRegEx = re.compile(r"(\()(\w*)(\))(\d*)",re.I)

myMatches = myRegEx.findall(formula)

while myMatches:
    myMatches = myRegEx.findall(formula)
    for match in myMatches:
        print (match[1], match[3])
        count = match[3]
        text =""
        if (count == ""):
            count = 1
        else:
            count = int(match[3])
        while (count >= 1):
            text = text + match[1]
            count -= 1
            print(text)
        formula = formula.replace('(' + match[1] + ')' + match[3], text)
        print("Replaced formula: ",formula)

myRegEx = re.compile("(C[laroudsemf]?|Os?|N[eaibdpos]?|S[icernbmg]?|P[drmtboau]?|H[eofgas]?|A[lrsgutcm]|B[eraik]?|Dy|E[urs]|F[erm]?|G[aed]|I[nr]?|Kr?|L[iaur]|M[gnodt]|R[buhenaf]|T[icebmalh]|U|V|W|Xe|Yb?|Z[nr])(\d*)")

myMatches = myRegEx.findall(formula)

molecularFormula =""
MW = 0
W = {} # массовая доля каждого элемента
text =""

for match in myMatches:
    #Search symbol
    symbol = match[0]
    #Search numbers
    number = match[1]
    print(symbol,number)
    if (number == ""):
        number = 1
    else:
        number = int(match[1])
    MW = MW + float(elements[symbol])*number
    while (number >=1):
        molecularFormula = molecularFormula + symbol
        number -= 1

for match in myMatches:
    #Search symbol
    symbol = match[0]
    #Search numbers
    number = match[1]
    print(symbol,number)
    if (number == ""):
        number = 1
    else:
        number = int(match[1])
    W[symbol] = (float(elements[symbol])*number)/MW
    print("Массовая доля элемента ", symbol, "= " + str(W[symbol]))
    while (number >=1):
        molecularFormula = molecularFormula + symbol
        number -= 1
print("Бруто-форула вещества: ", molecularFormula)
print("Формула вещества: " + formula + ". Его молекулярная масса = " + str(MW))
А можно как-то это сделать менее топорно?
Solver`s вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректный вывод. Pascal. Kamelok Помощь студентам 0 16.04.2018 21:27
Некорректный вывод вещественных элементов массива. Pug_from_Mordor Помощь студентам 2 04.01.2015 16:21
Некорректный вывод результата (1,#J) Drozd Oleg Общие вопросы C/C++ 3 25.09.2011 12:31
Некорректный вывод изображения Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 24.07.2010 00:12