diff --git a/main4.0.py b/main4.0.py new file mode 100644 index 0000000..97ba199 --- /dev/null +++ b/main4.0.py @@ -0,0 +1,262 @@ +from house_service import * + +def print_menu(): + print("\n===== 房屋出租系统 V4.0 =====") + print("1. 新增房源") + print("2. 删除房源") + print("3. 修改房源") + print("4. 查询房源") + print("5. 查看/管理操作记录") + print("6. 查看/管理浏览历史") + print("7. 地址字符串解析测试") + print("8. 按区域关键词模糊查询") + print("9. 初始化小区邻接矩阵") + print("10. 更新小区间距离") + # 【V4.0 新增菜单】 + print("11. 房源二叉树范围查询(租金/面积)") + print("12. 房源冒泡排序(租金/面积)") + print("13. 房源快速排序(租金/面积)") + print("14. 退出系统") + print("============================") + +# V2操作记录子菜单 +def op_record_menu(): + while True: + print("\n----- 操作记录管理 -----") + print("1. 查看最近10条") + print("2. 取出最新一条") + print("3. 清空记录") + print("4. 返回") + c = input("请选择:") + if c == "1": + lst = get_recent_records("operation", 10) + print(lst if lst else "暂无记录") + elif c == "2": + print(pop_operation_stack() or "暂无记录") + elif c == "3": + clear_stack("operation") + elif c == "4": + break + else: + print("输入有误") + + +#v2 +def browse_history_menu(): + while True: + print("\n----- 浏览历史管理 -----") + print("1. 查看最近10条") + print("2. 取出最新一条") + print("3. 清空历史") + print("4. 返回") + c = input("请选择:") + if c == "1": + id_list = get_recent_records("browse", 10) + if not id_list: + print("暂无浏览历史") + continue + for idx, hid in enumerate(id_list, 1): + info = query_house("id", hid) + if info: + h = info[0] + print(f"{idx}. ID:{hid} 地址:{h['address']}") + else: + print(f"{idx}. ID:{hid} 房源已不存在") + elif c == "2": + hid = pop_browse_stack() + if not hid: + print("暂无浏览历史") + continue + info = query_house("id", hid) + print(f"最近浏览ID:{hid}") + elif c == "3": + clear_stack("browse") + elif c == "4": + break + else: + print("输入有误") + + + +def main(): + while True: + print_menu() + choice = input("请输入功能编号:") + + #v1 + if choice == "1": + addr = input("输入房源地址:") + try: + price = float(input("输入月租金:")) + area = float(input("输入面积:")) + except: + print("租金面积必须是数字!") + continue + htype = input("输入户型:") + if add_house(addr, price, area, htype): + new_id = get_next_house_id() - 1 + push_operation_stack(f"新增房源ID:{new_id} 地址:{addr}") + + elif choice == "2": + try: + hid = int(input("输入要删除房源ID:")) + res = query_house("id", hid) + addr = res[0]["address"] if res else "未知地址" + if delete_house(hid): + push_operation_stack(f"删除房源ID:{hid} 地址:{addr}") + except: + print("ID必须是整数") + + elif choice == "3": + try: + hid = int(input("输入要修改房源ID:")) + edit = {} + a = input("新地址(回车不修改):") + if a: edit["address"] = a + p = input("新租金(回车不修改):") + if p: edit["price"] = float(p) + ar = input("新面积(回车不修改):") + if ar: edit["area"] = float(ar) + t = input("新户型(回车不修改):") + if t: edit["house_type"] = t + if edit: + if update_house(hid, edit): + push_operation_stack(f"修改房源ID:{hid} 变更:{edit}") + else: + print("未填写任何修改内容") + except: + print("输入格式错误") + + elif choice == "4": + print("1-ID 2-地址 3-租金 4-户型") + sel = input("选择查询类型:") + map_dic = {"1": "id", "2": "address", "3": "price", "4": "house_type"} + if sel not in map_dic: + print("选择无效") + continue + val = input("输入查询值:") + res_list = query_house(map_dic[sel], val) + if not res_list: + print("未找到房源") + continue + for h in res_list: + print(f"ID:{h['id']} 地址:{h['address']} 租金:{h['price']}") + if map_dic[sel] == "id": + push_browse_stack(h["id"]) + + # v2 + elif choice == "5": + op_record_menu() + elif choice == "6": + browse_history_menu() + + #v3 + elif choice == "7": + full_addr = input("输入完整地址(如:四川省德阳市什邡市XX小区):") + res = parse_address_string(full_addr) + print("解析结果:", res) + + elif choice == "8": + keyword = input("输入区域关键词(如:什邡、德阳):") + res_list = fuzzy_query_by_district(keyword) + if not res_list: + print("未找到该区域房源") + else: + for h in res_list: + print(f"ID:{h['id']} 地址:{h['address']}") + + elif choice == "9": + community_input = input("输入所有小区名称,用英文逗号分隔:") + community_list = community_input.split(",") + init_community_matrix(community_list) + + elif choice == "10": + c1 = input("输入小区A名称:") + c2 = input("输入小区B名称:") + try: + dis = float(input("输入两小区距离:")) + update_matrix_distance(c1, c2, dis) + except: + print("距离必须是数字") + + # v4 + elif choice == "11": + # 二叉树范围查询 + print("请选择查询维度:1-租金 2-面积") + dim_choice = input("输入维度编号:") + key_field = "price" if dim_choice == "1" else "area" + field_name = "租金" if dim_choice == "1" else "面积" + + try: + min_val = float(input(f"输入{field_name}最小值:")) + max_val = float(input(f"输入{field_name}最大值:")) + except: + print("数值必须是数字!") + continue + + # 读取所有房源,构建二叉树 + all_houses = read_houses() + if not all_houses: + print("暂无房源数据!") + continue + bst_root = build_house_bst(all_houses, key_field) + # 范围查询 + result = search_bst_range(bst_root, min_val, max_val, key_field) + if not result: + print(f"未找到{field_name}在{min_val}-{max_val}之间的房源") + else: + print(f"\n{field_name}在{min_val}-{max_val}之间的房源:") + for h in result: + print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[key_field]}") + + elif choice == "12": + # 冒泡排序 + print("请选择排序维度:1-租金 2-面积") + dim_choice = input("输入维度编号:") + sort_field = "price" if dim_choice == "1" else "area" + field_name = "租金" if dim_choice == "1" else "面积" + + print("请选择排序方式:1-升序 2-降序") + sort_way = input("输入方式编号:") + reverse = (sort_way == "2") + + all_houses = read_houses() + if not all_houses: + print("暂无房源数据!") + continue + # 冒泡排序 + sorted_houses = bubble_sort_houses(all_houses, sort_field, reverse) + print(f"\n按{field_name}{'降序' if reverse else '升序'}排序结果(冒泡排序):") + for h in sorted_houses: + print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[sort_field]}") + + elif choice == "13": + # 快速排序 + print("请选择排序维度:1-租金 2-面积") + dim_choice = input("输入维度编号:") + sort_field = "price" if dim_choice == "1" else "area" + field_name = "租金" if dim_choice == "1" else "面积" + + print("请选择排序方式:1-升序 2-降序") + sort_way = input("输入方式编号:") + reverse = (sort_way == "2") + + all_houses = read_houses() + if not all_houses: + print("暂无房源数据!") + continue + # 快速排序 + sorted_houses = quick_sort_houses(all_houses, sort_field, reverse) + print(f"\n按{field_name}{'降序' if reverse else '升序'}排序结果(快速排序):") + for h in sorted_houses: + print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[sort_field]}") + + elif choice == "14": + print("系统退出成功!") + break + else: + print("请输入有效编号") + + +if __name__ == "__main__": + main() \ No newline at end of file