مدیریت محلهای کار
این تمرین در اصل برای ارسال چند فایل جدا (در یک zip) نوشته شده است. در این نسخه همهی کلاسها را در همین یک فایل بنویس — import بین فایلها لازم نیست و کار هم نمیکند، و فایل zip هم فرستاده نمیشود. کد خودت را بنویس و بفرست.
در این بخش از پروژه، شما باید سه کلاس به نامهای Mine (معدن)، School (مدرسه)، و Company (شرکت) را تعریف کنید. هر سه کلاس باید از کلاس والد WorkPlace (محل کار) ارث ببرند. برای هر کلاس، متد سازنده (__init__) و دو متد calc_capacity و calc_costs را طبق دستورالعملهای زیر پیادهسازی کنید.
📂 ساختار پروژهی اولیه
ساختار فایلهای این پروژه بهصورت زیر خواهد بود:
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"
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
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
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دقیقاً مشابه آنچه در پروژهی اولیهی این بخش آمدهاست باشد.
from work_place import WorkPlace, Consts
⚠️ چگونه شیء
super()را استفاده کنم؟برای فراخوانی متد سازنده کلاس والد از
super()به شکل زیر استفاده کنید:
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
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود