小无编辑摘要 |
LaoWang168(讨论 | 贡献) 无编辑摘要 |
||
第1行: | 第1行: | ||
<pre>#A dictionary of some common elements and their relative atomic masses | |||
# A dictionary of some common elements and their relative atomic masses | |||
elements = {'H': 1.008, 'He': 4.003, 'Li': 6.941, 'Be': 9.012, | elements = {'H': 1.008, 'He': 4.003, 'Li': 6.941, 'Be': 9.012, | ||
# A function to calculate the relative molecular mass of a chemical formula | 'B': 10.81, 'C': 12.01, 'N': 14.01, 'O': 16.00, | ||
'F': 19.00, 'Ne': 20.18, 'Na': 22.99, 'Mg': 24.31, | |||
'Al': 26.98, 'Si': 28.09, 'P': 30.97, 'S': 32.07, | |||
'Cl': 35.45, 'K': 39.10, 'Ar': 39.95, 'Ca': 40.08, | |||
'Sc': 44.96, 'Ti': 47.87, 'V': 50.94, 'Cr': 52.00, | |||
'Mn': 54.94, 'Fe': 55.85, 'Ni': 58.69, 'Co': 58.93, | |||
'Cu': 63.55, 'Zn': 65.38, 'Ga': 69.72, 'Ge': 72.63, | |||
'As': 74.92, 'Se': 78.96, 'Br': 79.90, 'Kr': 83.80, | |||
'Rb': 85.47, 'Sr': 87.62, 'Y': 88.91, 'Zr': 91.22, | |||
'Nb': 92.91, 'Mo': 95.94, 'Tc': 98.00, 'Ru': 101.1, | |||
'Rh': 102.9, 'Pd': 106.4, 'Ag': 107.9, 'Cd': 112.4, | |||
'In': 114.8, 'Sn': 118.7, 'Sb': 121.8, 'I': 126.9, | |||
'Te': 127.6, 'Xe': 131.3, 'Cs': 132.9, 'Ba': 137.3, | |||
'La': 138.9, 'Ce': 140.1, 'Pr': 140.9, 'Nd': 144.2, | |||
'Pm': 145.0, 'Sm': 150.4, 'Eu': 152.0, 'Gd': 157.3, | |||
'Tb': 158.9, 'Dy': 162.5, 'Ho': 164.9, 'Er': 167.3, | |||
'Tm': 168.9, 'Yb': 173.0, 'Lu': 175.0, 'Hf': 178.5, | |||
'Ta': 180.9, 'W': 183.8, 'Re': 186.2, 'Os': 190.2, | |||
'Ir': 192.2, 'Pt': 195.1, 'Au': 197.0, 'Hg': 200.6, | |||
'Tl': 204.4, 'Pb': 207.2, 'Bi': 208.9, 'Th': 232.0, | |||
'Pa': 231.0, 'U': 238.0, 'Np': 237.0, 'Pu': 244.0, | |||
'Am': 243.0, 'Cm': 247.0, 'Bk': 247.0, 'Cf': 251.0, | |||
'Es': 252.0, 'Fm': 257.0, 'Md': 258.0, 'No': 259.0, | |||
'Lr': 262.0, 'Rf': 267.0, 'Db': 270.0, 'Sg': 271.0, | |||
'Bh': 270.0, 'Hs': 277.0, 'Mt': 276.0, 'Ds': 281.0, | |||
'Rg': 280.0, 'Cn': 285.0, 'Nh': 284.0, 'Fl': 289.0, | |||
'Mc': 288.0, 'Lv': 293.0} | |||
<nowiki>#</nowiki> A function to calculate the relative molecular mass of a chemical formula | |||
def calculate_rmm(formula): | def calculate_rmm(formula): | ||
# Initialize the result to zero | |||
result = 0 | |||
# Initialize an empty string to store the current element symbol | |||
element = "" | |||
# Initialize an empty string to store the current number of atoms | |||
number = "" | |||
# Initialize an empty list to store the stack of parentheses | |||
stack = [] | |||
# Loop through each character in the formula | |||
for char in formula: | |||
# If the character is an uppercase letter | |||
if char.isupper(): | |||
# If there is a previous element symbol | |||
if element: | |||
# If there is a previous number of atoms | |||
if number: | |||
# Convert the number to an integer and multiply it by the relative atomic mass of the element | |||
value = int(number) * elements[element] | |||
else: | |||
# Otherwise assume the number is one and multiply it by the relative atomic mass of the element | |||
value = elements[element] | |||
# If there is a stack of parentheses | |||
if stack: | |||
# Append the value to the stack | |||
stack.append(value) | |||
else: | |||
# Otherwise add it to the result | |||
result += value | |||
# Reset the number to an empty string | |||
number = "" | |||
# Set the current element symbol to the character | |||
element = char | |||
# If the character is a lowercase letter | |||
elif char.islower(): | |||
# Append it to the current element symbol | |||
element += char | |||
elif char.isdigit(): | |||
number += char | |||
elif char == "(": | |||
if element: | |||
if number: | |||
value = int(number) * elements[element] | |||
else: | |||
value = elements[element] | |||
if stack: | |||
stack.append(value) | |||
else: | |||
result += value | |||
element = "" | |||
number = "" | |||
stack.append(char) | |||
elif char == ")": | |||
if element: | |||
if number: | |||
value = int(number) * elements[element] | |||
else: | |||
value = elements[element] | |||
if stack: | |||
stack.append(value) | |||
else: | |||
result += value | |||
element = "" | |||
number = "" | |||
# Pop the values from the stack until reaching a left parenthesis | |||
temp_result = 0 | |||
while stack and stack[-1] != "(": | |||
temp_result += stack.pop() | |||
# Pop the left parenthesis from the stack | |||
if stack and stack[-1] == "(": | |||
stack.pop() | |||
# Check if there is a number after the right parenthesis | |||
i = formula.index(char) + 1 | |||
if i < len(formula) and formula[i].isdigit(): | |||
# Multiply the temporary result by the number and append it to the stack or add it to the result | |||
temp_result *= int(formula[i]) | |||
if stack: | |||
stack.append(temp_result) | |||
else: | |||
result += temp_result | |||
# Skip the next character as it is already processed | |||
continue | |||
else: | |||
# Otherwise append the temporary result to the stack or add it to the result as it is | |||
if stack: | |||
stack.append(temp_result) | |||
else: | |||
result += temp_result | |||
# Check if there is a remaining element and number at the end of the formula and add them to the result | |||
if element: | |||
if number: | |||
value = int(number) * elements[element] | |||
else: | |||
value = elements[element] | |||
result += value | |||
return result | |||
<nowiki>#</nowiki> Ask for user input and print out the result or error message | |||
def main(): | def main(): | ||
while True: | |||
try: | |||
formula = input("Enter a chemical formula: ") | |||
rmm = calculate_rmm(formula) | |||
print("The relative molecular mass of {} is {:.3f}".format(formula,rmm)) | |||
except KeyError as e: | |||
print("Unknown element: {}".format(e)) | |||
except ValueError as e: | |||
print(e) | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | |||
</pre> |
2024年3月30日 (六) 15:50的最新版本
#A dictionary of some common elements and their relative atomic masses elements = {'H': 1.008, 'He': 4.003, 'Li': 6.941, 'Be': 9.012, 'B': 10.81, 'C': 12.01, 'N': 14.01, 'O': 16.00, 'F': 19.00, 'Ne': 20.18, 'Na': 22.99, 'Mg': 24.31, 'Al': 26.98, 'Si': 28.09, 'P': 30.97, 'S': 32.07, 'Cl': 35.45, 'K': 39.10, 'Ar': 39.95, 'Ca': 40.08, 'Sc': 44.96, 'Ti': 47.87, 'V': 50.94, 'Cr': 52.00, 'Mn': 54.94, 'Fe': 55.85, 'Ni': 58.69, 'Co': 58.93, 'Cu': 63.55, 'Zn': 65.38, 'Ga': 69.72, 'Ge': 72.63, 'As': 74.92, 'Se': 78.96, 'Br': 79.90, 'Kr': 83.80, 'Rb': 85.47, 'Sr': 87.62, 'Y': 88.91, 'Zr': 91.22, 'Nb': 92.91, 'Mo': 95.94, 'Tc': 98.00, 'Ru': 101.1, 'Rh': 102.9, 'Pd': 106.4, 'Ag': 107.9, 'Cd': 112.4, 'In': 114.8, 'Sn': 118.7, 'Sb': 121.8, 'I': 126.9, 'Te': 127.6, 'Xe': 131.3, 'Cs': 132.9, 'Ba': 137.3, 'La': 138.9, 'Ce': 140.1, 'Pr': 140.9, 'Nd': 144.2, 'Pm': 145.0, 'Sm': 150.4, 'Eu': 152.0, 'Gd': 157.3, 'Tb': 158.9, 'Dy': 162.5, 'Ho': 164.9, 'Er': 167.3, 'Tm': 168.9, 'Yb': 173.0, 'Lu': 175.0, 'Hf': 178.5, 'Ta': 180.9, 'W': 183.8, 'Re': 186.2, 'Os': 190.2, 'Ir': 192.2, 'Pt': 195.1, 'Au': 197.0, 'Hg': 200.6, 'Tl': 204.4, 'Pb': 207.2, 'Bi': 208.9, 'Th': 232.0, 'Pa': 231.0, 'U': 238.0, 'Np': 237.0, 'Pu': 244.0, 'Am': 243.0, 'Cm': 247.0, 'Bk': 247.0, 'Cf': 251.0, 'Es': 252.0, 'Fm': 257.0, 'Md': 258.0, 'No': 259.0, 'Lr': 262.0, 'Rf': 267.0, 'Db': 270.0, 'Sg': 271.0, 'Bh': 270.0, 'Hs': 277.0, 'Mt': 276.0, 'Ds': 281.0, 'Rg': 280.0, 'Cn': 285.0, 'Nh': 284.0, 'Fl': 289.0, 'Mc': 288.0, 'Lv': 293.0} # A function to calculate the relative molecular mass of a chemical formula def calculate_rmm(formula): # Initialize the result to zero result = 0 # Initialize an empty string to store the current element symbol element = "" # Initialize an empty string to store the current number of atoms number = "" # Initialize an empty list to store the stack of parentheses stack = [] # Loop through each character in the formula for char in formula: # If the character is an uppercase letter if char.isupper(): # If there is a previous element symbol if element: # If there is a previous number of atoms if number: # Convert the number to an integer and multiply it by the relative atomic mass of the element value = int(number) * elements[element] else: # Otherwise assume the number is one and multiply it by the relative atomic mass of the element value = elements[element] # If there is a stack of parentheses if stack: # Append the value to the stack stack.append(value) else: # Otherwise add it to the result result += value # Reset the number to an empty string number = "" # Set the current element symbol to the character element = char # If the character is a lowercase letter elif char.islower(): # Append it to the current element symbol element += char elif char.isdigit(): number += char elif char == "(": if element: if number: value = int(number) * elements[element] else: value = elements[element] if stack: stack.append(value) else: result += value element = "" number = "" stack.append(char) elif char == ")": if element: if number: value = int(number) * elements[element] else: value = elements[element] if stack: stack.append(value) else: result += value element = "" number = "" # Pop the values from the stack until reaching a left parenthesis temp_result = 0 while stack and stack[-1] != "(": temp_result += stack.pop() # Pop the left parenthesis from the stack if stack and stack[-1] == "(": stack.pop() # Check if there is a number after the right parenthesis i = formula.index(char) + 1 if i < len(formula) and formula[i].isdigit(): # Multiply the temporary result by the number and append it to the stack or add it to the result temp_result *= int(formula[i]) if stack: stack.append(temp_result) else: result += temp_result # Skip the next character as it is already processed continue else: # Otherwise append the temporary result to the stack or add it to the result as it is if stack: stack.append(temp_result) else: result += temp_result # Check if there is a remaining element and number at the end of the formula and add them to the result if element: if number: value = int(number) * elements[element] else: value = elements[element] result += value return result # Ask for user input and print out the result or error message def main(): while True: try: formula = input("Enter a chemical formula: ") rmm = calculate_rmm(formula) print("The relative molecular mass of {} is {:.3f}".format(formula,rmm)) except KeyError as e: print("Unknown element: {}".format(e)) except ValueError as e: print(e) if __name__ == "__main__": main()