تمرين على استخدام القوائم (باستخدام ++C )
الكود موجود بالمرفقات و توجد بعض الملاحظات:
1- قمت بتصحيح عمل الدالة menu_view و اصبح حجمها كبير و من الأفضل إن تم تطوير المشروع تقسيمها لعدة دوال لتسهيل تطويرها و تصحيح الأخطاء بها (إن وجد).
2- قمت بتصحيح محتوى الدالة sort::set_dir حتى يصبح إتجاه العرض سليم.
3- قمت بإضافة الملف cmdline.cpp حتى يتم معالجة الـ command line من خلاله و يوجد أمرين فقط:
-h display this message. -at:filename pass file with data to load.
الأمر at يتم تمرير ملف له يحتوى على صيغة معينه - سأذكرها بعد قليل - ليقوم بتحميل محتوياته دفعه واحدة بدلا من الكتابة داخل الـ console، حيث تقوم الدوال المسئولة عن تحميل المف بإدخال القيم مباشرة إلى store الموجود بالـ forum الذى تم إنشائه داخل main.
4- مع الكود يوجد الملف data.txt الذى يحتوى على القيم التى سيتم تحميلها.
5- قمت بإضافة الملف load_file.cpp ليقوم بمعالجة و تحميل محتوياته داخل الـ store، الكود حوالي 500 سطر لذا إقراءه بعناية إن اردت التطوير فيه.
6- توجد بعض الأخطاء المنطقية فى الترتيب حيث hash النص لا يقوم بالترتيب بشكل صحيح (لم أضف استخدم عدد الحروف لعدم تعقيد الكود).
7- الترتيب التصاعدى و التنازلي يعمل بشكل سليم و لكن من داخل الدالة menu_view يحتاج لإعادة النظر حيث انه بعد فترة من الإستخدام اتجاه الترتيب يتغيير.
*********************
سنفترض ان الملف الذى يحتوى على البيانات من خلال load_file إسمه ملف البيانات.
1- لإضافة تعليق داخل ملف البيانات قم بجعل اول حرف داخل السطر #، هذا الرمز يجعل معالج الملف يتجاهل السطر بأكمله.
2- داخل ملف البيانات يمكنك استخدام نوعين من المساحات الفارغة و هم space و horizontal tab.
3- داخل ملف البيانات يمكنك إستخدام حروف ASCII فقط و في المدى من 0x21 و حتى 0x7E.
4- ملف البيانات يقرأ كل سطر على حدة و غذا وجود خطأ فى السطر يتم تجاهله بأكمله مع كتابة رسالة تفصيلية بالخطأ داخل standard error.
5- ملف البيانات يعرف ثلاثة انواع للبيانات و هم:
A- نص: و هو حرف او اكثر فى المدى ASCII المسموح به و بين اى حرفين يمكن استخدام اى عدد من المساحات الفارغة المسموح بها.
B- رقم: و هو قيمة رقميه موجبه يمكن حفظها داخل النوع signed int و الإشارة غير مسموح بها.
C- تاريخ: و يمثل تاريخ فى المدى من 1/1/1900 حتى 31/12/2100 ولابد من مراعاة اسنة الكبيسة و تأثيرها على عدد أيام شهر فبراير.
6- سطر البيانات ينقسم لـ 6 أجزاء هم:
A- عنوان الموضوع.
B- رابط الموضوع.
C- إسم كاتب الموضوع.
D- تاريخ كتابة الموضوع
E- عدد المشاهدات.
F- عدد الردود
7- أقسام عناصر سطر البيانات لابد ان تكون بنفس الترتيب السابق ذكره و فى نهاية كل منهم علامة نهاية البيانات و هى @@@ و بالنسبة لعدد الردود فوضعها إختيارى.
8- أى مساحات فارغة قبل و بعد بيان معين يتم حذفها و يتم هذه المساحات بأنها تسبق و تلي علامة نهاية البيان @@@ و المساحات الفارغة فى بدايية السطر قبل اى حرف و بعد اخر حرف فى اخر بيان يتم حذفهم.
9- يتم التحقق من محتوى البيانات بكل سطر و إذا وجد بيان ذات محتوى مخالف يتم تجاهل كافة السطر.
أنظر محتوى الملف data.txt لترى كيف تم تنظيمهم.
************************
قمت بمراجعة الأكواد التى كتبتها و لم اجد اخطاء بها حتى الأن، و بالتالي أستطيع القول ان المشروع انتهى بحمد الله.
اقتباس
كيف يجب أن تكون المرحلة التالية في التطوير ؟
يمكنك إعتبار النسخه المرفقه هى نهاية الإصدار الأول، و تبدأ فى تصميم الإصدار الثاني و تقوم بإضافة خصائص جديدة و تحسين خصائص موجوده، فمثلا الدالة menu_view يمكن ان تضيف عناصر جديده داخل القوائم الداخلية تجعل لدى المستخدم القدره على معرفة نوع الترتيب الحالي و اتجاه الترتيب و هكذا.
اقتباس1- القراءة والكتابة من وإلى الملفات (دوال جديدة )
إذا كنت تقصد حفظ المحتويات التى ادخلها المستخدم، فيمكنك استغلال نوع الملفات الذى قمت بكتابته و تقوم انت بكتابة دالة لحفظ محتوى الـ store و انا متأكد ان هذه الدالة لن تجد مجهود فى كتابتها حيث هى فى الأغلب ستكون عبارة عن loop و عند التحميل يقوم المستخدم بتمرير الملف ليقوم البرنامج بتحميله.
اقتباس2- إنشاء قاعدة بيانات خاصة بالفئة request فعندي بعض الأفكار حول التحقق من المدخلات لمنع بعض الكلمات مثلاً في العناوين أو الأسماء (تتطلب تغييرات في الفئة request فضلاً عن إنشاء القوائم وإمكانية التعديل عليها)
هذا لا علاقة له بالفئات request فأنت ستقوم بتحميل ملف نصي داخل فئه جديده و من خلال request تقوم بتمرير النص او الكلمه التى لديك و الفئة الجديده ستقوم بالتحقق من الكلمه او النص المدخل و تعيد لك قيم من خلالها تعرف اذا كانت النص يحتوى على كملمه ممنوعه و يعيد لك موقعها و حجمها او يبدل لك الكلمه الممنوعه بنجوم.
اقتباس3- إنشاء واجهة مستخدم رسومية.. ويمكننا القيام بذلك دون المساس بأي جزء داخل الأكواد .. (لدي فكرة يمكن أن تحل هذا الأمر)
كما ذكرت لك فى مشاركة سابقة الواجهه الرسويه كل ما تحتاجه هو عدم استبدال forum و view و request بأخرين يتعاملوا مع واجهه رسومية لإنك إن حاولت التعديل عليهم ليدعموا واجهه رسوميه فبذلك انت تتعدى الهدف من وجودهم بالأصل و هو جعل البرنامج يعمل بأكثر من واجهه احداهما من الـ shell و الأخرى رسوميه.
و عموما الأمر عائد لك افعل ما تحب ففى النهاية نحن نكتسب خبرات من تجاربنا و تجارب الأخرين.
اقتباس4- تمديد فئة الـ Subject بشكل عام .. (أي شيء يمكن إضافته) مثل جعل عدد الردود قائمة من الردود أو إضافة تقييم للمواضيع وما إلى ذلك .. سيتطلب إضافة دوال كثيرة لـ getو set وللتحكم بشكل عام
تعديل subject ٍيجعلك تعدل اجزاء مهمه من البرنامج مثل فئات الـ sort و ايضا تصميم ملف البيانات و إذا كنت ستكمل مع نظام عرض الـ shell ستحتاج لتعديل كافة عناصر العرض.
الموضوع ليس بالهين و ما يجعله اصعب انى لم اقم بكتابة توثيق كافي لك داخل الأكواد الخاصه بي.
***********
عموما كانت رحلة ممتعه فى كتابة هذا البرنامج، و الأن أنتهى دورى بحمد الله.
و الله ولي التوفيق
مدونتي: C++ Tips and Tricks
اقتباسقمت بمراجعة الأكواد التى كتبتها و لم اجد اخطاء بها حتى الأن، و بالتالي أستطيع القول ان المشروع انتهى بحمد الله.
نعم الحمد لله ... جزاك الله خيراً , استفدت كثيراً
______________________________________
اقتباسكما ذكرت لك فى مشاركة سابقة الواجهه الرسويه كل ما تحتاجه هو عدم استبدال forum و view و request بأخرين يتعاملوا مع واجهه رسومية لإنك إن حاولت التعديل عليهم ليدعموا واجهه رسوميه فبذلك انت تتعدى الهدف من وجودهم بالأصل و هو جعل البرنامج يعمل بأكثر من واجهه احداهما من الـ shell و الأخرى رسوميه.
و عموما الأمر عائد لك افعل ما تحب ففى النهاية نحن نكتسب خبرات من تجاربنا و تجارب الأخرين.
سيكون هناك فئات shell وفئات gui منفصلة عن بعضها على الأرجح
______________________________________
اقتباستعديل subject ٍيجعلك تعدل اجزاء مهمه من البرنامج مثل فئات الـ sort و ايضا تصميم ملف البيانات و إذا كنت ستكمل مع نظام عرض الـ shell ستحتاج لتعديل كافة عناصر العرض.
الموضوع ليس بالهين و ما يجعله اصعب انى لم اقم بكتابة توثيق كافي لك داخل الأكواد الخاصه بي.
قرأت كل الأكواد التي كتبتها سابقاً وأظن أني فهمت سبب وجود كل دالة ,
وأكثر ما يثير استغرابي هو تجنبك لاستخدام أي دالة من C !! يعني حتى isdigit ممنوعة :D
هل هناك توجّه في C++14 لإيقاف العمل بمكاتب C :) !!
______________________________________
اقتباس- قمت بإضافة الملف load_file.cpp ليقوم بمعالجة و تحميل محتوياته داخل الـ store، الكود حوالي 500 سطر لذا إقراءه بعناية إن اردت التطوير فيه.
تم , parser بسيط وكود واضح جداً ... شكراً لك
Tilda هل هذا هو اسم الأخت ~ :)
اقتباسC- تاريخ: و يمثل تاريخ فى المدى من 1/1/1900 حتى 31/12/2100 ولابد من مراعاة اسنة الكبيسة و تأثيرها على عدد أيام شهر فبراير.
كتبت كود مماثل داخل request الخاصة بالتاريخ , ولكنك نسيت التحقق من 30 أو 31 يوم للأشهر العادية :D
اقتباسأنظر محتوى الملف data.txt لترى كيف تم تنظيمهم.
مرتبة جداً .
______________________________________
اقتباسعموما كانت رحلة ممتعه فى كتابة هذا البرنامج، و الأن أنتهى دورى بحمد الله.
جزاك الله خيراً ...:)
إن شاء الله يكون هناك همّة وترى النسخة الثانية قبل نهاية الشهر
وفقك الله