السلاسل (المصفوفات الحرفيـة)
مقدمة:
سنبدأ بداية من الكلام الذي قلناه سابقاً عـن المصـفوفات ، أنـت تعلـم أنــه لا
يمكـنك تخـزين أي كلمـة في أي متغيـر حرفـي لأن المتغيـر char عبـارة عــن
بايت واحد فقط وبالتالي فلن يخزن لك إلا حرف واحد فحسب ، سنستغل الآن
فائدة المصفوفات وسنقوم بتخـزين كلمة كاملة في مصفوفة حرفية:
char word[]= { 'P','r','g','r','a','m','\0'};
لقد قمنـا بتخـزين الكلمـة Program فـي المصـفوفة word ، أمـا عــن الحـرف
الأخير وهـو 0\ فهذا الحرف مهـم للغاية وهـو يعلم المترجم بانتهـاء السلسـلة
الحرفية ، لو افترضنا أنك لم تقــم بكتابـة ذلـك الحـرف ، فعــندما تقـوم بكتابـة
السطر التالي لطباعـة السلسلة:
cout << word << endl;
فستظهر لك أحرف غريبـة لذلك احرص على إعلام المترجم بنهاية السلسة.
يعتبر الأسلوب السابق أسلوباً غير عـملي وممل للغاية وخاصـة وجود الحرف
الأخيــر ، لــذلك فهـــناك طريقـــة أســهل للإعــلان عـــن المصــفوفات الحرفيــة
(السلاسل) وهـي هـكذا:
char word[]= "Hellow C++";
وهـكذا فلن تحتاج للفصل بـين الحـروف ولا إلـى حـرف الإنهـاء الأخيـر ، والـذي
سيقوم المترجم بإضافته نيابة عـنك
هـناك أمر آخر وهـو حجم الكلمـة السابقـة ، قم بعـد الأحـرف وسـتجد أنــها 9
أحرف ، ولكن حجم تلك المصفوفة هـو 10 بايت والسبب في ذلك هـو وجـودة
مسـافة فارغـــة بـين الكلمتـين Hellow و ++C والتـي تعتبرهـا السـي بلـس
بلس حرفاً كأي حرف آخر.
إدخال المعلومات في السلاسل:
لنفرض أنك تقـوم بكتابـة برنـامج تطلـب فيـه مـن المسـتخدم كتابـة اسمــه ،
حينها فلربما سيحتوي الكـود على هذه الأسطر:
char name[100];
cin >> name;
وبالرغـم من صحـة الأسطر السابقــة ، ولكـن مـاذا لـو قـرر المسـتخدم كتابـة
اسمه بالكامل أي اسمه واسم أبيـه ، نحـن لا ننـاقش هــنا حجـم المصـفوفة
فبإمكانك تغييرها متى تشاء ، لنفرض أن المستخدم أدخل اسمه هـكذا:
Mohamed Abdullah
حينها سيقوم الكـائن cin بتخـزين الكلمـة الأولـى فـي المصـفوفة ولـن يقـوم
بتخزين الكلمة الثانية أبداً في المصفوفة والسبب في ذلك هـو أن الكائن cin
يعتبر حرف المسافة الخالية هـو حرف إنهاء وبالتالي فإنه ينتهي من القراءة.
لحل هذه المشكلة يوفر لنا الكائن cin تابعاً هـو التابع get والذي يقوم بقـراءة
المسافات الخالية . حينها ستقوم بتعـديل الأسطر السابقـة لتصبح كالتالي:
char name[100];
cin.get (name , 99 );
يستقبل التابع وسيطين اثنين هـما اسم المصـفوفة والقيمـة القصـوى لعــدد
الأحرف والسبب في أننا وضعـنا الرقم 99 هـو للسماح بوجود الحرف الخـالي
أو حرف الإنهاء ، وهـناك وسيط ثالث وهـو حرف الإنهاء ، ولا يشترط لك وضعـه
ولكن عليك أن تعلم أن حرف الإنهاء هـو 'n\' ، أي إذا قمت بضـغط الـزر Enter
على لوحة المفاتيح فسينتهي البرنامج من قراءة السلسلة التي تكتبها.
التابع getline :
لنفرض أنك ستقوم بكتابة كـود يعـمل كمحـرر نصـوص ، فحينهـا يجـب عليـك
التعامــل مــع الأحــرف 'n\' كمــا رأينــا فــإن التــابع ( )get يقــوم بالتعامــل مــع
المسافات ولكن ماذا لو أردت أنت التعامل مع الأسطر وليس الجمل فحسب.
يوفر لك الكائن cin التابع getline الـذي يتعامـل مـع هـذه المشـكلة. وطريقـة
عـمله هـي نفس طريقة عـمل التابع get وحتى تجعل التابعين يقومـان بحـل
المشكلة المطروحـة (مشكلة الأسطر) فعليك فقط أن تحدد ما هــو البـارامتر
الثالث أو الوسيط الثالث وحينها ستحل المشكلة.
مقدمة:
سنبدأ بداية من الكلام الذي قلناه سابقاً عـن المصـفوفات ، أنـت تعلـم أنــه لا
يمكـنك تخـزين أي كلمـة في أي متغيـر حرفـي لأن المتغيـر char عبـارة عــن
بايت واحد فقط وبالتالي فلن يخزن لك إلا حرف واحد فحسب ، سنستغل الآن
فائدة المصفوفات وسنقوم بتخـزين كلمة كاملة في مصفوفة حرفية:
char word[]= { 'P','r','g','r','a','m','\0'};
لقد قمنـا بتخـزين الكلمـة Program فـي المصـفوفة word ، أمـا عــن الحـرف
الأخير وهـو 0\ فهذا الحرف مهـم للغاية وهـو يعلم المترجم بانتهـاء السلسـلة
الحرفية ، لو افترضنا أنك لم تقــم بكتابـة ذلـك الحـرف ، فعــندما تقـوم بكتابـة
السطر التالي لطباعـة السلسلة:
cout << word << endl;
فستظهر لك أحرف غريبـة لذلك احرص على إعلام المترجم بنهاية السلسة.
يعتبر الأسلوب السابق أسلوباً غير عـملي وممل للغاية وخاصـة وجود الحرف
الأخيــر ، لــذلك فهـــناك طريقـــة أســهل للإعــلان عـــن المصــفوفات الحرفيــة
(السلاسل) وهـي هـكذا:
char word[]= "Hellow C++";
وهـكذا فلن تحتاج للفصل بـين الحـروف ولا إلـى حـرف الإنهـاء الأخيـر ، والـذي
سيقوم المترجم بإضافته نيابة عـنك
هـناك أمر آخر وهـو حجم الكلمـة السابقـة ، قم بعـد الأحـرف وسـتجد أنــها 9
أحرف ، ولكن حجم تلك المصفوفة هـو 10 بايت والسبب في ذلك هـو وجـودة
مسـافة فارغـــة بـين الكلمتـين Hellow و ++C والتـي تعتبرهـا السـي بلـس
بلس حرفاً كأي حرف آخر.
إدخال المعلومات في السلاسل:
لنفرض أنك تقـوم بكتابـة برنـامج تطلـب فيـه مـن المسـتخدم كتابـة اسمــه ،
حينها فلربما سيحتوي الكـود على هذه الأسطر:
char name[100];
cin >> name;
وبالرغـم من صحـة الأسطر السابقــة ، ولكـن مـاذا لـو قـرر المسـتخدم كتابـة
اسمه بالكامل أي اسمه واسم أبيـه ، نحـن لا ننـاقش هــنا حجـم المصـفوفة
فبإمكانك تغييرها متى تشاء ، لنفرض أن المستخدم أدخل اسمه هـكذا:
Mohamed Abdullah
حينها سيقوم الكـائن cin بتخـزين الكلمـة الأولـى فـي المصـفوفة ولـن يقـوم
بتخزين الكلمة الثانية أبداً في المصفوفة والسبب في ذلك هـو أن الكائن cin
يعتبر حرف المسافة الخالية هـو حرف إنهاء وبالتالي فإنه ينتهي من القراءة.
لحل هذه المشكلة يوفر لنا الكائن cin تابعاً هـو التابع get والذي يقوم بقـراءة
المسافات الخالية . حينها ستقوم بتعـديل الأسطر السابقـة لتصبح كالتالي:
char name[100];
cin.get (name , 99 );
يستقبل التابع وسيطين اثنين هـما اسم المصـفوفة والقيمـة القصـوى لعــدد
الأحرف والسبب في أننا وضعـنا الرقم 99 هـو للسماح بوجود الحرف الخـالي
أو حرف الإنهاء ، وهـناك وسيط ثالث وهـو حرف الإنهاء ، ولا يشترط لك وضعـه
ولكن عليك أن تعلم أن حرف الإنهاء هـو 'n\' ، أي إذا قمت بضـغط الـزر Enter
على لوحة المفاتيح فسينتهي البرنامج من قراءة السلسلة التي تكتبها.
التابع getline :
لنفرض أنك ستقوم بكتابة كـود يعـمل كمحـرر نصـوص ، فحينهـا يجـب عليـك
التعامــل مــع الأحــرف 'n\' كمــا رأينــا فــإن التــابع ( )get يقــوم بالتعامــل مــع
المسافات ولكن ماذا لو أردت أنت التعامل مع الأسطر وليس الجمل فحسب.
يوفر لك الكائن cin التابع getline الـذي يتعامـل مـع هـذه المشـكلة. وطريقـة
عـمله هـي نفس طريقة عـمل التابع get وحتى تجعل التابعين يقومـان بحـل
المشكلة المطروحـة (مشكلة الأسطر) فعليك فقط أن تحدد ما هــو البـارامتر
الثالث أو الوسيط الثالث وحينها ستحل المشكلة.
ليست هناك تعليقات:
إرسال تعليق