راه
۵ کیو· متوسط رو به بالامتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

مدیریت کارکنان

این تمرین در اصل برای ارسال چند فایل جدا (در یک zip) نوشته شده است. در این نسخه همه‌ی کلاس‌ها را در همین یک فایل بنویس — import بین فایل‌ها لازم نیست و کار هم نمی‌کند، و فایل zip هم فرستاده نمی‌شود. کد خودت را بنویس و بفرست.

در این بخش از پروژه از شما خواسته می‌شود سه کلاس به نام‌های Worker (کارگر)، Teacher (معلم) و Engineer (مهندس) را تکمیل کنید. این سه کلاس باید از کلاس Person (شخص) که در فایل person.py ارائه شده است، ارث ببرند.

برای هر یک از این کلاس‌های فرزند، لازم است موارد زیر را پیاده‌سازی کنید:

  • سازنده (__init__)
  • متد get_price: محاسبه‌ی هزینه‌ی استخدام
  • متد calc_life_cost: محاسبه‌ی هزینه‌های زندگی
  • متد calc_income: محاسبه‌ی درآمد

در ادامه، جزئیات پیاده‌سازی هر بخش شرح داده شده‌است.


📂 ساختار پروژه‌ی اولیه

text
Employee Management
├── teacher.py
├── worker.py
├── engineer.py
└── person.py

شما باید سه فایل worker.py، teacher.py و engineer.py را تکمیل کنید. همچنین باید تغییرات فایل person.py که در اولین تمرین پروژه انجام دادید را در این‌جا نیز اعمال کنید.


کلاس‌های Worker، Teacher و Engineer

برای هر یک از کلاس‌های Worker، Teacher و Engineer، موارد زیر را پیاده‌سازی کنید.


متد سازنده در هر سه کلاس باید به شکل زیر باشد:

  • علاوه‌بر self، دو آرگومان name و age دریافت می‌شوند.
  • ابتدا، سازنده‌ی کلاس والد (Person) را با استفاده از super() برای آرگومان‌های name و age فراخوانی می‌کند.
  • سپس، ویژگی self.job در هر کلاس مطابق با تخصص آن کلاس تنظیم شود: کلاس Worker: "worker" کلاس Teacher: "teacher" کلاس Engineer: "engineer"
python
class Worker(Person):
    def __init__(self, name, age):
        super().__init__(name, age)
        self.job = "worker"

این متد باید هزینه‌ی استخدام شخص را بر اساس تخصص (self.job) و سن او (self.age) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوع int باشد.

فرمول محاسبه‌ی هزینه برای هر تخصص به شرح زیر است.

کارگر (Worker)

price = ⌊Consts.BASE_PRICE["worker"] × (Consts.MIN_AGE / self.age)⌋

معلم (Teacher)

price = Consts.BASE_PRICE["teacher"] − (self.age − Consts.MIN_AGE) × Consts.AGE_MUL

مهندس (Engineer)

price = ⌊Consts.BASE_PRICE["engineer"] × (Consts.MIN_AGE / self.age)⌋

💡 راهنمایی ۱: ثابت‌های MIN_AGE و AGE_MUL از طریق Consts.MIN_AGE و Consts.AGE_MUL در فایل person.py قابل دسترسی هستند. قیمت پایه (BasePrice) برای هر تخصص در دیکشنری Consts.BASE_PRICE (در فایل person.py) ذخیره شده‌است و با استفاده از Consts.BASE_PRICE[self.job] قابل‌دسترسی است.

