اذهب إلى المحتوى

Kais Hasan

الأعضاء
  • المساهمات

    2357
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    24

كل منشورات العضو Kais Hasan

  1. سأفترض أن نظام التشغيل لديك هو windows 10 ، في حال كان غير ذلك يمكنك الرد على جوابي و سأعيد الجواب من أجل نظام التشغيل المطلوب. في البداية اذهب إلى مربع البحث و اكتب Default apps، و اضغط على ال Default apps الذي يظهر كنتيجة. ستظهر لديك كل التطبيقات الافتراضية، اذهب إلى web browser و اختار المتصفح الذي تريده. في حال وصلت لمرحلة و لم تعلم ما الذي يجب القيام به لا تتردد في السؤال مع لقطة شاشة توضح المرحلة التي أنت فيها.
  2. بالطبع، سأقوم بإعطاءك مثال بسيط جداً و لكن يفترض أن تصبح الفكرة العامة مفهومة و يمكنك استعمالها حتى مع أمثلة أكثر تعقيداً. لنفترض أنه لديك موقع لبيع السلع الغذائية، و لنفرض أنك في الصفحة الخاصة بمنتج ما، هناك الكثير من المعلومات منها كم الكمية المتبقية و كم السعر و ما إلى هنالك. يجب عليك كتابة موجه لهذه الصفحة بالطبع، و سأتحدث هنا عن المتحكم فقط. ما الذي يمكن للمتحكم القيام به هنا؟ يجب عليه الوصول إلى قاعدة البيانات و جلب المعلومات الخاصة بالمنتج، مثلاً سعره، أو هل عليه خصم، بالإضافة إلى التقييمات مثلاً لكل مستخدم. الآن لنفترض حالة وجود خصم، فإن المتحكم يمكنه حساب السعر الجديد، كما في حال وجود التقييمات الكلية يمكنه حساب متوسط التقييمات. كل هذه البيانات التي قام بجلبها مباشرة من قاعدة البيانات أو قام بحسابها، يمكنه تمريرها إلى view مسؤولة عن عرضها، أي أن ال view تستلم البيانات و تعرض فقط، بينما كل العمليات المنطقية و عمليات جلب البيانات يتم القيام بها في المتحكم.
  3. إن طريقة العمل الخاصة بال node.js يمكن رؤيتها على ثلاثة أقسام الموجهات التي تقوم بتوجيه الطلبات إلى المتحكمات المناسبة، المتحكمات و ال views. إن المتحكمات تقوم بأخذ البيانات المرسلة و تستعملها بناء الصفحة المطلوبة و تستعمل في تلك العملية ال view المناسبة، بالتالي تفيدنا في إمكانية فصل الكود الخاص بتحديد آلية العمل عن ال view المسؤولة عن العرض فقط.
  4. كما ذكر المدربون في التعليقات السابقة، لا ينصح بالتعلم على جهاز الموبايل. من أجل البداية و تعلم الأساسيات لا مشكلة حيث يمكنك كتابة كود على الموبايل و تجربته لكن عندما تريد بناء المشاريع ستحتاج إلى حاسوب. بالتالي في حال كنت تريد فقط تعلم البرمجة يمكنك القيام بذلك، هناك مواقع توفر لك إمكانية كتابة الكود و تنفيذه من المتصفح و بالتالي يمكنك استعمالها. سأرفق بعض من هذه المواقع، و أنت تستطيع تجربتها و اختيار ما يعجبك منها: ideone يمكنك من خلاله كتابة الكود للكثير من اللغات و تنفيذها، مع إمكانية إعطاء دخل و خرج و لكن بشكل مسبق و ليس تفاعلي. codePen يمكنك من خلاله بناء واجهات مواقع ويب و تطوير مواقع بسيطة لغاية التعلم، أنصحك به في حال كنت تريد تعلم برمجة الويب. CodeSandbox هذا الموقع يمكنك من بناء تطبيقات أكبر من المواقع السابقة، و هو أفضل المواقع من ناحية الميزات التي يوفرها، حيث أنه الأقرب للحاسوب و لكن طبعاً ليس بديلاً عنه. هذه المواقع قمت بتجربتها شخصياً و هي جيدة جداً، نصيحتي أنه في حال كنت تريد تعلم برمجة غير برمجة مواقع الويب، فإن أول موقع كاف لكي تتعلم الأساسيات. بينما في حال كنت تريد تعلم برمجة الويب، فابدأ بالموقع الثاني و عندما تتقن الأساسيات يمكنك الانتقال إلى الموقع الثاني الذي يوفر لك إمكانيات أكبر بكثير. بعد هذا كله يجب عليك الانتقال إلى الحاسوب لبناء مشاريع حقيقية كبيرة، و لكن يمكنك الاعتماد على المواقع التي ذكرتها كبداية فقط.
  5. يمكنك استعمال التوابع الموجودة في المكاتب، أو يمكنك كتابة التابع الخاص بك لوحدك. سأشرح لك الطريقة و هي بسيطة جداً. سأفترض هنا أنك تريد الجذر لعدد موجب (يمكن حساب الجذر التكعيبي لعدد سالب و الطريقة نفسها لذلك سأشرح للموجب حاليا). إن حساب جذر a من المرتبة n يكافئ إيجاد العدد x الذي عندما نقوم بأخذه للقوة n ينتج لدينا العدد، أي: و بما أن تابع القوة هو تابع متزايد تماماً في مجال الأعداد الموجبة و بما أنن نضمن أن العدد x حتماً سيكون بين العدد a و ال 0 (ﻷننا افترضنا أن العدد موجب و هو جذر a) يمكننا تطبيق البحث الثنائي على هذه المسألة. البحث الثنائي يمكن فهمه بشكل مبسط عن طريق مثال واقعي، و هو لنفترض أنه لديك كتاب ما، الصفحات فيه مرقمة، و تريد الذهاب إلى الصفحة رقم x، أنت في الواقع تفتح صفحة عشوائية و ترى في حال كانت اصغر من x تبحث في القسم الثاني، بينما في حال كانت أكبر من x فتعود للبحث في القسم الأول. في البحث الثنائي بدل اختيار موقع عشوائي نختار المنتصف، و بالتالي في كل مرة نقلل عدد العناصر إلى النصف و هذا يسرع العملية بشكل كبير. يمكننا استعمال ذلك في مسألتنا، حيث أن المجال من ال 0 إلى a سنفرض أن بداية المجال هي s و نهايته هي e و في كل مرة نقوم بالتالي: نقوم بحساب موقع المنتصف و هو 2/(s+e) و لندعو الرقم هذا x. في حال كان x للقوة n يساوي الرقم الذي نريده و هو a نقوم بالتوقف و إلا نذهب للخطوة 3. في حال كان x للقوة n أكبر من a نقوم بتحديث قيمة e لتصبح منتصف المجال أي e=x و نعود للخطوة 1، و إلا نذهب للخطوة 4. هنا نحن نعلم أن x للقوة n أصغر من a و بالتالي علينا البحث في النصف الثاني فنحدث البداية s لتصبح منتصف المجال أي s=x و نعود للخطوة 1. لنأخذ مثالاً على ذلك لفهم ما سبق، لنفرض أننا نريد إيجاد الجذر التكعيبي للعدد 8 (نحن نعلم أنه 2)، بالتالي هنا لدينا نلاحظ أن x للقوة n أي للتكعيب لا يساوي a و بالتالي ننتقل للخطوة 3، إن x للتكعيب أكبر من a وضوحاً و بالتالي نجعل e=x فيصبح لدينا في التكرار التالي ما يلي: إن x للتكعيب يساوي القيمة التي نريدها فنتوقف و نقول إن الجواب هو 2 ( أي قيمة x ). من أجل القيم السالبة يمكننا تطبيق نفس الفكرة العامة.
  6. بالطبع يمكنك إخفاء هذا الخرج و ذلك بالطريقة التالية: في البداية قم بالضغط على الزر الذي في الأسفل في الصورة التالية: ستظهر لك نافذة الإعدادات، نقوم بالذهاب إلى القسم java ثم ضمن ذلك إلى القسم maven. ستكون هناك خانة تحمل الاسم Global Execution Options، نضع ضمنها ما يلي: -q ثم إضغط على OK. يجب أن يؤدي ذلك إلى إخفاء هذا الخرج. و لكن لا ينصح كثيراً بالقيام بذلك، حيث أنه في بعض الأحيان سيكون هذا الخرج مفيداً كما ذكر المدرب معاذ.
  7. إن backgorund كما يوحي اسمها، تقوم بتحديد خصائص الخلفية، مثلاً لدينا background-image تحدد الصورة التي ستظهر في الخلفية و background-color تحدد لون الخلفية. و الخاصية background تقوم بجمع الكثير من خصائص الخلفية كالخاصيتين التي سبق و ذكرتهما. هذه الخصائص هي بالترتيب: background-attachment تحدد فيما إذا كانت الصورة ثابتة أو لها scrollbar. background-clip تحدد مدى اتساع الصورة بالنسبة لصندوق العنصر الذي ستوضع فيه، أي صندوق ال padding او الصندوق الذي يحوي المحتوى فقط و هكذا. background-color سبق و شرحتها. background-image سبق و شرحتها. background-origin أيضاً لها علاقة بعلاقة الصورة مع الصناديق، و أين مركز الخلفية. background-position تضع المكان الأولي للخلفية و هي تكون بالنسبة للخاصية السابقة. background-repeat خصائص لكيفية تكرار الخلفية. background-size تحدد حجم الخلفية. الخاصية justify تقوم بتحديد الاتجاه (على اليسار، اليمين في المنتصف، الخ..). الخاصية transform تسمح بتطبيق بعض التحويلات الهندسية مثل الإزاحة و التدوير و التحجيم.
  8. يكفي أن تعلم أساسيات ال html, css, js و أهم شيء طبعاً ال js بينهم حيث يجب أن يكون لديك معرفة جيدة فيها. ليس من الضروري تعلم framework أخرى حيث أنها كافية للعمل الذي تريده، و يمكنك الاعتماد عليها بشكل كامل، بعض المهمات طبعاً أسهل ب framework من أخرى كما أنك كمبرمج قد تفضل العمل بواحدة على أخرى، لذلك نصيحتي قم بتعلم واحدة ثم يمكنك بعدها إذا أحببت أن تتعلم البقية بسرعة، و تكمل عملك بالتي تفضلها أكثر. أي مثلاً أحدهم يريدك أن تقوم بتصميم واجهة رأيت أنك قد تجد من الأسهل تصميمها في vue تقوم بتصميمها بال vue أو رأيت react أفضل فتبنيها بال react. و لكن أي من هذه ال frameworks كافي لوحده لبناء الواجهة التي تريد.
  9. هل تستعمل برنامج vpn؟
  10. سأقوم بشرح الآلية العامة لكل خوارزمية و سيصبح من السهل عليك كتابتها بعد ذلك، و في حال واجهت مشاكل بعدها يمكنك السؤال مجدداً. في الشروحات التالية سأفرض أن الترتيب تصاعدي و ذلك لتجنب ذكر الحالتين في كل مرة، حيث أن نفس الآلية يمكن تطبيقها في التنازلي طبعاً. بالإضافة أنني سأعتبر عدد العناصر n. الفرز الفقاعي في هذا النوع من الفرز نعتمد على عملية التبديل، حيث نقوم بالمرور على العناصر و مقارنة كل عنصر بالعنصر الذي يليه و في حال كان العنصر الحالي أكبر من الذي يليه نقوم بالتبديل بينهما. الآن أهم فكرة في هذه الخوارزمية هو تحديد كم مرة نحتاج لتكرار العملية السابقة، إذا فكرنا في الأمر قليلاً، في أول تكرار يمكننا ضمان أن أكبر عنصر سيصل إلى النهاية، و ذلك ﻷنه دائماً سيكون أكبر من الذي يليه، و بالتالي في كل تكرار نحن متأكدون أن عنصر واحد على الأقل سيصل إلى وجهته. بعد وصولنا إلى الاستنتاج السابق قد يخطر ببالنا أننا نحتاج إلى n تكرار و لكن ليس تماماً، حيث أنه في حال وضعنا n-1 عنصر في مكانه الصحيح فتلقائياً سيكون العنصر المتبقي في مكانه الصحيح، و بالتالي نحتاج n-1 تكرار لا أكثر. الفرز بالاختيار في هذا الفرز يتم في كل مرة البحث عن أصغر عنصر متبقي و وضعه في مكانه الصحيح مباشرة. كيف يمكن ذلك؟ ببساطة في كل مرة نبحث عن أصغر عنصر متبقي و نضعه في المكان الذي يوافق رقم التكرار، أي في حال كنا في التكرار الأول نبحث في كافة العناصر و عندما نجد العنصر، نقوم بالتبديل بينه و بين العنصر الموجود في الموقع الأول. في التكرار الثاني نقوم بالبحث بدءاً من العنصر الثاني و عندما نجد أصغر عنصر نقوم بالتبديل بينه و بين العنصر الثاني و هكذا من أجل جميع التكرارات. الفرز بالإقحام في هذا النوع من الفرز نقوم بتنفيذ عملية معينة من أجل عنصر و لمرة واحدة و هي القيام بإيجاد موقع العنصر بالنسبة لمجموعة العناصر حتى الآن. لشرح الفكرة السابقة بشكل تفصيلي، تخيل أن لديك مصفوفة ما، في البداية يكون لديك أول عنصر و بالتالي يمكنك تركه مكانه لأنه لا يوجد غيره، الآن بفرض أننا أصبحنا في العنصر i فإننا نعلم أن كافة العناصر التي تسبقنا مرتبة و بالتالي ببساطة يمكننا الرجوع و التبديل دائماً حتى الوصول إلى الموقع الصحيح، سأعطيك مثال على ذلك كون هذه الخوارزمية فكرتها أصعب بقليل. //لنفرض لدي المصفوفة التالية a = [4, 3, 5, 1] //أول عنصر دائماً يبقى في مكانه //الآن من أجل العنصر الثاني نريد وضعه في مكانه //نقوم بالمقارنة بينه و بين الذي يسبقه فنرى أنه أصغر فنقوم بالتبديل a = [3, 4, 5, 1] //الآن لا يوجد عناصر تسبقه فنتوقف //لاحظ هنا نحن في كل خطوة نضمن أن المصفوفة التي تسبقني مرتبة //و هذا ما يسمح بالقيام بعملية البحث عن الموقع الصحيح عبر التبديل //الآن من أجل الرقم 5 نرى أنه ليس أصغر من الذي يسبقه فنتركه مكانه //ننتقل إلى الرقم الأخير، نرى أنه أصغر من 5 فنبدل a = [3, 4, 1, 5] //أيضاً هو أصغر من فنبدل a = [3, 1, 4, 5] //كما أنه أصغر من 3 فنبدل a = [1, 3, 4, 5] //لا يوجد عناصر متبقية فنتوقف
  11. إن الخطأ هو أنك تقوم بترتيب أول n-1 عنصر بدلاً من ترتيب كامل المصفوفة و التي تحوي على n عنصر. إن التابع sort في c++ يحتاج مؤشر بداية يؤشر على أول عنصر، و هنا في حالتك اسم المصفوفة يتم تحويله إلى مؤشر يؤشر على أول عنصر. و البارامتر الثاني هو مؤشر نهاية، و هو يؤشر على الموقع الذي يلي آخر عنصر، أي أنه ليس آخر عنصر و بالتالي في حالتك هو a +n ﻷن العد يبدأ من الصفر و بالتالي الموقع الأخير هو n-1 و بالتالي مؤشر النهاية يجب أن يؤشر على الموقع n.
  12. عليك التعديل على نفس المتحول و ليس تخزين النتيجة في متحول جديد y و إلا لن يتم نقل أي تحديث إلى التكرار التالي في الحلقة.
  13. نحن هنا للمساعدة و لكن حل السؤال و إرساله لك لن يفيدك بشيء، سأقوم بشرح الآلية العامة و قم أنت بالمحاولة و في حال حدوث أخطاء يمكنك السؤال مجدداً. إن نص المسألة يقول لك أنه هناك راتب أساسي، و في كل سنة يحصل إضافة 2% على هذا الراتب، أي في حال كان x يصبح x + 0.02*x و ذلك ﻷن الزيادة هي 0.02*x و الراتب الحالي كان x. إن هذه العملية نطبقها من أجل كل سنة زيادة.
  14. إن الخطأ هذه المرة في كتابة settimeout فهي setTimeout، و هذا ما يخبرك الخطأ به، حيث أنه يقول لك بأنه لا يوجد تابع اسمه settimeout.
  15. إن المطلوب هو زيادة بمقدار 2% على الراتب السابق، و ليس على الراتب الأولي، أن تقوم بحساب الزيادة على الراتب الأولي دائماً، أي أن الكود الخاص بك ينفذ نفس العمليات بنفس القيم من أجل كل سنة. عليك القيام بوضع قيمة ابتدائية للراتب، و في كل سنة تضيف عليها (على نفس المتحول) 2% من قيمة المتحول.
  16. من فضلك قم بمشاركة لقطة شاشة للخطأ بعد قيامك بالتعديل (مع الكود بعد التعديل أيضاً، أي لقطة شاشة مشابهة لما قمت بوضعه في السؤال)
  17. نعم، في لغات البرمجة بشكل عام علينا الانتباه لحالة الأحرف، حيث أن أي تغيير بسيط قد يسبب خطأ.
  18. إن التابع له الاسم Hello حيث أن أول حرف كبير، بينما أنت تمرر الاسم hello إلى التابع setTimeout و هذا ما سبب الخطأ، حيث أنه يجب الانتباه إلى الاسم بدقة.
  19. من فضلك هل يمكنك توضيح المشكلة بشكل أفضل؟ هل تقوم بإدخال تاريخ و حفظ البيانات و لكن لا يظهر في ال json أم ماذا؟ و هل يمكنك إرفاق المشروع الخاص بك أيضاً حتى يمكننا النظر إليه و معرفة ما الخطأ.
  20. يبدو أن التابع insertionSort يقوم بالتعديل على المتحول بشكل مباشر (بالإضافة إلى أنه يعيده). لتجنب ذلك هناك أكثر من حل، أولاً في حال كان التابع insertionSort متاح لديك، أي أنك من قام بكتابته، فيمكنك تعديل التابع لكي يضع الناتج في مصفوفة جديدة بدل التعديل على القديمة. الحل الثاني و هو الحل الإجباري في حال لم يكن لديك وصول إلى التعريف الخاص بالتابع، و هو القيام بتمرير نسخة من المصفوفة بدل المصفوفة نفسها. سأضع مثال يقوم بالتعديل و سأريك كيف نقوم بالتحويل و يمكنك تطبيق نفس المبدأ على التابع الخاص بك. def increase(a): for i in range(len(a)): a[i] += 1 return a a = [1, 2, 3, 4] b = increase(a) print(a) # [2, 3, 4, 5] print(b) # [2, 3, 4, 5] نلاحظ هنا أننا نقوم بالتعديل على المصفوفة بشكل مباشر و هذا ما سبب الخطأ، و لكن يمكننا تمرير نسخة من المصفوفة كما يلي، و لن يحدث تعديل على الأصلية: def increase(a): for i in range(len(a)): a[i] += 1 return a a = [1, 2, 3, 4] b = increase(a[:]) print(a) # [1, 2, 3, 4] print(b) # [2, 3, 4, 5] حيث أننا قمنا بنسخ المصفوفة عن طريق نسخ كافة العناصر باستعمال [:] و هو عملية slice تأخذ كافة عناصر المصفوفة. الطريق الثانية هو تغيير طريقة تعريف التابع لكي يتم التعديل على نسخة من المصفوفة بدل المصفوفة نفسها: def increase(a): b = [] for i in range(len(a)): b.append(a[i] + 1) return b a = [1, 2, 3, 4] b = increase(a) print(a) # [1, 2, 3, 4] print(b) # [2, 3, 4, 5] هنا قمنا بإضافة النتيجة إلى لائحة جديدة و إعادتها بدل التعديل مباشرة على المصفوفة الممررة. الطريقة الثانية مفضلة على الطريقة الأولى و ذلك ﻷنها تتجنب ما يسمى بالتأثيرات الجانبية و التي تجعل الأخطاء التي تحدث في الكود صعبة التعقب.
  21. إن عمل run للكود هو القيام بتنفيذ هذا الكود. أي أنت تقوم بكتابة بعض التعليمات البرمجية، فيتم المرور على هذه التعليمات و تنفيذها، و هذا ما يؤدي إلى تنفيذ المطلوب منها. يمكن القيام ب run للكود عن طريق استعمال أحد بيئات التطوير البرمجية مثل vscode أو غيرها، كما يمكنك القيام بذلك من سطر الأوامر، مثلاً في بايثون يمكنك كتابة كود و لنفترض كتبته في ملف يحمل الاسم test.py فيمكنك عمل run له من سطر الأوامر بالشكل التالي: python test.py و لكل لغة طريقة مختلفة.
  22. يوجد مكتبة جاهزة يمكنها تسهيل عمل ما سبق، يمكننا تنزيل هذه المكتبة عن طريق كتابة ما يلي: npm install radio-buttons-react-native --save الآن يمكننا استعمال هذه المكتبة كما يلي: import RadioButtonRN from 'radio-buttons-react-native'; const data = [ { label: 'data 1' }, { label: 'data 2' } ]; <RadioButtonRN data={data} selectedBtn={(e) => console.log(e)} /> هنا في البداية نقوم بتضمين المكتبة. من ثم نقوم بتعريف البيانات التي تعرف الأزرار التي نريدها، هذه البيانات يجب أن تكون لائحة من الأغراض كل غرض يحوي على الخاصية label و التي تمثل النص الذي يتبع لكل زر. بعد ذلك يمكننا استعمال الوسم RadioButtonRN و الذي نمرر له البيانات بالإضافة يمكننا استعمال الخاصية selectedBtn لتعريف تابع يقوم بتنفيذ أمر ما عند النقر على هذا الزر. يمكنك الإطلاع على أية تفاصيل أخرى عن المكتبة من هنا.
  23. يمكنك إرسال كل عنصر على حدى و لكن بشكل يوضح بأنهم يتبعون لمصفوفة واحدة، و ذلك كما يلي: FormBody.Builder builder = new FormBody.Builder(); for(int i = 0; i < array.length; i++){ builder.add("items[" + i + "]", array[i]) } FormBody body = builder.build(); حيث أننا هنا نوضح أن العنصر هو items[i] حيث i سيأخذ قيمة دليل. يمكننا أيضاً إرسالها كسلسلة نصية بينها فراغات، أي نقوم ببناء سلسلة نصية تحوي على عناصر المصفوفة بحيث يفصل فراغ بين كل عنصرين متتالين، و هكذا يمكن للمستقبل القيام بفك السلسلة عن طريق تقسيمها عند الفراغات. الطريقة الثانية أفضل بكثير من الطريقة الأولى حيث أن المصفوفة تكون في عنصر واحد، و لكن هذا يعتمد على الطريقة التي تراها أسهل في فك العنصر، حيث أن المستقبل يجب أن يعلم الطريقة التي قمت باستعمالها حتى يستطيع التعامل مع المصفوفة بالشكل الصحيح.
  24. إن المساحة التي تريدها هي مساحة بين منحنيين هما المنحني باللون الأزرق (أو اللون الذي تريده حيث من غير الواضح تماماً أي منحني تريد) و المستقيم الأزرق. لإيجاد المساحة بين منحنيين يمكننا طرح المساحة التي أسفل أحدهما من المساحة التي أسفل الآخر. يمكن حساب المساحة عن طريق التكامل و الذي يمكن حسابه في ماتلاب عن طريق الدالة trapz. المشكلة الوحيدة هنا هو أنه في مجال معين يكون المنحني الأزرق له مساحة أكبر من المستقيم الأزرق و العكس في مجالات أخرى و بالتالي علينا حساب أكثر من تكامل لضمان نتيجة صحيحة. يمكن حساب هذه النقاط بسهولة في ماتلاب عن طريق إيجاد نقاط التقاطع بين المنحني الأزرق و المستقيم الأزرق سأدعو هذه النقاط ب x2 و x3 ، بالإضافة إلى نقاط التقاطع بين المنحني الازرق و المحور x و سأدعو هذه النقاط ب x1 و x4. الآن يمكنك حساب المساحة في المجالات التالية: [x1, x2], [x2, x3], [x3, x4] حيث أنه في المجالين الأول و الأخير نقوم بطرح المساحة تحت المستقيم الأزرق من المساحة تحت المنحني الأزرق، بينما نقوم بالعكس في المجال الثاني. من أجل تلوين المساحة يمكنك استعمال fill و لكن يجب عليك إعطاء الكثير من النقاط، أي مثلاً المجال لديك هو من ال 0 إلى 220 تقريبا على محور x و بالتالي مثلاً جرب وضع 400 نقطة أو 500، يمكن كتابة ذلك في الكود بدون جهد كبير.
  25. نفس الخطأ يتكرر، عندما تقوم باستعمال معامل السهم فأنت تصل إلى البيانات الخاصة بما يؤشر عليه المؤشر، و لكن في حال كان nullptr فإنه لا يؤشر على شيء و بالتالي سيحدث خطأ. انت وضعت شرط تختبره إذا nullptr و قمت بالوصول إلى قيمته في ذلك الشرط مما يؤكد حدوث خطأ هناك. الحل هو كما يلي: void swapFirstLast() { if (head == nullptr) return; node *temp = head; int value = head->data; while(temp!= nullptr) { if(temp->next == nullptr) { head->data = temp->data ; temp->data = value; } temp = temp->next; } }; طبعاً لاحظ أنني استبدلت NULL ب nullptr، تذكر القيام بذلك من أجل كل الكود. يمكنك محاكاة ما سبق في كافة التوابع التي تقوم فيها بالوصول إلى مؤشر، تذكر القاعدة دائماً أنه قبل الوصول إلى المؤشر يجب التأكد من أنه يؤشر إلى غرض ما بالفعل و ليس إلى nullptr.
×
×
  • أضف...