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

فكر قبل الإجابة على السؤال ( double كعدّاد للحلقة)

مغلق
بدأه Khaled.Alshaya في 5 ديسمبر 2006 · 11 رد · 2,127 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا سؤال وضعته من فترة في المنتدى و لكن إختفى بسبب المشاكل في قاعدة البيانات على ما أعتقد ..

السؤال كالتالي :

لدينا هذا البرنامج الذي في الأسفل .. صحيح 100 % من ناحية اللغة و لكنه لا يعمل كما يفترض .. من يستطيع اكتشاف الـ BUG التي توجد فيه .

البرنامج بسيط جداً .

#include <iostream>
using namespace std;


int main () {

	 double i = 4.0;

	 while ( i != 0 ){

		  cout << i << "\n";
		  i -= 0.1;
	 }

	 return 0;
}

فكرة البرنامج أن المتغير i سيبدأ بالقيمة 4 و بعد ذلك سيتناقص بمقدار 0.1 و سيتم التحقق من قيمة i في الـ Loop فإذا كانت قيمته 0.0 فلا يكمل الـ Loop.

المشكلة هنا أنه حتى بعد 40 دورة لا يتوقف البرنامج و يبدأ في طباعة الأرقام السالبة حتى ما لا نهاية ( انت و قدرة جهازك :P )

حاول و ضع حلك ...

#2

على علمي الحمل التكرارية for---while لا يكون فيها الشرط != و انما يجب ان يحتوي على احدى الاشارتين > < و الله اعلم جرب و شوف

#3

السلام عليكم اخى هل البرنامج ماله حل إلا................. -waf

غدا إن شاء الله

وهذه فاتحة خير لى

تعلم فإن الانسان لايولد عالماً

#4

بسم الله الكريم وبه نستعين وعلى البرمجة دوما سائرين

هذا الجواب الذى طال انتظاره اخى خالد وباقى الاخوة الاعضاء فى السى++

الجواب سهل جدا بده شوية تركيز

وهذا الحل#include <iostream>

using namespace std;

int main () {

double i = 4.0;

while ( i != 0 ){

cout << i << "\n";

i -= 1.0;

}

cout<<"Hello My Friend GOOOOOOOOOOOOD Luck"<<"\n";

return 0;

}

:o تعلم فإن المرء لايولد مبرمج

#5

من النظر ,اعتقد ان المشكلة هي في عمليه المقارنه الخاصه بالحلقه , حيث يجب ان يتم كتابتها بالطريقه التاليه :

while ( i != 0.0 )

او نقوم بعمليه casting كالتالي :

while ( i != (double) 0 )

تم تعديل هذه المشاركة بواسطة محمد معاشر في 5 ديسمبر 2006 في 18:24

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#6

السلام عليكم

اظن هذا خطأ التقريب فى العدد الاخير اسمه truncation error

يعنى اخر رقم فى التمثيل الثنائى قد يكون واحد او صفر على خلاف الاصل و بالتالى اخر رقم بعد العلامة العشرية يكون زائد او ناقص واحد. و مع التكرار قد تنتج اخطاء و تتراكم مثل هذه الحالة. لاحظ ان بعد 39 تكرار المفروض الناتج هو 0.1 و لكن عملياً هو 0.09999999999

اما لماذا 40 تكرار فهذه تحتاج شوية نظر فى عدد البايت و العملية. إذا كان هذا هو الحل نثبتها بالتفصيل إن شاء الله.

و السؤال جميل جداً. شكراً لك

#7

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

اخي Khaled.Alshaya احس انه اسلوبك يشابه اسلوبي, فقد قمت اول مرة عندما وضعت السؤال بالقول انك ستضع الحل بعد فترة, و لكنك لنا اسبوعين من موضوعك ولم تضع الحل. اخي يجيب ان تكون صادق فيما تقول ;) .

ما علينا,

المشكله ببساطه انه عندما تطرح

4.0 - 0.1

لا يعطيك 3.9 شكلك مش مصدقني, طيب جرب هذا البرنامج و عطيني رأيك

#include <iostream>
#include <iomanip>
using namespace std;


int main () {

	cout<<setprecision(20)<<fixed;
	 double i = 4.0;

	 while (i > 0.01){

		  cout << i << "\n";
		  i -= 0.1;
	 }

	 return 0;
}

طيـــــــــــــــــــــــــب ماهو الحل !!!!!!!!!!!!!!!!!!

هو كل تالي

#include <iostream>
#include <iomanip>
using namespace std;
int main () {
	//cout<<setprecision(20)<<fixed;
	 double i = 4.0;

	 while (i > 0.01){

		  cout << i << "\n";
		  i -= 0.1;
	 }

	 return 0;
}

و يمكنك زيادة الاصفار على يسار الواحد لزيادة الدقه

ارجو ان تكون الفكرة وصلت ...

سلامــــــــــــــــــــــ

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

#8

عفواً يا شباب على التأخير بس وضعت الموضوع البارحة..

ثانياً أنا أعرف أنه لو استبدلنا

while ( i != 0 )

"with"

while ( i >= 0 )

لعمل البرنامج .

و لكن كنت أقصد لماذا لا يعمل على الرغم من صحة الـCode

على العموم جابها الأخ PointerVC .. B)

لمزيد من التفصيل العدد 0.1 في نظام الأعداد الثنائي عدد غير منتهي لذلك عند تقريبه كل مرة و الطرح من i فإنه لا نحصل على الصفر في النهاية ..

مثلاً دعونا نتخيلها بالنظام العشري :

لدينا i = 0.9 و العداد ينقص بمقدار 3/1 كل مرة و لكن 3/1 في الحقيقة هي ... 0.3333333333333

و الله التجاوب كان أكثر من رائع حبيت بس أحرك الجو في المنتدى

أخوكم خالد

#9

اعترف , انت حرقتني :D

لكن شرحي صحيح :D , اعتذر للاخ Pointer لم اقرأ جوابك

تم تعديل هذه المشاركة بواسطة Super_emad55 في 5 ديسمبر 2006 في 23:56

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

#10

Your answer is correct Emad

:lol:

I saw your replay but PointerVC got the answer first

Good Luck :)

#11

إشي ولا أروع...

أحييك أخي Khaled.Alshaya وأشد على يدك.....

#12

السلام عليكم

الكود الذى وضعته بأذن الله يأتى بالحل وان جربته ;)

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

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