• 0
حسام الملحم

تفضلوا آلة حاسبة تقرأ العمليات والحسابات الرياضية!

سؤال

السلام عليكم،

هذا الإصدار الأول (التجريبي) للآلة الحاسبة المتطورة التي تقرأ ما تكتب.

تطوير حسام الملحم

ميزات البرنامج:

1- اكتب الدالة كاملة وسيقوم البرنامج بعرض النتيجة مثلا:

result = 4 + 5 *10^(2) +Abs(4-10)

سيعرض النتيجة 110

2- يتعرف على الدوال والمتغيرات التي تضعها ويطلب قيمها لاحقا منك!

result = x^3 + 4*x^2 + Cos(Sqrt(x)) +32
x = Log (50/2)

أو اكتب الدالة

result = Speed
Speed = distance / Hours
Hours = 4
Distance = 10 *sqrt(Hours)

وسيعرض النتائج :

result = 5
speed = 5
distance = 20
Hours = 4

3- يمكنك من تنفيذ الدوال المنطقية أيضا!!

speed = if (temperture > 50 , temperture/4, temperture *2)
temperture = 20

سيعرض النتائج

speed = 40
temperture = 20

result = factorial(4)

الجواب: 24

وأكثر!!

------------------------

ميزات شفرة البرنامج:

1- الشفرة مصنوعة بالطريقة الشيئية التوجه!! الشفرة جميلة جدا، وخاصة إذا كنت تتقن البرمجة الشيئية!! من التقنيات المستخدمة (الأحادية أو Singleton راجع موضوع فيصل الردادي، المصنع Factory، التجميل Decorator)

2- الشفرة سهلة التطوير!! إضافة دوال جديدة سهل جدا!!

3- الشفرة المحركة أو القلب النابض مفصولة تماما عن واجهة المستخدم!! يعني هذا أنه يمكنك إضافة هذه الخدمة في برنامجك المحاسبي مثلا، باستعمال أمرين على الأكثر!!!!

import hussam.math.operations;

class Test{
public static void main(String[]args){
OperationReader reader = new MyReader();
Operation op = reader.readOperation("5 + 10*4^(2+3)");
System.out.println(op.result());
}
}

أو

import hussam.math.operations;

class Test{
public static void main(String[]args){
OperationReader reader = new MyReader();
Operation op = reader.readOperation("sqrt(x+4)*10");
reader.getVariableFactory().getVariable("x").setOperation(reader.readOperation("10+2"));
System.out.println(op.result());
}
}

الجواب: 40

-------------------

ميزات الواجهة الرسومية:

1- واجهة بسيطة، وظيفتها تجربة المحرك.

2- بتغيير معادلة واحدة، تظهر لك نتائج جميع المعادلات التي أدرجتها!

3- في بداية البرنامج، سيعرض عليك الدوال المتوفرة التي تستطيع استخدامها!!

4- لا توجد مساعدة في البرنامج ولا شرح ولا حتى حول البرنامج!!!!!!

ربما نضيفها في الإصدار النهائي!!

5- تغيير البرنامج إلى واجهة عربية ضمن الإصدار النهائي بإذن الله.

----------------------

ميزات الحزمة:

1- تعمل على أي نظام تشغيل!

2- ربما نصنع نسخة تعمل على الإصارات القديمة من جافا لاحقا!!

3- الشروحات أو Documentation لم تنتهي بعد!!

الدوال الرياضية المتوفرة حاليا:

ستعرض لك في بداية تشغيلك للبرنامج...

يمكنك من تجربة البرنامج على المتصفح من هنا:

http://faculty.kfupm.edu.sa/MISAC/hussam/O...s%20Program.htm

ملاحظة تحتاج إلى جافا 5

www.java.com

الشفرة متوفرة في صفحتي هنا: (إصدار تجريبي)

البرنامج والشفرة والبريمج على المتصفح

إذا لم تعجبك الواجهة الرسومية فغيرها كما يحلو لك وشكلها كيفما تريد!!!! قد أغيرها في المستقبل!

Operations.JPG

أحب أن تجربوها، وأحب أن أسمع عن مختلف أنظمة التشغيل التي جربتها!!

إذا كانت لديك أسئلة فلا تتردد!

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

52 إجابة على هذا السؤال .

  • 0

ماشاءالله عليك اخي ابو مازن...

وشكرا على المجهود الذي تبذله ..

الالة جدا رائعة ( عني انا اول مرة اشوف اله كذا) ... نصيحتي لك اخي ابو مازن ... ان ترسلها الى مشرفي arabeyes ليتم وضعها ان شاء الله في الاصدار القادم من arabian .

تم تعديل بواسطه مبتدئ جدا
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما شاء الله عليك أخي أبو مازن جهد مبارك ....

على فكرة ما هي مجالات استخدام هذه الأداءة ؟؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه الحزمة ستقدم للمبرمج الكثير... لاحظ أنها ليست موجهة إلى المستخدم العادي... المستخدم العادي قد يستخدم الآلة الحاسبة العادية أو آلة حاسبة محرر جداول SpreadSheet مثل Excel لو كان يريد أن يستخدم دوالا!! مع أن هذه الأداة ستقدم للمستخدم تحكم أكبر في الدوال والحسابات، إلا أنها ليست موجهة له..

هذه الحزمة موجهة للمبرمج الذي يريد أن يجعل برنامجه يدعم الحساب التلقائي،،، افرض مثلا أن عندك برنامج محاسبي،، وعندك البنود المعروفة: الصندوق، حساب آجل، دين، وديعة، المخزون، العقار، المعدات، السيارات، المصروفات، الأرباح، الخ....

افرض الآن أنك تريد أن تجعل المستخدم يقوم بالحسابات مباشرة ليعرف النتائج من بيانات برنامجك. فباستخدام هذه الحزمة ستتمكن من تكوين واجهة مثل الذي رأيت على المتصفح وتجعل المستخدم يكتب الحسابات التي يريد، كيفما يريد: مثلا يريد أن يحسب معدل دوران المال السائل: وهو كما هو معروف في المحاسبة: (الصندوق + حساب آجل ) \ الدين السائل:

فيكتب:

(الصندوق() + حساب آجل() )\ الدين السائل()

طبعا الصندوق() عبارة عن دالة ترجع لك ميزانية الصندوق!

--

في العادة، هذه المعادلات تكون جاهزة للمستخدم، فيضغط على زر مكتوب عليه (معدل دوران المال السائل) أو شيء من هذا القبيل، فتخرج النتائج! لكن هذه الطريقة لن تخدم المستخدم جيدا وخاصة عندما يريد أن ينفذ معادلات وحسابات جديدة!

برنامج اكسل مثلا، يدعم الكثير من الدوال الجاهزة،، لكنك إذا أردت إضافة دالة جديدة من عندك فسيكلفك هذا وقتا كثيرا لإضافة معادلة واحدة، فما بالك بعدة معادلات!!

هذه الحزمة ستحل هذه المشكلة، فالبرنامج سيدعم الحسابات المكيفة!!

في الإصدار الجديد، الحزمة ستدعم أشياء جديدة،، لم أكن أتوقع أني سأنفذها!!

كما أني سأرفق الشروحات لاستخدام هذه الحزمة API Documentation!!

ترقبها!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحقيقة مجهود رائع و ممتاز الله يعطيك العافية

بس انا ما فهمت صيغة الدالة if

و ان شاء الله ننتظر الdocumentation

تم تعديل بواسطه عماد الخليل
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم،،

تم الانتهاء من الإصدار الثاني التجريبي. لقد أصبحت الحزمة قوية جدا إلى درجة أني لم أتوقع هذا منها!!!

1- تستطيع إضافتها إلى مشروعك في أسطر قليلة!

	public static void test()throws MathException{
 OperationReader reader= ExpressionReader.getInstance();
 Operation o=reader.readOperation("Abs(-5*x)");
 Variable x=reader.getOperatorSource().getLocalVariable("x");
 System.out.println ("X=0 Result= "+o.result());
 x.setOperation(new ConstantNumber(4));
 System.out.println ("X=4 Result= "+o.result());
 x.setOperation(new ConstantNumber(2));
 System.out.println ("X=2 Result= "+o.result());
 x.setOperation(new ConstantNumber(10));
 System.out.println ("X=10 Result= "+o.result());
 x.setOperation(new ConstantNumber(-20));
 System.out.println ("X=-20 Result= "+o.result());
}

النتائج:

X=0 Result= 0.0
X=4 Result= 20.0
X=2 Result= 10.0
X=10 Result= 50.0
X=-20 Result= 100.0

2- تستطيع إضافة دوال جديدة بسهولة في الحزمة:

	public static void test2()throws MathException{
 CustomFunctionFactory factory=new CustomFunctionFactory(OperatorFactoryDB.getInstance(),"TriValue","Trigonometry formula", "Sqrt(a^2+ b^2)");
 OperatorFactoryDB.getInstance().addFunction(factory);

 OperationReader reader= ExpressionReader.getInstance();
 Operation o=reader.readOperation("TriValue(variable,4)");
 Variable x=reader.getOperatorSource().getLocalVariable("variable");
 System.out.println ("variable=0 Result= "+o+"="+o.result());
 x.setOperation(new ConstantNumber(3));
 System.out.println ("variable=3 Result= "+o+"="+o.result());

}

النتائج:

variable=0 Result= (TriValue(variable,4.0))=4.0
variable=3 Result= (TriValue(variable,4.0))=5.0

إذا أردت أن تختبر الحزمة وتراها كيف تعمل يمكنك ذلك في صفحتي:

http://faculty.kfupm.edu.sa/MISAC/hussam/I...rations_Program

البرنامج في الصفحة سيظهر لك معادلة VB6Rocket الشهيرة: كما هو المعلوم، فإن الدالة Rocket أو الصاروخ عبارة عن دالة تنادي نفسها.

وهي كالتالي:

if(size=1, 2 , Rocket(floor(position/2),floor(size/2)) - size*(position%2-1))

كما في السابق، فقط أدرج هذه الدالة مباشرة، وستقوم الحزمة بالباقي:

Rocket(0,32) = 64
Rocket(1,4) = 4

جرب البرنامج بإضافة دوال جديدة واختبار مختلف المعادلات البسيطة والمعقدة!!

لاحظ أن الحزمة تدعم الدوال التي تنادي نفسها أو Recursion!!

راجع هذا الرابط إذا أردت أن تعرف ماهي دالة الصاروخ:

موضوع دالة الصاروخ، الكاتب VB6Rocket

3- الشروحات Documentation: ستجدونها هنا:

http://faculty.kfupm.edu.sa/MISAC/hussam/T...adoc/index.html

وسيتم تطويرها كثيرا في القريب!

4- الحزمة فيها الكثير، لكن إلى هنا يكفي الآن. إن أردت معرفة المزيد عنها أو واجهتك صعوبة في استخدامها، فلا تتردد.

بصراحة، أنا أسأل نفسي ماذا ينقص الحزمة؟؟؟؟ هل من مدقق، أو منتقد، أو ناصح، أو معلق؟

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم تنقيح الحزمة والشفرة.

إذا لم تعمل الوصلات في الأسفل فعليك بصفحتي:

http://faculty.kfupm.edu.sa/MISAC/hussam/

الآن يمكنك أن ترى الشروحات أو Documentation هنا:

الشروحات Documentation

تم إضافة شفرة الإصدار المشروحة هنا:

الشفرة المصدرية

يمكنك أن ترى البرنامج هنا:

بريمج محلل العبارات الرياضية على المتصفح! Applet

يمكنك أن تحمل المكتبة الأساسية على سطح المكتب هنا:

المكتبة الرئيسية HussamExpressionReader.jar

ويمكنك أيضا تحميل البرنامج التجريبي الذي يستخدم الحزمة السابقة:

البرنامج التطبيقي الصغير، الذي يستخدم إمكانيات الحزمة الخطيرة!

إذا أردت تجربة البرنامج على سطح المكتب فيجب أن يكون الملفين بجوار بعضهما،، شغل الملف الثاني!

تحتاج www.java.com

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خيرا اخي ابو مازن..

كذا الشغل ولا بلاه...

سوف اقوم باستخدام المكتبة في تطبيق كبير انا الان اجهز له كجزء من التدريب التعاوني.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم بحمد الله إضافة اللغة العربية للدوال!

أصبح بإمكانك كتابة مثل هذه المعادلة بسهولة:

إذا ( س> 70 ، جتا ( زاوية السلام عليكم ورحمة الله وبركاته) ، ظا ( زاوية السلام عليكم ورحمة الله وبركاته) )

س = 90

الناتج = صفر!

انظر إلى الوصلات السابقة لتجربة الحزمة الجديدة..

لم أغير في الشفرة إلا إضافة عامل الفاصلة المقلوبة ليصبح بإمكانك استعمال (،) والفاصلة المقلوبة!!

أمر واحد لا أعرف حله، وهي كيف أظهر الأرقام الهندية مكان العربية،،، لكن هذا خارج اختصاص الحزمة.. هذه ستكون من مهمة مصمم الواجهة التي أنا في غنى عنها!!!

الموضوع كان سهلا للغاية وقد تم بهذه الطريقة:

1- أضفت الدوال الجديدة في ملف خارجي (تجدها في وسط الحزمة Jar)

2- البرنامج يقرأها ويضيفها كـ CustomFunctionFactory لقاعدة البيانات الرئيسية!

إذا أردت استخدام الحزمة، فلا تكترث بالشفرة،،، فقط حمل الحزمة في برنامجك كالتالي:

import hussam.math.operations.parser.*
import hussam.math.operations.*;

public class Test{
public static void main(String[]args){
//اصنع قارئا جديدا للمعادلات والحسابات:
OperationReader reader=ExpressionReader.getInstance();
//أصبح لديك reader

//اقرأ دالة معينة
Operation o1=reader.readOperation("س + 4");

//ضع قيم للمتغيرات

reader.getOperatorSource().getLocalVariable("س").setOperation(new ConstantNumber(10));

//اطبع النتيجة:
System.out.println(o1.result());

}
}

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا سلام على التطور!!! أكتب س بين قوسين فتنقلب إلى تحية الإسلام.... ما شاء الله تبارك الله!!

بعد 800 مشاركة في المنتدى بالتو أعرف بهذا الإختصار!! لا أدري هل أغير س إلى ص،،، لكن ربما تنقلب إلى صلى الله عليه وسلم! عموما سأغير س إلى كلمة (متغير) :

إذا ( متغير> 70 ، جتا ( زاوية(متغير)) ، ظا ( زاوية (متغير)) )

متغير = 90

الناتج = صفر!

عموما توجد دوال كثيرة، تستطيع لوحدك إضافة دوال جديدة بسهولة جدا!!

بالتوفيق!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحة مش عارف اقول لك ايه يا أخي أبي مازن ,انت انسان فعلا جدير بالاحترام

سؤال بس هل ممكن البرنامج ده يبقى بلغة j2me

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا الى اليوم وانا ابحر في جمال التصميم لهذه الالة.. فعلا اول مرة ارى مشروع عربي منظم بهذه الطريقة.

خدمتني كثيرا من حيث لاتدري بهذه الحزم... انا استخدمها الان في مشروع... فشكرا ولو كانت كلمة شكرا لاتكفي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

من الصعب علي أن أجزم وأقول كيفية تكييف الحزمة لتعمل على الجوال،

لكن من بعض ما يحضرني: حتى نجعل الحزمة تعمل على الجوال يلزم عدة أمور:

1- يجب أن نعيد كتابة الشفرة لبعض أجزاء الحزمة لأن الحزمة تستعمل مكتبات غير متوفرة في مكتبة الجوال الصغيرة مثل الفئة Collections مثلا!

فالأمر sort غير متوفر في الجوال، وهذا يعني أننا يجب أن نكتب طريقة عمل الترتيب بأنفسنا!

2- الحزمة تستخدم فيها أوامر جافا الجديدة مثل Generics، وغيرها من الأوامر، وهذه الإمكانيات موجودة فقط في الإصدار الأخير من جافا 5! أما الجوالات فهي تدعم الإصدار 1.4 ! لهذا يجب أن نعيد بعض الأساليب المستعملة في الحزمة!

3- الحزمة كبيرة جدا، وأعتقد لو حزمناها جيدا فسيكون حجمها 40 كيلوبايت! ربما لا يكون هذا عائقا!

لكن من منظور آخر، لماذا تحتاج هذه الحزمة في الجوال؟،،

1- هل تقصد أنك تريد آلة حاسبة مثل التي في صفحتي؟؟

2- أم أنك تريد استخدام الحزمة التي أتكلم عنها في برنامج كبير؟؟

إذا كان الأول، فإننا ربما نستطيع أن نعمل آلة بسيطة على الجوال تدعم الأرقام وبعض الدوال والأقواس ليعطي لنا الناتج مباشرة من غير استخدام هذه الحزمة المتطورة! وربما تصنع آلة منا ترى في صفحتي، لكن هل البرنامج عملي وخاصة أنك ستحتاج إلى كتابة الدوال والأرقام والمتغيرات باللوحة الرقمية الصغيرة في الجوال؟؟ لكن عموما في النهاية، يعتمد على مصمم واجهة البرنامج على الجوال!

أما إذا كان الثاني فلا أعتقد أن برامج الجوال الكبيرة ستقتضي إضافة آلة حاسبة لها بهذا الشكل! ولا أدري!!

---

إذا راجعت صفحتي، ستلاحظ أني فصلت الحزمة إلى حزمتين:

1- حزمة HussamExpressionReader وهي المحرك الأساسي. الإصدار 2.5 التجريبي!

2- حزمة OperationsTestGui وهي الاختبار والواجهة الرسومية التجريبية للحزمة!

اجعل الحزمتين في نفس الامتداد وشغل الملف الثاني ليعمل الاختبار البسيط كما في صفحتي على سطح مكتبك!

أحب أن أشير مرة أخرى أن هذه الإصدارات التجريبية هي إصدارات تجريبية! هذا يعني أني لو طورت الحزمة قليلا فلن أدعم الإصدار القديم!

حاليا، الشروحات documentation مصممة لتشرح الإصدار 2.5 من الحزمة!

الإصدار القديم لشفرة الحزمة موجودة في صفحتي،، ربما لن أضع شفرة الإصدار الجديد في الصفحة حاليا.. لأني أريد من المستخدم أن يحمل الملف المضغوط Jar ويستخدمه مباشرة!

إذا واجهتك مشكلة في استخدام الحزمة، أو وجدت خطأ فيها، فأرجو أن تخبرني أي إصدار تستخدم!

ربما أصدر الإصدار الرسمي قريبا، لكني يجب أن أتأكد من خلو الحزمة من الأخطاء إن وجدت!! لذى أحب رأي من جرب الحزمة!!

من الإضافات على الحزمة:

1- إضافة الفئة DynamicExpressionReader لتحل محل ExpressionReader! مع بقاء الأخير!

كما أني أحب أن أعرف الاقتراحات والانتقادات على الحزمة، وخاصة في:

1- أنواع الأخطاء التي تنتج من استخدام readOperation إن وجدت!

2- هل الدوال تعمل بصورة صحيحة؟

3- هل من السهل إضافة دوال جديدة؟

4- ما أفضل خاصية في الحزمة؟؟

5- هل من خواص أخرى تتمنون وجودها؟

أمور ما زلت أفكر فيها، وقد أحتاج النصائح، هل أفعلها أو لا أفعلها:

1- هذه الفئات Operators و Functions و Operands ... هل أجعلهم Serializable?

2-الفئة OperatorSourceImpl هل أجعلها Serializable؟

3- يمكنك إضافة دالة بنفس اسم دالة أخرى في الصندوق OperatorFactoryDB،، وستمسح الدالة القديمة التي في الصندوق بدون أن يرمي خطأ،، ما الرأي؟ هل أجعلها كما هي؟!

4- ربما أمور أخرى!

هذا ما لدي الآن....

بالتوفيق!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أحب أن أشير أني توقفت عن تطوير الحزمة، ستجد آخر الإصدارات في الصفحة، وهي الآن إصدارها 2.7 وهي ليست تجريبية،، بل هي معتمدة بإذن الله!

وقد توقفت عن اختبارها، وتطويرها! لعدم التفرغ ولضيق الوقت. لكن سأدعمها إذا ظهرت مشاكل في الاستخدام بإذن الله، ولا أتوقع هذا عموما!

أضيف إلى الحزمة حاليا الكثير من الأوامر، ومنها

! عكس جدول الصدق.

<> : لا يساوي

& : و

^ : أس

| : أو

لا أدري لكني أحس أن جميع الأوامر متوفرة الله أعلم!

إذا أحببت استعمالها فحمل ملف الجار واستورد الحزمة hussam.operations وغيرها!! كما ذكرت سابقا.

إذا أحببت أن ترى شفرتها أو تضيف عليها أو تطورها فراسلني، لا تنس أنها مشروحة!!

بالمناسبة،، استخدم الحزمة في صفحتك JSP مثلا!!!

بالتوفيق!!

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا الان شغال عليها واد تطوير بعض الاشياء. سأضع ماقمت بتغييره قريبا ان شاء الله.

لك من عندي 20 لينار ( لو كان النظام البنكي شغال طبعا ) على هذه الحزمة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بما أنك ذكرت السعر، 20 لينار، عندما كنت أصنع الحزمة وأنا في الإصدار الأول كنت أيضا أبحث عن مثلها في الشبكة ووجدت هذه:

http://www.bestcode.com/html/jbcparser.html

وتستطيع تجربتها كبريمج Applet هنا:

http://www.bestcode.com/html/jexample.html

هذه الحزمة مع شفرتها وشرحها متوفرة ب 20 دولار وليس 20 لينار! لاحظ أن الشركة وفرت حزمة لعدة لغات أخرى غير الجافا منها سي شارب.

اقرأ شرح الحزمة في الوصلات السابقة وستجد أن حزمتي مطابقة إلى حد بعيد هذه الحزمة، إلا أني حزمتي أقوى:

1- في حزمتي: اكتب المعادلة وسيتعرف على المتغيرات مباشرة ويمكنك تغيير قيمها لاحقا،، أما في حزمته فيجب عليك أولا أن تحدد المتغيرات قبل أن تعطيه المعادلة وإلا سينتج خطأ!

2- في حزمتي: اكتب (الدالة) الجديدة مباشرة وعرفها في ما بعد،، أما في حزمته فلا تستطيع كتابة دوال جديدة أصلا إلا أن تضيفها بشفرة داخل البرنامج!! وهذا فرق كبير.

3- أسلوب التعامل مع حزمتي شيئي التوجه أكثر من حزمته. تفحص الشروحات في الصفحة!

تتفوق حزمته على حزمتي في ناحية واحدة:

1- حزمته تعالج المعادلة لتجعلها أسرع في الحساب وهذا أمر مهم!! مثلا إذا كتبت :

10+5+x+6*5+y+4

فإنه يعالجها لتصبح:

15+x+30+y+4

لاحظ أنها نفس المعادلة، لكنه اختصرها لتصبح أسرع في الحساب!!

---------

لكن إليكم الخبر المفاجئ: تم تطوير الشفرة من الجذور، وانتقلنا من الإصدار الثاني إلى الإصدار الثالث وسيخرج إلى المنتدى قريبا، تم بحمدالله إدراج معالجة المعادلات لتصبح أسرع في الحساب. معالجة العملية لتصبح (موفرة) ولا تستهلك الكثير من الموارد تسمى Optimization، وإليكم بعض التجارب والنتائج:

خذ هذه الدالة المتحركة CustomFunction

f1(x)=Abs(x)*if(-4*x<> Abs(-4*-x), x*5, x*log(x))

وخذ هذه المعادلة:

1+Abs(2)+max(3, 2)/f1(x)+4+5^6+7*pi+e+9+10+x

طبعا نريد أن نحسب ناتج العملية الثانية. ونريد أن نعرف سرعة كل من الإصدار الثاني والإصدار الثالث.

التجربة: احسب ناتج العملية الثانية 10000 مرة بتغيير قيمة x من 0 إلى 10000.

النتائج:

الإصدار الثاني: أخذت 4 ثواني في المتوسط مع تكرار التجربة!! سريعة، لاحظ أن التجربة عبارة عن حساب دالة معقدة 10000 مرة!

الإصدار الثالث: أخذت في المتوسط 350 ملي ثانية! تقريبا هي أسرع من الإصدار الثاني بأكثر من 10 مرات (تزيد وتنقص حسب تعقيد المعادلة)

الأمر بسيط كل ما عليك فعله هو أن تدرج الأمر التالي عند قيامك بحساب معادلة:

public static void test3()throws MathException{
 OperationReader reader=ExpressionReader.getInstance();
 Operation o1 = reader.readOperation("40*7+20+Exp(speed)");
 //print Expression
 System.out.println (o1);
 //optimize
 o1=o1.optimize();
 //print the expression after optimization
 System.out.println (o1);
 System.out.println (o1.result());
 
}

الناتج:

Hussam Al-Mulhim ═╙╟ع ╟طعط═ع
(40.0*7.0+20.0+Exp(speed[0.0]))
(300.0+Exp(speed[0.0]))
301.0

--------------------------------

كالعادة أطلت عليكم، للتلخيص، سيصدر قريبا الإصدار الثالث!

سيكون متوفر على شكل حزمة جاهزة للاستخدام، لم يتغير في كيفية استخدام الحزمة الشيء الكبير! أنا في طور ترتيب الشفرة وتحزيمها وتجهيز العروس!!

بالمناسبة نحب أن نرى ونسمع عن من أخذ الشفرة وطورها، إذا كنت ستستخدم الحزمة في برنامجك، أحب أن تخبرني بكل تطور، ونريد أن نرى البرنامج الكامل!

الحزمة مرخصة للاستعمال الشخصي، والعلمي.

إذا كنت ستستخدم الحزمة في عمل برامج تجارية، فإن ثمن الحزمة أن تخبرني بذلك!

بالتوفيق!!

بالتوفيق!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ألف مبروك يا ابو مازن :)

و شكرا على دالة (( الصاروخ )) هاهاها

ربنا يزيدك من العلم :) :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما شاء الله أخي ابو مازن , مجهود رائع فعلا , اكثر الله من أمثالك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته،

لا أدري ماذا أقول! لقد تم بحمد الله إنتاج حزمة تحليل العبارات الرياضبة الإصدار3.0!

كثرت الإصدارات، وحتى تتضح الرؤية، أحب أن أبين بعض النقاط:

1- أنتجت كثيرا من الإصدارات التجريبية، ولكني أنتجت إصدارا رسميا واحدا وهو الإصدار 2.7!

الإصدار 2.7 من حزمة تحليل العبارات الرياضية HussamExpressionReader

2- الجيل الأول من الإصدارات 1.0 ومشتقاته كان يدعم قراءة الجمل الرياضية والدوال الثابتة والمتغيرات. وآخر إصدار كان 1.3 ولم يكن رسميا!

3- الجيل الثاني من الإصدارات 2.0 ومشتقاته دعم الدوال الحركية الغير ثابتة، CustomFunctions و DynamicFunctions كما يتبين في الردود السابقة، أصبح بالإمكان إدراج دوال جديدة دون اللجوء إلى الشفرة! وآخر إصدار كان هو 2.7 وهو آخر إصدار رسمي!

