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

مدیریت داروخانه

در این تمرین، قصد داریم با استفاده از مفاهیم شیءگرایی در پایتون، سیستمی ساده برای مدیریت اطلاعات داروها و کارمندان در یک داروخانه ایجاد کنیم. برای یک داروخانه، برنامه‌ای بنویسید که بتواند اطلاعات داروها و کارمندان را ذخیره و مدیریت کند. شما باید با تعریف دو کلاس اصلی، این سیستم را پیاده‌سازی کنید.


کلاس Drug

این کلاس برای نمایش اطلاعات یک قلم دارو استفاده می‌شود. هر شیء از این کلاس باید اطلاعات مربوط به یک داروی خاص را در خود نگه دارد.

این کلاس تنها در زمان ایجاد شیء (در متد سازنده) مقادیر اولیه را دریافت می‌کند و آن‌ها را به‌عنوان ویژگی‌های شیء ذخیره می‌کند:

  • name: نام دارو (نوع: رشته)
  • amount: موجودی یا تعداد دارو (نوع: عدد صحیح)
  • price: قیمت واحد دارو (نوع: عدد صحیح)

این متد هنگام ایجاد یک شیء جدید از کلاس Drug فراخوانی می‌شود و سه آرگومان name، amount و price را دریافت می‌کند. این مقادیر را به ترتیب در ویژگی‌های self.name، self.amount و self.price شیء فعلی ذخیره می‌کند.

python
class Drug:
    def __init__(self, name, amount, price):
        self.name = name
        self.amount = amount
        self.price = price

کلاس Pharmacy

این کلاس برای نمایش اطلاعات داروخانه به‌عنوان یک کل، شامل مجموعه‌ای از داروها و کارمندان، استفاده می‌شود.

  • name: نام داروخانه (نوع: رشته)
  • drugs: لیستی برای نگهداری اشیاء کلاس Drug که در داروخانه موجود هستند (نوع: لیست). این لیست در ابتدا باید خالی باشد.
  • employees: لیستی برای نگهداری اطلاعات کارمندان (نوع: لیست). اطلاعات هر کارمند در قالب یک دیکشنری ذخیره می‌شود. این لیست در ابتدا باید خالی باشد.

هنگام ایجاد یک شیء جدید از کلاس Pharmacy فراخوانی می‌شود و یک آرگومان name برای نام داروخانه دریافت می‌کند. سپس مقدار name را در ویژگی self.name ذخیره می‌کند. ویژگی‌های self.drugs و self.employees را نیز برابر با لیست‌های خالی قرار می‌دهد.

python
class Pharmacy:
    def __init__(self, name):
        self.name = name
        self.drugs = []
        self.employees = []

متد add_drug

یک آرگومان دریافت می‌کند که باید یک شیء از کلاس Drug باشد. این شیء Drug را به لیست self.drugs اضافه می‌کند.

python
def add_drug(self, drug):
    self.drugs.append(drug)

متد add_employee

سه آرگومان first_name (نام کوچک)، last_name (نام خانوادگی)، و age (سن) را دریافت می‌کند. اطلاعات این کارمند را در قالب یک دیکشنری با کلیدهای "first_name"، "last_name"، و "age" ذخیره می‌کند. سپس این دیکشنری را به لیست self.employees اضافه می‌کند.

python
def add_employee(self, first_name, last_name, age):
    employee = {
        "first_name": first_name,
        "last_name": last_name,
        "age": age
    }
    self.employees.append(employee)

💡 مثال

json
{
    "first_name": "Mohammad",
    "last_name": "Mohammadi",
    "age": 19
}

متد total_value

این متد، ارزش کل موجودی داروها در داروخانه را محاسبه کرده و برمی‌گرداند.

ارزش هر دارو برابر است با حاصل‌ضرب مقدار موجودی آن (amount) در قیمت واحد آن (price). هم‌چنین، ارزش کل برابر است با مجموع ارزش تمام داروهای موجود در لیست self.drugs.

Total Value = ∑(amount × price)

این متد باید مقدار عددی نهایی را return کند.

python
def total_value(self):
    total = 0
    for drug in self.drugs:
        total += drug.amount * drug.price
    return total

متد employees_summary

این متد، خلاصه‌ای از اطلاعات کارمندان را در قالب یک رشته‌ی مشخص برمی‌گرداند. ساختار کلی خروجی باید به صورت زیر باشد:

python
Employees:
The employee number {i} is {first_name} {last_name} who is {age} years old.
The employee number {i+1} is ...

که در آن، {i} شماره‌ی کارمند در لیست است که از ۱ شروع می‌شود. {first_name}، {last_name} و {age} اطلاعات مربوط به هر کارمند هستند. در انتهای تمام خطوط خروجی باید یک کاراکتر \n (خط جدید) وجود داشته باشد.

مثال:

text
Employees:
The employee number 1 is Mohammad Hoseini who is 19 years old.
The employee number 2 is Hosein Mohammadi who is 21 years old.

این متد باید رشته‌ی نهایی را return کند.

python
def employees_summary(self):
    result = "Employees:\n"
    for i, emp in enumerate(self.employees, 1):
        result += f"The employee number {i} is {emp['first_name']} {emp['last_name']} who is {emp['age']} years old.\n"
    return result

🎯 نمونه‌ی استفاده از کلاس‌ها

python
# ساخت چند شیء دارو
drug1 = Drug("Aspirin", 100, 25000)
drug2 = Drug("Ibuprofen", 50, 40000)
drug3 = Drug("Vitamin C", 200, 100000)

