الدرس 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 لا