برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة: تفضلوا آلة حاسبة تقرأ العمليات والحسابات الرياضية! - برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة

اذهب للمحتوى

  • (3 صفحات)
  • +
  • 1
  • 2
  • 3
  • لا يمكنك بدء موضوع جديد
  • هذا الموضوع مغلق

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

#16     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 21/09/2005 - 11:09 AM

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

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

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

http://www.bestcode....l/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

شارك هذا الموضوع

      

#17     غير متواجد   VB6-Rocket Icon

  • مشرف قسم الفيجوال بيسك سابقا
  • مجموعة المشرفين القدامى
  • مشاركات 530
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 23/09/2005 - 02:17 AM

ألف مبروك يا ابو مازن :)
و شكرا على دالة (( الصاروخ )) هاهاها
ربنا يزيدك من العلم :) :)
0

#18     غير متواجد   Asm4all Icon

  • مشرف أقسام الإلكترونيات
  • مجموعة المشرفين القدامى
  • مشاركات 1297
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 23/09/2005 - 02:49 AM

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

#19     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 26/09/2005 - 03:20 AM

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

لا أدري ماذا أقول! لقد تم بحمد الله إنتاج حزمة تحليل العبارات الرياضبة الإصدار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- تغيير علامة المساواة من (=) إلى (==) مع المحافظة على سلوكها، لتصبح العبارات المنطقية هكذا:

Quote

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

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

ربما تسأل الآن لماذا هذا التغيير؟؟ لماذا استعملنا == بدلا من = واحدة؟ الجواب لأني أضفت عاملا جديدة أو وظيفة جديدة للمعامل (=)!
وهي التعيين! Assingment!
5- إضافة أنواع الأقواس الأخرى: { } [ ] ( )
6- إضافة التعيين (=) بهذه تستطيع تغيير قيم المتغيرات!
كمثال أكتب هذا البرنامج .. أقصد العبارات الرياضية التالية:

Quote

س = 4 ، ص = 10 ، حسام = 100،
إذا (س == ص ، س = ص - س ، س = س+ 5 )،
حسام = حسام + س + ص ،

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

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

لاحظ سير الأوامر...
سيكون ناتج الجواب يساوي 9!

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

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

تم تعديل هذه المشاركة بواسطةأبومازن: 26/09/2005 - 03:47 AM

0

#20     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 26/09/2005 - 03:41 AM

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

Posted Image

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

طبعا كما تعلمون،، إن صناعة بيئة تطوير مثل الذي في الصورة سيأخذ تقريبا نصف شهر ،،،أقصد نصف ساعة،،، ولو كنت تستعمل 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

#21     غير متواجد   OMLX Icon

  • مشرف قسم Linux & UNIX
  • مجموعة المشرفون
  • مشاركات 696
  • التقييم 33
  • النقاط المتوفرة 8.60
  • 2.60
    النقاط المحصلة
++

تم الارسال 26/09/2005 - 10:14 AM

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


تحياتي
0

#22     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 26/09/2005 - 07:55 PM

الظاهر أن الحزمة لن تنتهي على يدي!! لم أضع بالحسبان أن تصل إلى وصلت إليه!!
كانت نيتي بسيطة وهي عمل قارئ للدوال الرياضية البسيطة! وانتهى بها الأمر إلى إنتاج لغة برمجة شبيهة بلغة 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!!!

تم تعديل هذه المشاركة بواسطةأبومازن: 27/09/2005 - 05:59 AM

0

#23     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 26/09/2005 - 08:15 PM

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

بالأمس، أضفت أمرا جديدا بتطوير من الفئة 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,

تم تعديل هذه المشاركة بواسطةأبومازن: 27/09/2005 - 02:18 AM

0

#24     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 27/09/2005 - 03:17 AM

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

لنصنع دالة 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

#25     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 27/09/2005 - 03:36 AM

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

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

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

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

Quote

(ص = س ^ 2 )

هذه الدالة شكلها معروف وهي مقعرة من الأسفل:
Posted Image
الصورة من صفحة 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()));
  }

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

تم تعديل هذه المشاركة بواسطةأبومازن: 27/09/2005 - 03:46 AM

0

#26     غير متواجد   فيصل الردادي Icon

  • عضو شرف
  • مجموعة أعضاء الشرف
  • مشاركات 325
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 28/09/2005 - 02:37 AM

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

#27     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 30/09/2005 - 02:54 AM

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

استخدامات أخرى للحزمة:
افرض أن عندك برنامج محاسبي،، افرض أن لديك الحساب التالي في برنامجك:

افترض أن لديك هذه الواجهة للحساب
interface Account{
	double getBalance();
	double getBalance(int startYear, int endYear);
	String getName();
}

لاحظ أن هذه تجريبية، عليك أن تصنع واحدة تعمل بشكل جيد تناسب احتياجك! 
class AccountImpl implements Account{
	String name;
	double balance;
	AccountImpl(String n, double balance){
  this.name=n;
  this.balance=balance;
	}
	public double getBalance(){return balance;}
	public double getBalance(int start, int end){return balance/(end-start);}
	public String getName(){return name;}
}


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

class AccountFunctionFactory extends OperatorFactoryImpl<Function>{
	Account account;
	public AccountFunctionFactory(Account a){
  super(a.getName(), a.getName()+" Function Factory.",2);
  account=a;
	}
	public Function getNewOperator(){
  return new AccountFunction();
	}
	private class AccountFunction extends Function{
  AccountFunction(){
 	 super(account.getName());
  }
  public double result()throws MathException{
 	 if(getCurrentArgumentCount()==0){
    return account.getBalance();
 	 }
 	 //this will throw an Exception if 
 	 //current argument count is less than 2!
 	 checkReady(2);
 	 return account.getBalance(
    (int)getOperation(0).result(), 
    (int)getOperation(1).result());

  }
	}
}


بعد هذا نضيف الدوال الجديدة ونضيفها إلى قاعدة البيانات!
    public static List<Account>getAllAccounts(){
نصنع حسابات وهمية للتجربة
   	 List<Account>accounts=new Vector<Account>();
   	 for(int i=0;i<10;i++){
      accounts.add(new AccountImpl("Account"+i, i*1000));
   	 }
   	 accounts.add(new AccountImpl("Cash", 2000));
   	 accounts.add(new AccountImpl("Capital", 4000));
   	 return accounts;
    }
    public static void createFunctionFactories(){
نحضر جميع الحسابات
   	 List<Account>accounts=getAllAccounts();
   	 
نصنع مصنع دوال لكل حساب عندنا 12 حساب!
   	 for(Account a:accounts){
      OperatorFactoryDB.getInstance().addFunction(
        new AccountFunctionFactory(a));
   	 }
   	 
    }


بعد هذا نجرب برنامجنا السعيد!!:

    public static void testAccounts()throws MathException{
   	 createFunctionFactories();
   	 OperationReader reader=ExpressionReader.getInstance();
   	 Operation o1=reader.readOperation("Account1()+Account2()");
   	 System.out.println (o1.result());
   	 o1=reader.readOperation("Cash(10, 13)/Capital()");
   	 System.out.println (o1.result());

    }

الجواب:
3000
.16

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

وهذه شفرة كاملة!!

ملف مرفق(ملفات)


0

#28     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 03/10/2005 - 01:29 PM

انظروا إلى هذا المخطط...

Posted Image

إنها تمثل المعادلة التالية:
z=Rocket(x,y),p=z+min(x,z), p

حيث x و y هما المتغيران الرئيسيان،، و p هو ناتج العملية.
حيث الدالة Rocket() =
if(size==1, 2 , Rocket(floor(position/2),floor(size/2)) - size*(position%2-1))


كيف صنعنا هذه الرسمة بهذه الصورة؟؟؟ استعملت JFreeChart
مع الشكر والتقدير للأخ فيصل الردادي على أفكاره!!

هذه شفرة البرنامج الذي يظهر لك مخطط باستعمال : (HussamExpressionReader ، JFreeChat)

import org.jfree.chart.*;
import org.jfree.data.xy.*;
import org.jfree.chart.plot.*;
import java.io.*;
import javax.swing.*;
import java.awt.image.*;
import hussam.math.operations.*;
import hussam.math.operations.factory.*;
import hussam.math.operations.parser.*;
import hussam.math.operations.dataBase.*;
import hussam.math.operations.extra.*;
public class FreeChart{
	public static void main(String[]args)throws MathException{
  new CustomFunctionFactory(OperatorFactoryDB.getInstance(),"Rocket",
       	 "test cusotm function", "if(size==1, 2 , Rocket(floor(position/2),floor(size/2)) - size*(position%2-1))");  
  OperationReader reader=ExpressionReader.getInstance();
        Operation o1=reader.readOperation("z=Rocket(x,y),p=z+min(x,z), p");
  Variable x=reader.getOperatorSource().getLocalVariable("x");
  Variable y=reader.getOperatorSource().getLocalVariable("y");
  XYSeries series = new XYSeries("Average Size");
  y.setOperation(new ConstantNumber(64));
  for(double i=0;i<64;i++){
 	 x.setOperation(new ConstantNumber(i));
 	 double result=o1.result();
 	 series.add(i,result);
 	 System.out.println (i+"\t"+result);
  }
  XYDataset xyDataset = new XYSeriesCollection(series);
  
  JFreeChart chart = ChartFactory.createXYAreaChart
    ("Sample XY	Chart",  //	Title
       "Height",     // X-Axis	label
       "Weight",     // Y-Axis	label
       xyDataset,    // Dataset
       PlotOrientation.VERTICAL,
       false,
       true,
       true      // Show legend
      );	
      
  BufferedImage image = chart.createBufferedImage(400,400);

  JLabel lblChart = new JLabel();
  lblChart.setIcon(new ImageIcon(image));
  
  JFrame frame=new JFrame();
  frame.add(lblChart);
  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
  frame.setLocationRelativeTo(null);
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}


الذي يلزمك الآن هو أن تضيف إلى JFrame حقل كلمات JTextArea حتى يأخذ معادلة ويرسمها مباشرة!!


أعتقد أني سأثبت الإصدار الثالث على ما هو عليه!!
بالتوفيق،،
0

#29     غير متواجد   yadoo86 Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 301
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 03/10/2005 - 09:38 PM

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

#30     غير متواجد   رامي العيساوي Icon

  • مشرف قسم الجافا سابقا
  • مجموعة المشرفين القدامى
  • مشاركات 3844
  • التقييم 6
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 10/10/2005 - 09:11 PM

يمكن ما احد يصدق بس هذه اول مرة ادخل على الموضوع هذا.. ربما من العنوان لانه غير مشوق ابداً " آلة حاسبة" و لكنني دخلت عليه من توقيعك عندما كتبت جديد لغة برمجة

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

عندما انتهي من النظام البنكي سوف انشر الحزم المستخدمة فيه و انت عليك تعملها doc لان هذه اكره خطوة علي ههههه :)
0

#31     غير متواجد   OMLX Icon

  • مشرف قسم Linux & UNIX
  • مجموعة المشرفون
  • مشاركات 696
  • التقييم 33
  • النقاط المتوفرة 8.60
  • 2.60
    النقاط المحصلة
++

تم الارسال 10/10/2005 - 09:19 PM

أخي أبو مازن أكمل المشوار ، واصنع لغة برمجة للأطفال بالجافا ،، مثل ما طرح في قسم المقالات لغة برمجة للأطفال بالسي شارب،،، وتكون بالعربي ،، سيكون لك السبق في هذا المجال...
0

#32     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 11/10/2005 - 05:41 AM

Quote

يمكن ما احد يصدق بس هذه اول مرة ادخل على الموضوع هذا.. ربما من العنوان لانه غير مشوق ابداً " آلة حاسبة" و لكنني دخلت عليه من توقيعك عندما كتبت جديد لغة برمجة


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

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

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

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

هل تريد أن تطور JTable في برنامجك لتصبح مثل Excel SpreadSheet؟؟
لم أجرب ولكني أتصور التالي:
1- اصنع TableModel معين يناسب تطبيقك،، يحفظ فيه المعادلات على شكل String! ويخرج لنا النتائج على صيغة أرقام:
http://java.sun.com/j2se/1.4.2/docs/api/ja...TableModel.html
سوف تستعمل setValueAt، و getValueAt
2- اصنع Function أو دالة جديدة اسمها Cell أو خلية واجعل هذه الدالة تأخذ متغيرين تمثل العمود والصف، (رقم العمود ورقم الصف يعطي لنا عنوان الخلية)
كمثال: خلية (4،3) ستأخذ القيمة من TableModel الذي صنعته في ( 1 )
فقط!!!!
وبعد هذا سيمكنك كتابة مثل هذه المعادلة في الخلية (1،2) مثلا:

Quote

جتا (الخلية (1،1) ) *10


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


