项目实践-家谱系统实现(数据结构+Python)

1.源代码

class FamilyMember:
    def __init__(self, name, birth_date, married, address, alive, role, generation):
        self.name = name
        self.birth_date = birth_date
        self.married = married
        self.address = address
        self.alive = alive
        self.role = role
        self.generation = generation
        self.children = []

    def __str__(self):
        alive_status = "是" if self.alive else "否"
        married_status = "已婚" if self.married else "未婚"
        return f"姓名: {self.name}, 出生日期: {self.birth_date}, 婚否: {married_status}, 地址: {self.address}, 健在: {alive_status}, 角色: {self.role}, 代数: {self.generation}"

class FamilyTree:
    def __init__(self):
        self.members = []

    def add_member(self, member):
        self.members.append(member)

    def display_family_tree(self):
        print("\n家谱成员信息:")
        for member in self.members:
            print(member)
            if member.children:
                print("    孩子:")
                for child in member.children:
                    print(f"        {child.name}")

    def find_member_by_name(self, name):
        for member in self.members:
            if member.name == name:
                return member
        return None

    def find_members_by_birth_date(self, birth_date):
        return [member for member in self.members if member.birth_date == birth_date]

    def add_child(self, parent_name, child):
        parent = self.find_member_by_name(parent_name)
        if parent:
            parent.children.append(child)
            child.parent = parent  # 更新孩子对象中的parent属性
            print(f"成功添加孩子: {child.name} 到 {parent.name}")
        else:
            print("未找到该父母成员。")

    def delete_member(self, name):
        member = self.find_member_by_name(name)
        if member:
            self.members.remove(member)
            for m in self.members:  # 更新其他成员的孩子列表
                if member in m.children:
                    m.children.remove(member)
            print(f"成功删除成员: {name}")
        else:
            print("未找到该成员。")

    def modify_member(self, name, **kwargs):
        member = self.find_member_by_name(name)
        if member:
            for key, value in kwargs.items():
                if hasattr(member, key):  # 确保属性存在
                    setattr(member, key, value)
            print(f"成功修改成员: {name}")
        else:
            print("未找到该成员。")

def print_menu():
    print("$-----------------家谱管理系统--------------------$")
    print("$\t\t\t\t 1. 添加成员\t\t\t\t\t\t$")
    print("$\t\t\t\t 2. 显示家谱\t\t\t\t\t\t$")
    print("$\t\t\t\t 3. 按姓名查询成员\t\t\t\t\t$")
    print("$\t\t\t\t 4. 按出生日期查询成员\t\t\t\t$")
    print("$\t\t\t\t 5. 添加孩子\t\t\t\t\t\t$")
    print("$\t\t\t\t 6. 删除成员\t\t\t\t\t\t$")
    print("$\t\t\t\t 7. 修改成员信息\t\t\t\t\t$")
    print("$\t\t\t\t 8. 退出\t\t\t\t\t\t\t$")
    print("$-----------------------------------------------$")

def main():
    family_tree = FamilyTree()

    while True:
        print_menu()
        choice = input("请选择一个操作: ")

        if choice == '1':
            name = input("姓名: ")
            birth_date = input("出生日期: ")
            married = input("婚否 (是/否): ") == "是"
            address = input("地址: ")
            alive = input("健在否 (是/否): ") == "是"
            role = input("角色: ")
            try:
                generation = int(input("代数: "))
            except ValueError:
                print("代数必须是整数,请重新输入。")
                continue
            new_member = FamilyMember(name, birth_date, married, address, alive, role, generation)
            family_tree.add_member(new_member)
            print("成员添加成功!")

        elif choice == '2':
            family_tree.display_family_tree()

        elif choice == '3':
            name = input("输入姓名查询: ")
            member = family_tree.find_member_by_name(name)
            if member:
                print(member)
            else:
                print("未找到该成员。")

        elif choice == '4':
            birth_date = input("输入出生日期查询: ")
            members = family_tree.find_members_by_birth_date(birth_date)
            if members:
                print("找到的成员:")
                for member in members:
                    print(member)
            else:
                print("未找到该出生日期的成员。")

        elif choice == '5':
            parent_name = input("输入父母姓名: ")
            name = input("孩子姓名: ")
            birth_date = input("出生日期: ")
            married = False  # 孩子默认未婚
            address = input("地址: ")
            alive = True  # 孩子默认健在
            role = "孩子"
            try:
                generation = int(input("代数: "))
            except ValueError:
                print("代数必须是整数,请重新输入。")
                continue
            child = FamilyMember(name, birth_date, married, address, alive, role, generation)
            family_tree.add_child(parent_name, child)

        elif choice == '6':
            name = input("输入要删除的成员姓名: ")
            family_tree.delete_member(name)

        elif choice == '7':
            name = input("输入要修改的成员姓名: ")
            print("输入新的信息(不修改的字段留空):")
            birth_date = input("新的出生日期(留空则不修改): ")
            married = input("新的婚否(留空则不修改,输入'是'或'否'): ")
            married = True if married == "是" else False if married == "否" else None
            address = input("新的地址(留空则不修改): ")
            alive = input("新的健在否(留空则不修改,输入'是'或'否'): ")
            alive = True if alive == "是" else False if alive == "否" else None
            role = input("新的角色(留空则不修改): ")
            generation_input = input("新的代数(留空则不修改): ")
            generation = int(generation_input) if generation_input else None

            updates = {}
            if birth_date:
                updates['birth_date'] = birth_date
            if married is not None:
                updates['married'] = married
            if address:
                updates['address'] = address
            if alive is not None:
                updates['alive'] = alive
            if role:
                updates['role'] = role
            if generation is not None:
                updates['generation'] = generation

            family_tree.modify_member(name, **updates)

        elif choice == '8':
            print("感谢使用家谱管理系统,程序即将退出。")
            break

        else:
            print("无效的选择,请重新输入。")

