鱼C论坛

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

[已解决]代码求助

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

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函数部分的代码是否可实现,或有什么问题吗?
最佳答案
5 天前
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[uid] = 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[uid]
            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[uid] = Member(...) 的方式存储多个员工数据。
  • get_member 中,正确地通过工号检查员工是否存在:if uid not in self.members:
  • 根据工号检索对应的员工对象 self.members[uid],然后访问其属性(如 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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[job]},请重新录入级别:")
        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[uid] = 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 = [member for member in self.members.values() if member.job == jobins]
            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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1. 在类 `Manage`  ...

回复中的第5个问题请具体展开说说,并说说应该如何修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层    本楼为最佳答案   
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[uid] = 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[uid]
            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[uid] = Member(...) 的方式存储多个员工数据。
  • get_member 中,正确地通过工号检查员工是否存在:if uid not in self.members:
  • 根据工号检索对应的员工对象 self.members[uid],然后访问其属性(如 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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