فتى الشوتوكان

دروس تعليم على for LOOPS

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

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

طلب مساعدة موجه إلى جميع الأخوة في هذا الموقع العريق ...

بالحصول على خدمات اخواننا في اعطاءنا (طلاب السنة الأولى للIT ) حصص على FOR LOOPS . وذلك لما تواجهنا من مشاكل في حل برامجنا لعدم فهمنا الكامل لها ...

أرجو تقديم المساعدة بأقرب وقت ...

وبارك الله فيكم ..

1

شارك هذا الرد


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

ولو يهمك ياأخ "فتى الشوتوكان" إن شاء الله اليوم ستجد ماتريد ....

0

شارك هذا الرد


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

بارك الله فيك اخي ..

يا الله ما أحسنكم يا شباب ..

انتو الأفضل والله

0

شارك هذا الرد


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

السلام عليكم ....

أنا في انتظار الشرح ل for loopsيلا فتى الشوتوكان شد حيلك....

0

شارك هذا الرد


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

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

أنا اسف جدا ياشباب كان مفترض الدروس تكون عندكم من يومين ,,,

وأنا أحاول لي يومين أن أضيف رد لكن يبدو أن هناك مشكلة في الموقع ... دائما يرفض ضافة الردود ... عموما اذا لم تحدث هذه المشكلة مرة ثانية سيكون الدرس الاول معكم هذا المساء باذن الله ,,,,

0

شارك هذا الرد


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

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

الجلسة الأولى :

بداية تعتبر الحلقات For Loops من اساسيات لغات البرمجة ولا يمكن الاستغناء عنها نهائيا ...

فأغلب خوارزميات البرمجة غالبا ماتخضع للتكرار ,,,,

عموما سنبدأ بتعريف بنية ال For loop في لغة السي والسي بلس بلس ...

وبالمناسبة صيغة ال For Loop في لغة السي والسي بلس بلس ,,, هي الاكثر مرونة على الاطلاق في جميع لغات البرمجة ... والجافا كذلك ...

وتاتي المرونة من الصيغة التي تعرف بالشكل التالي ,,,

مثال رقم 1 :

(++ for ( int x =0 ; x < 10 ; x

{

cout << "HELLO " // Our Out Put

; cout << endl

}

لاحظ الفواصل في جسم الحلقة الذي باللون الارجواني ... توجد ثلاثة مناطق لادخال قوانين الحلقة ...

الحلقة السابقة بسيطة جدا ,, وتعني الاتي ,,,

ركز في ها الوصف فهو مفتاح حل جميع مشاكل عدم فهم الحلقات ....

" يا كمبيوتر نفذ ما بين القوسين {} مادامت x < 10 ,, والشرط موجود في البرامتر الثاني....

وكل مرة تنفذ فيها الاوامر التي بين القوسين {} اذهب الى أول الحلقة وزد x بمقدار واحد " يحدد مقدار الزيادة اخر بارمتر في الحلقة " ,,

وبدأ أول x أول ماتبدا الحلقة بالقيمة صفر ,,, ويحدد البداية أول بارمتر في جسم الحلقة ,, "

وطبعا سيتم الخروج نهائيا من الحلقة اذا اختل الشرط الذي في الخانة الثانية من جسم الحلقة ...

أي سيتم كل مرة طباعةالعبارة " HELLO " في الشاشة وستتم هذه العملية 10 مرات ... كل واحدة في سطر جديد ...

الان أين المرونه في ذلك ?? ... لاأقصد التعقيد وانما فهم الهيكلية بشكل جيد سيساعدك جدا على الفهم المتناسق ,, سنأتي للمرونة بعد قليل

1) الان بهذه الصيغة يمكنك تنفيذ بعض الاوامر التي تريدها مرات عديدة اما بعدد معين تريده .. مثلا 10 مرات 20 مرة 100 مرة 100000 مرة ...

2) أو تنفيذ الاوامر مرات عديدة اذا تحققت بعض الشروط ....

توجد عدة حالات لعمليات التكرار بعدد معين كما في الحالة رفم " 1" أعلاه...

وسنتستعرضها الان ,,,

قي بعض الانواع عندما نريد التكرار لشيء ثابت لايعتمد على العدد المكرر كما في المثال التوضيحي في الاعلى " طباعة السلسلة HELLO لايعتمد على أي شيء لأنه ثايت" ... دائما يكفي ان تجعل الحلقة على صيغة المثال أعلاه ... وفقط تغيير البارمتر الثاني ليكون اصغر من العدد الذي تريده أن يتكرر ...

نوع اخر يعتمد على المتغير الذي في الحلقة بشكل أو باخر مثلا ... خذ عندك المثال التالي الذي نقوم فيه بطباعة القيم التي في مصفوفة معينة ,, مثلا نريد أن نطبع 15 قيمة من عناصر مصفوفة معينة وبالتررتيب من أول عنصر وحتى العنصر رقم 15 ...

نقرض لدينا مصفوفة int تسمى W حجمها الاقصى 200عنصر وقمنا بوضع بيانات في 90عنصر فيها وبالترتيب ... ونريد أن نطبع أول 15 عنصر على الشاشة ...

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

مثال رقم 2 :

(++ for ( int x =0 ; x < 15 ; x

{

; [cout << W [x

; cout << endl

}

هنا سيتم طباعة 15 عنصر من المصفوفة كل واحد في سطر جديد ....

يمكن تنفيذ هذه العملية بشكل اخر غير عملي كالتالي ...

مثال رقم 3 :

; z = 0

(++ for ( int x =0 ; x < 15 ; x

{

; [cout << W [z

; cout << endl

; ++z

}

للحلقة أعلاه نفس عمل الحلقة التي قبلها ...

نفرض مثلا أننا نريد طباعة العناصر الفردية فقط من المصفوفة وحتى العنصر رقم 41.... عندها سنغير التالي ...

مثال رقم 4 :

( for ( int x =1; x < 42; x += 2

{

; [cout << W [x

; cout << endl

}

لاحظ أننا غيرنا البداية الى 1 والشرط الى اصغر من 41 ومقدار الزيادة الى 2 بدل من 1 ,,,

لاحظ دائما أن قيمة المتغير x في كل دورة للمصفوفة تكون قيمته قيمة فردية ...

ستكون الاعداد 1 , 3 , 5 ,7 ,9 ... وهكذا حتى اخر عدد 41 لأن ال 41 أصغر من ال 42 وهو الشرط الذي في البارمتر الثاني ....

قارن هذا المثال بالمثال رقم 2 وستتعرف أكثر على الفكرة ...

الان فلنطور المثال قليلا ولنفرض اننا نريد طباعة العناصر التي تقبل القسمة على 5 وحتى العنصر رقم 80 مثلا ...

ستكون الصيغة كالتالي ...

مثال رقم 5 :

( for ( int x =0; x < 81; x += 5

{

; [cout << W [x

; cout << endl

}

سيحل المثال أعلاه المشكلة لأن مقدار الزيادة يساوي 5 وأول عدد هو الصفر فدائما القيمة x تكون من مضاعفات الخمسة وتقبل القسمة على 5 ...

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

مثال رقم 6 :

(++ for ( int x =0 ; x < 81; x

{

(if ( x % 5 == 0

{

; [cout << W [x

; cout << endl

}

}

هذا المثال يدخل شرط اختبار اضافي داخل الحلقة لاداعي له .. ومن الملاحظ أن الحلقة يمكن ان تكتب بأكثر من طريقة ويجب محاولة البحث عن الافضل من ناحية الاداء , وسهولة الفهم .... مثلا المثال السابق مقارنة بالمثال رقم 5 سيأخذ وقتا أطول في التنفيذ لأن الكمبيوتر سيقوم بعملية التكرار والاختبار 81 مرة .... اما في المثال رقم 5 سيقوم بالختبار 17 مرة فقط ...

لاحظ اننا لايمكننا كتابة الشرط (if ( x % 5 == 0 في جسم الحلقة في الخانة الثانية المخصصة للشرط ...

على الشكل التالي ...

مثال 7 :

for ( int x=0 ; x % 5 == 0 ;x ++ ) // Our Foor loop

{

; [cout << W [x

; cout << endl

}

المثال أعلاه لن يعمل لأن الشرط في الدورة الثانية سيختل وسيخرج البرنامج عن جسم الحلقة فورا ...

...................................................................

أخيرا يمكنك التلاعب بجسم الحلقة كما تشاء يعني ....

يمكنك الاستغناء عن أحد الاجزاء الثلاثة الرأيسية الخاصة بجسم الحلقة ....

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

(++ for ( int x =0 ; ; x

{

cout << "HELLO " ;t

; cout << endl

}

سيتم هنا طباعة العبارة " HELLO " بشكل لانهائي ولن يتوقف البرنامج عن العمل ...

يمكنك ايضا الاستغناء عن أي طرف من الاطراف ... مثلا اذا كانت القيمة الابتدائية ل x معرفة مسبقا لاداعي لوضعها مرة أخرى في البارمتر الاول ...

(++ for ( ; x < 81; x

ويمكن الاستغناء عن مقدار الزيادة ووضعه داخل جسم الحلقة على الشكل التالي ...

( ; for ( int x =0 ; x < 10

{

; ++x

}

وأخيرا يمكنك الاستغناء عن كل البرمترات الثلاثة لتكون الحلقة لانهائية بشكل مباشر " لأنه لايوجد شرط " وتكون على الشكل التالي ...

for ( ; ; ) // Our infinite Loop

الامثلة كثيرة جدا في هذا المساق لكننا سنكتفي بهذه الامثلة الابتدائية التي ستشرح المطلوب باذن الله لأساسيات الحلقات ...

وسندخل في الجلسة التالية في الحلقات المتداخلة وسنحاول ازالة الغموض الدائر حولها باذن الله ...

0

شارك هذا الرد


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

مشكووور اخي ..

وأكيد نحنا بننتظر الجلسة الثانية

بارك الله فيك ...

شكرا على هالمجهود الرائع

0

شارك هذا الرد


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

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

الجلسة الثانية :

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

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

مثال 1 :

(++ for ( int x = 0 ; x< 10 ; x

{

(++ for ( int a= 0 ; a< 8; a

{

; cout << a

}

; cout <<endl

}

عمل الحلقة المتداخلة منطقي تماما ... حيث يتم تنفيذ الحلقة الأم الخارجية 10 مرات وهي الحلقة صاحبة المتغير x .... وكل مرة تنفذ فيها الحلقة الخارجية تنفذ فيها جسم الحلقة .. وفي حسم الحلقة توجد حلقة داخلية a سيتم تنفيذها وحتى الانتهاء منها تماما ... أي سيتم تنفيذها 8 مرات ... ثم بعد ذلك يتم اخروج من جسم الحلقة الداخلية ... ثم تنفذ باقي تعليمات الحلقة الخارجية ... وبما أنه لاتوجد تعليمات للحلقة الخارجية زيادة .. سيتم الخروج من الحلقة الخارجية للمرة الأولى لتستعد لاعادة التنفيذ للمرة الثانية ... حيث يتم زيادة قيمة المتغير x بواحد ..." في المرة الاولى كانت قيمة x بصفر" والان بعد الزيادة ستصبح 1.. ويختبر شرط الدخول x <10 وبما أن 10 > 1 سيتم الدخول في الحلقة للمرة الثانية ... وتنفذ الحلقة الداخلية 8 مرات ثم تخرج وتزيد x بواحد وتختبر الشرط 10 > 2 وتنفذ الحلقة مرة أخرى ... وهكذا 10 مرات ... حتى يختل الشرط 10 > 10 قلا يتم تنفيذ الحلقة ...

من الملاحظ ان الحلقة الداخلية تتكرر 80 مرة..... " حاصل ضرب عدد مرات الحلقة الخارجية * عدد مرات تكرار الداخلية " ...

الخرج من المثال السابف كالتالي ....

01234567
01234567
01234567
01234567
01234567
01234567
01234567
01234567
01234567
01234567

" لاحظ لاتوجد مسافات بين الارقام " 1 2 3 .....

لاحظ أن الامر ; cout << endl موجود ضمن الحلقة الخارجية وليست الداخلية ... حيث سيتم تنفيذها 10 مرات" وهو السبب في أن كل مجموعة أرقام مكتوب في سطر جديد " ... أما ; cout << a فهي موجودة صمن الحلقة الداخلية وستنفذ 80 مرة ...

الان اذا اردنا طباعة مستطيل من النجوم بعرض 5 نجوم وارتفاع 6 نجوم ... ماذا نفعل ..؟

اليك المثال ...

مثال 2 :

(++ for ( int x = 0 ; x< 6; x

{

(++ for ( int a= 0 ; a< 5; a

{

cout << " * " ;// our out put

}

; cout <<endl

}لاحظ الفرق بين المثالين 2 و 1 .... بغض النظر عن عدد مرات التكرار سيكون الفرق فقط في أمر الطباعة cout حيث سيتم طباعة نجوم في المثال الثاني ... بنفس منطق المثال الأول ... ولاحاجة للتوضيح ...

الان فالننتقل الى خطوة أكثر جدية ....

اذا أرنا طباعة مثلث بالنجوم * على الشكل التالي ...

            
          *
        **
      ***
    ****
  *****

كيف يمكن رسم الشكل اعلاه ...

خذ المثال ...

مثال 3:

(++ for ( int x = 0 ; x< 6; x

{

(++ for ( int a= 0 ; a< x; a

{

cout << " * " ;// our out put

}

; cout <<endl

}لاحظ الفرق بين مثال 2 الذي يرسم مستطيل والمثال 3 الذي يرسم المثلث ... أين الفرق ؟؟

الفرق فقط في المتغير x المكتوب باللون الارجواني ... في المثال 2 كان ثابت وقيمته 5 أما في هذا المثال فهو متغير قيمته x ... ومعناه أن الحلقة الداخلية ستتكرر x مرة ...

كم هي قيمة x ?? ... في المرة الاولى التي تنفذ فيها الحلقة الخارجية تكون x تساوي صفر .. والمرة الثانية تساوي واحد ثم 2 ثم 3 وهكذا حتى تصل ال 5 ..." أصغر من 6 " " x < 6 " ومن هنا نرى أن في السطر الاول في المخرجات على الشاشة لاتوجد أي نجمة وفي السطر الثاني توجد نجمة واحدة وفي الثالث توجد 2 وفي الرابع 4 ... وهكذا حتى السطر السادس توجد 5 نجوم .... وعدد مرات طباعة النجمة يحددها المتغير x باللون الارجواني الذي داخل الحلقة الداخلية ...

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

0

شارك هذا الرد


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

جلستين والله لا احلى ولا أجمل

شكرا على هالفهم الرائع اللي عندك اخي

ونحن بإنتظار المزيد ..

0

شارك هذا الرد


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

السلام عليكم ............

بصراحة الجلستين تكفي وتوفي إن شاء الله

ومشكور أخونا الكبير HGB

بس حبيت أضيف على كلام أخونا الكبير إن الfor loop أهميتها الكبيرة في ادخال عناصر المصفوفة و طباعتها فاذا كان عدد عناصرها 100 فستحتاج إلى 100 سطر لادخال العناصر

أو ببساطة استخدم for واحل المشكلة في سطرين

وطالما انكم مهتمين بالدروس أنا ابشركم انه الدكتور عندنا نزل الدروس على موقعه الشخصي وراح يفتتحه عن قريب

وراح يكون الرابط عندكم مع افتتاح الموقع

أو اني احذ المحاضرات منه وانزلها لكم

وانتم تستاهلون على اجتهادكم هذا كل خير

اسف على الإطالة ومشكورين

0

شارك هذا الرد


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

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

بداية شكرا على الاهتمام وعسى الله أن يفعنا وينفعكم ,,,,,

الجلسة الثالثة :

توقفنا اخر مرة في مثال المثلث ,,,, اليكم بمثال اخر أكثر صعوبة ,,,

مثاث لكن على شكل متطابق الضلعين يعني ,,,

        *
     ***
   *****
 *******
*********

دقق النظر في المثلث السابق ,,, ماذا تلاحظ ,,

الملاحظ أنه في السطر الاول توجد نجمة واحدة وفي الثاني 3 ثم 5 ثم 7 ثم 9 ... اذن هذه ليست مشكلة ,, نجعل الحلقة الداخلية المهتمة بالطباعة تبدأ بالقيمة 1 وتزيد بمقدار 1 كل مرة و تتكرر كل مرة بقيمة فردية وهذه القيمة الفردية تعتمد على رقم السطر لو كنتم تلاحظون ذلك ,,, أي أن عدد النجوم في سطر معين يساوي(رقم السطر * 2 )+ 1 والمسؤل عن رقم السطر هي الحلقة الخارجية وسنأتي لذكرها بعد قليل ...

الملاحظة الثانية ... هي أنه من بداية السطر من اليسار ,, في أول سطر نجد 4 فراغات ثم طباعة النجمة ,,, في السطر الثاني نجد 3 فراغات ثم طباعة ,,, في السطر الثالث فراغين ثم الرابع فراغ واحد والخامس والاخير بدون أية فراغات ,,,

الفراغات مختلفة ولها صيغة كما هو ملاحظ ,,,, اذن سنكتب حلقة اضافية لأكل الفراغات ,,, وبالطبع ستنفذ قبل تنفيذ حلقة الطباعة لأن الفراغات قبل طباعة النجوم ,,,

وستكون هذه الحلقة عادية تبدأ من 4 وتتناقص بواحد كل مرة "--z ",, حتى تتوقف عند الصفر ,,, لكن لجعل عدد مرات تكرار الحلقة متغير يجب مرة أخرى كما في الحلقة اعلاه أن نجعل شرط عدد مرات تكرار الحلقة متغير ,,, حيث أن عدد الفراغات أيضا يعتمد على رقم السطر ,,,

الملاحظة الاخيرة أن عدد السطور يساوي 5 وستكون هي الحلقة الأم الخارجية وبها الامر الوحيد cout << endl ,,, الكود كالتالي ,,

مثال 1:

(++ for ( int q = 0 ; q < 5 ; q

{

(++ for ( int z= 4; z>=q ; z

{

; " " >> cout

}

(++ for ( int x= 0; x<(q*2)+1 ; x

{

; "*" >> cout

}

cout << endl

}

أرجو أن يكون المثال واضحا ,,,

الان يمكنك أن ترسم شكل معين اما باستعمال كود كالمثال اعلاه ثم يليه مباشرة كود معكوس للمثال أعلاه حيث يرسم مثلثين متقابلين في القاعدة ,,, وبهذا يكون المعين قد رسم ,,,

ويمكن رسمه دون الحاجة للصق الكود المعاكس تحت الكود الاصلي مرة أخرى ببعض التحايل في الحلقة ,,,

أترك لكم هذه المهمة وهي سهلة باذن الله ,,,

الان بقي أن أذكر شيئا واحدا ,, وهو أننا يمكن أن رسم مثال المستطيل في الجلسة السابقة دون الحاجة لتداخل الحلقات !! كيف يعني ؟

خذ المثال .,,

مثال 2:

( ++ for (int q = 0 ; q < 30 ; q

}

( if ( q % 5 == 0

}

cout << endl

}; "*" >> cout

}

الشرط باللون الارجواني حل مشكلة أكل السطر "cout << endl " حيث لاحاجة لحلقة خاصة تقوم بهذه العملية ,, وهي في السابق الحلقة الخارجية ,,,

الان لاحظ ايضا أن عدد مرات تكرار الحلقة الوحيدة في المثال أعلاه تساوي 30 أي 6 * 5 وهي عدد النجوم الكلي والعدد 6 قي المثال في الجلسة السابقة كان للحلقة الخارجية و5 للداخلية ....

الان مثال المثلث في الجلسة السابقة ,,, بحلقة واحدة يصبح ,,,

مثال 3: ; int w = 1 , t = 1 , e = 1

(++ for( int q = 1 ; q < 16 ; q

}

; "*" >> cout

( if( q % e == 0

}

cout << endl

; ++w

e = w + t

t = e

}

}

الكود أعقد بالطبع أعقد من نظيره صاحب الحلقتين ,, لكن فقط أريد أن أبرهن على أن الحلقات يمكن برمجتها بطريق كثيرة ,, فاختر الانسب لك من ناحية الاداء وسهولة الفهم ,,,

ولاحظ أيضا انني قمت باستخدام عامل باقي القسمة ,, وهو من الامور التي يجب أن تعتاد عليها جيدا ,, لأنها سبيل الخلاص في بعض الحالات الحرجة ,,,

مثلا معرفة هل العدد فردي أم زوجي ,, معرفة الاعداد الاولية ,,, وباختصار معرفة هل العدد x يقبل القسمة على w ,,,,

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

HG

HH

GG

GH

هذا في حاة الحرفين ,, أما في حالة الثالثة حروف فلدينا 27 احتمال ,, سيقوم البرنامج بعرضها كلها ,,, لمن يحب النتحديات فاليحاول حتى الجلسة المقبلة ايجاد حل هذا البرنامج ,,, وهو ليس سهلا اطلاقا بل يجب عليك معرفة الفكرة ,,,

وبالمناسبة الكود لايتجاوز 10 أسطر !!!

والى الجلسة المقبلة ,,,

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

شارك هذا الرد


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

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

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

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

الجلسة الرابعة :

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

لنفرض مثلا ان المستخدم أدخل خانتين " حرفين " ... سيكون عدد التبديلات الكلي 4 ..

واذا أدخل 3 أحرف سيكون عدد التبديلات الكلي 27 ... واذا أدخل 5 سيكون 3125 احتمال مختلف ...

الان الملاحظ أن عدد التبديلات هو عدد الأحرف أس عدد الخانات ... والملاحظ أن عدد الاحرف هنا هو نفسه عدد الخانات ...

الان كيف يتم التبديل ؟؟؟

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

الان كيف يمكن كتابة كود كهذا بالحلقات ؟؟ الاجابة البديهية هي الحلقات التداخلة حيث يكل سهولة يمكن ان نضع عدد حلقات LOOP بعدد الخانات .. وكل خانة ستهتم بطباعة الخانة المطلوبة منها ...

خذ المثال التالي لطباعة التبدبلات في 3 خانات ....

مثال 1:

" char x[3] = "CAT

(++ for( int q= 0 ; q <3;q

}

(++ for( int w= 0 ; w<3;w

{

(++ for( int e= 0 ; e<3;e

{

[ cout << x[e]<<x[w]<<x[q

{

{

cout <<endl

{

الان هذا المثال سيفي بالمطلوب لو كان لدينا سلسلة 3 خانات ...

لكن السؤال لو أردنا أن نجعل عدد الخانات 4 .. سنكتب 4 حلقات .. 5 حلقات ... وهكذا ...

ماذا لو أردنا أن نجعل الكمبيوتر يبدل بين 1000 خانة .. مليون خانة !!!

مستحيل كتابة حلقات متداخلة بهذه الصورة البشعة .. فما الحل ؟؟؟

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

هذا ماسيحدث هنا خذ المثال التالي ...

مثال 2:

" char STRING[3] = "CAT

int POW

(++ for(int q=0;q<pow(3,3); q

{

(++for(int w=0;w<3;w

{

(POW=pow(3,3

[cout<<STRING

[ ((q-(q%POW))/POW)%3

}

cout<<endl;

}

الان هذا المثال يعمل تماما كما في المثال ... لكن هنا اذا أردنا في أي لحظة ان نزيد عدد الخانات فيكفي تغيير أي قيمة 3 بالقيمة 4 وسيعمل المثال بشكل جيد !!!

مالذي حدث ليتم ذلك ... اللعبة كلها في المعادلة التي باللون الرمادي ....

هي التي تحسب رقم عنصر الخانة الحالية باستخدام باقي القسمة,,,

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

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

........................

ولمن لديه أي سؤال هنا عن الحلقات فاليتفضل بطرحه .. لمحاولة اكمال هذا العمل ..

وأخيرا أقول وفق الله الجميع لما يحب ويرضى ,,,

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

Prob.zip

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

شارك هذا الرد


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

الأخ الكريم HGB ،

سؤال حول هذه المسألة من الجلسة الأولى حيث قلت:

نقرض لدينا مصفوفة int تسمى W حجمها الاقصى 200عنصر وقمنا بوضع بيانات في 90عنصر فيها وبالترتيب ... ونريد أن نطبع أول 15 عنصر على الشاشة ...

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

مثال رقم 2 :

(++ for ( int x =0 ; x < 15 ; x

{

; [cout << W [x

; cout << endl

}

هنا سيتم طباعة 15 عنصر من المصفوفة كل واحد في سطر جديد ....

يمكن تنفيذ هذه العملية بشكل اخر غير عملي كالتالي ...

أنا طبقت المسألة بهذا الشكل:

#include <iostream>

using std::cout;
using std::endl;

int main ()
{
for (int x =0; x < 15; x++)
{
 cout << W [x];
 cout << endl;
}

return 0;
}

وتظهر لي الأخطاء التالية:

error C2065: 'W' : undeclared identifier

و

error C2109: subscript requires array or pointer type

Error executing cl.exe.

ما عرفت بصراحة ليش؟ :wacko:

الW غير معرف، والثاني ليش يطلع؟

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

شارك هذا الرد


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

هذا لأنك لم تقـم بالإعلان عـن المصفوفة W ..

أكتب هذا السطر قبل For في الكود:

int W[15];

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

شارك هذا الرد


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

أخي العزيز Sultan_Althibity

لازال الخطأ مكانه لا يتغير :blink:

0

شارك هذا الرد


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

حسناً ، مستحيل أن يكون الخطأ هـو نفسـه

قم بنسخ الكـود ولصقـة دون تغيير وجربـه وأعـطني خبر فوراً:

#include <iostream>

using std::cout;
using std::endl;

int main ()
{
int W[15];
for (int x =0; x < 15; x++)
{


cout << W [x];
cout << endl;
}

return 0;
}

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

شارك هذا الرد


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

بالنسبة لمخرجات الكـود ... فلا أدري بصراحـة ماذا سيطبع

أعتقد أنه سيطبع لك أرقام غريبة للغاية أو عـناوين عـناصر المصفوفة

بالنسبة للخطأ الثاني الموجود لديك في المترجم فبسبب أنك قمت باستخدام دليل مصفوفـة أي هـكذا [ ] ومن المعروف أن هذا الرمز لا يستخدم سوى للمؤشرات أو المصفوفات وأشياء أخرى ليس هـنا مجال لذكرها وبما أن المصفوفة W لم تقم بالإعلان عـنها فالمترجم ينبهـك لهذه النقطـة

0

شارك هذا الرد


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

غريب .. :lol: الآن يعمل..

مع أنه نفسه .. :wacko:

انزين أخوي أنا سويت ليه اكسقيوزت

وطلع كذا ..

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

-858993460

هل هذا هو المفروض أن يطبعه؟!

ومسامحة تعبتك معاي

0

شارك هذا الرد


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

وحتى بالنسبة للمثال الآخر

#include <iostream>

using std::cout;
using std::endl;

int main ()
{
int W[41];

for (int x =1; x < 42; x+2)
{
 cout << W[x];
 cout << endl;
}

return 0;
}

تظهر انفنت لوب، غير منتهية

هل الأمثلة صحيحة ام خاطئة؟!

هل يصلح أن أتابع هذه الجلسات؟!

أرجو النصيحة :unsure:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

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

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