• 0
مصطفى 36a2

تمرين على استخدام القوائم(باستخدام C )

سؤال

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

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

لنبدأ على بركة الله ..

 

متطلّبات حل التمرين prerequests :

من لديه إلمام بالمصفوفات وإحدى خوارزميات البحث يمكنه حل السؤال بقليل من التفكير الإضافي , ومن لديه معرفة بالقوائم المترابطة LinkedList سيسهّل على نفسه الأمر .

 

السؤال هو كما يلي :

لدينا منتدى فيه مواضيع متناثرة هنا وهناك ..

نريد كتابة برنامج :

1- يأخذ في مدخلاته (عنوان الموضوع , اسم الكاتب , تاريخ الكتابة بالشكل 11/11/2013 ,عدد مرات المشاهدة , وعدد الردود , وطبعاً رابط الموضوع )

2- ونريد حفظ كل هذه البيانات ثم ترتيبها حسب ما يطلب المستخدم ..

3- يمكنه طلب الترتيب حسب الاسم أو العنوان أو عدد مرات المشاهدة أو أو او ... الخ 

4- وبعد ذلك يمكنه طلب عرض الموضوع رقم  X الترتيب ... أو عرض أول 30 موضوعاً ,, ( عرض الموضوع يكون بطباعة كامل بياناته )

 

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

 

سأنتظر أفكار الأخوة قبل أن أبدأ ..

 

بالتوفيق

 

0

شارك هذا الرد


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

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

  • 0

السلام عليكم

 

سيحتوي تطبيقي على الاشياء التالية

 

اضافة موضوع جديد : بحيت تدخل اليه اسم الموضوع و محتوى صغير للموضوع و اسم الكاتب

حدف موضوع : تحدف الموضوع بكتابة اسمه

تعديل موضوع : يمكنك تعديل المحتوى فقط

عرض موضوع : دالك لرؤية كافة معلومات الموضوع تاريخ الكتابة و الردود وعدد المشاعدات ووو

الرد على موضوع : بحيت تترك رد على موضوع تكتب اسمه وكل موضوع يمكنه ان يحتوي على 10 ردود

اضهار جميع المواضيع بشكل مرتب : يمكنك اختيار اضهار الموضوع بشكل مرتب على حسب ما تريد

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

+ سأرى ان كان بأمكاني جعل عدد مرات المشاهدة كدالك يعمل تلقائيا

 

وافكار اخرى آتية في الطريق

 

لدي استفسار وهو بخصوص اضهار جميع المواضيع بشكل مرتب

انا سأعمل في الداكرة فقط اي لن استعمل قواعد بيانات فهل اعمل على ترتيب المواضيع في طريقة الاظهار فقط ام في الداكرة ايضا ؟؟

 

هل جميع ما دكرت لا يخالف شروط التمرين ؟؟

0

شارك هذا الرد


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

هدا هو الكود البدائي للمشروع

#include <stdio.h>#include <stdlib.h>#define titren 100#define nomauteurn 100#define daten 12#define lienn 100int nbrsujet=0,i;typedef struct objet objet;struct objet{    char titre[titren],nomauteur[nomauteurn],date[daten],lien[lienn];    int nbrvue,nbrcomtr;    objet *suivant;};typedef struct Liste Liste;struct Liste{    objet *premier;};Liste *initialisation();void insertion(Liste *liste);void suppression(Liste *liste);void afficherListe(Liste *liste);void classement(Liste *Liste);int main(){    Liste *myobjet = initialisation();    insertion(myobjet);    insertion(myobjet);    insertion(myobjet);    afficherListe(myobjet);    return 0;}Liste *initialisation(){    Liste *liste = malloc(sizeof(*liste));    objet *objet = malloc(sizeof(*objet));    objet->suivant = NULL;    liste->premier = objet;    return liste;}void insertion(Liste *liste){    objet *nouveau = malloc(sizeof(*nouveau));    scanf("%s",&nouveau->titre);    nouveau->suivant = liste->premier;    liste->premier = nouveau;}void suppression(Liste *liste){    if (liste->premier != NULL)    {        objet *aSupprimer = liste->premier;        liste->premier = liste->premier->suivant;        free(aSupprimer);    }}void afficherListe(Liste *liste){    objet *actuel = liste->premier;    while (actuel != NULL)    {        printf("%s\n", actuel->titre);        actuel = actuel->suivant;    }}void classement(Liste *liste){    int qlclsm;    objet *actuel = liste->premier;    scanf("%d",&qlclsm);    switch(qlclsm)    {    case 1:        actuel=actuel->suivant;        for(i=1; i<nbrsujet; i++)        {            x=actuel->nbrvue;            j=i;            while(t[j-1]>x&&j>0)            {                t[j]=t[j-1];                j--;            }            t[j]=x;        }    }}

