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

infinite loop from nowhere!

مغلق
بدأه M.A.K. في 12 فبراير 2007 · 7 رد · 630 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم،،

واجهتني مشكلة أظنها تافهة و لكن لم أجد حتى الآن من يشرحها :(

لماااااااااااااااااااااااذاااااااااااااااا حصلت و كيف أتغلب عليها ؟؟ :wacko:

هذا برنامج عبيط يحول من سلزيوس إلى فهرنهيت و العكس..

و إذا أجبت عن السؤال :

End? ( y for yes ) :::

بــــ mmmmmmm ( أو أي إجابة بالمثل )

البرنامج يدخل في infinite loop بدون أي سبب مقنع ( على الأقل بالنسبة لي! )

و هذا هو الكود!

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

int main()
{
	char ch,scale;
	float temp;

	do
	{
		  cout<<"\n_________________________________________________";
		  cout<<"\n e.g.: 56c->56 celsius\n e.g.: 99f->99 fahrenheit\n";
		  cout<<"\nEnter the temprature ::: ";
		  cin>>temp>>scale;

		  if(scale=='f')
			   cout<<"\n Equals ::: "<<((temp-32)*5/9)<<"c";
		  else if (scale=='c')
			   cout<<"\n Equals ::: "<<((temp*9/5)+32)<<"f"; 
		  else
			   cout<<"\nInput Error...";

		  cout<<"\n\nEnd? ( y for yes ) ::: ";
		  cin>>ch;
	}while(ch!='y');

	return (0);
}

و من يأسي في الحل! شككت في معلوماتي فكتبت هذا الكود

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
	char ch;

	do
	{
		 cout<<"\nHow are you?";
		 cout<<"\n End?(y for yes) ";
		 cin>>ch;
	}while(ch!='y');

	return(0);
}

و لكن البرنامج لم يدخل في infinite loop

إلحقووني قبل أن أنتحر برمجيًا!!!

==================================================

( اللهم إني أسألك علما نافعا ورزقا طيبا وعملا متقبلا )

I'm not an expert programmer but I will do my best to be

غدًا سنكون أفضل منهم .... إنها مسألة إرادة و وقت

#2

ياخي البرنامج شغال ميه ميه :D

وش المشكلة

دخلت التيمب والسكيل واعطاني الناتج

وقالي تبي تطلع

حطيت y (لا تنسى انها small) وطلع

ما فيش مشاكل

فعلا ؟!

دخل في لوب لا نهائي

#3

مشكور أخي على تعبك و اهتمامك! :)

لكن قصدي أن بدل أن تضع y

تضع mmmmm أو ooooo (مثلا) يعني أن المستخدم يريد أن يقوم بالعملية مرة أخرى

ها......

ما رأيك ؟

تم تعديل هذه المشاركة بواسطة M.A.K. في 12 فبراير 2007 في 18:54

==================================================

( اللهم إني أسألك علما نافعا ورزقا طيبا وعملا متقبلا )

I'm not an expert programmer but I will do my best to be

غدًا سنكون أفضل منهم .... إنها مسألة إرادة و وقت

#4

مو بس كذا :s

حط بدال الـ temp حرف مثلا i

راح تحصل لوب لا نهائي مع انه المفروض يصير فيه كاست ويخليه رقم عادي يعني المفروض ما يفرق ؟!

بجرب على اللينكس

#5

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

المشكلة كالآتي: فلنفترض أنك أدخلت سلسلة من حروف الـm مثلا ، يعني "mmmm"..أربعة حروف.

سيقوم السطر:

cin >> ch;

بقراءة أول حرف m ، و يضعه في المتغير ch..بما أن القيمة لا تساوي قيمة ‘y’ ، فإن الـwhile loop ستدخل في iteration أخرى..

هذه المرة ، سيتم تنفيذ السطر:

cin >> temp >> scale

هذا السطر يحاول قراءة مدخل على أنه رقم حقيقي floating point number ليضعه في temp..المشكلة أن المدخل هو "mmm" ، أي سلسة حروف ، و ليس رقم..و بالتالي يسجل هذا الخطأ ، و تقوم cin بتسجيل هذا داخليا (أن خطأ قد حدث) ، و بالتالي تفشل كل عمليات الإدخال التالية (بما فيها إدخال ch) ، و يظل ch لا يساوي ‘y’ ، و بالتالي لا تتوقف الـwhile loop أبدا.

حل هذه المشكلة عامة هو أن تتأكد من أن المستخدم أدخل المدخلات بصورة صحيحة كالآتي:

if(cin.fail())
{
	// input failed…notify the user, then call cin.clear to clear the error bits
   cin.clear();
}

في برنامجك أنت ، يمكن أيضا استخدام حل آخر عن طريق إضافة الآتي للـcondition الخاص بالWhile loop:

do
{
   // …
} while(ch != ‘y’ && cin.good());

هكذا ستنتهي الـloop إذا حدث خطأ في المدخلات في داخلها.

#6

يعطيك العافية مهندس حجاج وضح فعلا :)

#7

جزاك الله كل خير و أزادك من علمه لتنفع به الناس...

:) :) :)

و عندي سؤال إضافي :

- هل يمكن معرفة نوع الخطأ الذي ظهر في cin باستدعاء دالة ما مثل الأمثلة التي تفضلت بشرحها ؟

- هل يوجد ملاحظات أخرى ل cout أو cin ؟ فأنا خائف من أن أصطدم بشيء عجيب مثل الذي اصطدمت به في البرنامج السابق!! :P

و فقك الله لخير الناس

==================================================

( اللهم إني أسألك علما نافعا ورزقا طيبا وعملا متقبلا )

I'm not an expert programmer but I will do my best to be

غدًا سنكون أفضل منهم .... إنها مسألة إرادة و وقت

#8
M.A.K. كتب:
و عندي سؤال إضافي :

- هل يمكن معرفة نوع الخطأ الذي ظهر في cin باستدعاء دالة ما مثل الأمثلة التي تفضلت بشرحها ؟

ليس على حد علمي..عامة الخطأ يكون أنك حاولت قراءة نوع ما من سلسة حروف لا يمكن تحويلها لهذا النوع (مثلا: رقم من abc)

اقتباس
- هل يوجد ملاحظات أخرى ل cout أو cin ؟ فأنا خائف من أن أصطدم بشيء عجيب مثل الذي اصطدمت به في البرنامج السابق!! :P

كلا ، لا يحضرني شيء آخر الآن.

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

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