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

استفسار حول توابع الكائنين cout و cin

بدأه khaled_prg في 17 يوليو 2010 · 8 رد · 5,624 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

بينما كنت أصول و أجول في بعض المواقع البرمجية إذْ رأيت بعض توابع الكائنين cin و cout و أردت أن أعرف فائدة كل واحد منهم ومتى يُستخدم.

و التوابع هي:

cout.setf
cout.precision
cout.width
cout.fill
cin.peek
cin.putback
cin.get
cin.getline
cin.ignore
cin.fail
cin.bad
cin.clear
cin.sync

يا ريت لو يكون الشرح بالعربية و بدون روابط انجليزية :blush:

بانتظار الرد.

#2

cout.precision

لآخراج الفواصل العشرية بشكل مرتب

cin.get

أخذ محرف واحد

cin.getline

أخذ سلسلة محارف

cin.ignore

أخذ محرف واحد ثم تجاهل الادخال

cin.fail

ارجاع قيمة 0 في حال فشل الادخال و 1 في الحالة المعاكسة

cin.bad

ارجاع قيمة 0 في حال فشل الادخال و 1 في الحالة المعاكسة

#3

السلام عليكم

اقتباس
cout.precision

لآخراج الفواصل العشرية بشكل مرتب

cin.get

أخذ محرف واحد

cin.getline

أخذ سلسلة محارف

cin.ignore

أخذ محرف واحد ثم تجاهل الادخال

يا ريت لو توضح بمثال.

اقتباس

cin.fail

ارجاع قيمة 0 في حال فشل الادخال و 1 في الحالة المعاكسة

cin.bad

ارجاع قيمة 0 في حال فشل الادخال و 1 في الحالة المعاكسة

هل تعني أن cin.bad و cin.fail متساويتان !؟

بقي بعض التوابع لم تجب عنه .. أرجو التوضيح.

دمت سالما.

#4

السلام عليكم:

cin.getline

يأخذ هذا التابع ثلاث وسطاء الوسيط الأول هو اسم السلسلة المحرفية المعرفة و الوسيط الثاني عدد المحارف المراد أخذها و الوسيط الثالث المراد التوقف عنده في الإدخال في حالد تم إدخاله و نأخذ هذا البرنامج كمثال و الذي يعرف سلسلة و يأخذ مئة محرف و يتوقف في حال تم إدخال نقطة :

#include<iostream.h>
void main()
{
	char name[256];
	cout<<"enter your name\n";
	cin.getline(name,100,'.');
	cout<<"you entered  "<<name<<endl;
}

و الخرج يكون :

enter your name

yahya91.

you entered yahya91

Press any key to continue

و طبعاً هذا وجه من أوجه استخدام هذا التابع فهناك أكثر من وجه.

cin.get

تأخذ محرف من الدخل أي محرف (فراغ ،سطر جديد ...)

و هذا مثال على ذلك فهذا البرنامج تستطيع باستخدام الcin.get أن تدخل الفراغ أو سطر جديد أما باستخدام الـcin العادية في الإدخال الثاني لن تستطيع .

#include<iostream.h>
void main()
{
	char ch1,ch2;
	cout<<"enter a char\n";
	cin.get(ch2);
	cout<<"enter a char"<<endl;
	cin>>ch1;

	cout<<"ch1 "<<ch1<<"ch2  "<<ch2<<endl;
}

الخرج

حيث أننا أدخالنا قيمة سطر جديد عبر الـcin.get

enter a char

enter a char

*

ch1 * ch2

لاحظ السطر الفارغ هنا وهي قيمة الـch2

Press any key to continue

بالنسبة للـcin.ignore

فسوف أقول لك استخدام واحد لأن فهم مبدأ عمله يعتمد على المكدسات buffer و الذي صراحة لا أعلمه و لكن سأذكر لك استخدام واحد :

جرّب هذا الكود في المترجم :

// Listing 16.8 - Using ignore()
#include <iostream.h>
int main()
{
char stringOne[255];
 char stringTwo[255];

 cout << "Enter string one:";
cin.get(stringOne,255);
cout << "String one" << stringOne << endl;

cout << "Enter string two: ";
cin.getline(stringTwo,255);
cout << "String two: " << stringTwo << endl;

cout << "\n\nNow try again...\n";

cout << "Enter string one: ";
 cin.get(stringOne,255);
cout << "String one: " << stringOne<< endl;

cin.ignore(255,'\n');

cout << "Enter string two: ";
 cin.getline(stringTwo,255);
cout << "String Two: " << stringTwo<< endl;
 return 0;
}

لابد أنك لا حظت أنك لم تستطع أن تدخل السلسلة الثانية في أول مرة و لكن في المرة الثانية استطعت التفسير:

عندما استخدمنا الـgetline بعد الإدخال الأول للسلسلة الأولى فإن الgetline تأخذ تلقائياً n\ الموجود في المكدس قبل أن يدخل المسخدم قيمة و أما بعد استخدام الـignore فإن أكل نهاية السطر الموجود في المكدس و سمح بالإدخال .

تم تعديل هذه المشاركة بواسطة yahya91 في 17 يوليو 2010 في 12:19

#5

السلام عليكم

وجدتُ في كتاب الإكسير مايلي (بتصرف):

اقتباس

char name[100];
cin.get(name,99,'.');

يستقبل التابع cin.get ثلاثة وسائط ,الأول هو اسم المصفوفة و الثاني هو القيمة القصوى لعدد الأحرف (و السبب في أننا وضعنا الرقم 99 هو للسماح بوجود الحرف الخالي) أما الوسيط الثالث فهو حرف الإنهاء, و في مثالنا هذا فإن حرف الإنهاء هو '.' فإذا تم إيجاد النقطة في الجملة المُدخلة فسيتم تجاهل بقية الجملة.

إذا كان الحال هكذا فمالفرق بين cin.get و بين cin.getline !؟

اقتباس
بالنسبة لـ cin.ignore فسوف أقول لك استخدام واحد لأن فهم مبدأ عمله يعتمد على المكدسات buffer و الذي صراحة لا أعلمه

قام أخي الغالي namespace بشرحها لي و إليك ما قال (بتصرف):

بداية .. الدالة cin.ignore تتعامل مع الـ buffer ..! فما هو الـbuffer !؟و ما هي فائدته !؟

الـ buffer هو جزء من الذاكرة يتم تخزين المعلومات فيه مؤقتاً قبل أن تكمل طريقها للمعالجة , عادة ما يكون مصدر المعلومات هو أحد وحدات الإدخال مثل الكيبورد أو الإخراج مثل الطابعة.

الفائدة منه: كما تعلم فإن الفرق هائل بين الزمن اللازم لإدخال المعلومات والزمن اللازم لمعالجتها , فالأخير أقل بكثير .. ولا يمكن للمعلومات أن تنتقل مباشرة من الكيبورد إلى المعالج لذلك يتم تخزينها في الـ buffer (عند وقت الإدخال) بعدها تنتقل إلى المعالج , نفس الشيء إذا قمنا باستعمال الطابعة .. حينها سيتم استخدام الـ Buffer (لتخزين البيانات) حيث تتم معالجتها بعد اكتمال وصولها.

كخلاصة:يمكننا أن القول بأن الـ Buffer ما هو إلا حلقة وصل بين وحدات (الإدخال/الإخراج) و المعالج و يتم استخدامه عندما تنتقل البيانات بين طرفين يختلفان في السرعة .. عندها يتم استخدام الـ buffer (كمرحلة مؤقتة) لتخزين البيانات لحين اكتمال وصولها ثم تنتقل بعد ذلك للمعالج لتتم معالجتها.

نأتي الآن لشرح كيفية عمل الدالة cin.ignore:

يمكننا استدعاء الدالة بثلاث طرق :

1-كما هي دون أن تأخذ معاملات (و هي الحالة الإفتراضية) :

cin.ignore();

بهذا سيتم حذف حرف واحد من الـ buffer

2-أن تأخذ معاملاً واحداً (عدداً صحيحاً) وهو عدد الحروف التي سيتم حذفها من الـbuffer

cin.ignore(30);

و في هذه الحال سيتم حذف 30 حرف من الـ buffer

3-أن تأخذ معاملين هكذا:

cin.ignore(53,'Q');

الوسيط الأول هو عدد الأحرف التي سيتم حذفها من الـ buffer ,و إذا تم العثور على حرف (مثل الوسيط الثاني) فسيتم التوقف عن الحذف .. أي أن عملية حذف الأحرف من الـ buffer تتوقف عند العثور على أول حرف مشابه للوسيط الثاني.

و في هذا المثال فإنه قبل نهاية الـ 53 حرف سيتم حذف الأحرف حتى أول ظهور لـ 'Q' (و لن يتم انتزاع 53 حرف).

أما إذا لم يظهر الوسيط الثاني في أول 53 حرف فسيتم حذف الـ 53 حرف جميعها من ال buffer

لاحظ أن شرح الأخ namespace مفصل و جميل جدا و هو ما أريد أن يفعله الإخوة لباقي الأسئلة.

مازلت أنتظركم.

تم تعديل هذه المشاركة بواسطة khaled_prg في 17 يوليو 2010 في 16:45

#6
اقتباس
بالنسبة لـ cin.ignore فسوف أقول لك استخدام واحد لأن فهم مبدأ عمله يعتمد على المكدسات buffer و الذي صراحة لا أعلمه

شكراً لأنك شرحت لي أخي خالد .

#7

السلام عليكم

اقتباس
شكراً لأنك شرحت لي أخي خالد .

لا شكر على واجب و هذا من واجبي :)

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

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

#9

السلام عليكم

اقتباس
راجع الdocumentation الخاصة ب iostream وستجد كل الاجوبة عن تساؤلاتك مع الامثلة.

http://www.cplusplus...e/iostream/ios/

قلتُ سابقا:

يا ريت لو يكون الشرح بالعربية و بدون روابط انجليزية :blush:

سلامي.

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