ديسمبر 24، 2009

مسئلة برمجية: حساب و رسم مثلث باسكال

لنقم ببعض التسخينات البرمجية! هممم، ماذا عن مثلث باسكال؟

ستكون المسئلة البرمجية هي حساب مثلث باسكال و رسم صفوفه. يجب أن تظهر النتيجة على شكل مثلث و لذلك يجب أن تكون المسافة التي تفصل أي عددين عن بعض بطول أكبر عدد في المثلث.

مثال:

القاعدة الحسابية لملء مثلث باسكال تقوم على : كل عدد في مثلث باسكال هو مجموع العددين الذان فوقه.

لا تهم اللغة البرمجية المستخدمة لحل هذه المسألة، ليتقدم الكل لإيجاد الحل.
سأكتب الحل الذي توصلت إليه بإستخدام بايثون بعد يومين.

الحل الذي توصلت إليه هو:


قمت بتعريف دالة/وظيفة إسمها pascal_triangle و تحتاج إلى معرفة عدد أسطر المثلث الدي ترغب في رسمه من خلال معيار

nbr_rows . هدا المعيار قيمته الإفتراضية هي 10 أسطر.

بالإضافة إلى القاعدة الحسابية التي تحكم مثلث باسكال و هي : كل عدد في مثلث باسكال هو مجموع العددين اللذان فوقه. لاحظت كدالك أن العدد الأول و الأخير في كل سطر هو 1 و أن عدد الارقام المتواجدة في كل سطر تطابق رتبة السطر. (السطر السادس يضم 6 أرقام و السابع 7 و هكدا..).

و إعتمادا على هده المعلومات كتبت الشفرة المصدرية التالية:
* أولا مثلث باسكال على الأقل سيتكون من سطر واحد، ثم إن كان عدد الأسطر المطلوبة أكبر من 1 ستبدأ الحلقة التسلسلية for دورتها بدءا من السطر الثاني إلى آخر سطر طلبه المستخدم.
* في كل دورة من دورات السلسلة يتم إنشاء قائمة عدد عناصرها يتساوى مع السطر المطلوب (المعبر عنه بالمتغيرة n) و تكون قيمة كل عنصر من تلك العناصر هي 1
* بعد دالك تبدأ حلقة تسلسلية جديدة لكي نقوم بحساب قيم السطر الجديد (تماما كما هو مطلوب منا: "كل عدد في مثلث باسكال هو مجموع العددين الذان فوقه"). السطر الجديد المعبر عنه بالمتغيرة next_row يستعين بالسطر الدي يسبقه المعبر عنه بالمتغيرة row و دالك حتى يتمكن من حساب قيمه.
* و بعد حساب كل قيم السطر الجديد، يتم إسنادها إلى السطر الحالي ليصبح السطر الجديد هو الحالي و تبدأ الحلقة بالتعامل معه على دالك الأساس في الدورة التالية.
* بالنسبة للمتغيرة rows فهي قائمة (list) نملأها بأسطر المثلث بصيغة نصية، و دالك حتى يسهل علينا لاحقا إظهارها على شكل مثلث.* بعد التسلسل على كل أسطر المثلث (أي بعد إنتهاء الحلقتين)، نستخرج أكبر عدد في آخر سطر من أسطر المثلث حتى نحصل على المسافة التي سنتركها بين كل عدد في كل سطر. و بإستخدام تلك المسافة نقوم بتعديل كل سطر من القائمة rows و من ثم نحسب طول السطر الأخير لنستخدمه كمقياس لنحصل على شكل مثلث.
* في النهاية يأخد كل سطر شكله المناسب و يتم ربطها كلها مع بعض حتى تتمكن دالة print من عرض النتيجة بكل سهولة.

هناك 5 تعليقات:

  1. تم بحمد الله :)

    استخدمت لغة "بايثون" لحله
    بإمكانكم تحميله من هنا:
    http://www.4shared.com/file/180326173/1ece7cbe/PascalTriangle.html

    وضعته في ملف حتى يسهل قراءته :)

    ردحذف
  2. done
    http://www.2shared.com/file/10212333/f7937efb/pascalTriangle.html

    ردحذف
  3. كان فى مشكلة فى المسافات
    http://www.2shared.com/file/10212553/a544a5cf/pascalTriangle2.html

    ردحذف
  4. لقد كتبت الحل الدي توصلت إليه.

    @BooDy:
    إستخدامك للقاموس فكرة ذكية :) و نسيت أن تترك المسافة بين أي عددين بطول أكبر عدد (إفترضت مسافة ثابتة). و ملاحظتي الأخرى هي أن تتفادى تسمية المتغيرات بنفس أسماء الدوال المدمجة مع بايثون (ك dict و max) لأن ذالك قد يتسبب في المنادات عليها لاحقا بدلا من الدوال المدمجة.

    @taitos7:
    تسببت لي بفقدان العديد من الخلايا العصبية محاولا تتبع الإستدعاء الذاتي (Recursion) داخل الحلقات :) أتظهر عضلاتك علينا؟ :) :)
    + أنت كذلك إفترضت مسافة ثابتة بين أي عددين.

    شكرا لكما على المشاركة، قمتما بعمل جيد!

    ردحذف
  5. الحقيقة اني لم انتبه لمسأله عدد المسافات و كنت مشغولا بحل المشكلة الرئيسية
    شكرا على ملاحظاتك :)

    ردحذف