لتشغيل الكود احدفو الدالة classement لأنني لم انتهي منها وجدت انني علي استخدام القوائم المتصلة من جهتين

 

الكود يمكنه من اضافة موضوع وحدف موضوع واضهار موضوع

 

هدا الكود كما قلت فهو بدائي فقط

0

شارك هذا الرد


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

ما شاء الله .. انتظرني :)

جيّد :) سأختبر الكود وأخبرك بملاحظاتي ..

ولكن الهدف الرئيسي من المشاركة أن نتعلّم كيف نفكّر ..

لنبدأ بتفصيص السؤال :)


لدينا منتدى فيه مواضيع متناثرة هنا وهناك ..نريد كتابة برنامج :

1- يأخذ في مدخلاته (عنوان الموضوع , اسم الكاتب , تاريخ الكتابة بالشكل 11/11/2013 ,عدد مرات المشاهدة , وعدد الردود , وطبعاً رابط الموضوع )

2- ونريد حفظ كل هذه البيانات ثم ترتيبها حسب ما يطلب المستخدم ..

3- يمكنه طلب الترتيب حسب الاسم أو العنوان أو عدد مرات المشاهدة أو أو او ... الخ 

4- وبعد ذلك يمكنه طلب عرض الموضوع رقم  X الترتيب ... أو عرض أول 30 موضوعاً ,, ( عرض الموضوع يكون بطباعة كامل بياناته )

أولاً : عملية التجريد

1- لدينا كتلة معطيات تمثّل الموضوع .. لنسمّها topic و لا يهمنا طريقة الإدخال أو الإخرج .. ولا تهمّنا محتويات الكتلة ..

2- لدينا دالّة تنفّذ خوارزمية ترتيب حسب عنصر معيّن من الكتلة ولنسمّها sort.. ولا يهمّنا ما هو العنصر ..

والآن يمكننا أن نعدّل السؤال إلى الشكل التالي


لدينا منتدى فيه topic متناثرة هنا وهناك ..نريد كتابة برنامج :

1- نطلب من topic إدخال عناصرها .

2- نحفظ كل الـtopic في أي نوع من القوائم (مصفوفة , قائمة مترابطة .. لا يهمنا فنحن في مرحلة التجريد .. سنسمّي الحاوية List  على أي حال )

3- نطلب من الدالة الرئيسية القيام بمخاطبة المستخدم لمعرفة كيفية الترتيب .. ثم الطلب sort القيام به .

4- نطلب من الدالة الرئيسية القيام بمخاطبة المستخدم لمعرفة المطلوب هل هو عرض أول 30 موضوع أم الموضوع رقم X ثم نطلب من List القيام بالأمر  .

الآن صار واضحاً لدينا تقسم العمل بين الأجزاء

كتلة topic .. حاوية List .. دالة sort .. ودالة رئيسية للقيادة main

 

أرجو تكون فكرة التجريد وصلت حتى نتابع .. هل هناك أسئلة ؟

تصميم البرنامج من البداية بشكل مجرّد سيساعدنا على التطوير بشكل كبير جدا لا حقاً ..

والله ولي التوفيق

1

شارك هذا الرد


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

اوك على ما اضن فهمت ما تريد

هده هي اضافاتي

 

3- لدينا دالّة تعمل على اظهار جميع محتويات topic على حسب ما يريد المستخدم اظهار جميع  topic ام اظهار topic X لنسميها afich

 

لدينا منتدى فيه topic متناثرة هنا وهناك ..نريد كتابة برنامج :

1- نطلب من topic إدخال عناصرها .

2- نحفظ كل الـtopic في أي نوع من القوائم (مصفوفة , قائمة مترابطة .. لا يهمنا فنحن في مرحلة التجريد .. سنسمّي الحاوية List  على أي حال )

3- نطلب من الدالة الرئيسية القيام بمخاطبة المستخدم لمعرفة كيفية الترتيب .. ثم الطلب sort القيام به .

a- ادا طلب المستخدم الترتيب على حسب اشياء تتكون منم الاعداد متل عدد المشاهدات, sort ستخاطب المستخدم ادا كان يريد من الاصغر الى الكبر ام العكس

b- ادا طلب المستخدم الترتيب على حسب اشياء تتكون من الحروف متل عنوان topic, سsort ستخاطب المستخدم ان كان يريد A-Z ام Z-A

4- نستدعي الدالة afich لتخاطب المسخدم على اي طريقة يريد عرض topic

 

هل هده هي الطريقة التي تريد العمل بها ؟؟

