الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعده في شرح برنامج

مغلق
بدأه لولو كاتي في 15 ديسمبر 2011 · 4 رد · 694 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ممكن تشرحون لي ايش بيعمل check وليش كتبنا for loop مرتين

#include <iostream>
#include <conio.h>
using namespace std;
void main()
{

int no,counter,counter1,check;
cout<<"<-----------------------PRIME NO. SERIES------------------------>";
cout<<"\n\n\n\t\t\t INPUT THE VALUE OF N: ";
cin>>no;
cout<<"\n\n THE PRIME NO. SERIES B/W 1 TO: \n\n"<<no;
for(counter = 1; counter <= no; counter++)
{
check = 0;
//THIS LOOP WILL CHECK A NO TO BE PRIME NO. OR NOT.
for(counter1 = counter-1; counter1 > 1 ; counter1--)
if(counter%counter1 == 0){
check++; // INCREMENT CHECK IF NO. IS NOT A PRIME NO.
break;
}
if(check == 0)
cout<<" \t"<<counter;
} getch();
}
#2

البرنامج بسيط .. فكرته اكشتاف الاعداد الاولية التي تقع بين 1 - لغاية ( ن ) التي هي الحد الاعلى للمتسلسلة ..

بداية المتغير Check تم استخدامه لكي نعرف من خلاله الاعداد التي تقع بين 1 و ( ن ) .. تم تصفيره في البداية لان هذه هي القيمة الابتدائية لاي متغير يستعل لغرض الجمع في المستقبل ...

بالنسبة للحلقة For .. فائدتها توليد الاعداد من العدد ( ن ) ولغاية الـ 1 .. فهي بكل بساطة تبدأ من الرقم 1 ولغاية الرقم ( ن) وبزيادة ( +1) كل مرة ، ولكن الحلقة الداخلية هي التي ستحقق توليد الرقم الاولي داخل المدى الموضح سابقا ، وتبدأ بعداد counter1 يبدأ من المتغير الخاص بالحلقة الاعلى منه وبناقص واحد .. اي انه سيبدأ هنا من 0 والسبب ان الحلقة الاعلى قد بدأت بواحد .. وشرط توقف الحلقة الداخلية هو ان يكون العداد الجديد اصغر أو يساوي واحد لان هذا معروف ان الرقم 1 يعتبر الرابط المشترك رياضيا بين الاعداد الاولية وغير الاولية .. ولذلك نتوقف عنده وليس عند الصفر ..

الشرط الذي يجعلنا نزيد من قيمة check والذي هو المتغير المسؤول عن تكوين او توليد العدد الاولي المحصور ضمن المدى هو ان في حالة ان يكون ناتج باقي قسمة العداد الاعلى على العداد الداخلي = 0 ، هذا يعني انه يمتلك معامل اولي .. وبعد ذلك توقف .. واذا لاحظتي ان الزيادة والتوقف break موجودة داخل اقواس if ..

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

post-53367-071757600 1323968175_thumb.pn

كما تلاحظين ان الحد الاعلى للمتسلسلة وضعته 1000 وبعدها طبع البرنامج الاعداد الاولية بين 1 - 1000 ...

اتمنى ان يكون الشرح واضحا ..

تحياتي العطرة ..

المرفقات
Prime.png
1

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#3

اعتقد ان هذا مصدر الكود.

أستخدم خاصية watch مراقبة المتغيرات لتراقل كيف يعمل الكود

وظيفة الكود هى:

برنامج C لتولد كل الأعداد الأولية بين 1 و n ، حيث n هو قيمة يدخلها المستخدم.

حاول اﻻجابة على تلك اﻻسئلة قبل تفسير الكود.

  1. ماهى اﻻرقام اﻻولية Prime numbers.
  2. مراقبة المتغيرات باستخدام بيئة التطوير (watch).
  3. تحليل اﻻرقام اﻻولية وكيفية حسابها.

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

شكرا يعطيكم العافيه على الشرح ^_^

#5

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

لى تعقيب على ذلك البرنامج

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

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

ويصبح كود الحلقة الخارجية على الشكل التالى :

for(counter = 1; counter <= no; counter=counter+2)

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

لأنة لو لاحظنا عند إعطاء البرنامج قيم كبيرة تجد معدل إنتاج الأعداد الأولية يقل تدريجياً على الشاشة قرباً من الرقم المعطى.

- لماذا يحدث هذا ؟ يحدث هذا لأنة عند الأرقام الكبيرة وليكن مليون فسيقوم البرنامج بقسمة العدد على جميع الأرقام الأقل منه لإختباره ثم بعد ذلك ينتقل للرقم الذى يليه

فلذلك يبطأ عمل البرنامج كلما إقترب من الأعداد الكبيره .

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

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

ويصبح كود الحلقة الداخلية على الشكل :

for(counter1 = counter-2; counter1 > 1 ; counter1=counter1-2)

لكى يتم القسمة على الأعداد الفردية فقط

وبالتالى أصبح البرنامج يقوم بقسمة الأعداد الفردية على الأعداد الفردية فقط لإخراج الأعداد الأولية

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

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

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 17 ديسمبر 2011 في 07:36

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

هذا الموضوع مغلق.

مواضيع مشابهة