وليس هذا فقط، تستطيع كتابة البرامج البسيطة داخل كل خلية!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! وهذه لوحدها شيء غير موجود في Excel!!!

إذا أردت أن تصنع مثل هذا الجدول وواجهتك صعوبة فلا تتردد في السؤال!

بالتوفيق!!
0

#33     غير متواجد   علاء الدين عبدالله ياسين Icon

  • عضو
  • مجموعة اعضاء
  • مشاركات 125
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 11/10/2005 - 07:37 AM

السلام عليكم و رحمة الله وبركاته
أخى أبومازن لا أدرى ماذا أقول لك .... :(
و لكن إعلم أن النبى صلى الله عليه و سلم قال "خير الناس أنفعهم للناس" جعلك الله من خيار الناس و نفع بك المسلمين اللهم امين :D
0

#34     غير متواجد   حسام الملحم Icon

  • خبير جافا
  • مجموعة الخبراء المعتمدون
  • مشاركات 1710
  • التقييم 3
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 13/10/2005 - 03:01 AM

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

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

جربت تنفيذها ووضعها في البريمج على المتصفح،، وهذه صورة بسيطة لهذا الجدول الرياضي!
Posted Image
شفرة البرنامج لا تتعدى 100 سطر... طبعا الأمور الجمالية زادت من حجم الشفرة قليلا!

لتجربة البريمج اذهب من هنا:
البريمج السعيد
اضغط على زر New Formula Spread Sheet
وسيظهر لك الجدول المراد..
تستطيع كتابة ما يحلو لك من معادلات وأرقام ومتغيرات ودوال داخل كل خلية من خلايا الجدول
وليس هذا فقط،، أضفت دالة جديدة اسمها (خلية) بالعربي أو Cell بالأجنبي تأخذ قيمتين بهما تحدد خلية معينة في الشاشة! الدالة تأخذ رقم الصف ورقم العمود.
مثلا إذا كان في الخلية (0،0) القيمة 20.. تستطيع أن تكتب في خلية أخرى المعادلة التالية:

Quote

أكبر ( خلية (0،0) ، 10 )


طبعا الناتج هو 20!
تستطيع أن تكتب جمل (إذا) و (مادام) في الخلايا.. باستعمال هذه المتغيرات تستطيع أن أن تصنع دالة تجمع لك صفا كاملا من الخلايا مثلا ووضع الناتج في خلية معينة،،
لاحظ أن هذه الجمل if while وغيرها تتيح لك التحكم بما تريد!!
يتفوق هذا الجدول البسيط على Excel بإمكانية تعريف متغيرات تصل إليها جميع الخلايا بسهولة!!!
طبعا تستطيع تطوير الشفرة لتجعل الجدول يتقبل أوامر أخرى سريعا مثل Sum Count وغيرها من أوامر Excel المعروفة.

أحلى مافي الموضوع، أنك إذا كتبت المعادلة الخلية تظهر الناتج، وإذا أردت تحرير المعادلة يختفي الناتج وتظهر لك المعادلة كما في Excel!!
بالمناسبة الشفرة تجدها في الملف أو الفئة FormulaSpreadSheet.java وتجدها في صفحتي!!
------
نستفيد من هذا الموضوع كيفية استخدام حزمة معالج العبارات الرياضية في تطبيقات مختلفة!!
0

#35     غير متواجد   MMSs Icon

  • عضو فعال
  • مجموعة اعضاء
  • مشاركات 320
  • التقييم 0
  • النقاط المتوفرة 6.00
  • 0.00
    النقاط المحصلة
++

تم الارسال 13/10/2005 - 03:32 AM

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

إذاً ماذا تنتظر، تابع إلى برنامج ينافس Excel، لم يعد هناك شيء صعب في Excel فأصعب ما فيه هو الدالات، وقد حليتها.
0

شارك هذا الموضوع


  • (3 صفحات)
  • +
  • 1
  • 2
  • 3
  • لا يمكنك بدء موضوع جديد
  • هذا الموضوع مغلق

( 1 ) عضو يشاهد هذا الموضوع
( 0 ) الأعضاء, ( 1 ) الزوار, ( 0 ) عضو بدخول مخفي




لإفضل مشاهدة للمنتدى إستخدم مستعرض فايرفوكس
Free PageRank Checker

 الآن ... إستايل خاص لمن يملك هاتف iPhone  ... لتنزيل البرنامج  اضغط هنا