+ هده الاشياء الاساسية فقط في التمرين في انتضار تفصيص الافكار الناتجة عن تفصيص الاسئلة

0

شارك هذا الرد


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

هل هده هي الطريقة التي تريد العمل بها ؟؟

+ هده الاشياء الاساسية فقط في التمرين في انتضار تفصيص الافكار الناتجة عن تفصيص الاسئلة

 

أحسنت ..فهمت عليّ ;) سنفصص الآن :)

 

 

a- ادا طلب المستخدم الترتيب على حسب اشياء تتكون منم الاعداد متل عدد المشاهدات, sort ستخاطب المستخدم ادا كان يريد من الاصغر الى الكبر ام العكس

b- ادا طلب المستخدم الترتيب على حسب اشياء تتكون من الحروف متل عنوان topic, سsort ستخاطب المستخدم ان كان يريد A-Z ام Z-A

4- نستدعي الدالة afich لتخاطب المسخدم على اي طريقة يريد عرض

 

هذه الــ a,bهي التفصيص ..

ولكن قبل ذلك . سنكتب الكود بدون أجسام للدوال .. للتأكد أن هذا ما نريد بالضبط ..

 

List {    DataStructure topics;    getTopics();    sort()    {        AskUserForSort();        choice=getUserChoice();        switch (choice){        }    }    afich()    {        AskUserForafich();        choice=getUserChoice();        switch (choice){        }    }}getUserChoice();main(){    List Forum;    Forum.getTopics();    List.sort();    List.afich();}

كما اتفقنا topic هي صندوق يحوي بيانات ( عمليّاً سننفذها كــstruct ) ولديه واجهة للتعامل مع المستخدم .. وواجهة أخرى للتعامل مع باقي العناصر ..

هذه هي بنيته:

Topic{    //data    ..        UserInput ();//تخاطب مع المستخدم    UserOutput();        getdata();//تخاطب مع الدوال    setdata();}

يجب فصل دوال التخاطب مع المستخدم دوماً , فقد نرغب في تطوير البرنامج إلى واجهة رسومية لاحقاً ..

فكلما وجدت AskUser أو getUserChoice بالعربي (choice=اختيار) فهذه لن نقترب منها الآن .. (أصلاً كتابتها سهلة جداً ) وبالمثل دوال الطباعة .. هذه آآآخر مرحلة في التصميم .(ولكن الأولى في التنفيذ)

في هذه المرحلة :اختيار الخوارزميات وهياكل البيانات

من الواضح أننا بحاجة إلى خوارزمية ترتيب , وإلى هيكل بيانات للقائمة ..

وحتّى لا نغوص في تفاصيل تصميمية .. سأعرض عليك المشاكل ثم سنقوم بتغيير الأسباب التي أدت لها ..

يعني لا داعي لأقول لك الحل قبل أن تفهم وتعاني من المشكلة :)

سنستخدم مصفوفة :) تذكر أن كل الهياكل يمكن استخدامها ..ولكن لكل واحدة محاسن ومساوئ .. ويجب استخدام ما هو مناسب للتطبيق

ولكن سنعتبر أننا نجهل أفضل هيكل الآن ..

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

إذا عندك تجريد أفضل .. تفضّل :)

ماذا أستفيد من الكلام السابق ؟

ببساطة عندما أغيّر القيمة المطلوب الترتيب حسبها فسأغير دالة المقارنة وفقط ..

أي أن دالة الترتيب ستكون كما يلي:

sort()    {        AskUserForSort();        choice=getUserChoice();        switch (choice){        case a:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_a);        case b:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_b);            ...        }    }

حيث SortAlgorithm ستكون حجر الأساس ..

وكما لاحظت علينا كتابة دالة مقارنة _HowToCompare_ عدة مرات لكل نوع .. وهكذا نكون وصلنا لأكبر قدر ممكن من التفصيص

وسنبدأ التطبيق الآن :)

أولاً : اقرأ الكود التالي وتأكد أنه ينفّذ ما تريد لو كانت أجسام الدوال موجودة :

