andreahhhhhh 发表于 2025-2-18 16:09:25

代码求助

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=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函数部分的代码是否可实现,或有什么问题吗?

FishC 发表于 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` 的成员信息。

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


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

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

    def salary(self, job, grade, year):
      if job == 'E':
            return 3000 + 500 * int(grade) + 50 * int(year)
      elif job == 'T':
            return 4000 + 800 * int(grade) + 100 * int(year)
      elif job == 'M':
            return 5000 + 1000 * (int(grade) + int(year))
      return 0

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

    def welcome(self):
      while True:
            ins = input("\n1.录入;2.查询;3.升级;4.降级;5.退出:")
            if ins == '1':
                self.add_member()
            elif ins == '2':
                self.get_member()
            elif ins == '3':
                self.upgrade_member()
            elif ins == '4':
                self.downgrade_member()
            elif ins == '5':
                break

    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 = Member(name, job, grade, year, uid, asalary)
      print(f"录入成功!姓名:{name},工号:{uid},薪资:{asalary}")

    def get_member(self):
      type_ = int(input("1.员工查询;2.职位查询:"))
      if type_ == 1:
            uid = int(input("请输入员工号:"))
            member = self.members.get(uid)
            if not member:
                print("该工号不存在!")
            else:
                print(f"姓名:{member.name}")
                print(f"职位:{member.job}")
                print(f"级别:{member.grade}")
                print(f"工龄:{member.year}")
                print(f"薪资:{member.asalary}")
      elif type_ == 2:
            jobins = input("职位(E.普通员工;T.组长;M.经理):")
            joblist =
            if not joblist:
                print(f"目前公司没有{jobins}职位的人!")
            else:
                print(f"{jobins}职位共有{len(joblist)}人:")
                for member in joblist:
                  print(f"{member.uid}-{member.name}")

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

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

manage = Manage()
manage.welcome()


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

andreahhhhhh 发表于 2025-2-18 16:10:51

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

1. 在类 `Manage`...

回复中的第5个问题请具体展开说说,并说说应该如何修改

FishC 发表于 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:
   self.members = Member(name, job, grade, year, uid, asalary)
   这样,每次添加新员工时,都会覆盖之前存储的员工数据,导致后续查询不到已添加的其他员工。

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

2. **查询时访问方式有误:**
   在 `get_member` 方法中,检查员工是否存在的代码如下:
   if uid not in list(self.members.values()):
       print('该工号不存在!')
   这个逻辑是错误的,self.members.values() 返回的是员工对象,而不是工号 (uid),所以这个判断永远不会生效。

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

3. **字典访问和打印的问题:**
   即使员工存在,代码如下:
   name = self.members.get(uid).name
   访问成员对象的属性时没有问题,但后续逻辑中,需要更清晰地构造输出内容,并确保所有属性被正确访问和打印。

---

解决方法:

以下是修复后的代码:

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)
    # 将新成员加入字典,键为工号,值为Member对象
    self.members = Member(name, job, grade, year, uid, asalary)
    print(f"录入成功!姓名:{name},工号:{uid},薪资:{asalary}")

def get_member(self):
    type_ = int(input("1.员工查询;2.职位查询:"))
    if type_ == 1:
      # 检索员工工号
      uid = int(input("请输入员工号:"))
      if uid not in self.members:# 判断工号是否存在
            print("该工号不存在!")
      else:
            # 获取员工对象并打印详情
            member = self.members
            print(f"姓名:{member.name}")
            print(f"职位:{member.job}")
            print(f"级别:{member.grade}")
            print(f"工龄:{member.year}")
            print(f"薪资:{member.asalary}")

改动的部分总结如下:

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


---

验证效果:

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

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

1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职位查询:1
请输入员工号:10000
姓名:张三
职位:E
级别:5
工龄:3
薪资:5750

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 代码求助