Khaled Alshaya

الأعداد العملاقة في ++c بمنتهى السهولة - شرح كامل

10 ردود في هذا الموضوع

السلام عليكم ,,

في الحقيقة إن موضوع الأعداد الكبيرة جداً أو بمعنى أصح Arbirary Precesion Numbers هو موضوع جميل في عالم البرمجة. و لكن للأسف الكثير ممن في المنتدى هم من المبتدئين أمثالي. و حساب هذا النوع من الأعداد بشكل يدوي من خلال كود نقوم بكتابته بأنفسا قد يشكل عقبة في الاستفادة من قدرة الحاسب في حساب أرقام عملاقة جداً تصل إلى آلاف الخانات لتعقيد المسألة من ناحية, و صعوبة الحصول على السرعة و الكود الخالي من الأخطاء من ناحية أخرى. يستخدم المبرمجون في معظم الحالات مكتبات جاهزة تمت كتابتها على أيدي خبراء في البرمجة. أشهر المكتبات بلا منازع في هذا المجال هي المكتبة الشهيرة من منظمة البرمجيات الحرة Free Software Foundation, و تسمى gmp. رغم أن هذه المكتبة هي الأفضل في المجال إلا أنني لم أجد طريقة تمكنني من العمل عليها تحت Visual Studio 2008 بشكل سهل و مباشر. لتعقيد عملية بناء المكتبة و كثرة خيارات البناء و تضمين أكواد أسمبلي مكثفة للعديد من المنصات الموجود على سطح الكرة الأرضية. و لكن ترجمتها على GCC أسهل بكثير حسبما أعتقد لأنه المترجم الرئيسي للمكتبة. ربما لاحقاً سأضيف كيفية استخدام المكتبة بواسطة GCC و Visual Studion و لكن ليس في القريب العاجل. بحثت عن مكتبة سهلة الإستخدام يمكن بسهولة العمل عليها باستخدام Visual Studio 2008 و وجدت المكتبة المسماة MAPM و هي اختصار لـ Michael Arbitrary Precesion Math, على اسم مصممها الأصلي. و هي مكتبة جميلة و سهلة الاستخدام جداً, إضافة إلى امكانية العمل عن طريقها مع الأعداد الصحيحة و الأعداد الحقيقة... و لا ننسى بعض الدوال الرياضية التي يحتاجها أي منا, إضافة إلى أنها مستخدمة في عدة مشاريع شهيرة

دعنا لا نطيل الحديث و نسرد كيفية بناء المكتبة و كيفية كتابة أول مثال لنا.....

في البداية قم بتحميل المكتبة من هنا, و هذا هو الإصدار 4.9.5 :

mapm_495.zip

قم بفك الضغط عن مجلد المكتبة و ليكن المجلد الذي تتربع به الملفات بالاسم التالي : mapm

بالطبع أنت من المبرمجين أمثال الذين يفضلون العمل على الـ IDE الخاص بـ Visual Studio و لا أظنك تترجم برامجك من خلال الـ Command Line, لذلك لن تكون الـ Enivronment Variable قد تمت تنشيطها لديك, ببساطة لن يمكن استخدام مترجم ++VC من سطر الأوامر, كل ما علينا فعله هو التالي....

اذهب إلى مجلد Bin في المجلد الرئيسي لـ VC و لدي على العنوان التالي بالطبع باستخدام سطر الأوامر و قم بكتابة الأمر التالي على افتراض أن هذا هو مسار المجلد Bin لديك :

post-89451-1234431625_thumb.png

و بعد الضغط على ENTER و تنفيذ الأمر ...

post-89451-1234431618_thumb.png

كل ما في الأمر أننا قمنا باستخدام الـ Batch الذي توفره Visual Studio بدلا من إضافة المترجم و الأدوات الأخرى يدوياً إلى قائمة الـ Environment Variables الخاصة بـ Windows ....

الآن سنتوجه إلى المجلد الذي وضعنا فيه ملفات المكتبة و المسمى mapm و نبحث عن الملف التالي و نقوم بتشغيله, الحقيقة أن هذا الملف ليس إلا Batch يقوم بعملية ترجمة المكتبة بشكل أوتوماتيكي باستخدام مترجم ++VC .... الملف يسمى MKALLMSC.bat .... و بعد الضغط على ENTER ستتم عملية بناء المكتبة..

post-89451-1234431578_thumb.png

خطوة بسيطة باقية و هي التأكد من أن المكتبة بنيت بشكل صحيح, أحياناً المترجمات بسبب خواص الـ Optimizations قد تنتج كود لا ينفذ المطلوب لذلك قم مصمم المكتبة بإرفاق برنامج للتأكد قم بكتابة الأمر التالي من نفس المسار السابق...

post-89451-1234431610_thumb.png

إذا تمت عملية التحقق بنجاح ...

post-89451-1234431587_thumb.png

مبروك انتهينا, المكتبة أصبحت جاهزة للاستخدام و ما بقي علينا إلا استخدامها في مثال, قمت بكتابة مثال بسيط جداً لكي تقوم بتجربة المكتبة و التأكد بأنها تعمل.... حتى نلخص ما قمنا بعمله, قمنا ببناء Static Library من المكتبة. سنرى الآن كيف سنقوم بكتابة أول مثال و كيف سنقوم بربط المكتبة. ملاحظة صغيرة فقط, إذا كانت برنامجك MultiThreaded فتحتاج إلى بعض الإعدادات الأخرى التي يمكنك الإطلاع عليها في موقع المكتبة نفسه لبناء المكتبة على أنها Thread Safe :)....

قم بإنشاء مشروع حسب ما تريد سواء GUI أو Console .. مثالنا يستخدم الـ Console لغرض توضيح استخدام المكتبة لا أكثر ....

اذهب إلى مجلد المكتبة, ستجد ملفين. الأول يسمى mapm.lib و الثاني m_apm.h قم بنسخهما و لصقهما في مجلد مشروعك...

post-89451-1234431567_thumb.png

نحن جاهزون الآن لتجربة المكتبة :)

قم بكتابة الكود التالي :

انسخ الكود
  1. [color= #007f00;]#define NULL 0[/color]
  2. [color= #007f00;]#include "m_apm.h"[/color]
  3. [color= #007f00;]#include <iostream>[/color]
  4.  
  5. [color= #007f00;]#pragma comment ( lib, "mapm.lib" )[/color]
  6.  
  7.  
  8. [color= #0000ff;]int[/color] main[color= #000000;]([/color][color= #000000;])[/color][color= #000000;]{[/color]
  9.  
  10. m_apm_cpp_precision[color= #000000;]([/color] [color= #ff0000;]1994[/color] [color= #000000;])[/color];
  11.  
  12. MAPM e [color= #000000;]=[/color] [color= #A31515;]"2.0E+0"[/color];
  13. [color= #0000ff;]char[/color] buff[color= #000000;][[/color] [color= #ff0000;]2000[/color] [color= #000000;]][/color];
  14.  
  15. [color= #0000ff;]for[/color][color= #000000;]([/color] MAPM i [color= #000000;]=[/color] [color= #A31515;]"2"[/color]; i [color= #000000;]<[/color] [color= #A31515;]"1000"[/color]; i[color= #000000;]++[/color] [color= #000000;])[/color]
  16. e [color= #000000;]+[/color][color= #000000;]=[/color] [color= #000000;]([/color] [color= #A31515;]"1.0E+0"[/color] [color= #000000;]/[/color] i.[color= #808000;]factorial[/color][color= #000000;]([/color][color= #000000;])[/color] [color= #000000;])[/color];
  17.  
  18. e.[color= #808000;]toString[/color][color= #000000;]([/color] buff, [color= #ff0000;]1994[/color] [color= #000000;])[/color];
  19.  
  20. std[color= #000000;]::[/color][color= #808000;]cout[/color] [color= #000000;]<<[/color] buff;
  21.  
  22. std[color= #000000;]::[/color][color= #808000;]cin[/color].[color= #808000;]get[/color][color= #000000;]([/color][color= #000000;])[/color];
  23.  
  24. [color= #0000ff;]return[/color] [color= #ff0000;]0[/color];
  25. [color= #000000;]}[/color]
  26.  
  27.  
  28.  
  29.  

هذا الكود يقوم بحاسب قيمة العدد e إلى 1994 خانة :)

إذا لم تظهر النتيجة على شاشة الـ Console بسرعة فلا تعتقد أن هناك خطأ, و لكن البرنامج يقوم بالحساب .... لذلك قد يتأخر البرنامج على حسب مواصفات جهازك. تذكر فما لديك هو حاسوب شخصي ....

ملاحظة صغيرة فقط, لاحظت أن كود المكتبة يحتوي على NULL و التي ليست معرفة أصلاً في لغتي C و ++C و ربما اعتقد كاتب المكتبة أن windows.h سوف يستخدمه معظم مستخدمو مكتبته. لذلك إذا لم تكن تستخدم windows.h فقط قم بإضافة السطر التالي قبل كل شيء :)

#define NULL 0

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

MAPM

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

تحياتي ,,

post-89451-1234431562_thumb.png

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

شارك هذا الرد


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

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

0

شارك هذا الرد


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

ما شاء الله ، موضوع متميز كعادتك أخى خالد

لكن لى استفسار ، كيف يتم استخدام المكتبة على MinGW ، الذى يستخدم GCC فى ترجمة اكواد ++C ؟؟

-------------

سؤال خارج الموضوع : الاحظ دائماً اخى خالد انك مستخدم لـ Visual Studio ، ما هى مميزاته مقارنة باستخدام مثلاً : Code::Blocks مع مترجم MinGW ؟؟

وفقكم الله ،،

0

شارك هذا الرد


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

السلام عليكم ,,

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

أهلاً أخ فهد, أعتقد أن لا عذر لديك بعد الآن لترينا ابداعاتك في الرياضيات :wink:

لكن لى استفسار ، كيف يتم استخدام المكتبة على MinGW ، الذى يستخدم GCC فى ترجمة اكواد ++C ؟؟

أهلاً أخ عمر,

هناك ملف يسمى MKALLMGW ستلاحظ في الموضوع أننا استخدمنا MKALLMSC, تحتاج إلى أن يكون ++g ضمن الـ Environment variables أولاً,

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

عموماً سأحاول تحميل CodeBlocks و mingw و شرح الطريقة :wink:

سؤال خارج الموضوع : الاحظ دائماً اخى خالد انك مستخدم لـ Visual Studio ، ما هى مميزاته مقارنة باستخدام مثلاً : Code::Blocks مع مترجم MinGW ؟؟

قبل ظهور نسخ الـ Express لم أكن من محبي VS :P

تركت CodeBlocks قبل سنتين تقريباً بعد سنة من الاستخدام المتواصل لأنه لم يكن بتلك القوة :angry: و لكن الحال تغير الآن ... في الحقيقة أنه لا يرقى إلى VS أو الـ Borland cpp برأيي, و لكن هذا لا يعني أنه سيء أبداً

كل المشكلة أنني اعتدت على VS express, و الدعم على الانترنت أفضل من mingw.... لا تنسى أيضاً أن CodeBlocks يمكن أن يتم ربطه بمترجم Microsoft أيضاً ...

ربما نتكلم في يوم من الأيام بشكل أكثر تفصيلاً عن مترجم Microsoft و مترجم GNU :)

تحياتي ,,

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

شارك هذا الرد


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

تم تثبيت الموضوع لاهميته.

0

شارك هذا الرد


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

شكراً أخى خالد للمرة 10e35 (باستخدام المكتبة :P) على ردودك و مواضيعك المميزة ،،

لكن ايضاً لم أحصل على إجابة شافية للمميزات VS مقارنةً بـ Code::Blocks ؟؟!!!! أقصد كـ IDE

بالمناسبة ، ما رأيك فى كلا المترجمين MinGW و Microsoft ؟؟

قرأت ذات مرة ، لا أتذكر المصدر ، ان مترجم MinGW - GCC يطبق معايير ISO C++ بدقة أكثر من مترجم Microsoft

هل هذا صحيح ؟؟

وفقكم الله ،،

تم تعديل بواسطه Omar Eladel
0

شارك هذا الرد


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

رائع استاذ خالد ...

المميز لايأتي منه الا مميز , كما يقول الاستاذ عبدالهادي :lol:

اخي عمر , دعك من المقارنات , المترجم الذي ترتاح له , استخدمه وابدع فيه ,, :blush:

0

شارك هذا الرد


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

نزولاً عند رغبة الأخ عمر سنستعرض سوية كيفية استعمال المكتبة تحت Mingw و CodeBlocks :)

أولاً يجب علينا إعداد الـ Environment Variables لكي يعمل mingw ...

اذهب للتالي :

My Computer > Properties > Advanced > Environment Variables

ستجد الـ Variable المسمى Path ...

post-89451-1234448876_thumb.png

قم بإضافة المجلد الذي يحتوي على مترجم gcc بعد آخر فاصلة منقوطة في السطر كالتالي :

ملاحظة مجلد bin هو المقصود و هو موجود لدي على العنوان التالي :

C:\Program Files\CodeBlocks\MinGW\bin

post-89451-1234448884_thumb.png

سنقوم بترجمة المكتبة كالتالي :

لاتنسى تشغيل Validate للتحقق من صحة بناء المكتبة كما في الموضوع الأصلي :)

الآن قم بإنشاء مشروع جديد في CodeBlocks, بعد ذلك قم للمجلد التي تمت ترجمة المكتبة فيه, و انسخ الملفين التاليين و ضعهما في مجلد مشروعك الجديد :

libmapm.a و M_APM.h .... و قم بكتابة الكود الموجود في الموضوع الأصلي أساساً دون الـ Pragma الخاصة أصلاً بمترجم Microsoft :

انسخ الكود
  1. [color= #007f00;]#define NULL 0[/color]
  2. [color= #007f00;]#include "m_apm.h"[/color]
  3. [color= #007f00;]#include <iostream>[/color]
  4.  
  5. [color= #0000ff;]int[/color] main[color= #000000;]([/color][color= #000000;])[/color][color= #000000;]{[/color]
  6.  
  7. m_apm_cpp_precision[color= #000000;]([/color] [color= #ff0000;]1994[/color] [color= #000000;])[/color];
  8.  
  9. MAPM e [color= #000000;]=[/color] [color= #A31515;]"2.0E+0"[/color];
  10. [color= #0000ff;]char[/color] buff[color= #000000;][[/color] [color= #ff0000;]2000[/color] [color= #000000;]][/color];
  11.  
  12. [color= #0000ff;]for[/color][color= #000000;]([/color] MAPM i [color= #000000;]=[/color] [color= #A31515;]"2"[/color]; i [color= #000000;]<[/color] [color= #A31515;]"1000"[/color]; i[color= #000000;]++[/color] [color= #000000;])[/color]
  13. e [color= #000000;]+[/color][color= #000000;]=[/color] [color= #000000;]([/color] [color= #A31515;]"1.0E+0"[/color] [color= #000000;]/[/color] i.[color= #808000;]factorial[/color][color= #000000;]([/color][color= #000000;])[/color] [color= #000000;])[/color];
  14.  
  15. e.[color= #808000;]toString[/color][color= #000000;]([/color] buff, [color= #ff0000;]1994[/color] [color= #000000;])[/color];
  16.  
  17. std[color= #000000;]::[/color][color= #808000;]cout[/color] [color= #000000;]<<[/color] buff;
  18.  
  19. std[color= #000000;]::[/color][color= #808000;]cin[/color].[color= #808000;]get[/color][color= #000000;]([/color][color= #000000;])[/color];
  20.  
  21. [color= #0000ff;]return[/color] [color= #ff0000;]0[/color];
  22. [color= #000000;]}[/color]
  23.  
  24.  
  25.  

الآن نحتاج لإعلام المترجم بضرورة ربط المكتبة و مكانها... يمكنك القيام بذلك من الـ command line سواء باستخدام مترجم Microsoft أو mingw و بما أننا هنا نتكلم

عن mingw و نقوم باستخدام CodeBlocks كـ IDE سنقوم بشرح الطريقة باستخدام CodeBlocks.... قم باخيار خصائص المشروع ...

post-89451-1234448896_thumb.png

تحت الـ Tab الرئيسي المسمى Project settings في الأسفل اضغط على Project's build options, ستظهر لك نافذة جديدة اختر منها الـ Tap المسمى linker

settings ... الآن قم بإضافة المكتبة التي قمنا ببنائها libmapm.a ... و سيسألك إذا كنت تريد مسار المكتبة على أنه relative path فاختر الرفض no ...

post-89451-1234448868_thumb.png

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

تحياتي .....

post-89451-1237398580_thumb.png

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

شارك هذا الرد


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

شكراً جزيلاً اخى العزيز جداً خالد ،،

بارك الله فيك على شرحك المتميز ،،

وفقكم الله ،،،

0

شارك هذا الرد


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

بارك الله بكم،،

هل يوجد دوال لإقترانات الرياضيات (مثل sin, cos) جاهزة

يمكن تطبيقها على هذه الأعداد العملاقة؟؟

والسلام عليكم

0

شارك هذا الرد


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

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

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