• 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

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

استخدامات أخرى للحزمة:

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

افترض أن لديك هذه الواجهة للحساب
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

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

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

OperationsTest.zip

0

شارك هذا الرد


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

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

03_10_05_03_23_14_1128334994RocketChart.Gif

إنها تمثل المعادلة التالية:

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

شارك هذا الرد


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

يا سلام عليك يا أبو مازن هذة هو برنامج ولا بلاش

بس قول لي متى نصل الى هذا مستوى , ها ها ها ها ها ها

يارب نشوف منك برامج أحسن و أحسن

0

شارك هذا الرد


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

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

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

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

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

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

أذكر أن النوم غادر جفوني عندما (بغير القصد) أضفت ما يقل عن 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) مثلا:

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

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

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

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

بالتوفيق!!

0

شارك هذا الرد


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

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

أخى أبومازن لا أدرى ماذا أقول لك .... :(

و لكن إعلم أن النبى صلى الله عليه و سلم قال "خير الناس أنفعهم للناس" جعلك الله من خيار الناس و نفع بك المسلمين اللهم امين :D

0

شارك هذا الرد


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

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

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

جربت تنفيذها ووضعها في البريمج على المتصفح،، وهذه صورة بسيطة لهذا الجدول الرياضي!

12_10_05_04_44_00_1129160640Spread_Sheet.GIF

شفرة البرنامج لا تتعدى 100 سطر... طبعا الأمور الجمالية زادت من حجم الشفرة قليلا!

لتجربة البريمج اذهب من هنا:

البريمج السعيد

اضغط على زر New Formula Spread Sheet

وسيظهر لك الجدول المراد..

تستطيع كتابة ما يحلو لك من معادلات وأرقام ومتغيرات ودوال داخل كل خلية من خلايا الجدول

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

مثلا إذا كان في الخلية (0،0) القيمة 20.. تستطيع أن تكتب في خلية أخرى المعادلة التالية:

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

طبعا الناتج هو 20!

تستطيع أن تكتب جمل (إذا) و (مادام) في الخلايا.. باستعمال هذه المتغيرات تستطيع أن أن تصنع دالة تجمع لك صفا كاملا من الخلايا مثلا ووضع الناتج في خلية معينة،،

لاحظ أن هذه الجمل if while وغيرها تتيح لك التحكم بما تريد!!

يتفوق هذا الجدول البسيط على Excel بإمكانية تعريف متغيرات تصل إليها جميع الخلايا بسهولة!!!

طبعا تستطيع تطوير الشفرة لتجعل الجدول يتقبل أوامر أخرى سريعا مثل Sum Count وغيرها من أوامر Excel المعروفة.

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

بالمناسبة الشفرة تجدها في الملف أو الفئة FormulaSpreadSheet.java وتجدها في صفحتي!!

------

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

0

شارك هذا الرد


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

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

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

0

شارك هذا الرد


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

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

ولا أحب تصميم الواجهات كثيرا...

نحب أن نرى أي تطبيق بسيط يستعمل هذه الحزمة!

أعيد وأذكر أن الاستعمال سهل جدا:

1- استورد المكتبة import hussam.math.operations.* وأخواتها

2- استعمل قارئ للدوال:

OperationReader reader=ExpressionReader.getInstance();

اقرأ دالة معينة:

Operation o1 = reader.readOperation(textField.getText());

اكتب الناتج في حقل آخر:

textField2.setText(o1.result()+"");

الموضوع سهل جدا... لمزيد من الأمثلة راجع الردود السابقة، أو الأمثلة في صفحتي، أو الشفرات الموجودة في صفحتي ، أو الأمثلة والشرح الموجود في الشروحات documetation، أو أو أو،، أو اسأل هنا،، أو في موضوع جديد!!

-----

بالتوفيق!!

0

شارك هذا الرد


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

اقترح عليك عنوان جديد و هو

" المعالج العربي للعمليات الرياضية "

فاذا وافقت سوف اعدله لك في الحال

0

شارك هذا الرد


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

غيره وتوكل على الله،،

محلل العبارات الرياضية.

أو محلل العبارات الرياضية العربية.

أو المعالج العربي للتحليل الرياضي!

أو محلل ومعالج العبارات الرياضية...

اختر أيها تريد... كلها مناسبة

0

شارك هذا الرد


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

بعد أن أضيفت جمل إذا و مادام،، لم تنقص الحزمة إلا إضافة العمليات الداخلية التي قد تسمى بـ Subs, Functions, Methods, الخ...

الإصدار رقم 3.5

كنا نعرف المتغير بهذه الطريقة:

x=10

الآن نستطيع أن نعرف دالة بهذه الطريقة:

my pass word function () = if(x==1234, 10000, 0)

ونستعمل الدالة هكذا:

money = my pass word function(1234)

البرنامج الكامل هو هذا:

my pass word function () = if(x==1234, 10000, 0),
money = my pass word function(1234)

بهذا أصبحنا نستطيع أن ننادي على شفرة صنعناها لحساب شيء معين متى أردنا وعدة مرات بسرعة فائقة.

جاءتني هذه الفكرة من مشاركة هاني الأتاسي في موضوع شغل مخك 29

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

Math Applet

واضغط على new Formula Note Sheet

واضغط على المثال 6 أو Example 6.

اضغط على Calcualte.

افتح Java Console حتى ترى خرج البرنامج السابق!!

سوف تجد هذا البرنامج السعيد:

DynamicToBinary()={
col=1,result=0,baqi=amount,
while(baqi<>0, {
mod=baqi%2,
baqi=floor(baqi/2),
result=result + mod *col,
col=col*10,
}
),result
},

x=0,while(x<64,{
print(x,DynamicToBinary(x)),
x=x+1
}
),

البرنامج السابق يطبع الأرقام الثنائية من 0 إلى 63، لاحظ أني عرفت دالة ترجع لي الرقم الثنائي. وبعد هذا استعملت الدالة لطباعة الأرقام الثنائية من 0 إلى 63!!

الدالة DunamicToBinary تأخذ متغير واحد. وهو يتمثل في amount

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

الآن اللغة تحوي جمل الشرط والتكرار والعمليات أو الدوال الداخلية ٍSub Functions!!

0

شارك هذا الرد


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

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

لم أقرأ الكود بشكل مفصل لكني لاحظت أن المكتبة كبيرة جدا. الكود الذي كتبته بالسي# يقوم بعمل مشابه ولكن حجمه أقل بكثير .. ماهي البنية الأساسية في الخوازمية هل استخدمت التعاودية ، parse tree وغيرها ام استخدمت شئ آخر .

0

شارك هذا الرد


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

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

بالنسبة للطريقة التي استخدمتها:

1- بناء المنطق الحسابي: وتجد هذا في حزمة hussam.math.operations.

فكل شيء عبارة عن Operation

فال Operation عبارة عن شيء يعطي لنا قيمة result، فال الرقم ConstantNumber عبارة عن Operation و المتغير Variable عبارة عن Operation و Function عبارة عن Operation والإشارة الحسابية + - * عبارة عن Operation وغيرها من الأشياء، تصفح الحزمة المنطقية في الوصلة الأولى.

حتى أعطي مثالا: الإشارة + أو - أو * عبارة عن Operands و هي طبعا Operation!

Operand plus = OperatorFactoryDB.getOperandFactory("+").getNewOperand();
plus.setPrevious(new ConstantNumber(5));
Variable x=new Variable("x");
x.setOperation(new ConstantNumber(10);
plus.setNext(x);
System.out.println(plus.result());

الجواب 15.

لاحظ أن الفئات المستخدمة في المثال السابق كلها Operation! ولاحظ أيضا أن هذا يمثل منطق الحساب الذي اتبعته، أضف إلى ذلك أن تحليل العبارة الرياضية لا تتم هنا!

2- بناء محلل العبارات الرياضية وتجد هذا في الحزمة: hussam.math.operations.parser

في هذه الحزمة فئات مسؤولة عن تحليل العبارات الرياضية وتحويلها إلى Operations أو إلى منطق البرنامج أو كما تسميها شجرة التحليل أو Parse Tree.

يكفيك مثلا أن تقرأ HussamExpressionReader الذي أطمع أن تنظر إليه وتعطيني نصائحك، فهو يقوم بقراءة العبارة الرياضية وتحويلها إلى Operation يمكن من خلالها أن تعرف الناتج من خلال result.

الشفرة متاحة، هذه الفئة هي الإصدار الخامس من سلسلة ExpressionReader الذي وظيفته الترجمة أو Compile! ولا زلت أرى إمكانية تطويرها مع علمي أنه توجد طرق سريعة مثل postfix وغيرها التي ليس لدي علم بها!

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

3- توجد حزم أخرى مثل hussam.math.operations.dataBase

و hussam.math.operations.factory

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

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

4- حزمة hussam.math.operations.extra

وظيفتها صنع الإضافات في اللغة! مثلا، تحوي فئات مسؤولة عن صنع قواعد بيانات متحركة أو ديناميكية، تصنع مصانع للدوال الجديدة، وتحوي مثلا فئات تسهل إمكانية إدراج دوال جديدة في اللغة دون الحاجة لاستعمال الشفرة!

أعتقد أن البريمج في صفحتي يبين هذه الأمور.

الخلاصة:

1-الحزمة كبيرة لأني قصدت فيها التسهيل على المستخدم بأنه يستطيع إضافة الدوال الجديدة والإشارات الجديدة في الحزمة دون أدنى صعوبة! ليس هذا فقط، المستخدم يستطيع أن يصمم ExpressionReader جديد ويضيفها إلى الحزمة إذا رأى أن المترجم HussamExpressionReader بطيء وفي نفس الوقت يستفيد من قدرات الحزمة الأخرى!

2- أعتقد صنع محلل بسيط ستكون أصغر من حجم هذه الحزمة بشكل كبير كما في مكتبتك أو مكتبة Asm4Allِ

3- تصميم الإصدار الأول من الحزمة بهذه الطريقة من البداية جعل إضافة دوال مثل while وغيرها لا تأخذ أكثر من 20 سطر! فهي ليست إلا فئة ترث من فئة Function وتقوم بالمطلوب! طبعا لم أتوقع هذا! لاحظ أني لم أغير في المترجم HussamExpressionReader حرفا واحدا! هذه هي السهولة التي أتكلم عنها في سهولة إضافة ما تريد، مثل دالة print ، و دالة message لمحبي VB ، ودوال عجبية أخرى!! حسب ما يقتضيه برنامجك!

4- أضف إلى ذلك أن الحزمة تأخذ في عين الاعتبار عدة عبارات رياضية لتقرأها مرة واحدة، وتأخذ في الاعتبار (حدود التعريف) variable scope! وأيضا Function Scope،

لتوضيح المثال تستطيع إضافة Global Variable و Local Variable و Global Function و LocalFunction (لاحظ أنك تستطيع الذهاب إلى Local Local Function وهكذا!

انظر إلى الحزمة hussam.math.operations.dataBase فهي التي تفي بهذا الغرض!

5- تم استعمال طرق التصميم الآتية: وهذا من أهم الأمور بالنسبة لي!

- Decorator وخاصة في حزمة hussam.math.operations ، يمكنك ملاحظة ذلك في طرق تصميم الفئات هناك!

- Singlton وتجد هذا في فئة hussam.math.operations.dataBase.OperatorFactoryDB وهي تمثل مصنع الدوال الأساسية! ولا يوجد إلا مصنعا أساسيا واحدا!

- Proxy وتجد هذا في حزمة hussam.math.operations وتتمثل فائدته في إخفاء الأنواع!

- Factory ويتجلى بوضوح في الحزمة hussam.math.operations.factory و hussam.math.operations.parser

وربما أشياء أخرى!

6- الحزمة الإصدار الثالث تدعم الOptimization فهي تختصر الشفرة الرياضية المكتوبة بما يناسبها! مثلا إذا كانت دالة IF دائما صائبة فهي تمسحها وتستبدل الدالة برمتها بالعبارة التي ستنفذ دائما!

7- عند التنفيذ الحزمة تقوم بحساب الأشياء المهمة مثلا في دالة IF إذا كانت صائبة فهي لا تحسب الحالة الأخرى!

8- تستطيع تغيير طريقة كتابة هذه اللغة بسهولة شديدة، مثلا أنا أستخدم الأقواس للدلالة على العبارات المجتمعة لكن أحبابنا VB مثلا يحبون بدلا من الأقواس Startو End مثلا، أو مبرمجو Pascal!

كل ما في الأمر أن تعطي المترجم ExpressionReader اللغة التي تريد استعمالها:

ExpressionReader reader=ExpressionReader.getInstance(new OperationsParser());

طبعا اصنع فئة جديدة ترث من OperationsParser وهكذا صممت syntax جديد للغتك الجديدة!!

9- الحزمة تصطاد الأخطاء الكتابية syntax بشكل بسيط،، وتصطاد المنطقية كذلك، مثل التكرار اللانهائي!!

10 - في صفحتي حزمتين: حزمة HussamExpressionReader وهو المكتبة الأساسية التي فيها كل ما تحتاجه،

وحزمة OperationsTestGui وهي برنامج بسيط في صفحتي يستخدم قدرات الحزمة!

أحب أن تقرأ الشفرة وتفيدني لأني متطلع للمزيد من المعلومات! أتطلع لمن يصدر ExpressionReader جديد!

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

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

شارك هذا الرد


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

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

الكود الذي قمت بكتابته ايضا OOP ولكنه أقصر ، أنا استخدمت ال Regular Expression في سي# والscanner عندي عبارة عن صفحتين كود يمكن . بالنسبة للparser فأنا استخدمت ال top down parsing وهو يتم برمجته باستخدم recursion calls وهو أيضا كود صغير . ال top down parsing تبدأ بالافتراض أن مالدينا هو مثلا expression ومن ثم تبدأ بالتحليل للأسفل فتفحص هل هي عبارة عن addition expression والأخيرة قد تكون عبارة عن multiplication expression + addition expression و ال multiplication قد تكون power * multiplication exprssion و هكذا حتى تصل إلى Literal .. بكتابتك مجموعة من الأكواد التعاودية تنتهي من عملية ال expression parsing .

طبعا إذا كنت تصمم لغة كاملة ك pascal او C فالparser ليس بهذه السهولة ويمكن تصميمه يدويا ك top down parsing مع backtracking او يمكن استخدام yacc التي تنتج لك كود جاهز وهي تستخدم bottom top parsing لأنه اسهل للانتاج بواسطة parser generator tools ..

0

شارك هذا الرد


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

ربما تكون هذه المداخلة في متأخرة أو في غير وقتها، ولكن هل علمت أخي أبو مازن بالـ JavaCC أو Java Compiler Compiler.

أنا بصراحة ليس لي به علم جيد، ولكن حد علمي أنه برنامج Java يمكن عن طريقه تعريف قواعد كتابة لغة والتعابير وتعريف الكلمات المفتاحية فيها، وهو يقوم بتوليد مترجم للغة.

للاطلاع على المزيد من المعلومات بإمكانك زيارة موقع JavaCC.

0

شارك هذا الرد


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

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

حاليا، يقوم ExpressionReader بعملية بطيئة كما أراها :

1- يحلل الجملة ويفككها إلى مصفوفة من الكلمات.

2- يقلب الكلمات إلى عمليات Operations مثلا إذا وجد رقما يقلبه إلى ConstantNumber وإذا وجد إشارة + يقلبه إلى Operand، أصبح لدينا مصفوفة من العمليات!

3- بعد ذلك يجمع العمليات مع الأخذ بالاعتبار قوة العملية، العملية المتبعة هي عمليات تنادي نفسها (هل هذه العمليات اسمها عمليات تعاودية؟)

{

المجموعات أو الأقواس أولا

الدوال ثانيا، والإشارات ثالثا!

} هذه أمور تنادي نفسها، مثلا نأخذ أول مجموعة، فنبحث عن المجموعات بداخلها، بعد ذلك نبحث عن الدوال وفي الدالة نبحث عن مجموعة وبعدها نبحث عن دوال وعن إشارات وهكذا شجرة في البحث، recursion.

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

هذه الشفرة أخذت مني 400 سطر تقريبا! كما أذكر!! والمشكلة أنها ليست ممتازة في نظري! لكني تجنبت تطويرها لأنها حاليا تعمل بصورة ممتازة، وأخذت في تطوير الأشياء الأهم في الحزمة التي من أجلها صنعت!

أما وقت التنفيذ فأراها جيدة والله أعلم!

سأنتظر تحليلك بفارغ الصبر!

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

شارك هذا الرد


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

برأي الparser الذي صنعته بطيئ فليس من الداعي قرائة السلسلة كل مرة حتى ولو كنت تختصرها .. وانصحك بقرائة شرح top-down parser في هذه الوصلة

http://www.idi.ntnu.no/~holager/KompTek/del07.pdf

وأرفقت الparser الذي عملته لبرنامجي من أجل أن يساعدك .. البارسر لدي حوالي 160 سطر..

Parser.cs.txt

0

شارك هذا الرد


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

الله يعطيك ألف عافية على هذه المساعدة الذهبية!!

ملفك يحوي تقريبا 126 سطرا بعد تنقيح الأقواس على أسلوب الكتابة الذي أتبعه!

حاليا صنعت الإصدار السابع من سلسلة ExpressionReader باسم HaniExpressionReader،،

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

لقد اختصرت في شفرتك وأصبحت تقريبا 100 سطر ،، فعلت هذا بحذف الطرق المكررة مثل parseAddtion و parseMultiplication و parsePower وجعلته في طريقة واحدة تسمى parseOperands، وهذه الأخيرة تعمل تحليلا للعمليات المنطقية أيضا!

سأحاول عمل اختبار فرق سرعة HussamExpressionReader و HaniExpressionReader وأضع النتائج هنا بإذن الله،

أرجو أن تساعدني في هذه الجزئية من البرنامج وهي عملية تجزئة الجملة إلى مصفوفة من الكلمات:

لم أستخدم regular expreesions لقراءة الجملة،، كما أني أريد معرفة كيف استخدمت Scanner في قراءة الجملة،، ستلاحظ في شفرتي الطريقة getSubStringPositions وهذه لوحدها 40 سطر!! وظيفة هذه الطريقة هي تقسيم الجملة إلى كلمات وأرقام وإشارات ووضعها في مصفوفة، أرجو المساعدة في هذا الأمر!

هذه هي الشفرة التي استعملتها، ..

Copy of HaniExpressionReader.java.txt

0

شارك هذا الرد


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

إليكم نتائج امتحان سرعة كل من HussamExpressionReader و HaniExpressionReader، في تحليل الجمل الرياضية،، سوف تجد كلا الملفين في هذه الحزمة hussam.math.operations.parser،،

هذا عرض للنتائج:

Hussam Al-Mulhim ═╙╟ع ╟طعط═ع    Math Parser     3.5
Testing the compilation speed between Hani Expression Reader & Hussam Expression Reader.
We will compile a given expression 10000 times using both readers 10 times and will display the results.
results are in miliseconds.
Please Enter an Expression to parse:
x=40, y=10, while(x<60, { y=y*log(x)}), y^2*3/5-8*9-57
x=40,
Hussam Time     Hani Time       Percentage difference
912             300             3.04
581             270             2.151851851851852
561             301             1.8637873754152825
600             261             2.2988505747126435
591             250             2.364
591             270             2.188888888888889
581             260             2.2346153846153847
571             271             2.107011070110701
581             270             2.151851851851852
601             270             2.225925925925926
Test Finieshed
Press any key to continue...

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

إليكم برنامج الامتحان:

import hussam.math.operations.*;
import hussam.math.operations.parser.*;
import hussam.math.operations.dataBase.*;
import hussam.math.operations.factory.*;
import hussam.math.operations.extra.*;
import java.util.*;
public class test{
public static void main(String []args)throws Exception{
 OperatorFactoryDB.getInstance();
 String exp="Abs(50*90-1400^2+74+Max(40,20))";
 System.out.println ("Testing the compilation speed between Hani Expression Reader & Hussam Expression Reader.");
 System.out.println ("We will compile a given expression 10000 times using both readers 10 times and will display the results.");
 System.out.println ("results are in miliseconds.");
 System.out.println ("Please Enter an Expression to parse:");
 Scanner scanner=new Scanner(System.in);
 exp=scanner.next();
 System.out.println (exp);
 System.out.println ("Hussam Time\tHani Time\tPercentage difference");
 for(int i=0;i<10;i++){
 long hussam=test(new HussamExpressionReader(),exp,10000);
 long hani=test(new HaniExpressionReader(),exp,10000);
 System.out.print (hussam);
 System.out.print ("\t\t"+hani);
 System.out.println ("\t\t"+(double)hussam/hani);
 }
 System.out.println ("Test Finieshed");
}
public static long test(OperationReader reader, String exp, int times)throws MathException{
 Operation o1=null;
 long start=System.currentTimeMillis();
 for(int i=0;i<times;i++){
 o1=reader.readOperation(exp);
 }
 long time= System.currentTimeMillis()-start;
 return time;
}
}

أضيف أن كلا الفئتين ما زالتا تستخدم نفس الطريقة لتقسيم العبارة الرياضية، أعني باستعمال المصفوفات وليس بطريقة أو استعمال Regular Expressions أو العبارات الاعتيادية!

هذه شفرة تقسيم الجملة إلى مصفوفة من الكلمات التي تقرأ فيما بعد من خلال ExpressionReader معين:

	private	List<Integer>getSubStringPositions(String operation){
 Vector<Integer>parts=new Vector<Integer>();
 char NULL='\u0000';
 char previous=NULL;
 for(int i=0;i<operation.length();i++){
 char current=operation.charAt(i);
 if(current==' ')continue;
 if(parser.isNumber(current)){
   if(parser.isOperand(previous)||parser.isComma(previous)||
     parser.isOpenParenthesis(previous)||parser.isCloseParenthesis(previous)||
     previous==NULL)
   parts.add(i);
 }else
   if(parser.isOperand(current)||parser.isComma(current)||
   parser.isOpenParenthesis(current)||parser.isCloseParenthesis(current)||
   previous==NULL){
   if((previous=='<' && current == '=') ||
     (previous=='<' && current =='>') ||
     (previous=='>' && current =='=')||
     (previous=='=' && current=='='));
   else{
     parts.add(i);
   }
   }else{
   if(parser.isOperand(previous)||parser.isComma(previous)||
     parser.isOpenParenthesis(previous)||parser.isCloseParenthesis(current)||
     previous==NULL)
   parts.add(i);
   }
 previous=current;
 }
 parts.add(operation.length());
 return parts;
}
private static List<String> readSubStrings(
 String operation, List<Integer>subs){
 Vector<String>strings=new Vector<String>();
 for(int i=0;i<subs.size()-1;i++){
 strings.add(operation.substring(subs.get(i), subs.get(i+1)).trim());
 }
 return strings;
}

أرجو أن أحصل على مساعدة لتنقيح هذه الشفرة باستعمال Regualar Expressions مثلا، أو أساليب أخرى!!

الشفرة هذه موجودة في كل ExpressionReader من أول إصدار إلى آخر إصدار!!

بالتوفيق!!

0

شارك هذا الرد


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

أخ أبو مازن :lol: شكرا على تسمية الكلاس باسمي :rolleyes:

فرق السرعة جيد جدا .. لكن لا أعرف هل اختصارك للكود صحيح أم لا ، التوابع الثلاث تمت كتابتهم بالصورة التي ذكرتها من أجل تحقيق الأولوية في المعاملات ، فمعامل ال * مسبق على معامل ال + .. اختصارك صحيح فقط إذا كنت تقرأ 2 tokens إلى الأمام لتعرف الاشارة التي تلي وتحقيق الأولويات ، وقد يكون هذا الأمر صعب فلاحظ الحالة التالية:

3 * -+-+5 ^ 2

هنا يوجد لدينا اشارة الضرب ثم 4 معاملات تغير الاشارة ثم رقم .. وبالتلي الفحص بعد * لا يكفي فقط .. في كودي هذه تعالج كالتالي:

3 * ((-(-(5))) ^ 2)

إذا عمل البرنامج معك بصورة صحيحة فهذا يعني انك ملم بالحالات الخاصة .

بالنسبة لل reader أو ال scanner فلم افهم كودك بشكل جيد عندي بعض الملاحظات ..

0- لا تدخل عمل ال parser على الscanner فألاحظ أن تستدعي parser من الكود ، البارسر مسؤول عن التحليل اللغوي او التركيبي للجمل ولكن السكانر مسؤول عن استخلاص ال tokens من الدخل من أجل أن يستخدمها البارسر .

1- استخدم switch case فهي اسرع من if

2- لا أرى انك تتجاهل ال tab character

3- لا أرى اين تعالج symbols or variables

4- لديك العديد من اعادة الفحص هنا الغير ضروري redundant .. مثلا فحصك إذا الحالي هو رقم ، ومن ثم فحصك من جديد هل الحالي هو معامل او فاصلة او لو ...

5- أيضا لديك redundant اخرى ، فأنت تسجل مواقع ال tokens ولكنك لم تسجل ماهو نوع ال token وقيمته .. فكيف عندما تقوم بعملية ال parsing تعرف ان التالي هو رقم أم معامل أم فاصلة وهكذا ، هل تقوم بالفحص من جديد ..

على كل لم أفهم ، أرجو التوضيح .. قد تفيدك استخدام regualar expression وسوف أضع هنا جزء ال scanner الذي قمت بكتابته باستخدامها .. استخدام regular expression قد يكون اسهل وافضل ولكن ليس اسرع إذا كتبت كود خاص يعمل scanning لحالة خاصة ..

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

شارك هذا الرد


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

أضفت التنقيحات اللازمة على الشفرة حتى تعمل كاملا مع الحزمة، أرجو أن تطلع على الشفرة الأخيرة في الأسفل،

بالنسبة للطريقة فهي كما أراها نفس طريقتك،، فهي تعرف الصلاحيات كاملا والله أعلم،، بالنسبة لمثالك،

3 * -+-+5 ^ 2

فالناتج عندي 75،،

بالنسبة لعملية القراءة، فهو عنده مصفوفة من الإشارات مرتبة ترتيبا حسب القوة، مثلا (كما في شفرتك) يبحث عن الإشارة + ولا ينفذها حتى يبحث عن إشارة أقوى منها وهي * ولا ينفذها حتى يبحث عن ^ فإذا وجدها صنعها، وبعد هذا يبحث عن إشارة لها نفس قوة ^ إذا لم يجد يرجع إلى مستوى قوة * ليبحث عن \ القسمة مثلا، فإذا وجدها لا يصنعها حتى يبحث عن شيء أقوى فيرجع إلى مستوى البحث عن ^ وبعدها .... يرجع إلى مستوى + الذي بدأنا منه ليقرأ (على نفس المستوى) الإشارة - ولا ينفذها حتى يبحث عن المستوى الأقوى * وهكذا..

دوختك،، زبدة القول أنها تعمل كما تعمل شفرتك تماما والله أعلم،، فشفرتك تبحث عن + لتقفز إلى * لتقفز إلى ^ وبعد العودة تبحث عن - وتقفز إلى * وبعدها إلى ^ وترجع إلى مستوى الضرب لتبحث عن \ وهكذا...

أرجو أن تتأكد من أي شيء باستخدام هذه الأداة في صفحتي! وللسهولة، اضغط على new Formula Note Sheet وجرب ما يحلو لك!

لتجربة الحزمة في صفحتي

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

بالنسبة لملاحظاتك القيمة:

أولا:: قد لا أكون فهمتك جيدا ولا سيما أني حررت الشفرة لتصبح سليمة والله أعلم،، انظر إلى الأسفل، الملف السابق كانت تجربة سريعة دون الاختبار الممحص،، ولا أدري قد لا تنجح في قراءة العبارات بصورة صحيحة!

- لا تدخل عمل ال parser على الscanner فألاحظ أن تستدعي parser من الكود ، البارسر مسؤول عن التحليل اللغوي او التركيبي للجمل ولكن السكانر مسؤول عن استخلاص ال tokens من الدخل من أجل أن يستخدمها البارسر .

ال "parser" بالمفهوم الذي أشرت إليه في شفرتي يقوم بفحص هل القطعة أو Token هي رقم أو Variable أو Function أو قوس مفتوح أو قوس مغلق،،، أعتقد أن تسمية هذا الشيء ب "parser" ليس صحيحا!

طبعا علمي بسيط في هذا الجانب، فالكلمات التي استخدمتها قد لا تدل حقيقة على وظيفتها الفعلية! (أرجو التوضيح: هل فهمي صحيح)؟

1- استخدم switch case فهي اسرع من if

[\quote]

أين بالضبط؟؟ عموما الجافا لا تسمح باستخدام switch مع الأشياء، و String عبارة عن شيء، ليس ك string الموجود في سي شارب.

2- لا أرى انك تتجاهل ال tab character

3- لا أرى اين تعالج symbols or variables

همممم.. أعتقد أنه يتم تجاهل ال tab والEnter و new line في عملية تقطيع الجملة إلى أجزاء، افحص الدالة readSubStrings فهي تقوم بذلك.

بالنسبة لمعالجة المتغيرات فهي موجودة في الدالة getVarOrFunction..

4- لديك العديد من اعادة الفحص هنا الغير ضروري redundant .. مثلا فحصك إذا الحالي هو رقم ، ومن ثم فحصك من جديد هل الحالي هو معامل او فاصلة او لو ...

5- أيضا لديك redundant اخرى ، فأنت تسجل مواقع ال tokens ولكنك لم تسجل ماهو نوع ال token وقيمته .. فكيف عندما تقوم بعملية ال parsing تعرف ان التالي هو رقم أم معامل أم فاصلة وهكذا ، هل تقوم بالفحص من جديد ..

أين بالضبط؟ عموما القطع عندي أو Tokens عبارة عن String وليست Operands، فهي لا تصبح Operand إلا بعد تحليلها كاملا،، هذا ليس كما هو الحال في HussamExpressionReader، فهذا الأخير يغيرها إلى Operands وبعدها يجمع ويحلل الأولويات!

5- نعم!!

حاليا،، إلى أن أدمج طريقة HussamExpressionReader فهي لا تفحص مجددا!

بالنسبة لاستخدام regular expressions فسأنتظر طريقتك في إنشاء Scanner وأجربها، وأعمل اختبار سرعة بعد ذلك!

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

Copy of HaniExpressionReader.java.txt

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

شارك هذا الرد


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

بالمناسبة هذه هي سلسلة الأولية التي أستخدمها، أرجو مراجعتها إن لزم الأمر!!

,       power: 500
|       power: 2000
&       power: 2300
<       power: 4000
<=      power: 4000
<>      power: 4000
=       power: 4000
==      power: 4000
>       power: 4000
>=      power: 4000
!       power: 5000
+       power: 10000
-       power: 10000
%       power: 20000
*       power: 20000
/       power: 20000
^       power: 30000

بالمناسبة ، لا أدري لماذا أمر (quote) لايعمل!!!

0

شارك هذا الرد


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

تم تجربة إضافة المصفوفات إلى اللغة،،

لتجربة ذلك توجه إلى البريمج واضغط new formula Note Sheet ،، واختر المثال السابع لتجد هذه الشفرة:

length=10, 
Array(myArray(), length),
firstCell=1, lastCell=10,
i=firstCell,while(i<=lastCell, {
value = i^2,
myArray(i,value),
i=i+1,
}),
i=firstCell,while(i<=lastCell,{
message(myArray(0,i)),
i=i+1,
}),

المصفوفات حاليا تدعم المصفوفات الأحادية!

أرجو أن يكون المثال واضحا!

----------

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

,       power: 500
=       power: 700
|       power: 2000
&       power: 2300
<       power: 4000
<=      power: 4000
<>      power: 4000
==      power: 4000
>       power: 4000
>=      power: 4000
!       power: 5000
+       power: 10000
-       power: 10000
%       power: 20000
*       power: 20000
/       power: 20000
^       power: 30000

تنقيح بسيط على الملف لوجود بعض الأخطاء:

Copy of HaniExpressionReader.java.txt

0

شارك هذا الرد


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

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

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