Kodax

الإدخال والإخراج — أساسيات C++

الإدخال والإخراج: cin و cout

cout تكتب إلى الشاشة، و cin تقرأ من لوحة المفاتيح. كلاهما في <iostream>.

cin تقرأ حسب النوع

int age;
cin >> age;          // يقرأ رقماً صحيحاً
int x, y;
cin >> x >> y;       // قيمتان مفصولتان بمسافة أو سطر

على عكس input() في Python، cin تحوّل تلقائياً إلى نوع المتغير.

ماذا لو أدخل المستخدم نصاً بدل رقم؟

تفشل القراءة: يبقى المتغير بقيمة 0 (منذ C++11)، وتدخل cin حالة فشل تتجاهل كل قراءة لاحقة. افحص النجاح دائماً:

int age;
if (cin >> age) {
    cout << "عمرك " << age << endl;
} else {
    cout << "إدخال غير صالح" << endl;
}

cin >> age نفسها تُستخدم كشرط: صحيحة إذا نجحت القراءة.

النصوص: cin مقابل getline

string word;
cin >> word;              // يقرأ كلمة واحدة فقط (يتوقف عند المسافة)
string line;
getline(cin, line);       // يقرأ السطر كاملاً بالمسافات

فخ cin ثم getline

بعد cin >> age يبقى رمز السطر الجديد (Enter) في المخزن، فتقرأه getline فوراً وترجع نصاً فارغاً. الحل:

int age;
string fullName;
cin >> age;
cin.ignore(numeric_limits<streamsize>::max(), '\n');  // تجاهل بقية السطر (يحتاج <limits>)
getline(cin, fullName);

تنسيق الإخراج (<iomanip>)

cout << fixed << setprecision(2) << 3.14159;   // 3.14
cout << setw(10) << "Name" << setw(5) << 25;   // عرض ثابت للأعمدة

fixed و setprecision تبقيان مفعّلتين لكل ما يُطبع بعدها.

ملاحظة عن المحرر في Kodax

إذا شغّلت برنامجاً يقرأ بـ cin بدون إدخال، تفشل القراءة فوراً. لذلك تفحص الأمثلة نجاح القراءة وتستخدم قيمة افتراضية.

تمرين

اكتب برنامجاً يقرأ عدد الطلاب ثم درجاتهم واحدة واحدة، ويطبع المتوسط بمنزلتين عشريتين، ويتعامل مع الإدخال غير الرقمي.

#include <iostream>
#include <string>
#include <iomanip>  // للتنسيق
using namespace std;

int main() {
    // إدخال رقم
    int age;
    cout << "أدخل عمرك: ";
    cin >> age;
    cout << "عمرك: " << age << endl;
    
    // إدخال عدة قيم
    int x, y;
    cout << "أدخل رقمين: ";
    cin >> x >> y;
    cout << "المجموع: " << x + y << endl;
    
    // إدخال نص (كلمة واحدة)
    string firstName;
    cout << "أدخل اسمك الأول: ";
    cin >> firstName;
    
    // تنظيف buffer قبل getline
    cin.ignore();
    
    // إدخال نص كامل (مع مسافات)
    string fullName;
    cout << "أدخل اسمك الكامل: ";
    getline(cin, fullName);
    cout << "مرحباً " << fullName << endl;
    
    // تنسيق الأرقام
    double pi = 3.14159265359;
    cout << fixed << setprecision(2);
    cout << "Pi = " << pi << endl;  // 3.14
    
    // تنسيق العرض
    cout << setw(10) << "Name" << setw(5) << "Age" << endl;
    cout << setw(10) << "Ahmed" << setw(5) << 25 << endl;
    cout << setw(10) << "Mohammad" << setw(5) << 30 << endl;
    
    return 0;
}
اختبر فهمك