الدرس 6 من 10
المتّجهات
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
المتّجه std::vector وحلقة for على عناصره
الشرح
المتّجه (vector) قائمة يتغيّر حجمها مثل std::vector<int> scores = {72, 95, 64};، ويأتي من <vector>، والنوع المكتوب بين <> هو نوع عناصره. تضيف push_back(88) عنصرًا في آخره، وتُرجع size() عدد عناصره، وتسأل empty() هل هو فارغ، وscores[0] هو العنصر الأول لأنّ العدّ يبدأ من الصفر.
وتمرّ حلقة for على العناصر (range-based for) على كل عنصر دون عدّاد، مثل for (int s : scores)، وs فيها نسخة من العنصر، فإذا أردت أن تعدّل العناصر نفسها فاجعله مرجعًا: for (int& s : scores) { s += 5; }. وحين تمرّر المتّجه إلى دالة تقرؤه فقط فمرّره بالشكل const std::vector<int>&، وإلا نُسخت القائمة كلها في كل استدعاء.
وانتبه إلى أنّ [] لا تتأكّد من أنّ الموضع داخل القائمة، فـ scores[10] في قائمة من ثلاثة عناصر تقرأ من ذاكرة لا تخصّها، فتعطيك قيمة عشوائية أو توقف البرنامج دون رسالة واضحة، أما scores.at(10) فتتأكّد وترمي استثناءً (exception). والقائمة الفارغة ليس فيها [0] أصلًا، فاسأل empty() قبل أن تقرأ منها.
المطلوب
أكمل int maxOf(const std::vector<int>& v) لتُرجع أكبر عنصر، و0 إذا كان المتّجه فارغًا، ويجب أن تعمل صحيحًا حتى لو كانت العناصر كلها سالبة. وأكمل std::vector<int> evens(const std::vector<int>& v) لتُرجع متّجهًا جديدًا فيه الأعداد الزوجية وحدها بترتيبها، وvoid healAll(std::vector<int>& hps, int amount) لتزيد صحة كل لاعب في المتّجه نفسه بمقدار amount دون أن تتجاوز 100. ثم أضف في main العدد 100 إلى scores بـ push_back، واطبع سطرين: عدد النتائج: 5 من size()، ثم الأعلى: 100 من maxOf.
الفحوص
6 فحوص- الدالة maxOf تُرجع أكبر عنصر
- الدالة maxOf تعمل مع الأعداد السالبة وحدها، وتُرجع 0 للفارغ
- الدالة evens تُبقي الأعداد الزوجية بترتيبها
- الدالة evens صحيحة مع السالب والصفر والمتّجه الفارغ
- الدالة healAll تزيد كل عنصر في المتّجه نفسه ولا تتجاوز 100
- طُبع «عدد النتائج: 5» ثم «الأعلى: 100»