انتقل إلى المحتوى
Topos Uranos

ملخص

يفتتح هذا الدرس الوحدة السابعة من الدورة، المخصّصة للنصوص والملفات. ويشرح الغاية من الوحدة: تعليم معاملة النص بوصفه معطى، بترميزه الحقيقي، وجعل البرنامج يقرأ الملفات ويكتبها دون أن ينهار أمام مدخلات مشوَّهة؛ ويعرض دروسها الأربعة والخيط الذي يجمعها؛ ويذكّر بما تفترض الوحدة أنه معلوم، ولا سيما أن المحرف عدد في نظر الآلة، وبالمتجهات والسجلات والدوال من الوحدتين 5 و6؛ ويصوغ المسألة التي تحلّها الوحدة، وهي مسألة برنامج يبدو صحيحًا لكنه يفقد بيانات دون تنبيه، ويتوقف عند أول سطر غير متوقع، ويقيس خطأً الأسماء المكتوبة بحروف خارج ASCII؛ ويستبق أن الحرف لا يشغل دائمًا بايتًا واحدًا؛ ويبيّن إلى أين تقود الوحدة، في الوحدة 8 وفي دورة البرمجة بلغة C++ II.

أهداف التعلم

  1. وصف تسلسل محتويات الوحدة وشرح ما يقدّمه كل درس للدرس الذي يليه.
  2. تذكّر تمثيل المحارف برموز عددية (الدرس 2.4)، وكتابة رمز بالنظام الثنائي وبالنظام الست عشري.
  3. استباق، بمثال، أن الحرف ليس دائمًا بايتًا واحدًا، وأن عدّ البايتات لذلك ليس عدًّا للحروف.
  4. التعرّف على ما يُنتظر إتقانه عند إنهاء الوحدة، وتمييزه ممّا سيُتعلَّم في الوحدة اللاحقة وفي دورة البرمجة بلغة C++ II.

تقييم الدخول

قبل اجتياز الوحدة يحسن قياس نقطة البداية. وهذا التقييم تقييم ذاتي: لا تُمنح عليه درجة، وغايته الوحيدة توجيه الدراسة. وتتناول الأسئلة الستة الأولى ما تفترض الوحدة أنه معلوم: رمز المحرف، وكتابة عدد بالنظامين الثنائي والست عشري، وقناع البتات، والمرور على متجه يرشّح عناصره، وما يحدث حين تتلقى القراءة حروفًا بدل عدد، وتعريف السجل. وتتناول الأسئلة الأربعة التي تليها، بترتيب الدروس، الأفكار المركزية في الوحدة: ما يعيده بحث لا يجد شيئًا، وحجم كلمة فيها حرف خارج ASCII، والسطر الفارغ الذي يظهر عند المزج بين طريقتين في القراءة، والملف الذي تعذّر فتحه. وليس أحد ملزمًا بأن يصيب في هذه الأربعة الآن، وفي بعضها يكون «لا أعرف بعدُ» جوابًا صادقًا: فكل جواب، صائبًا كان أو خاطئًا، يشرح المسألة ويسمّي الدرس الذي يعالجها. وتُقاس المهارات نفسها مرة أخرى في النهاية، في درس الخلاصة.

تقييم الدخول

قبل أن تبدأ الوحدة، قِس نقطة انطلاقك. إنه تقييم ذاتي قصير: لا يُمنح عليه درجة، وتُحفظ نتيجته في متصفحك فقط.

  1. السؤال 1من وحدات سابقةماذا يكتب std::println("{:d} {:d}", 'A', 'a');؟

  2. السؤال 2من وحدات سابقةكيف يُكتب 233 بالنظام الثنائي وبالنظام الست عشري؟

  3. السؤال 3من وحدات سابقةكم تساوي 0xB1 & 0xC0؟

  4. السؤال 4من وحدات سابقةماذا يكتب std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);؟

  5. السؤال 5من وحدات سابقةبعد int n{-1}; std::cin >> n; يكتب المستخدم abc. كم تساوي n، وماذا يحدث للقراءات اللاحقة؟

  6. السؤال 6من وحدات سابقةأيّ التعريفات الآتية يصرّح تصريحًا صحيحًا بسجل فيه عنوان وسنة؟

  7. السؤال 7إذا كانت s هي std::string s{"casa azul"};، فماذا تعيد s.find("x")؟

  8. السؤال 8ماذا يكتب std::println("{}", std::string{"año"}.size()); في برنامج محفوظ بترميز UTF-8، مثل برامج هذه الدورة؟

  9. السؤال 9ينفّذ برنامج int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);، فيكتب المستخدم 36 ويضغط Enter، ثم يكتب ليلى ويضغط Enter. ماذا يبقى في name؟

  10. السؤال 10ينفّذ برنامج std::ifstream in{"data.txt"}; int x{-1}; in >> x;، لكن data.txt غير موجود في المجلد الذي يُشغَّل منه. ماذا يحدث؟