المدخلات Inputs part 2
اذا كتبت البرنامج الآتي
كود:
#include<iostream>
using namespace std;
int main()
{
int a, b;
double z;
char ch1, ch2;
cin >> z >> ch1 >> a;
system("PAUSE");
return 0;
}
وقام المستخدم بادخال هذه القيمة 36.78b34 عند طلب البرنامج منه ذلك ( بمجرد تشغيل البرنامج سيطلب منه ادخال قيم ) السؤال المطروح ماذا ستكون قيمة كل متغير من المتغيرات التي عرفناها سابقا؟
أولاً توجه الى الكود cin >> z >> ch1 >> a تجد أن أول متغير للمدخلات هو z , و هذا المتغير نوعه double . اذن , البرنامج سوف يخزن قيمة double داخل هذا المتغير , أي رقم سواء كان بفواصل عشرية أو لا (كما شُرح سابقا) , أي أن قيمتها في المثال السابق تساوي 36.78 فالبرنامج سيقوم بادخال هذه القيمة الى المتغير z , ما أن يصل البرنامج الى حرف b سيتنقل الى المتغير الآخر لان المتغير z لايقبل هذه القيمة.
المتغير الذي يليه هو ch1 وهو عبارة عن char بمعنى أنه سيخزن قيمة واحدة , في هذه الحالة الحرف b , ثم ينتقل البرنامج الى المتغير التالي وهو a الذي هو عبارة عن int أي يخزن رقم صحيح فقط وهو 34 , لو كانت المدخلات 36.78b3N فان الحرف N لن يتم تخزينه في البرنامج وكأنه غير موجود.
افترض انك كنت تملك نفس الكود ولكن المدخلات كانت 36.78 وضغطت على Enter , البرنامج سيقوم بتخزين هذه القيمة في المتغير الأول z , ثم سيطلب منك ادخال قيمة للمتغير التالي مثلاً كانت القيمة A سيتم تخزينها في ch1 وثم سيطلب منك ادخال قيمة للمتغير a مثلاً كتبت 0.45 , سيقوم البرنامج أولاً بتحويله الى int ثم تخزينه بالقيمة 0 , وللتأكد من ذلك اكتب الكود الذي يقوم بطباعة قيمة كل متغير.
كود:
#include<iostream>
using namespace std;
int main()
{
int a, b;
double z;
char ch1, ch2;
cin >> z >> ch1 >> a;
cout << "********************" << endl;
cout << "z = " << z << endl;
cout << "ch1 = " << ch1 << endl;
cout << "a = " << a << endl;
system("PAUSE");
return 0;
}
حتى الآن يقوم البرنامج بتخطي المسافات و الأسطر الجديدة كما هو موضح في المثال السابق , أي أن البرنامج لن يعتبر المسافة قيمة حتى يقوم بتخزينها في المتغير المناسب , أحيانا تحتاج الى أن تطلب من البرنامج أن يقوم بقراءة المسافات.
لتوضيح أكثر قم بتعريف هذه المتغيرات مع امر ادخال القيم اليها
كود:
char ch1,ch2;
int num;
cin >> ch1 >> ch2 >> num;
افترض أن المدخلات كانت كالآتي
A 25
سيقوم البرنامج أولاً بادخال قيمة الى ch1 وهو A , ثم ينتظر ادخال قيمة الى ch2 , عندما يقوم المستخدم بادخال المسافة لن يقوم البرنامج بالتعامل معه بل سيتجاهله وسيتمر في طلب قيمة الى المتغير , ثم يدخل المستخدم القيمة 25 ويضغط على Enter , سيقوم البرنامج بادخال القيمة 2 الى المتغير ch2 و القيمة 5 الى المتغير num.
كيف تطلب من البرنامج قراءة المسافات و الأسطر الجديدة على انها قيم؟
تقوم باستخدام الدالة cin.get(char variable)
n المتغير الموجود داخل القوس يجب أن يكون من النوع char لأن المسافة سيتم تخزينها على اساس انها رمز.
الان في هذا الكود ستكون المدخلات كما هي
A 25
كود:
cin >> ch1;
cin.get(ch2);
cin >> num;
يمكنك الكتابة بشكل اخر
كود:
cin >> ch1 ;
cin.get(ch2) >> num;
ماهي قيمة كل متغير ؟ أولاً سيقوم البرنامج بادخال قيمة الى ch1 وهو A ثم سيطلب منك ادخال قيمة الى ch2 وفي نفس البرنامج سيعتبر ادخال مسافة عبارة عن قيمة يقوم بتخزينها الى المتغير , وأخيراً يطلب قيمة الى num , يمكنك التأكد من قيمة كل دالة عن طريق امر الطباعة.
كود:
cout << "ch1 = " << ch1 << endl;
cout << "ch2 = " << ch2 << endl;
cout << "num = " << num << endl;
هناك دالة اخرى وهي cin.ignore(intEXP , charEXP)
n هذه الدالة تقوم بتجاهل كل المدخلات intEXp مرة (يجب ان يكون عدد صحيح طبعا) حتى يقوم المستخدم بادخال قيمة تشبه charEXP (عبارة عن أي رمز سواء رقم او حرف او رمز اخر) , وعندما يقوم المستخدم بادخال هذه القيمة سيقوم البرنامج يتنفيذ السطر التالي من الكود.
مثلا cin.ignore(100 , 'A')
n سيقوم البرنامج بتجاهل كل المدخلات 100 حتى يقوم بادخال القيمة A , وبعد ادخال هذه القيمة سينفذ الكود الذي يليه.
هذا المثال يوضح ذلك
كود:
int num1 , num2;
cin >> num1;
cin.ignore(100 , '5');
cin >> num2;
افترض ان المدخلات كانت كالآتي
سيقوم البرنامج أولاً بادخال قيمة الى num1 وهي 3 , ثم في السطر التالي سيقوم بتجاهل كل القيم 100 مرة الا القيمة 5 , يعني 6 سيتجاهلها , 8 كذلك و 9 أيضاً , ما أن يصل الى 5 سيقوم بتنفيذ الكود التالي وهو ادخال قيمة الى المتغيرnum2.
من المهم ان تعرف ان cin.ignore(100 , '5');
n لايعني انه لو قام المستخدم بادخال الرقم 57 فان البرنامج سيتجاهله. ان وظيفة هذه الدالة قراءة الرموز فقط , و الرقم 5 عبارة عن رمز , اذن سيقوم البرنامج بتنفيذ الكود التالي بمجرد الوصول الى الرقم 5.