تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
طرق إجراء عملية التبديل بين حقلين (Swap Two Variables)
#1
Lightbulb 
السلام عليكم ورحمة الله،،
في هذه المقالة القصيرة سنتعرف إلى طرق مختلفة للتبديل بين حقلين two variables. بشكل عام عملية التبديل تعرف باسم تبديل قيم حقلين swap. من بدأ بتعلم البرمجة سيمر على حالة قد يحتاج فيها إلى تبديل قيم حقلين ليصبح الحقل الأول يحمل قيمة الحقل الثاني، في  حين تصبح قيمة الحقل الثاني هي قيمة الحقل الأول سابقا قبل التبديل. الطريقة التقليدية التي نعرفها وهي باستخدام حقل إضافي ثالث ليقوم بدور الوسيط ليقوم بحفظ قيم أحد الحقلين من الضياع أثناء إجراء عملية التبديل. لكن هل تعلم أنه بإمكانك إجراء عملية التبديل هذه بطرق أخرى دون الحاجة إلى حقل ثالث وسيط.
قد تتعجب وتتسائل ما الحاجة إلى طرق أخرى إن كانت الطريقة التقليدية تفي بالغرض؟!ّ الجواب هو إذا كنت تبرمج الأجهزة الصغيرة التي لا تتعدى ذاكرتها عدة بايتات فقط , عندها ستضطر إلى البحث عن طرق أخرى للتقليل من استهلاك الذاكرة أو حتى في حال عدم وجود مساحة كافية في الذاكرة لاستخدام أي حقل إضافي.
دعنا نقم أولا بعرض طريقة الكود التقليدي. كود1 يعرض عملية التبديل باستخدام العملية الحسابية.  طبعا كلمة ref تستخدم في لغة السي شارب C# وهي تكافئ تماما & في لغة السي بلس بلس (C++)

كود1.  التبديل بين الحقول Variables باستخدام حقل إضافي
كود :
void Swap(ref int a, ref int b)
{
      int c;
     
      c = a;
      a = b;
      b = c;
}


 
لاحظ في كود2 التالي تم استخدام عمليات الجمع والطرح للتبديل بين الحقول دون الحاجة إلى حقل إضافي. الكود الجديد فيه ميزة وعلة. الميزة توفير مساحة في الذاكرة فلا حاجة لحقل ثالث. أما العلة فهي قد يحصل Overflow طفحان بسبب ناتج جمع قيميتين قد ينتج عنه عدد كبير لا يمكن استيعابة في الحقل الحالي. كود3 يحل هذه المشكلة باستخدام exclusive-OR

كود2. التبديل بين الحقول Variables باستخدام العمليات الحسابية (الجمع والطرح)
كود :
void Swap(ref int a, ref int b)
{
      a = a + b;
      b = a - b;
      a = a - b;
}
 
في الكود التالي تم استخدام exclusive-OR ، وهو عميلة تتم على مستوى البتات (قيم ثنائية 1 أو 0) يمكن مراجعة موقع مايكروسوفت (انقر هنا لتحصل على المزيد من الشرح) هذا الكود أفضل من السابق بسبب أن إحتمال حدوث فائض غير وارد.

كود3. التبديل بين الحقول Variables باستخدام exlusive-OR
كود :
static void Swap(ref int a, ref int b)
{
   a = a ^ b;
   b = a ^ b;
   a = a ^ b;
}
 
في نهاية هذه المقالة ستكون قد تعرفت على طرق مختلفة للتبديل بين حقلين بثلاث طرق:
1.     الطريقة التقليدية باستخدام حقل ثالث إضافي
2.     طريقة حسابية (الجمع والطرح) لكن قد يحصل خلل بسبب عدم استيعاب الحقل لجمع عددين في حال فقط أن جمعها ينتج عنهما قيمة كبيرة
3.     استخدام المعامل exlusive-OR، والتي تقوم بالعمل على مستوى البتات (بالشكل العدد الثنائي)
الرد }}}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله , myalsailamy , myalsailamy
#2
بارك الله فيك على هذا الموضوع الرائع والمختصر ..

عجبتني طريقة swapping باستعمال الexlusive OR عبقري الي فكر فيها ههههههه
الرد }}}}
تم الشكر بواسطة:
#3
جميل جدا ... هذي مواضيع جميله و ان كانت بسيطه
اسم معرفي : محمد يحيى
الرد }}}}
تم الشكر بواسطة:


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم