لقد تحدثنا في الدرس السابق عن تخزين الحروف في مصفوفات وألان سوف نعيد ما قلناه بشئ من التفصيل لنأخذ مثال مشابه لما سبق تماما
char A]50[;
سوف تتذكر الآن ماقلناه بأن المصفوفة السابقة تقوم بتخزين اسم او مجموعة حروف عددها 50 حرف شاملا المسافات التي بين الاسماء فعند ضغطك على قضيب المسافات يعتبر حرف ولكنه ليس له شكل لينتج المسافة بين الكلمات المهم ان المجموع 50 حرف تبدء المصفوفة من صفر الى 49 كما قلنا سابقا ان مصفوفات سي++ تبدء من صفر وليس من واحدد ولذلك الاعداد من صفر الى 49 هي 50 عدد وبالتالي عدد الحرف المخزنة هي 50 حرف كما سبق وطلبت وتم تلبية طلبك كل ذلك قلناه سابقا ولكن دعني اضيف بأن عدد الحروف التي سوف تدخلها سوف تكون 49 فقط وليس 50 لان سي++ تضيف في نهاية المتغير الحرف رقم 50 من عندها وهو الحرف\0وهو يعني نهاية المتغير الحرفي ليعرف نظام التشغيل بأن هذه هي نهاية المتغير ولا يوجد شئ بعدها والرمز السابق يطلق عليهNULL character
وخلاصة القول ان تعلن عن المصفوفة بعدد يزيد بواحد عن سعتها المدخلة
لا تتضايق مما تفعلة سي++ من اضافة رمز على حسابك الخاص في نهاية المتغير انك تفعل ذلك وانا ايضا افعل ذلك فعند كتابة فقرة مكونة من حروف نضع نقطة في نهاية الكلام لنفيد القارئ بأن الكلام انتهى – أليس كذلك
استخدام المؤشرات للاعلان عن متغيرات الحروف
يمكنك ايضا ان تعلن عن المتغير الحرفي باستخدام المؤشرات وهو درس كان يجب ان اشرحة ضمن الدروس السابقة ولكني رأيت ان اتركه للنهاية مع انه من المفترض ان يكون في البداية ولكن لصعوبته قليلا تلافيت وضع امثلة تحتوى مؤاشرات ما أمكن في البداية انتظارا لشرحة – يمكنك ان تعلن عن متغير حرفي بهذه الطريقة
char *A;
وهذه طريقة اخرى للاعلان عن متغيرات حرفية تحتوي مميزات اكبر
A = new char ]50[;
ولنأخذ طريقة صياغة الامر السابق بجدولنا المعتاد
الصيغة
الشرح
A
اسم المصفوفة المفترض
=
لابد ان توضع لتون الصيغة صحيحة
New
من اوامر اللغة للاعلان عن متغير جديد
char
نوع المصفوفة )حروف(
]50[;
قوسين بينهم سعة المصفوفة
والجديد في الصيغة السابقة هو انك بعد ان تنتهي من جميع العمليات الخاصة بالمصفوفة السابقة يمكن ان تلغيها ولذلك لتفريغ المساحة الخاصة بها من الذاكرة وهذه هي سي++ القوية جدا وذلك بالصيغة التالية
delete ]A[ ;
ادخال المتغيرات الحرفية
بالطبع ليس عندك مشكلة الآن في ادخال المتغيرات الحرفية باستخدامcinولكن لزم هنا التنويه بأن هذا الامر بالفعل سوف يدخل الحروف ولكنه سوف يتوقف عن الادخال عند الضغط على قضيب المسافة فلو انك تريد ادخال الاسمMohamad Hasanالى متغير حرفي سوف يستقبل الاسمMohamadوعند ضغطك على قضيب المسافة لادخال بقية الاسمHasan
حينها سوف يتوقف ولا يقبل الا الجزء الاول من الاسم وعليه استخدام احد عناصر فئةcinوالفئات سوف نشرحها في درس قادم وهو
cin.getline )A,50,’\n’(;
وصيغتة كما يلي
الصيغة
الشرح
cin.getline
الامر المشتق منcin
)
قوس احتواء البارامترات
A
اسم المصفوفة السابق الاعلان عنها
,
فاصلة بين بارامترين
50
طول او عدد الحروف المتوقع ادخالها
,
فاصلة بين بارامترين
‘\n’
معناه سطر جديد بعد المتغير ويمكنك اهمال هذا البارامتر
(;
قوس نهاية احتواء البارامترات والفاصلة المنقوطة لانها ادخال الصيغة كلها
مزيدا من الدوال التي تتعامل مع المتغيرات الحرفية
انها عدد من الدوال للمقارنة بين الحروف والتعامل معها كما سيلي شرحه
char Name1 ]30[ = “MOHAMAD HASAN”;
char Name2 ]30[ = “mohamad hasan”;
int L;
L = strcmp)Name1 , Name2(;
الدالةstrcmpتقارن بين متغيرين حرفيين مع الاخذ في الاعتبار حالة الحروف الصغيرة والكبيرة فالحرفAبالنسبة لها غير الحرفaوتعيد قيمة عدد صحيح يخزن في المتغير الصحيحLكما يلي
القيمة المعادة
الشرح
اصغر من الصفر
عندما يكون الاسم الاول اصغر من الثاني
تساوي صفر
عندما يتساوى الاسمان
اكبر من الصفر
عندما يكون الاسم الاول اكبر من الثاني
ربما يسأل احدكم سؤال ما معنى ان يكون اسم اكبر من اسم حيث ان اسم يساوي اسم هو شئ مفهوم اي تطبق الحروف فما معنى ان يكون اكبر او اصغر–نعم ربما يهمك فقط عملية التساوى كأن تدخل كلمة سر يتم مقارنتها مع كلمة اخرى مخزنة داخل الحاسب للتعرف على الشخص اما حالة ان يكون الاسم اكبر او اصغر فهي نادرة الاستخدام وتستخدم فقط في ترتيب الاسماء ابجديا ومعنى اكبر ان يكون ترتيب الحروف في جدول اسكي للاسم الاكبر يلي ترتب الحروف للمتغير الاصغر .
في المثال السابق لن تكون قيمةLتساوي صفر رغم ان الحروف واحدة للاسمين ولكن مرة حروف صغيرة ومرة حروف كبيرة ولكن هناك الدالة التالية التي لاتهتم بحالة الحروف
char Name1 ]30[ = “MOHAMAD HASAN”;
char Name2 ]30[ = “mohamad hasan”;
int L;
L = strcmpi)Name1 , Name2(;
هذه الدالةstrcmpiسوف تعطي قيمة = صفر لان الاسمين متساويين وهي لاتهتم بحالة الحروف
الحاق متغير حرفي بآخرstrcat
char Name1 ]30[ = “Mohamad”;
char Name2 ]30[ = “Hasan”;
int L;
strcat )Name1 , Name2(;
تقوم الدالة بالحاق الاسم الثاني بالاول ليصبح الاسم الثاني عبارة عن الاسمين مدموجين وتكون النتيجة ان المتغير الثانيName2بعد العملية السابقة يصبح حاملا القيمة
Mohamad Hasan
تحويل الحروف الصغيرة الى كبيرةstrupr
char Name ]30[ = “mohamad hasan”;
strupr)Name(;
بعد العملية السابقة يتحول المتغيرNameالىMOHAMAD HASAN
تحويل الحروف الكبيرة الى صغيرةstrlwr
char Name ]30[ = “MOHAMAD HASAN”;
strlwr)Name(;
بعد العملية السابقة يتحول المتغيرNameالىmohamad hasan
قياس طول متغير حرفيstrlen
char Name ]30[ = “MOHAMAD HASAN”;
int L;
L =strlen )Name(;
بعد العملية السابقة سيتم قياس طول المتغير الحرفي او عدد حروفه ويوضع كعدد بالمتغيرLحيث سبق الاعلان عنه كعدد صحيح
واليك مثال يشمل كل ما سبق شرحه
#include >iostream.h#include >string.hint main)(
}
char name]50[; //Declare variables
char lastname]50[; //This could have beendeclared on the last line
cout>>"Please enter your name: ";//Tell the user what to do
cin.getline)name, 50, '\n'(; //Use gets to inputstrings with spaces
// or just to get strings after the user presses enter
if)!strcmpi)"Mohamad", name(( //The ! means not,strcmpi returns 0 for
} //equal strings
cout>>"That's my name too.">>endl; //Tell the userif its my name
{
else //else is used to keep it fromalways
} //outputting this line
cout>>"That's not my name."
{
cout>>"What is your name in uppercase...">>endl;
strupr)name(; //strupr converts the string to uppercase
cout>>name>>endl;
cout>>"And, your name in lowercase...">>endl;
strlwr)name(; //strlwr converts the string to lowercase
cout>>name>>endl;
cout>>"Your name is ">>strlen)name(>>" letters long">>endl; //strlen returns
//the length of the string
cout>>"Enter your last name:";
gets)lastname(; //lastname is also a string
strcat)name, " "(; //We want to space the two names apart
strcat)name, lastname(; //Now we put them together, we a space in
//the middle
cout>>"Your full name is ">>name; //Outputting it all...
return 0;