if __name__ == "__main__":
    main()

2.核心代码的提炼

2.1 完整体的解释

这个Python脚本实现了一个简单的家谱管理系统。下面是核心代码的提炼和解释:

 

1.FamilyMember类这个类用于表示家谱中的一个成员。

• 属性: • name:成员的名字。

birth_date:出生日期。

married:是否已婚。

address:地址。

alive:是否健在。

role:角色(例如:父亲、母亲、孩子等)。

generation:代数。

children:孩子列表。

• 方法:

__str__:返回成员的详细信息。

__init__:初始化成员信息。

 

2.FamilyTree类这个类用于管理整个家谱。

• 属性: • members:家谱成员列表。

• 方法: • add_member:添加一个新成员到家谱。

display_family_tree:显示整个家谱。

find_member_by_name:通过名字查找成员。

find_members_by_birth_date:通过出生日期查找成员。

add_child:为某个成员添加孩子。

delete_member:删除一个成员。

modify_member:修改成员信息。

 

3.print_menu函数显示操作菜单。

 

4.main函数程序的主入口,实现了一个循环,让用户可以选择不同的操作来管理家谱。

• 操作:

• 添加成员。

• 显示家谱。

• 按姓名查询成员。

• 按出生日期查询成员。

• 添加孩子。 • 删除成员。

• 修改成员信息。

• 退出程序。

代码流程解释

• 初始化家谱:创建一个FamilyTree实例。

• 显示菜单:循环显示操作菜单。

• 用户输入:根据用户的选择执行不同的操作。

• 执行操作:根据用户输入执行相应的家谱管理操作。

• 退出程序:当用户选择退出时,结束循环并退出程序。

这个脚本通过命令行交互,

允许用户管理一个家谱,包括添加、查询、修改和删除成员信息。

2.2 功能1: 添加成员的实现

2.2.1 代码如下:

class FamilyMember:
    def __init__(self, name, birth_date, married, address, alive, role, generation):
        self.name = name
        self.birth_date = birth_date
        self.married = married
        self.address = address
        self.alive = alive
        self.role = role
        self.generation = generation
        self.children = []

    def __str__(self):
        alive_status = "是" if self.alive else "否"
        married_status = "已婚" if self.married else "未婚"
        return f"姓名: {self.name}, 出生日期: {self.birth_date}, 婚否: {married_status}, 地址: {self.address}, 健在: {alive_status}, 角色: {self.role}, 代数: {self.generation}"

2.2.2 测试结果如下:

f5eab74d7e2e40d48119e12ad961f2a6.png

 2.3 功能2:显示家谱的实现

2.3.1 代码如下:

class FamilyTree:
    def __init__(self):
        self.members = []

    def add_member(self, member):
        self.members.append(member)

    def display_family_tree(self):
        print("\n家谱成员信息:")
        for member in self.members:
            print(member)
            if member.children:
                print("    孩子:")
                for child in member.children:
                    print(f"        {child.name}")

2.3.2 测试结果如下:

9a1d78b54d14445c94899bf6e0a75e6f.png

2.4 功能3,4:按姓名/出生日期查询成员的实现

2.4.1 代码如下:

 def find_member_by_name(self, name):
        for member in self.members:
            if member.name == name:
                return member
        return None

    def find_members_by_birth_date(self, birth_date):
        return [member for member in self.members if member.birth_date == birth_date]

2.4.2 测试结果如下:

47b26b35daeb408183ece3e8cb6e65f8.png

2.5 功能5:添加孩子的实现

2.5.1 代码如下:

  def add_child(self, parent_name, child):
        parent = self.find_member_by_name(parent_name)
        if parent:
            parent.children.append(child)
            child.parent = parent  # 更新孩子对象中的parent属性
            print(f"成功添加孩子: {child.name} 到 {parent.name}")
        else:
            print("未找到该父母成员。")

2.5.2 测试结果如下:

815986f32920425caf7c3a2d1979d934.png

 2.6 功能6,7:删除成员/修改成员信息的实现

2.6.1 代码如下:

 def delete_member(self, name):
        member = self.find_member_by_name(name)
        if member:
            self.members.remove(member)
            for m in self.members:  # 更新其他成员的孩子列表
                if member in m.children:
                    m.children.remove(member)
            print(f"成功删除成员: {name}")
        else:
            print("未找到该成员。")
    def modify_member(self, name, **kwargs):
        member = self.find_member_by_name(name)
        if member:
            for key, value in kwargs.items():
                if hasattr(member, key):  # 确保属性存在
                    setattr(member, key, value)
            print(f"成功修改成员: {name}")
        else:
            print("未找到该成员。")

2.6.2 测试结果如下:

ed16b65d5b30444b800a372bd7dc3533.png

2.7 print_menu(菜单栏)的实现

2.7.1 代码如下:

def print_menu():
    print("$-----------------家谱管理系统--------------------$")
    print("$\t\t\t\t 1. 添加成员\t\t\t\t\t\t$")
    print("$\t\t\t\t 2. 显示家谱\t\t\t\t\t\t$")
    print("$\t\t\t\t 3. 按姓名查询成员\t\t\t\t\t$")
    print("$\t\t\t\t 4. 按出生日期查询成员\t\t\t\t$")
    print("$\t\t\t\t 5. 添加孩子\t\t\t\t\t\t$")
    print("$\t\t\t\t 6. 删除成员\t\t\t\t\t\t$")
    print("$\t\t\t\t 7. 修改成员信息\t\t\t\t\t$")
    print("$\t\t\t\t 8. 退出\t\t\t\t\t\t\t$")
    print("$-----------------------------------------------$")

2.7.2 测试结果如下:

 94a9681d8deb4fb985844fbd0f2a60c6.png

2.8 main函数程序的入口

2.8.1 代码如下:

def main():
    family_tree = FamilyTree()

    while True:
        print_menu()
        choice = input("请选择一个操作: ")

        if choice == '1':
            name = input("姓名: ")
            birth_date = input("出生日期: ")
            married = input("婚否 (是/否): ") == "是"
            address = input("地址: ")
            alive = input("健在否 (是/否): ") == "是"
            role = input("角色: ")
            try:
                generation = int(input("代数: "))
            except ValueError:
                print("代数必须是整数,请重新输入。")
                continue
            new_member = FamilyMember(name, birth_date, married, address, alive, role, generation)
            family_tree.add_member(new_member)
            print("成员添加成功!")

        elif choice == '2':
            family_tree.display_family_tree()

        elif choice == '3':
            name = input("输入姓名查询: ")
            member = family_tree.find_member_by_name(name)
            if member:
                print(member)
            else:
                print("未找到该成员。")

        elif choice == '4':
            birth_date = input("输入出生日期查询: ")
            members = family_tree.find_members_by_birth_date(birth_date)
            if members:
                print("找到的成员:")
                for member in members:
                    print(member)
            else:
                print("未找到该出生日期的成员。")

        elif choice == '5':
            parent_name = input("输入父母姓名: ")
            name = input("孩子姓名: ")
            birth_date = input("出生日期: ")
            married = False  # 孩子默认未婚
            address = input("地址: ")
            alive = True  # 孩子默认健在
            role = "孩子"
            try:
                generation = int(input("代数: "))
            except ValueError:
                print("代数必须是整数,请重新输入。")
                continue
            child = FamilyMember(name, birth_date, married, address, alive, role, generation)
            family_tree.add_child(parent_name, child)

        elif choice == '6':
            name = input("输入要删除的成员姓名: ")
            family_tree.delete_member(name)

        elif choice == '7':
            name = input("输入要修改的成员姓名: ")
            print("输入新的信息(不修改的字段留空):")
            birth_date = input("新的出生日期(留空则不修改): ")
            married = input("新的婚否(留空则不修改,输入'是'或'否'): ")
            married = True if married == "是" else False if married == "否" else None
            address = input("新的地址(留空则不修改): ")
            alive = input("新的健在否(留空则不修改,输入'是'或'否'): ")
            alive = True if alive == "是" else False if alive == "否" else None
            role = input("新的角色(留空则不修改): ")
            generation_input = input("新的代数(留空则不修改): ")
            generation = int(generation_input) if generation_input else None

            updates = {}
            if birth_date:
                updates['birth_date'] = birth_date
            if married is not None:
                updates['married'] = married
            if address:
                updates['address'] = address
            if alive is not None:
                updates['alive'] = alive
            if role:
                updates['role'] = role
            if generation is not None:
                updates['generation'] = generation

            family_tree.modify_member(name, **updates)

        elif choice == '8':
            print("感谢使用家谱管理系统,程序即将退出。")
            break

        else:
            print("无效的选择,请重新输入。")

if __name__ == "__main__":
    main()

 

作者:Cyber_4K

物联沃分享整理
物联沃-IOTWORD物联网 » 项目实践-家谱系统实现(数据结构+Python)

发表回复