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

مشکلة غریبة مع دخول الحروف فی نوع int

بدأه C77431 في 6 نوفمبر 2010 · 11 رد · 607 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد کشفت خلال حل سوال موضوع غریب لا أعلم ما هو المشکل. فتابعونی لننظر ما هو الخطأ...

فی الکود التالی هناک مثال سهل لـ ما حدث:

#include <iostream>
using namespace std;

int main()
{
	int number;
	cout<<"\nPlease enter a number:"; // here if we put a number, there is no problem. but if we put a character such "a" ?!
	cin>>number;
	cout<<"\nNumber is:"
		<<number;
	system("pause");

	cout<<"\nLet's test again in another way ..."
		<<"\nEnter a number:";
	cin>>number;
	for (int i=0; i<10; i++)
	{
		cout<<endl<<number;
		cout<<"\nEnter a number:";
		cin>>number;
	}
	system("pause");
	return 0;
}

هناک یسئل عنا عدد. إن ندخل عدد لا بأس و لکن إن ندخل حرف کمثل "A" یأتنا عدد کمثل هذا:

-858993469

أنا أظن یجب علیه أن یأتنا ASCII Code. مثلا 65 و لکن لا أعلم! هذا مشکل واحد.

و موضوع غریب جدا هو الکود الثانی فی المثال یعنی:

	cout<<"\nLet's test again in another way ..."
		<<"\nEnter a number:";
	cin>>number;
	for (int i=0; i<10; i++)
	{
		cout<<endl<<number;
		cout<<"\nEnter a number:";
		cin>>number;
	}
	system("pause");

أدخلوا حرف کمثل A فی السوال الأول إذا یسئل عنا.

یجب علیه فی الکود الثانی أن أسئل عنا عشر مرات عدد و لکن لا یسئل؟!!

فی هذه الأیام یبحث عن هذا السوال و لکن لیس جواب لی.

ما المشکل؟

و شکرا

تم تعديل هذه المشاركة بواسطة u77431 في 7 نوفمبر 2010 في 00:02

#2

راجع الدورة ................ بالتحديد شابتر 2

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#3

شکرا

یا أخی XMasterrrr قرأتها.

ولکن لیس جوابی هناک.

الحلقة التکراریة For یدوم و لا یمکث عندما یصل إلی هذا:

                cout<<"\nEnter a number:"; 
                cin>>number;

یجب علیه یمکث هنا و یسئل عنا عن دخول عدد آخر. و لکن لا یمکث و لا یسئل...

تم تعديل هذه المشاركة بواسطة u77431 في 7 نوفمبر 2010 في 01:52

#4

أحد من الأصدقائی قال أنه جرب هذا المشکل مع Turbo C و أیضا مع Visual Studio 6. فالمشکل هناک أیضا.

المهم هو المشکل الثانی. لا الأول

#5

الآن وجدت الجواب.

لمن سوف یبحث عن سوال هکذا:

اقتباس
After reading in user input which cannot be converted, the input stream is in an invalid state. You need to empty the stream and call the clear method to reset the error bits on the stream in order to resume normal operation.

If you detect that input was not successful (using the input streams state bits, accessible via methods like good() or fail() etc.) you can reset the stream using code similar to this:

std::cin.clear();

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

منقول

#6

اخي العزيز

ادخل متغير من نوع char وعرف متغير من نوع int واسند له القيمه المدخله

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

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

#include <iostream.h>
int main()
{
		  int number;
		  char n;
        cout<<"\nPlease enter a number:"; // here if we put a number, there is no problem. but if we put a character such "a" ?!
		  cin>>number;
		  cout<<"\nNumber is:"<<number;

		  cout<<"\nLet's test again in another way ..." <<"\nEnter a number:";
		  cin>>n;
		  number=n;
		  for (int i=0; i<10; i++)
        {
					 cout<<endl<<number;
					 cout<<"\nEnter a number:";
					 cin>>n;
					 number=n;
		  }
		  return 0;
}

هذا على حسب فهمي للسوال

مع تحياتي

احفظ الله يحفظك ، احفظ الله تجده تجاهك ،

