سأحاول دمج الميزة الاخيرة مع JFreeChart .. وسأضعها هنا.
اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط
سأحاول دمج الميزة الاخيرة مع JFreeChart .. وسأضعها هنا.
اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط
أخي فيصل، إذا استعملت الأداة في برنامجك ، أرجو أن تدرج برنامجك أو مثالك في موضوع جديد! ونحن في انتظار تجاربك!
استخدامات أخرى للحزمة:
افرض أن عندك برنامج محاسبي،، افرض أن لديك الحساب التالي في برنامجك:
افترض أن لديك هذه الواجهة للحساب
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
وبهذا تستطيع إدخال هذه الإمكانية في برنامجك المحاسبي الكبير!!
وهذه شفرة كاملة!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
انظروا إلى هذا المخطط...
إنها تمثل المعادلة التالية:
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 حتى يأخذ معادلة ويرسمها مباشرة!!
أعتقد أني سأثبت الإصدار الثالث على ما هو عليه!!
بالتوفيق،،
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
يا سلام عليك يا أبو مازن هذة هو برنامج ولا بلاش
بس قول لي متى نصل الى هذا مستوى , ها ها ها ها ها ها
يارب نشوف منك برامج أحسن و أحسن


يمكن ما احد يصدق بس هذه اول مرة ادخل على الموضوع هذا.. ربما من العنوان لانه غير مشوق ابداً " آلة حاسبة" و لكنني دخلت عليه من توقيعك عندما كتبت جديد لغة برمجة
فعلا الله يعطيك العافية و فعلا شجعتني بالعمل اكثر بمجال الحزم الجاهزة و لكن كثرت الدراسة كما تعرف !!!
عندما انتهي من النظام البنكي سوف انشر الحزم المستخدمة فيه و انت عليك تعملها doc لان هذه اكره خطوة علي ههههه :)
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
أخي أبو مازن أكمل المشوار ، واصنع لغة برمجة للأطفال بالجافا ،، مثل ما طرح في قسم المقالات لغة برمجة للأطفال بالسي شارب،،، وتكون بالعربي ،، سيكون لك السبق في هذا المجال...
اقتباسيمكن ما احد يصدق بس هذه اول مرة ادخل على الموضوع هذا.. ربما من العنوان لانه غير مشوق ابداً " آلة حاسبة" و لكنني دخلت عليه من توقيعك عندما كتبت جديد لغة برمجة
بصراحة فعلا يا رامي العنوان غير مشوق أبدا!! لكن لا تلومني لأني في البداية كانت نيتي أن أصنع آلة حاسبة متطورة تأخذ العبارة الرياضية وتعطينا النتيجة! ولكن مع مرور الوقت والإصدارات أصبحت كما ترى! اقترح لي عنوانا مناسبا!
أذكر أن النوم غادر جفوني عندما (بغير القصد) أضفت ما يقل عن 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!!!
إذا أردت أن تصنع مثل هذا الجدول وواجهتك صعوبة فلا تتردد في السؤال!
بالتوفيق!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
السلام عليكم و رحمة الله وبركاته
أخى أبومازن لا أدرى ماذا أقول لك .... :(
و لكن إعلم أن النبى صلى الله عليه و سلم قال "خير الناس أنفعهم للناس" جعلك الله من خيار الناس و نفع بك المسلمين اللهم امين :D
اقترب للناس حســــابهم و هم فى غفلة معرضون
السلام عليكم،
في الرد السابق تحدثت عن إمكانية صنع جدول به إمكانيات الجداول المتسعة مثل Excel..
جربت تنفيذها ووضعها في البريمج على المتصفح،، وهذه صورة بسيطة لهذا الجدول الرياضي!
شفرة البرنامج لا تتعدى 100 سطر... طبعا الأمور الجمالية زادت من حجم الشفرة قليلا!
لتجربة البريمج اذهب من هنا:
اضغط على زر New Formula Spread Sheet
وسيظهر لك الجدول المراد..
تستطيع كتابة ما يحلو لك من معادلات وأرقام ومتغيرات ودوال داخل كل خلية من خلايا الجدول
وليس هذا فقط،، أضفت دالة جديدة اسمها (خلية) بالعربي أو Cell بالأجنبي تأخذ قيمتين بهما تحدد خلية معينة في الشاشة! الدالة تأخذ رقم الصف ورقم العمود.
مثلا إذا كان في الخلية (0،0) القيمة 20.. تستطيع أن تكتب في خلية أخرى المعادلة التالية:
اقتباسأكبر ( خلية (0،0) ، 10 )
طبعا الناتج هو 20!
تستطيع أن تكتب جمل (إذا) و (مادام) في الخلايا.. باستعمال هذه المتغيرات تستطيع أن أن تصنع دالة تجمع لك صفا كاملا من الخلايا مثلا ووضع الناتج في خلية معينة،،
لاحظ أن هذه الجمل if while وغيرها تتيح لك التحكم بما تريد!!
يتفوق هذا الجدول البسيط على Excel بإمكانية تعريف متغيرات تصل إليها جميع الخلايا بسهولة!!!
طبعا تستطيع تطوير الشفرة لتجعل الجدول يتقبل أوامر أخرى سريعا مثل Sum Count وغيرها من أوامر Excel المعروفة.
أحلى مافي الموضوع، أنك إذا كتبت المعادلة الخلية تظهر الناتج، وإذا أردت تحرير المعادلة يختفي الناتج وتظهر لك المعادلة كما في Excel!!
بالمناسبة الشفرة تجدها في الملف أو الفئة FormulaSpreadSheet.java وتجدها في صفحتي!!
------
نستفيد من هذا الموضوع كيفية استخدام حزمة معالج العبارات الرياضية في تطبيقات مختلفة!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
ما شاء الله، زادك الله من علمه أخ أبو مازن.
إذاً ماذا تنتظر، تابع إلى برنامج ينافس Excel، لم يعد هناك شيء صعب في Excel فأصعب ما فيه هو الدالات، وقد حليتها.
من أراد أن يصنع واحدا فليفعل،، حزمة المعالج الرياضي موجودة في صفحتي،، الأمثلة في كيفية استخدام الحزمة ومنها الجداول كما في ردي السابق وشفراتها موجودة في صفحتي!
ولا أحب تصميم الواجهات كثيرا...
نحب أن نرى أي تطبيق بسيط يستعمل هذه الحزمة!
أعيد وأذكر أن الاستعمال سهل جدا:
1- استورد المكتبة import hussam.math.operations.* وأخواتها
2- استعمل قارئ للدوال:
OperationReader reader=ExpressionReader.getInstance();
اقرأ دالة معينة:
Operation o1 = reader.readOperation(textField.getText());
اكتب الناتج في حقل آخر:
textField2.setText(o1.result()+"");
الموضوع سهل جدا... لمزيد من الأمثلة راجع الردود السابقة، أو الأمثلة في صفحتي، أو الشفرات الموجودة في صفحتي ، أو الأمثلة والشرح الموجود في الشروحات documetation، أو أو أو،، أو اسأل هنا،، أو في موضوع جديد!!
-----
بالتوفيق!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
اقترح عليك عنوان جديد و هو
" المعالج العربي للعمليات الرياضية "
فاذا وافقت سوف اعدله لك في الحال
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
غيره وتوكل على الله،،
محلل العبارات الرياضية.
أو محلل العبارات الرياضية العربية.
أو المعالج العربي للتحليل الرياضي!
أو محلل ومعالج العبارات الرياضية...
اختر أيها تريد... كلها مناسبة
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
بعد أن أضيفت جمل إذا و مادام،، لم تنقص الحزمة إلا إضافة العمليات الداخلية التي قد تسمى بـ 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
لتجربة هذه الإمكانية: اذهب إلى صفحتي
واضغط على 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!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
نعم.. المكتبة كبيرة جدا،، ويعود سبب هذا أني تعمدت أن أستخدم البرمجة شيئية التوجه في تصميم هذه الخدمة، تصميم مثل هذه المكتبة هو أمتع شيء في الموضوع!
بالنسبة للطريقة التي استخدمتها:
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 جديد!
أطلت عليكم،، لكني أتمنى أن تشرح الطريقة التعاودية لأني بصراحة لا أعرف ما اسم الطريقة التي استخدمتها في الترجمة!
تم تعديل هذه المشاركة بواسطة أبومازن في 18 أكتوبر 2005 في 08:05
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
اخي أبو مازن شكرا لشرحك سوف أحاول أن أطلع على كودك بشئ من التفصيل أكثر وافادتك في اجازة نهاية الأسبوع .
الكود الذي قمت بكتابته ايضا 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 ..
Coding on the Cloud and for the Cloud!
ربما تكون هذه المداخلة في متأخرة أو في غير وقتها، ولكن هل علمت أخي أبو مازن بالـ JavaCC أو Java Compiler Compiler.
أنا بصراحة ليس لي به علم جيد، ولكن حد علمي أنه برنامج Java يمكن عن طريقه تعريف قواعد كتابة لغة والتعابير وتعريف الكلمات المفتاحية فيها، وهو يقوم بتوليد مترجم للغة.
للاطلاع على المزيد من المعلومات بإمكانك زيارة موقع JavaCC.
والله فعلا أمر لم أفكر فيه، وهو استخدام Regualr Expressions في الجافا، فعلا ExpressionReader عندي يحتاج إلى التطوير الكبير! ربما لأني لم أستخدمها من قبل! أشكرك على هذه المعلومة الغائبة عن بالي!
حاليا، يقوم ExpressionReader بعملية بطيئة كما أراها :
1- يحلل الجملة ويفككها إلى مصفوفة من الكلمات.
2- يقلب الكلمات إلى عمليات Operations مثلا إذا وجد رقما يقلبه إلى ConstantNumber وإذا وجد إشارة + يقلبه إلى Operand، أصبح لدينا مصفوفة من العمليات!
3- بعد ذلك يجمع العمليات مع الأخذ بالاعتبار قوة العملية، العملية المتبعة هي عمليات تنادي نفسها (هل هذه العمليات اسمها عمليات تعاودية؟)
{
المجموعات أو الأقواس أولا
الدوال ثانيا، والإشارات ثالثا!
} هذه أمور تنادي نفسها، مثلا نأخذ أول مجموعة، فنبحث عن المجموعات بداخلها، بعد ذلك نبحث عن الدوال وفي الدالة نبحث عن مجموعة وبعدها نبحث عن دوال وعن إشارات وهكذا شجرة في البحث، recursion.
4- لاحظ أنه مثلا يبحث عن علامة ^ أولا في المصفوفة ويجمع العمليتان التي تشير إليه، وبعد هذا يبحث عن الضرب في المصفوفة المتبقية وهكذا،، مما يجعل هذه الطريقة ليست سريعة! فهو يبحث في المصفوفة كلها في كل مرة، مع أنها تأخذ في الصغر!
هذه الشفرة أخذت مني 400 سطر تقريبا! كما أذكر!! والمشكلة أنها ليست ممتازة في نظري! لكني تجنبت تطويرها لأنها حاليا تعمل بصورة ممتازة، وأخذت في تطوير الأشياء الأهم في الحزمة التي من أجلها صنعت!
أما وقت التنفيذ فأراها جيدة والله أعلم!
سأنتظر تحليلك بفارغ الصبر!
تم تعديل هذه المشاركة بواسطة أبومازن في 18 أكتوبر 2005 في 11:16
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
برأي الparser الذي صنعته بطيئ فليس من الداعي قرائة السلسلة كل مرة حتى ولو كنت تختصرها .. وانصحك بقرائة شرح top-down parser في هذه الوصلة
http://www.idi.ntnu.no/~holager/KompTek/del07.pdf
وأرفقت الparser الذي عملته لبرنامجي من أجل أن يساعدك .. البارسر لدي حوالي 160 سطر..
Coding on the Cloud and for the Cloud!
الله يعطيك ألف عافية على هذه المساعدة الذهبية!!
ملفك يحوي تقريبا 126 سطرا بعد تنقيح الأقواس على أسلوب الكتابة الذي أتبعه!
حاليا صنعت الإصدار السابع من سلسلة ExpressionReader باسم HaniExpressionReader،،
لقد استفدت من شفرتك كثيرا،، وصنعت هذا الإصدار التجريبي للمترجم،، أنا حاليا في طور تهيئته ليصبح جزء من الحزمة!
لقد اختصرت في شفرتك وأصبحت تقريبا 100 سطر ،، فعلت هذا بحذف الطرق المكررة مثل parseAddtion و parseMultiplication و parsePower وجعلته في طريقة واحدة تسمى parseOperands، وهذه الأخيرة تعمل تحليلا للعمليات المنطقية أيضا!
سأحاول عمل اختبار فرق سرعة HussamExpressionReader و HaniExpressionReader وأضع النتائج هنا بإذن الله،
أرجو أن تساعدني في هذه الجزئية من البرنامج وهي عملية تجزئة الجملة إلى مصفوفة من الكلمات:
لم أستخدم regular expreesions لقراءة الجملة،، كما أني أريد معرفة كيف استخدمت Scanner في قراءة الجملة،، ستلاحظ في شفرتي الطريقة getSubStringPositions وهذه لوحدها 40 سطر!! وظيفة هذه الطريقة هي تقسيم الجملة إلى كلمات وأرقام وإشارات ووضعها في مصفوفة، أرجو المساعدة في هذا الأمر!
هذه هي الشفرة التي استعملتها، ..
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
إليكم نتائج امتحان سرعة كل من 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 من أول إصدار إلى آخر إصدار!!
بالتوفيق!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
أخ أبو مازن :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 لحالة خاصة ..
تم تعديل هذه المشاركة بواسطة هاني الأتاسي في 22 أكتوبر 2005 في 18:38
Coding on the Cloud and for the Cloud!
أضفت التنقيحات اللازمة على الشفرة حتى تعمل كاملا مع الحزمة، أرجو أن تطلع على الشفرة الأخيرة في الأسفل،
بالنسبة للطريقة فهي كما أراها نفس طريقتك،، فهي تعرف الصلاحيات كاملا والله أعلم،، بالنسبة لمثالك،
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 وأجربها، وأعمل اختبار سرعة بعد ذلك!
حاليا، هذا هو الملف الجديد الذي أرجو أن تفحصه، أرجو التعقيب على أسئلتي بعد أن تنظر إلى هذه الشفرة:
تم تعديل هذه المشاركة بواسطة أبومازن في 19 نوفمبر 2005 في 13:29
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
بالمناسبة هذه هي سلسلة الأولية التي أستخدمها، أرجو مراجعتها إن لزم الأمر!!
, 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) لايعمل!!!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…