سنبدأ اليوم بموضوع Array
Arrays
من هياكل البيانات المهمة فى البرمجة والمستخدمة كثيرًا فى الخوارزميات المختلفة , وهى عدد ثابت من العناصر المخزنة و التى يكون لها نفس النوع , وكل عنصر من عناصر المصفوفة له رقم او فهرس Index ويتم تخزين المصفوفة بشكل متجاور فى الذاكرة.
يمكننا الوصول إلى كل عنصر من المصفوفة لتعديله اوحذفه اوالحصول على قميته عن طريق هذا الفهرس Index.
يمكن كتابة الكود لاعلان المصفوفة بطرق مختلفة على حسب اللغة المستخدمة على سبيل المثال فى لغة C يكون كود اعلان المصفوفة كالتالى :
int array[6] = {35,33,42,10,14,50}
1
int array[6] = {35,33,42,10,14,50}
حيث يمثل int نوع البيانات داخل المصفوفة وفى هذه الحالة رقم صحيح Integer.
ويمثل array اي اسم اختيار للمصفوفة.
ويمثل 6 عدد العناصر المحجوزة فى المصفوفة.
وتمثل الارقام بين علامة {} الاعداد الصحيحة التى تمثل عناصر المصفوفة ويفصل بينهم ب ,
ولكل عنصر من عناصر المصفوفة فهرس او رقم يبدء من 0 حتى اخر عنصر , ففى مثالنا السابق العنصر 35 له Index = 0
وهكذا وصولًا للعنصر 19 الذى له Index = 5.
والفهرس او Index مهم كما قلنا للوصول إلى العنصر للتحكم فيه.
Arrays
من هياكل البيانات المهمة فى البرمجة والمستخدمة كثيرًا فى الخوارزميات المختلفة , وهى عدد ثابت من العناصر المخزنة و التى يكون لها نفس النوع , وكل عنصر من عناصر المصفوفة له رقم او فهرس Index ويتم تخزين المصفوفة بشكل متجاور فى الذاكرة.
يمكننا الوصول إلى كل عنصر من المصفوفة لتعديله اوحذفه اوالحصول على قميته عن طريق هذا الفهرس Index.
يمكن كتابة الكود لاعلان المصفوفة بطرق مختلفة على حسب اللغة المستخدمة على سبيل المثال فى لغة C يكون كود اعلان المصفوفة كالتالى :
int array[6] = {35,33,42,10,14,50}
1
int array[6] = {35,33,42,10,14,50}
حيث يمثل int نوع البيانات داخل المصفوفة وفى هذه الحالة رقم صحيح Integer.
ويمثل array اي اسم اختيار للمصفوفة.
ويمثل 6 عدد العناصر المحجوزة فى المصفوفة.
وتمثل الارقام بين علامة {} الاعداد الصحيحة التى تمثل عناصر المصفوفة ويفصل بينهم ب ,
ولكل عنصر من عناصر المصفوفة فهرس او رقم يبدء من 0 حتى اخر عنصر , ففى مثالنا السابق العنصر 35 له Index = 0
وهكذا وصولًا للعنصر 19 الذى له Index = 5.
والفهرس او Index مهم كما قلنا للوصول إلى العنصر للتحكم فيه.
السلام عليكم ورحمة الله
اليوم موضوعنا في هياكل البيانات التراكيب structure وهو موضوع مهم جداً ارجو التركيز فيه لانه موجود في اغلب الدروس القادمه .
بحثت اخواني واخواتي عن موضوع من النت فلم اقتنع بأي بحث لان الشرح فيها مبتذل نوع ما، فانا اجد ان سبب عدم فهمنا لبعض المواضيع هو عدم طرح الفكره بشكل صحيح وكثره المصطلحات التي يصعب فهمها لذلك ساحاول توصيل الفكره بقدر المستطاع وبشكل بسيط واتمنى توصل الفكره
اليوم موضوعنا في هياكل البيانات التراكيب structure وهو موضوع مهم جداً ارجو التركيز فيه لانه موجود في اغلب الدروس القادمه .
بحثت اخواني واخواتي عن موضوع من النت فلم اقتنع بأي بحث لان الشرح فيها مبتذل نوع ما، فانا اجد ان سبب عدم فهمنا لبعض المواضيع هو عدم طرح الفكره بشكل صحيح وكثره المصطلحات التي يصعب فهمها لذلك ساحاول توصيل الفكره بقدر المستطاع وبشكل بسيط واتمنى توصل الفكره
لذلك لنفهم الموضوع نأخذ فكره عنه لكي نستوعبه من ثم ندخل في التفاصيل ،
اذاً ما هو التركيب ؟ ومافائدته ؟
لاجابه السؤال الاول بشكل بسيط وبدون تعقيد هو كود برمجي يذكر فوق داله main ونكتب اسمه وتكون بياناته بين حاصرتين (بغض النظر عن ما هي بياناته او كيفيه تعريفه نريد الاستيعاب حالياً فقط ).
اما بالنسبه للسؤال الثاني ما فائدته لنفهمها في البدايه كأهم فائده لها تجميع البيانات ،ستقول كيف تجميع البيانات ؟🤔
حسناً لو كان لديك برنامج ويتضمن بيانات طالب ايهما افضل تكون بيانات هذا الطالب( اسمه وعمره وعنوانه ودرجاته ) موزعه في برنامجك ام تكون محفوظه بين حاصرتين واسم هذه البيانات student ، فهنا تكمن فائده التركيب
اذاً اذا سألتك ما الفائده ستقول لي من فوائد التركيب انها ترتب الكود وتسهل الوصول الى البيانات و ما الى ذلك…
لا بد وانه اصبح لديك الفضول لمعرفه كيف يتم كتابه كود هذا الذي يسمونه تركيب (structure) حسناً سأعطيك مثال بسيط كود برمجي كي تكتمل الفكره في رأسك
#include <iostream>
using namespace std;
struct student
{
int id;
string name;
uint age;
};
void main()
{
}
شرح الكود
عرفنا تركيب وذلك بكتابه كلمه struct قبل اسم التركيب وكتبنا داخل التركيب البيانات وعند اغلاق الحاصره نعمل فاصله منقوطه
ملاحظه :نلاحظ اننا عرفنا متغير من نوع uint وهذا النوع هو مثل int الا انه لا يقبل الا القيم الموجبه فقط
الآن وبعد ان عرفنا الكود للتركيب لابد وانك ستسأل نفسك الان وهو خارج داله main كيف سأصل اليه كيف سأستخدمه🤔 ؟
حسناً ساجيب عليك ولكن بعد ان تفهم هذه المعلومه ،هل تعلم ان انواع البيانات التي نستخدمها int , float , char تم بنائها بهذا المفهوم يعني هكذا
struct int
{
مجموعه من البيانات //
};
اذاً فحال التركيب الخاص بنا مثله مثل int نسطيع بدل كتابه int ان نكتب student
مثال :
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
}
هكذا اصبح بيانات الطالب داخل هذا المتغير x (عمره ،ورقم تعريفه، واسمه ) ،
ستقول لي كيف سأصل للعمر مثلاً واجعل عمر الطالب 20 ؟
بكل بساطه 👇
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
x.age =20;
}
في الكود عندما قلنا
x.age
كاننا نقول في x التي يوجد بداخلها بيانات الطالب احظر لي age .
ستقول لي اذا اردت طالب اخر غير هذا الطالب؟ سأقول لك بكل بساطه عرف متغير آخر هكذا 👇
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
x.age =20;
student x1;
x1.age=21;
x1.name="osama";
x1.id=58;
}
وهنا اتضحت لنا الفائده الثانيه وهي اختصار للكود لو كانوا عشره طلاب سنحتاج ان نعرف
uint age ;
int id;
string name;
عشر مرات واسماء مختلفه (شروط تسميه المتغير) لكن بواسطه التركيب اكتفينا بمره ونصل لها بمتغير يمثل الطالب
الى هنا واكتفي في شرح هذا الموضوع اما انت فلا تكتفي وابحث عت امثله وحلول واعمل برامج حتى تتثبت الفكره في ذهنك وآمل ان الفكره وصلت بشكل جيد ومفهوم
واسأل الله ان يكتب الاجر ويوفقنا جميعاً الى ما نريد والسلام عليكم ورحمه الله
اذاً ما هو التركيب ؟ ومافائدته ؟
لاجابه السؤال الاول بشكل بسيط وبدون تعقيد هو كود برمجي يذكر فوق داله main ونكتب اسمه وتكون بياناته بين حاصرتين (بغض النظر عن ما هي بياناته او كيفيه تعريفه نريد الاستيعاب حالياً فقط ).
اما بالنسبه للسؤال الثاني ما فائدته لنفهمها في البدايه كأهم فائده لها تجميع البيانات ،ستقول كيف تجميع البيانات ؟🤔
حسناً لو كان لديك برنامج ويتضمن بيانات طالب ايهما افضل تكون بيانات هذا الطالب( اسمه وعمره وعنوانه ودرجاته ) موزعه في برنامجك ام تكون محفوظه بين حاصرتين واسم هذه البيانات student ، فهنا تكمن فائده التركيب
اذاً اذا سألتك ما الفائده ستقول لي من فوائد التركيب انها ترتب الكود وتسهل الوصول الى البيانات و ما الى ذلك…
لا بد وانه اصبح لديك الفضول لمعرفه كيف يتم كتابه كود هذا الذي يسمونه تركيب (structure) حسناً سأعطيك مثال بسيط كود برمجي كي تكتمل الفكره في رأسك
#include <iostream>
using namespace std;
struct student
{
int id;
string name;
uint age;
};
void main()
{
}
شرح الكود
عرفنا تركيب وذلك بكتابه كلمه struct قبل اسم التركيب وكتبنا داخل التركيب البيانات وعند اغلاق الحاصره نعمل فاصله منقوطه
ملاحظه :نلاحظ اننا عرفنا متغير من نوع uint وهذا النوع هو مثل int الا انه لا يقبل الا القيم الموجبه فقط
الآن وبعد ان عرفنا الكود للتركيب لابد وانك ستسأل نفسك الان وهو خارج داله main كيف سأصل اليه كيف سأستخدمه🤔 ؟
حسناً ساجيب عليك ولكن بعد ان تفهم هذه المعلومه ،هل تعلم ان انواع البيانات التي نستخدمها int , float , char تم بنائها بهذا المفهوم يعني هكذا
struct int
{
مجموعه من البيانات //
};
اذاً فحال التركيب الخاص بنا مثله مثل int نسطيع بدل كتابه int ان نكتب student
مثال :
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
}
هكذا اصبح بيانات الطالب داخل هذا المتغير x (عمره ،ورقم تعريفه، واسمه ) ،
ستقول لي كيف سأصل للعمر مثلاً واجعل عمر الطالب 20 ؟
بكل بساطه 👇
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
x.age =20;
}
في الكود عندما قلنا
x.age
كاننا نقول في x التي يوجد بداخلها بيانات الطالب احظر لي age .
ستقول لي اذا اردت طالب اخر غير هذا الطالب؟ سأقول لك بكل بساطه عرف متغير آخر هكذا 👇
struct student
{
int id;
string name;
uint age;
};
void main()
{
student x;
x.age =20;
student x1;
x1.age=21;
x1.name="osama";
x1.id=58;
}
وهنا اتضحت لنا الفائده الثانيه وهي اختصار للكود لو كانوا عشره طلاب سنحتاج ان نعرف
uint age ;
int id;
string name;
عشر مرات واسماء مختلفه (شروط تسميه المتغير) لكن بواسطه التركيب اكتفينا بمره ونصل لها بمتغير يمثل الطالب
الى هنا واكتفي في شرح هذا الموضوع اما انت فلا تكتفي وابحث عت امثله وحلول واعمل برامج حتى تتثبت الفكره في ذهنك وآمل ان الفكره وصلت بشكل جيد ومفهوم
واسأل الله ان يكتب الاجر ويوفقنا جميعاً الى ما نريد والسلام عليكم ورحمه الله
بسم الله الرحمن الرحيم
في الاول صلوا على محمد
اليوم معانا موضوع مهم وممتع القوائم المترابطه linked list
وكما اعتدنا سنبدأ بفهم ما هي القوائم المترابطه وما فائدتها القوائم المترابطه هي عده مواقع لحفظ قيم بداخلها ستقول لي اذا هي مثل المصفوفه نعم نفس العمل لكن لكل نوع مميزاته وعيوبه لنبدأ بذكر المميزات بمقارنتها مع المصفوفه المصفوفه عند انشائها من الضروري ان تحدد كم تحتاج من عناصر فرضاً اذا عملت برنامج لطلاب فتقدر العدد وتجعل حجمها 100 ولكن مستقبلاً تم اضافه 60 طالب فقط اذاً 40 موقع في الذاكره ستذهب بدون فائده ،اما القوائم فالاضافه اكثر مرونه كل ما احتجت عنصر يتم اضافته اي انها لا تحتاج الى تحديد العناصر .
ايضاً المصفوفه اذا اردت اضافه عنصر الى المنتصف تحدد الموقع ثم تضيف ثم تزيح باقي العناصر والازاحه تاخذ وقت وكذلك الحذف ،اما القوائم المترابطه لا تحتاج الى الازاحه ،اذاً فهذه بعض المميزات لننتقل الى العيوب وهو ان القوائم تاخذ مساحه اكبر بقلييل من المصفوفه ويرجع السبب الى ان القوائم تحتاج لموقع في الذاكره بالاضافه الى مؤشر وسنشرح كيف يتم ذلك هذه هي الفروق .
الان ننتقل لشرح ما هي القوائم المترابطه تكون مجموعه من العناصر مبعثره في الذاكره (اي غير مرتبه في الذاكره كما في المصفوفه ) ستقول لي ما دام وهي مبعثره كيف سنصل اليها ؟ الاجابه ان في كل عنصر من عناصر القائمه مؤشر يؤشر الى القيمه التاليه بمعنى اخر انا سأمسك بالرأس فقط (اول قيمه) واول قيمه ستقول لي القيمه التي تليني هي كذا وانتقل اليها والتي تليها لديها مؤشر ستقول لي القيمه التي تليني هي القيمه كذا وهكذا………
اذا وصلنا الى اخر قيمه ستقول لي القيمه التي تليني null وعندها اعلم اني في نهايه السلسله .
اذاً من الشرح السابق نفهم ان القوائم تتكون من عده عناصر نسمي كل عنصر عقده (node) ، وايضاً نفهم ان كل عقده لديها عنصرين الاول هو الجزء الذي يحتوي على القيمه ،والجزء الثاني يحتوي على المؤشر (اذا كنت لا تعلم ما هي المؤشرات فعليك تعلمها ) .
الان لنرى كيف تكون هذه القوائم برمجياً
سيتم كتابتها بواسطه التراكيب (الدرس السابق ) وهي كالتالي
#include <iostream>
using namespace std;
struct node // العقده
{
int value ; // القيمه
node * next ; // المؤشر للقيمه التاليه
};
int main ()
{
return 0;
}
شرح الكود
عرفنا تركيب واسميناه node
يحتوي على الجزئين الذين ذكرناهما الجزء الاول قيمه من نوع int ، اما القيمه الاخرى من نوع node وهو التركيب الذي انشأناه ،ستقول لي لماذا جعلناه من نوع node ؟بكل بساطه لانه يؤشر الى عقده لو اردنا مثلا ان نأشر الى عدد تم حجزه في الذاكره سنعرف المؤشر من نوع int نفس نوعها
int *p ;
لو اردنا ان نأشر الى حرف سنعرف المؤشر من نوع char
char *p;
وهكذا نعرف ان المؤشر من نفس نوع القيمه التي نريد ان نؤشر اليها
سنكتفي اليوم بهذا القدر البسيط ونكمل في يوم آخر العمليات على القوائم
في الاول صلوا على محمد
اليوم معانا موضوع مهم وممتع القوائم المترابطه linked list
وكما اعتدنا سنبدأ بفهم ما هي القوائم المترابطه وما فائدتها القوائم المترابطه هي عده مواقع لحفظ قيم بداخلها ستقول لي اذا هي مثل المصفوفه نعم نفس العمل لكن لكل نوع مميزاته وعيوبه لنبدأ بذكر المميزات بمقارنتها مع المصفوفه المصفوفه عند انشائها من الضروري ان تحدد كم تحتاج من عناصر فرضاً اذا عملت برنامج لطلاب فتقدر العدد وتجعل حجمها 100 ولكن مستقبلاً تم اضافه 60 طالب فقط اذاً 40 موقع في الذاكره ستذهب بدون فائده ،اما القوائم فالاضافه اكثر مرونه كل ما احتجت عنصر يتم اضافته اي انها لا تحتاج الى تحديد العناصر .
ايضاً المصفوفه اذا اردت اضافه عنصر الى المنتصف تحدد الموقع ثم تضيف ثم تزيح باقي العناصر والازاحه تاخذ وقت وكذلك الحذف ،اما القوائم المترابطه لا تحتاج الى الازاحه ،اذاً فهذه بعض المميزات لننتقل الى العيوب وهو ان القوائم تاخذ مساحه اكبر بقلييل من المصفوفه ويرجع السبب الى ان القوائم تحتاج لموقع في الذاكره بالاضافه الى مؤشر وسنشرح كيف يتم ذلك هذه هي الفروق .
الان ننتقل لشرح ما هي القوائم المترابطه تكون مجموعه من العناصر مبعثره في الذاكره (اي غير مرتبه في الذاكره كما في المصفوفه ) ستقول لي ما دام وهي مبعثره كيف سنصل اليها ؟ الاجابه ان في كل عنصر من عناصر القائمه مؤشر يؤشر الى القيمه التاليه بمعنى اخر انا سأمسك بالرأس فقط (اول قيمه) واول قيمه ستقول لي القيمه التي تليني هي كذا وانتقل اليها والتي تليها لديها مؤشر ستقول لي القيمه التي تليني هي القيمه كذا وهكذا………
اذا وصلنا الى اخر قيمه ستقول لي القيمه التي تليني null وعندها اعلم اني في نهايه السلسله .
اذاً من الشرح السابق نفهم ان القوائم تتكون من عده عناصر نسمي كل عنصر عقده (node) ، وايضاً نفهم ان كل عقده لديها عنصرين الاول هو الجزء الذي يحتوي على القيمه ،والجزء الثاني يحتوي على المؤشر (اذا كنت لا تعلم ما هي المؤشرات فعليك تعلمها ) .
الان لنرى كيف تكون هذه القوائم برمجياً
سيتم كتابتها بواسطه التراكيب (الدرس السابق ) وهي كالتالي
#include <iostream>
using namespace std;
struct node // العقده
{
int value ; // القيمه
node * next ; // المؤشر للقيمه التاليه
};
int main ()
{
return 0;
}
شرح الكود
عرفنا تركيب واسميناه node
يحتوي على الجزئين الذين ذكرناهما الجزء الاول قيمه من نوع int ، اما القيمه الاخرى من نوع node وهو التركيب الذي انشأناه ،ستقول لي لماذا جعلناه من نوع node ؟بكل بساطه لانه يؤشر الى عقده لو اردنا مثلا ان نأشر الى عدد تم حجزه في الذاكره سنعرف المؤشر من نوع int نفس نوعها
int *p ;
لو اردنا ان نأشر الى حرف سنعرف المؤشر من نوع char
char *p;
وهكذا نعرف ان المؤشر من نفس نوع القيمه التي نريد ان نؤشر اليها
سنكتفي اليوم بهذا القدر البسيط ونكمل في يوم آخر العمليات على القوائم
بسم الله الرحمن الرحيم
اليوم سنكمل درسنا في القوائم المترابطه ونشرح كيف اضافه العناصر اليها ،لابد وانك قد سألت نفسك كيف سنضيف البيانات، للاجابه بشكل مختصر فاننا سنضيفها عن طريق داله نستدعيها كلما احتجنا لاضافه عنصر وسنبدأ بالاضافه من اخر السلسله فقط ثم سنبين في درس اخر كيف نضيف من الاماكن الاخرى (البدايه والوسط) .
سنقوم بكتابه الكود
بسم الله الرحمن الرحيم
اليوم سنكمل درسنا في القوائم المترابطه ونشرح كيف اضافه العناصر اليها ،لابد وانك قد سألت نفسك كيف سنضيف البيانات، للاجابه بشكل مختصر فاننا سنضيفها عن طريق داله نستدعيها كلما احتجنا لاضافه عنصر وسنبدأ بالاضافه من اخر السلسله فقط ثم سنبين في درس اخر كيف نضيف من الاماكن الاخرى (البدايه والوسط) .
سنقوم بكتابه الكود
#include <iostream.h>
struct node
{
int value;
node *next;
};
void insert (node *&head , int val)
{
node * temp;// مؤشر للتنقل
node *newnode ;//العقده الجديد
newnode -> value=val;
newnode ->next=NULL;
while ( temp->next!=NULL)
{ //nلكي يمر المؤشر الى اخر السلسله
temp=temp->next ;
}
//l اضافه العقده الجديده الى اخر السلسله
newnode=temp->next;
}
int main()
{
node*head =NULL;
insert (head ,7);
return 0;
}
اي استفسار على الكود في المجموعه
اليوم سنكمل درسنا في القوائم المترابطه ونشرح كيف اضافه العناصر اليها ،لابد وانك قد سألت نفسك كيف سنضيف البيانات، للاجابه بشكل مختصر فاننا سنضيفها عن طريق داله نستدعيها كلما احتجنا لاضافه عنصر وسنبدأ بالاضافه من اخر السلسله فقط ثم سنبين في درس اخر كيف نضيف من الاماكن الاخرى (البدايه والوسط) .
سنقوم بكتابه الكود
بسم الله الرحمن الرحيم
اليوم سنكمل درسنا في القوائم المترابطه ونشرح كيف اضافه العناصر اليها ،لابد وانك قد سألت نفسك كيف سنضيف البيانات، للاجابه بشكل مختصر فاننا سنضيفها عن طريق داله نستدعيها كلما احتجنا لاضافه عنصر وسنبدأ بالاضافه من اخر السلسله فقط ثم سنبين في درس اخر كيف نضيف من الاماكن الاخرى (البدايه والوسط) .
سنقوم بكتابه الكود
#include <iostream.h>
struct node
{
int value;
node *next;
};
void insert (node *&head , int val)
{
node * temp;// مؤشر للتنقل
node *newnode ;//العقده الجديد
newnode -> value=val;
newnode ->next=NULL;
while ( temp->next!=NULL)
{ //nلكي يمر المؤشر الى اخر السلسله
temp=temp->next ;
}
//l اضافه العقده الجديده الى اخر السلسله
newnode=temp->next;
}
int main()
{
node*head =NULL;
insert (head ,7);
return 0;
}
اي استفسار على الكود في المجموعه
void insertAtPos(node*&head, int val, int pos)
{
node* newNode = new node;
newNode->data = val;
newNode->next = NULL;
if (pos == 0)
{
newNode->next = head;
head = newNode;
}
else
{
node*temp = head;
for (int i = 0; i < pos - 1&&temp->next!=NULL; i++)
{
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
}
{
node* newNode = new node;
newNode->data = val;
newNode->next = NULL;
if (pos == 0)
{
newNode->next = head;
head = newNode;
}
else
{
node*temp = head;
for (int i = 0; i < pos - 1&&temp->next!=NULL; i++)
{
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
}
The owner of this channel has been inactive for the last 11 months. If they remain inactive for the next 29 days, they may lose their account and admin rights in this channel. The contents of the channel will remain accessible for all users.
The owner of this channel has been inactive for the last 11 months. If they remain inactive for the next 19 days, they may lose their account and admin rights in this channel. The contents of the channel will remain accessible for all users.