Topic{    //data    ..        UserInput ();//تخاطب مع المستخدم    UserOutput();        getdata();//تخاطب مع الدوال    setdata();}List {    TopicArray topics;    getTopics(){        do{            askUser            if(Create)            {                createTopic//                topic.getdata();            }            if(Stop)                break;        }while(1);    }    sort()    {        AskUserForSort();        choice=getUserChoice();        switch (choice){        case a:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_a);        case b:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_b);            ...        }    }    afich()    {        AskUserForafich();        choice=getUserChoice();        switch (choice){        }    }}getUserChoice();main(){    List Forum;    Forum.getTopics();    List.sort();    List.afich();}

لاحظ أنا التجريد يسمح لي بأن أعتبر الكود السابق أساس لأي مسألة مشابهة  .. دون أن أحتاج تعديل أي شيء في التصميم ..

ولكن ماذا عن التنفيذ ؟

سنبدأ بحجر الأساس وهو الكتلة Topic سأترك لك إضافة باقي العناصر وسأكتب بعضها فقط

struct Topic {    int     id;    char*    title;    char*    path;    int     replies;//عدد الردود    //... أكمل الباقين كما يحلو لك    //... وعندما نريد تطوير البرنامج أكثر قد نحتاج لإضافة المزيد من العناصر    getId(){}//سنهملها حاليّا ونصل للعناصر مباشرة باستخدام النقطة    setdata(int _id,char*_title,char*_path,...)    {            }    //على عكس التصميم الذي نترك فيه التعامل مع المتسخدم للآخر .. في التنفيذ نبدأ به أولاً    // لذلك سأكتب أجسام الدوال بشكل أولي    UserInput ()    {        printf("Enter ID : ");scanf("%i",&id);        printf("Enter title : ");scanf("%s",title);//انتبه ألا يكون بداخل العنوان فراغات وإلا عدّل الدالة        printf("Enter path : ");scanf("%s",path);        ...    }    UserOutput()    {        printf("Id=%i",id);        printf("title=%s",title);        ...    }};

والآن أصبح بإمكاننا التعامل مع موضوع واحد .. ويمكننا تطويره كيفما نشاء بعد أن نتابع

سأترك تنفيذ List لك وسأكتب عن دالة الترتيب باعتبارها الجزء الأهم

sort()    {        AskUserForSort();        choice=getUserChoice();        switch (choice){        case a:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_a);        case b:            SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_b);            ...        }    }

كل ما يهمّني هو :

SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_a);

سأكتبها لك بالتفصيل .. سأستخدم بداخلها دالة جاهزة qsort من باب كسب الوقت .. يمكنك مراجعة هذا الموضوع

void SortAlgorithm(Topic* topics,int NumberOfTopics,int(*_HowToCompare_Function_)(const void*,const void*)){    qsort(topics,sizeof(Topic),NumberofTopics,_HowToCompare_Function_);}

هل رأيت مدى التجريد الذي تستخدمه مكاتب اللغة ودوالها ؟ المؤشرات إلى void وأنت تكفل بالتحويل إلى النوع الذي تريد

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

الأولى لمقارنة الأرقام :

int _HowToCompare_Function_integers(const void*a,const void*b){    int A=*((int *)a);    int B=*((int *)b);    if(A==B)        return 0;    if(A>B)        return 1;    return -1;}

لتغيير الترتيب من تصاعدي إلى تنازلي فقط غيّر الشرط الذي يعيد 1 ..اجعله -1 .. والـ-1 اجعلها 1

مقارنة السلاسل :

int _HowToCompare_Function_strings(const void*a,const void*b){    char A=*((char *)a);    char B=*((char *)b);    for(int i=0;A[i]&&B[i];i++)    {        if(A[i]>B[i])            return 1;        if(A[i]<B[i])            return -1;    }    if(A[i])return -1;    if(B[i])return 1;    return 0;}

هكذا بهذه البساطة ..

والآن دورك :)

أي سؤال .. أي استفسار .. أظن موضوع التجريد قد وصل بشكل جيد ..

والآن لديك Puzzle وعليك تركيب القطع والحصول على ما تريد ..

دورك في الأسئلة والتطبيق ..

بالتوفيق

تم تعديل بواسطه مصطفى 36a2
إضافة رابط qsort
1

شارك هذا الرد


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

جيد وضعت الهيكل العام للمشروع

 

اوك انا الآن في طور القراءة والفهم

توجد بعض الاستفسارات في الاكواد الدي وضعت خصوصا انك معتمد اللغة الانجليزية لكن هدا جيد بالنسبة لي لأنني سأتعود على اللغة الانجليزية عوض الفرنسية

 لكن ساحوال ان اجيب عنها بنفسي

 

+ ممكن محتوى الدالة qsort

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
List {    DataStructure topics;    getTopics();    sort()    {        AskUserForSort();        choice=getUserChoice();        switch (choice){        }    }    afich()    {        AskUserForafich();        choice=getUserChoice();        switch (choice){        }    }}

لمادا afich ; sort getTopic داخل list ؟؟

 

وحتّى لا نغوص في تفاصيل تصميمية .. سأعرض عليك المشاكل ثم سنقوم بتغيير الأسباب التي أدت لها ..

