المتغيرات والأنواع

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

مثال

#include <iostream>
using namespace std;

int main() {
    int age = 15;
    double height = 1.70;
    char grade = 'A';
    string name = "Ali";

    cout << name << " is " << age << " years old.";
    return 0;
}

الناتج:

Ali is 15 years old.

الشرح

النوع الوصف أمثلة
int للأعداد الصحيحة 3, -7, 2025
double للأعداد التي تحتوي على كسور عشرية 3.14, -0.5
char لحرف أو رمز واحد 'A', 'z', '?'
string للنصوص أو تسلسلات الحروف "Hello"

أنواع أعداد إضافية

long long

عندما تصبح الأعداد كبيرة جدًا بحيث لا يمكن تخزينها في متغير من نوع int (على سبيل المثال عند التعامل مع المليارات أو التريليونات)، نستخدم النوع long long.

long long population = 8000000000; // 8 billion

السبب هو أن النوع int يمكنه عادة تخزين قيم تصل حتى حوالي 2 مليار (2,147,483,647). أما إذا احتجنا إلى أعداد أكبر، فنستخدم long long.

float و double

كلا النوعين يخزنان الأعداد العشرية، ولكن يختلفان في الدقة (عدد الخانات العشرية التي يمكن تمثيلها بدقة).

النوع الدقة التقريبية المثال
float حوالي 6–7 خانات عشرية 3.141593
double حوالي 15–16 خانة عشرية 3.141592653589793
    float f = 1.61;
    double d = 1.61;

    cout << setprecision(20); // عرض 20 خانة عشرية

    cout << f << endl; // يطبع 1.6100000143051147461
    cout << d << endl; // يطبع 1.6100000000000000977
Caution

كما تلاحظ في المثال، أغلب الأعداد الحقيقية لا يمكن تمثيلها بدقة تامة باستخدام float أو double. يجب أن تضع ذلك في اعتبارك دائمًا عند التعامل مع هذه الأنواع.

في الغالب، يستخدم المبرمجون النوع double لأنه أكثر دقة. ومع ذلك، فإن double يستهلك 8 بايت من الذاكرة، بينما float يستهلك 4 فقط. لذا استخدم float فقط إذا كنت بحاجة إلى تقليل استهلاك الذاكرة.

bool

المتغير من نوع bool يمكن أن يأخذ قيمتين فقط: true أو false.

bool isEven = true;
bool isPrime = false;

غالبًا ما نستخدمه في الشروط والمنطق داخل تعبيرات if:

int x = 7;
bool big = x > 10;
cout << big; // يطبع 0 (false)

القيمة true تمثل داخليًا بالرقم 1، وfalse تمثل بالرقم 0.

مثال: الإدخال والإخراج مع المتغيرات

int x, y;
cin >> x >> y;
cout << x + y;

الإدخال:

4 9

الناتج:

13

هكذا تبدو معظم المسائل البسيطة في منصات مثل Codeforces أو AtCoder!

جدول ملخص لأنواع البيانات

النوع المعنى المثال الذاكرة التقريبية
int عدد صحيح 5, -10 4 بايت
long long عدد صحيح كبير 1000000000000 8 بايت
float عدد عشري (دقة منخفضة) 3.14 4 بايت
double عدد عشري (دقة عالية) 3.1415926535 8 بايت
bool صحيح / خطأ true 1 بايت
char حرف واحد 'A' 1 بايت
string نص "Hello" حسب الطول

تحويل الأنواع

أحيانًا نستخدم أنواعًا مختلفة في العملية نفسها:

int a = 3;
double b = 2.5;
cout << a + b; // 5.5

يقوم C++ بتحويل المتغير a مؤقتًا إلى double، لذلك يكون الناتج من نفس النوع.

اختياري: auto

الكلمة المفتاحية auto تسمح للمترجم بتحديد نوع المتغير تلقائيًا:

auto x = 5;        // int
auto y = 3.14;     // double
auto word = "Hi";  // const char*

ستستخدمها غالبًا في مسائل متقدمة لاحقًا.

تسمية المتغيرات

عند إنشاء متغيرات في C++، يجب اختيار اسم لكل متغير. هذا الاسم يوضح للبرنامج (وللقارئ البشري) وظيفة المتغير وما يمثله.

الأسماء الجيدة تجعل الكود أكثر وضوحًا وسهولة في الفهم.

القواعد الأساسية لتسمية المتغيرات

يمكنك:

  • استخدام الحروف، الأرقام، والشرطة السفلية (_)
  • البدء بحرف أو بشرطة سفلية
  • استخدام الحروف الكبيرة والصغيرة (C++ تفرّق بينهما)

لا يمكنك:

  • البدء برقم
  • استخدام المسافات
  • استخدام رموز خاصة مثل @, $, %, !, #, ?, إلخ
  • استخدام الكلمات المحجوزة في C++ (مثل int, for, return, while, …)

أمثلة

أسماء صحيحة:

int age;
double total_price;
bool isValid;
string firstName;

أسماء غير صحيحة:

int 2cats;       // يبدأ برقم
int my variable; // يحتوي على مسافة
int total$;      // يحتوي على رمز خاص
int int;         // كلمة محجوزة

حساسية حالة الأحرف (Case Sensitivity)

لغة C++ تفرّق بين الأحرف الكبيرة والصغيرة:

int score = 10;
int Score = 20;

cout << score; // يطبع 10

في هذا المثال، score و Score هما متغيران مختلفان.

أنماط التسمية

توجد عدة أنماط لتسمية المتغيرات، ومعظم مبرمجي C++ يستخدمون أحد الأنماط التالية:

النمط المثال الاستخدام الشائع
snake_case player_health للمتغيرات والدوال في البرامج البسيطة
camelCase playerHealth يُستخدم عادة في المشاريع الكبيرة أو المكتبات
PascalCase PlayerHealth يُستخدم عادة في تعريف الـ classes أو الـ structs

اختر نمطًا واحدًا والتزم به في جميع أجزاء الكود.

مثال

#include <iostream>
using namespace std;

int main() {
    int playerHealth = 100;
    int playerScore = 2500;
    bool isAlive = true;

    cout << "Health: " << playerHealth << endl;
    cout << "Score: " << playerScore << endl;
    cout << "Alive: " << isAlive << endl;

    return 0;
}

الناتج:

Health: 100
Score: 2500
Alive: 1

ملخص سريع

القاعدة مسموح؟ المثال
يبدأ بحرف أو شرطة سفلية نعم _count, sum
يبدأ برقم لا 9lives
يحتوي على مسافة لا total price
يحتوي على شرطة سفلية نعم total_price
يحتوي على رمز ($، #، @، إلخ) لا total$
كلمة محجوزة في C++ لا int, while
اختيار أسماء مناسبة للمتغيرات يجعل الكود أنظف وأسهل في القراءة والصيانة!