鱼C论坛

 找回密码
 立即注册
查看: 219|回复: 3

[已解决]代码求助

[复制链接]
发表于 2025-2-18 16:09:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Member:
    def __init__(self,name,job,grade,year,uid,asalary):
        self.name=name
        self.job=job
        self.grade=grade
        self.year=year
        self.uid=uid
        self.asalary=asalary
    def get_uid(self):
        return self.uid
    def get_name(self):
        return self.name
    def get_job(self):
        return self.job
    def get_grade(self):
        return self.grade
    def get_year(self):
        return self.year
    def get_salary(self):
        return self.asalary
class Mixin:
    def confirm_grade(self,job,grade):
        if job == 'E':
            while int(grade)>10:
                grade=input('该职位最高级别为10,请重新录入级别:')
        if job == 'T':
            while int(grade)>6:
                grade=input('该职位最高级别为6,请重新录入级别:')
        if job == 'M':
            while int(grade)>3:
                grade=input('该职位最高级别为3,请重新录入级别:')
        return grade
    def salary(self,job,grade,year):
        if job == 'E':
            asalary=3000+500*int(grade)+50*int(year)
        if job == 'T':
            asalary=4000+800*int(grade)+100*int(year)
        if job == 'M':
            asalary=5000+1000*(int(grade)+int(year))
        return asalary

class Manage(Mixin):
    def __init__(self):
        self.members={}
        self.uid=10000
        self.joblist=[]
    def welcome(self):
        ins=0
        condition=1
        while condition:
            ins=input("\n1.录入;2.查询;3.升级;4.降级;5.退出:")
            if ins=='1':
                self.add_member()
            if ins=='2':
                self.get_member()
            if ins=='3':
                self.upgrade_member()
            if ins=='4':
                self.downgrade_member()
            if ins=='5':
                condition=0
    def add_member(self):
        name=input('姓名:')
        job=input('职位(E.普通员工;T.组长;M.经理):')
        year=input('工龄:')
        grade=input('级别:')
        grade=self.confirm_grade(job,grade)
        uid=self.uid
        self.uid+=1
        asalary=self.salary(job,grade,year)
        self.members[uid]=Member(uid,name,job,year,grade,asalary)
        print(f'录入成功!姓名:{name},工号:{uid},薪资:{asalary}')
        
    def get_member(self):
        type=int(input('1.员工查询;2.职位查询:'))
        if type == 1:
            uid=int(input('请输入员工号:'))
            print(self.members.values())
            if uid not in list(self.members.values()):
                print('该工号不存在!')
            else:
                name=self.members.get(uid).name
                job=self.members.get(uid).job
                year=self.members.get(uid).year
                grade=self.members.get(uid).grade
                asalary=self.members.get(uid).asalary
                print(f'姓名:{name}')
                print(f'职位:{job}')
                print(f'级别:{grade}')
                print(f'工龄:{year}')
                print(f'薪资:{asalary}')
        if type == 2:
            jobins=input('职位(E.普通员工;T.组长;M.经理):')
            if jobins=='E':
                for each in self.members:
                    if each.job == jobins:
                        self.joblist.append(each)
                if self.joblist ==[]:
                    print('目前公司没有普通员工!')
                else:
                    print(f'目前普通员工共有{len(self.joblist)}人:')
                    for each in self.joblist:
                        print(f'{each}-{each.name}')
            if jobins=='T':
                for each in self.members:
                    if each.job == jobins:
                        self.joblist.append(each)
                if self.joblist ==[]:
                    print('目前公司没有组长!')
                else:
                    print(f'目前组长共有{len(self.joblist)}人:')
                    for each in self.joblist:
                        print(f'{each}-{each.name}')
            if jobins=='M':
                for each in self.members:
                    if each.job == jobins:
                        self.joblist.append(each)
                if self.joblist ==[]:
                    print('目前公司没有经理!')
                else:
                    print(f'目前经理共有{len(self.joblist)}人:')
                    for each in self.joblist:
                        print(f'{each}-{each.name}')
    def upgrade_member(self):
        uidins=input('请输入工号:')
        print(f'{self.members.get(uidins).name},工号:{self.members.get(uidins).uid},当前职位{self.members.get(uidins).job}{self.members.get(uidins).grade},当前薪资:{self.members.get(uidins).asalary}')
        up=int(input('请输入需要增加的级数:'))
        self.members.get(uidins).grade+=up
        if self.members.get(uidins).job=='E' and self.members.get(uidins).grade >10:
           self.members.get(uidins).job='T'
           self.members.get(uidins).grade=1
        if self.members.get(uidins).job=='T' and self.members.get(uidins).grade >6:
           self.members.get(uidins).job='M'
           self.members.get(uidins).grade=1
        print('升级成功!')
        print(f'{self.members.get(uidins).name},工号:{self.members.get(uidins).uid},升级后职位{self.members.get(uidins).job}{self.members.get(uidins).grade},升级后薪资:{self.members.get(uidins).asalary}')
    def downgrade_member(self):
        uidins=input('请输入工号:')
        print(f'{self.members.get(uidins).name},工号:{self.members.get(uidins).uid},当前职位{self.members.get(uidins).job}{self.members.get(uidins).grade},当前薪资:{self.members.get(uidins).asalary}')
        down=int(input('请输入需要减少的级数:'))
        self.members.get(uidins).grade-=down
        if self.members.get(uidins).job=='M' and self.members.get(uidins).grade <0:
           self.members.get(uidins).job='T'
           self.members.get(uidins).grade=6
        if self.members.get(uidins).job=='T' and self.members.get(uidins).grade <0:
           self.members.get(uidins).job='E'
           self.members.get(uidins).grade=10
        print('降级成功!')
        print(f'{self.members.get(uidins).name},工号:{self.members.get(uidins).uid},降级后职位{self.members.get(uidins).job}{self.members.get(uidins).grade},降级后薪资:{self.members.get(uidins).asalary}')
def main():
    m=Manage()
    m.welcome()
以上这段代码中,get_member函数部分的代码是否可实现,或有什么问题吗?
最佳答案
2025-2-18 16:11:52
andreahhhhhh 发表于 2025-02-18 16:10
FishC 发表于 2025-2-18 16:09
你的代码有多个问题, ...


好的,第5个问题提及的是 **`get_member` 方法中无法正确访问 `self.members` 的成员信息**,下面具体展开说明问题的原因及修复方案。

问题分析:

1. **成员存储错误:**
   在 `add_member` 方法中,你将每个新添加的员工对象直接赋值给了 self.members
  
  1. self.members = Member(name, job, grade, year, uid, asalary)
复制代码

   这样,每次添加新员工时,都会覆盖之前存储的员工数据,导致后续查询不到已添加的其他员工。

   正确的做法是: self.members 应该是一个字典,键为员工的工号(uid),值为对应的 Member 对象。这样才能保存多个员工的数据。

2. **查询时访问方式有误:**
   在 `get_member` 方法中,检查员工是否存在的代码如下:
  
  1. if uid not in list(self.members.values()):
  2.        print('该工号不存在!')
复制代码

   这个逻辑是错误的,self.members.values() 返回的是员工对象,而不是工号 (uid),所以这个判断永远不会生效。

   正确的做法是: 使用 if uid not in self.members: 来判断键(工号)是否存在。

3. **字典访问和打印的问题:**
   即使员工存在,代码如下:
  
  1. name = self.members.get(uid).name
复制代码

   访问成员对象的属性时没有问题,但后续逻辑中,需要更清晰地构造输出内容,并确保所有属性被正确访问和打印。

---

解决方法:

以下是修复后的代码:

  1. def add_member(self):
  2.     name = input("姓名:")
  3.     job = input("职位(E.普通员工;T.组长;M.经理):")
  4.     year = input("工龄:")
  5.     grade = input("级别:")
  6.     grade = self.confirm_grade(job, grade)
  7.     uid = self.uid
  8.     self.uid += 1
  9.     asalary = self.salary(job, grade, year)
  10.     # 将新成员加入字典,键为工号,值为Member对象
  11.     self.members[uid] = Member(name, job, grade, year, uid, asalary)
  12.     print(f"录入成功!姓名:{name},工号:{uid},薪资:{asalary}")

  13. def get_member(self):
  14.     type_ = int(input("1.员工查询;2.职位查询:"))
  15.     if type_ == 1:
  16.         # 检索员工工号
  17.         uid = int(input("请输入员工号:"))
  18.         if uid not in self.members:  # 判断工号是否存在
  19.             print("该工号不存在!")
  20.         else:
  21.             # 获取员工对象并打印详情
  22.             member = self.members[uid]
  23.             print(f"姓名:{member.name}")
  24.             print(f"职位:{member.job}")
  25.             print(f"级别:{member.grade}")
  26.             print(f"工龄:{member.year}")
  27.             print(f"薪资:{member.asalary}")
复制代码


改动的部分总结如下:

  • self.members 设置为一个字典,键为员工工号,值为 Member 对象。
  • add_member 中,通过 self.members[uid] = Member(...) 的方式存储多个员工数据。
  • get_member 中,正确地通过工号检查员工是否存在:if uid not in self.members:
  • 根据工号检索对应的员工对象 self.members[uid],然后访问其属性(如 member.name)。


---

验证效果:

按照上述修改后,系统可以正确录入多名员工,并支持通过工号查询员工信息。例如:

输入示例:
  1. 1.录入;2.查询;3.升级;4.降级;5.退出:1
  2. 姓名:张三
  3. 职位(E.普通员工;T.组长;M.经理):E
  4. 工龄:3
  5. 级别:5
  6. 录入成功!姓名:张三,工号:10000,薪资:5750

  7. 1.录入;2.查询;3.升级;4.降级;5.退出:2
  8. 1.员工查询;2.职位查询:1
  9. 请输入员工号:10000
  10. 姓名:张三
  11. 职位:E
  12. 级别:5
  13. 工龄:3
  14. 薪资:5750
复制代码


希望这些修改对你有帮助!如果还有其他问题,欢迎随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-18 16:09:46 | 显示全部楼层
你的代码有多个问题,比如未初始化的变量、逻辑错误等。下面是主要问题和修正建议:

1. 在类 `Manage` 的构造函数中,`self.joblist` 没有正确初始化。
2. `self.members` 的赋值过程中,会覆盖之前存储的成员信息。
3. 在方法 `get_member` 中,存在 `self.joblist ==` 这样的语法错误。
4. `upgrade_member` 和 `downgrade_member` 中对级别和职位的更新没有同步薪资。
5. `get_member` 中无法正确访问 `self.members` 的成员信息。

这里是一个修正后的版本:


  1. class Member:
  2.     def __init__(self, name, job, grade, year, uid, asalary):
  3.         self.name = name
  4.         self.job = job
  5.         self.grade = grade
  6.         self.year = year
  7.         self.uid = uid
  8.         self.asalary = asalary

  9. class Mixin:
  10.     def confirm_grade(self, job, grade):
  11.         max_grade = {"E": 10, "T": 6, "M": 3}
  12.         while int(grade) > max_grade.get(job, 10):
  13.             grade = input(f"该职位最高级别为{max_grade[job]},请重新录入级别:")
  14.         return grade

  15.     def salary(self, job, grade, year):
  16.         if job == 'E':
  17.             return 3000 + 500 * int(grade) + 50 * int(year)
  18.         elif job == 'T':
  19.             return 4000 + 800 * int(grade) + 100 * int(year)
  20.         elif job == 'M':
  21.             return 5000 + 1000 * (int(grade) + int(year))
  22.         return 0

  23. class Manage(Mixin):
  24.     def __init__(self):
  25.         self.members = {}
  26.         self.uid = 10000

  27.     def welcome(self):
  28.         while True:
  29.             ins = input("\n1.录入;2.查询;3.升级;4.降级;5.退出:")
  30.             if ins == '1':
  31.                 self.add_member()
  32.             elif ins == '2':
  33.                 self.get_member()
  34.             elif ins == '3':
  35.                 self.upgrade_member()
  36.             elif ins == '4':
  37.                 self.downgrade_member()
  38.             elif ins == '5':
  39.                 break

  40.     def add_member(self):
  41.         name = input("姓名:")
  42.         job = input("职位(E.普通员工;T.组长;M.经理):")
  43.         year = input("工龄:")
  44.         grade = input("级别:")
  45.         grade = self.confirm_grade(job, grade)
  46.         uid = self.uid
  47.         self.uid += 1
  48.         asalary = self.salary(job, grade, year)
  49.         self.members[uid] = Member(name, job, grade, year, uid, asalary)
  50.         print(f"录入成功!姓名:{name},工号:{uid},薪资:{asalary}")

  51.     def get_member(self):
  52.         type_ = int(input("1.员工查询;2.职位查询:"))
  53.         if type_ == 1:
  54.             uid = int(input("请输入员工号:"))
  55.             member = self.members.get(uid)
  56.             if not member:
  57.                 print("该工号不存在!")
  58.             else:
  59.                 print(f"姓名:{member.name}")
  60.                 print(f"职位:{member.job}")
  61.                 print(f"级别:{member.grade}")
  62.                 print(f"工龄:{member.year}")
  63.                 print(f"薪资:{member.asalary}")
  64.         elif type_ == 2:
  65.             jobins = input("职位(E.普通员工;T.组长;M.经理):")
  66.             joblist = [member for member in self.members.values() if member.job == jobins]
  67.             if not joblist:
  68.                 print(f"目前公司没有{jobins}职位的人!")
  69.             else:
  70.                 print(f"{jobins}职位共有{len(joblist)}人:")
  71.                 for member in joblist:
  72.                     print(f"{member.uid}-{member.name}")

  73.     def upgrade_member(self):
  74.         uid = int(input("请输入工号:"))
  75.         member = self.members.get(uid)
  76.         if not member:
  77.             print("该工号不存在!")
  78.             return
  79.         up = int(input("请输入需要增加的级数:"))
  80.         member.grade += up
  81.         if member.job == 'E' and member.grade > 10:
  82.             member.job, member.grade = 'T', 1
  83.         elif member.job == 'T' and member.grade > 6:
  84.             member.job, member.grade = 'M', 1
  85.         member.asalary = self.salary(member.job, member.grade, member.year)
  86.         print("升级成功!")
  87.         print(f"{member.name}, 工号:{member.uid},升级后职位{member.job}{member.grade},升级后薪资:{member.asalary}")

  88.     def downgrade_member(self):
  89.         uid = int(input("请输入工号:"))
  90.         member = self.members.get(uid)
  91.         if not member:
  92.             print("该工号不存在!")
  93.             return
  94.         down = int(input("请输入需要减少的级数:"))
  95.         member.grade -= down
  96.         if member.job == 'M' and member.grade <= 0:
  97.             member.job, member.grade = 'T', 6
  98.         elif member.job == 'T' and member.grade <= 0:
  99.             member.job, member.grade = 'E', 10
  100.         member.asalary = self.salary(member.job, member.grade, member.year)
  101.         print("降级成功!")
  102.         print(f"{member.name}, 工号:{member.uid},降级后职位{member.job}{member.grade},降级后薪资:{member.asalary}")

  103. manage = Manage()
  104. manage.welcome()
复制代码


修复后的代码更安全,并解决了逻辑问题,你可以测试看看是否符合预期需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-18 16:10:51 | 显示全部楼层
FishC 发表于 2025-2-18 16:09
你的代码有多个问题,比如未初始化的变量、逻辑错误等。下面是主要问题和修正建议:

1. 在类 `Manage`  ...

回复中的第5个问题请具体展开说说,并说说应该如何修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-18 16:11:52 | 显示全部楼层    本楼为最佳答案   
andreahhhhhh 发表于 2025-02-18 16:10
FishC 发表于 2025-2-18 16:09
你的代码有多个问题, ...


好的,第5个问题提及的是 **`get_member` 方法中无法正确访问 `self.members` 的成员信息**,下面具体展开说明问题的原因及修复方案。

问题分析:

1. **成员存储错误:**
   在 `add_member` 方法中,你将每个新添加的员工对象直接赋值给了 self.members
  
  1. self.members = Member(name, job, grade, year, uid, asalary)
复制代码

   这样,每次添加新员工时,都会覆盖之前存储的员工数据,导致后续查询不到已添加的其他员工。

   正确的做法是: self.members 应该是一个字典,键为员工的工号(uid),值为对应的 Member 对象。这样才能保存多个员工的数据。

2. **查询时访问方式有误:**
   在 `get_member` 方法中,检查员工是否存在的代码如下:
  
  1. if uid not in list(self.members.values()):
  2.        print('该工号不存在!')
复制代码

   这个逻辑是错误的,self.members.values() 返回的是员工对象,而不是工号 (uid),所以这个判断永远不会生效。

   正确的做法是: 使用 if uid not in self.members: 来判断键(工号)是否存在。

3. **字典访问和打印的问题:**
   即使员工存在,代码如下:
  
  1. name = self.members.get(uid).name
复制代码

   访问成员对象的属性时没有问题,但后续逻辑中,需要更清晰地构造输出内容,并确保所有属性被正确访问和打印。

---

解决方法:

以下是修复后的代码:

  1. def add_member(self):
  2.     name = input("姓名:")
  3.     job = input("职位(E.普通员工;T.组长;M.经理):")
  4.     year = input("工龄:")
  5.     grade = input("级别:")
  6.     grade = self.confirm_grade(job, grade)
  7.     uid = self.uid
  8.     self.uid += 1
  9.     asalary = self.salary(job, grade, year)
  10.     # 将新成员加入字典,键为工号,值为Member对象
  11.     self.members[uid] = Member(name, job, grade, year, uid, asalary)
  12.     print(f"录入成功!姓名:{name},工号:{uid},薪资:{asalary}")

  13. def get_member(self):
  14.     type_ = int(input("1.员工查询;2.职位查询:"))
  15.     if type_ == 1:
  16.         # 检索员工工号
  17.         uid = int(input("请输入员工号:"))
  18.         if uid not in self.members:  # 判断工号是否存在
  19.             print("该工号不存在!")
  20.         else:
  21.             # 获取员工对象并打印详情
  22.             member = self.members[uid]
  23.             print(f"姓名:{member.name}")
  24.             print(f"职位:{member.job}")
  25.             print(f"级别:{member.grade}")
  26.             print(f"工龄:{member.year}")
  27.             print(f"薪资:{member.asalary}")
复制代码


改动的部分总结如下:

  • self.members 设置为一个字典,键为员工工号,值为 Member 对象。
  • add_member 中,通过 self.members[uid] = Member(...) 的方式存储多个员工数据。
  • get_member 中,正确地通过工号检查员工是否存在:if uid not in self.members:
  • 根据工号检索对应的员工对象 self.members[uid],然后访问其属性(如 member.name)。


---

验证效果:

按照上述修改后,系统可以正确录入多名员工,并支持通过工号查询员工信息。例如:

输入示例:
  1. 1.录入;2.查询;3.升级;4.降级;5.退出:1
  2. 姓名:张三
  3. 职位(E.普通员工;T.组长;M.经理):E
  4. 工龄:3
  5. 级别:5
  6. 录入成功!姓名:张三,工号:10000,薪资:5750

  7. 1.录入;2.查询;3.升级;4.降级;5.退出:2
  8. 1.员工查询;2.职位查询:1
  9. 请输入员工号:10000
  10. 姓名:张三
  11. 职位:E
  12. 级别:5
  13. 工龄:3
  14. 薪资:5750
复制代码


希望这些修改对你有帮助!如果还有其他问题,欢迎随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表