31-01-15, 12:00 PM
الدرس السابع
* النصوص :
كما تعلمنا في الدرس السابق مكتبة الدوال الحسابية و رأينا اهم الدوال التي تتصمنها ، في هذا الدرس أيضا سوف نتعرف على مكتبة التعامل مع النصوص .
كود :
include<string.h>#
-----------------------------------
درسنا في أنواع المتغيرات النوع char و هو يقبل فقط حرف واحد ، فكرة النصوص معتمدة على تكوين مصفوفة من النوع char و لكن نظرا لمشكلة حجم المصفوفة و ما الى ذلك يستفضل الاعتماد على هذه المكتبة .------------------------------------
- تعريف متغير من النوع string :كود :
string x = "hello world";
مثل أي تعريف لمتغير لكن هنا النوع نص ، و لاحظ هنا ان المكتبة هي التي تتولى عملية تحديد حجم النص .
-------------------------------------
- أهم العمليات -
1 - الجمع : اجل يمكنك جمع نصين باستخدام " + "
كود :
int main(){
string x , y;
y = " !";
x = "hello world";
cout<<x + y;
return 0;
}
فقط الجمع هو الموجود يعني ما احد يجرب * , / , .....
=======
2 - التبديل : يتم التبديل باستخدام الدالة swap كالآتيكود :
int main(){
string x , y;
y = " !";
x = "hello world";
x.swap(y);
cout<<x + y;
return 0;
}
على عكس البرنامج السابق فهذا البرنامج يطبع hello world!
لاحظ هنا السطر
كود :
x.swap(y);
هنا الدالة تبدل قيم المتغيرين دون النظر لاحجامهم او أي تفاصيل أخرى .
يمتلك النوع string مجموعة من الدوال الجاهزة كلها تستدعى عن طريق إضافة " . " بعد اسم المتغير مباشرة ، طبعا هناك الكثير من الدوال لكن نحن هنا سوف نتطرق لمجموعة منها ، اذا لم تفهم الكلام سابق غير النصوص السابقة و جرب و غير الى ان تفهمها .
=========
3 - البحث عن كلمة : نستعمل الدالة find لايجاد موقع كلمة في نص .
كود :
int main(){
string x;
x = "i love c++";
int y =x.find("c++");
cout<<y;
return 0;
}
الدالة هنا تعود لنا بقيمة هي عدد صحيح تشير الى مكان اول حرف في الكلمة التي نبحث عنها ، العد من الصفر دائما .
ستلاحظ هنا ان الناتج هو 7 و بالفعل لو قمت عد الحرزف ستجد ان c هو 7 عندما نعد من الصفر .
=========
4 - نسخ جزء من سلسلة :
نحن نعلم اننا لو اردنا نسخ قيمة متغير لآخر نكتب مباشرة
كود :
x = y;
طيب لو اردنا جزء من نص عدد حروف معين نستعمل substr هذه الدالة تستقبل وسيطين الأول و هو الحرف الذي نبدا منه العد و الثاني و هو عدد الحروف التي سوف ننسخها .
كود :
int main(){
string x;
x = "i love c++";
string y =x.substr(2, 5);
cout<<y;
return 0;
}
ناتج هذا البرنامج هو " love" ، الحرف رقم اثنين هو L (العد يبدأ من الصفر) و 5 هو عدد الحروف التي ستنسخ بما في ذلك الحرف الأول بمعنى انك لو اردت نسخ L فقط ستكتب :
كود :
y = x.substr(2,1);
و لو وضعنا 0 ماذا سيطبع ؟
و لا شيء
==========
5 - معرفة حجم النص :
من المهم ان تعرف حجم النص الذي تستعمله و هنا نستخدم الدالة capacity بدون أي وسيط المهم ان تخزن القيمة في متغير عددي .
كود :
int main(){
string x;
x = "i love c++";
int y = x.capacity();
cout<<y;
return 0;
}
ستلاحظ انك مهما غيرت في النص السابق سواء بإزالة حرف ، إضافة حرف ، اكتب حرف واحد بدل النص كله ان الحجم ثابت !
هذا يرجع للمكتبة نفسها فطالما ان نصك اقل من 15 حرف فهي تحجز عموما مساحة 15 حرف حتى لو استعملت انت 1 من 15 ام لو كان النص اكبر من 15 فهي تحجز مساحة 31 حرف حتى لو كان العدد اقل من هذا اما ما بعد ذلك فهي تحجز مساحة بناء على حجمه .
==========
6 - مشكلة الادخال :
جرب الكود التالي
كود :
int main(){
string x;
cin>>x;
cout<<x;
return 0;
}
جرب ادخال أي جملة بها مسافات .... ماذا تلاحظ ناتج الطباعة هو فقط اول كلمة حتى اول مسافة
طبعا هذه كانت مشكلة عويصة تم حلها باستحدام دالة ادخال جديدة هي getline
كود :
getline( cin , x , '\n');
كما تلاحظ تأخذ هذه الدالة ثلاث وسائط هم : دالة الادخال العادية و المتغير و مكان التوقف و هو في اغلب برامجنا الانتقال لسطر جديد .
جرب البرنامج مرة أخرى بعد التعديل :
كود :
int main(){
string x;
getline(cin , x , '\n');
cout<<x;
return 0;
}
الحمد لله حلت المشكلة لكن بقي سؤال لو خطر في بالك فهذا يدل على شدة تركيزك و انك تفهم و لا تحفظ
لماذا تأخذ دالة getline الدالة cin كوسيط ؟؟؟
.
.
.
الموضوع يرجع لدوال الطباعة و الادخال القديمة التي كانت تستخدم في لغة c حيث كانت تحتاج بعض العمل من اجل تعريف أنواع القيم التي سوف ندخلها و نطبعها و عموما هذا الموضوع لا يهمنا كثيرا .
==========
7 - الاستبدال :
يرتبط الاستبدال بالبحث فهنا نحن نستخدم الدالة find للبحث عن مكان الكلمة التي تريد ازالتها ثم نستعمل الدالة repalce و التي تأخذ ثلاث وسائط هم : مكان النص القديم و ، عدد حروف النص القديم ، النص الجديد .
كود :
int main(){
string x;
x = "i love java" ;
int y = x.find("java");
cout<< x.replace(y , 4 , "c++");
return 0;
}
======================
الى هنا تنتهي حلقتنا النصوصية
الى اللقاء في حلقة أخرى