Forwarded from ComputerSince
ملخص مفاهيم :
مقدمة:
كلنا نعرف شنو هي المصفوفة بس كمراجعة تعتبر المصفوفة من اهم الوسائل لتمثيل بيانات وهي اجت لحل مشكلة برمجية وهي تخيل معي اريد اسوي 1000 متغير كلهم من نفس النوع البياني فهذا الشي راح ياخذ 1000 سطر كود وبالتالي راح يكون صعب نتعامل مع المتغيرات الهائلة وصعب جدا نوصللهم حتى نخزن داخلهم قيم وايضا راح ياخذ من عدنا وقت وهذا الشي مو بصالحنا
فما بالك برنامج فيه الاف المتغيرات شلون راح نقلص عددهم بحيث نسوي وعاء او خزان او شكل من خلاله نعبر عن 1000 متغير من نفس النوع في سطر واحد بس
وهنا اجت سالفة المصفوفة وتفرعت الى ان تكون ثنائية وثلاثية والخ من الأبعاد ,
تمام لحد الان؟
ونفس ما كلنا نعرف المصفوفة لها مواقع تبدأ من الموقع الصفري الى حجم المصفوفة - 1
مثال :
فنستنج من هذا الحجي ان المصفوفة :
1- حجمها ثابت
2- تبدأ من الموقع الصفري وتنتهي الى حجم المصفوفة - 1
3 - لا يوجد ترابط بين جميع مواقعها
4 - لكل موقع عنوان في الذاكرة يمكنا الحاسوب الوصول الى الموقع المطلوب منهُ
--------------------------------------
زين شنو ربط Linked list بالمصفوفات ؟
بكل أريحية مو كلنا المصفوفات أجت عن طريقة مشكلة ثم حلوها وسوو شي نسميه بالمصفوفة
نفس الشي ال Linked list او القوائم المترابطة او خلي نسويها العُقد المترابطة
فمشكلة المصفوفة لو ردت اضيف قيمة تصير في وسط مواقع المصوفة راح تكون عملية جدا جدا معقدة ودائما كمبرمج اذهب الى الطرق الأسلك والأبسط لحل المشكلة ليش اعقدها على نفسي من الأخير؟!
فلهذا السبب أجت العقد المترابطة لتسهل علي كمبرمج الأضفة في وسط عقد مترابطة تلاحضون شي شبيه بالمصوفة بس بشكل مختلف , عنها ولكن المبدأ متشابه تقريا تمام!
----------
زين شلون نكدر نصف او نعرف العقد المترابطة؟
فالعقد المترابطة تعتبر مجموعة من الكائنات المتصلة مع بعضها البعض بشكل متوارث ومتسلسل بطريقة مرتبة
وداخل كلاس العقدة هنالكَ متغيرات او أعضاء , فالمتغيرات الموجودة داخل كلاس العقدة راح تكون متغير لتخزين البيانات ومتغير من نفس نوع الكلاس ,
شنو فائدة نسوي متغير من نفس اسم كلاس؟
فائدتها من يكون عندي عُقد من نفس اسم الكلاس هذا الشي راح يخليلي اتنقل من عقدة الى اخرى وبالتالي من كيان الى اخر وهذا يعني ربط العقد من بعضهم البعض
مقدمة:
كلنا نعرف شنو هي المصفوفة بس كمراجعة تعتبر المصفوفة من اهم الوسائل لتمثيل بيانات وهي اجت لحل مشكلة برمجية وهي تخيل معي اريد اسوي 1000 متغير كلهم من نفس النوع البياني فهذا الشي راح ياخذ 1000 سطر كود وبالتالي راح يكون صعب نتعامل مع المتغيرات الهائلة وصعب جدا نوصللهم حتى نخزن داخلهم قيم وايضا راح ياخذ من عدنا وقت وهذا الشي مو بصالحنا
فما بالك برنامج فيه الاف المتغيرات شلون راح نقلص عددهم بحيث نسوي وعاء او خزان او شكل من خلاله نعبر عن 1000 متغير من نفس النوع في سطر واحد بس
وهنا اجت سالفة المصفوفة وتفرعت الى ان تكون ثنائية وثلاثية والخ من الأبعاد ,
تمام لحد الان؟
ونفس ما كلنا نعرف المصفوفة لها مواقع تبدأ من الموقع الصفري الى حجم المصفوفة - 1
مثال :
int Array[] = new int[3]; // 3 - 1 = 2 هاي تعتبر نهاية موقع المصفوفة
Array[0] = new int(10); // 1
Array[1] = new int(20); // 2
Array[2] = new int(30); // 3
فنستنج من هذا الحجي ان المصفوفة :
1- حجمها ثابت
2- تبدأ من الموقع الصفري وتنتهي الى حجم المصفوفة - 1
3 - لا يوجد ترابط بين جميع مواقعها
4 - لكل موقع عنوان في الذاكرة يمكنا الحاسوب الوصول الى الموقع المطلوب منهُ
--------------------------------------
زين شنو ربط Linked list بالمصفوفات ؟
بكل أريحية مو كلنا المصفوفات أجت عن طريقة مشكلة ثم حلوها وسوو شي نسميه بالمصفوفة
نفس الشي ال Linked list او القوائم المترابطة او خلي نسويها العُقد المترابطة
فمشكلة المصفوفة لو ردت اضيف قيمة تصير في وسط مواقع المصوفة راح تكون عملية جدا جدا معقدة ودائما كمبرمج اذهب الى الطرق الأسلك والأبسط لحل المشكلة ليش اعقدها على نفسي من الأخير؟!
فلهذا السبب أجت العقد المترابطة لتسهل علي كمبرمج الأضفة في وسط عقد مترابطة تلاحضون شي شبيه بالمصوفة بس بشكل مختلف , عنها ولكن المبدأ متشابه تقريا تمام!
----------
زين شلون نكدر نصف او نعرف العقد المترابطة؟
فالعقد المترابطة تعتبر مجموعة من الكائنات المتصلة مع بعضها البعض بشكل متوارث ومتسلسل بطريقة مرتبة
وداخل كلاس العقدة هنالكَ متغيرات او أعضاء , فالمتغيرات الموجودة داخل كلاس العقدة راح تكون متغير لتخزين البيانات ومتغير من نفس نوع الكلاس ,
شنو فائدة نسوي متغير من نفس اسم كلاس؟
فائدتها من يكون عندي عُقد من نفس اسم الكلاس هذا الشي راح يخليلي اتنقل من عقدة الى اخرى وبالتالي من كيان الى اخر وهذا يعني ربط العقد من بعضهم البعض
Forwarded from ComputerSince
خلونا نتفق من نسوي متغير من اي نوع بياني فأن له موقع او address في ذاكرة RAM فبتالي انا عندي طريقتين برمجيا من خلالهم اصل الى هذا المتغير
1- عن طريق استدعاء المتغير مباشرتا
مثال:
2- عن طريق الوصول الى المتغير بواسطة الكائن
مثال:
وأيضا لازم نتفق عندي نوعين من المتغيرات من ناحية تخزين :
1- متغير يخزن قيمة
2- متغير يخزن عنوان
—
المتغير الذي يخزن قيمة كلنا نعرف الأنواع البيانية int , float , double , ... تخزن قيم لمتغيراتها
بينما الشيء الجديد متغير يخزن موقع address؟ !
فالمتغير الذي يخزن موقع شلون نسويه؟
نكدر نسويه بعد ما نسوي كلاس ونعطي للكلاس اسم ثم داخل الكلاس نكتب اسم الكلاس ونعطي اسم بهذا الشكل:
تمام اي العنوان الي اكدر اخزن بيها داخل Next ؟
فنكدر نخزن عنون اي قيمة ( لاحظ عنوان وليس القيمة! ) ,
وبالتالي هذا المتغير اكدر اخزن بيه عنوان اي متغير كذالك له عنوان نكدر نوصله من خلاله .
خلاصة هذا الشرح :
كل متغير له عنوان في الذاكرة سواء كان متغير لتخزين القيم او كان متغي لخزين العناوين
1- عن طريق استدعاء المتغير مباشرتا
مثال:
int Number;
Number = 10; // هنا وصلنا الى المتغير عن طريق استدعائه مباشرتا
2- عن طريق الوصول الى المتغير بواسطة الكائن
مثال:
class clClass
{
int Number;
}
public class Main
{
public static void main(String[] args)
{
clClass Object = new clClass();
Object.Number = 10; // هنا وصلنا الى المتغير بواسطة الكائن
}
}
وأيضا لازم نتفق عندي نوعين من المتغيرات من ناحية تخزين :
1- متغير يخزن قيمة
2- متغير يخزن عنوان
—
المتغير الذي يخزن قيمة كلنا نعرف الأنواع البيانية int , float , double , ... تخزن قيم لمتغيراتها
بينما الشيء الجديد متغير يخزن موقع address؟ !
فالمتغير الذي يخزن موقع شلون نسويه؟
نكدر نسويه بعد ما نسوي كلاس ونعطي للكلاس اسم ثم داخل الكلاس نكتب اسم الكلاس ونعطي اسم بهذا الشكل:
class clNode
{
int Data;
clNode Next;
// متغير من نوع اسم الكلاس
}
تمام اي العنوان الي اكدر اخزن بيها داخل Next ؟
فنكدر نخزن عنون اي قيمة ( لاحظ عنوان وليس القيمة! ) ,
وبالتالي هذا المتغير اكدر اخزن بيه عنوان اي متغير كذالك له عنوان نكدر نوصله من خلاله .
خلاصة هذا الشرح :
كل متغير له عنوان في الذاكرة سواء كان متغير لتخزين القيم او كان متغي لخزين العناوين
Forwarded from ComputerSince
ComputerSince
خلونا نتفق من نسوي متغير من اي نوع بياني فأن له موقع او address في ذاكرة RAM فبتالي انا عندي طريقتين برمجيا من خلالهم اصل الى هذا المتغير 1- عن طريق استدعاء المتغير مباشرتا مثال: int Number; Number = 10; // هنا وصلنا الى المتغير عن طريق استدعائه مباشرتا…
فالمتغير ألي يخزن موقع فقط راح نسميه المؤشر او Pointer وضيفته من ياخذ موقع اي متغير ويخزنه داخله فشنو راح يسوي راح يضل يأشر عليه وهذا يعني من خلال المؤشر اكدر اوصل لهذا المتغير المؤَشر عليه وهذا يعني أننا ربطنا المتغير بالمؤشر واصبح لدي شيء اشبه بالسلسلة المترابطة .
فخلاصة المؤشر : هو متغير يخزن عنوان متغير آخر.
فبعد ما تعرفنا على المؤشر توضحت ألنا الصوة من خلاله راح نربط بين العقد المتجاورة سواء كان عندي Single Linked list او Double Linked List
فخلاصة المؤشر : هو متغير يخزن عنوان متغير آخر.
فبعد ما تعرفنا على المؤشر توضحت ألنا الصوة من خلاله راح نربط بين العقد المتجاورة سواء كان عندي Single Linked list او Double Linked List
Forwarded from ComputerSince
أنواع العقد الترابطة :
A- Single
1- Single Linked list
2- Circular Single Linked List
B- Double
1- Duble Linked list
2- Circular Double Linked List
—————————————————
A- Single
1- Single Linked list
2- Circular Single Linked List
B- Double
1- Duble Linked list
2- Circular Double Linked List
—————————————————
Forwarded from ComputerSince
ComputerSince
Photo
A- Single
1- Single Linked list
هذا النوع من العقد المترابطة يتكون من كلاسين , الكلاس الأول نخلي بيه Data من نوع بياني معين ونسوي مؤشر ونسميه Next
كما موضح هنا :
والكلاس الثاني هو راح نسوي كل الشغل عليه كما موضح هنا:
1- Single Linked list
هذا النوع من العقد المترابطة يتكون من كلاسين , الكلاس الأول نخلي بيه Data من نوع بياني معين ونسوي مؤشر ونسميه Next
كما موضح هنا :
class clNode
{
int Data;
clNode Next;
}
والكلاس الثاني هو راح نسوي كل الشغل عليه كما موضح هنا:
class SingleLinkedList
{
}
❤2
Forwarded from ComputerSince
هسه احنه مو عدنا كلاس بيه البيانات والمؤشر فكل ما يدخل المترجم الى هذا الكلاس راح يسويلي عقدة واذا دخل الى نفس الكلاس ستكون المتغيرات تابعة الى عقدة جديدة وهكذا ,
يعني متغيرات العقدة الأولى لاتسواي متغيرات العقدة الثانية
مثال :
خلاصة الكود , اول ما يدخل المترجم الى الكلاس الرئيسي ومن ثم يدخل الى الدالة الرئيسية ومن ثم راح يدخل الى الكيان ni والكيان n1 يمثل العقدة الأولى والكلاس التابع له تحتوي متغيرات تابعه له هو فقط , فبعد ما يطلع من الكلاس راح يدخل الى الكيان n2 ويمثل العقدة الثانية والكلاس التابع له متغيرات جديدة تابعة له فمتغيرات n1 لا تسواي متغيرات n2 .
يعني متغيرات العقدة الأولى لاتسواي متغيرات العقدة الثانية
مثال :
class clNode
{
int Data;
clNode Next;
}
public class Main
{
public static void main(String[] args)
{
clNode n1 = new clNode();
clNode n2 = new clNode;
}
}
خلاصة الكود , اول ما يدخل المترجم الى الكلاس الرئيسي ومن ثم يدخل الى الدالة الرئيسية ومن ثم راح يدخل الى الكيان ni والكيان n1 يمثل العقدة الأولى والكلاس التابع له تحتوي متغيرات تابعه له هو فقط , فبعد ما يطلع من الكلاس راح يدخل الى الكيان n2 ويمثل العقدة الثانية والكلاس التابع له متغيرات جديدة تابعة له فمتغيرات n1 لا تسواي متغيرات n2 .
Forwarded from ComputerSince
ComputerSince
Photo
احد الشغلات الموجودة بكل هيكل متسلسل بأستخدام المؤشرات لربط بين الكائنات او العقد المترابطة هو رأس هذه الكائنات او العقد المترابطة Head فهذا يتعبر مؤشر من خلاله اكدر احدد أول عقدة لتكوين هيكل من العقد المتجاورة و المتسلسلة لازم أبدأ بنقطة بداية فمن خلاله اخلي هذا المؤشر ألي هو Head يأشر على أول عقدة التي تم أنشائها مسبقا اي بمعنى يؤشر على كائن العقدة ( وكائن العقدة له عنوان فبتالي راح يتخزن عنوان كائن العقدة داخل المؤشر Head ) وبالتالي اصبح Head يؤشر على اول عقدة ,
زين هنا يجي سؤال اذا ما خزنا داخل المؤشر موقع هل هناك قيمة أفتراضية وضعوها منشئيي جافا داخل المؤشر؟
فالجواب نعم وهو null
يعني من اسوي كيان واجي اطبع الكيان راح يطبعلي موقع هذا الكيان في الذاكرة
زين هنا يجي سؤال اذا ما خزنا داخل المؤشر موقع هل هناك قيمة أفتراضية وضعوها منشئيي جافا داخل المؤشر؟
فالجواب نعم وهو null
يعني من اسوي كيان واجي اطبع الكيان راح يطبعلي موقع هذا الكيان في الذاكرة
class clClass
{
int Data;
clClass Next;
}
public class Main
{
public static void main(String[] args)
{
clClass Object1 = new clClass();
clClass Object2 = new clClass();
System.out.println("Object1 = " + Object1);
// Output : clClass@6acbcfc0
System.out.println("Object2 = " + Object2);
// Output : clClass@5b480cf9
}
}
❤2
Forwarded from ComputerSince
ComputerSince
احد الشغلات الموجودة بكل هيكل متسلسل بأستخدام المؤشرات لربط بين الكائنات او العقد المترابطة هو رأس هذه الكائنات او العقد المترابطة Head فهذا يتعبر مؤشر من خلاله اكدر احدد أول عقدة لتكوين هيكل من العقد المتجاورة و المتسلسلة لازم أبدأ بنقطة بداية فمن خلاله اخلي…
ولهذا السبب من اخلي Head يأشر على أول كأن فهنا جاي اخذ عنوان هذا الكائن واخزنه داخل Head وبالتالي من اخذ عنوان الكائن واخزنه داخل Head هذا يعني من خلال متغير Head اكدر أعرف ان هذه العقدة هي العقدة الأولى فهنا عرفنه نقطة الأنطلاق للعقد المترابطة وهذا امر كلش مهم نسويه , أحنه نكدر نسوي عقد مترابطة بس المشكلة لو سوينها ما اعرف نقطة بداية العقد لان ما حددناها وهذا الشي يؤدي الى انو ما أكدر أجري عمليات للعقد مثل التنقل و الأضافة و الحذف و الترتيب ايضا فلهذا السبب لازم احدد نقطة البداية والتي هي العقدة الأولى .
Forwarded from ComputerSince
ComputerSince
Photo
هسه نرجع الى هذه الصورة شنو نلاحظ؟
انو عندي 4 كائنات او 4 عقد , لكل كائن قيمة ومؤشر مختلف عن الأخر , وشنو همين نلاحظ انو لكل قيمة هناك عنوان لها , وشنو جاي يصير مؤشر الكائن الأول جاي ياخذ موقر الكائن الثاني ( ربطنا الكائن الأول بالثاني ) , ومؤشر الكائن الثاني جاي ياخذ موقع الكائن الثالث ( ربطنا الكائن الثاني بالثالث ) , ومؤشر الكائن الثالث جاي ياخذ موقع الكائن الرابع (ربطنا مؤشر الكائن الثالث بالكائن الرابع ) , وبما ان مؤشر الكائن الرابع لم نخزن فيه اي موقع فبتالي القيمة التي راح تخزن فيه بشكل افتراضي هي null اي العدم بمعنى لا يؤشر على شيء ( غير مرتبط بأي شيء )
ولا ننسا نحدد نقطة البداية حيث ان الكائن الأول يمثل نقطة البداية لهذا السبب نخلي المؤشر Head يؤشر على الكائن الأول ويأخذ موقع الكائن الأول ويخزنه داخل المتغير Head
أتمنى وصلت الفكرة.
انو عندي 4 كائنات او 4 عقد , لكل كائن قيمة ومؤشر مختلف عن الأخر , وشنو همين نلاحظ انو لكل قيمة هناك عنوان لها , وشنو جاي يصير مؤشر الكائن الأول جاي ياخذ موقر الكائن الثاني ( ربطنا الكائن الأول بالثاني ) , ومؤشر الكائن الثاني جاي ياخذ موقع الكائن الثالث ( ربطنا الكائن الثاني بالثالث ) , ومؤشر الكائن الثالث جاي ياخذ موقع الكائن الرابع (ربطنا مؤشر الكائن الثالث بالكائن الرابع ) , وبما ان مؤشر الكائن الرابع لم نخزن فيه اي موقع فبتالي القيمة التي راح تخزن فيه بشكل افتراضي هي null اي العدم بمعنى لا يؤشر على شيء ( غير مرتبط بأي شيء )
ولا ننسا نحدد نقطة البداية حيث ان الكائن الأول يمثل نقطة البداية لهذا السبب نخلي المؤشر Head يؤشر على الكائن الأول ويأخذ موقع الكائن الأول ويخزنه داخل المتغير Head
أتمنى وصلت الفكرة.
Forwarded from ComputerSince
ComputerSince
A- Single 1- Single Linked list هذا النوع من العقد المترابطة يتكون من كلاسين , الكلاس الأول نخلي بيه Data من نوع بياني معين ونسوي مؤشر ونسميه Next كما موضح هنا : class clNode { int Data; clNode Next; } والكلاس الثاني هو راح نسوي كل الشغل عليه كما موضح…
الان بعدما تعرفنا على هذه المفاهيم واثرها على الكود البرمجي وكيف انشاء هيكلية لكأئنات مترابطة او بمسمى اخر عقد مترابطة لازم نسوي هذه العقد المترابطة في الكود البرمجي :
فنفس ما كلنا نحتاج كلاسين : الكلاس الأول اضع فيه متغيرين الأول من نوع بياني معين والثاني مؤشر
وطريقة انشاء المؤشر هي اسم الكلاس + اعطاء اسم لهذا المتغير من نوع الكلاس .
ومسموح نخزن داخل هذا المتغير فقط موقع (نخزن موقع كائن العقدة التالية) ,
واذا خزنه داخل هذا المؤشر موقع فبتالي اصبح المؤشر يؤشر على العقدة الجديدة واصبح متصل ومترابط بها , وبهذه الطريقة يمكننا ان نصل الى هذه العقدة عن طريق هذا المؤشر .
والكلاس الثاني نضع داخله Head ويجب ان يكون من نفس نوع المؤشر الموجود في الكلاس الأول لتسنى لنا ربط اول عقدة بالHead
وبالكلاس الثاني راح نسوي دوال وهنا لبة الموضوع :
اهم دالة لازم نسويها هي
دالة انشاء عقدة متسلسلة وراح تكون الدالة من نوع void وسبب انو void لان ما عندي شي ارجعه لان راح يكون اكثر تعاملي مع المؤشرات لكل عقدة وكيف ربطهم مع بعض :
الكلاس الأول :
الكلاس الثاني :
- لاحظ Head صاير بنفس اسم الكلاس العقد clNode فبتالي Head مو اتفقنا يعتبر مؤشر , وبما انو هو من نفس نوع الكلاس يعني من الاخير كائن واحنه اتفقنى في شرح البرمجة الكيانية , الكائن يكدر يوصل لأي متغير موجود داخل الكلاس التابع له الكائن عن طريق ( . ) Head.Data , Head.Next , فخلاصة الحجي اي كائن اسويه من نفس اسم الكلاس فهذا الكائن يكدر يوصل الى المتغيرات الموجودة داخل الكلاس التابع له الكائن ,
فنفس ما كلنا نحتاج كلاسين : الكلاس الأول اضع فيه متغيرين الأول من نوع بياني معين والثاني مؤشر
وطريقة انشاء المؤشر هي اسم الكلاس + اعطاء اسم لهذا المتغير من نوع الكلاس .
ومسموح نخزن داخل هذا المتغير فقط موقع (نخزن موقع كائن العقدة التالية) ,
واذا خزنه داخل هذا المؤشر موقع فبتالي اصبح المؤشر يؤشر على العقدة الجديدة واصبح متصل ومترابط بها , وبهذه الطريقة يمكننا ان نصل الى هذه العقدة عن طريق هذا المؤشر .
والكلاس الثاني نضع داخله Head ويجب ان يكون من نفس نوع المؤشر الموجود في الكلاس الأول لتسنى لنا ربط اول عقدة بالHead
وبالكلاس الثاني راح نسوي دوال وهنا لبة الموضوع :
اهم دالة لازم نسويها هي
دالة انشاء عقدة متسلسلة وراح تكون الدالة من نوع void وسبب انو void لان ما عندي شي ارجعه لان راح يكون اكثر تعاملي مع المؤشرات لكل عقدة وكيف ربطهم مع بعض :
الكلاس الأول :
class clNode
{
int Data;
clNode Next;
}
الكلاس الثاني :
class SingleLinledList
{
clNode Head;
public void add(int DataFromMain)
{
clNode n = new clNode();
n.Data = DataFromMain;
if(Head == null)
{
Head = n;
//System.out.println("Head Address: " + Head);
//System.out.println("Node Address: " + n);
// اخذنا عنوان أول عقدة وخزناها في Head
}
else
{
clNode P = Head;
while (P.Next != null)
{
P = P.Next;
}
P.Next = n;
//System.out.println(P.Next);
}
}
- لاحظ Head صاير بنفس اسم الكلاس العقد clNode فبتالي Head مو اتفقنا يعتبر مؤشر , وبما انو هو من نفس نوع الكلاس يعني من الاخير كائن واحنه اتفقنى في شرح البرمجة الكيانية , الكائن يكدر يوصل لأي متغير موجود داخل الكلاس التابع له الكائن عن طريق ( . ) Head.Data , Head.Next , فخلاصة الحجي اي كائن اسويه من نفس اسم الكلاس فهذا الكائن يكدر يوصل الى المتغيرات الموجودة داخل الكلاس التابع له الكائن ,
Forwarded from ComputerSince
ComputerSince
الان بعدما تعرفنا على هذه المفاهيم واثرها على الكود البرمجي وكيف انشاء هيكلية لكأئنات مترابطة او بمسمى اخر عقد مترابطة لازم نسوي هذه العقد المترابطة في الكود البرمجي : فنفس ما كلنا نحتاج كلاسين : الكلاس الأول اضع فيه متغيرين الأول من نوع بياني معين والثاني…
الكلاس الأخير هو الكلاس الرئيسي وفي الدالة الرئيسية راح نرسل البينات الى public void add(int DataFromMain)
شلون؟
بكل بساطة لازم نسوي كائن تابع الى كلاس SingleLinledList وهذا يعني ان هذا الكائن يكدر يوصل الى متغيرات الكلاس ( Memebr and Data Memebr ) ألي هو هنا Head
وايضا يكدر يوصل الى دوال هذا الكلاس ومن الدالة الرئيسية نرسل وسائط الى الدالة المجودة في الكلاس عن طريق الكائن بهذا الشكل :
فنفس ما نعرف اول ما يجي المترجي يبدي من الكلاس الرئيسي ثم يدخل الى الدالة الرئيسية ومن ثم راح يكله هذا السطر :
SingleLinledList SLL = new SingleLinledList(); ونعرف هذا السطر معناه سويلي كائن تابع الى الكلاس
فراح يدخل الى الكلاس SingleLinledList يقراء الموجود داخل الكلاس راح يلكه عندي Head وراح يلكه عندي دالة أسمها add من نوع void بس ما راح يدخل للدالة تمام؟
فبعد ما يطلع من الكلاس ويرجع الى الدالة الرئيسية وتحديدا هذا السطر SingleLinledList SLL = new SingleLinledList();
فراح SLL ألي هو الكائن مالتنا صار وعاء داخله المتغيرات والدوال الموجودة في الكلاس التابع للكائن , فبتالي صار من عمامه 😂 , فيكدر يوصللهم عن طريق ( . )
بمعنى SLL.Head , وايضا SLL.add(1)
الان بعدما كتبنا SLL.add(1) هذا يعني جاي نأمر الحاسوب بأن يدخل الى كلاس الكائن ألي هو SingleLinledList ثم روح الى اسم الدالة الموجودة في هذا الكلاس وبما ان هذه الدالة تستقبل معالم فأحنه راح نرسل القيمة كوسائط argumts الى معالم دالة add ألي مسمينها هنا DataFromMain تمام؟
زين شنو فكرة أني ارسل القيمة الى معالم دالة add ؟
بكل بساطة حتة من اسوي عقدة اخزن في بينات هذه العقدة البينات الي رسلتها من الدالة الرئيسية الى دالة add الموجودة في كلاس SingleLinledList .
شلون؟
بكل بساطة لازم نسوي كائن تابع الى كلاس SingleLinledList وهذا يعني ان هذا الكائن يكدر يوصل الى متغيرات الكلاس ( Memebr and Data Memebr ) ألي هو هنا Head
وايضا يكدر يوصل الى دوال هذا الكلاس ومن الدالة الرئيسية نرسل وسائط الى الدالة المجودة في الكلاس عن طريق الكائن بهذا الشكل :
public class Main
{
public static void main(String[] args)
{
SingleLinledList SLL = new SingleLinledList();
SLL.add(1);
SLL.add(2);
SLL.add(3);
SLL.add(4);
SLL.add(5);
}
}
فنفس ما نعرف اول ما يجي المترجي يبدي من الكلاس الرئيسي ثم يدخل الى الدالة الرئيسية ومن ثم راح يكله هذا السطر :
SingleLinledList SLL = new SingleLinledList(); ونعرف هذا السطر معناه سويلي كائن تابع الى الكلاس
فراح يدخل الى الكلاس SingleLinledList يقراء الموجود داخل الكلاس راح يلكه عندي Head وراح يلكه عندي دالة أسمها add من نوع void بس ما راح يدخل للدالة تمام؟
فبعد ما يطلع من الكلاس ويرجع الى الدالة الرئيسية وتحديدا هذا السطر SingleLinledList SLL = new SingleLinledList();
فراح SLL ألي هو الكائن مالتنا صار وعاء داخله المتغيرات والدوال الموجودة في الكلاس التابع للكائن , فبتالي صار من عمامه 😂 , فيكدر يوصللهم عن طريق ( . )
بمعنى SLL.Head , وايضا SLL.add(1)
الان بعدما كتبنا SLL.add(1) هذا يعني جاي نأمر الحاسوب بأن يدخل الى كلاس الكائن ألي هو SingleLinledList ثم روح الى اسم الدالة الموجودة في هذا الكلاس وبما ان هذه الدالة تستقبل معالم فأحنه راح نرسل القيمة كوسائط argumts الى معالم دالة add ألي مسمينها هنا DataFromMain تمام؟
زين شنو فكرة أني ارسل القيمة الى معالم دالة add ؟
بكل بساطة حتة من اسوي عقدة اخزن في بينات هذه العقدة البينات الي رسلتها من الدالة الرئيسية الى دالة add الموجودة في كلاس SingleLinledList .
Forwarded from ComputerSince
ComputerSince
الان بعدما تعرفنا على هذه المفاهيم واثرها على الكود البرمجي وكيف انشاء هيكلية لكأئنات مترابطة او بمسمى اخر عقد مترابطة لازم نسوي هذه العقد المترابطة في الكود البرمجي : فنفس ما كلنا نحتاج كلاسين : الكلاس الأول اضع فيه متغيرين الأول من نوع بياني معين والثاني…
الأن بعدما سوينا دالة add وهذه الدالة استقبلت في معالمها القيمة 1 شلون اسوي عقدة واخزن داخل بينات العقدة القيمة 1 ؟
فأحنه مو كلنا العقدة هي كائن؟
خلاص نسوي كائن ونعطيه اسم ولازم يكون من نفس كلاس العقدة بهذا الشكل :
شلون نخزن القيمة 1 داخل بيانات العقدة؟
أحنه مو كلنا الكائن يكدر يوصل للمتغيرات الموجودة داخل كلاس التابع للكائن وعن طريق ( . )
فراح نكول
فهنا الكائن n (n اختصار لكلمة Node) , وصل الى المتغير Data ثم اسندنا الى هذا المتغير القيمة 1 الموجودة في DataFromMain .
تمام ,,
أحنه مو كلنا ان Head لازم يأشر على اول عقدة ونفس ما كدامنا هاي تعتبر ول عقدة , فشلون اعرف انو Head ما مأشر على أول عقدة؟
فلازم اسوي شرط اسئل في هذا الشرط , هل أن Head بعدة ما مأشر على أول عقدة؟
زين شلون نعرف انو Head بعده ما مأشر ؟
فأذا كان Head بعدة ما مأشر يعني Heaad = null بشكل افتراضي ,
فنشي نسأل هل ان Head == null يعني هل Head يسواي null ( بعدة ما مأشر على عقدة ألي هي الأولى ) ,
فالجواب نعم لهذا السبب راح يدخل الى الشرط وداخل الشرط راح اسند n الى Head ونفس ما عرفنا n لها عنوان فبتالي خزنه عنوان العقدة الاولى في Head وأصبح الأن Head يؤشر على أول عقدة .
فأحنه مو كلنا العقدة هي كائن؟
خلاص نسوي كائن ونعطيه اسم ولازم يكون من نفس كلاس العقدة بهذا الشكل :
clNode n = new clNode();
شلون نخزن القيمة 1 داخل بيانات العقدة؟
أحنه مو كلنا الكائن يكدر يوصل للمتغيرات الموجودة داخل كلاس التابع للكائن وعن طريق ( . )
فراح نكول
n.Data = DataFromMain;
فهنا الكائن n (n اختصار لكلمة Node) , وصل الى المتغير Data ثم اسندنا الى هذا المتغير القيمة 1 الموجودة في DataFromMain .
تمام ,,
أحنه مو كلنا ان Head لازم يأشر على اول عقدة ونفس ما كدامنا هاي تعتبر ول عقدة , فشلون اعرف انو Head ما مأشر على أول عقدة؟
فلازم اسوي شرط اسئل في هذا الشرط , هل أن Head بعدة ما مأشر على أول عقدة؟
زين شلون نعرف انو Head بعده ما مأشر ؟
فأذا كان Head بعدة ما مأشر يعني Heaad = null بشكل افتراضي ,
فنشي نسأل هل ان Head == null يعني هل Head يسواي null ( بعدة ما مأشر على عقدة ألي هي الأولى ) ,
فالجواب نعم لهذا السبب راح يدخل الى الشرط وداخل الشرط راح اسند n الى Head ونفس ما عرفنا n لها عنوان فبتالي خزنه عنوان العقدة الاولى في Head وأصبح الأن Head يؤشر على أول عقدة .
clNode n = new clNode();
n.Data = DataFromMain;
if(Head == null)
{
//System.out.println("Head Address: " + Head);
//System.out.println("Node Address: " + n);
Head = n;
//System.out.println("Head Address = Node Address: " + Head);
// اخذنا عنوان أول عقدة وخزناها في Head
}
Forwarded from ComputerSince
فتبالي نستنتج عدنا فائدتين لـ Head :
1- ربط العقدة الأولى حتى اعرف بداية العقد
2- معرفة هل عندي عدقة ثانية او ثالث ...
شلون عرفة هل عندي عدقة ثانية او ثالث ... ؟
أحنه مو كلنا Head اذا ما مأشر فهو null , زين اذا دخلنا الى دالة add وخزنه في DataFromMain القيمة 2 , وسوينه عقدة جديدة بنفس اسم كائن العقدة السابقة وبنفس الكلاس التابع للعقدة السابقة , فهذا يعني سوينا عقدة جديدة لها كلاس خاص بيها ومتغيرات خاصة بيها تخلف عن العقدة السابقة ,
فلهذا السبب من ندل مرة ثانية الى دالة add ونتحقق هل ان Head مأشر ام لا , فاذا اي مأشر فراح يدخل المترجم الى else لان الشرط ما تحقق ,
هنا تكمن فكرة جميلة .
هم خلي نتفق :
من نسوي كأنين لهم نفس الأسم بالحقيقة صح أنا جاي اشوف أنو ألهم نفس الأسم ولكن أثنيناتهم ألهم عناوين مختلفه :
تلاحظون من ندخل الى دالة ShowAddress ثم نعرف كائن من نوع العقدة ونطبع هذا الكائن ثم نرجع ندخل ونطبع والخ ... فراح نحصل عناوين مختلفه فبتالي عندي كائنات مختلفه بنفس الأسم ولكن هم مختلفات بالحقيقة بالعنوان واذا مختلفات بالعنوان خلاص مباشرتا راح نعتبرهم مختلفات بس راح تصير عندي ميزة في هذه الحالة اذا كانوا لدينا كائنات بنفس المسمى ولكن مختلفات بالموقع فأكدر اتنقل بين كل موقع واخر عن طريق مؤشر Next الموجود داخل كل كائن او بحالتنا هي العقدة . فلهذا السبب ومن خلال هذه الميزة كدرنا نحقق فكرة التنقل من عقدة الى اخرى .
1- ربط العقدة الأولى حتى اعرف بداية العقد
2- معرفة هل عندي عدقة ثانية او ثالث ...
شلون عرفة هل عندي عدقة ثانية او ثالث ... ؟
أحنه مو كلنا Head اذا ما مأشر فهو null , زين اذا دخلنا الى دالة add وخزنه في DataFromMain القيمة 2 , وسوينه عقدة جديدة بنفس اسم كائن العقدة السابقة وبنفس الكلاس التابع للعقدة السابقة , فهذا يعني سوينا عقدة جديدة لها كلاس خاص بيها ومتغيرات خاصة بيها تخلف عن العقدة السابقة ,
فلهذا السبب من ندل مرة ثانية الى دالة add ونتحقق هل ان Head مأشر ام لا , فاذا اي مأشر فراح يدخل المترجم الى else لان الشرط ما تحقق ,
هنا تكمن فكرة جميلة .
هم خلي نتفق :
من نسوي كأنين لهم نفس الأسم بالحقيقة صح أنا جاي اشوف أنو ألهم نفس الأسم ولكن أثنيناتهم ألهم عناوين مختلفه :
class clNode
{
int Data;
clNode Next;
}
class SingleLinledList
{
public void ShowAddress()
{
clNode n = new clNode();
System.out.println(n);
}
}
public class Main
{
public static void main(String[] args)
{
SingleLinledList SLL = new SingleLinledList();
SLL.ShowAddress(); // n = clNode@5f184fc6
SLL.ShowAddress(); // n = clNode@3feba861
SLL.ShowAddress(); // n = clNode@5b480cf9
SLL.ShowAddress(); // n = clNode@6f496d9f
}
}
تلاحظون من ندخل الى دالة ShowAddress ثم نعرف كائن من نوع العقدة ونطبع هذا الكائن ثم نرجع ندخل ونطبع والخ ... فراح نحصل عناوين مختلفه فبتالي عندي كائنات مختلفه بنفس الأسم ولكن هم مختلفات بالحقيقة بالعنوان واذا مختلفات بالعنوان خلاص مباشرتا راح نعتبرهم مختلفات بس راح تصير عندي ميزة في هذه الحالة اذا كانوا لدينا كائنات بنفس المسمى ولكن مختلفات بالموقع فأكدر اتنقل بين كل موقع واخر عن طريق مؤشر Next الموجود داخل كل كائن او بحالتنا هي العقدة . فلهذا السبب ومن خلال هذه الميزة كدرنا نحقق فكرة التنقل من عقدة الى اخرى .
Forwarded from ComputerSince
ComputerSince
الأن بعدما سوينا دالة add وهذه الدالة استقبلت في معالمها القيمة 1 شلون اسوي عقدة واخزن داخل بينات العقدة القيمة 1 ؟ فأحنه مو كلنا العقدة هي كائن؟ خلاص نسوي كائن ونعطيه اسم ولازم يكون من نفس كلاس العقدة بهذا الشكل : clNode n = new clNode(); شلون نخزن القيمة…
نرجع الى الكود مالتنا كلنا من نرسل القيمة 2 راح تستقبلها كذالك DataFromMain ومن ثم راح نسوي كيان عقدة جديد نسند الى Data هذه العقدة الجديدة الـ DataFromMain بهذا الشكل:
ومن ثم نتحقق هل ان Head جاي يأشر على أول عقدة؟ الجواب نعم وهذا يعني ان Head لا يساوي null فما راح يتحقق الشرط وهذا يعني ان المترجم راح يروح الى else .
زين شنو فائدة أني سويت if and else من الأساس؟
لان حتى اعرف هل ان Head يأشر على العقدة الأولى واذا ما جاي يأشر فأخليه يأشر وما راح يروح المترجم الى else واذا دخلت مرة ثانية الى دالة add فراح المترجم يروح الى else هنا راح اشتغل على ربط العقد مع بعضهم البعض , ( جاي اتفصل حتى توصل الصورة بكل تفاصيلها ) تمام ,
فنفس ما كلنا هنا راح المترجم يدخل الى else عندما نرسل قيمة 2 او 3 او 4 والخ...
فبحالتنا رسلنا القيمة 2 فراح يدخل الى else لان Head جاي يأشر على العقدة الأولى , والقيمة 2 احنه خزناها في Data العقدة الثانية ( n.Data = DataFromMain )
فهسه بالأساس عندي عقدتين الاولى مأشر عليها Head والثانية ما مرتبطة مع العقدة الأولى؟
فشلون أخلي العقدة الألوى ترتبط بالعقدة الثانية؟
بكل بساطة أحنه مو كلنا نكدر نستفاد من المؤشرات لربط الكائنات؟ او العقد حسب الهيكلية هنا! مو؟
فأسوي مؤشر من نوع كائن العقدة وأخليه يأشر على أول عقدة , واذا جاي يأشر على أول عقدة فبتالي يكدر يوصل الى Data و Next أول عقدة
وأحنه نعرف اذا كلنه المؤشر.Nest معناتها وصل لـ Next هذه العقدة فهنا أجي اربط العقدة الأولى مع الثانية :
خلاصة هذا الحجي :
اذا ردنا نربط بين العقد لازم نسوي مؤشر أخليه يأشر أول عقدة , وبما أن Head جاي يأشر على أول عقدة وهو ماخذ عنوان أول عقدة اذا وضعت هذا العنوان في هذا المؤشر فسوف يضل يأشر على أول عقدة .
سميته P بمعنى pointer مؤشر ,
هسه تخيل وياي عندي 4 عقد مترابطات وردت اضيف عقدة جديدة , فشنو لازم اسوي؟
فلازم نسير من أول عقدة الى أن يصل المؤشر الى العقدة رقم 4 ثم نربط العقدة رقم 4 بالقدة الجديدة .
شلون راح نسويها ؟
فحته نصل الى العقدة رقم 4 لازم نتحقق في كل مرة وصلنا لأخر عقدة لو لا؟
اذا لا راح ازيح المؤشر ليؤشر على العقدة التالية عن طريق P = P.Next
يعني أدور على Next عقدة معينه اذا ما مأشرة على عقدة فمعناتها اطلع من while فهنا بدوري كمبرمج اجي اربط هذه العقدة والتي ستمثل اخر عقدة بالعقدة الجديدة .
clNode n = new clNode();
n.Data = DataFromMain;
ومن ثم نتحقق هل ان Head جاي يأشر على أول عقدة؟ الجواب نعم وهذا يعني ان Head لا يساوي null فما راح يتحقق الشرط وهذا يعني ان المترجم راح يروح الى else .
زين شنو فائدة أني سويت if and else من الأساس؟
لان حتى اعرف هل ان Head يأشر على العقدة الأولى واذا ما جاي يأشر فأخليه يأشر وما راح يروح المترجم الى else واذا دخلت مرة ثانية الى دالة add فراح المترجم يروح الى else هنا راح اشتغل على ربط العقد مع بعضهم البعض , ( جاي اتفصل حتى توصل الصورة بكل تفاصيلها ) تمام ,
فنفس ما كلنا هنا راح المترجم يدخل الى else عندما نرسل قيمة 2 او 3 او 4 والخ...
فبحالتنا رسلنا القيمة 2 فراح يدخل الى else لان Head جاي يأشر على العقدة الأولى , والقيمة 2 احنه خزناها في Data العقدة الثانية ( n.Data = DataFromMain )
فهسه بالأساس عندي عقدتين الاولى مأشر عليها Head والثانية ما مرتبطة مع العقدة الأولى؟
فشلون أخلي العقدة الألوى ترتبط بالعقدة الثانية؟
بكل بساطة أحنه مو كلنا نكدر نستفاد من المؤشرات لربط الكائنات؟ او العقد حسب الهيكلية هنا! مو؟
فأسوي مؤشر من نوع كائن العقدة وأخليه يأشر على أول عقدة , واذا جاي يأشر على أول عقدة فبتالي يكدر يوصل الى Data و Next أول عقدة
وأحنه نعرف اذا كلنه المؤشر.Nest معناتها وصل لـ Next هذه العقدة فهنا أجي اربط العقدة الأولى مع الثانية :
خلاصة هذا الحجي :
اذا ردنا نربط بين العقد لازم نسوي مؤشر أخليه يأشر أول عقدة , وبما أن Head جاي يأشر على أول عقدة وهو ماخذ عنوان أول عقدة اذا وضعت هذا العنوان في هذا المؤشر فسوف يضل يأشر على أول عقدة .
clNode P = Head;
سميته P بمعنى pointer مؤشر ,
هسه تخيل وياي عندي 4 عقد مترابطات وردت اضيف عقدة جديدة , فشنو لازم اسوي؟
فلازم نسير من أول عقدة الى أن يصل المؤشر الى العقدة رقم 4 ثم نربط العقدة رقم 4 بالقدة الجديدة .
شلون راح نسويها ؟
clNode P = Head;
while (P.Next != null) {
P = P.Next;
}
P.Next = n;
فحته نصل الى العقدة رقم 4 لازم نتحقق في كل مرة وصلنا لأخر عقدة لو لا؟
اذا لا راح ازيح المؤشر ليؤشر على العقدة التالية عن طريق P = P.Next
يعني أدور على Next عقدة معينه اذا ما مأشرة على عقدة فمعناتها اطلع من while فهنا بدوري كمبرمج اجي اربط هذه العقدة والتي ستمثل اخر عقدة بالعقدة الجديدة .
🔥6👍1
كل عام وأنتم مجتهدون ومبدعون، في سعيكم لتحقيق طموحاتكم وأحلامكم. اجعلوا هذا العام مليئًا بالعلم ، وكونوا دائمًا في مقدمة الركب في عالم التكنولوجيا والابتكار.
نتمنى لكم عامًا مليئًا بالنجاح، والاستفادة من كل الفرص التي تأتي، وأن تكونوا مصدر إلهامٍ لبعضكم البعض لتحقيق الأهداف الكبيرة. بالتوفيق للجميع في رحلتكم الأكاديمية. كل عام وأنتم بخير!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> hmd </title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
font-family: Arial, sans-serif;
background-color: red;
}
.greeting {
text-align: center;
font-size: 24px;
color: rgb(255, 255, 255);
}
</style>
</head>
<body>
<div class="greeting">
<h1>Happy New Year!</h1>
<p>أعاده الله عليكم بالخير والسعادة</p>
<P>
<del> 2024</del><in>
2025
</in>
</P>
</div>
</body>
</html>
❤🔥4❤1
أسأل الله أن تكون سنة 2025 سنة خير وبركة ونجاح لكم جميعا وأن تتحقق فيها طموحاتكم وأحلامكم , ونسأل الله أن يفرّج لإخواننا في غزة وكل المستضعفين حول العالم كربهم ويقويهم على محنتهم، ويرحم شهداءهم، ويجعل لهم من كل ضيقٍ مخرجا
❤12
﴿ إِن يَنصُرْكُمُ اللَّهُ فَلَا غَالِبَ لَكُمْ﴾ 🫡
هذني قناتين شارحين بيهن المادة
1- https://www.youtube.com/playlist?list=PLRoJxQKsQroGSEJE8-kM-Zcst8T43-24T
2- https://www.youtube.com/playlist?list=PLuWsecc4XabcL3uVNMDKp1uUphXDahOYB
هذني قناتين شارحين بيهن المادة
1- https://www.youtube.com/playlist?list=PLRoJxQKsQroGSEJE8-kM-Zcst8T43-24T
2- https://www.youtube.com/playlist?list=PLuWsecc4XabcL3uVNMDKp1uUphXDahOYB
YouTube
جافا المستوى 1
شرح البرمجة بأستخدام جافا لمادة الكورس الأول المرحلة 2 ( علوم الحاسوب )
اعلان ⭐️
كورس برمجه ل احد الطلبه المتميزين
📢 دورة البرمجة الكائنية المستوى
(OOP LEVEL 2)
⭐️ لمن هذه الدورة؟
لكل من أكمل كورس OOP1، ولكل من يريد استكمال مفاهيم البرمجة الكائنية المتقدمة، سواء بلغة جافا أو لطلاب الجامعات.
⭐️ مميزات الدورة:
⭐️ شرح بسيط وتطبيقي – بعيد عن التعقيد، بأسلوب سهل وعملي.
⭐️ التعلم بالممارسة – كل مفهوم ستفهمه فورًا.
⭐️ فهم عميق وليس مجرد حفظ – مما يمكنك من تطبيقها بسهولة.
⭐️ مواضيع الدورة:
التغليف (Encapsulation)
الوراثة (Inheritance)
تعدد الأشكال (Polymorphism)
التجريد (Abstraction)
الواجهات (Interfaces)
الفئات المجردة (Abstract Classes)
التكوين (Composition)
الأنماط التصميمية (Design Patterns)
✈️ ✅ الضمانات:
💡 جرب قبل أن تدفع! اشترك في الحلقات التجريبية مجانًا، وإذا أعجبك الأسلوب، يمكنك الدفع.
💡 استرجاع المبلغ بالكامل في حال واجهتك أي مشاكل تقنية تمنعك من الاستفادة من الدورة.
🔹 💰 العروض والخصومات:
⭐️ خصم خاص لأول 3 مشتركين!
⭐️ خصم عند التسجيل مع صديق! احصل على خصم عند اشتراكك مع صديقك.
⭐️ خصم أكبر عند اشتراك 3 أصدقاء معًا! استفد من عرض خاص عند التسجيل كمجموعة.
للتواصل والاستفسار:
🔹 تيليغرام:
@prodesign9
👩🚀 احجز مقعدك الآن واستفد من العروض قبل نفادها!
كورس برمجه ل احد الطلبه المتميزين
(OOP LEVEL 2)
لكل من أكمل كورس OOP1، ولكل من يريد استكمال مفاهيم البرمجة الكائنية المتقدمة، سواء بلغة جافا أو لطلاب الجامعات.
التغليف (Encapsulation)
الوراثة (Inheritance)
تعدد الأشكال (Polymorphism)
التجريد (Abstraction)
الواجهات (Interfaces)
الفئات المجردة (Abstract Classes)
التكوين (Composition)
الأنماط التصميمية (Design Patterns)
للتواصل والاستفسار:
@prodesign9
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4