• 0
muqawem

NFA Convertor

سؤال

السلام عليكم...

أثنا تجوالي بين ملفاتي القديمي عثرت على هذا البرنامج الذي كنت قد كتبته كوظيفه في ماده نظريه الحاسبات وأحببت أن أشارككم به لعله يفيد البعض. البرنامج يقوم بتحويل Nondeterministic finite automata الى Deterministic finite automata.

لا تسألوني ما معنى ذلك فانا لم أعد أذكر ما هي هذه الأشياء وما هي خوارزميه التحويل :lol:

nfa.png?rnd=0.49783050005170226&sizeM=3

ملاحظات مهمه:

1. لقد قمت بتجميع المشروع على شكل مشروع NetBeans وأصلحت بعض الأخطاء بسرعه لأنه كان مكتوب بنسخه قديمه من جافا.

2. البرنامج كتبته منذ أربع سنوات وبالتأكيد ستجد العجب العجاب فاذا رأيت شيء جيد اذكره واذا شفتوا مصيبه استروا علينا :ph34r:

3. لا أذكر اي شيء عن خوارزميه التحويل.

4. مرفق مع المشروع مجلد اسمه samples به اشكال جاهزه يمكنك فتحها باسخدام البرنامج.

NFAConvertor.zip

تم تعديل بواسطه علاء الصالحي
تغيير اسم العنوان
4

شارك هذا الرد


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

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

  • 0

جميل جدا البرنامج

من حيث التصميم والطريقه والرسم

بس انا مش فاهم بيشتغل ازاى

وﻻ ايه اللى بيعمله

معلش استحملنى :(

افهم بس وكل حاجه هتكون تمام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
واذا شفتوا مصيبه استروا علينا

انا هسكت مش هتكلم بناءا على طلي حضرتك :lol:

0

شارك هذا الرد


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

أنا أذكر أشياء هلامية عن الموضوع

أظنه له علاقة بنظرية الأتمتة أو شيء من هذا القبيل

لكني لا أذكر أية تفاصيل عن الموضوع

تحياتي

0

شارك هذا الرد


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

بيتكلم عن كيفيه عمل المدخلات والمخرجات في الاله

Finite-State Machines with (no) OutPut

0

شارك هذا الرد


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

معكم حق البرنامح صعب الفهم بسب نقطه انك لازم تضيف Input Symbol قبل الرسم، انا نفسي كنت ناسيها لما فتحت البرنامج أول مره بعد هذه المده عموما انظر الفيديو لمعرفه كيف يعمل البرنامج.

انا هسكت مش هتكلم بناءا على طلي حضرتك

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

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

1. كيفيه تمثيل المخطط ياستخدام Directed Graph وهي تراكيب بيانات متقدمه نوعا ما وتجدها في الفئات Digraph, Edge, Vertex.

2. كيفيه رسم وتحريك الاشكال باستخدام الماوس عن طريق mousePressed, mouseDragged, mouseReleased, repaint وتجدونها داخل الفئه CustomPanel.

3. كيفيه حفظ الشكل المدخل من قبل المستخدم واعاده تحميله ببساطه شديده عن طريق استعمال Serializable فمثلا كود الحفظ لم يتجاوز الثلاث سطور:

output.writeObject( NFAGraph );//write the graph
output.writeObject( v );//write the input sympols
output.writeObject( style );//write the state name style

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

شارك هذا الرد


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

معكم حق البرنامح صعب الفهم بسب نقطه انك لازم تضيف Input Symbol قبل الرسم، انا نفسي كنت ناسيها لما فتحت البرنامج أول مره بعد هذه المده عموما انظر الفيديو لمعرفه كيف يعمل البرنامج.

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

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

1. كيفيه تمثيل المخطط ياستخدام Directed Graph وهي تراكيب بيانات متقدمه نوعا ما وتجدها في الفئات Digraph, Edge, Vertex.

2. كيفيه رسم وتحريك الاشكال باستخدام الماوس عن طريق mousePressed, mouseDragged, mouseReleased, repaint وتجدونها داخل الفئه CustomPanel.

3. كيفيه حفظ الشكل المدخل من قبل المستخدم واعاده تحميله ببساطه شديده عن طريق استعمال Serializable فمثلا كود الحفظ لم يتجاوز الثلاث سطور:

output.writeObject( NFAGraph );//write the graph
output.writeObject( v );//write the input sympols
output.writeObject( style );//write the state name style

جزاكم الله كل خير

وشكرا على الفيديو وعلى توضيح اهم الاجزاء بالنسبه لواحد مبتدء مثلى

وان شاء الله اذا كان هناك شىء اكيد هنقول باذن الله

وان شاء الله نتعلم منك ومن شغلك الرائع

جزيتم الفردوس ان شاء الله

سلام عليكم

0

شارك هذا الرد


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

مادام الموضوع كذلك

ما رأيك لو تكلمنا أكثر عن الرسم في البرنامج

مثلاً كيف تحرك الدائرة فتتحرك معها الأسهم المرتبطة بها

بمعنى آخر النقاط التي تحسها ستضيف للمبتدئين شيئاً جديداً

تحياتي

0

شارك هذا الرد


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

السلام عليكم ...

برنامج رائع أخي مهدي, هل من الممكن أن يتبرع أحد من الأخوة بترجمته لأني أريد تجربته بعد إذنكم :)

