01-03-13, 03:34 AM
السلام عليكم و رحمة الله و بركاته...
رأيت سؤالاً لأحد الإخوة حول كيفية الحصول على قيمة تعبير حسابي مكتوب في خانة نص. و قد أحببت أن أفتح موضوعاً بهذا الشأن لتقديم بعض التوضيحات و تعم الفائدة.
لنفرض أن لدينا التعبيرين الحسابيين التاليين:
نحن كبشر نستطيع أن نلقي نظرة على التعبير و نحدد أولوية العمليات سواءً من ناحية تطبيق الأقواس أو من ناحية أسبقية العوامل، بحيث نكتب الحل على عدة خطوات لنصل إلى الناتج النهائي.
ففي التعبير الأول سنوجد ناتج الأس أولاً (5 أس 2 = 25) ثم ناتج الضرب (25 ضرب 2 = 50) ثم ناتج الجمع و الطرح (25 زائد 1 ناقص 50) ليكون الناتج -24.
أما في التعبير الثاني - و الذي يتكون من نفس المعاملات أو المقادير أو الأعداد - فإن للأقواس الأولوية العليا، حيث سنجمع القوس الداخلي (2 زائد 1 = 3) ثم الأس (5 أس 3 = 125) ثم الطرح (125 ناقص 25 = 100) و أخيراً الضرب (100 ضرب 2) ليكون الناتج 200.
أما تحليل مثل هذه التعابير - رغم بساطتها - برمجياً فإنه أمر معقد بهذا الشكل لأن البرنامج قد يحتاج إلى الاحتفاظ المؤقت بالعديد من القيم و نواتج الكثير من العمليات ليعود إليها لاحقاً حسب أسبقية العوامل، و إذا كانت هناك أقواس فستكون العملية أكثر تعقيداً.
التعبيرات بالشكل السابق - و التي نستعملها نحن البشر بشكل طبيعي تسمى التعبيرات ذات العوامل البينية (Infix expressions) لأن العوامل (إشارات العمليات) موجودة بين المعاملات أو المقادير.
هناك صيغ أخرى لكتابة التعبيرات الحسابية مثل التعبيرات ذات العوامل البعدية (Postfix expressions) حيث توضع العوامل (الإشارات) بعد القيم، و كذلك التعبيرات ذات العوامل القبلية (Prefix expressions) حيث توضع العوامل (الإشارات) قبل القيم.
و أكثر هاتين الصيغتين استعمالاً هي صيغة العوامل البعدية (Postfix) و التي سنستعملها هنا.
* مثال 1: التعبيران المذكوران أعلاه كمثال يكتبان بطريقة الـ Postfix كالتالي (سنشرح بعد ذلك كيف يتم ذلك يدوياً و برمجياً):
ما نلاحظه في هذين التعبيرين (Postfix) أنه لا وجود للأقواس، و أنه ليس هناك أولوية للعوامل حيث يتم تقييم التعبير من اليسار إلى اليمين بالترتيب - أولاً بأول - بصرف النظر عن أسبقية العامل لأن الأسبقية تمت مراعاتها عند التحويل من التعبير ذي العوامل البينية (Infix).
* إذن لتقييم تعبير حسابي نقوم بخطوتين:
= 1. نقوم بتحويل التعبير من صيغة Infix إلى صيغة Postfix.
= 2. نقوم بتحليل التعبير الناتج بصيغة الـ Postfix.
*** سنبين أولاً كيف يتم تحويل تعبير من صيغة Infix إلى صيغة Postfix يدوياً لكي يكون الأمر واضحاً:
1. إذا كان التعبير يحتوي على أقواس نتركها كما هي.
2. نضع أقواساً من عندنا حول كل مقدارين حسب أسبقية العوامل.
3. نبدأ بتفكيك التعبير ابتداءً من الداخل باتجاه الأقواس الخارجية. عملية التفكيك تعني نقل العامل (الإشارة) من بين المقدارين و وضعها بعد المقدار الثاني.
4. نحذف جميع الأقواس فيبقى لنا التعبير بصيغة Postfix.
# المثال الأول هو تحويل التعبير الأول المذكور أعلاه، أي الذي من غير أقواس:
# المثال الثاني هو تحويل التعبير الثاني المذكور أعلاه، أي الذي يحتزي على أقواس:
و كما نلاحظ فإن الأمر بسيط.
سنكتفي بهذا القدر في هذه المشاركة، على أن نكمل في مشاركة قادمة لشرح كل من خوارزمية التحويل من Infix إلى Postfix و خوارزمية تقييم الـ Postfix للحصول على الناتج، بالإضافة إلى شرح أكواد تطبيق الخوارزميتين بلغة VB6.
أخيراً: تحتوي المرفقات على برنامج كامل - كمثال - يستعمل تلك الخوارزميات لتحليل مقدار جبري (حسابي) مكتوب في مربع نص (TextBox). عند تشغيل البرنامج اكتب التعبير الحسابي في مربع النص الأول (دون علامة =) ثم انقر الزر "تقييم" حيث سيعرض صيغة الـ Postfix في مربع النص الثاني و الناتج في مربع النص الثالث، مع الملاحظات التالية:
1. الكود يدعم عمليات الجمع (+) و الطرح (-) و الضرب (*) و القسمة (/) و الأس (^). و يمكن طبعاً توسيعه ليدعم عمليات أخرى مثل القسمة الصحيحة (\) و باقي القسمة (%).
2. مع أن البرنامج يحتوي على اختبارات لاقتناص بعض الأخطاء إلا أنه قد يفشل مع بعض الأخطاء (برنامج للتجربة و التوضيح - غير مكتمل من ناحية اصطياد الأخطاء) لذلك أدخل دائماً تعبيرات حسابية صحيحة.
3. الكود لا يدعم استعمال القيم السالبة كمدخلات، مثلاً سيعطي خطأ في حالة بدأ التعبير الحسابي برقم سالب.
نرجو الاستفادة و السلام.
رأيت سؤالاً لأحد الإخوة حول كيفية الحصول على قيمة تعبير حسابي مكتوب في خانة نص. و قد أحببت أن أفتح موضوعاً بهذا الشأن لتقديم بعض التوضيحات و تعم الفائدة.
لنفرض أن لدينا التعبيرين الحسابيين التاليين:
كود :
5 ^ 2 + 1 - 25 * 2
(5 ^ (2 + 1) - 25) * 2
نحن كبشر نستطيع أن نلقي نظرة على التعبير و نحدد أولوية العمليات سواءً من ناحية تطبيق الأقواس أو من ناحية أسبقية العوامل، بحيث نكتب الحل على عدة خطوات لنصل إلى الناتج النهائي.
ففي التعبير الأول سنوجد ناتج الأس أولاً (5 أس 2 = 25) ثم ناتج الضرب (25 ضرب 2 = 50) ثم ناتج الجمع و الطرح (25 زائد 1 ناقص 50) ليكون الناتج -24.
أما في التعبير الثاني - و الذي يتكون من نفس المعاملات أو المقادير أو الأعداد - فإن للأقواس الأولوية العليا، حيث سنجمع القوس الداخلي (2 زائد 1 = 3) ثم الأس (5 أس 3 = 125) ثم الطرح (125 ناقص 25 = 100) و أخيراً الضرب (100 ضرب 2) ليكون الناتج 200.
أما تحليل مثل هذه التعابير - رغم بساطتها - برمجياً فإنه أمر معقد بهذا الشكل لأن البرنامج قد يحتاج إلى الاحتفاظ المؤقت بالعديد من القيم و نواتج الكثير من العمليات ليعود إليها لاحقاً حسب أسبقية العوامل، و إذا كانت هناك أقواس فستكون العملية أكثر تعقيداً.
التعبيرات بالشكل السابق - و التي نستعملها نحن البشر بشكل طبيعي تسمى التعبيرات ذات العوامل البينية (Infix expressions) لأن العوامل (إشارات العمليات) موجودة بين المعاملات أو المقادير.
هناك صيغ أخرى لكتابة التعبيرات الحسابية مثل التعبيرات ذات العوامل البعدية (Postfix expressions) حيث توضع العوامل (الإشارات) بعد القيم، و كذلك التعبيرات ذات العوامل القبلية (Prefix expressions) حيث توضع العوامل (الإشارات) قبل القيم.
و أكثر هاتين الصيغتين استعمالاً هي صيغة العوامل البعدية (Postfix) و التي سنستعملها هنا.
* مثال 1: التعبيران المذكوران أعلاه كمثال يكتبان بطريقة الـ Postfix كالتالي (سنشرح بعد ذلك كيف يتم ذلك يدوياً و برمجياً):
كود :
5 2 ^ 1 + 25 2 * -
5 2 1 + ^ 25 - 2 *
ما نلاحظه في هذين التعبيرين (Postfix) أنه لا وجود للأقواس، و أنه ليس هناك أولوية للعوامل حيث يتم تقييم التعبير من اليسار إلى اليمين بالترتيب - أولاً بأول - بصرف النظر عن أسبقية العامل لأن الأسبقية تمت مراعاتها عند التحويل من التعبير ذي العوامل البينية (Infix).
* إذن لتقييم تعبير حسابي نقوم بخطوتين:
= 1. نقوم بتحويل التعبير من صيغة Infix إلى صيغة Postfix.
= 2. نقوم بتحليل التعبير الناتج بصيغة الـ Postfix.
*** سنبين أولاً كيف يتم تحويل تعبير من صيغة Infix إلى صيغة Postfix يدوياً لكي يكون الأمر واضحاً:
1. إذا كان التعبير يحتوي على أقواس نتركها كما هي.
2. نضع أقواساً من عندنا حول كل مقدارين حسب أسبقية العوامل.
3. نبدأ بتفكيك التعبير ابتداءً من الداخل باتجاه الأقواس الخارجية. عملية التفكيك تعني نقل العامل (الإشارة) من بين المقدارين و وضعها بعد المقدار الثاني.
4. نحذف جميع الأقواس فيبقى لنا التعبير بصيغة Postfix.
# المثال الأول هو تحويل التعبير الأول المذكور أعلاه، أي الذي من غير أقواس:
كود :
Infix = 5 ^ 2 + 1 - 25 * 2
أ. وضع الأقواس
(5 ^ 2) + 1 - (25 * 2)
((5 ^ 2) + 1) - (25 * 2)
(((5 ^ 2) + 1) - (25 * 2))
ب. التفكيك
(((5 2 ^) + 1) - (25 2 *))
(((5 2 ^) 1 +) - (25 2 *))
(((5 2 ^) 1 +) (25 2 *) -)
ج. إزالة كافة الأقواس
Postfix = 5 2 ^ 1 + 25 2 * -
# المثال الثاني هو تحويل التعبير الثاني المذكور أعلاه، أي الذي يحتزي على أقواس:
كود :
Infix = (5 ^ (2 + 1) - 25) * 2
أ. وضع الأقواس
((5 ^ (2 + 1)) - 25) * 2
(((5 ^ (2 + 1)) - 25) * 2)
ب. التفكيك
(((5 ^ (2 1 +)) - 25) * 2)
(((5 (2 1 +) ^) - 25) * 2)
(((5 (2 1 +) ^) 25 -) * 2)
(((5 (2 1 +) ^) 25 -) 2 *)
ج. إزالة كافة الأقواس
Postfix = 5 2 1 + ^ 25 - 2 *
و كما نلاحظ فإن الأمر بسيط.
سنكتفي بهذا القدر في هذه المشاركة، على أن نكمل في مشاركة قادمة لشرح كل من خوارزمية التحويل من Infix إلى Postfix و خوارزمية تقييم الـ Postfix للحصول على الناتج، بالإضافة إلى شرح أكواد تطبيق الخوارزميتين بلغة VB6.
أخيراً: تحتوي المرفقات على برنامج كامل - كمثال - يستعمل تلك الخوارزميات لتحليل مقدار جبري (حسابي) مكتوب في مربع نص (TextBox). عند تشغيل البرنامج اكتب التعبير الحسابي في مربع النص الأول (دون علامة =) ثم انقر الزر "تقييم" حيث سيعرض صيغة الـ Postfix في مربع النص الثاني و الناتج في مربع النص الثالث، مع الملاحظات التالية:
1. الكود يدعم عمليات الجمع (+) و الطرح (-) و الضرب (*) و القسمة (/) و الأس (^). و يمكن طبعاً توسيعه ليدعم عمليات أخرى مثل القسمة الصحيحة (\) و باقي القسمة (%).
2. مع أن البرنامج يحتوي على اختبارات لاقتناص بعض الأخطاء إلا أنه قد يفشل مع بعض الأخطاء (برنامج للتجربة و التوضيح - غير مكتمل من ناحية اصطياد الأخطاء) لذلك أدخل دائماً تعبيرات حسابية صحيحة.
3. الكود لا يدعم استعمال القيم السالبة كمدخلات، مثلاً سيعطي خطأ في حالة بدأ التعبير الحسابي برقم سالب.
نرجو الاستفادة و السلام.
بِسْمِ اللهِ الرَّحْمَنِ الرَّحِيمِ ( وَ مَا تُقَدِّمُوا لِأَنفُسِكُم مِّنْ خَيْرٍ تَجِدُوهُ عِندَ اللهِ هُوَ خَيْراً وَ أَعْظَمَ أَجْراً ) صَدَقَ اللهُ الْعَظِيمُ