إذا سألت فاسأل الله ، وإذا استعنت فاستعن بالله ،

واعلم أن الأمة لو اجتمعت على أن ينفعوك بشيء ، لم ينفعوك إلا بشيء قد كتبه الله لك ،

وإن اجتمعوا على أن يضروك بشيء لم يضروك إلا بشيء قد كتبه الله عليك

#7

المشكل هو أن المعامل

 operator>>

لا يقوم بالتحويل التلقائي من char الى نوع اخر مما سيؤدي الى وضع ال input stream على الحالة failbit او badbit وعدم التمكن من استدعاءه , ال arithmetic extractors معرفة في الفئة istream على النحو التالي

:


istream& operator>> (short& val );
istream& operator>> (unsigned short& val );
istream& operator>> (int& val );
istream& operator>> (unsigned int& val );
istream& operator>> (long& val );
istream& operator>> (unsigned long& val );
istream& operator>> (float& val );
istream& operator>> (double& val );
istream& operator>> (long double& val );
istream& operator>> (void*& val );

istream& operator>> (streambuf* sb );

istream& operator>> (istream& ( *pf )(istream&));
istream& operator>> (ios& ( *pf )(ios&));
istream& operator>> (ios_base& ( *pf )(ios_base&));
  istream& operator>> (bool& val );

هذا مثال للتحقق من صحة الادخال :


using namespace std;

int main()
{
int number=0;
cout<<"\nPlease enter a number:";
cin>>number;
if(cin.fail())
cout<<"error : incorrect data was entered!"<<endl;
else
cout<<"\nNumber is:"<<number;
return 0;
}
#include <iostream>

تم تعديل هذه المشاركة بواسطة xpero في 7 نوفمبر 2010 في 03:15

#8
alshamery كتب:

اخي العزيز

ادخل متغير من نوع char وعرف متغير من نوع int واسند له القيمه المدخله

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

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

#include <iostream.h>
int main()
{
		  int number;
		  char n;
        cout<<"\nPlease enter a number:"; // here if we put a number, there is no problem. but if we put a character such "a" ?!
		  cin>>number;
		  cout<<"\nNumber is:"<<number;

		  cout<<"\nLet's test again in another way ..." <<"\nEnter a number:";
		  cin>>n;
		  number=n;
		  for (int i=0; i<10; i++)
        {
					 cout<<endl<<number;
					 cout<<"\nEnter a number:";
					 cin>>n;
					 number=n;
		  }
		  return 0;
}

هذا على حسب فهمي للسوال

مع تحياتي

شکرا أخی Alshamery لإجابة

هذا عمل ذکی الذی أنت صنعت.

هذا لا یحذف نفس المشکلة. فی المرة الاولی إن ندخل حرف یقع الخطأ کما قلتُ.

هذا کان کود مثالی لنرا لماذا یقع هذا المشکل و أظن أن هذا هو الدلیل :

اقتباس
After reading in user input which cannot be converted, the input stream is in an invalid state

و شکرا جزیلا لک

و شکرا جزیلا لک أخی xpero

صحیح

تم تعديل هذه المشاركة بواسطة u77431 في 7 نوفمبر 2010 في 12:08

#9

أخي

u77431

عذرا على المقاطعة، وددت سؤالك من أي أرض الله أنت

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

تعجبني طريقتك في كتابة حرف الكاف.happy.gif

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#10

السبب أنك عندما تضغط Enter يعتبرها محرف نهاية الإدخال

و الأفضل أنه بدل cin أن تستخدم cin.get(number)

أو ضع بعد كل cin>>number

ضع cin.ignore(); كي لا يأخذ الـEnter كمحرف لكل ما بعدها

#11

على اجابة الاخ aohammed فتابع الشابتر 3 اخير درس من الجزء الاول و اول 3 دروس من الجزء الثانى ستجد ما يسرك بأذن الله ...

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#12

شکرا جزیلا لکم الجمیع لمشارکة فی الموضوع...

وصلت إلی هذه المشکلة خلال حل أحد الأسئلة فی المنتدی

تم تعديل هذه المشاركة بواسطة u77431 في 7 نوفمبر 2010 في 12:10

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…