Ail Ahmed نشر 21 مارس أرسل تقرير نشر 21 مارس السلام عليكم انا طبق علي علي هياكل البيانات linked list بلغه سي في كورس CS50 وكان الموضوع صعب شوي هل كمان صعب في لغة الباثيون فا انا كانت عاوز اعارف اي الخطوات المفروض انا امشي عليها بس لو سمحتو من غير كتابت كود انا عاوز اعارف اي الخطوات المفروض انا امشي عليها 1 اقتباس
0 Mustafa Suleiman نشر 21 مارس أرسل تقرير نشر 21 مارس لغة C صعبة بالطبع ولا أنصحك بها كبداية ولا حتى C++، لا مشكلة في تجربة التعلم من خلالهم، لكن في حال وجدت صعوبة بعدما حاولت بحيث تصيبك بالإحباط، فانتقل إلى لغة بايثون حيث يوجد C50 من خلال لغة بايثون ابحث عن CS50 PYTHON على اليوتيوب. والفكرة أنّ بايثون وجافاسكريبت مثلاً لغات سهلة وعالية المستوى (أي بها تجريد كثير للأمور التي تحدث في الخلفية أي تخفيها عنك) وبايثون أسهل، الأمر الذي يساعدك على تعلم المفاهيم البرمجية دونّ إضافة عبء صعوبة تعلم اللغة البرمجية نفسها. ودائمًا ستجد أن يتم النُصح بالبدء بلغة قوية مثل C++ لكن النصيحة بدون معرفة الشخص نفسه وخبراته أمر غير صحيح، فالبعض يناسبهم ذلك والبعض لا يناسبهم وقد يضرهم ذلك، وبعد تعلم اللغة البرمجية الأولى من خلال لغة سهلة واستيعاب المفاهيم البرمجية ستجد أنّ تعلم c++ أصبح أسهل. 1 اقتباس
0 Ail Ahmed نشر 21 مارس الكاتب أرسل تقرير نشر 21 مارس بتاريخ 1 دقيقة مضت قال Mustafa Suleiman: لغة C صعبة بالطبع ولا أنصحك بها كبداية ولا حتى C++، لا مشكلة في تجربة التعلم من خلالهم، لكن في حال وجدت صعوبة بعدما حاولت بحيث تصيبك بالإحباط، فانتقل إلى لغة بايثون حيث يوجد C50 من خلال لغة بايثون ابحث عن CS50 PYTHON على اليوتيوب. والفكرة أنّ بايثون وجافاسكريبت مثلاً لغات سهلة وعالية المستوى (أي بها تجريد كثير للأمور التي تحدث في الخلفية أي تخفيها عنك) وبايثون أسهل، الأمر الذي يساعدك على تعلم المفاهيم البرمجية دونّ إضافة عبء صعوبة تعلم اللغة البرمجية نفسها. ودائمًا ستجد أن يتم النُصح بالبدء بلغة قوية مثل C++ لكن النصيحة بدون معرفة الشخص نفسه وخبراته أمر غير صحيح، فالبعض يناسبهم ذلك والبعض لا يناسبهم وقد يضرهم ذلك، وبعد تعلم اللغة البرمجية الأولى من خلال لغة سهلة واستيعاب المفاهيم البرمجية ستجد أنّ تعلم c++ أصبح أسهل. تمام جدا بس انا كانت عاوز اي اي الخطوات المفروض امشي عليها عشان اعمل Linked List في باثيون الخطوات فقط من غير كاتب الكود 2 اقتباس
0 حمزة عباد نشر 21 مارس أرسل تقرير نشر 21 مارس بتاريخ 2 ساعة قال Ail Ahmed: بس انا كانت عاوز اي اي الخطوات المفروض امشي عليها عشان اعمل Linked List في باثيون لغة بايثون مختلفة عن لغة C في هذه الجزئية، لأن C فيها مفاهيم الهياكل (structs) والمؤشّرات (pointers)، وهذه هي اللبنات الأساسية لإنشاء القوائم المترابطة (Linked lists). أمّا في بايثون، فيمكننا إنشاء شيء شبيه بالقوائم المترابطة عن طريق استخدام القواميس (dictionaries) كبديل عن الهياكل، ونقوم بعمليات الإسناد المباشر عوضا عن استخدام المؤشرات لأن المؤشرات غير موجودة في بايثون، لكن عملية الإسناد تحفظ إشارة نحو العنصر، وهذا هو المطلوب. بتاريخ 2 ساعة قال Ail Ahmed: الخطوات فقط من غير كاتب الكود امممم، من الصعب الشرح بدون كتابة أي كود، لكن سأحاول التقليل من الكود كما طلبت. في القائمة المترابطة، كل عنصر هو dict، هذا العنصر يحوي شيئين بداخله، الأوّل هو البيانات التي يجب على العنصر الاحتفاظ بها، والثاني هو العنصر التالي له. يعني إذا أردنا ترجمة الكود التالي من لغة C الذي يقوم بإنشاء عنصر: #include <stdlib.h> typedef struct E Element; struct E { int data; Element * next; }; int main() { Element *e = (Element *)malloc(sizeof(Element)); e->data = 5; e->next = NULL; } فسيكون هكذا في بايثون: e = { 'data': 5, 'next': None } الآن تعرف ما يجب فعله لربط هذا العنصر بغيره. فقط إسناد العنصر التالي إلى e['next']. في هذا المثال استخدمت dict لأن هذه هي أبسط طريقة، لكن يمكنك أيضا استخدام الأصناف (classes) إذا كنت تحسن البرمجة الكائنية (OOP) في بايثون: class Element: def __init__(self, data): self.data = data self.next = None e = Element(5) ولربط العنصر التالي يكفي اسناده إلى e.next . لا تنس دائما الاحتفاظ بأوّل عنصر في القائمة المترابطة لأنه من خلاله يمكنك الدخول إلى بقية العناصر، عن طريق حلقة تكرارية مثل while. 1 اقتباس
0 Ail Ahmed نشر 21 مارس الكاتب أرسل تقرير نشر 21 مارس بتاريخ 20 دقائق مضت قال حمزة عباد: لغة بايثون مختلفة عن لغة C في هذه الجزئية، لأن C فيها مفاهيم الهياكل (structs) والمؤشّرات (pointers)، وهذه هي اللبنات الأساسية لإنشاء القوائم المترابطة (Linked lists). أمّا في بايثون، فيمكننا إنشاء شيء شبيه بالقوائم المترابطة عن طريق استخدام القواميس (dictionaries) كبديل عن الهياكل، ونقوم بعمليات الإسناد المباشر عوضا عن استخدام المؤشرات لأن المؤشرات غير موجودة في بايثون، لكن عملية الإسناد تحفظ إشارة نحو العنصر، وهذا هو المطلوب. ايوه هو ده الا انا كانت عاوز افهمو بتاريخ 25 دقائق مضت قال حمزة عباد: class Element: def __init__(self, data): self.data = data self.next = None انا عملت كده شكرااا جدااا لحضرتك بتاريخ 31 دقائق مضت قال حمزة عباد: من الصعب الشرح بدون كتابة أي كود، خالص ممكن حضرتك تكمل الكود؟ اقتباس
0 حمزة عباد نشر 22 مارس أرسل تقرير نشر 22 مارس بتاريخ 10 ساعة قال Ail Ahmed: خالص ممكن حضرتك تكمل الكود؟ حسنا باستخدام الكود السابق قد قمنا بإنشاء عنصر من القائمة. الآن إذا أردنا أن نتبع نفس مبادئ لغة C فسنحتاج إلى إنشاء عنصر يمثّل عنصر رأس القائمة. عادة ما يتم كتابة شيء كهذا في لغة C : #include <stdlib.h> typedef struct E Element; struct E { int data; Element * next; }; typedef struct L List; struct L { Element * first; // يمكن إضافة حقول أخرى هنا لكننا نكتفي حاليا بأبسط مثال }; int main() { List * list = (List *)malloc(sizeof(List)); Element * firstElement = (Element *)malloc(sizeof(Element)); firstElement->data = 5; firstElement->next = NULL; list->first = firstElement; } إذا أردنا تحويل هذا إلى Python باستخدام OOP فيمكن كتابة شيء كهذا: class Element: def __init__(self, data): self.data = data self.next = None class List: def __init__(self): self.first = None first_element = Element(5) linked_list = List() linked_list.first = first_element هذا مثال لإنشاء رأس القائمة وربط أوّل عنصر بها. الآن لإنشاء المزيد من العناصر وربطها يكفي أن نقوم بإسناد كل عنصر إلى next في العنصر السابق. هذا مثال للقيام بذلك باستخدام حلقة for: current_element = linked_list.first for i in range(10, 20): next_element = Element(i) current_element.next = next_element next_element = current_element والآن لعرض كل العناصر يمكن استخدام حلقة while هكذا: current_element = linked_list.first while current_element != None: print(current_element.data) current_element = current_element.next يمكن أن تتدرب على القيام بمزيد من العمليات على القوائم المترابطة بهذه الطريقة (مثلا، البحث عن عنصر، حذف عنصر، إدخال عنصر في وسط القائمة...) وإذا واجهتك أيّة مشاكل فيمكنك طرح سؤال حولها. يرجى الانتباه إلى أن هذه الطريقة في إنشاء القوائم المترابطة في لغة Python تستخدم لتدريب الطلاب وتعليمهم مفاهيم الخوارزميات، لكن في البرامج الكبيرة الحقيقية فإننا لا نستخدم هذه الأكواد لأنها تجعل البرنامج يعمل بشكل أبطأ من الممكن. من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي). 1 اقتباس
0 Ail Ahmed نشر 22 مارس الكاتب أرسل تقرير نشر 22 مارس بتاريخ 6 ساعة قال حمزة عباد: من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي). شكرااا جدا علي المعلوما دي بتاريخ 6 ساعة قال حمزة عباد: حسنا باستخدام الكود السابق قد قمنا بإنشاء عنصر من القائمة. الآن إذا أردنا أن نتبع نفس مبادئ لغة C فسنحتاج إلى إنشاء عنصر يمثّل عنصر رأس القائمة. عادة ما يتم كتابة شيء كهذا في لغة C : #include <stdlib.h> typedef struct E Element; struct E { int data; Element * next; }; typedef struct L List; struct L { Element * first; // يمكن إضافة حقول أخرى هنا لكننا نكتفي حاليا بأبسط مثال }; int main() { List * list = (List *)malloc(sizeof(List)); Element * firstElement = (Element *)malloc(sizeof(Element)); firstElement->data = 5; firstElement->next = NULL; list->first = firstElement; } إذا أردنا تحويل هذا إلى Python باستخدام OOP فيمكن كتابة شيء كهذا: class Element: def __init__(self, data): self.data = data self.next = None class List: def __init__(self): self.first = None first_element = Element(5) linked_list = List() linked_list.first = first_element هذا مثال لإنشاء رأس القائمة وربط أوّل عنصر بها. الآن لإنشاء المزيد من العناصر وربطها يكفي أن نقوم بإسناد كل عنصر إلى next في العنصر السابق. هذا مثال للقيام بذلك باستخدام حلقة for: current_element = linked_list.first for i in range(10, 20): next_element = Element(i) current_element.next = next_element next_element = current_element والآن لعرض كل العناصر يمكن استخدام حلقة while هكذا: current_element = linked_list.first while current_element != None: print(current_element.data) current_element = current_element.next يمكن أن تتدرب على القيام بمزيد من العمليات على القوائم المترابطة بهذه الطريقة (مثلا، البحث عن عنصر، حذف عنصر، إدخال عنصر في وسط القائمة...) وإذا واجهتك أيّة مشاكل فيمكنك طرح سؤال حولها. يرجى الانتباه إلى أن هذه الطريقة في إنشاء القوائم المترابطة في لغة Python تستخدم لتدريب الطلاب وتعليمهم مفاهيم الخوارزميات، لكن في البرامج الكبيرة الحقيقية فإننا لا نستخدم هذه الأكواد لأنها تجعل البرنامج يعمل بشكل أبطأ من الممكن. من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي). شكرااا جدا لحضرتك والله 1 اقتباس
السؤال
Ail Ahmed
السلام عليكم
انا طبق علي علي هياكل البيانات linked list بلغه سي في كورس CS50 وكان الموضوع صعب شوي هل كمان صعب في لغة الباثيون
فا انا كانت عاوز اعارف اي الخطوات المفروض انا امشي عليها
بس لو سمحتو من غير كتابت كود انا عاوز اعارف اي الخطوات المفروض انا امشي عليها
7 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.