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

مدیریت محل‌های کار

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

در این بخش از پروژه، شما باید سه کلاس به نام‌های Mine (معدن)، School (مدرسه)، و Company (شرکت) را تعریف کنید. هر سه کلاس باید از کلاس والد WorkPlace (محل کار) ارث ببرند. برای هر کلاس، متد سازنده (__init__) و دو متد calc_capacity و calc_costs را طبق دستورالعمل‌های زیر پیاده‌سازی کنید.


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

ساختار فایل‌های این پروژه به‌صورت زیر خواهد بود:

text
WorkPlace Management
├── work_place.py
├── company.py
├── school.py
└── mine.py

شما باید سه فایل company.py، school.py و mine.py را تکمیل کنید. همچنین باید تغییرات فایل work_place.py که در تمرین قبل انجام دادید را در این‌جا نیز اعمال کنید.


کلاس‌های Mine، School و Company

برای هریک از کلاس‌های Mine، School و Company، موارد زیر را پیاده‌سازی کنید.


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

  • علاوه بر self، تنها یک آرگومان ورودی به نام name را بپذیرد.
  • ابتدا با استفاده از super()، متد سازنده کلاس والد (WorkPlace) را با ارسال آرگومان name فراخوانی کند.
  • سپس، صفت self.expertise را بر اساس نوع کلاس مقداردهی کند: معدن (Mine): "mine" مدرسه (School): "school" شرکت (Company): "company"
python
class Mine(WorkPlace):
    def __init__(self, name):
        super().__init__(name)
        self.expertise = "mine"

این متد باید ظرفیت محل کار را بر اساس صفت self.level محاسبه کرده و نتیجه را در صفت self.capacity ذخیره کند. مقدار self.capacity باید از نوع int (عدد صحیح) باشد. این متد هیچ مقداری را برنمی‌گرداند.

فرمول‌های محاسبه‌ی ظرفیت برای هر نوع محل کار به شرح زیر است (مقدار self.level یک عدد صحیح مثبت است).

معدن (Mine)

self.capacity = self.level2

مدرسه (School)

self.capacity = ⌊√self.level⌋

شرکت (Company)

self.capacity = self.level

python
def calc_capacity(self):
    import math
    if type(self) == Mine:
        self.capacity = self.level ** 2
    elif type(self) == School:
        self.capacity = int(math.sqrt(self.level))
    elif type(self) == Company:
        self.capacity = self.level

این متد باید هزینه‌های محل کار را بر اساس صفت self.level و ثابت‌های موجود در کلاس Consts محاسبه کرده و مقدار محاسبه‌شده را برگرداند. مقدار بازگشتی این متد باید از نوع int باشد.

فرمول‌های محاسبه‌ی هزینه‌ها برای هر نوع محل کار به شرح زیر است (مقدار self.level یک عدد صحیح مثبت است).

معدن (Mine)

costs = Consts.BASE_PLACE_COST + Consts.LEVEL_MUL × self.level

مدرسه (School)

costs = Consts.BASE_PLACE_COST × ⌊√self.level⌋

شرکت (Company)

costs = Consts.BASE_PLACE_COST × self.level

python
def calc_costs(self):
    import math
    if type(self) == Mine:
        return Consts.BASE_PLACE_COST + Consts.LEVEL_MUL * self.level
    elif type(self) == School:
        return Consts.BASE_PLACE_COST * int(math.sqrt(self.level))
    elif type(self) == Company:
        return Consts.BASE_PLACE_COST * self.level

💡 راهنمایی

ثابت BASE_PLACE_COST از طریق Consts.BASE_PLACE_COST و ثابت LEVEL_MUL از طریق Consts.LEVEL_MUL در کلاس Consts (در فایل work_place.py) قابل دسترسی هستند. این ثابت‌ها در فایل پروژه‌ی اولیه مقداردهی شده‌اند.

ثابت Consts.BASE_PLACE_COST یک عدد صحیح است و با Consts.BASE_PRICE (که در تمرین قبل استفاده شد و دیکشنری بود) متفاوت است. در این تمرین از BASE_PRICE استفاده نمی‌کنیم.


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

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

برای استفاده از کلاس WorkPlace و کلاس Consts در فایل‌های mine.py، school.py و company.py، آن‌ها را به صورت زیر از فایل work_place.py وارد کنید:

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

python
from work_place import WorkPlace, Consts

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

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

python
super().__init__(name)

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

توجه کنید در هر دو تابع محاسباتی، باید مقدار نهایی را به‌صورت عدد صحیح درآورید. در متد calc_capacity یک عدد صحیح باید در self.capacity ذخیره شود و در متد calc_costs باید یک عدد صحیح برگردانده شود.

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

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

نمونه‌ها

ورودی نمونه ۱
[Mine("m").expertise, School("s").expertise, Company("c").expertise]
خروجی نمونه ۱
['mine', 'school', 'company']
ورودی نمونه ۲
m = Mine("m")
for _ in range(3):
    m.upgrade()
[m.level, m.capacity, m.calc_costs()]
خروجی نمونه ۲
[4, 16, 2700]
ورودی نمونه ۳
s = School("s")
rows = []
for _ in range(9):
    s.upgrade()
    rows.append((s.level, s.capacity, s.calc_costs()))
rows
خروجی نمونه ۳
[(2, 1, 2500), (3, 1, 2500), (4, 2, 5000), (5, 2, 5000), (6, 2, 5000), (7, 2, 5000), (8, 2, 5000), (9, 3, 7500), (10, 3, 7500)]
ورودی نمونه ۴
c = Company("c")
for _ in range(4):
    c.upgrade()
[c.level, c.capacity, c.calc_costs(), c.get_price()]
خروجی نمونه ۴
[5, 5, 12500, 90]
ورودی نمونه ۵
m = Mine("m")
m.upgrade()
[type(m.capacity).__name__, type(m.calc_costs()).__name__, type(School("s").calc_costs()).__name__]
خروجی نمونه ۵
['int', 'int', 'int']
ورودی نمونه ۶
class P:
    work_place = None

s = School("s")
for _ in range(3):
    s.upgrade()
s.hire(P())
s.hire(P())
try:
    s.hire(P())
except WorkPlaceIsFull as error:
    print(error)
[s.capacity, len(s.employees)]
خروجی نمونه ۶
work place is full!
[2, 2]
ورودی نمونه ۷
Mine("m")
School("s")
Company("c")
WorkPlace.calc_all()
خروجی نمونه ۷
-7550

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

ورود