المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : سلسلة دروس المصفوفات والمؤشرات



DarKc0de
12-09-2008, 02:00 AM
هذي الدروس منقولة من النادي البرمجي بجامعة الامام محمد بن سعود الاسلامية

للكاتب هتلرر

بسم الله الرحمن الرحيم

المصفوفات 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];
وقمنا بأدخال اعداد عشوائية ...للمثال فقط.. نشووف الصوورة التالية وهي تمثيلة داخل الذاكرة (طبعا ميزة السي ++ تخليك تتحكم في الذاكرة على راحتك )
طيب نرججع ونشووف الصوورة
http://www.alimam.info/up/uploads/b8d1c9e1f6.png (http://www.alimam.info/up)
وعند الرغبة في الوصول الى احد الاعداد نختار اسم المصفوفة والدليل الذي يوجد به العدد الذي نريدة...
مثلا نريد طباعة العدد 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");
}
ارجو من الجميع كتابة الاكواد داخل المترجم وتجربتها وتغيرها والعب فيها ....
اي استفسار لا يردك الاكيبورد.

DarKc0de
13-09-2008, 01:18 PM
بسم الله الرحمن الرحيم
Arrays
][®][^][®][The Part II][®][^][®][


مثل ما حنا عارفين ان المصفوفات يمكن ان تكون من اي نمط
راح نتكلم عن سلاسل الحروف مع النمط 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

واتمنى ان الدرس يكون واضح

DarKc0de
24-09-2008, 01:11 PM
بسم الله الرحمن الرحيم
ARRAY
«®°·.¸.•°°·.¸¸.•°°·.¸.•°®»THE PART III«®°·.¸.•°°·.¸¸.•°°·.¸.•°®»

السلام عليكم ورحمة الله وبركاته

موضوع المصفوفات من المواضيع المهمة لفهم اساس لغة السي ++ لان معظم البرامج تعتمد عليها
وماراح تفهم المؤشرات حتى تتقن المصفوفات .(وهذا راي شخصي)
][®][^][®][Multiple Subscripts Arrays][®][^][®][
المصفوفات متعددة الابعاد
ومثل ماشفتو ان المصفوفات يمكن ان تأخذ عدة ابعاد .ومن اشهر استخدامتها الجداول Tables الي هي عبارة عن مجموعة من القيم المرتبة ضمن مجموعة من الاسطر rows والاعمدة columns.
واذا بغينا نصل الى اي قيمة ضمن المصفوفة نحدد الدليلين : رقم السطر ورقم العمود للوصول الى العنصر..
نشوف المثال التالي

int a[3][4];
تحتوى هذي المصفوفة على بعدين وهي تتضمن 3 اسطر واربع اعمدة اي 3*4=12 .
خلونا نأخذكم في رحلة داخل المترجم عشان نعرف كيف يتم حجزها في الذاكرة ....>>هي بنا كوميسان هيا بنا لنعرف الحقيقة
(طبعا هو تخيلي)

http://www.alimam.info/up/uploads/62193a8b50.png (http://www.alimam.info/up)

مثل ما شفتم الصورة .....واعتقد وضحة عملية الوصول الى اي عنصر من عناصر المصفوفة .

ونقدر نعطي المصفوفة قيم ابتدائية عند التصريح عنها
نشوف المثال التالي وهي عملية اعطاء المصفوفة قيم ابتدائي :

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]
الى هنا وصلنا الى نهاية المصفوفات ...
وبقى نأخذ أسئلة ............
ودمتم سالمين