2015-04-16 2 views
0

Только что начал изучать Python. Я пытаюсь построить простой алгоритм, который выполняет реакцию химической ионной рекомбинации, т.е. е. KBr + NaCl -> KCl + NaBr.Уточнение кода и как оно работает + как вернуться к началу кода?

В принципе, я прошу пользователя ввести два реагента, такие как KBr и NaCl, и я хочу, чтобы python перестраивал эти два, где первая часть первого реагента согласовывалась со второй частью второго реагента, например KCl и NaBr. Одна из проблем, с которыми я столкнулся, связана с однобуквенными вводами, такими как Калий или Иодид, где я не уверен, как бы я разделил строку, если это KBr или KI. Я попытался сделать это в коде ниже, но я получаю странные результаты, такие как KIBr и Mg.

Наконец, мне было интересно, как я буду возвращать пользователя к началу кода после последней строки? Значение, когда программа выводит данные, как мне заставить ее вернуться в цикл и спросить пользователя снова?

Для справки 'C' = катион и 'N' = анион.

# Asks user for reactants input. 
Alpha = raw_input("Alpha reactant = ") 
Beta = raw_input("Beta reactant = ") 

# Searches for one-letter elements to prevent mixed output. 
if str(['K','H']) in a: 
    Alpha_C = a[0] 
else: 
    Alpha_C = a[:2] 

if str(['F','I']) in a: 
    Alpha_N = a[-1] 
else: 
    Alpha_N = a[2:] 

if str(['K','H']) in b: 
    Beta_C = b[0] 
else: 
    Beta_C = b[:2] 

if str(['F','I']) in b: 
    Beta_N = b[-1] 
else: 
    Beta_N = b[2:] 

# Recombines the reacted ions. 
Re_Alpha = Alpha_C + Beta_N 
Re_Beta = Alpha_N + Beta_C 

# Final statement additions, product response, and return to start. 
z = "Your products are the following: "; Q = " , " 
print z + Re_Alpha + Q + Re_Beta 
+1

Где вы определяете 'a' и' b'? – Dannnno

+3

Вы возвращаете его в цикле [используя цикл] (https://docs.python.org/3.4/tutorial/controlflow.html). Я рекомендую сначала прочитать основы Python, прежде чем делать какие-либо более кодировки, поскольку петли являются одним из основных строительных блоков практически любой программы. – TigerhawkT3

+0

@ Dannnno Я думаю, вы заставили меня понять, что я идиот, чтобы не исправить это. Раньше я использовал a и b, но затем менял на альфа-беты и как-то не думал об изменении этих переменных. Спасибо за эту значительную реализацию! – Anakratis

ответ

0

Вы должны поместить все в той или иной форме петли и т.д .:

while True: 
    Alpha = raw_input("Alpha reactant = ") 
    Beta = raw_input("Beta reactant = ") 
    ... 

, но тогда вам нужно выйти из цикла, например,

if Alpha == 'q' or Beta == 'q': 
     break 

Это будет держать цикл (while True) до тех пор, пока пользователь не введет q для любого из входов.

ли код ссылки Вы разместили правильно, потому что я не вижу каких-либо ссылок на альфа- или бета в нем (только a и b)
Каковы ожидаемые затраты на Alpha и Beta и ожидаемые результаты, потому что Я не думаю, что ваши условия делают то, что вы ожидаете от них, например str(['K', 'H']) равен "['K', 'H']", и я сомневаюсь, что это in вход ваших пользователей.

+0

Да. Я ранее использовал «a» и «b» и изменил их на «Alpha» и «Beta» просто ... потому что. И забыл изменить эти переменные. Благодаря! – Anakratis

+0

Почему это было приостановлено? – dbliss

0

В отношении первой проблемы: рассмотрите возможность использования регулярных выражений для анализа реагентов.

import re 
regex = re.compile('([A-Z][a-z]?)([A-Z][a-z]?)') 
alpha_parts = re.match(regex, Alpha) 
beta_parts = re.match(regex, Beta) 

if alpha_parts and beta_parts: 
    Alpha_C, Alpha_N = alpha_parts.groups()[0], alpha_parts.groups()[1] 
    Beta_C, Beta_N = beta_parts.groups()[0], beta_parts.groups()[1] 
else: 
    # handle invalid input 
Смежные вопросы