无编辑摘要
无编辑摘要
第1行: 第1行:
<code><nowiki>#</nowiki> A dictionary of some common elements and their relative atomic masses</code>
```python
# 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}


<code>elements = {"H": 1.008, "He": 4.003, "Li": 6.941, "Be": 9.012,</code>
# 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


<code>            "B": 10.81, "C": 12.01, "N": 14.01, "O": 16.00,</code>
    # 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


<code>            "F": 19.00, "Ne": 20.18, "Na": 22.99, "Mg": 24.31,</code>
# 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)


<code>            "Al": 26.98, "Si": 28.09, "P": 30.97, "S": 32.07,</code>
if __name__ == "__main__":
 
    main()
<code>            "Cl": 35.45, "Ar": 39.95, "K": 39.10 , "Ca" :40.08 ,</code>
```
 
<code>            'Sc':44.96 , 'Ti':47.87 , 'V':50.94 , 'Cr':52.00 ,</code>
 
<code>            'Mn':54.94 , 'Fe':55.85 , 'Co':58.93 , 'Ni':58.69 ,</code>
 
<code>            'Cu':63.55 , 'Zn':65.38 , 'Ga':69.72 , 'Ge':72.63 ,</code>
 
<code>            'As':74.92 , 'Se':78.97 , 'Br':79.90 , 'Kr' :83.80 ,</code>
 
<code>            'Rb' :85.47 ,'Sr' :87.62,'Y' :88.91,'Zr':91.22,</code>
 
<code>            'Nb' :92.91,'Mo' :95.95,'Tc' :98 ,'Ru' :101.07,</code>
 
<code>            'Rh' :102.91,'Pd' :106.42,'Ag' :107.87,'Cd' :112.41,</code>
 
<code>            'In' :114.82,'Sn' :118.71,'Sb' :121.76,'Te' :127.60,</code>
 
<code>            'I':126.90,'Xe':131.29,'Cs':132.91,'Ba':137.33,</code>
 
<code>            'Hf':178.49,'Ta':180.95,'W':183.84,</code>
 
<code>            'Ir':192.22,'Pt':195.08,'Au':196.97,</code>
 
<code>            'Pb':207.2,'Bi':208.98}</code>
 
<code><nowiki>#</nowiki> A function to calculate the relative molecular mass of a chemical formula</code>
 
<code>def calculate_rmm(formula):</code>
 
<code>    # Initialize the result to zero</code>
 
<code>    result = 0</code>
 
<code>    # Initialize an empty string to store the current element symbol</code>
 
<code>    element = ""</code>
 
<code>    # Initialize an empty string to store the current number of atoms</code>
 
<code>    number = ""</code>
 
<code>    # Initialize an empty list to store the stack of parentheses</code>
 
<code>    stack = []</code>
 
<code>    # Loop through each character in the formula</code>
 
<code>    for char in formula:</code>
 
<code>        # If the character is an uppercase letter</code>
 
<code>        if char.isupper():</code>
 
<code>            # If there is a previous element symbol</code>
 
<code>            if element:</code>
 
<code>                # If there is a previous number of atoms</code>
 
<code>                if number:</code>
 
<code>                    # Convert the number to an integer and multiply it by the relative atomic mass of the element</code>
 
<code>                    value = int(number) * elements[element]</code>
 
<code>                else:</code>
 
<code>                    # Otherwise assume the number is one and multiply it by the relative atomic mass of the element</code>
 
<code>                    value = elements[element]</code>
 
<code>                # If there is a stack of parentheses</code>
 
<code>                if stack:</code>
 
<code>                    # Append the value to the stack</code>
 
<code>                    stack.append(value)</code>
 
<code>                else:</code>
 
<code>                    # Otherwise add it to the result</code>
 
<code>                    result += value</code>
 
<code>                # Reset the number to an empty string</code>
 
<code>                number = ""</code>
 
<code>            # Set the current element symbol to the character</code>
 
<code>            element = char</code>
 
<code>        # If the character is a lowercase letter</code>
 
<code>        elif char.islower():</code>
 
<code>            # Append it to the current element symbol</code>
 
<code>            element += char  </code>
 
<code>        elif char.isdigit():  </code>
 
<code>            number += char  </code>
 
<code>        elif char == "(":</code>
 
<code>            if element:  </code>
 
<code>                if number:  </code>
 
<code>                    value = int(number) * elements[element]  </code>
 
<code>                else:  </code>
 
<code>                    value = elements[element]  </code>
 
<code>                if stack:  </code>
 
<code>                    stack.append(value)  </code>
 
<code>                else:  </code>
 
<code>                    result += value  </code>
 
<code>                element = ""  </code>
 
<code>                number = ""  </code>
 
<code>            stack.append(char)  </code>
 
<code>        elif char == ")":</code>
 
<code>            if element:</code>
 
<code>                if number:</code>
 
<code>                    value = int(number) * elements[element]</code>
 
<code>                else:</code>
 
<code>                    value = elements[element]</code>
 
<code>                if stack:</code>
 
<code>                    stack.append(value)</code>
 
<code>                else:</code>
 
<code>                    result += value</code>
 
<code>            element = ""</code>
 
<code>            number = ""</code>
 
<code>            # Pop the values from the stack until reaching a left parenthesis</code>
 
<code>            temp_result = 0</code>
 
<code>            while stack and stack[-1] != "(":</code>
 
<code>                temp_result += stack.pop()</code>
 
<code>            # Pop the left parenthesis from the stack</code>
 
<code>            if stack and stack[-1] == "(":</code>
 
<code>                stack.pop()</code>
 
<code>            # Check if there is a number after the right parenthesis</code>
 
<code>            i = formula.index(char) + 1</code>
 
<code>            if i < len(formula) and formula[i].isdigit():</code>
 
<code>                # Multiply the temporary result by the number and append it to the stack or add it to the result</code>
 
<code>                temp_result *= int(formula[i])</code>
 
<code>                if stack:</code>
 
<code>                    stack.append(temp_result)</code>
 
<code>                else:</code>
 
<code>                    result += temp_result</code>
 
<code>                # Skip the next character as it is already processed</code>
 
<code>                continue</code>
 
<code>            else:</code>
 
<code>                # Otherwise append the temporary result to the stack or add it to the result as it is</code>
 
<code>                if stack:</code>
 
<code>                    stack.append(temp_result)</code>
 
<code>                else:</code>
 
<code>                    result += temp_result</code>
 
<code>    # Check if there is a remaining element and number at the end of the formula and add them to the result        </code>
 
<code>    if element:  </code>
 
<code>        if number:  </code>
 
<code>            value = int(number) * elements[element]  </code>
 
<code>        else:  </code>
 
<code>            value = elements[element]  </code>
 
<code>        result += value  </code>
 
<code>    return result</code>
 
<code><nowiki>#</nowiki> Ask for user input and print out the result or error message  </code>
 
<code>def main():</code>
 
<code>    while True:</code>
 
<code>        try:  </code>
 
<code>            formula = input("Enter a chemical formula: ")</code>
 
<code>            rmm = calculate_rmm(formula)</code>
 
<code>            print("The relative molecular mass of {} is {:.3f}".format(formula,rmm))</code>
 
<code>        except KeyError as e:</code>
 
<code>            print("Unknown element: {}".format(e))</code>
 
<code>        except ValueError as e:</code>
 
<code>            print(e)</code>
 
<code>if __name__ == "__main__":</code>
 
<code>    main()</code>

2024年3月29日 (五) 20:39的版本

```python

  1. 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}
  1. 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
  1. 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()

```