• 0
ahmedsaoud31

خوارزمية برنامج لحساب مضروب عدد ما !

سؤال

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

خوارزمية إيجاد مضروب لعدد ما

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

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

int factorial (int a ) 
{
if (a > 1)
return a*factorial(a-1) ;
else
return 1;
}

ونحن نعلم أن مدى المتغير من نوع int من 2,147,438,648- حتى 2,147,438,647

و مضروب العدد 20 هو 2,432,902,008,176,640,000

إذاً فلماذا نعرف المتغير من نوع int ولدينا متغيرات أكبر منه من نوع عدد صحيح معرفه داخل اللغة وهو unsigned long long int والذى يبلغ مداه من 0 إلى 18,446,744,073,709,551,615

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

فالأصح كتابة البرنامج السابق على الصورة التالية :

unsigned long long int factorial (unsigned char a ) 
{
if (a > 1)
return a*factorial(a-1) ;
else
return 1;
}

ومدى المتغير unsigned char من 0 إلى 255

0

شارك هذا الرد


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

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

  • 0

جزاك الله خيراً .. وأيضاً يمكن استخدام لغة Functional مثل Haskell وتريح بالك :)

تم تعديل بواسطه Delphawi
2

شارك هذا الرد


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

السلام عليكم

جزاك الله خيراً .. وأيضاً يمكن استخدام لغة Functional مثل وتريح بالك Haskell smile.gif

بارك الله فيك أخى الكريم حقيقاً لأول مرة أتعرف على حقيقة لغات البرمجة الوظيفية فلم أكن أسمع عنها من قبل ... فجزيت خيراً

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ولكن أغلب البرامج التى رآيتها تغفل عمليه تعريف المتغيرات سواء فى أى لغة برمجة

معظم المبرمجين ومؤلفى الكتب يكتبون كود بسيط لتوضيح الفكرة مثل الكود الذى أوضحتة أعلاة وهذا غالب على الموضوعات المعروضه على الانترنت بشكل عام

ما اريد ان أقولة لو بحث عن كود مصدر لأى مكتبة مفتوحة وبحثت عن دالة ارجاع الــ factorial ستجد شئ مختلف تماما يعجبك ....

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

2

شارك هذا الرد


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

السلام عليكم

مرحباً بك أخى محمد أول مداخلة لك معى بعيداً عن قسم C++/C ... مرحباً بك

معظم المبرمجين ومؤلفى الكتب يكتبون كود بسيط لتوضيح الفكرة مثل الكود الذى أوضحتة أعلاة وهذا غالب على الموضوعات المعروضه على الانترنت بشكل عام
فعلاً هذا ما يفعلونه ولكن هذا خطأ لأن الأمر عدما يكون من البداية على أسسة السليمة فهذا أفضل بكثير , ولن يكون هناك صعوبة على المبتدئ مادام هناك شرح منطقى ومبسط للموضوع من جميع النواحى
ما اريد ان أقولة لو بحث عن كود مصدر لأى مكتبة مفتوحة وبحثت عن دالة ارجاع الــ factorial ستجد شئ مختلف تماما يعجبك ....
بالطبع إسلوب رائع كمجموعة دوال لغة السي التى أرفقتها لى من قبل وهذا الإسلوب هو ما نريده فى أمثلة الكتب لينشأ المبرمج على أسس سليمة .
0

شارك هذا الرد


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

نقطة أخرى حسب ما درست ، بأن المعظم يتجهون لكتابة اقترانات تراجعيه ريكرسف لكنها ليست الأفضل إلا في بعض الحالات ، وأنه غالبا إذا ما استخدمنا جمل التكرار يكون أفضل لأن مثل هذه الاقترانات ستجعل المكدس stack يمتلأ وسيكون هنالك بيانات تنتظر غيرها حتى نحتاج استخدامها ، وهذا لا ينفع خصوصا في حالات huge data بالاضافة إلى النقطة التي ذكرتها في موضوع باننا يجب ان نستغل القدر الادنى من الذاكرة فلماذا نعرف متغير من float أو int طالما نحن نعلم أننا لن نحتاج لارقام سالبة فالاولى ان نعرفه unsigned int

1

شارك هذا الرد


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

السلام عليكم

مرحباً بك أخي يوسف كيف حالك

طبعاً لكل مقام مقال , بس طبعاً الإقترانات التراجعية ليها مجال وفايدة كبيرة ومثال لغة prolog تعتمد إعتماد كلى على مبدأ التراجعية , فمبدأ التراجعية مبدأ مهم ويسهل كثيراً من كتابة الأكواد .

0

شارك هذا الرد


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

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

تمام ألان معظم البرامج المكتوبة بلغة سي++ تستخدم فكرة الفئات فى كتابة البرنامج فماذا لو بدء الدارس بها سوف يكره سي++ الى الابد.

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

0

شارك هذا الرد


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

السلام عليكم

مرحباً بك مجدداً محمد

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

تمام ألان معظم البرامج المكتوبة بلغة سي++ تستخدم فكرة الفئات فى كتابة البرنامج فماذا لو بدء الدارس بها سوف يكره سي++ الى الابد.

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

- وبالنسبة لفكرة البداية بالفئات فأفضل مثال على هذا لغة الجافا فأول برنامج كما تعودنا فى لغات البرمجة هو طباعة "Hello world" يستخدم فيه الفئات

System.out.println("Hello World");

0

شارك هذا الرد


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

السلام عليكم

مرحباً بك أخي يوسف كيف حالك

طبعاً لكل مقام مقال , بس طبعاً الإقترانات التراجعية ليها مجال وفايدة كبيرة ومثال لغة prolog تعتمد إعتماد كلى على مبدأ التراجعية , فمبدأ التراجعية مبدأ مهم ويسهل كثيراً من كتابة الأكواد .

الله يبارك فيك اخي والله انا كمبتدىء خطرت على بالي هذه النقطة لأن الشيء بالشيء يذكر وفعلا لكل مقام مقال :)

1

شارك هذا الرد


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

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

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



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

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

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