• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Khaled Alshaya

المشرفون
  • عدد المشاركات

    2,052
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة Khaled Alshaya

  1. read a text file

    #include <fstream> #include <string> #include <iterator> #include <algorithm> using namespace std; typedef istream_iterator<string> input_i; typedef ostream_iterator<string> output_i; int main() { ifstream input_file("input.txt"); ofstream output_file("words_list.txt"); copy(input_i(input_file), input_i(), output_i(output_file, "\n")); } Using the following file as an example: Hello to arabteam2000-forumThis was your first question which was too vague to interpret exactly what you meant Next time please be more specific about your requirements produces the following file: Helloto arabteam2000-forum This was your first question which was too vague to interpret exactly what you meant Next time please be more specific about your requirements
  2. pthreads in C

    و عليكم السلام, عزيزي, أنت لم تقم بعمل link للمكتبة. قم باستخدام الطريقة التالية عند ترجمة الأمثلة التي لديك و حاول دائماً أن تكتب كود standard بقدر الإمكان. قمت بتعديل المثال الذي لديك ليصبح أكثر صحة, و طريقة الترجمة و الربط مع المكتبة تلي ذلك: #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *print_message_function( void *ptr ); int main() { pthread_t thread1, thread2; char *message1 = "Thread 1"; char *message2 = "Thread 2"; int iret1, iret2; /* Create independent threads each of which will execute function */ iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); /* Wait till threads are complete before main continues. Unless we */ /* wait we run the risk of executing an exit which will terminate */ /* the process and all threads before the threads have completed. */ pthread_join( thread1, NULL); pthread_join( thread2, NULL); printf("Thread 1 returns: %d\n",iret1); printf("Thread 2 returns: %d\n",iret2); return 0; } void *print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); return NULL; } [email protected]:~/test$ gcc -Wall -std=c89 -lpthread threads.c [email protected]:~/test$ ./a.out Thread 1 Thread 2 Thread 1 returns: 0 Thread 2 returns: 0 إضافة إلى ذلك, فالـ standard output stream ليس thread safe بمعنى أنك يجب أن تقوم بعمل synchronization عند الإخراج. لا تقلق حالياً من هذه النقطة, مادمت في طور كتابة الأمثلة البسيطة. بالتوفيق.
  3. موضوع شائك في الملفات !

    أخ TheBigBiss, الفكرة وصلت من زمان, و لكنك لم تجب عن السؤال التالي: حدد لي مجموعة البيانات الأولية التي لديك, لأخبرك كيف تقوم بتمثيلها encoding لها. هناك طرق عديدة لتمثيل البيانات. فمثلاً يمكنك القول بأنك ستعامل البيانات و التي تكون متصلة لديك أصلاً على أنها عناصر كل عنصر عبارة عن 4 bits و في تلك الحالة, أقصى عدد من البيانات الأولية و هي الأعداد في حالتك يمكن حمله في أي واحدة من تلك العناصر هو عنصر من 16 عنصر يمثلون مجموعة البيانات الأولية لديك. وصلت الفكرة؟ لو أخذنا كلامك عن العدد 00110110 مثلاً, عندما يكتب المستخدم أي عدد للملف, كيف سيقرأه برنامجك مرة أخرى؟ 00110110 ستكون الإجابة واحدة من الاحتمالات التالية: 00110110 ========= 0011011 0 001101 10 00110 110 0011 0110 001 10110 00 110110 0 0110110 الآن إما أن تقسم البيانات على حسب حجم ثابت, أو أن توفر معلومات في منطقة مقسمة بحجم ثابت حول منطقة مقسمة بشكل متغير أحياناً يسمى هذا الأمر embedded mate-data. مثلاً هناك خوارزمية ضغط تسمى Huffmanتقوم بعمل variable encoding للبيانات, و حسب علمي القاصر فإن كل خوارزميات الضغط التي تستطيع إعادة البيانات المضغوطة إلى حالتها الأصلية تماماً تعتمد على الإحصاء! لذلك حاول القراءة بتمهل حول الموضوع لأنه موضوع شائك. تحياتي..
  4. سؤال حول const_cast

    هذا مثال يعطيك ما تريد. لاحظ أن النص يجب أن يكون عبارة عن عدد فقط. يمكنك اختبار تحويل النص إلى أي نوع عددي تريده! عن طريق الـ template parameter كما في المثال: #include <sstream> template <typename T> bool is_number(const char* number_string) { T number; std::istringstream convertor(number_string); bool is_number = convertor >> std::noskipws >> number; return is_number && convertor.eof(); } int main() { bool input_is_correct = is_number<unsigned int>("11235555"); } الكود الذي وضعته في مشاركتك جيد. و لكني أفضل طريقة الـ streams أو boost::lexical_cast. بالنسبة لـ const_cast فإنها تقوم بإزالة const من الثابت, و تجعله متغير. و تقوم بإضافة const إلى المتغير ليصبح ثابت. أي أنها تعمل على حسب الشيء الممرر إليها إما ثابت و إما متغير. تحياتي..
  5. سؤال حول const_cast

    و عليكم السلام, أخ خالد, رجاءً لا توجه السؤال لأسماء معينة, هذا مخالف لقواعد المنتدى و غير لائق لمن يريد الإجابة على السؤال :) بالنسبة لسؤالك فالدالة خاطئة للأسف, و ربما فات الأمر على الأخ محمد لا أكثر. أولاً: bool isNumber(const char* str) هذه الدالة تستقبل مؤشر إلى حرف ثابت. بمعنى أبسط, المؤشر يمكن تحريكه, و لكن لا يمكن تغيير ما يشير إليه. الأخ محمد في السطر التالي ربما اعتقد أن الدالة تستقبل مؤشر ثابت فأراد التحويل: char *pMove = const_cast<char*>(str); و هذا في الحقيقة يمكن أن ينتج عنه undefined behavior في حالة كون الوسيط الذي تم تمريره من نوع مؤشر متغير إلى حرف ثابت. في السطور اللاحقة, قام بالتأكد أن كل حرف عبارة عن رقم و الأرقام في ASCII تمتد من 0x30 و هو الصفر إلى 0x39 و هو 9. و شرط الحلقة يعطينا false في حالة كون الحرف عبارة عن الـ null character و هو في الحقيقة الصفر و يكتب في الـ string literals عن طريق الـ escape character و هو 0\. عموماً, للأخ محمد طريقته, و لكن لو كان الأمر لي لقمت بكتابة الدالة بالطريقة التالية: #include <cctype> bool is_number(const char* number_string) { while(*number_string) { if(!std::isdigit(*number_string++)) return false; } return true; } و حتى هذه الطريقة ليست آمنة حقيقة, لأنك يجب أن تتحقق بعد ذلك إذا أردت تحويل النص إلى نوع عددي من كون النوع العددي يستطيع حمل الرقم أم لا و هل سيحدث overflow؟ برأيي, أفضل طريقة هي استخدام الـ streams أو كتابة دالة تستخدم الـ streams أو استخدام boost::lexical_cast. تحياتي...
  6. موضوع شائك في الملفات !

    عزيزي, هذا الأمر يسمى encoding. ماهي البيانات التي تريد عمل encoding لها؟ فقط 1, 2 و 3؟
  7. سؤال عن ;;;;;;

    و عليكم السلام... الـ statement التي تتكون من فاصلة منقوطة فقط, تسمى null statement في C و ++C على حد سواء. قد تجد فكرة مشابهة لها في لغات أخرى كـ Assembly و تسمى في بعض المنصات NOP أو no operation. بمعنى أن ما تقوم به هو أن لا تقوم بأي شيء. فائدتها أننا أحياناً, نحتاج لها. مثلاً, نريد جمع مكعب الأعداد في مدى معين - من سالب ثلاثة إلى ثلاثة مثلاً! int sum = 0; for(int n = -3; n <= 3; sum += n++); أو كما هو الحال في الـ implementation الشهير لـ strcpy من كتاب K&R: // src & dest are pointers to char arrays. // forget the details for moment! // src is the source string. // dest is the destination string. while(*dest++ = *src++); ببساطة إن كان هناك موضع في اللغة يحتاج إلى statement فإنه يمكن استخدام null statement إن كنت لا تريد تنفيذ شيء على الإطلاق. مثلاً, assert تستخدم في حالة الـ debugging و في حالة تفعيل الـ optimizations في المترجمات فإنه يتم إزالتها عن طريق استخدام null statement. هناك طرق أخرى لعمل implementation لـ assert و لكن هذه إحداها. تحياتي..
  8. و عليكم السلام, موضوع جميل :) لم أشارك في النقاش الذي دار في موضوع آخر في الحقيقة, و لكن يبدو أن النظرة للـ gpgpu على أنه المستقبل تحتاج إلى توسيع النقاش. ربما, كقدرة حسابية يعتبر أي gpgpu بمثابة supercomputer منزلي! و لكن هناك نقاط لابد من التعرض لها, قبل أن يفكر أي شخص باستخدام الـ gpgpu "لتسريع" برامجه. أولاً, أكثر من 99% إن لم يكن أكثر من البرامج ليست Computationally Bounded. بمعنى آخر, البطئ الحاصل في أداء البرنامج ليس سببه المعالج, و إنما عمليات الـ I/O. لذلك, لو أراد شخص تطوير جهازه المنزلي فأفضل ما يقوم به هو تركيب SSD hard disk بدلاً من أي معالج من النوع الصاروخي. هذه النقطة تعني أن الغالبية العظمى من البرامج لن تستفيد من الـ gpgpu. بالنسبة لباقي البرامج التي تستفيد حقاً من هذه التكنلوجيا, فهناك عدة نقاط. أولاً, لو نظرنا إلى الفروق في أداء المعالجات cpu فلن تجد فرقاً شاسعاً في أدائها إلا لو خرجت من دائرة الحواسيب المنزلية و الحواسيب المحمولة إلى المنصات التي تعمل على عدة معالجات. أما بالنسبة للـ gpgpu فهناك مدى واسع جداً, من الـ integrated graphics cards الهزيلة, إلى تقنيات SLI و CrossFire باستخدام أحدث زوج من الـ graphics cards و كل هذا موجود لدى هواة الألعاب في المنازل! اسألوا هيثم عن الموضوع :P لهذا, لا يمكنك افتراض توفر أداء متوسط للحواسيب الشخصية كماهو الحال بالنسبة للمعالجات العادية. الأمر الآخر, هو الـ Compatibility بين أنواع الـ gpgpu, ربما يكون OpenCL هو الحل و لكن يحتاج إلى وقت بالطبع. حتى لو توفرت كل تلك الشروط, لكي تكون العملية أسرع على gpgpu منها على cpu, فلابد أن تكون الحسابات كثيرة. طبعاً كلام عام, و لكن قرأت في أماكن عدة عن طرق تقريبية لمعرفة متى ينصح باستخدام gpgpu و متى لا ينصح. فمثلاً, تصور أن لدينا مصفوفتان كل واحد منهما عبارة عن مليون عنصر(عدد). الآن لو أدرنا جمع المصفوفتين في مصفوفة ثالثة باستخدام gpgpu فسنحتاج إلى إحضار عنصر من المصفوفة الأولى و عنصر من المصفوفة الثانية و إعادة الناتج. و هذا يعني أن هناك ثلاث عمليات نقل من الذاكرة إلى ذاكرة الـ gpgpu و كل ما قمنا به هو عملية جمع واحدة. لذلك ستكون هذه العملية - قطعاً - أسرع على cpu. بالطبع هناك حالات يكون فيها كم الحسابات هائل مقارنة بعمليات الإحضار و الإعادة من الذاكرة الرئيسية و هنا يكون الـ gpgpu أسرع. أخيراً, كم عدد المبرمجين الذي لديهم فكرة عن الـ Multiprocessing بشكل عملي يسمح لهم بكتابة خوارزمية مهمة في برنامج! (أنا لست منهم :lol: ) صحيح أنه سيكون هناك abstractions و لكن الأساسيات لابد أن تكون موجودة. تحياتي...
  9. طرق تحليل السورس كود؟؟؟؟

    وضح رجاءً ماذا تقصد بـ
  10. لغز

    أعتقد أن المقصود من اللغز هو عدم استخدام الـ semicolons :P ضع {} بدلاً من الفاصلة المنقوطة.
  11. لغز

    عزيزي, قم بتغيير void إلى int قبل main لكي يصبح الكود صحيحاً.
  12. لغز

    تستطيع إزالة: return 0; فهذا لا يضر إن كنت تريد إرجاع صفر و هو الحالة الافتراضية حسب الـ standards. المشكلة الحقيقية هي أننا قمنا بتضمين ملف كـ iostream يحتوي على semicolons.
  13. انماط لغات البرمجة paradigms

    بالنسبة للاختلاف بين الـ Structured Paradigm و الـ Procedural, هو أن الـ Structured هي تطويرات في الـ Constructs الخاصة بأي لغة برمجة. و هنا نعني أدوات التعبير عن الحسابات على أدنى مستوى. مثلاً, في اللغات الـ Imperative هل تعتقد أنها خلقت و الـ While loops و الـ For loops موجودة بهذا الشكل؟! هناك الكثير من أشكال الحلقات التي ظهرت بمميزات عديدة, هناك مثلاً الـ Construct الذي اخترعه Dijkstra و المسمى Weakest Precondition, و الذي كان حلاً لمشكلة إثبات صحة البرامج, و لكن أذواق المبرمجين لم تتقبله و اندثر. باختصار, الـ Structured Programming تهتم بكيفية التعبير عن الجمل البرمجية, و البحوث الأكثر أهمية و التجارب التي حصلت على مر الزمان تتعلق بالجمل الشرطية و التي أشهر مثال لها الـ if statements و عمليات التكرار. عمليات التكرار تتمثل في الحلقات في اللغات الـ Imperative, و الـ Recursive Functions في اللغات الـ Functional و غيرها. هناك تطورات حاصلة و لكنها بطيئة جداً في هذا المجال, مثال حديث نسبياً الـ for each loops. بالنسبة للـ Procedural Paradigm, فإنه يهتم بكيفية عمل Modularization للحسابات. هنا الكلام يحصل في كيف تقسيم الكود إلى وحدات كالصناديق السوداء التي تقوم بحساب أمر, و إعادة ناتج و مثاله الدوال و الـ Lambda Functions و خلافه الكثير و عمليات الـ Binding و الـ Closures و هذا مجال بحث كبير جداً. هذا الأسلوب لا تعتقد أنه بسيط, فهو أساس ما تراه من Paradigms مبنية فوقه في معظم لغات البرمجة الحديثة. الحديث عن الدوال هنا لا يتعلق بالـ Recursive Functions كآلة لحساب التكرارات, و إنما كصناديق سوداء تستقبل مواداً خام و تقوم بإخراج ناتج الحساب. هذا الأسلوب يشجع بكل شبه مطلق على ناحية الـ Black Box Concept. مثلاً, لو أنك قمت بكتابة دوال على الشكل التالي: int x; void fun1() { x++; printf("%d", x); } fun2() { x--; printf("%d", x); } int main() { fun1(); fun2(); } هذا يمكن أن يطلق عليه Quasi Procedural Oriented, أو بترجمة مبسطة اتباع كاذب لمفهوم الـ Procedural Paradigm, لأننا لا نتعامل مع الدوال على أنها black boxes, فلا تستطيع أخذ الدالة و استخدامها في مكان آخر, دون تعديل الكود الذي لديك و إضافة أمور أخرى ليست هي الدالة نفسها. عموماً, أتمنى أن يكون الفرق واضح :) لو أردت الاستزادة هناك العديد من الأوراق العلمية الشهيرة في هذا المجال, فمثلاً بالنسبة للـ Structured Programming يمكنك البحث عن ورقة Dijkstra و التي ماتت goto بعدها في صناعة البرمجيات! الفرق بين ADT و OOP لم يشرحه حسب علمي أفضل من ناشر OOP في أوساط البرمجة, و ناقلها من الأكاديميات إلى صناعة البرمجة! حاول قراءة هذه الورقة من الدكتور الهاكر Stroustrup و استمتع: What is ‘‘ObjectOriented Programming’’ الـ Functional من أقوى الـ Paradigms و أي مبرمج يجب أن يكون لديه إلمام بالأساسيات و يعرف كيف يستعمل أدواتها الموجودة في لغات البرمجة. بالنسبة لي ++C و النسخة الجديدة منها توفر الكثير لي, ولكني أعرف القليل من Scheme و التي تعملت منها الكثير و الكثير بصراحة. نصيحتي أن لا تقرأ موضوعي و تتجه إلى قراءة هذا الموضوع مع كوب من القهوة بجانبك: Functional Programming For The Rest of Us. بصراحة هذا الرجل هاكر أيضاً :lol: و يشرح الموضوع بطريقة مبسطة جداً, و هذا الموضوع مميز لأني في بادئ الأمر تخوفت كثيراً بعد قراءة بعض الأوراق العلمية, و ظهرت لي بعض المصطلحات التي لم أستطع تهجئة بعضها! حتى وجدت هذا الموضوع و بدأت الرحلة. الـ Generic Paradigm, في الحقيقة عبارة عن مفهوم يمكن تطبيقه في أي من الـ Paradigms الأخرى. فليس له أدوات لها قواسم مشتركة مع الأدوات الأخرى فيه. فيمكن تطبيقه بواسطة OOP إضافة إلى ADT إضافة إلى أدوات أخرى كالـ Templates في ++C أو الـ Generics في Java و #C, أو يمكن أن تكون اللغة تكون اللغة توفر الـ Type Inferences و تسمح بالكثير من الـ Generic Programming. عموماً, لدي بعض الخربشات حول الموضوع إن كنت مهتماً: Professional Data Structure Libraries In Cpp إن كنت مهتماً بهذا الـ Paradigm فيجب أن تحدد الأداة التي تستخدمها و الـ Paradigm الذي تتبعه هذه الأداة. الـ Meta Programming هذه متقدمة قليلاً. الفكرة ببساطة أننا نقوم بكتابة كود يقوم المترجم بأخذه و إنتاج كود آخر. قد تبدو هذه الفكرة سخيفة قليلاً, و لكنها تحل مشاكل عديدة في نواح من الصعب جداً إيجاد حل عملي لها. لن أقول لك اذهب إلى Boost و انظر كيف يقومون بكتابة Libraries تضيف ميزات إلى اللغة. هذه ميزات رهيبة جداً, تصور أنك في ++C يمكنك كتابة قواعد EBNF مباشرة و ليس كنص, أو كتابة مكتبة تسمح لك بكتابة SQL مباشرة في كود ++C. المهم في هذه العملية ليس تخلصنا من علامات التنصيص لو أننا كتبناها كنصوص, و لكن قيام المترجم بأخذ القواعد التي أخذناها و ترجمتها داخلياً إلى Parser و تصور أن ملفك التنفيذي يحمل هذا الـ Parser فقط و ليس القواعد نفسها و الأمر الذي يقوم بتحويل القواعد إلى كائنات للتعامل معها في البرنامج! و في الحالة الثانية يمكن تحويل SQL إلى دوال يتم مناداتها ضمن البرنامج بدلاً من إرسال Query إلى الـ Query Compiler في قاعدة البيانات. تصور ماذا سيقدم هذا الأمر لنا؟ تحقق من جمل SQL و قواعد EBNF بواسطة المترجم مباشرة بدلاً من تجربة جمل SQL أو القواعد في مكان آخر! عموماً أنا مبتدئ في هذا الموضوع بصراحة, و لكن أحاول تطبيق فكرة من هذا النوع في المكتبة التي أقوم بكتابتها في هذه الفترة. لم أقم بهذا الأمر حتى الآن, و لكني أحاول حل المشكلة التالية . مكتبتي تستقبل حجم معين من الـ Bits و لنفرض 40 bits, و أريد أن أعرف ماهو أكبر متغير يمكن أن يحمل تلك الـ 40 bits دون زيادة أو نقصان؟ المشكلة في الـ Meta Programming أنها عبارة عن حسابات لإنتاج أنواع و ليس لإنتاج أعداد في الغالب. و هذا هو الجزء الذي لا يدخل عقلي و لا عقل الآخرين بسهولة, و لكن المتمكنين من هذا الأمر يقومون بكتابة أمور elegant حتى النخاع! عموماً, الحسابات على الأعداد تدخل في الـ Meta Programming و أستخدمها في معظم الحسابات داخل المكتبة uint و لكنها أسهل من العمليات على الأنواع. عموماً, الكلام عن الـ Meta Programming كان مركزاً حول ++C و هناك flavors أسهل بكثير في لغات برمجة أخرى. عموماً لا أنصحك بـ ++C في هذا الأمر, و اتجه إلى Python أو غيرها من اللغات الحديثة لكي تأخذ فكرة مبسطة, و لكن الذي يجذب المبرمجين إلى ++C في هذه الناحية هو أن المترجم يقوم بالعمل كله و يبقى لديك slim exe! بينما في اللغات الأخرى, يتم الاعتماد على فكرة توفر المفسر أو frame-work يقوم بترجمة الكود لحظة التشغيل. اعذرنا إن وجدت أخطاء, كتبته على عجالة. تحياتي...
  14. من ال سي لل سي++

    لاحقين على الشغل خخخ أنا مؤمن بنظرية أني يجب أن أكون عالة على من أعمل لديه في أول سنة, لأني أريد أن أصرف سنين الدراسة فيما أحب أنا :P
  15. السلام عليكم ,, بدون كلام :huh: انظر للتالي : هذا الكود يقوم بحساب "pi" عن طريق مساحة كوده الدائري !!!! و هذا محاكي طيران : المصدر : http://en.wikipedia.org/wiki/International..._C_Code_Contest تحياتي ,,
  16. انماط لغات البرمجة paradigms

    السلام عليكم ... هناك أساليب كثيرة جداً للبرمجة. الأساليب الأكثر شهرة و تأثيراً في البرمجيات هي Structured و Procedural و Abstract Data Types و OOP و Functional و Generic-Programming و Meta-Programming و هناك العديد أيضاً كالـ Constrained و Logic و Event-Based و هناك Paradigms تتعلق بالـ Concurrent Programming و أساليب يصعب حصرها في مكان واحد. أولاً و أخيراً, كل واحد من هذه الأساليب لايوجد تعريف جامع مانع يفصله عن الآخر. و إنما هناك مفاهيم شائعة تتبع كل أسلوب. و كل أسلوب له عدة flavors و كل flavor يتوفر بأشكال متعددة في لغات برمجة مختلفة أو في لغة برمجة واحدة. و ليس هذا فحسب, فمعظم لغات البرمجة تخلط بين الأساليب, فلايوجد لغة برمجة نقية إلا ما ندر و هذا يعني أن بعض لغات البرمجة تخلط بين الـ Structured و الـ Procedural و تضع فوقهم ADT و فوقها OOP على طريقة Simula كما هو الحال في JAVA. و لغات أخرى كـ #C أضافت الـ Functional إلى ماوجد في JAVA مثلاً. بالنسبة لما أشاهده, الكثيرون يخلطون بين مفاهيم مختلفة و لكنها توجد مجتمعة في لغات البرمجة. فمثلاً يتم الخلط دائماً بين الـ Structured و الـ Procedural و على الطرف الآخر, يتم الخلط بين OOP و بين ADT. الأساليب التي يتم التجربة و الكلام فيها كثيراً حالياً هي الـ Generic Programming و الـ Meta Programming و الـ Concurrent Programming و الذي يتوقع أن يشهد تطوراً كبيراً في السنين القادمة. خصوصاً عندما نخلطه مع الـ Functional الذي يعتبر بطبعه قابل لتوزيع الحسابات على مسارات متعددة دون حصول أي خلل بمنطق البرنامج. إذا كنت تريد المتعة, فالـ Meta Programming هي برأيي الطريق :) الـ Hackers يفضلون Common Lisp و الـ Macros الشهيرة الموجودة بها, و أنا أفضل الـ Templates في ++C. يمكنك تعلم الموضوع عن طريق Python أيضاً, فهي جميلة من هذه الناحية. لو كان لديك اهتمام في الموضوع, فأنا أرحب بتوسيع النقاش, و لكن في نقاط محددة لأن الكلام العام لا يفيد كثيراً. اهتمامي يتعلق بخمس أساليب بشكل رئيسي, ADT + OOP + Generic + Meta + Functional. تحياتي...
  17. السلام عليكم ... لا أريد أن أفتي في موضوع لا أعرف عنه إلا النذر اليسير :) لماذا تعتقد أن naive bayes غير ناجحة في هذا الموضوع؟ مثلاً, FogBugz تستخدمها لتصنيف الرسائل الواردة إلى فريق التطوير تلقائياً. و هنا ورقة من نفس الشخص الذي قام بعمل Implementation لهذه الميزة فيه.
  18. برنامج لحل مسالة رياضاية

    لماذا تقوم بكل هذا الأمر إن كان باستطاعتك كتابة البرنامج التالي الذي يحل نفس المسألة: #include <iostream> #include <cmath> int main() { std::cout << std::floor(std::sqrt(1000.0)); } الفكرة أنه هناك elegant solution اكتشفه الأخ وجدي و الأخ namespace, و قمنا بتحسينه قليلاً ليصبح في سطر واحد. لا نحتاج إلى عدم استخدام الدوال الجاهزة, نحتاج إلى قليل من الـ Discrete Math و مخ مفتح :)
  19. تمرير مؤشر إلى دالة موجودة داخل فئة

    السلام عليكم ... الحقيقة لم أجد طريقة مباشرة لعمل bind لدالة الكائن, و من ثم تحويل الناتج إلى مؤشر لدالة حرة. الذي فهمته أنه يمكن القيام بهذا باستخدام boost::bind و boost::function, و لكن لو أن المكتبة التي تستخدمها تستخدمهم أصلاً لما دخلنا في كل تلك المتاهات و لكان استخدام callbacks بسيطاً جداً. عموماً, سأحاول التجربة بعد العيد إن شاء الله.
  20. كيفية الإدلال على أن الداله لم تنجح

    لو أن الأمر بـ ++C فسأستخدم الـ Exceptions, و لكن أنت تتكلم عن C. الـ Status Code مع دوال مساعدة لوصف الخطأ نصياً و خلافه, أي يكون لديك نظام مبسط لمعرفة الأخطاء و نصوص تعرف الخطأ إن أرد المبرمج. و هذه هي الطريقة "الأنظف" في C حسب معرفتي. طريقة الـ Error Stack, لا أفضلها و لم أجرب في الحقيقة استخدامها من قبل في C. أعتقد أنها يمكن أن تكون thread safe لو استخدمنا atomic types على منصات كثيرة. تحتاج إلى أساتذتنا GM و محمد لشرح هذا الأمر :) تحياتي..
  21. السلام عليكم ... هكذا يمكن أن أقوم بالأمر: #include <stdio.h> #include <limits.h> /* convert the passed parameter to textual representation */ #define STRING(identifer) (#identifer) /* size of type in bits */ #define NUM_BITS(type) (CHAR_BIT*sizeof(type)) int main() { printf("%-24s %s\n", "type name", "type size(bits)"); printf("%-24s %d\n", STRING(char), NUM_BITS(char)); printf("%-24s %d\n", STRING(short int), NUM_BITS(short int)); printf("%-24s %d\n", STRING(int), NUM_BITS(int)); printf("%-24s %d\n", STRING(long), NUM_BITS(long)); } لاحظ أن مبرمجي C سيعترضون قائلين أنه من الخطأ استخدام d% مع sizeof لأنها تعيد النوع size_t, و لكن العتب ليس علي و إنما على دعم VC الضعيف للغة C و دعمها الرهيب للغة ++C :) تحياتي...
  22. الكلام سهل يا أستاذنا هيثم, الشكر موجه لمن أخرج لنا هذه المدونة إلى الوجود :cool:
  23. ألف مبروك على الفريق كله :cool:
  24. بالفعل هذا الأمر غريب جداً, و اعترضنا أكثر من مرة و لكن لا حياة لمن تنادي! إذا كنت أحد طلاب CCSE فيمكنك الذهاب لأي من معامل مبنى 22 و الدخول على ccse-software و ستجد هناك معظم تلك البرامج, و إن لم يكن موجوداً فيمكنك طلبه و سيتم إحضاره على الأغلب. المشكلة أنه لماذا لا يتم وضع اسم الجامعة, و قد تم الإعلان عن انضمام الجامعة لهذا الأمر منذ مدة طويلة!
  25. كيف لا يمكن! بل ممكن جداً, و هذا أحد اسباب انتشار Qt كالنار في الهشيم في آخر فترة. كل ما عليك هو استخدام المكتبة الديناميكية بدلاً من ربطها statically. و بهذا تكون في السليم. إذا أردت دمج المكتبة مع برنامجك في تلك الحالة يجب أن يكون برنامجك حراً.