يعني لا داعي لأقول لك الحل قبل أن تفهم وتعاني من المشكلة 

 

المشاكل وقعت فيها من الكود الأول استعملت الغوريتم الترتيب tri par insertion حيت احتجت الى الرجوع الى الوراء في القوائم وانا كنت مستعمل القوائم المتصلة من جهة فقط

 

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

إذا عندك تجريد أفضل .. تفضّل   :) 

 

هده هي الطريقة التي استعملها دائما في دوال الترتيب

 

سأترك تنفيذ List لك وسأكتب عن دالة الترتيب باعتبارها الجزء الأهم

 

لم اكتب الكود الدالة list وضعت ما اعتقد انه سيكون

 

هل رأيت مدى التجريد الذي تستخدمه مكاتب اللغة ودوالها ؟ المؤشرات إلى void وأنت تكفل بالتحويل إلى النوع الذي تريد

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

 

على ما اضن الدوال التي استعملت انت للترتيب يمكنها العمل على العديد من الانواع

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

 

هدا الكود هو الدي فهمته انا بهدا الشكل

struct Topic{    int     id;    char*    title;    char*    path;    int     replies;        getId() {} //مادور هده الدالة؟؟    setdata(int _id,char*_title,char*_path,...) //كدالك هده؟؟    {    }    UserInput ()    {        printf("Enter ID : ");        scanf("%i",&id);        printf("Enter title : ");        scanf("%s",title);        printf("Enter path : ");        scanf("%s",path);        ...    }    UserOutput()// هل هده الدالة للتأكد من صحة ادخال البيانات ام مادا ؟؟    {        printf("Id=%i",id);        printf("title=%s",title);        ...    }};int _HowToCompare_Function_integers(const void*a,const void*b){    int A=*((int *)a);    int B=*((int *)b);    if(A==B)        return 0;    if(A>B)        return 1;    return -1;}int _HowToCompare_Function_strings(const void*a,const void*b){    char A=*((char *)a);    char B=*((char *)b);    for(int i=0; A[i]&&B[i]; i++)    {        if(A[i]>B[i])            return 1;        if(A[i]<B[i])            return -1;    }    if(A[i])return -1;    if(B[i])return 1;    return 0;}//-1 ; 1 ; 0 ؟؟ qsort على ما أضن تحتاجهم الدالة void SortAlgorithm(Topic* topics,int NumberOfTopics,int(*_HowToCompare_Function_)(const void*,const void*)){    qsort(topics,sizeof(Topic),NumberofTopics,_HowToCompare_Function_);}sort(){    AskUserForSort();    choice=getUserChoice();    switch (choice)    {    case a:        SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_integers);    case b:        SortAlgorithm(topics,NumberOfTopics,_HowToCompare_Function_strings);        ...    }}afich(){    AskUserForafich();    choice=getUserChoice();    switch (choice)    {    }}List{    DataStructure topics;// topic كما قلتَ سنستخدم مصفوقة من نوع// التي نملك topic دات حجم ديناميكي على حسب عدد}getTopics();getUserChoice();main(){    List Forum;    getTopics();    sort();    afich();}
0

شارك هذا الرد


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

مادا afich ; sort getTopic داخل list ؟؟

لأن القائمة يجب أن تعرف كيف ترتّب نفسها .. ما أدراني أنا كيف سأرتبها (أتكلم بصفتي دالّة خارج List)   ... هذه هي طريقة التفكير كا\ني التوجّه .. كل كائن يعرف كيف يهتم بنفسه ..

 

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

إذا عندك تجريد أفضل .. تفضّل   smile.png

هده هي الطريقة التي استعملها دائما في دوال الترتيب

نعم .. أتحدّث عن التعريف المجرّد للترتيب .. (بشكل مبسّط وغير علمي )

 

على ما اضن الدوال التي استعملت انت للترتيب يمكنها العمل على العديد من الانواع

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

السبب هو التجريد .. فأنت حاولت حل المسألة بشكل خاص .. أما ما أريد الوصول إليه أن نتمكن من حل كل المسائل مهما اختلفت المتغيرات .. ( وأعني بكل المسائل .. كل المسائل من نفس النوع )

 

 

getId() {} //مادور هده الدالة؟؟

setdata(int _id,char*_title,char*_path,...) //كدالك هده؟؟

بصراحة ليس لها دور :) ولكنها تُستخدم عادة لتغيير بيانات الكتلة ...get تعني احصل على .. والمفترض أن تقوم دالة خارج Topic ساستدعائها ..ولكن في حالتنا سنستعمل الوصول المباشر باستخدام . مثلاً topics[1].id

 

 

UserOutput()// هل هده الدالة للتأكد من صحة ادخال البيانات ام مادا ؟؟

هذه سنستخدمها كلما أردنا طباعة محتوى Topic معينة .. والمفترض أن تطبع كل البيانات .. بطريقة هي وحدها المسؤولة عنها .. (واجهة أو شاشة سوداء أو ملف صوتي أو أو أو ... للانهاية .. المهم أنني سأتركها لعضو آخر في الفريق (لو كنا فريق))

 

 

//-1 ; 1 ; 0 ؟؟ qsort على ما أضن تحتاجهم الدالة

:) صحيح .. على كل حال ..كل شيء عن qsort تجده هنا إن شاء الله .

 

 

DataStructure topics;

// topic كما قلتَ سنستخدم مصفوقة من نوع

// التي نملك topic دات حجم ديناميكي على حسب عدد

لا تقلق بشأنها .. ابدأ بجعلها مصفوفة ثابتة ثم سنغيّرها لاحقاً :)

 

أخيراً ... هناك عبارة فكّرت فيها جيّداً أثناء أحد المشاريع التي لم تكتمل إلى الآن ...

 

الهدف هو الوصول إلى أفضل حل .. ولكنك لست ملزماً بأن تسلك أفضل الطرق للوصول ..

كمثال توضيحي : الهدف أن نصل لأفضل مشروع . ولكن هذا لا يعني أن تكون كل خطواتنا مثالية , بالعكس يُسمح لنا أن نتسخدم أسخف الطرق ونطوّرها شيئا فشيئاً حتى لو بدا ذلك مخالفاً للهدف ..

(ملاحظة : أرجو ألا يتم خلط القاعدة السابقة مع الغاية تبرر الوسيلة فالأمر مختلف بشكل جذري .. فهنا نتحدّث عن طريقة التفكير التي قد تبدأ من أفكار ساذجة طفولية وتنتهي بتغيير العالم , وليس عن أساليب غير شرعية للوصول إلى الأهداف )

 

بالتوفيق للجميع .. ولك أخي القارئ :)

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


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

اوك كل شيئ مفهوم وواضح

 

استفدت منك طريقة جعل كل شيئ يهتم بنفسه كما قلت وهي طريقة رائعة

 

+ انت تبرمج بطريقة رائعة وهي انك تقوم بجعل الكود قابل للتعديل والاضافة ببساطة, اي انك لا تبني الكود على اشياء محددة

وهده هي افضل طريقة للبرمجة خصوصا ادا كنت تفكر في صنع اصدارات مطورة للمشروع

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

ان شاء الله تصبح لدي هده الطريقة :)

 

+ مادا الآن بخصوص التمرين ؟؟

0

شارك هذا الرد


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

ممتاز ..


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

ربما يمكنك الوصول لها بالتفكير المتجرّد .. وهي على كل حال تقريباً الــ OOD أي التصميم كائني التوجه .. object oriented design ابحث عنه .

 

الآن صار لدينا (أعضاء الفريق ) معرفة كاملة بالهدف .. وبالحل بشكل مجرد ..

 

الآن المرحلة الثانية سنقسّم العمل .. (أعرف أنك يمكنك الحل لوحدك . ولكن حتى نتعلم تقسيم العمل )

أهم ما استفدناه من التجريد السابق هو إمكانية توزيع العمل .. أليس كل كائن يهتم بنفسه .. وكل دالة لها واجهة (وسطاء) وتقوم بعمل معين(خوارزمية) وتعطي ناتج ما (return)

 

يمكننا الآن أن نتفق على عدة أمور منها لغة البرمجة الأنسب لحل المسألة ! نعم لا تستغرب .. فكل ما قمنا به الآن غير مرتبط بلغة معيّنة .. ولكن بما أننا تطرقنا لـqsort ونحن كسالى لكتابة شيء آخر

سنستخدم ++C لأنها توفّر لنا الأدوات اللازمة لبناء كود Object Oriented  .. ولكن أظن أنك تفضّل C  إذاً لا بأس .. سنستخدم C

 

ما هي أجزاء العمل ؟

1- دالة الترتيب sort .

2- بنية الـtopic وبنية القائمة .

3- الواجهة التخاطبية بين الدوال ( كود القيادة )

4- واجهة المستخدم .

 

لنفترض أن عليك كتابة كود sort .. وأنا عليّ كتابة كود القائمة topic , List.. اتفقنا :) نعم .

 

سنتّفق الآن على واجهة الدوال والبنى struct ..

كما يلي :

لا يهمّني من كل ما ستقوم به سوى :

 أن تقوم الدالة بترتيب العناصر

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

انتبه :

بما أن جزء topic أنا المسؤول عن كتابته , فعليك أن تفرض عليّ بعض التوابع المطلوبة (داخل الدالة sort) بحيث لا تتدخل أبداً في محتوى List أو topic تخيّل فقط أن أي دالة تحتاجها ستكون موجودة

 

مثال توضيحي :

افرض أن topic تحوي البيانات التالية :

struct Topic{        int id;        char* address;    };

يجب أن تتخيل أنك لا تعرف أي شيء من البيانات , فكيف ستقوم بطباعة الرسالة : Enter Topic Id  (أدخل رقم الموضوع ) وأنت لا  تعرف أن الموضوع له رقم أصلاً ؟

ما رأيك بأن تتخيل وجود الدالة getContent (احصل على المحتوى) وتتخيل أنك تعطيها وسيط هو رقم العنصر داخلtopic وهو يرجع لك بنية تحوي الاسم والنوع !!

مثلاً :تعطيه 1 .. فيرجع لك "id" و "int"  و تعطيه 2 (كوسيط) فيرجع " address" و "char*"

ثم تتكفل بطريقة التعامل معه .. ما رأيك ؟

وفي الآخر ستعطيني قائمة طلبات .. كل الدوال التي تريدها , مع وسطائها , ووظيفتها , وقيمها المعادة . وأنا وظيفتي أن أوفرها لك .

 

الطريقة السابقة طويلة ومتعبة .. ولكنها ستتيح لنا إضافة ما نريد إلى Topic دون أن نغيّر أي شيء داخل الدالة الخاصة بك .. وبهذا يكون تصميمنا ممتازاً ..

أي قطعة كود تضيفها بحيث لا تضطر لإعادة الدخول إليها .. فهي مكتوبة بشكل جيد جداً .

فكّر :)

بالنسبة لوظيفتي .. فعليّ كتابة List تحوي على البنية topic.. وعندي نفس المشاكل الخاصة بك بشأن معرفة محتويات الـtopic...  ولذلك انظر ما الذي سنفعله :

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

 

إذاً سأبدأ العمل ( صار في شغل الآن وانتهى الكلام :D )

وأنت ابدأ العمل براحتك ونلتقي خلال اليومين القادمين للتسليم ..

 

هل هناك أسئلة أو استفسارات ؟

0

شارك هذا الرد


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

سنستخدم ++C لأنها توفّر لنا الأدوات اللازمة لبناء كود Object Oriented  .. ولكن أظن أنك تفضّل C  إذاً لا بأس .. سنستخدم C

جيد ضروري استخدام السي 

 

لنفترض أن عليك كتابة كود sort .. وأنا عليّ كتابة كود القائمة topic , List.. اتفقنا :) نعم .

اتفقنا

 

ما رأيك بأن تتخيل وجود الدالة getContent (احصل على المحتوى) وتتخيل أنك تعطيها وسيط هو رقم العنصر داخلtopic وهو يرجع لك بنية تحوي الاسم والنوع !!

طريقة مفيدة ولم افكر فيها من قبل + هل سبق وان استخدمت هده الطريقة ؟؟

getContent(int posiDeVarAuStruct,...)(    //؟؟ topic هل يجب علينا ان لاندكر اي من محتويات    // يعني يجب علينا ان نجعل هده الدالة تتعرف على المحتى لوحدها؟؟)

الطريقة السابقة طويلة ومتعبة .. ولكنها ستتيح لنا إضافة ما نريد إلى Topic دون أن نغيّر أي شيء داخل الدالة الخاصة بك .. وبهذا يكون تصميمنا ممتازاً ..

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

 

وأنت ابدأ العمل براحتك ونلتقي خلال اليومين القادمين للتسليم ..

يبدأ العد التنازلي من الآن

0

شارك هذا الرد


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

ما رأيك بأن تتخيل وجود الدالة getContent (احصل على المحتوى) وتتخيل أنك تعطيها وسيط هو رقم العنصر داخلtopic وهو يرجع لك بنية تحوي الاسم والنوع !!

طريقة مفيدة ولم افكر فيها من قبل + هل سبق وان استخدمت هده الطريقة ؟؟

getContent(int posiDeVarAuStruct,...)
(
//؟؟ topic هل يجب علينا ان لاندكر اي من محتويات
// يعني يجب علينا ان نجعل هده الدالة تتعرف على المحتى لوحدها؟؟
)

لم أجربها من قبل ولكن من الوضح أنها Cool :) .. لا لن تتعرف على المحتوى لوحدها فهي من ضمن الكائن topic أي أننا عندما نريد إضافة أي عنصر جديد .. مثلاً وقت المشاركة أو شعبية المشاركة مثلاً .. فسنضيف int داخل الـstruct وسنضيف سطراً داخل الــ switch الموجودة بداخل الدالة getContent وهي ستعيد لنا (int, الشعبية) كنص مثلاً .. أظن الفكرة وصلت :)


يبدأ العد التنازلي من الآن

نعم بدأ :) .. سأتابع الحل مع الأستاذ C++er في ++C طبعاً :D  .. ومعك في C ....

بالتوفيق للجميع :)

0

شارك هذا الرد


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

switch هدا ما فكرت فيه

لكن ظننتك تريد دالة تتعرف على المحتويات وحدها

رأيت الامر صعب نوعا ما لدى سألتك اد كنت سبق واستعملتها

فما رأيك بصنع هده الدالة بعد الانتهاء من التمرين ؟؟ ان كان دالك ممكنا

______________

سأجيبك هنا بما أنني يمكنني ذلك :

لا أعرف إن كان بإمكاننا معرفة محتويات البنية بجون أي اتصال مسبق ..سيكون هذا مثيراً .. موافق على العمل عليها ولكن لست متفائلا بالنتائج :)

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


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

(مصطفى) ملاحظة : قمت بفصل الموضوعين لأن الحل بلغة ++C مختلف كثيراً عن الحل بلغة C

___________________

هناك مشكلة في وسم الكود في المنتدى .

الكود في المرفقات

FD.c

تم تعديل بواسطه مصطفى 36a2
تنسيق الكود
0

شارك هذا الرد


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

بعض التعديلات البسيطة على الدالة getcontent

 

main.c

0

شارك هذا الرد


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

السلام عليكم أخي محسن
بصراحة أستغرب من قدرتك على كتابة كل هذا الكود بدون أن تجربه :) ما شاء الله عليك
وكذلك : كيف يمكنك تجاوز أجزاء لم تفهمها وتبني على أساسها .. رائع
أرى أنك قمت بكتابة الكود كاملاً :) لا بأس .. سنقسّم العمل في مرة أخرى ..
بالنسبة للكود الذي كتبته , ففيه أخطاء :

long *adrsData;// مؤشر لادخال واخراج محتويات الموضوعadrsData=&Topic.id;
ما هذه العملية التي استخدمتها !!
ثانيا: كيف ستأخذ عنوان شيء هيلكي .. أقصد أن Topic.id ليست عنصرا حقيقيا بل هي هيكل .. أي أنه لا يحوي بيانات !
هناك فواصل منقوطة غير موجودة , متحولات غير معرّفة ..
وفي لغة C لا يمكننا تعريف توابع بداخل الـstruct .. كنت قد كتبتها سابقاً من باب التوضيح أنها خاصة بالـstruct أما عملياً فيجب أن تكون خارج جسم الـstruct
أما الأفكار المنفّذة فهي ممتازة .. يعني إذا اعتبرت أن الكود هو شرح لأفكارك فهو جيد جداً ..
سأقوم بالتعديلات اللازمة على كودك ليعمل وأرفعها ..


(ملاحظة : لا أدري ماذا كنت تفكر وأنت تكتب الكود .. لم أطلب منك سوى كتابة دوال الترتيب :))

أرى أنك فهمت الفكرة تماماً عندما قرأت بعض الأسطر مثل:
maList[i].UserInput();
قمت بتغيير بعض الأمور التي لم تعمل (بدون أن أغير الفكرة الرئيسية التي أردت تنفيذها)
اقرأ الأكواد بعناية وانتبه إلى النقاط التي تغيرت وكيف تغيرت .. فهذا أفضل من أن أشرح :p
 

الكود يعمل ولكن هناك مشاكل بالمؤشرات .. إن كان لدي وقت سأحلها .. المهم أن تقرأ الكود الآن ..

بالتوفيق

Lists.rar

0

شارك هذا الرد


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

لا أدري أين اختفى الأخ محسن .. عسى المانع خير ..

على كل حال  أنهيت العمل على النسخة الأولى من البرنامج ..

المشروع في المرفقات ... بانتظار أي تطوير من الأعضاء .. على كل حال الكود يحتاج إلى الكثير بعد :)

 

CLists.rar

0

شارك هذا الرد


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

وجدت الموضوع بالصدفة

أسف مرت سنة كاملة

 

تعديلات بسيطة في المرفقات

توقفت بسبب دالة الترتيب

http://arabteam2000-forum.com/index.php/topic/281879-%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AF%D8%A7%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%B1%D8%AA%D9%8A%D8%A8-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-qsort/

 

في انتظار اجابة ...

ConsoleApplication1.rar

0

شارك هذا الرد


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

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

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



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

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

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