4- الإصدار 2.7 ما زال متوفر في صفحتي، وشفرته موجودة! وتستطيع تجربته! كما أن الشروحات متوفرة هنا لهذا الإصدار.

5- الوصلات في الردود السابقة قد لا تعمل لأني غيرت ترتيب صفحتي،، آسف!

--------

لقد انتقلنا الآن إلى الجيل الثالث من الحزمة 3.0 التجريبي. انتقلنا إليه بسبب تغيير في أصل الشفرة أو هندسة الفئات نفسها، وبالأخص الفئة Operation التي كان منطق الحزمة يدور حولها!

ملاحظة يمكنك مقارنة الإصدار 2.7 مع الإصدار 3.0 بالنظر إلى شروحات كل منهما:

شروحات الإصدار 2.7

شروحات الإصدار 3.0 التجريبي

يمكنك رؤية التغيير على فئة Operation هنا

إذا استخدمت الإصدارات السابقة فستلاحظ أن هذه الفئة تغيرت لتدعم الإضافات في الجيل 3!

ماهو الجيل الثالث من الحزمة؟

1- قد تحدثت في الردود السابقة عن معالجة العبارات الرياضية لتصبح أسرع في الحساب، وقد تم إضافتها بحمد الله! كما يمكنك اختيار المعالجة التلقائية أو اليدوية. (المعالجة التلقائية هي القيمة المبدئية).

2- تغيير بعض النتائج المفترضة في الإصدارات القديمة، مثل الفئة MyGroup

3- تغيير أسلوب التعامل مع الحزمة الداخلية hussam.math.operations.extra

4- تغيير علامة المساواة من (=) إلى (==) مع المحافظة على سلوكها، لتصبح العبارات المنطقية هكذا:

إذا ( س==4، 5، 6)

هذه معناها: لو كانت س تساوي 4 إذن الجواب 5 وإلا الجواب 6.

ربما تسأل الآن لماذا هذا التغيير؟؟ لماذا استعملنا == بدلا من = واحدة؟ الجواب لأني أضفت عاملا جديدة أو وظيفة جديدة للمعامل (=)!

وهي التعيين! Assingment!

5- إضافة أنواع الأقواس الأخرى: { } [ ] ( )

6- إضافة التعيين (=) بهذه تستطيع تغيير قيم المتغيرات!

كمثال أكتب هذا البرنامج .. أقصد العبارات الرياضية التالية:

س = 4 ، ص = 10 ، حسام = 100،

إذا (س == ص ، س = ص - س ، س = س+ 5 )،

حسام = حسام + س + ص ،

حسام =  جتا ( حسام )،

الجواب = إذا { 0.5 > [ حسام * 3 ] ، حسام ، س }،

الجواب،

لاحظ سير الأوامر...

سيكون ناتج الجواب يساوي 9!

ربما تسأل ماذا حصل؟؟ الذي حصل هو إمكانية كتابة برامج صغيرة رياضية!

ولتجربة هذه الخدمة، جرب هذا البريمج على صفحتي، وأخبرني برأيك؟؟

البريمج الصغير HussamMathExpressionReader Applet

انسخ البرنامج السابق إلى صفحة حقل MathNote!

واضغط على Compile!!

سأدرج شرحا في كيفية استخدام هذه الخدمات الجديدة مع بعض الصور قريبا!

بالتوفيق!!

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه صورة لبيئة التطوير،،، أقصد الواجهة التجريبية للبرنامج: (لماذا تحميل الصور في المنتدى لا يعمل بصورة جيدة)

noteMath.jpg

كما تلاحظ، اكتب ما تشاء من دوال، ومتغيرات، وأعطها قيم، وسيقوم البرنامج بإعطائك نتيجة آخر عملية رياضية!!

طبعا كما تعلمون،، إن صناعة بيئة تطوير مثل الذي في الصورة سيأخذ تقريبا نصف شهر ،،،أقصد نصف ساعة،،، ولو كنت تستعمل Netbeans في رسم الواجهة ربما يأخذ البرنامج منكم دقيقتين لا أكثر!!

كيف هذا؟؟

ببساطة إليكم شفرة بيئة التطوير،،، 70 سطر فقط متضمنة شفرة الواجهة !!

package hussam.test.operations;
import hussam.math.operations.*;
import hussam.math.operations.parser.*;
import hussam.math.operations.factory.*;
import hussam.math.operations.dataBase.*;
import hussam.math.operations.extra.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;

public class NoteCalculator extends JPanel{
HussamExpressionReader reader;
OperationGroup operation;
JTextArea area;
NoteCalculator(){
 reader=new HussamExpressionReader();
 initComponents();
}
public void setText(String x){
 area.setText(x);
}
private void initComponents(){
 area=new JTextArea();
 final JTextField field=new JTextField(30);
 final JTextField answer=new JTextField(10);
 JScrollPane pane=new JScrollPane(area);
 pane.setPreferredSize(new Dimension(200,200));
 area.setFont(new java.awt.Font("", java.awt.Font.BOLD,16));
 area.setWrapStyleWord(true);
 area.setLineWrap(true);
 JPanel panel=new JPanel();
 panel.setLayout(new BoxLayout(panel,BoxLayout.LINE_AXIS));
 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
 add(pane);
 add(panel);
 panel.add(new JLabel("Final Argument: "));
 panel.add(field);
 panel.add(new JLabel("="));
 panel.add(answer);
 panel.add(new JButton(new AbstractAction("Calculate"){
 public void actionPerformed(ActionEvent e){
   try{
   operation=reader.readOperation(area.getText());
   answer.setText(operation.result()+"");
   field.setText(operation.getOperation(operation.getOperations().size()-1).toString());
   }catch(MathException ex){
   JOptionPane.showMessageDialog(NoteCalculator.this, ex.getMessage());
   ex.printStackTrace();
   }
 }
 }));
 panel.add(new JButton(new AbstractAction("Clear Buffer"){
 public void actionPerformed(ActionEvent e){
   area.setText("");
   reader=new HussamExpressionReader();
 }
 }));
 
}
public static void main(String[]ars){
 JFrame frame=new JFrame("Hussam Math Parser Version 3");
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.add(new NoteCalculator());
 frame.pack();
 frame.setVisible(true);
}
}

هل الأمر سهل،، أم أني أبالغ؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما شاء الله عليك أخي أبو مازن ،، عمل رائع ،، يمكن بعد فترة تصنع لغة برمجة إذا استمريت هكذا ....!!!

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الظاهر أن الحزمة لن تنتهي على يدي!! لم أضع بالحسبان أن تصل إلى وصلت إليه!!

كانت نيتي بسيطة وهي عمل قارئ للدوال الرياضية البسيطة! وانتهى بها الأمر إلى إنتاج لغة برمجة شبيهة بلغة QBasic!!

قبل الدخول في هذا الموضوع.. لمن جرب الحزمة،، تستطيع إضافة دوال جديدة إما عن طريق الشفرة أو عن طريق DynamicFunctionFactory. وحتى نفهم الفرق:

1-إضافة دوال بالشفرة: كأنك تصنع دوالا جديدة لم تكن مدعومة في الحزمة من قبل,, ولتقريب المثال، كأنك تصنع برنامج باستخدام JNI! وسنسميها واجهة حسام الأصلية!

والأمر سهل، فقط اصنع فئة متطورة من الفئة Function وأضفها إلى قاعدة البيانات OperatorSourceDB! وكمثال راجع الشروحات هنا، يوجد شرح بسيط في كيفية إضافة أمر جديد وهي دالة isEven !

إضافة الدالة isEven

2- إضافة دالة متحركة: كأنك تصنع دالة جديدة بالاستناد على الدوال الجاهزة في الحزمة، لن تستطيع إضافة أوامر جديدة، لكنك ستستطيع إضافة دوال جديدة بالاستناد على الدوال الموجودة أصلا! ولتقريب المفهوم، استخدامك للغة الجافا بأوامرها عبارة عن هذا الأسلوب،، فأنت لم تصنع الفئة java.lang.Object لأن هذه تصنع من JNI، لكنك تستطيع صناعة فئة مثل Person والتي تستند إلى الفئة Object.

عموما لإضافة دالة متحركة:

new CustomFunctionFactory("strangeFunction", "description", "if(isEven(x), Exp(x), Cos(x))");

بعد هذا استخدمها :

Operation o2 = reader.readOperation ( "strangeFunction(20)");
System.out.println(o2.result());

-------------------

لاحظ أن الدالة الجديدة StrangeFunction تستعمل الدوال المسجلة في النظام مثل isEven!!!

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نرجع إلى الموضوع الجديد، وهو ( أبعاد قوة إضافة أوامر جديدة من خلال الشفرة ) أو ما يسمى بـ (واجهة حسام الأصلية)!

بالأمس، أضفت أمرا جديدا بتطوير من الفئة Function ، وأضفتها إلى OperatorFactoryDB بهذه الطريقة فقط:

OperatorFactoryDB.getInstance().  addFunction(new OperatorFactoryImpl<Function>("While", "Beta: While(boolean, operation) repeats the operation until boolean is false",2){
 public Function getNewOperator(){
   return new Function(getName()){
   public double result()throws MathException{
     checkReady(2);
     Operation o1=getOperation(0);
     Operation o2=getOperation(1);
     double v=0;
     while(o1.result()==TRUE){
     v=o2.result();
     }
     return v;
   }

   };
 }
 });//While

هل الشفرة طويلة؟،، إذا كنت مستخدما للشفرة فستظهر لك الشفرة السابقة سهلة الفهم!

أضفت الشفرة السابقة فقط، وصار بالإمكان عمل جمل تكرار while !! لا تسألني كيف وصلت إلى هذه المرحلة! لكن يبدو أني سأفتح موضوعا جديدا بعنوان لغة برمجة حسام الملحم!!

ولتجربة الدالة:

	public static void main(String[]args)throws MathException{
 ExpressionReader reader=ExpressionReader.getInstance();
 Operation o1=reader.readOperation("x=0, y=0, while (x<5, {y=y+x, x=x+1 }), y");
 System.out.println (o1.result());
}

أولا كتبنا أن x و y تساويان الصفر، بعدها دخلنا جملة التكرار وننفذها مادامت X أصغر من 10،

البرنامج يحسب مجموع القيم من 0 إلى 4، والناتج هو 10 !!

لاحظ أنني أضيف 1 على قيمة X في كل دورة!

في النهاية كتبت y لأني أريد قيمة y في النهاية!!

....

تستطيع تجربة السابق، وإن كنت مستعجلا فجربها على صفحتي يوجد برنامج تجريبي صغير يستخدم الحزمة:

http://faculty.kfupm.edu.sa/misac/hussam/P...%20ReaderV3.htm

واكتب هذه المعادلة مثلا في عدة أسطر !!!: (خذ راحتك في الكتابة ولا تنس الفواصل والأقواس إن لزم الأمر)

  
 
 x=0,y=0,
 while(x<5 ,  {
   y=y+x,
   x=x+1,
   }
 ),
 y,

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتقد حتى تكون لدينا لغة برمجة رياضية إن صح التعبير، يجب أن تتوفر قابلية طباعة النتائج متى شاء المستخدم..

لنصنع دالة Print، هذه شفرتها:

class PrintFunction extends Function{
PrintFunction(){
 super("Print");
}
public double result()throws MathException{
 for(int i=0;i<getCurrentArgumentCount();i++){
 System.out.print (getOperation(i).result()+"\t");
 }
 System.out.println ();
 return 0;
}
public Operation optimize(){
 return this;
}
}

الآن نضيف هذه الدالة إلى قاعدة البيانات:

OperatorSourceImpl source=OperatorFactoryDB.getInstance();
 source.addFunction(new OperatorFactoryImpl<Function>(
   "Print","Prints the arguments in the console.",1){
 public Function getNewOperator(){
   return new PrintFunction();
 }
 });

والآن نجرب العبارة الرياضية التالية:

OperationReader reader = ExpressionReader.getInstance();
Operation o1= reader.readOperation(" x=10, y= 20, x=x+y, y=x-y, x=x-y, print(x, y)";
//نفذ العملية:
o1.result();

ستجد الناتج هو طباعة قيم كل من X و Y على شاشة سطر الأوامر! ملاحظة العملية السابقة هي عبارة عن تبديل قيم كل من x و y وهي معروفة ويمكنك متابعة المواضيع التالية التي تناقش عملية تبديل قيمتين من غير متغير ثالث!:

مقدمة في ال Generics (الجزء الثاني) للكاتب محمد حسام المكنى بالباشمهندس

الفرق بين ByRef و ByVal : للكاتب أيوب المكنى Crazy Man

موضوع التحدي الكبير، السائل أيوب

هذا ليس نهاية المطاف، افرض أنك تريد طباعة الأرقام من 1 إلى 10 مع طباعة مضروب كل عدد في 2، ورفع الرقم أيضا إلى القوة 2:

Operation o2=reader.readOperation("x=0,while(x<10,  { x=x+1 , y= x*2 , z= x^2 , print (x,y,z)})");
o2.result();

سيطبع على شاشة سطر الأوامر هذه النتائج:

1.0     2.0     1.0
2.0     4.0     4.0
3.0     6.0     9.0
4.0     8.0     16.0
5.0     10.0    25.0
6.0     12.0    36.0
7.0     14.0    49.0
8.0     16.0    64.0
9.0     18.0    81.0
10.0    20.0    100.0

ترى ماذا ينقص هذه اللغة أيضا؟!!

للمعلومية،، تستطيع إضافة ما شئت من الأوامر، فمثلا محبي VBasic يمكنهم أن يطوروا دالة اسمها Message تطبع لهم النتائج في صيغة مربع حوار مثلا،،، كل ما في الأمر هو كتابة فئة جديدة مثل التي كتبناها لـ print مع تغيير ما يلزم لنشر الناتج في مربع الحوار!

class MessageFunction extends Function{
MessageFunction(){
 super("Message");
}
public double result()throws MathException{
 String m="";
 for(int i=0;i<getCurrentArgumentCount();i++){
 double d=getOperation(i).result();
 m=m+getOperation(i)+"\t="+d+"\n";
 }
 JOptionPane.showMessageDialog(null, "output:\n"+m);
 return 0;
}
public Operation optimize(){
 return this;
}
}

وهكذا يمكنك أن تستخدم الدالة Message بدلا من Print صديقي محب VBasic!

أرجو أن تكون هذه الأمثلة سهلة للتطبيق في مشاريعكم،،، في الرد القادم بإذن الله سأتحدث عن بعض المشاريع التي يمكن أن تستفيد من هذه الحزمة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بعض المشاريع التي من الممكن أن تستخدم الحزمة:

1- مشروع برنامج رياضي يرسم الدوال على مستوى س،ص، أو الفراغ س،ص،ع أو على أية أبعاد!!

مستخدم البرنامج سيدخل الدالة إلى برنامجك، وعلى برنامجك أن يرسم الدالة التي يريدها المستخدم، كل ما في الأمر هو أن تنشئ مصفوفة تحوي جميع قيم س، ص... وبعد هذا ترسم النقاط أو الخطوط!!

افرض مثلا أن المستخدم يريد رسم الدالة

(ص = س ^ 2 )

هذه الدالة شكلها معروف وهي مقعرة من الأسفل:

ParabolaFocus_500.gif

الصورة من صفحة MathWorld.

كيف ترسمها؟ عوض بالمعادلة السابقة ( س ) من -100 مثلا إلى موجب 100 وسجل ناتج ( ص )، بعد هذا يصبح لديك مصفوفة تحوي نقاط (س و ص)

String formula = "س ^ 2";
Operation o1 = reader.readOperation(formula);
Vector v=new Vector();
Variable x=reader.getOperatorSource().getLocalVariable("س");
 for(int i=-100; i<100;i++){
 x.setOperation(new ConstantNumber(i));
 
 v.add(new java.awt.Point(i, (int)o1.result()));
 }

والآن أصبح لديك مصفوفة تحوي نقاطا تمثل المعادلة التي أدخلها المستخدم!

بعد ذلك ارسم الدالة كما يحلو لك!!

تم تعديل بواسطه أبومازن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سأحاول دمج الميزة الاخيرة مع JFreeChart .. وسأضعها هنا.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .