C++إدخال بيانات من المستخدم
- مقدمة
- أمر الإدخال
cin
في C++ - الفرق بين الأمر
cin
و الأمرcout
- المشاكل التي يسببها إدخال مسافات فارغة
- إدخال نص بواسطة الدالة
getline()
مقدمة
في الدروس السابقة, كنا نكتب الكود ثم نقوم بتجربته فيتنفذ كما هو, بمعنى أننا كنا أصلاً نعرف ما سيظهر عند تشغيل الكود لأننا كنا نقوم بتحديد قيم المتغيرات قبل تشغيل البرنامج.
في هذا الدرس ستتعلم كيف تنشئ برنامح يتفاعل مع المستخدم, حيث أنك عندما تقوم بتشغيله سيطلب من المستخدم إدخال بيانات, و بعد إدخالها سيقوم البرنامج بمعالجتها و فعل شيء معين بها.
أمر الإدخال cin
في C++
لجعل المستخدم قادر على إدخال بيانات في البرنامج أثناء اشتغاله نستخدم أمر الإدخال cin >>
.
الأمر cin
موجود في الحزمة std
و لهذا يجب ان تكتب std::cin
إن لم تكن تريد تضمين الحزمة std
في برنامجك.
في كل مرة تقوم فيها باستدعاء هذا الأمر يقوم المترجم بانتظارك لإدخال عدد أو كلمة واحدة من لوحة المفاتيح ( Keyboard ).
بعد الإنتهاء من الإدخال و النقر على الزر Enter سيتم إرجاع الشيء الذي قمت بإدخاله في المكان الذي تم منه إستدعاء الأمر cin >>
.
مثال
using namespace std; int main() { // لتخزين المعلومات التي سيدخلها المستخدم لاحقاً age و name قمنا بتجهيز المتغيرين string name; int age; // name هنا سيطلب من المستخدم إدخال إسمه و من ثم سيتم تخزين الإسم الذي يدخله في المتغير cout << "What's your name? "; cin >> name; // age هنا سيطلب من المستخدم إدخال عمره و من ثم سيتم تخزين الرقم الذي يدخله في المتغير cout << "How old are you? "; cin >> age; // في الأخير قمنا بعرض المعلومات التي يدخلها المستخدم بشكل مرتب cout << "Your name is " << name << ", and your age is " << age << " years."; return 0; }
سنحصل على النتيجة التالية عند التشغيل مع الإشارة إلى أننا قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
How old are you? 25
Your name is Mhamad, and your age is 25 years.
الفرق بين الأمر cin
و الأمر cout
في البداية معرفة سبب تسمية الأوامر بهذه الكلمات سيسهل عليك تذكر الفرق بينهما, لذا تذكر دائماً أصلهما:
cin
يقصد بها كلمة See In و التي بدورها تستخدم لإدخال قيمة في المتغير.cout
يقصد بها كلمة See Out و التي بدورها تستخدم للحصول على قيمة المتغير.
الأمر cin
نضع بعده إسم المتغير الذي سنخزن القيمة التي يدخلها المستخدم فيها و تكون الأسهم باتجاه اليمين كالتالي.
// x قم بتخزين ما سيدخله المستخدم في المتغير
cin >> x;
الأمر cout
نضع بعده أي شيء نريد عرضه أو أي متغير نريد عرض قيمته و تكون الأسهم باتجاه اليسار كالتالي.
// x قم بعرض القيمة المدخلة في المتغير cout << "x = " << x;
المشاكل التي يسببها إدخال مسافات فارغة
تذكر دائماً أن الأمر cin >>
يستخدم لإدخال رقم أو كلمة واحدة فقط بمعنى أنه لا يجب أن يحتوي ما تدخله على مسافات فارغة.
في حال كان ما أدخلته يحتوي على مسافات فارغة, سيسبب ذلك مشاكل في الكود لأن المترجم سيعتبر أنك تحاول إدخال مجموعة قيم و ليس قيمة واحدة.
عندما يجدك المترجم قمت بإدخال مجموعة قيم في ذات الوقت الذي تحاول فيه أن تخزن قيمة واحدة فقط في متغير, سيعتبر أنك تريد إدخال القيم الأخرى في المرات القادمة التي تطلب فيها من المستخدم أن يدخل قيم.
في المثال التالي, قمنا بإنشاء برنامج يطلب من المستخدم إدخال إسمه و بريده الإلكتروني, بعدها يعرض له ما قام بإدخاله.
عند تشغيل البرنامج سنتعمد إدخال إسم المستخدم الكامل (إسمه و إسم عائلته) مع وضع مسافة فارغة بينهما حتى ترى الخطأ الذي سيحدث.
مثال
using namespace std; int main() { // لتخزين المعلومات التي سيدخلها المستخدم لاحقاً email و name قمنا بتجهيز المتغيرين string name; string email; // name هنا سيطلب من المستخدم إدخال إسمه و من ثم سيتم تخزين الإسم الذي يدخله في المتغير cout << "Enter your name: "; cin >> name; // email هنا سيطلب من المستخدم إدخال بريده الإلكتروني و من ثم سيتم تخزين البريد الذي يدخله في المتغير cout << "Enter your email: "; cin >> email; // في الأخير قمنا بعرض المعلومات التي يدخلها المستخدم بشكل مرتب cout << "\n\n---------------------"; cout << "\nName = " << name; cout << "\nEmail = " << email; return 0; }
سنحصل على النتيجة التالية عند التشغيل مع الإشارة إلى أننا قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Enter your email: <- لاحظ أنه لم ينتظرنا لندخل البريد الإلكتروني بل إعتبر أنه تم إدخاله
---------------------
Name = Mhamad <- name فقط في المتغير Mhamad لاحظ أنه قام بوضع
Email = Harmush <- بشكل تلقائي email في المتغير Harmush لاحظ أنه قام بوضع
إدخال نص بواسطة الدالة getline()
إذا أردت جعل المستخدم قادر على إدخال أكثر من كلمة و تخزين كل ما يدخله في متغير نصّي واحد, يمكنك إستخدام الأمر cin
لجعل المترجم ينتظر المستخدم حتى يدخل ما يشاء, و من ثم تقوم بتغليف ما سيتم إدخاله بواسطة الدالة getline()
و التي ستقوم باعتبار كل ما تم إدخاله عبارة عن نص واحد.
إذاً الأمر التالي هو ما تحتاجه لإستقبال نص من المستخدم.
// x قم بتخزين كل النص الذي سيدخله المستخدم في المتغير getline(cin, x);
ملاحظة: الدالة getline()
موجودة في الحزمة std
و لهذا يجب ان تكتب std::getline(std::cin, x)
إن لم تكن تريد تضمين الحزمة std
في برنامجك.
في المثال التالي قمنا بتعريف مثال يطلب من المستخدم إدخال إسمه الكامل (إسمه و إسم عائلته) و من ثم يعرض له رسالة ترحيب.
مثال
using namespace std; int main() { // لتخزين الإسم الذي سيدخله المستخدم لاحقاً name قمنا بتجهيز المتغير string name; // name هنا سيطلب من المستخدم إدخال إسمه الكامل و من ثم سيتم تخزين الإسم الذي يدخله في المتغير cout << "Enter your name: "; getline(cin, name); // في الأخير قمنا بعرض المعلومات التي يدخلها المستخدم بشكل مرتب cout << "Welcome " << name; return 0; }
سنحصل على النتيجة التالية عند التشغيل مع الإشارة إلى أننا قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Welcome Mhamad Harmush