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

شرف الدين حفني

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

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

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

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

    2

كل منشورات العضو شرف الدين حفني

  1. بالإضافة إلى إجابة وائل أردت توضيح بعض الأمثلة التي قد تساعدك على الفهم المقصود بخطأ غير متوقع الذي يرمز إليه الرمز 500 أن الخادم لم يكن مستعدًا لهذا الخطأ وإن كان إستعد له لكانت النتيجة مختلفة, فمثلًا إن أرسل العميل البيانات ناقصة وبالتالي أصبح يوجد بعض البيانات التي قيمتها بnull, في الحالة الطبيعية والصحيحة أن يتأكد الخادم من أنه لا يوجد قيم مخالفة وإن وجد بيانات ناقصة يقوم بإرسال رمز 422 والذي يعبر عن عدم توافق البيانات المُرسلة مع البيانات المطلوبة ولكن بما أن الخادم لم يتأكد من صحة البيانات فيوجد إحتمال كبير أن يحدث runtime error بسبب تلك القيم التي قيمتها null أو undefined وبالتالي يتم إرسال رمز 500 يوجد تشابه بين كلا الرمزين 501 not implemented والرمز 405 method not allowed الفرق يكمن كالتالي الرمز 501 يرمز إلى أن تلك الmethod تم تصميمها في الAPI-design ومن المُفترض دعمها في وقتٍ ما ولكنها في الوقت الراهن غير مدعومة الرمز 405 تعني أن تلك الmethod لم يتم وضعها في الAPI-design من الأساس
  2. بالإضافة إلى إجابة وائل أردت توضيح بعض النقاط التي قد تجدها متشابهة أو مُشوشة كلا الرمزين 200 و 201 يعبران عن نجاح العملية ولكن الرمز 200 يتم إستخدامه مع الطلب من النوع GET بينما الرمز 201 يتم إستعماله مع الطلب من النوع POST وذلك لأن الطلب من النوع POST يُستعمل في الأساس لإنشاء موارد جديدة والرمز 201 يُعبر عن نجاح إنشاء تلك الموارد الجديدة الرمز 203 يتم إستخدامه عندما يكون هنالك وسيط(proxy) بين العميل والخادم ويقوم ذلك الوسيط بتعديل الرد فيقوم حينذاك بإرسال ذلك الرمز حتى يعلم العميل أن الرد قد تم تعديله, وأنوه هنا من أنه عادةً لا يُفضل إستخدام ذلك الرمز حيث أنك لا تستطيع معرفة الحالة الأصلية التي أرسلها الخادم, وإنما الأفضل أن تقوم بإرسال رمز 200 مع إدراج warning header يوضح للعميل الرمز الأصلي الرمز 204 قد تلاحظ تشابه بينه وبين الرمز 404 حيث كلا الرمزين يعبران عن عدم توفر بيانات ولكن الفرق يكمن كالتالي: في الرمز 404 يفيد بأن المورد المطلوب غير موجود من الأساس, فمثلًا نبحث عن التعليقات التي قام بها المستخدم ذو المُعرف 5 , ولا يوجد لدينا مُستخدم بذلك المُعرف فحينذاك يتم إرسال 404 في الرمز 204 يفيد بأن المورد موجود ولكن لا يوجد بيانات حتى يتم إرسالها, فمثلًا نبحث عن التعليقات التي قام بها المستخدم ذو المُعرف 5, والمُستخدم ذو المُعرف 5 موجود لدينا بالفعل ولكنه لم يقم بأية تعليقات حتى الأن, في تلك الحالة نقوم بإرسال الرمز 204 الذي يُفيد بعد توفر بيانات لإرسالها ولكن لا يوجد مشكلة في الموارد
  3. يمكنك الدفع من خلال باي بال , ولتفعيل خدمة باي بال يجب ربطها بفيزا يقبلها الموقع , الأشهر والأكثر إستخدامًا في مصر للتعامل مع الباي بال هي فيزا البريد المصري easy pay , يمكنك إستخراجها بسهولة عبر التوجه إلى أحد أفرع مكاتب البريد المجاورة وطلب الحصول على فيزا easy pay ولكن احرص على تحديد أنك تريد easy pay وليس نوع أخر , ومن ثم يتم تفعيل الفيزا في خلال 24 ساعة تقريبًا وهنيئًا لك يمكنك حينئذ ربطها بحساب باي بال عبر التوجه إلى صفحة (بيانات الدفع) وإدخال رقم الفيزا ورقم الأمان (csv) وتاريخ الإنتهاء وللتواصل والإستفسار عن الدورات أو طرق أخرى للدفع يمكنك التواصل مع مركز مساعدة حسوب
  4. يحدث ذلك غالبًا بسبب أنك تقوم بتعيين نفس الstate , فبالنسبة لreact فإن الstate مازال قيمتها تساوي items حتى وإن تم تغيير قيمة أحد عناصرها فإنها مازالت تشير إلى ذات المكان في الذاكرة, يمكنك التغلب على تلك المشكلة عبر تغيير الstate كما بالشكل التالي: const addItem = (item) => { items[item.id] = item; setItems({...items, item.id:item}); } بهذه الطريقة أنت لا تقوم بإرجاع نفس الstate بعد إضافة عنصر جديد, وإنما تقوم بنسخ عناصر الstate القديمة إلى state أخرى مع إضافة العنصر الجديد, فتتعرف react على أن الstate تم تغييرها وتشير إلى مكان أخر في الذاكرة فيتم تنفيذ الre-render
  5. يمكنك تنفيذ التالي بسهولة عبر إستخدام هيكل البيانات bitset والذي يقوم بتحويل الأرقام العشرية إلى ثنائية , حيث تقوم بوضع الرقم في الconstructor الخاص بالهيكل وثم تقوم بتحويله إلى نص وطباعته كما في المثال التالي std::string binary = std::bitset<8>(128).to_string(); std::cout<<binary<<"\n"; unsigned long decimal = std::bitset<8>(binary).to_ulong(); std::cout<<decimal<<"\n"; ﻻحظ أننا قمنا بإعطاء الbitset قيمة 8 مما يعني أنها تحمل 8 بيتات بمعنى أن أقصى رقم يمكن وضعه هو 2 مرفوع لقوى الرقم 8 -1 بما يعادل 255, إن أردت قيمة أكبر يمكنك إسناد خانات أكبر من البيتات
  6. يمكنك إستخدام الدالة erase بالإضافة مع الدالة remove_if حيث تقوم بإعطاء الدالة remove_if مؤشر لبداية النص ونهايته والحرف الذي تريد إزالته , وتقوم بتمرير الدالة كمعامل اول للدالة erase ومن ثم تقوم بإعطاء مؤشر لنهاية النص كمعامل ثاني كما بالشكل التالي input.erase(remove_if(input.begin(), input.end(), isspace),input.end());
  7. يقوم ال ActivityManager بتوفير دالة تقوم بالإفصاح عن التطبيقات التي تعمل في الهاتف , الدالة هي getRunningAppProcesses وﻻ تأخذ تلك أي معاملات وتقوم بإرجاع list تحتوي بداخلها على العمليات التي تعمل في الهاتف على هيئة الصنف RunningAppProcessesInfo ويمكنك تنفيذ المطلوب عبر الشفرة التالية ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); ومن ثم يمكنك وضع الشفرة السابقة في حلقة تكرارية غير متناهية while(true){ ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); } والتحقق من إسم العملية while(true){ ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); for (int i = 0; i < runningAppProcessInfo.size(); i++) { if(runningAppProcessInfo.get(i).processName.equals("اسم التطبيق")) { // قم بتنفيذ عملية ما } }
  8. يوجد خدمات أخرى مجانية مثل خدمة frestorage المقدمة من firebase
  9. يمكنك القيام بذلك عبر وضع التنسيق direction:rtl بالإضافة إلى الattribute المُسمى dir إلى rtl عند العنصر المُراد تغيير إتجاه عناصره فمثلاً إن كنت تريد تغيير إتجاه العناصر في الصفحة كلها يمكنك تحديد الخاصية dir لدى وسم ال html وجعلها ك rtl <html dir="rtl"> </html> وإضافة التنسيق html{ direction:rtl }
  10. بالإضافة إلى إجابة محمد يمكنك أيضًا فعل ذلك دون أن تقوم بعمل حلقة تكرارية حتى تحصل على أداء أفضل عبر المعادلة الرياضية التالية لدينا معادلة المتتاليات الحسابية التي مفادها s=(n/2)*(a+l) حيث الs هي مجموع المتتالية وال n عدد العناصر وال a أول عنصر وال l أخر عنصر بما أنك تريد العثور على الأعداد محصورة بين 0 و 100 إذا سيكون أخر عنصر في المتتالية 98 مجموع العناصر الزوجية من 0 إلى 100 51 وبما أنك ستقوم بجلب الأعداد المحصورة بينهما فلن تتضمن ال0 أو ال100 فسيكون مجموع العناصر 49 لذا يمكن بسهولة حساب المجموع بالمعادلة السابقة بعد التعويض عن n ب49 والتعويض عن a ب 2 ليكون شكل الشفرة البرمجية كالتالي int sum = (48/2)*(2+98) ويكون الشفرة المزيفة( pseudo code كالتالي) let sum = (48/2)*(2+98)
  11. تلك التعليمة تستخدم لمناداة الEvent handler الخاص بالعنصر عندما ﻻ يتوفر دوال لهذا الحدث(event) فمثلاً لو أردنا مناداة حدث الضغط (click event) يمكننا إستخدام كلا الطريقتين element.click() //او element.dispatchEvent(new Event("click")) بالطبع الطريقة الأولى أسهل وأفضل ولكن ماذا لو تحدثنا عن حدث لا يوجد له دالة جاهزة في العنصر مثلاً كحدث قمنا نحن بإنشاؤه؟ فمثلاً لو قمنا بإنشاء حدث عندما يتم الضغط على الزر ثﻻث مرات بشكل متتالي , ففي ذلك الموقف ليس لنا دالة جاهزة في العنصر فنقوم إذا مناداة الevent handler عبر الطريقة الأخرى element.dispatchEvent(new Event("event name"))
  12. بما انك ﻻ تملك حاسوب من شركة أبل فلا تستطيع إستخدام نظام ماك كما قال حسن, لذا تكون المقارنة بين ويندوز وليونكس لماذا قد تستخدم ليونكس بدلاً من ويندوز مفتوح المصدر مما يعني تطويرات أكثر من قبل مبرمجين من كل أنحاء العالم بناءاً على النقطة السابقة فإنه يتمتع بحماية أكبر من ويندوز فغالباً لن تحتاج إلى مضاد للفيروسات حتى, حيث لأن ليونكس مفتوح المصدر فيقوم المبرمجين بإكتشاف الثغرات وتصليحها بشكلٍ سريع من قبل حتى أن يتم نشر فيروس لها على عكس ويندوز المنغلق لشركة ميكروسوفت تحديثات في وقت أقل وذلك بسسب انه مفتوح المصدر أيضاً فيقم العديد من المبرمجين بنشر التحديثات في وقت أقل من نظيره ويندوز الأداء: حيث أن ليونكس يعطي أداءًا أفضل من ويندوز نظرًا لأنه lightweight أسهل للمبرمجين حيث أنه يدعم بالإفتراضي عددًا من لغات البرمجة عند تثبيته مثل python, c, c++ , بالإضافة أن الterminal الخاصة بليونكس أقوى من نظيرتها في ويندوز لديه دعم إفتراضي للssh لديه مجتمع قوي مجاني لماذا قد تستخدم ويندوز بدلًا من ليونكس أسهل في الإستخدام ولديه إنتشار أكبر عددًا لا بأس به من البرامج غير مدعومة على ليونكس مثل برامج adobe, microsoft office يتيح لك إختيارات أقل من ليونكس فلا يجعلك تحتار, حيث أن ليونكس له أكثر من 600 توزيعة وتلك ميزة وعيب في نفس الوقت, ميزة لأنها تتيح لك حرية الإختيار وعيب لأنها تسبب الحيرة مدعوم من شركة قوية مثل ميكروسوفت دعم فني من قبل شركة ميكروسوفت يغنيك عن مجتمعات ليونكس الألعاب: حيث أن أغلب شركات الألعاب تستهدف نظام ويندوز وفي النهاية يظل الإختيار إختيارك فلا يوجد نظام أفضل من الأخر إنما هي تفضيلات شخصية, هل تفضل القوة وحرية الإختيار؟ أم السهولة والطريق الواضح
  13. من الممكن أن تقوم بفتح نافذا الinspect عبر f12 ومن ثم إختيار نافذة profiler التي تدعمها الreact dev tools ومن ثم تقوم بإختيار الإعدادات والضغط على خاصية Record why each component rendered while profiling. ومن ثم يمكنك أن تعرف لماذا كل component يتباطأ حتى تتمكن من معرفة مصدر البطئ وتصليحه كما أنني أﻻحظ إستخدامك لدوال كثيرة وتمريرها عبر الcomponents , وذلك يجعل في كل مرة يتم تنفيذ دالة يحدث عملية re-render للcomponents , يمكنك معالجة ذلك عبر إستخدام الuseCallback h const someFunction = useCallback((parameters) => { //نقوم بكتابة جسم الدالة }, [نقوم هنا بوضع المتغيرات التي تتغير تلك الدالة على اساسها]); بهذا الشكل عند تنفيذ الدالة لن يحدث re-render إلا عند تغيير أحد المتغيرات التي تم تمريرها
  14. بالإضافة إلى إجابة بلال يمكنك أيضًا في بداية الدالة التأكد أن الرقم الذي أدخله المستخدم من النوع integer عن طريق التالي التأكد أولاً من أن المتغير هو رقم ويمكن التأكد من ذلك عبر الدالة isNan حيث تعطي true إن كان المتغير ليس رقم وتعطي false إن كان رقم if(!isNan(number)) نقوم بعد ذلك بتحويل المتغير إلى رقم, لأنه من الممكن أن يكون موضوع بين عﻻمتي تنصيص فنقوم بالتحويل إلى رقم عبر الدالة Number Number(number) بعد ذلك نقوم بالتأكد أن الرقم integer عبر الدالة isInteger Number.isInteger(number) في النهاية يكون الشرط كالتالي if(!isNaN(number)&&Number.isInteger(Number(number))) ////do printing else console.log("برجاء إدخال رقم من النوع integer")
  15. لو سمحت قم بإرفاق الشفرة البرمجية التي حاولت فيها تنفيذ البرنامج وتحديد الجزئية التي ﻻ تستطيع تنفيذها في الشفرة البرمجية وسنساعدك فيها
  16. يمكنك مراسلة الدعم الفني من خﻻل هذا الرابط https://support.academy.hsoub.com/login كما يمكنك أيضاً أن تسأل في التلعيقات عن أية مفاهيم تبدو لك صعبة أو تحتاج إلى المزيد من التوضيح وسيقوم المدربين بمساعدتك قدر المستطاع حتى تصبح تلك المفاهيم واضحة بالنسبة اليك
  17. ﻻ يوجد ما يسمى الأفضل فكل شركة ويكون لها مميزات مختلفة عن الأخرى ولكن أحد أشهر وأفضل بوابات الدفع بوابة paypal حيث تتمتع بالخصائص التالية الأمان: تتمتع البوابة بأمان عالي مما يضمن عدم تعرض عملية تحويل الأموال إلى التلاعب سرعة تحويل الأموال, حيث في أغلب تعاملاتي مع paypal يتم تحويل الأموال في أقل من 24 ساعة, بل في الحقيقة كتجربة شخصية أخر مرة قمت بتجربتها تم وصول الأموال في ما يقارب الثﻻث ساعات الدعم الفني سريع الإستجابة ومتعاون بشكلٍ كبير الشهرة: حيث أن شركة paypal من الشركات المشهورة والتي تمتلك ثقة المستخدمين ويُعطي إنطباعا جيداً لدى المستخدم عندما يحتوي موقعك على بوابة دفع لها سمعة جيدة خدمة عالمية: يمكنك تحويل الأموال من أي مكان في الأرض إلى أي مكان أخر سهل إستخدامها في موقعك, حيث تُوفر api سلس وسهل الإستخدام وستجد لها sdk جاهز لأغلب بيئات البرمجة(php, java, node )
  18. سأخبرك بالخطوات المنطقية لتنفيذ تلك العملية من ثم يمكنك تطبيقها بنفسك حتى تستفاد في البداية كم ساعة تحتوي الدقيقة؟ الساعة تحتوي 60 دقيقة مما يجعل الدقيقة تحتوي 1/60 ساعة نقوم إذا بقسمة عدد الدقائق على 60 ونرى إن وجدنا باقي للقسمة نقوم بتخزينه في متغير يسمى الدقائق وإن وجدنا يساوي صفر يتم إيقاف البرنامج وطباعة المتغير التي تم تخزينه سابقاً( الدقائق) اليوم يحتوي 24 ساعة لذا تحتوي الساعة على 1/24 يوم, لذا بالمثل نقوم بقسمة ناتج القسمة السابقة على 24 ونرى إن وجدنا باقي للقسمة يتم وضعه في متغير يُسمى بالساعات وإن كان ناتج قسمة الساعات على 24 يساوي صفراً يتم إيقاف البرنامج وطباعة المتغيرات التي تم تخزينها سابقاً( الساعات والدقائق) الشهر يحتوي 30 يوم, لذا نقوم بقسمة ناتج القسمة السابقة على 30 وإن عثرنا على باقي للقسمة يتم تخزينه في متغير للأيام وإن كان ناتج القسمة نفسها بصفر فيتم إيقاف البرنامج وطباعة المتغيرات التي تم تخزينها سابقاً(الايام والساعات والدقائق) نقوم بقسمة ناتج القسمة السابقة على 12 وإن عثرنا على باقي للقسمة يتم تخزينه في متغير للشهور وباقي ناتج القسمة يتم تخزينه في متغير للسنوات ومن ثم يتم طباعة جميع المتغيرات التي تم تخزينها
  19. برجاء وضع معلومات أكثر مثل إرفاق الشفرة البرمجية بالإضافة إلى إرفاق صورة توضح عملية الرفع من خﻻل برنامج postman وبالإضافة إلى الخطأ الذي يظهر لك ولكن بوجهٍ عام بما أنك تقوم بالرفع من postman لذا غالباً أنت تقوم بإختيار نافذة الform-data بداخل الbody ومن ثم تقوم بإختيار حقلُ وتقوم بتعيينه كملف بدلاً من قيمة نصية وتقوم بعد ذلك بإرفاق الصورة فيه ولكن عندما تقوم برفع الصورة من المتصفح يتم إعطاءك خطأ لذا في أغلب الحالات يبدو أنك قد تكون قمت بإرسال الbody على هيئة json والjson ﻻ تدعم ترميز الملفات مما يؤدي إلى فشل العملية, لذا في هذه الحالة يمكنك أن تقوم بإرسال الbody على هيئة كائن FormData ويعمل الكائن كالتالي form_data = new FormData();///لتعريف الكائن form_data.append(key,value)//لوضع قيمة في الكائن, حيث نضع إسم الحقل وفي المعامل الثاني نضع قيمته /* العملية السابقة مشابهة لصيغة الjson { key:value } */ ومن ثم يتم وضع الكائن في خانة معامل الbody axios(url,formdata)
  20. قانون مساحة الدائرة(المنطقة) هو عبارة عن حاصل ضرب المعامل بايpi في نصف القطر تربيع إذا يكون المنطق التسلسلي للبرنامج بالشكل التالي تقوم بأخذ قيمة نصف القطر من المستخدم عبر الدالة input ومن ثم تقوم بتعريف الثابت pi بقيمة 3.14 من ثم تقوم بالتأكد إن كانت قيمة نصف القطر التي أدخلها المستخدم تساوي صفر تقوم بطباعة كلمة خطأ إن لم تكن صفر فتقوم بطباعة حاصل ضرب نصف القطر تربيع في الثابت pi
  21. كما اخبرك بلال يمكنك مراسلة الدعم الفني بالإضافة لذلك يمكنك السؤال عن أي جزأ غير واضح بالنسبة لك في التعليقات وسيقوم المدربين بشرحه لك وتبسيطه
  22. قبل الاجابة على السؤال سنضع قاعدة شبه عامة , عندما تتعامل مع موارد(resoueces) فقط نقوم بصنع نقطة نهاية(end point) منفصلة ماهي الموارد الموارد هي أي كائن له خصائص ودوال وعﻻقات مع كائنات اخرى فمثلاً الuser وال post موارد لان كلا منهم له خصائص وحقول منفردة ويوجد عمليات او دوال خاصة بكلٍ منهم ويوجد عﻻقات بينهم وبين بعض هل التعليق يمكن أن نعتبره من الموارد؟ هذا سؤال شائك قليلاً حيث أن التعليق له خصائص مثل المحتوى وتاريخ النشر والتعديل وعمليات مثل الاضافة والتعديل وعﻻقة بينه وبين المستخدم الذي نشره والمنشور الذي كتب فيه التعليق ولكن في نفس الوقت يمكن أن نعتبر التعليق أحد حقول المنشور, حيث أنه يعتمد بشكل أساسي على المنشور فلن يحتاج أحد أن يستدعي التعليق منفرداً, وإنما دائماً يتم إستدعاؤه مع المنشور فلذلك يتم غالباً إعتبارهُ حقل مدمج ضمن الpost ولذلك من الأفضل أن يتم تصميم الapi على تلك الشاكلة /api/post/post_id/comment ويتم إستخﻻص المُعرف الخاص بالمُستخدم عبر إستخراجه من الjwt المُرسلة عبر الheaders
  23. الفكرة من إستخدام الqueue الخاص بمكتبة multiprocessing في بايثون أنه يُعد thread safe أي أنه أمن أن يتم القراءة منه من قِبل أكثر من thread في ذات الوقت دون قلق من أن يحدث تعارض في البيانات وذلك لأنه يضمن عدم حدوث عمليتي قراءة وكتابة في ذات الوقت الدوال الخاصة بالqueue تشبه التي شرحناها منذ قليل مع إختﻻف المسميات فمثلاً لوضع قيمة نقوم بإستخدام الدالة put لسحب قيمة نقوم بإستخدام الدالة get بالنسبة للتعديل فﻻ يمكن التعديل على قيم الطابور , حيث أن الفكرة منه أن يكون هناك هيكل بيانات مشترك بين الthreads فمثلاً كما في الشفرة البرمجية التالية from multiprocessing import Process, Queue import time import sys def reader_proc(queue): while True: msg = queue.get() if (msg == 'END OF FILE'): break def writer(count, queue): for ii in range(0, count): queue.put(ii) queue.put('END OF FILE') pqueue = Queue() for count in [10**4, 10**5, 10**6]: reader_p = Process(target=reader_proc, args=((pqueue),)) reader_p.daemon = True reader_p.start() _start = time.time() writer(count, pqueue) reader_p.join() print("Sending {0} numbers to Queue() took {1} seconds".format(count, (time.time() - _start))) كما تﻻحظ فإننا هنا قمنا بإنشاء اتنين threads أحدهما للقراءة والأخر للكتابة, ولكي يستطيع القارئ قراءة ما يكتبه الكاتب قمنا بتخزين بيانات الكاتب في الطابور المشترك بينهما حيث يقوم الكاتب بكتابة البيانات في الطابور ومن ثم يقوم القارئ بقراءة البيانات من نفس الطابور
  24. يمكنك تنفيذ ذلك ببساطة بإستخدام الhtml عبر وضع العنصر a وإعطائه مسار الملف كما بالشكل التالي <a href= "مسار الملف.pdf">click to preview</a> عند النقر على كلمة click to preview سيتم نقل المُستخدم إلى صفحة الملف ويمكنه من خلالها قراءة الملف وطباعته أو تحميله كما يشاء
  25. في لغة بايثون ﻻ يوجد هيكل بيانات للطابور(queue datastructure) وإنما الطابور الموجود يتم إستخدامه لأغراض أخرى مثل البرمجة المتوازية(parallel programming, multithreading) وإنما هيكل بيانات الطابور في لغة بايثون يتم إستخدامه عن طريق القوائم(lists) ماهو الطابور الطابور(queue) هو نوع من أنواع هياكل البيانات حيث ييعمل بنظام fifo(first in first out) أي أن البيانات التي تدخل في الطابور أولاً تخرج أولا ﻻ يجب أن يتم إختيار البيانات بشكل عشوائي بل يجب أن تمشي بذلك الترتيب فمثلاً إن قمنا بإدخال القيم 1, 2, 3 إذا يجب إخراج 1, 2, 3 ﻻ يمكن أن يتم إخراج القيم بترتيب مخالف إنشاء الطابور بإستخدام القوائم يحتوي الطابور عادةً على الدوال التالية بشكل أساسي enqueue(element) يقوم بإدخال قيمة إلى نهاية الطابور dequeue(element)يقوم بحذف عنصر من بداية الطابور يوجد في القوائم في بايثون دالة تسمى append ودالة تسمى insert كﻻهما يقومان بإدخال العناصر إلى الطابور ولكن ماذا يجب نستخدم؟ نستخدم هنا الدالة append لأنها تقوم بإدخال العنصر إلى نهاية القائمة مما يحاكي عملية الطابور, على عكس insert التي تقوم بإدخال العنصر في البداية, وهكذا نكون قمنا بمحاكاة الدالة enqueue بالنسبة للدالة dequeue فيمكننا إستخدام الدالة pop في القائمة والتي تقوم بحذف عنصر من القائمة ومن ثم إرجاع قيمته فيمكننا إستخدامها مع إعطاؤها الفهرس رقم صفر حتى تقوم بمحاكاة عملية الdequeue , لتصبح في النهاية شكل الدوال كالتالي queue = [] #محاكاة عملية الenqueue queue.append('banana') queue.append('grapes') queue.append('mango') queue.append('orange') #محاكاة عملية الdequeue #هنا يتم طباعة banana first_item = queue.pop(0) print(first_item) #هنا يتم طباعة grapes first_item = queue.pop(0) print(first_item)
×
×
  • أضف...