لازانیا

لازانیا

تمرین یادگیری

مقدمه

مبانی

برای آغاز سفر C++، با متغیرها، فراخوانی توابع و کامنت‌ها شروع می‌کنیم.

کامنت‌ها

کامنت‌ها دو نوع‌اند: تک‌خطی و چندخطی. هر چیزی که در همان خط بعد از // بیاید، توسط کامپایلر نادیده گرفته می‌شود. کامنت‌های چندخطی با نام کامنت‌های سبک C هم شناخته می‌شوند. این کامنت‌ها بین /* و */ قرار می‌گیرند. هر چیزی هم که بین این دو بیاید نادیده گرفته می‌شود.

متغیرها

C++ یک زبان نوع‌دار است. همه‌ی نوع‌ها باید در زمان کامپایل معلوم باشند و معمولاً باید آن‌ها را صریحاً مشخص کنید. نوع یک متغیر نمی‌تواند تغییر کند. یک متغیر صحیح با اسم years را می‌توان این‌طور تعریف کرد:

int years;

روش خوبی است که متغیرها را هنگام تعریف مقداردهی اولیه کنید. C++ سازوکارهای مختلفی برای این کار ارائه می‌دهد. نسخه‌ای که با آکولاد نوشته می‌شود با C++ مدرن همخوان‌تر است، اما نسخه‌ی علامت مساوی هم بسیار رایج است.

int tomatoes{80};
int potatoes = 40;
Caution

C++ اجازه می‌دهد از متغیرهای مقداردهی‌نشده استفاده کنید. تا زمانی که متغیر به‌طور عمدی مقداردهی نشود، نامعلوم است و ممکن است هر مقداری در آن باشد. برای جلوگیری از خطاهای استفاده پیش از مقداردهی و رفتار تعریف‌نشده، توصیه می‌شود همیشه مقداردهی اولیه کنید. رفتار تعریف‌نشده می‌تواند در بدترین لحظه‌ی ممکن برنامه‌تان را از کار بیندازد، در حالی که پیش‌تر بدون مشکل اجرا می‌شد. تأکید بر این نکته هرگز کافی نیست: به هر قیمتی از رفتار تعریف‌نشده پرهیز کنید.

عملیات حسابی

عملگرهای حسابی مثل *، + یا - می‌توانند بخشی از یک عبارت باشند، مثل 3 * 2 یا tomatoes + potatoes.

به‌روزرسانی متغیرها

می‌توانید مقدار متغیرها را دوباره تخصیص دهید، تا زمانی که نوعشان حفظ شود:

tomatoes = tomatoes - 5; // tomatoes is now 75
potatoes = (32 * 2) + 11; // potatoes is now 75 as well

توابع

توابع یک اسم، یک نوع بازگشتی و یک فهرست پارامتر (که ممکن است خالی باشد) دارند. یک نمونه از تابعی با اسم always_fortyseven که همیشه ۴۷ را برمی‌گرداند، این‌طور است:

int always_fortyseven() {
    return 47;
}

و این vip_fee است که یک پارامتر دارد:

int vip_fee(int standard_fee) {
    /*
    vip_fee calculates the vip fee based on the standard_fee.
    */
    int vip_multi{3};
    return standard_fee * vip_multi;
}

یا total_fee، تابعی با سه پارامتر و یک فراخوانی به تابعی دیگر.

int total_fee(int vips, int adults, int kids) {
    /*
    total_fee calculates the total price for a group of VIP and adult guests with kids.
    Kids get a flat discount on the standard fee.
    VIP guest fees are calculated by calling vip_fee.
    */
    int standard_fee{30};
    int kids_discount{15};

    int kids_total_fee = kids * (standard_fee - kids_discount);
    int vips_total_fee = vips * vip_fee(standard_fee);
    int adult_total_fee = adults * standard_fee;

    return vips_total_fee + adult_total_fee + kids_total_fee;
}

توابع در C++ برخلاف برخی زبان‌های دیگر، مقدار آخرین دستور را برنمی‌گردانند. کلیدواژه‌ی return برای کامپایل شدن کد الزامی است.

فضای سفید

فضای سفید برای قالب‌بندی کد مبدأ استفاده می‌شود و شامل فاصله، تب و خط جدید است. از آنجا که کامپایلر فضای سفید غیرضروری را نادیده می‌گیرد، می‌توانید از آن برای ساختاربندی کدتان استفاده کنید. استفاده‌ی هوشمندانه از فضای سفید می‌تواند خوانایی کد شما را بهتر کند. استانداردهای قالب‌بندی مختلفی وجود دارد، اما همه‌ی آن‌ها قراردادی‌اند و کامپایلر آن‌ها را الزام نمی‌کند.

// Formatting makes it easier to find bugs

int eggs_yolks =  3;
int      yeast = 15;

int flour=500;int sugar=200;// compact, but difficult to read

دستورالعمل‌ها

دوست‌دختر لوسیان در راه بازگشت به خانه است و او هنوز شام سالگردشان را نپخته است!

در این تمرین، قرار است کدی بنویسید تا به لوسیان کمک کنید لازانیای عالی‌ای از کتاب آشپزی محبوبش بپزد.

چهار کار پیش رو دارید که همه به زمان صرف‌شده برای پخت لازانیا مربوط می‌شوند.

1. زمان مورد انتظار فر را بر حسب دقیقه تعریف کنید

تابع ovenTime() را تعریف کنید که هیچ آرگومانی نمی‌گیرد و برمی‌گرداند که لازانیا چند دقیقه باید در فر بماند. طبق کتاب آشپزی، زمان مورد انتظار فر ۴۰ دقیقه است:

ovenTime();
// => 40

2. زمان باقی‌مانده‌ی فر را بر حسب دقیقه محاسبه کنید

تابع remainingOvenTime(int actualMinutesInOven) را تعریف کنید که تعداد واقعی دقیقه‌هایی که لازانیا در فر بوده است را به‌عنوان آرگومان می‌گیرد و بر اساس زمان مورد انتظار فر (بر حسب دقیقه) از کار قبلی، برمی‌گرداند که لازانیا چند دقیقه دیگر باید در فر بماند.

remainingOvenTime(30);
// => 10

3. زمان آماده‌سازی را بر حسب دقیقه محاسبه کنید

تابع preparationTime(int numberOfLayers) را تعریف کنید که تعداد لایه‌هایی که به لازانیا اضافه کرده‌اید را به‌عنوان آرگومان می‌گیرد و با فرض اینکه آماده‌سازی هر لایه ۲ دقیقه طول می‌کشد، برمی‌گرداند که چند دقیقه صرف آماده‌سازی لازانیا کرده‌اید.

preparationTime(2);
// => 4

4. زمان سپری‌شده را بر حسب دقیقه محاسبه کنید

تابع elapsedTime(int numberOfLayers, int actualMinutesInOven) را تعریف کنید که دو آرگومان می‌گیرد: آرگومان اول تعداد لایه‌هایی است که به لازانیا اضافه کرده‌اید و آرگومان دوم تعداد دقیقه‌هایی است که لازانیا در فر بوده است. تابع باید برمی‌گرداند که چند دقیقه روی پخت لازانیا کار کرده‌اید، که برابر است با مجموع زمان آماده‌سازی (بر حسب دقیقه) و زمانی (بر حسب دقیقه) که لازانیا تا این لحظه در فر گذرانده است.

elapsedTime(3, 20);
// => 26
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
C++ Exercism

آماده‌اید لازانیا را شروع کنید؟

در Exercism ثبت‌نام کنید تا C++ را همراه با 19 مفهوم100 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.