الدرس 7 من 10
النصوص
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الدوال find وsubstr وtoupper
الشرح
النصّ std::string يعرف طوله، فـ tag.size() عدد أحرفه، وtag[0] أول حرف فيه، ونوعه char. وتجمع + نصّين في نصّ واحد، وتضيف += حرفًا أو نصًّا إلى آخر النصّ. وتقتطع substr(start, count) جزءًا من النصّ، فإذا كان tag هو "lian#1024" فإنّ tag.substr(0, 4) هي "lian". وتُرجع tag.find('#') موضع أول ظهور للحرف، فإذا لم تجده أرجعت قيمة خاصّة اسمها std::string::npos، وليست -1 ولا صفرًا، فقارن بها صراحةً.
وانتبه إلى أنّ + تحتاج أن يكون أحد طرفيها std::string، فـ "HP: " + 2 يقبلها المترجم لكنها لا تجمع شيئًا، بل تتخطّى أول حرفين من النصّ فتطبع ": "، لذلك حوّل الرقم إلى نصّ أوّلًا: "HP: " + std::to_string(hp).
أما std::toupper(c) وstd::tolower(c) من <cctype> فتحوّلان حرفًا لاتينيًّا واحدًا إلى كبير أو صغير، وتُرجعان int، فأعد النتيجة حرفًا بـ static_cast<char>. وانتبه إلى أنّ std::string يخزّن بايتات وليس حروفًا، والحرف العربي بايتان في UTF-8، فـ std::string("ليان").size() تساوي 8، و[0] نصف حرف. لذلك جاءت أمثلة هذا الدرس بأسماء لاعبين بالحروف اللاتينية، لأنّ معالجة النصّ العربي حرفًا حرفًا تحتاج إلى أدوات أخرى.
المطلوب
أكمل std::string initials(const std::string& full) لتُرجع الحرف الأول من كل كلمة بحرف كبير، فـ initials("lian saad") هي "LS"، والمسافات الزائدة لا تُحسب كلمات. وأكمل std::string username(const std::string& tag) لتُرجع ما قبل # في معرّف مثل "lian#1024"، والنصّ كلّه إذا لم يكن فيه #. ثم أكمل bool isPalindrome(const std::string& s) لتُبيّن هل يُقرأ النصّ من أوّله ومن آخره بالشكل نفسه، دون تفريق بين الحرف الكبير والصغير، فـ "Racecar" نعم و"hello" لا.
الفحوص
6 فحوص- الدالة initials تُرجع الحرف الأول من كل كلمة بحرف كبير
- الدالة initials تعمل مع الكلمة الواحدة والمسافات الزائدة والنصّ الفارغ
- الدالة username تُرجع ما قبل #
- الدالة username تُرجع النصّ كلّه إذا لم يكن فيه #
- الدالة isPalindrome تقبل level وRacecar وترفض hello
- الدالة isPalindrome تقبل النصّ الفارغ والحرف الواحد وترفض ab