Arrays And Strings
بدايـة:
لنفرض أنه طلب منك كتـابة برنامج بسيط للغـاية وهـو إدخال درجــات عشـر
طلاب ؛ لكي تحل هذا البرنامج فإن عليك أن تقوم بالإعلان عـن 12 متغيراً من
نـوع float ؛ وربما أن هذا مقبول نـوعاً ماً ؛ ولكـن ماذا لو طلب منك إدخال أكثر
من درجات 1000 طالب لحل هذه الإشكالية توفر لك لغـة السي بلـس بلـس
المصــفوفات.صــحيح أننــا قمنــا بحــل مســائل مــن هــذا النـــوع لــم تتطلــب
المصفوفات لكن ماذا لو طلب منك البحث عـن درجـة طالب معـين فلـن يكـون
هـناك أي حل إلا بواسطـة المصفوفات.
تعريف المصفوفات:
هـي عبارة عـن مجمـوعــة مـن البيانـات التـي تشـترك فـي الاسـم والنــوع ولكنهـا
تختلف في القيم المسندة إليها
الإعلان عـن المصفوفـة:
انظر إلى هذا السطر
int mark[10];
السطر السابق هـي طريقـة الإعلان عـن المصفوفـة وكما تلاحظ فإن الإعلان يحـوي
ثلاثـة أشياء:
نـوع المصفوفـة ؛ واسم المصفوفـة ؛ وعدد عـناصر المصفوفـة.
عدد عـناصر المصفوفـة يجب أن يكون بين قوسين [ ].
عدد عـناصر المصفوفـة اسم المصفـوفـة نـوع المصفوفـة
int mark [20] ;
أعضاء المصفـوفـة :
في المصفوفـة السابقـة ؛ فإنها تحـوي هذه العـناصر: int mark[0] ; int mark[1 ] ; int mark[2] ; int mark[3] ; int mark[4] ; int mark[5] ; int mark[6] ; int mark[7] ; int mark[8] ; int mark[9] ;
كما تلاحظ فإن المصفـوفــة مكـونــة مـن عشـرة عــناصر حسـبما هــو مكتــوب فـي
الإعلان السابق . ألا ترى الـرقم الملـون بـالأزرق هـذا الـرقم هــو مـا يسمــى بـدليل
المصفـوفـة والـذي يميـز بـين عناصـر المصـفوفة الواحـدة ؛ المميـز هــنا هــو أن أول
عـنصر في المصفـوفـة هـو [0]mark int وآخر عـنصر هـو [9]mark int وكما تلاحـظ
فإنه لا وجود للعـنصر العاشر وهذا ما عليك أن تعرفـه وهـو بالغ الأهـميـة العــد فـي
المصفـوفـة يبدأ من العـنصر رقم صفر وينتهـي إلـى العـدد مـا قبـل الأخيـر مـن عـدد
أعضاء المصفـوفـة المعلن عـنه.
الـوصول إلى عـناصر المصفـوفـة :
حسـب الشـكل التوضــيحي السـابق فإنـك تسـتطيع الوصــول إلـى أي عــنصر فـي
المصفـوفـة عبر كتـابة نـوع المصفـوفـة واسمها ثم دليل العـنصر فمثلاً للوصول إلـى
أول عـنصر في المصفوفـة تستطيع كتابة [0]mark int وكمـا تلاحـظ مجـدداً فـإن
أول عـنصر فـي المصفوفــة دليلــه هــو صـفر ؛ دعــنا الآن مـن هــذا الكـلام النظـري
ودعـنا ندخل لمرحلة الكتابة الكوديـة:
مثال عـملي:
سنقوم بكتابة كـود للطلاب ،عدد الطلاب فيه هـو عشرة ، ثم نحسب متوسط درجات
هــؤلاء الطـلاب ، لـذلك نسـتطيع الإعـلان عــن مصفوفــة مكــونة مـن عشـر عــناصر
وسنقوم بتسميتها [10]stud int ؛ بعـد ذلك نطلب من المستخدم إدخـال درجـات
الطلاب بواسطـة دالة تكراريـة ونسطيع الإعلان عــم متغيـر مـن نــوع int وآخـر مـن
نــوع float حيــث أن مهـمـــة الأول هــي حســاب مجمـــوع درجــات الطــلاب والثــاني
وظيفتـه قسمـة المجمــوع علـى عـدد الطـلاب ؛ وهــكذا انتهينـا مـن حـل المشكلــة
وبقي أن نحـول الحل إلى كـود وهـو كالتالي:
CODE
1 #include <iostream.h>
2 main ( )
3 {
4 int stud[10] ,total=0 , i ;
5 float Avrege;
6 cout << "Please Enter all grades of stud:\n" ;
7 for (i=0 ; i<10 ; i++)
8 {
9 cout << "grade number" << i+1 << endl;
10 cin >> stud[i] ;
11 total=total+stud[ i ] ;
12 }
13 Avrege=total /10;
14 cout << "The Avrege of all student is: " << Avrege ;
15 return 0;
16 }
بهذه الطريقـة يمكن حل السؤال السابق كمـا تلاحـظ فلقـد إسـتخدمنا متغيـر
من نـوع int هـو i والسبب في ذلك كما تـرى هــو دالـة for ؛ فكمـا تلاحـظ أن
دليل المصفـوفـة في الدالة التكرارية هـو i ؛ والذي يزيد بعد كـل إدخـال مـرة
واحدة وبالتالي ينتقل البرنامج من العـنصر الاول إلى العــنصر الثـاني وحتـى
آخر عـنصر وكما تلاحظ أيضاً إستخــدمنا متحــول total والـذي يقـوم بحسـاب
مجمـوع الدرجات فهـو أولاً يسند أول عـنصر من المصفـوفــة إلـى نفســه ثـم
فــي الــدورة التكراريــة الثانيـــة يقــوم بإســناد مجمـــوع العـــنصر التــالي مــن
المصفـوفـة ومجمـوعه هـو أيضاً إلى نفسـه ويستمر هكذا حتى الخـروج مـن
دالة for .
تحذير:
لا تحـاول أبداً في البرنامج السابق أن تغيـر الشـرط فـي الدالـة التكراريـة for
من 10>i إلى مثلاً 12>i فذلك لن يزيد مـن حجـم المصفـوفــة ولـن يفعـل أي
شيء لك ؛ فقط كل الذي سيفعله البرنامج أنه سيكتب العـنصر الحادي عشر
فــي مكــان خــارج حــدود المصفـوفـــة أي فــي ذاكــرة أخـــرى غيــر مخصصـــة
للبرنامج ربما تكون هذه الذاكرة مخصصـة لبرنـامج آخـر أو لنظـام التشـغيل أو
لأي شيء مهـما كان ؛ وقد لا يكون كذلك فربما أن ذلـك سـيؤثر علـى برنـامج
ولن يعـمل ..... أيضاً أحد الأخطاء الشائعـة هـو كتابة الشرط هكـذا 10<i هـذا
الشرط سيؤدي إلى عـدم توقف برنامجك نهائياً لذلك لا تحاول أن تجربـه
تهيئة المصفوفات:
بإمكانك إدخال عـنصر المصفوفـة دون الحاجـة إلى دالة for وذلك عبر تهيئتها
من داخل برنامج فمثلاً بإمكـانك كتابة السطر التالي:
int mark[7] = { 5,10,90,100,90,85,15};
وهذه الطريقـة في حال أنك لا تريد أن يدخل المستخدم أي أرقام للمصفوفـة.
وعبر هذه الطريقـ بإمكــانك الإستغــناء عــن عـدد عــناصر المصفوفــة الموجـود بـين
قوسين ؛ هكذا:
int mark[] = { 5,10,90,100,90,85,15};
وسيقوم المترجم بعد العـناصر الموجودة في المصفـوفـة.
لكن ليس بامكانك كتابة السطر السابق لكي تطلب مـن المسـتخدم إدخـال عــناصر
المصفوفـة.
لاحظ: أنه في جميع طرق الإعلان عــن المصفـوفــة فـلا بـد عليـك مـن تحديـد حجـم
المصفوفـة وإلا فإن المترجم سيعـطيك خطأ.
أنـواع المصفوفات:
كما هـو معلوم فإن المصفوفـات نـوعـان:
1. المصفوفـة الأحاديـة: وهي مكونـة من بعد واحد فقط.
2. المصفوفـة المتعددة الأبعاد: وهـي مكونـة من عــدة صـفوف وأعــمدة (لـيس
شرطاً أن تكون بعدين)
المثال السابق عبارة عـن مصفوفـة من بعد واحد.
طريقة الإعلان عـن المصفوفة متعددة الأبعـاد هـي نفسـها فـي طريقـة المصفوفــة
الأحاديـة غير أنك هذه المرة ستضع بعـداً آخر كالتالي:
int mark[10] [8];
وكمـا تلاحـظ فـإن الإعـلان السـابق هــو لمصـفوفة ذات بعــدين مكونــة مـن عشـرة
-فوف وثمانية أعـمدة.
مثال كـودي:
سنقوم بكتابة برنامج لإدخال رواتـب خمـس مـوظفين فـي ثلاثــة أقسـام ثـم
نقوم بحساب متوسط كل قسم ثم نحسب متوسـط رواتـب جميـع المـوظفين
في جميع الأقسام
من الملاحظ أن هذا البرنامج لن تستطيع حله إلا باستخدام مصفـوفــة ثنائيـة
البعد حيث عدده صفوفها ثلاثــة وهـو عـدد الأقسـام وعـدد الأعــمدة خمســة
وهـــو عــدد الموظفيـــن ؛ وللإســتمرار فــي حــل البرنــامج فســنقوم بإنشــاء
مصفـوفة أحادية جديدة تحـوي مجـموع رواتب كل قسم ونحن لا ننشيء هذه
المصفوفة لأن حل مشكلة البرنامج هـي هكـذا بـل لتسـهيل الحـل والفهــم ؛
تذكر المصفوفـة الجديدة ستكون مكونـة من ثلاثة عـناصر.
CODE
1 #include <iostream.h>
2 main( )
3 {
4 int employee[3][5] , size[4] , i , j , sum=0 ;
5 size [3]=0;
6 cout << "Please Enter all employees salary" << endl;
بدايـة:
لنفرض أنه طلب منك كتـابة برنامج بسيط للغـاية وهـو إدخال درجــات عشـر
طلاب ؛ لكي تحل هذا البرنامج فإن عليك أن تقوم بالإعلان عـن 12 متغيراً من
نـوع float ؛ وربما أن هذا مقبول نـوعاً ماً ؛ ولكـن ماذا لو طلب منك إدخال أكثر
من درجات 1000 طالب لحل هذه الإشكالية توفر لك لغـة السي بلـس بلـس
المصــفوفات.صــحيح أننــا قمنــا بحــل مســائل مــن هــذا النـــوع لــم تتطلــب
المصفوفات لكن ماذا لو طلب منك البحث عـن درجـة طالب معـين فلـن يكـون
هـناك أي حل إلا بواسطـة المصفوفات.
تعريف المصفوفات:
هـي عبارة عـن مجمـوعــة مـن البيانـات التـي تشـترك فـي الاسـم والنــوع ولكنهـا
تختلف في القيم المسندة إليها
الإعلان عـن المصفوفـة:
انظر إلى هذا السطر
int mark[10];
السطر السابق هـي طريقـة الإعلان عـن المصفوفـة وكما تلاحظ فإن الإعلان يحـوي
ثلاثـة أشياء:
نـوع المصفوفـة ؛ واسم المصفوفـة ؛ وعدد عـناصر المصفوفـة.
عدد عـناصر المصفوفـة يجب أن يكون بين قوسين [ ].
عدد عـناصر المصفوفـة اسم المصفـوفـة نـوع المصفوفـة
int mark [20] ;
أعضاء المصفـوفـة :
في المصفوفـة السابقـة ؛ فإنها تحـوي هذه العـناصر: int mark[0] ; int mark[1 ] ; int mark[2] ; int mark[3] ; int mark[4] ; int mark[5] ; int mark[6] ; int mark[7] ; int mark[8] ; int mark[9] ;
كما تلاحظ فإن المصفـوفــة مكـونــة مـن عشـرة عــناصر حسـبما هــو مكتــوب فـي
الإعلان السابق . ألا ترى الـرقم الملـون بـالأزرق هـذا الـرقم هــو مـا يسمــى بـدليل
المصفـوفـة والـذي يميـز بـين عناصـر المصـفوفة الواحـدة ؛ المميـز هــنا هــو أن أول
عـنصر في المصفـوفـة هـو [0]mark int وآخر عـنصر هـو [9]mark int وكما تلاحـظ
فإنه لا وجود للعـنصر العاشر وهذا ما عليك أن تعرفـه وهـو بالغ الأهـميـة العــد فـي
المصفـوفـة يبدأ من العـنصر رقم صفر وينتهـي إلـى العـدد مـا قبـل الأخيـر مـن عـدد
أعضاء المصفـوفـة المعلن عـنه.
الـوصول إلى عـناصر المصفـوفـة :
حسـب الشـكل التوضــيحي السـابق فإنـك تسـتطيع الوصــول إلـى أي عــنصر فـي
المصفـوفـة عبر كتـابة نـوع المصفـوفـة واسمها ثم دليل العـنصر فمثلاً للوصول إلـى
أول عـنصر في المصفوفـة تستطيع كتابة [0]mark int وكمـا تلاحـظ مجـدداً فـإن
أول عـنصر فـي المصفوفــة دليلــه هــو صـفر ؛ دعــنا الآن مـن هــذا الكـلام النظـري
ودعـنا ندخل لمرحلة الكتابة الكوديـة:
مثال عـملي:
سنقوم بكتابة كـود للطلاب ،عدد الطلاب فيه هـو عشرة ، ثم نحسب متوسط درجات
هــؤلاء الطـلاب ، لـذلك نسـتطيع الإعـلان عــن مصفوفــة مكــونة مـن عشـر عــناصر
وسنقوم بتسميتها [10]stud int ؛ بعـد ذلك نطلب من المستخدم إدخـال درجـات
الطلاب بواسطـة دالة تكراريـة ونسطيع الإعلان عــم متغيـر مـن نــوع int وآخـر مـن
نــوع float حيــث أن مهـمـــة الأول هــي حســاب مجمـــوع درجــات الطــلاب والثــاني
وظيفتـه قسمـة المجمــوع علـى عـدد الطـلاب ؛ وهــكذا انتهينـا مـن حـل المشكلــة
وبقي أن نحـول الحل إلى كـود وهـو كالتالي:
CODE
1 #include <iostream.h>
2 main ( )
3 {
4 int stud[10] ,total=0 , i ;
5 float Avrege;
6 cout << "Please Enter all grades of stud:\n" ;
7 for (i=0 ; i<10 ; i++)
8 {
9 cout << "grade number" << i+1 << endl;
10 cin >> stud[i] ;
11 total=total+stud[ i ] ;
12 }
13 Avrege=total /10;
14 cout << "The Avrege of all student is: " << Avrege ;
15 return 0;
16 }
بهذه الطريقـة يمكن حل السؤال السابق كمـا تلاحـظ فلقـد إسـتخدمنا متغيـر
من نـوع int هـو i والسبب في ذلك كما تـرى هــو دالـة for ؛ فكمـا تلاحـظ أن
دليل المصفـوفـة في الدالة التكرارية هـو i ؛ والذي يزيد بعد كـل إدخـال مـرة
واحدة وبالتالي ينتقل البرنامج من العـنصر الاول إلى العــنصر الثـاني وحتـى
آخر عـنصر وكما تلاحظ أيضاً إستخــدمنا متحــول total والـذي يقـوم بحسـاب
مجمـوع الدرجات فهـو أولاً يسند أول عـنصر من المصفـوفــة إلـى نفســه ثـم
فــي الــدورة التكراريــة الثانيـــة يقــوم بإســناد مجمـــوع العـــنصر التــالي مــن
المصفـوفـة ومجمـوعه هـو أيضاً إلى نفسـه ويستمر هكذا حتى الخـروج مـن
دالة for .
تحذير:
لا تحـاول أبداً في البرنامج السابق أن تغيـر الشـرط فـي الدالـة التكراريـة for
من 10>i إلى مثلاً 12>i فذلك لن يزيد مـن حجـم المصفـوفــة ولـن يفعـل أي
شيء لك ؛ فقط كل الذي سيفعله البرنامج أنه سيكتب العـنصر الحادي عشر
فــي مكــان خــارج حــدود المصفـوفـــة أي فــي ذاكــرة أخـــرى غيــر مخصصـــة
للبرنامج ربما تكون هذه الذاكرة مخصصـة لبرنـامج آخـر أو لنظـام التشـغيل أو
لأي شيء مهـما كان ؛ وقد لا يكون كذلك فربما أن ذلـك سـيؤثر علـى برنـامج
ولن يعـمل ..... أيضاً أحد الأخطاء الشائعـة هـو كتابة الشرط هكـذا 10<i هـذا
الشرط سيؤدي إلى عـدم توقف برنامجك نهائياً لذلك لا تحاول أن تجربـه
تهيئة المصفوفات:
بإمكانك إدخال عـنصر المصفوفـة دون الحاجـة إلى دالة for وذلك عبر تهيئتها
من داخل برنامج فمثلاً بإمكـانك كتابة السطر التالي:
int mark[7] = { 5,10,90,100,90,85,15};
وهذه الطريقـة في حال أنك لا تريد أن يدخل المستخدم أي أرقام للمصفوفـة.
وعبر هذه الطريقـ بإمكــانك الإستغــناء عــن عـدد عــناصر المصفوفــة الموجـود بـين
قوسين ؛ هكذا:
int mark[] = { 5,10,90,100,90,85,15};
وسيقوم المترجم بعد العـناصر الموجودة في المصفـوفـة.
لكن ليس بامكانك كتابة السطر السابق لكي تطلب مـن المسـتخدم إدخـال عــناصر
المصفوفـة.
لاحظ: أنه في جميع طرق الإعلان عــن المصفـوفــة فـلا بـد عليـك مـن تحديـد حجـم
المصفوفـة وإلا فإن المترجم سيعـطيك خطأ.
أنـواع المصفوفات:
كما هـو معلوم فإن المصفوفـات نـوعـان:
1. المصفوفـة الأحاديـة: وهي مكونـة من بعد واحد فقط.
2. المصفوفـة المتعددة الأبعاد: وهـي مكونـة من عــدة صـفوف وأعــمدة (لـيس
شرطاً أن تكون بعدين)
المثال السابق عبارة عـن مصفوفـة من بعد واحد.
طريقة الإعلان عـن المصفوفة متعددة الأبعـاد هـي نفسـها فـي طريقـة المصفوفــة
الأحاديـة غير أنك هذه المرة ستضع بعـداً آخر كالتالي:
int mark[10] [8];
وكمـا تلاحـظ فـإن الإعـلان السـابق هــو لمصـفوفة ذات بعــدين مكونــة مـن عشـرة
-فوف وثمانية أعـمدة.
مثال كـودي:
سنقوم بكتابة برنامج لإدخال رواتـب خمـس مـوظفين فـي ثلاثــة أقسـام ثـم
نقوم بحساب متوسط كل قسم ثم نحسب متوسـط رواتـب جميـع المـوظفين
في جميع الأقسام
من الملاحظ أن هذا البرنامج لن تستطيع حله إلا باستخدام مصفـوفــة ثنائيـة
البعد حيث عدده صفوفها ثلاثــة وهـو عـدد الأقسـام وعـدد الأعــمدة خمســة
وهـــو عــدد الموظفيـــن ؛ وللإســتمرار فــي حــل البرنــامج فســنقوم بإنشــاء
مصفـوفة أحادية جديدة تحـوي مجـموع رواتب كل قسم ونحن لا ننشيء هذه
المصفوفة لأن حل مشكلة البرنامج هـي هكـذا بـل لتسـهيل الحـل والفهــم ؛
تذكر المصفوفـة الجديدة ستكون مكونـة من ثلاثة عـناصر.
CODE
1 #include <iostream.h>
2 main( )
3 {
4 int employee[3][5] , size[4] , i , j , sum=0 ;
5 size [3]=0;
6 cout << "Please Enter all employees salary" << endl;