أنا جربت البرنامج بتاعك تانى بس فى ال debug mode و طلع نتايج فعلا زى مانتا بتقول لكن فى ال release mode بيطلع كله false (!!) و مش عارف طبعا أعمله debug و أعرف إيه اللى بيحصل. إن شاء الله حقرا فى الفرق بين ال release و ال debug علشان أقدر أعرف و ليه بيعمل كدة, و يا ريت لو حد يعرف يفيدنا.
فكر معي ;)
بلو هذا امر غريب جدا, الكمبايلر الي انت بتستخدمه عجيب ,
ال debug and release mode لازم يعطوا نفس ال ouptut
اقتباسو مش عارف طبعا أعمله debug و أعرف إيه اللى بيحصل
ليه ماعرفت تعمل debug!!
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
السلام عليكم ..
الأخ عماد .. الى الآن لا أعرف كيف يعمل برنامجك .. هلا تفضلت بشرحه ؟؟
و خاصة متى سينفذ هذا الأمر:
else if(isFoo(n-7))
تم تعديل هذه المشاركة بواسطة Yousof في 4 نوفمبر 2006 في 21:25
أنا بستخدم VS 2005! و مش عارف أعمله debugging علشان لما بدوس f11 فى ال release mode مش بيدخل جوة isFoo بس بينفذها و مش بشوف إيه اللى بيحصل
السلام عليكم
الحقيقة الموضوع أثار فضولي, أنا جربته على Borland Turbo C++ و البرنامج شغال 10/10
يعني isFoo(12) returns true
و isFoo(13) returns false
يا يوسف انا وضع شرح بسيط للكود , وجربته على الرقم 14, و انت ممكن تفهمه اكتر اذا اعملتله ديبج.
على اي حال , عندما اجد وقت فراغ سوف اضع شرح مفصل إن شاء الله
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
أولا اسمحوا لي أن أدخل في النقاش
ثانيا يا أخ عماد إن تابعك لا يعيد قيمة في كل الحالات كما ذكر الأخ Blueteeth وهذا ما يسبب الاختلاف في النتائج فهو يعيد قيمة قشوائية في الحالتين الأخيرتين, الشرح لقيمة 5 مثلا:
IsFoo(5) هل 5 تساوي 0 لا إذا هل 5 أصغر من 0 لا هل IsFoo(0) يساوي true هل 0 تساوي 0 نعم إذا أعد true نعم إذا لاشيء وهنا ينتهي التابع ويعيد قيمة عشوائية
والغريب أن ما لم تلاحظوه أن Compiler يعطي تحذير بأن هذا الكود لن يعيد قيمة دائما
عفوا فلقد ذكر الأخ Blueteeth لك ذلك ولكنك طالبت بالتجريب وكأن التجريب حجة أقوى من المنطق
اقتباسراجع تانى على اللى إنت كاتبه, شكلك نسيت تكتب ال return
وردا على ما سبق ذكرت أنك ستشرح كيف سيعيد التابع قيمة
اقتباسبعرف انه اصدك على اخر سطرين, اذا مش واضح انا ممكن اشرحه
وعنما قمت بشرح تابعك وصلت إلى أن التابع ذو الدرجة الثانية سيعيد true ولكنك لم تذكر كيف التابع الذي استدعاه أساسا سيعيد أي قيمة!
اقتباسلنأخد الكود الي و ضعته, نأخذ الرقم 12,أو أمر هل 12 == 0 .. طبعا لا
سينتقل الى 12 أصغر من الصفر ..الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 7 .. (12-5)
7 == صفر ... الجواب لا
7 أصغر من الصفر .. الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 2 .. (7-5)
2 == صفر ... الجواب لا
2 أصغر من الصفر .. الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 3- .. (2-5)
3- == صفر ... الجواب لا
3- أصغر من الصفر .. الجواب نعم ... النتيجه return false
و الان تبأ عملة تسمى floding اذا لم تخني الذاكرة باسم العمليه,
سترجع قيمة الn الى 2
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن -5 .. (7-2)
-5 == صفر ... الجواب لا
-5 أصغر من الصفر .. الجواب نعم ... النتيجه return false
سترجع قيمة الn الى 7
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 0 .. (7-7)
وهنا سوف يرجع true
و عندما يرجع true لن يقوم بتجريب الي رقم اخر
السلام عليكم ورحمة الله و بركاته,
أنا كنت مقرر اني اضع الشرح اخر الاسبوع لضيق الوقت عندي, ولكن الاخ فراس باسلوبه الجميل في التعليق على كودي :D اجبرني ان اضع الشرح الان.
اقتباسوكأن التجريب حجة أقوى من المنطق
انا قلت للاخ بلو جرب ليس لان التجريب حجة أقوى من المنطق ولكن لاني احاول تأخير و ضع الشرح لضيق الوقت كما ذكرت.
اخي فراس تابعي لا يرجع قيمة عشوائيه ولا بحاله من الاحوال, لناخذ الرقم 5
هل ال 5 تساوي صفر لا
هل ال 5 اصغر من الصفر لا
سوف يدخل الى
if (isFoo(n-5));
سوف يستدعي الداله مرة اخرى بـ n تساوي 0
هل ال 0 يساوي ال 0 -, نعم ,سوف ترجع الداله true
فسوف يصبح عندي
if (true)
بهذاه الحاله لن تقوم الدالة بالدخول الى
else if(isFoo(n-7))) ابدا حتى ينتهي الكومبايلر من عملية ال floding ارجو ان العمليه هذه تكون معروفه عند الجميع.
اذا هذه فائدة ال else if
انه بمجرد ارجاع القيمه true سوف يخرج البرنامج من الداله على طول,
لنأخذ مثا اخر عشان ما يقول الاخ فراس ان التجريب حجه اقوى من المنطق, ال 12 لاكمل عليه الشرح
لنأخد الكود الي و ضعته, نأخذ الرقم 12,
أو أمر هل 12 == 0 .. طبعا لا
سينتقل الى 12 أصغر من الصفر ..الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 7 .. (12-5)
7 == صفر ... الجواب لا
7 أصغر من الصفر .. الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 2 .. (7-5)
2 == صفر ... الجواب لا
2 أصغر من الصفر .. الجواب لا
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 3- .. (2-5)
3- == صفر ... الجواب لا
3- أصغر من الصفر .. الجواب نعم ... النتيجه return false
و الان تبأ عملة تسمى floding اذا لم تخني الذاكرة باسم العمليه,
سترجع قيمة الn الى 2
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن -5 .. (7-2)
-5 == صفر ... الجواب لا
-5 أصغر من الصفر .. الجواب نعم ... النتيجه return false
سترجع قيمة الn الى 7
سينادي الداله isFoo مرة أخرى و لكن القيمه الآن 0 .. (7-7)
وهنا سوف يرجع true
و عندما يرجع true لن يقوم بالدخول الى ال
else if(isFoo(n-7))
و بهذا سوف يرجع الداله بقيمة true
لاوضح اكتر عشان ما يزعل منا الاخ فراس :P (حهريك اليوم يا فراس :D )
يبدو لي ان هذه الجملة غير واضحه تماما
if (isFoo(n-5)); else if (isFoo(n-7));
سبب وجود هتان الجملتان هو اني لا اريد من البرنامج تكوين الشجرو باكملها, انا اريده ان يخرج من الداله فور وجوده لقيمو true
فاذا ارجع
(isFoo(n-5)) او (isFoo(n-7)) القيمه true
سوف يدخل البرنامج على
if (isFoo(n-5)) ;
و isfoo تحمل القيمة true
لذلك لن يقوم بالدخول على else if (isFoo(n-7))
وبالتالي سوف يكمل الكمبايلر عملية ال floding و يخرج من الداله بقيمة true
إن شاء الله تكون وصلة الفكره هذه المرة بشكل واضح جدا,,
اقتباسوالغريب أن ما لم تلاحظوه أن Compiler يعطي تحذير بأن هذا الكود لن يعيد قيمة دائما
كما قلت ان البرنامج يذكر لك انه هناك تحذير وليس خطأ, فالكمبايلر هو اله غبيه تتبع خطوات معينه اذا خرج المبرمج عن نطاق معين, تنبهه, ولكن هناك خدع توجب المبرمج ان يقوم بها ليختصر كثيرا من العناء..
شكرا ,ارجو ان لا اكون اطلت على الشباب :)
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
اقتباسو عندما يرجع true لن يقوم بالدخول الى الelse if(isFoo(n-7))
و بهذا سوف يرجع الداله بقيمة true
:) أخى إحنا عارفين ال if/else بتشتغل إزاى, نقطة الخلاف هى إزاى الدالة ترجع قيمة من غير ما تكتب return صراحة!! يعنى فى الجملة اللى أنا عاملها إقتباس دى, ليه ليه إفترضت إن الدالة بترجع true ؟!
اقتباسكما قلت ان البرنامج يذكر لك انه هناك تحذير وليس خطأ, فالكمبايلر هو اله غبيه تتبع خطوات معينه اذا خرج المبرمج عن نطاق معين, تنبهه, ولكن هناك خدع توجب المبرمج ان يقوم بها ليختصر كثيرا من العناء..
يا راااااجل حرام عليك :))!! بقا ذكاء و خبرة فطاحل المبرمبجين تقول عليه "آلة غبية", لعلمك التحذيرات دى فى 95% من الأحيان بيبقا ليها تأثير على أداء برنامجك, ممكن تكون إنت شايفه بيشتغل صح, لكن تحت ظروف مختلفة و input مختلف ممكن يشتغل غلط! و لذلك نصيحة منى, لا تتجاهل التحذيرات و حاول معالجتها.
بسم الله الرحمن الرحيم,
اقتباسأخى إحنا عارفين ال if/else بتشتغل إزاى, نقطة الخلاف هى إزاى الدالة ترجع قيمة من غير ما تكتب return صراحة!! يعنى فى الجملة اللى أنا عاملها إقتباس دى, ليه ليه إفترضت إن الدالة بترجع true ؟!
انا والله متعجب لامركم, طلبتوا مني شرح, فقمت بالشرح, فقلتوا نحنا عارفين .
الكود من ابسط ما يكون
else if(isFoo(n-7)) بحالة ال N=7 سوف تنادي الداله و تشيك هل ال 0 =0 نعم سوف ترجع TRUE
يبدوا لي ان الشباب لا يتعاملوا كتير بال resursion
اقتباسيا راااااجل حرام عليك )!! بقا ذكاء و خبرة فطاحل المبرمبجين تقول عليه "آلة غبية", لعلمك التحذيرات دى فى 95% من الأحيان بيبقا ليها تأثير على أداء برنامجك, ممكن تكون إنت شايفه بيشتغل صح, لكن تحت ظروف مختلفة و input مختلف ممكن يشتغل غلط! و لذلك نصيحة منى, لا تتجاهل التحذيرات و حاول معالجتها.
جهاز الكمبيوتر من اخترعه اكتر ذكاءا ممن اخترع ال c++ , ومع هذا يعتبر اله غبيه, و من اخترعه يعترف بذلك. لانه مبرمج على نطاق محدد لا يمكنه الالمام بجميع المشاكل التي قد تواجهه. والا لم يكن هناك شئ اسمه viruse .
ما علينا, انا لا اتجاهل التحذيرات ابدا, و طبعا يجب او من المفضل على المبرمج حل جميع التحذيرات, ولكن انا ذكرت انه هناك اساليب تتطلب منك اختراق بعض قوانين ال c++ لتوفير الكثير من العناء
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
السلام عليكم
اعتدت ارتياد هذا المنتدى الذي هو من أحد المنتديات المفيدة والقوية جدا في مجال البرمجة .. ولكن نظرا لضيق وقتي فأنا لا أحب الكتابة في المنتديات .... ولكن بعد قراءتي لهذا الموضوع تحمست جدا للكتابة والرد على بعض الإخوة الذين عقبوا على الموضوع...
بداية أنا أقترح هذا الكود للبرنامج
bool isFoo(int n){
if (n==0) return true;
if (n<0) return false;
else return (isFoo(n-5)||isFoo(n-7));
}قرأت جميع أكواد الإخوة المشاركين وعندي بعض التعقيبات
أولا::: كود الأخ يوسف أشبه ما يكون بال hardcoding ولا يمت إلى الصحة بصلة. وحابب أقلك ياعزيزي انو متى ما شفت if statements كتير في الكود بتاعك فاعلم انو عليه العوض ومنو العوض
ثانيا::: كود الأخ عماد لم يقنعني في بادئ الأمر طبعا لأنني لم أفهمه في البداية ولكن بعد تفكير عميق اكتشفت أنو يطبق مفهوم الrecursion تماما، ولا غبار عليه فعمليتا ال folding وال unfolding يعملا PERFECTLY في هذا الكود.... طبعا شرح الأخ عماد وافي وكافي ... ويدل على عمق فهم ولا داعي لتكرار ما قال ... لذلك أحب أن أقول أني عرضت الكود على full professor in softwere engineering واحد من عباقرة الهندسة البرمجية عالميا فقال لي أن الكود صحيح 100%
عرضت عليه برنامجي فقال ... This is correct but you might've gotten it by chance
هو ((كسر راسي)) بس لا بأس... لو واحد غيرو كان كسرت راسو بس شو بدنا نعمل
نجي على الأخ fh_feras
fh_feras كتب:أولا اسمحوا لي أن أدخل في النقاشثانيا يا أخ عماد إن تابعك لا يعيد قيمة في كل الحالات كما ذكر الأخ Blueteeth وهذا ما يسبب الاختلاف في النتائج فهو يعيد قيمة قشوائية في الحالتين الأخيرتين, الشرح لقيمة 5 مثلا:
IsFoo(5) هل 5 تساوي 0 لا إذا هل 5 أصغر من 0 لا هل IsFoo(0) يساوي true هل 0 تساوي 0 نعم إذا أعد true نعم إذا لاشيء وهنا ينتهي التابع ويعيد قيمة عشوائيةوالغريب أن ما لم تلاحظوه أن Compiler يعطي تحذير بأن هذا الكود لن يعيد قيمة دائما
عفوا فلقد ذكر الأخ Blueteeth لك ذلك ولكنك طالبت بالتجريب وكأن التجريب حجة أقوى من المنطق
وردا على ما سبق ذكرت أنك ستشرح كيف سيعيد التابع قيمة
وعنما قمت بشرح تابعك وصلت إلى أن التابع ذو الدرجة الثانية سيعيد true ولكنك لم تذكر كيف التابع الذي استدعاه أساسا سيعيد أي قيمة!
اولا: من خلال كتابتك للكود وردك عليك يبدو أنه ليس لديك أدنى فكرة عن الrecursion، بس أكيد الدلفي فيها recursion لأنو سمعت انو بس الفوورتران اللي من أيام جدي ما فيها هالميزة، لذلك رجائي الحار إذا لم تكن ملما بالموضوع تماما فلا ترد عليه بسطرين
ثانيا: التجريب حجة أقوى من المنطق،،،،لا طبعا... ومن الذي قال ذلك ؟؟؟؟ انا بصراحة لم أفهم ذلك من خلال ردود الأخ عماد وخاصة بعد أن كتب صفحات يوضح ماقال
ثالثا: A MAN HAS TO DO WHAT A MAN HAS TO DOمش A MAN HAVE TO DO WHAT A MAN HAVE TO DO
Blueteeth كتب::) أخى إحنا عارفين ال if/else بتشتغل إزاى, نقطة الخلاف هى إزاى الدالة ترجع قيمة من غير ما تكتب return صراحة!! يعنى فى الجملة اللى أنا عاملها إقتباس دى, ليه ليه إفترضت إن الدالة بترجع true ؟!يا راااااجل حرام عليك :))!! بقا ذكاء و خبرة فطاحل المبرمبجين تقول عليه "آلة غبية", لعلمك التحذيرات دى فى 95% من الأحيان بيبقا ليها تأثير على أداء برنامجك, ممكن تكون إنت شايفه بيشتغل صح, لكن تحت ظروف مختلفة و input مختلف ممكن يشتغل غلط! و لذلك نصيحة منى, لا تتجاهل التحذيرات و حاول معالجتها.
بعدين يا أخي Blueteeth ::
1- كيف ازاي بترجع الدالة .. بدون return ؟؟ ياعزيزي الif و الelse فيهم دوال فيها return ، يعني أنا مستغرب تماما من حضرتك مادام انت خبير بالسي بلس بلس لازم تكون خبير بالديبج،، طيب ازا مش بيشتغل معك الديبج أقترح عليك تعمل tree diagram ولما توصل على الbase case بتاع ال recursion اعمل folding ،،، في حالة انك ما فهمت على أقترح عليك قراءة خارجية في الموضوع مش خطأ لو الواحد كان خبير وتعلم
http://www.cprogramming.com/tutorial/lesson16.html
2- بعدين الكمبيوتر آلة غبية! فما بالك بالكمبايلر ... يعني الإنسان هو من اخترع الكمبيوتر وقال عنه ذلك.. ولا داعي أن أطيل في هذا
3- كودك صحيح 100%، بس هذا لا يعني أن أي كود غيره خاطئ فالبرمجة بحر واسع لاحدود له
شكرا لكم وآسف على الإطالة
تم تعديل هذه المشاركة بواسطة TOOFI في 7 نوفمبر 2006 في 23:53
TOOFI كتب:أولا::: كود الأخ يوسف أشبه ما يكون بال hardcoding ولا يمت إلى الصحة بصلة. وحابب أقلك ياعزيزي انو متى ما شفت if statements كتير في الكود بتاعك فاعلم انو عليه العوض ومنو العوض
أولا شكرا لك على المداخله :P
و ثانيا لم تأت بشيء جديد من هذه العباره لأني اعترفت أن برنامجي خطأ B)
الأخ Super_emad55:
لقد قمت بجلب مثالين مقابل شرح بسيط!اقتباسأنا كنت مقرر اني اضع الشرح اخر الاسبوع لضيق الوقت عندي, ولكن الاخ فراس باسلوبه الجميل في التعليق على كودي أجبرني ان اضع الشرح الان
ولكن إذا خرج التابع الأب فورا ماذا يعيد «لا شيء» أليس كذلك فالسطر يقول:اقتباسانه بمجرد ارجاع القيمه true سوف يخرج البرنامج من الداله على طول
if(isFoo(n-5));
والفاصلة المنقوطة تعني لاشيء, في هذه النقطة انتهت عملية floding ونحن في هذا التابع الذي يقول:
if(true);
ماذا يعيد هذا السطر «لاشيء»
لماذا لم تكمل نعم الدالة الإبن أعادت true ماذا يحصل في الدالة الأب التي طلبت الدالة الابن؟اقتباسو بهذا سوف يرجع الداله بقيمة true
نعم وهذه ما نحتاج إلى توضيحها تمامااقتباسيبدو لي ان هذه الجملة غير واضحه تمامااقتباسif (isFoo(n-5));else if (isFoo(n-7));
وأتى شرحك:
نعم isFoo(n-5) تحمل القيمة true ونعم لن يدخل إلى isFoo(n-7) والله عم نفهم ولكن كيف سوف يكمل الكمبايلر عملية floding ويخرج من الداله الأب بقيمة true هذا ما نرجوا توضيحه ولكن بدون أمثلةاقتباسسوف يدخل البرنامج علىif (isFoo(n-5)) ;
و isfoo تحمل القيمة true
لذلك لن يقوم بالدخول على else if (isFoo(n-7))
وبالتالي سوف يكمل الكمبايلر عملية ال floding و يخرج من الداله بقيمة true
الأخ TOOFI:
أنا لم أقم بالمشاركة حتى أذم أحد بل بسبب أني وجدت اختلاف وجهات نظر وحاولت أن أوضحها بالرد بما أعرفه.
أما أن تأتي وتقول أنك سألت أهل الخبرة وقالوا أن الكود صحيح فأنا لن أكذبك أبدا ولكن سأصدقك أسرع إن وضحت لماذا, لكنك ولا أعلم لماذا قررت أن تبدأ بذمي بدلا من التوضيح ولن أفعل المثل.
كانت الصفحات عبارة عن أمثلة وما زالت, لماذا إن كانت لديكم المعرفة وكافة ردودنا واضحة بأننا لم نقتنع بأن التابع سيعيد قيمة بدون أن يذكر ذلك صراحة لماذا لا تقولوا لنا كيف أن التابع الأب سوف يعيد true إذا كان آخر تابع إبن أعاد true ولم تذكر عبارة return بصراحة في التابع الأب, وبهذا نفهم الفكرة وتتضح وجهات النظر ونقفل النقاش؟اقتباسثانيا: التجريب حجة أقوى من المنطق،،،،لا طبعا... ومن الذي قال ذلك ؟؟؟؟ انا بصراحة لم أفهم ذلك من خلال ردود الأخ عماد وخاصة بعد أن كتب صفحات يوضح ماقال
أما اقتراحك لهذا التابع فلا غبار عليه وإن شاء الله تنورونا
تم تعديل هذه المشاركة بواسطة fh_feras في 8 نوفمبر 2006 في 05:58
السلام عليكم .. أعتقد اني فهمت المسأله
تخيل:
(n-5-5-5) /
(7-n-5-5) \ (n-5-5)
_______________/
(5-7-n-5) ______ / (n-5)
(7-n-5-7)\ (n-5-7) \____/
n ____________ /(n-7-5-5
5 -7-5-7)\ (n-7-5) / ___ \
_______________(n-7)
(5-n-7-7)/ (n-7-7) \
(n-7-7-7) \
نعوض بالرقم .. متى ما وجد البرنامج قيمة الصفر فأنه يرجع True و ان لم يجد الصفر فانه يرجع False
:lol:
السلام عليكم ,
الاخ tofe , شكرا على المداخلة, و تابعك ممتاز الا انه قد يسبب ميموري ليك اذا كان الرقم المدخل كبير, لان الشجره سوف تبنى باكملها.
الاخ يوسف, تعجبني في ردودك فهيه صريحه مفيده مختصره. ارجو فعلا ان تكون فهمت الكود, وفقك الله,
الاخ فراس, لا اشعر انك تريد الفائده, انت مجادل محترف , لا اريد ان اخصر السمعه الجيده (اذا كانت جيده) التي اكتسبتها في هذا المنتدى, ولكن اسلوبك مستفذ.
هناك اساليب كثيره لشرح اي كود, و منها التجريب ( وهي الطريقه الاطول و الاسهل ) الي انا اتبعتها.
اقتباسولكن إذا خرج التابع الأب فورا ماذا يعيد «لا شيء» أليس كذلك فالسطر يقول:كودif(isFoo(n-5));والفاصلة المنقوطة تعني لاشيء, في هذه النقطة انتهت عملية floding ونحن في هذا التابع الذي يقول:كودif(true);ماذا يعيد هذا السطر «لاشيء»
عن ماذا تتكلم!!!!
اشرح لي ماهيه عملية ال folding
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
بالغلط
تم تعديل هذه المشاركة بواسطة Super_emad55 في 8 نوفمبر 2006 في 21:31
ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust
هذا الموضوع مغلق.