هذي الدروس منقولة من النادي البرمجي بجامعة الامام محمد بن سعود الاسلامية
للكاتب هتلرر
بسم الله الرحمن الرحيم
المصفوفات ARRAYS
الجزء الاول
المصفوفة:هي عبارة عن مجموعة من خانات الذاكرة المتتالية التي لها نفس الاسم ونفس النمط (عدد صحيح او عدد عشري او حرفي).
___________________________________________
نرجع للدروسي القديمة شوي عند التعريف عن متغير نقوم بحجز مكان لة بالذاكرة وتحديد نوعة(النمط)...
int num
قومنا بحجز 4 byte لانة عدد صحيح طبعا هي قليلا ما تختلف من جهاز الى جهاز
الحجز لا يكون مرتب يعني بجميع الذاكرة ..
يمكن يكون متغير في اليسار والثاني باليمين....في الذاكرة طبعا ....يعني نادرا ما يكونا جنب بعض
ولمعرفة حجم الانماك الاخرى قم بتجربة هذا الكود
- الكود:
-
cout << "sizeof(int): " << sizeof(int) << endl
<< "sizeof(float): " << sizeof(float) << endl
<< "sizeof(double): " << sizeof(double) << endl
<< "sizeof(char): " << sizeof(char) << endl
_______________________________________________________
نقدر نقول ان المصفوفة عبارة عن مجموعة من المتغيرات متلاصقة مع بعض تحمل نفس الاسم ونفس النوع.
#التصريح عن المصفوفة:
نستخدم العبارة التالية
- الكود:
-
int Matrix [50];
هنا تم التعريف عن مصفوفة من النوع int واسمها Matrix وحجمها 50 اي تحمل 50 عدد من النوع int .
ملاحظات:
نسمي الرقم الموضع بين القوسين بالدليل sub****** .
يجب الدليل ان يكون عدد صحيح او اي متغير يعطي قيمة صحيحة.
طيب نشوف المثال التالي وهو عبار عن تعريف مصفوفة في الذاكرة
- الكود:
-
int c[8];
وقمنا بأدخال اعداد عشوائية ...للمثال فقط.. نشووف الصوورة التالية وهي تمثيلة داخل الذاكرة (طبعا ميزة السي ++ تخليك تتحكم في الذاكرة على راحتك )
طيب نرججع ونشووف الصوورة
وعند الرغبة في الوصول الى احد الاعداد نختار اسم المصفوفة والدليل الذي يوجد به العدد الذي نريدة...
مثلا نريد طباعة العدد 65 يتم الوصول الية
- الكود:
-
cout<<c[6];
ملاحظات:
يبدا حجز المصفوفة من الدليل صفر وليس واحد
ويبقى الدليل الاخير دون استخدام وعند اسناد اي قيمة الى الدليل الاخير يعطينا المترجم خطاء(راح نتطرق لها مستقبلا)
ونستفيد من ذالك انة اذا تم التعريف عن مصفوفة حجمها 10 فان الدليل يبدأ من صفر الى 9
ننتقل الى الجزء العملي ..وناخذ كم مثال
في المثال التالي راح نكتب مصفوفة حجمها 10 ونمطها int ونقوم بأعطها القيمة صفر الى العناصر العشرة للمصفوفة
- الكود:
-
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
int n[10];
for (int i=0 ; i<10 ;i++)
{
n[i] = 0 ;
}//end of for
for (int j =0;j<10 ;j++)//to Print the Matrix n
{
cout<<setw(70)<<j<<setw(13)<<n[j]<<endl;
}
system("pause");
}
ومثل ما انت شايفين استخدام اللوب لعطاء قيم للمصفوفة واستخدام اللوب للطباعة
ملاحظة:
الجزء هذا ينوب عنة
- الكود:
-
for (int i=0 ; i<10 ;i++)
{
n[i] = 0 ;
}//end of for
ينوب عن هذا الكود
- الكود:
-
n[10] ={0};
ويمكن تخزين عناصر في المصفوفة عند تعريفها والمثال التالي يوضح الطريقة
- الكود:
-
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
int n[10]={88, 65,5555,4545,4345,354,454,344,3334};
for (int j =0;j<10 ;j++)//to Print the Matrix n
{
cout<<setw(7)<<j<<setw(10)<<n[j]<<endl;
}
system("pause");
}
ارجو من الجميع كتابة الاكواد داخل المترجم وتجربتها وتغيرها والعب فيها ....
اي استفسار لا يردك الاكيبورد.
مثل ما حنا عارفين ان المصفوفات يمكن ان تكون من اي نمط
راح نتكلم عن سلاسل الحروف مع النمط char
اي سلسلة من سلاسل الحروف مثل hello هي بالواقع عبارة عن مصفوفة حروف .
لذالك يمكن اعطاء قيم ابدائية لمصفوفة حروف باستخدام سلاسل الحروف على سبيل المثال يقوم التصريح التالي
- الكود:
-
char string1[] = "first";
باعطاء قيم ابتدائية لكل عنصر من عناصر المصفوفة string1 يقابل حرف من السلسلة "first"
ويتخدد عدد عناصر المصفوفة بواسطة المترجم .طبعا اكيد المترجم يعطي العدد على حسب طول السلسلة .
مهم:
لو نلاحظ ان السلسة "first " تحتوي على خمسة حروف بالاضافة الى حرف خاص يحدد نهاية هذة السلسلة وهو الحرف الصفري null character
لذالك تتألف المصفوفة من ستة عناصر يتم تمثيل الحرف الصفري على شكل
- الكود:
-
'\0'
تنتهي كافة سلاسل الحروف بالحرف الصفري ويتم بالتالي التصريح عن مصفوفات التي تتعامل مع هذي السلاسل بحث انها تكون ذات حجم كافي لتخزين السلسلة مع الحرف الصفري.
وعلى اعتبار ان السلاسل هي مصفوفات فيمكن الوصل الى كل حرف من حروفها (عن طريق الدليل)
مثلا لوصول الى الحرف f من المصفوفة string1 نستخدم التعبير التالي
- الكود:
-
cout<<string1[0];
يمكن انشاء مصفوفة والطلب من المستخدم ادخال سلسلة ويكون بااستخدام التابع cin
التعرف عن مصفوفة
- الكود:
-
char string2[20];
هنا قمنا بانشاء مصفوفة حروف قادرة على تخزين 19 حرف مع الحرف الصفري...
والعملية التالية تقوم
- الكود:
-
cin>>string2;
لتخزين المدخلات في المصفوفة .
لاحظة انا كتبنا اسم المصفوفة فقط ولم نعطي اي تعليمة خاصة بالحجم.
وبالتالي تقع المهمة على المبرمج ان يصرح عن مصفوفة تفي بالغرض المطلوب من ناحية الحجم .
ويمكن طبعتها بالكود التالي
- الكود:
-
cout<<string2;
نشووف مثاال عملي على الي تكلمنا عنة
- الكود:
-
#include <iostream>
using namespace std;
int main()
{
char string1[20],string2[]="the string 2";
cout<<"Enter the string\n";
cin>>string1;
cout<<"the string 1\t"<<string1<<endl;
cout<<"the string 2\t"<<string2<<endl
<<"string whithe space\n ";
for (int i=0;string1[i] !='\0';i++)
cout<<string1[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
الشرح
- الكود:
-
char string1[20],string2[]="the string 2";
أولا :عرفنا مصفوفتين من نوع char الأولى عطيناها حجم وهو 20 والثانيه ماعطيناها حجم لكننا حددنا لها
جمله فالكومبايلر مباشره راح يحسب الحجم اللي هو13 فهو يحسب أيضا السبيس بين الكلمات
ثانيا:طلبنا من المستخدم ادخال الجمله في المصفوفه الأولى لأننا ماعبيناها فهي فارغه (مع ملاحظة الألتزام بالحجم حق المصفوفه)
- الكود:
-
cout<<"Enter the string\n";
cin>>string1;
ثالثا:عملنا عملية اخراج بسيطه لعناصر المصفوفتين
- الكود:
-
cout<<"the string 1\t"<<string1<<endl;
cout<<"the string 2\t"<<string2<<endl
رابعا : وهنا الفكره أننا راح نخرج عناصر المصفوفه الأولى اللي دخلناها مفرقه (أي مسافه بين كل حرف وحرف في الجمله المدخله)
- الكود:
-
<<"string whithe space\n ";
for (int i=0;string1[i] !='\0';i++)
cout<<string1[i]<<" ";
cout<<endl;
مع ملاحظة أنه وضعنا شرط التوقف في الفور لوب هو الوصول للحرف الصفري أو النل
فمثلا :لو أنا دخلت الجمله في المصفوفه الأولى IMAMفراح تخرج كالأتي:
- الكود:
-
I M A M
واتمنى ان الدرس يكون واضح
«®°·.¸.•°°·.¸¸.•°°·.¸.•°®»THE PART III«®°·.¸.•°°·.¸¸.•°°·.¸.•°®»
السلام عليكم ورحمة الله وبركاته
موضوع المصفوفات من المواضيع المهمة لفهم اساس لغة السي ++ لان معظم البرامج تعتمد عليها
وماراح تفهم المؤشرات حتى تتقن المصفوفات .(وهذا راي شخصي)
][®][^][®][Multiple Subscripts Arrays][®][^][®][
المصفوفات متعددة الابعاد
ومثل ماشفتو ان المصفوفات يمكن ان تأخذ عدة ابعاد .ومن اشهر استخدامتها الجداول Tables الي هي عبارة عن مجموعة من القيم المرتبة ضمن مجموعة من الاسطر rows والاعمدة columns.
واذا بغينا نصل الى اي قيمة ضمن المصفوفة نحدد الدليلين : رقم السطر ورقم العمود للوصول الى العنصر..
نشوف المثال التالي
- الكود:
-
int a[3][4];
تحتوى هذي المصفوفة على بعدين وهي تتضمن 3 اسطر واربع اعمدة اي 3*4=12 .
خلونا نأخذكم في رحلة داخل المترجم عشان نعرف كيف يتم حجزها في الذاكرة ....>>هي بنا كوميسان هيا بنا لنعرف الحقيقة
(طبعا هو تخيلي)
مثل ما شفتم الصورة .....واعتقد وضحة عملية الوصول الى اي عنصر من عناصر المصفوفة .
ونقدر نعطي المصفوفة قيم ابتدائية عند التصريح عنها
نشوف المثال التالي وهي عملية اعطاء المصفوفة قيم ابتدائي :
- الكود:
-
int b[2][2] ={{1,2} , {3, 4}};
انتبة لعملية اعطاء القيم حيث انة تم تجميع قيم كل سطر ضمن قوسين كبيرين والقيمة 1 و 2 هي عبارة عن القيم الابتدائية للعنصرين
- الكود:
-
b[0][0]
And
- الكود:
-
b[0][1]
والقيم 3 و 4 هي قيم للعنصرين b[1][0] , b[1][1] f
واذا لم يوجد قيم كافية لسطر فانة يتم اعطاء القيم صفر نشووف المثال التالي :
- الكود:
-
int m[2][2] = {{1}, {3, 4}};
طيب نأخذ مثال
- الكود:
-
#include <iostream>
using namespace std;
void printArray(int [][3]);
void main()
{
int array1[2][3] = { {1,2,3} ,{4,5,6} };
int array2 [2][3] = {1,2,3,4,5};
int array3[2][3] = { {1,2} ,{4} };
cout<<"Valuse in array1 are :\n";
printArray(array1);
cout<<"Valuse in array2 are :\n";
printArray(array2);
cout<<"Valuse in array3 are :\n";
printArray(array3);
system("pause");
}
void printArray(int a[][3])
{
for (int i =0;i<=1; i++)
{
for (int j =0;j <= 2; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
المصفوفة الاولى مثل ما حنى عارفين ( وهي عملية ترتيب)
اما المصفوفة الثانية array2 احتوى تصريها على خمسة قيم والتي يتم اسنادها الى عناصر السطر الاولى ثم عناصر السطر التالي على التسلسل.والعنصر الي مالة قيمة يتم اعطائة صفر
يتم استدعاء دالة printArray لتقم بطباعة المصفوفات ومثل ما انتم شايفين عملية التكرار (loop) كيف تم استخدامها
ملاحظات :
يمكن للمصفوفة في لغة السي ++ تأخذ 12 بُعد .
من الاخطاء الشائعة تحديد عنصر من عناصر المصفوفة ثنائية البعد بهذي الطريقة
- الكود:
-
a[x,y]
الى هنا وصلنا الى نهاية المصفوفات ...
وبقى نأخذ أسئلة ............
ودمتم سالمين