0

شارك هذا الرد


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

جامد جامد :lol: :lol:

بس مش فاهمة بردو بيعمل ايه

انا تقريبا بأخد حاجة زى كدة فى مادة اسمها OR

بس فعلا حضرتك وضحت نقاط كويسة ممكن نتعلمها منه

0

شارك هذا الرد


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

مادام الموضوع كذلكما رأيك لو تكلمنا أكثر عن الرسم في البرنامجمثلاً كيف تحرك الدائرة فتتحرك معها الأسهم المرتبطة بهابمعنى آخر النقاط التي تحسها ستضيف للمبتدئين شيئاً جديداًتحياتي

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

للتبسيط قمت بعمل مشروع بسيط يحتوي على دائرتين فقط وخط يصل بينهما لتتوضح الفكره لمن يستصعب الغوص في كود البرنامج. ( رجعت أكتب Swing من جديد :) ).

public abstract class Item {
public abstract void paint( Graphics g );

}

public class Circle extends Item {

public Circle( int x, int y, int r ) {
setX( x );
setY( y );
setRadius( r );

}

public void paint( Graphics g ) {
g.setColor( Color.RED );
g.drawArc(x - r, y - r, 2 * r, 2 * r, 0, 360 );

}

public void setX( int x ) {
this.x = x;

}

public void setY( int y ) {
this.y = y;

}

public void setRadius( int r ) {
this.r = r;

}


public int getX() {
return x;

}

public int getY() {
return y;

}

public int getRadius() {
return r;

}

private int x;
private int y;
private int r;

}

public class Line extends Item {

public Line( Circle c1, Circle c2 ) {
setFirstCircle( c1 );
setSecondCircle( c2 );

}

@Override
public void paint(Graphics g) {
g.setColor( Color.BLACK );
g.drawLine( c1.getX(), c1.getY(), c2.getX(), c2.getY() );

}

public void setFirstCircle( Circle c1 ) {
this.c1 = c1;

}

public void setSecondCircle( Circle c2 ) {
this.c2 = c2;

}

public Circle getFirstCircle() {
return c1;

}

public Circle getSecondCircle() {
return c2;

}

private Circle c1;
private Circle c2;

}

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

public class CustomPanel extends JPanel {

public CustomPanel() {
items = new Vector();

Circle c1 = new Circle( 50, 100, 20 );
Circle c2 = new Circle( 250, 100, 20 );
Line line = new Line( c1, c2 );

items.add( c1 );
items.add( c2 );
items.add( line );


addMouseMotionListener( new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if( pressedCicle != null ) {
pressedCicle.setX( e.getX() );
pressedCicle.setY( e.getY() );
repaint();

}
}

});

addMouseListener( new MouseAdapter() {

@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
Item item = findItem( x, y );

if( item instanceof Circle )
pressedCicle = (Circle) item;

}

@Override
public void mouseReleased(MouseEvent e) {
pressedCicle = null;

}


});


}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor( Color.WHITE );
g.fillRect( getX(), getY(), getWidth(), getHeight() );

for( int i=0;i<items.size();i++ ) {
Item item = (Item)items.elementAt( i );
item.paint( g );

}

}

Item findItem( int x, int y ) {
for( int i=0;i<items.size();i++ ) {
Item item = (Item)items.elementAt( i );
if(item instanceof Circle ) {
Circle c = (Circle)item;

if( x >= c.getX() - c.getRadius() &&
x <= c.getX() + c.getRadius() &&
y >= c.getY() - c.getRadius() &&
y <= c.getY() + c.getRadius() ) {
return c;

}

}

}

return null;

}

private Vector items;
private Circle pressedCicle;

}

هنا يتم باقي العمل ببساطه حيث يتم البحث عن الدائره التي ضغط عليها في mousePressed ومن ثم تغيير احداثياتها اذا قمت بعمل سحب لها وبعدها نقوم باعاده الرسم. المشروع كامل في المرفقات.

السلام عليكم ...

برنامج رائع أخي مهدي, هل من الممكن أن يتبرع أحد من الأخوة بترجمته لأني أريد تجربته بعد إذنكم

أهلا بك أستاذي خالد..الملف التفيذي في المرفقات.

DrawEx.zip

NFAConvertor.jar

2

شارك هذا الرد


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

شكراً أخي مهدي :)

البرنامج فكرته رائعة جداً, و لا أدري إن كنت تريد تطويره :P

عموماً, بعض الملاحظات:

الـ initial state يمكن أن تكون final state أيضاً.

لايوجد في البرنامج طريقة لتحديد lambda أو بمعنى أصح الـ empty string. و هذه تقريباً نفس النقطة الأولى, لأنه كون الـ initial state عبارة عن final state فهذا يعني أنك تقبل lambda ضمن اللغة.

تحسينات:

يمكن أن تقوم برسم الـ DFA بعد التحويل, و ستكون ميزة جبارة.

يمكن أن تسمح للمستخدم بإدخال الـ Input alphabet بطريقة افضل, و من الأفضل أن تسمح له بإدخال groups كما في الـ regular expressions. مثلاً a-z و A-Z و 7-5 على سبيل المثال بدلاً من تحديد كل مدخل على حدة.

يمكنك إضافة خيارات لتعديل ما تم إدخاله.

هذا ما جاء في بالي حتى الآن, و لكن لم أطلع على الكود. بالنسبة لخوارزمية التحويل, فيمكن أن أضع موضوعاً عنها بعد فترة إن أحببت لمن يريد فهم عمل البرنامج و تطويره من الأخوة في قسم Java.

البرنامج بعد أن يتم تطويره يمكن أن يأخذ مسارين, الأول أن يستخدم في الجامعات في مواد الـ Automata و هو برنامج رائع بلا مجاملة خصوصاً عملية الرسم.

الأمر الآخر, هو استخدامه فعلياً لإنتاج الـ Regular Expressions حسب أي flavor أو عدة flavors تريد دعمها. و لكن أعتقد أنك تحتاج لبناء Optimizer في هذه الحالة :)

تقبل تحياتي, و شكراً على مشاركة برنامجك.

تم تعديل بواسطه Khaled.Alshaya
1

شارك هذا الرد


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

شكراً أخي مهدي :)

البرنامج فكرته رائعة جداً, و لا أدري إن كنت تريد تطويره :P

عموماً, بعض الملاحظات:

الـ initial state يمكن أن تكون final state أيضاً.

لايوجد في البرنامج طريقة لتحديد lambda أو بمعنى أصح الـ empty string. و هذه تقريباً نفس النقطة الأولى, لأنه كون الـ initial state عبارة عن final state فهذا يعني أنك تقبل lambda ضمن اللغة.

تحسينات:

يمكن أن تقوم برسم الـ DFA بعد التحويل, و ستكون ميزة جبارة.

يمكن أن تسمح للمستخدم بإدخال الـ Input alphabet بطريقة افضل, و من الأفضل أن تسمح له بإدخال groups كما في الـ regular expressions. مثلاً a-z و A-Z و 7-5 على سبيل المثال بدلاً من تحديد كل مدخل على حدة.

يمكنك إضافة خيارات لتعديل ما تم إدخاله.

يبدو أني فتحت عى نفسي أبوابا لا قبل لي بها :)

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

هذا ما جاء في بالي حتى الآن, و لكن لم أطلع على الكود. بالنسبة لخوارزمية التحويل, فيمكن أن أضع موضوعاً عنها بعد فترة إن أحببت لمن يريد فهم عمل البرنامج و تطويره من الأخوة في قسم Java.

أن كنت تملك الوقت والرغبه في ذلك فلا أحب الي من ذلك، وهكذا موضوعك يكون مكملا لموضوعي وبالتالي نحصل على موضوع جيد ان شاء الله.

البرنامج بعد أن يتم تطويره يمكن أن يأخذ مسارين, الأول أن يستخدم في الجامعات في مواد الـ Automata و هو برنامج رائع بلا مجاملة خصوصاً عملية الرسم.

الأمر الآخر, هو استخدامه فعلياً لإنتاج الـ Regular Expressions حسب أي flavor أو عدة flavors تريد دعمها. و لكن أعتقد أنك تحتاج لبناء Optimizer في هذه الحالة

تقبل تحياتي, و شكراً على مشاركة برنامجك.

بكل أمانه لم أكن أعلم ان البرنامج ممكن أن تكون له فائده فقد طلب منا الدكتور كتابة برنامج يقوم بتحويل NFA الى DFA وكل ما قمت به اني اضفت له GUI وجعلته سهلا للمستخدم باستخدام الرسم ولو كنت أعرف كل هذا لوضعته من زمان :)

شكرا لك على هذه الملاحظات الجميله وعلى التوقف الأجمل.

1

شارك هذا الرد


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

أهلاً أخي مهدي...

حالة النسيان تحصل معي أيضاً لذلك لا تقلق لست الوحيد :lol:

إن شاء الله بعد انتهاء الاختبارات سأحاول وضع موضوع عن خوارزمية التحويل بإذن الله.

تحياتي...

0

شارك هذا الرد


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

سلمت أخ مهدي شرح أكثر من جيد

في انتظار الموضوع أخ خالد

بحق أثريت هذا الموضوع شكراً لك :)

تحياتي

0

شارك هذا الرد


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

جزاك الله خيرا اخى مهدى

بجد ربنا يخليك لينا يارب

شرح جميل

ولكن عندى حاجات هاظبطها ان شاء الله

لم اتعلم اكتر واكتر الـ Graphices

قريبا ان شاء الله

الاجازه قادمة

منتظرين الخوارزميه اخى خالد

ولو عندك خوارزميات CPU Scheduling بالمره :lol: :lol:

اصل انا عندى مشروع فى الموضوع دا

ومش عارف حاجه فالخوارزميات

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

ربنا يسهل

حاول كدا بالمره اخى وجزاك الله خيرا

تقبل مرورى

تحياتى

1

شارك هذا الرد


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

تم إضافة الموضوع إلى المواضيع المميزة

تحت بند المشاريع

تحياتي

0

شارك هذا الرد


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

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

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

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