اللازانيا

اللازانيا

تمرين تعلّمي

مقدمة

الأساسيات

لنبدأ رحلة 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 تُرجع دائمًا 47 سيبدو هكذا:

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() التي لا تأخذ أي وسائط وتُرجع عدد الدقائق التي ينبغي أن تبقى فيها اللازانيا في الفرن. وفقًا لكتاب الطبخ، الوقت المتوقع في الفرن هو 40 دقيقة:

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 تمرين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.