126 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Input and Output | |||
|  | localeTitle: المدخلات والمخرجات | |||
|  | --- | |||
|  | ## المدخلات والمخرجات مع تيارات
 | |||
|  | 
 | |||
|  | لطباعة الأشياء إلى وحدة التحكم ، أو القراءة منها ، يمكنك استخدام `cout` و `cin` ، اللذان يطلق عليهما `streams` . يتم استخدام هذه الاستعارة نظرًا لأنك تستخدم تدفقات مثل استخدامك لحوض أو نقرة: إما أن تقوم بإسقاط البيانات إلى حوض ( `cout` ) أو الحصول على بيانات من صنبور ( `cin` ). | |||
|  | 
 | |||
|  | ### الإخراج مع cout
 | |||
|  | 
 | |||
|  | يستخدم برنامج "Hello World" `cout` لطباعة "Hello World!" إلى وحدة التحكم: | |||
|  | 
 | |||
|  |  `#include<iostream>  | |||
|  |  using namespace std;  | |||
|  |   | |||
|  |  int main()  | |||
|  |  {  | |||
|  |   cout << "Hello world!" << endl;  | |||
|  |  }  | |||
|  | `  | |||
|  | 
 | |||
|  | أول سطرين في الأعلى ضروريان لاستخدام `cout` ومجموعات التدفقات الأخرى. `#include<iostream>` يجعل كائنات الدفق متاحة ، `using namespace std;` يتيح لك كتابة `cout` مباشرة بدلاً من الاضطرار إلى كتابة `std::cout` ، وهذا يعني أن نحتاج إلى استخدام `cout` من مساحة الاسم `std` . | |||
|  | 
 | |||
|  | `cout` لتقف على "وحدة التحكم الإخراج" ، وهو ما يسمى _تيار الإخراج_ الذي يمثل وحدة التحكم. عندما تريد طباعة شيء إلى وحدة التحكم ، يمكنك وضعه في `cout` ؛ تخيل أنها حفرة تؤدي إلى المحطة. لوضع الأشياء في هذه الحفرة ، في وقت واحد ، يمكنك استخدام `<<` المشغل ، ويعرف أيضا باسم _مشغل الإدراج_ 1 . يمكن تقييد المشغل ، أي يمكنك وضع عدة أشياء في واحد تلو الآخر. سوف يطبع التالي "الكعكة هي كذبة.": | |||
|  | 
 | |||
|  | `cout << "The cake " << "is " << "a " << "lie." << endl;` | |||
|  | 
 | |||
|  | `endl` لتقف على "End Line" وهو عنصر آخر يأتي من `<iostream>` . عند وضع `endl` في `cout` ، ستقوم بطباعة حرف السطر الجديد ("\\ n") إلى وحدة التحكم ، وكذلك _مسح_ `cout` ، مما يعني أنه سيجبر `cout` على طباعة كل شيء قمت بوضعه فيه _الآن_ . إذا كنت لا تضع `endl` إلى `cout` ، `cout` قد حفاظ على البيانات التي قد وضعت في ذلك، ولكن تنتظر المزيد من البيانات قبل طباعة كل ذلك في الواقع. هذا يسمى _التخزين المؤقت_ وهو جيد جدًا للأداء ، ولكن إذا كنت قد قدمت بالفعل كل شيء من المفترض طباعته ، فأنت تريد أن `cout` على الفور. لذلك من الممارسات الجيدة أن تنتهي مع `endl` في الأماكن التي يكون لها معنى. | |||
|  | 
 | |||
|  | يمكن وضع كل شيء تقريبًا في جدول: السلاسل ، والأرقام ، والمتغيرات ، والتعبيرات ، وما إلى ذلك. في ما يلي بعض الأمثلة على عمليات إدراج البث الصحيحة: | |||
|  | 
 | |||
|  |  ``// Notice we can use the number 42 and not the string "42".  | |||
|  |  cout << "The meaning of life is " << 42 << endl;` // Output: The meaning of life is 42  | |||
|  | ``  | |||
|  | 
 | |||
|  |  ``string name = "Tim";  | |||
|  |  cout << "Except for you, " << name << endl;`// Output: Except for you, Tim  | |||
|  | ``  | |||
|  | 
 | |||
|  |  ``string name = "Tim";  | |||
|  |  cout << name;  | |||
|  |  cout << " is a great guy!" << endl;`  | |||
|  |  // Output: Tim is a great guy!  | |||
|  | ``  | |||
|  | 
 | |||
|  |  ``int a = 3;  | |||
|  |  cout << a*2 + 18/a << endl;`// Output: 12  | |||
|  | ``  | |||
|  | 
 | |||
|  | ### ملاحظة حول المسافة البيضاء
 | |||
|  | 
 | |||
|  | C ++ دائما يضع _لكم_ في السيطرة، ويفعل بالضبط فقط الأشياء التي تقول أن تفعله. قد يكون هذا مفاجئًا في بعض الأحيان ، كما في المثال التالي: | |||
|  | 
 | |||
|  |  `string name = "Sarah";  | |||
|  |  cout << "Good morning" << name << "how are you today? << endl;  | |||
|  | `  | |||
|  | 
 | |||
|  | قد تتوقع أن تطبع "صباح الخير يا سارة كيف حالك اليوم؟" ، ولكن في الواقع ، سيكون الناتج "Good morningSarahhow هل أنت اليوم؟". سبب هذا الخطأ هو أنك لم تكتب مسافات في السلاسل المحيطة `name` ، وحيث أنك لم تحدد أي مسافات ، فإن `cout` لم يقم بطباعة أي منها. النسخة الصحيحة ستكون: `cout << "Good morning " << name << " how are you today? << endl;` | |||
|  | 
 | |||
|  | لا تحدث فواصل الأسطر من تلقاء نفسها. قد تعتقد أن هذا من شأنه أن يطبع وصفة على أربعة أسطر: | |||
|  | 
 | |||
|  |  `cout << "To make bread, you need:";  | |||
|  |  cout << "* One egg";  | |||
|  |  cout << "* One water";  | |||
|  |  cout << "* Two wheat";  | |||
|  | `  | |||
|  | 
 | |||
|  | لكن المخرج هو في الواقع على سطر واحد: "لصنع الخبز ، تحتاج: \* بيضة واحدة \* ماء واحد \* اثنين من القمح". هذا لأنه لا توجد أحرف سطر جديد في نهاية الأسطر ، لذا بشكل طبيعي ، تفترض C ++ أننا لا نريدها أن تطبع أحرف السطر الجديد. | |||
|  | 
 | |||
|  | يمكنك إصلاح هذا عن طريق إضافة `endl` s بعد كل سطر ، لأنه كما تمت مناقشته سابقًا ، يدرج `endl` حرفًا في السطر الجديد في دفق الإخراج. ومع ذلك ، فإنه يفرض أيضًا أن يتم مسح المخزن المؤقت ، الأمر الذي يفقدنا بعض الأداء لأننا قد قمنا بطباعة جميع الخطوط دفعة واحدة. لذلك سيكون الأفضل إضافة أحرف سطر جديد فعليًا في نهاية الأسطر ، واستخدام `endl` فقط في النهاية: | |||
|  | 
 | |||
|  |  `cout << "To make bread, you need:\n";  | |||
|  |  cout << "* One egg\n";  | |||
|  |  cout << "* One water\n";  | |||
|  |  cout << "* Two wheat" << endl;  | |||
|  | `  | |||
|  | 
 | |||
|  | إذا كنت تقوم فقط بطباعة وصفة صغيرة ، فإن الوقت الذي تقوم فيه بالحفظ يكون ضئيلًا ولا يستحق العناء ، ولكن إذا كنت تطبع ملايين العناصر ، فقد يكون الفرق ملحوظًا جدًا. | |||
|  | 
 | |||
|  | ### المدخلات مع السينما
 | |||
|  | 
 | |||
|  | لقراءة من وحدة التحكم، يمكنك استخدام _دفق الإدخال_ `cin` بالطريقة نفسها كما تفعل `cout` ، ولكن بدلا من وضع الأمور في `cin` ، وانت "إخراجهم". يقرأ البرنامج التالي رقمين من المستخدم ويضيفهما معًا: | |||
|  | 
 | |||
|  |  `#include<iostream>  | |||
|  |  using namespace std;  | |||
|  |   | |||
|  |  int main()  | |||
|  |  {  | |||
|  |   int a, b; // Variables to hold the two numbers.  | |||
|  |   | |||
|  |   cout << "Please enter the first number:" << endl;  | |||
|  |   cin >> a;  | |||
|  |   cout << "Please enter the second number:" << endl;  | |||
|  |   cin >> b;  | |||
|  |   | |||
|  |   cout << "The sum of your numbers is: " << a + b << endl;  | |||
|  |  }  | |||
|  | `  | |||
|  | 
 | |||
|  | يقف `cin` لـ "Console Input" وهو _دفق_ إدخال يمثل الإدخال من وحدة التحكم. في التعبير `cin >> a;` يتم قراءة البيانات من `cin` وحفظها في المتغير `a` ، باستخدام المشغل `>>` ، _عامل الاستخراج_ 2 . يقرأ عامل الاستخراج بالضبط نفس القدر المطلوب من البيانات للكتابة في المتغير الذي نحدده ، ويتخطى أي مسافة بيضاء ، لذلك إذا كان المستخدم يكتب "6" التي ستقرأ فقط كقيمة `6` . | |||
|  | 
 | |||
|  | تجدر الإشارة إلى أن `cin` ستوقف البرنامج بأكمله لانتظار أن يكتب المستخدم قيمه. لن يستمر البرنامج حتى يقوم المستخدم بالضغط على enter ، وهناك بعض البيانات المراد كتابتها في المتغير. إذا قام المستخدم فقط بالضغط على الزر enter دون كتابة أي شيء ، فإن `cin` سيستمر في انتظار القيمة. | |||
|  | 
 | |||
|  | يمكن ربط عامل الاستخراج `<<` . هنا هو نفس البرنامج كما في المرة السابقة ، ولكن مكتوبة بطريقة أكثر إيجازا: | |||
|  | 
 | |||
|  |  `#include<iostream>  | |||
|  |  using namespace std;  | |||
|  |   | |||
|  |  int main()  | |||
|  |  {  | |||
|  |   int a, b; // Variables to hold the two numbers.  | |||
|  |   | |||
|  |   cout << "Please enter two numbers:" << endl;  | |||
|  |   cin >> a >> b;  | |||
|  |   cout << "The sum of your numbers is: " << a + b << endl;  | |||
|  |  }  | |||
|  | `  | |||
|  | 
 | |||
|  | عند العمل بالسلاسل ، يقوم مشغل الاستخراج أولاً بقراءة البيانات من `cin` لملء `a` ، ثم قراءة البيانات لملء `b` . | |||
|  | 
 | |||
|  | يمكن أيضًا استخدام عبارات printf و scanf القياسية باستخدام c + عن طريق استيراد " ' الملف الاساسي. | |||
|  | 
 | |||
|  | ## مصادر
 | |||
|  | 
 | |||
|  | 1.  http://www.cplusplus.com/reference/ostream/ostream/operator٪3C٪3C/ | |||
|  | 2.  http://www.cplusplus.com/reference/istream/istream/operator٪3E٪3E/ |