all_cation=["H","Ag","K","Ba","NH4","Na","Hg", "Pb","Ca","Fe","Cu","Mg","Al","Zn"]all_anion=["SO4","Cl","NO3","HCO3",# HCO3-:碳酸氢根离子 "OH","CO3"]strip_char=list("()[]{}<>《》()")def get_input(pmt): initial_input=input(pmt) for char in strip_char: initial_input=\ initial_input.replace(char,"")# 删除指定字符 for i in all_cation: if initial_input.startswith(i): cation=i break else: raise Exception("unknown cation") for i in all_anion: if initial_input.endswith(i): anion=i break else:# 循环正常结束,没有找到阴离子 # 判断最后一位是否为数字 try: int(initial_input[-1]) except ValueError: raise Exception("unknown anion") else: filter_input=initial_input[:-1]# 删去最后一位数字,再次尝试 for i in all_anion: if filter_input.endswith(i): anion=i break else: raise Exception("unknown anion") return cation,aniondef judg(cation:str,anion:str) -> bool: # 初中五酸皆可溶 if cation=="H": if anion in ["SO4","Cl","NO3","CO3","HCO3"]: return True else: # 这个化学式根本不存在(HFe)? return False # 碱溶钾钠钡钙铵 elif anion=="OH": if cation in ["Ca","Na","Ba","K","NH4"]: return True else:return False # 硝酸盐一切皆可溶 elif anion=="NO3": return True # 盐酸盐不溶银亚汞 # 亚汞初中不考 elif anion=="Cl": if cation in ["Ag","Hg"]: return False else:return True # 硫酸盐不溶钡和铅 elif anion=="SO4": if cation in ["Ba","Pb"]: return False else:return True # 碳酸盐只溶钾钠铵 elif anion=="CO3": if cation in ["K","Na","NH4"]: return True else:return False # 碳酸氢盐皆可溶 elif anion=="HCO3": return True else: # 我们已经枚举了所有情况,理论上不应该有样例能到达这里 # 程序出错,储存错误后退出 with open("coredump.txt","a") as f: f.write(f"cation:{cation}\nanion:{anion}\n\n") raise Exception("unexcepted case.Send the coredump.txt to me.")print("输入物质化学式(如:Fe2(SO4)3)以检测可溶性")print("括号不加也可以,数字无需加下标!")print("作者:马千程。祝您使用愉快~")while True: try: data=get_input(pmt="请输入化学式") result=judg(*data) if result: print("该物质可溶!") else: print("该物质不可溶!") except Exception: try: import traceback except ImportError:# 极端情况:标准库导入失败! print("抱歉!程序出现严重错误,请将您的输入截图发送给我") else: print("抱歉!程序出现错误!请将以下信息发送给我!") error_msg = traceback.format_exc() print(error_msg)