# ساخت یک شیء داروخانه
my_pharmacy = Pharmacy("City Pharmacy")

print(f"Created Pharmacy: {my_pharmacy.name}")
print("-" * 20)

# افزودن داروها به داروخانه
my_pharmacy.add_drug(drug1)
my_pharmacy.add_drug(drug2)
my_pharmacy.add_drug(drug3)

print(f"Number of drugs in {my_pharmacy.name}: {len(my_pharmacy.drugs)}")
print("-" * 20)

# افزودن کارمندان به داروخانه
my_pharmacy.add_employee("Alice", "Smith", 25)
my_pharmacy.add_employee("Bob", "Johnson", 30)

# محاسبه و چاپ ارزش داروها
total_inventory_value = my_pharmacy.total_value()

print(f"Total value of drugs in {my_pharmacy.name}: {total_inventory_value}")
print("-" * 20)

# دریافت و چاپ اطلاعات کارمندان
employee_list_summary = my_pharmacy.employees_summary()

print(employee_list_summary)

خروجی:

text
Created Pharmacy: City Pharmacy
--------------------
Number of drugs in City Pharmacy: 3
--------------------
Total value of drugs in City Pharmacy: 24500000
--------------------
Employees:
The employee number 1 is Alice Smith who is 25 years old.
The employee number 2 is Bob Johnson who is 30 years old.

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

⚠️ چگونه در تابع total_value می‌توانم به لیست داروها و تعداد و قیمت‌ آن‌ها دسترسی داشته باشم؟

باید روی ویژگی self.drugs که شامل اشیاء Drug است، پیمایش کنید. هر شیء Drug دارای ویژگی‌های تعداد و قیمت است.

سپس برای هر دارو با استفاده از drug.price و drug.amount به قیمت و مقدار هر دارو دسترسی خواهید داشت. هزینه‌ی هر دارو را محاسبه کرده و تمام هزینه‌ها را با یکدیگر جمع کنید تا مجموع هزینه‌ تمامی داروها به دست آید.

python
for drug in self.drugs:
    ...

⚠️ تابع employees_summary خروجی درستی بازمی‌گرداند اما نمره‌ی مربوط به این بخش را دریافت نمی‌کنم. مشکل از کجاست؟

ابتدا به بزرگی و کوچکی حروف و سپس فاصله‌ی بین کلمات دقت کنید. در ادامه توجه داشته باشید که در انتهای تمامی خطوط باید \n وجود داشته باشد.


⚠️ نکات مهم

  • در هیچ‌کدام از توابع نباید مقداری را چاپ (print) کنید، بلکه باید مقادیر خواسته‌شده را برگردانید (return).
  • در توابعی که از شما خواسته‌شده تا عبارتی را برگردانید، به کوچکی و بزرگی حروف و فاصله‌ی بین کلمات دقت کنید. داوری به این موارد حساس است.
  • کتابخانه‌هایی که از توابع آن در کدتان استفاده می‌کنید را حتماً import کنید.

✅ این تمرین را در ویرایشگر خود پیاده‌سازی کنید. به یاد داشته باشید که کلاس‌ها و متدهای خواسته‌شده را دقیقاً با همان نام‌ها و امضاها (signature) پیاده‌سازی کنید.

نمونه‌ها

ورودی نمونه ۱
drug1 = Drug("Aspirin", 100, 25000)
drug2 = Drug("Ibuprofen", 50, 40000)
drug3 = Drug("Vitamin C", 200, 100000)
my_pharmacy = Pharmacy("City Pharmacy")
print(f"Created Pharmacy: {my_pharmacy.name}")
print("-" * 20)
my_pharmacy.add_drug(drug1)
my_pharmacy.add_drug(drug2)
my_pharmacy.add_drug(drug3)
print(f"Number of drugs in {my_pharmacy.name}: {len(my_pharmacy.drugs)}")
print("-" * 20)
my_pharmacy.add_employee("Alice", "Smith", 25)
my_pharmacy.add_employee("Bob", "Johnson", 30)
print(f"Total value of drugs in {my_pharmacy.name}: {my_pharmacy.total_value()}")
print("-" * 20)
print(my_pharmacy.employees_summary())
خروجی نمونه ۱
Created Pharmacy: City Pharmacy
--------------------
Number of drugs in City Pharmacy: 3
--------------------
Total value of drugs in City Pharmacy: 24500000
--------------------
Employees:
The employee number 1 is Alice Smith who is 25 years old.
The employee number 2 is Bob Johnson who is 30 years old.
ورودی نمونه ۲
p = Pharmacy("Empty")
[p.name, p.drugs, p.employees, p.total_value()]
خروجی نمونه ۲
['Empty', [], [], 0]
ورودی نمونه ۳
d = Drug("Aspirin", 100, 25000)
(d.name, d.amount, d.price)
خروجی نمونه ۳
('Aspirin', 100, 25000)
ورودی نمونه ۴
p = Pharmacy("Q")
p.add_employee("Mohammad", "Hoseini", 19)
p.add_employee("Hosein", "Mohammadi", 21)
p.employees == [{"first_name": "Mohammad", "last_name": "Hoseini", "age": 19},
                {"first_name": "Hosein", "last_name": "Mohammadi", "age": 21}]
p.employees_summary()
خروجی نمونه ۴
True
'Employees:\nThe employee number 1 is Mohammad Hoseini who is 19 years old.\nThe employee number 2 is Hosein Mohammadi who is 21 years old.\n'
ورودی نمونه ۵
Pharmacy("None yet").employees_summary()
خروجی نمونه ۵
'Employees:\n'

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

ورود