python
def get_price(self):
    if self.job == "worker":
        return int(Consts.BASE_PRICE[self.job] * (Consts.MIN_AGE / self.age))
    elif self.job == "teacher":
        return Consts.BASE_PRICE[self.job] - (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
    elif self.job == "engineer":
        return int(Consts.BASE_PRICE[self.job] * (Consts.MIN_AGE / self.age))

این متد باید مقدار مخارج زندگی شخص را بر اساس تخصص (self.job) و سن او (self.age) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوع int باشد.

فرمول محاسبه برای هر تخصص به شرح زیر است.

کارگر (Worker)

costs = ⌊Consts.BASE_COST["worker"] × (Consts.MIN_AGE / self.age)⌋

معلم (Teacher)

costs = Consts.BASE_COST["teacher"] + (self.age − Consts.MIN_AGE) × Consts.AGE_MUL

مهندس (Engineer)

costs = ⌊Consts.BASE_COST["engineer"] × (Consts.MIN_AGE / self.age)⌋

💡 راهنمایی ۲: ثابت MIN_AGE از طریق Consts.MIN_AGE در فایل person.py قابل دسترسی است. مخارج پایه (BaseCost) برای هر تخصص در دیکشنری Consts.BASE_COST (در فایل person.py) ذخیره شده‌است و با استفاده از Consts.BASE_COST[self.job] قابل‌دسترسی است.

python
def calc_life_cost(self):
    if self.job == "worker":
        return int(Consts.BASE_COST[self.job] * (Consts.MIN_AGE / self.age))
    elif self.job == "teacher":
        return Consts.BASE_COST[self.job] + (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
    elif self.job == "engineer":
        return int(Consts.BASE_COST[self.job] * (Consts.MIN_AGE / self.age))

این متد باید درآمد شخص را بر اساس تخصص (self.job)، سن (self.age) و محل کار او (self.work_place) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوع int باشد.

فرمول محاسبه برای هر تخصص به شرح زیر است.

کارگر (Worker)

income = ⌊Consts.BASE_INCOME["worker"][expertise] × (Consts.MIN_AGE / self.age)⌋

معلم (Teacher)

income = Consts.BASE_INCOME["teacher"][expertise] − (self.age − Consts.MIN_AGE) × Consts.AGE_MUL

مهندس (Engineer)

income = ⌊Consts.BASE_INCOME["engineer"][expertise] × (Consts.MIN_AGE / self.age)⌋

💡 راهنمایی ۳: ثابت‌های MIN_AGE و AGE_MUL از طریق Consts.MIN_AGE و Consts.AGE_MUL در فایل person.py قابل دسترسی هستند. درآمد پایه (BaseIncome) پیچیده‌تر است. در دیکشنری تودرتوی Consts.BASE_INCOME (در فایل person.py) ذخیره شده‌است. برای دسترسی به آن از ساختار Consts.BASE_INCOME[self.job][self.work_place.get_expertise()] استفاده کنید.

python
def calc_income(self):
    expertise = self.work_place.get_expertise()
    if self.job == "worker":
        return int(Consts.BASE_INCOME[self.job][expertise] * (Consts.MIN_AGE / self.age))
    elif self.job == "teacher":
        return Consts.BASE_INCOME[self.job][expertise] - (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
    elif self.job == "engineer":
        return int(Consts.BASE_INCOME[self.job][expertise] * (Consts.MIN_AGE / self.age))

💡 چالش‌های حل تمرین

⚠️ چگونه از کلاس Person و کلاس Consts استفاده کنم؟

برای استفاده از کلاس Person و کلاس Consts در فایل‌های worker.py، teacher.py و engineer.py، آن‌ها را به‌صورت زیر از فایل person.py وارد کنید:

کلاس Person را مطابق آن‌چه در تمرین اول پروژه پیاده‌سازی کردید، خودتان تکمیل کنید. توجه کنید کلاس Consts دقیقاً مشابه آن‌چه در پروژه‌ی اولیه‌ی این بخش آمده‌است باشد.

python
from person import Person, Consts

⚠️ چگونه شیء super() را استفاده کنم؟

برای فراخوانی متد سازنده کلاس والد از super() به شکل زیر استفاده کنید:

python
super().__init__(name, age)

⚠️ چرا با این‌که فرمول‌های ریاضی را به‌درستی پیاده‌سازی کرده‌ام، نمره‌ی مربوط به توابع محاسباتی را دریافت نمی‌کنم؟

توجه کنید در هر سه تابع محاسباتی، باید مقدار نهایی را به‌صورت عدد صحیح درآورید و آن را برگردانید.

⚠️ مشکلات متداول

  • در هیچ‌یک از توابع نباید مقداری را چاپ کنید، بلکه باید مقادیر خواسته‌شده را با استفاده از return برگردانید. دقت داشته باشید که برخی توابع (مطابق توضیحاتشان) نیازی به برگرداندن مقدار ندارند.
  • حتماً فایل person.py که در تمرین قبل تکمیل کردید را به این قسمت انتقال دهید و همراه دیگر فایل‌ها ارسال کنید.

نمونه‌ها

ورودی نمونه ۱
[Worker("a", 20).job, Teacher("b", 30).job, Engineer("c", 40).job]
خروجی نمونه ۱
['worker', 'teacher', 'engineer']
ورودی نمونه ۲
[Worker("w", 30).get_price(), Teacher("t", 30).get_price(), Engineer("e", 30).get_price()]
[Worker("w", 17).get_price(), Teacher("t", 17).get_price(), Engineer("e", 17).get_price()]
خروجی نمونه ۲
[600, 1350, 1000]
[1058, 1480, 1764]
ورودی نمونه ۳
[Worker("w", 30).calc_life_cost(), Teacher("t", 30).calc_life_cost(), Engineer("e", 30).calc_life_cost()]
[Worker("w", 45).calc_life_cost(), Teacher("t", 45).calc_life_cost(), Engineer("e", 45).calc_life_cost()]
خروجی نمونه ۳
[100, 300, 150]
[66, 450, 100]
ورودی نمونه ۴
w = Worker("w", 20)
w.work_place = StandInMine()
t = Teacher("t", 25)
t.work_place = StandInMine()
e = Engineer("e", 60)
e.work_place = StandInMine()
[w.calc_income(), t.calc_income(), e.calc_income()]
خروجی نمونه ۴
[600, 200, 250]
ورودی نمونه ۵
e = Engineer("e", 30)
e.upgrade()
e.work_place = StandInMine(level=8)
e.calc()
خروجی نمونه ۵
1850.0
ورودی نمونه ۶
values = [Worker("w", 23).get_price(), Engineer("e", 23).calc_life_cost()]
[type(v).__name__ for v in values]
[isinstance(Teacher("t", 20), Person), len(Person.instances)]
خروجی نمونه ۶
['int', 'int']
[True, 3]

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود