الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

NFA Convertor

بدأه مهدي حجازي في 2 يونيو 2010 · 17 رد · 6,021 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

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

nfa.png?rnd=0.49783050005170226&sizeM=3

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

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

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

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

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

NFAConvertor.zip

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 18 يونيو 2010 في 21:01 — السبب: تغيير اسم العنوان

4
#2

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

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

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

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

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

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

Software Developer
Mahmoudkelany.com


 

#3
اقتباس
واذا شفتوا مصيبه استروا علينا

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

00020309t.gif

1958_1963.gif
#4

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

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

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

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

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

Finite-State Machines with (no) OutPut

albert_einstein.jpg

Untitled-AE.jpg
#6

معكم حق البرنامح صعب الفهم بسب نقطه انك لازم تضيف 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

تم تعديل هذه المشاركة بواسطة مهدي حجازي في 2 يونيو 2010 في 19:49

#7
مهدي حجازي كتب:

معكم حق البرنامح صعب الفهم بسب نقطه انك لازم تضيف 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

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

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

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

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

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

سلام عليكم

Software Developer
Mahmoudkelany.com


 

#8

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

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

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

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

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

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

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

#10

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

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

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

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

00020309t.gif

1958_1963.gif
#11
علاء الصالحي كتب:

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

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

للتبسيط قمت بعمل مشروع بسيط يحتوي على دائرتين فقط وخط يصل بينهما لتتوضح الفكره لمن يستصعب الغوص في كود البرنامج. ( رجعت أكتب 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
#12

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

البرنامج فكرته رائعة جداً, و لا أدري إن كنت تريد تطويره :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 في 4 يونيو 2010 في 19:24

1
#13
Khaled.Alshaya كتب:

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

البرنامج فكرته رائعة جداً, و لا أدري إن كنت تريد تطويره :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
#14

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

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

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

تحياتي...

#15

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

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

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

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#16

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

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

شرح جميل

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

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

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

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

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

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

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

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

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

ربنا يسهل

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

تقبل مرورى

تحياتى

1

Software Developer
Mahmoudkelany.com


 

#17

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

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

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة