C++: المتغيرات وأنواع البيانات الأساسية

آخر تحديث: 2026-08-26

في الدرس 02 أعددنا بيئة التطوير وأصبحنا نستطيع ترجمة وتشغيل البرامج.

لكن البرامج لا يمكنها فقط إخراج نص ثابت — فهي تحتاج لأن تكون قادرة على تذكر الأشياء ومعالجة البيانات. هذا هو غرض المتغيرات.

تمامًا كما في الرياضيات، تحتاج لتعريف x، y، z أولًا؛ في البرمجة، يجب "تعريف" المتغيرات قبل أن تتمكن من تخزين البيانات.


1. ما هو المتغير؟

(1) 1.1 المتغيرات في الحياة اليومية

سيناريو من الحياة المقابل البرمجي
لديك اسم، لكن عمرك يتغير كل عام متغير: قيمته يمكن أن تتغير
لديك رقم هوية لا يتغير أبدًا ثابت: قيمته لا يمكن أن تتغير
لديك كوب يمكن أن يحتوي ماءً أو كولاً متغير: النوع ثابت (كوب)، القيمة يمكن أن تتغير (ما بداخله)

المتغير هو "صندوق" في الذاكرة — يمكنك وضع أشياء فيه (تعيين قيم) وأخذ أشياء منه (قراءة قيم).

(2) 1.2 لماذا نحتاج المتغيرات؟

بدون متغيرات، يمكن للبرامج فقط فعل أشياء "جامدة":

TEXT 📖 للعرض فقط
// Without variables, you can only output fixed text
std::cout << "Hello, World!" << std::endl;

بالمتغيرات، تصبح البرامج "حية":

CPP
// With variables, you can remember user input
std::string name;
std::cin >> name;
std::cout << "Hello, " << name << "!" << std::endl;


2. أنواع البيانات الأساسية

C++ هي لغة ذات كتابة ساكنة — كل متغير يجب تعريف نوعه أولًا، والنوع لا يمكن تغييره.

(1) 2.1 خمسة أنواع بيانات أساسية

النوع الكلمة المفتاحية الحجم المدى تشبيه من الحياة
عدد صحيح int 4 بايت -2,147,483,648 ~ 2,147,483,647 عدد الأشخاص، العمر، السنة
فاصلة عائمة double 8 بايت تقريبًا ±1.7 × 10³⁰⁸ الطول، الوزن، السعر
حرف char 1 بايت -128 ~ 127 (أو 0 ~ 255) حرف واحد، تقدير (A/B/C)
منطقي bool 1 بايت true أو false هل نجح، هل هو بالغ
سلسلة نصية string متغير أي طول الاسم، العنوان، جملة

💡 نصيحة: string ليس "نوعًا أساسيًا" في C++، بل نوع توفره المكتبة القياسية. تحتاج #include <string> قبل استخدامه.

(2) 2.2 تعريف المتغيرات

الصياغة:

TEXT 📖 للعرض فقط
Type variableName;

مثال:

TEXT 📖 للعرض فقط
int age; // Declare an integer variable named age
double price; // Declare a floating-point variable named price
char grade; // Declare a character variable named grade
bool isPassed; // Declare a boolean variable named isPassed
std::string name; // Declare a string variable named name

(3) 2.3 التعريف والإسناد في نفس الوقت (التهيئة)

الصياغة:

TEXT 📖 للعرض فقط
Type variableName = value;

مثال:

CPP
int age = 25; // Declare age and assign 25
double price = 19.99; // Declare price and assign 19.99
char grade = 'A'; // Declare grade and assign 'A' (note: characters use single quotes)
bool isPassed = true; // Declare isPassed and assign true
std::string name = "MOTO"; // Declare name and assign "MOTO" (note: strings use double quotes)

💡 نصيحة: أدخلت C++11 أسلوب تهيئة أكثر حداثة (التهيئة الموحدة):

TEXT 📖 للعرض فقط
int age = {25}; // Uniform initialization (recommended)
double price{19.99}; // Can omit the equals sign (recommended)

هذا الأسلوب يمنع التحويلات الضيقة (مثلًا، إسناد 3.14 إلى int سيسبب خطأ بدلًا من الاقتطاع الصامت).



3. استخدام المتغيرات

▶ مثال 1: حساب مساحة دائرة (صعوبة ⭐)

CPP
#include <iostream>

int main() {
 const double PI = 3.14159; // Constant (covered later)
 
 double radius;
 std::cout << "Please enter the radius of the circle:";
 std::cin >> radius;
 
 double area = PI * radius * radius;
 std::cout << "The area of the circle is:" << area << std::endl;
 
 return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter the radius of the circle:
The area of the circle is:

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter the radius of the circle:5
The area of the circle is:78.5397

تحليل الكود:

  1. const double PI = 3.14159; — تعريف ثابت PI لا يمكن تغيير قيمته
  2. double radius; — تعريف متغير فاصلة عائمة radius
  3. std::cin >> radius; — قراءة إدخال المستخدم من لوحة المفاتيح وتخزينه في radius
  4. double area = PI * radius * radius; — حساب المساحة وتخزين النتيجة في area
  5. std::cout << ... — إخراج النتيجة


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

C++ لديها قواعد صارمة لأسماء المتغيرات:

(1) 4.1 قواعد صارمة (يجب اتباعها)

القاعدة مثال صالح مثال غير صالح
يمكن أن يحتوي فقط على حروف وأرقام وشرطات سفلية my_age، score2 my-age (الشرطات غير مسموحة)
لا يمكن أن يبدأ برقم age2 2age
حساس لحالة الأحرف age وAge متغيران مختلفان
لا يمكن أن يكون كلمة مفتاحية int myInt = 5; int int = 5; (int كلمة مفتاحية)

قائمة الكلمات المفتاحية في C++ (جزئية):

TEXT 📖 للعرض فقط
int, double, char, bool, string, if, else, for, while, 
return, class, public, private, new, delete, ...

(2) 4.2 قواعد مرنة (موصى بها بشدة)

المترجم لا يفرضها، لكن اتباعها يجعل كودك أكثر قابلية للقراءة:

القاعدة الأسلوب الموصى به غير موصى به
أسماء المتغيرات يجب أن تكون ذات معنى studentAge a، x1
استخدم camelCase للأسماء المتعددة الكلمات studentAge، totalScore student_age، total_score
الثوابت يجب أن تكون بأحرف كبيرة const int MAX_SIZE = 100; const int maxSize = 100;

💡 نصيحة: الفرق المختلفة قد تكون لديها اصطلاحات تسمية مختلفة. هذا الدرس يستخدم camelCase.



5. الثوابت (const)

بعض القيم يجب ألا تتغير أبدًا، مثل π، عدد أيام السنة، أو الحد الأقصى لطول مصفوفة.

(1) 5.1 لماذا نحتاج الثوابت؟

بدون ثوابت (مثال سيئ):

CPP
double circumference = 3.14159 * diameter; // This 3.14159 is a "magic number"
double area = 3.14159 * radius * radius; // If π is wrong, you have to fix it in two places

بثوابت (مثال جيد):

TEXT 📖 للعرض فقط
const double PI = 3.14159;
double circumference = PI * diameter; // Clear and easy to change
double area = PI * radius * radius;

(2) 5.2 كيفية تعريف الثوابت

الصياغة:

CPP
const Type CONST_NAME = value;

مثال:

TEXT 📖 للعرض فقط
const int DAYS_PER_WEEK = 7;
const double PI = 3.14159;
const std::string SCHOOL_NAME = "Meijia Vocational College";

💡 نصيحة: أسماء الثوابت عادةً تكون بأحرف كبيرة مع شرطات سفلية تفصل الكلمات — هذه اصطلاح في C++.

(3) 5.3 خصائص الثوابت

  1. يجب تهيئتها (يجب تعيين قيمة عند التعريف)
CPP
const int MAX_SIZE; // ❌ Error: constant must be initialized
  1. لا يمكن تعديلها
CPP
const int MAX_SIZE = 100;
MAX_SIZE = 200; // ❌ Error: cannot modify a constant's value


6. الإدخال والإخراج (cin وcout المتقدم)

(1) 6.1 قراءة متغيرات متعددة في وقت واحد

يمكن لـ cin قراءة متغيرات متعددة في عبارة واحدة، مفصولة بمسافات أو أسطر جديدة:

CPP
#include <iostream>
#include <string>

int main() {
 int age;
 std::string name;
 
 std::cout << "Please enter your name and age(separated by spaces):";
 std::cin >> name >> age; // Read two variables at once
 
 std::cout << "Hello," << name << "! You are " << age << " years old。" << std::endl;
 return 0;
}

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter your name and age(separated by spaces):MOTO 35
Hello,MOTO! You are 35 years old。

(2) 6.2 المزج بين cin وcout

TEXT 📖 للعرض فقط
#include <iostream>
#include <string>

int main() {
 std::string name;
 int age;
 double height;
 
 std::cout << "Please enter your name: ";
 std::cin >> name;
 
 std::cout << "Please enter your age: ";
 std::cin >> age;
 
 std::cout << "Please enter your height (meters): ";
 std::cin >> height;
 
 std::cout << "========== Personal Info ==========" << std::endl;
 std::cout << "Name: " << name << std::endl;
 std::cout << "Age: " << age << " years old" << std::endl;
 std::cout << "Height: " << height << " meters" << std::endl;
 
 return 0;
}


7. الأخطاء الشائعة وتصحيحها

(1) 7.1 نسيان تهيئة متغير

مثال خطأ:

CPP
#include <iostream>

int main() {
 int x; // Declared x but didn't assign a value
 std::cout << x << std::endl; // ❌ x's value is "garbage" — undefined
 return 0;
}

الطريقة الصحيحة:

TEXT 📖 للعرض فقط
int x = 0; // Initialize when declaring
std::cout << x << std::endl; // ✅ Outputs 0

💡 نصيحة: مترجمات C++ الحديثة ستحذرك من استخدام متغيرات غير مهيأة، لكن لا تعتمد على المترجم — طوّر عادة حسنة بالتهيئة دائمًا.

(2) 7.2 عدم تطابق الأنواع

مثال خطأ:

CPP
int age;
std::cin >> age;
// If the user enters "abc", age will remain unchanged (or worse)

الطريقة الصحيحة (سنتعلم كيفية التحقق من الإدخال لاحقًا):

TEXT 📖 للعرض فقط
int age;
std::cin >> age;
if (std::cin.fail()) {
 std::cout << "InputError!Please enter a number." << std::endl;
}

(ستُغطى هذه المشكلة بالتفصيل في الدرس 08 — حاليًا، كن فقط على دراية بالمشكلة.)



8. تطبيق: آلة حاسبة بسيطة

▶ مثال 2: آلة حاسبة للجمع والطرح والضرب والقسمة (صعوبة ⭐⭐)

CPP
#include <iostream>

int main() {
 double num1, num2;
 char op;
 
 std::cout << "Please enter the first number: ";
 std::cin >> num1;
 
 std::cout << "Please enter an operator (+ - * /): ";
 std::cin >> op;
 
 std::cout << "Please enter the second number: ";
 std::cin >> num2;
 
 double result;
 if (op == '+') {
 result = num1 + num2;
 } else if (op == '-') {
 result = num1 - num2;
 } else if (op == '*') {
 result = num1 * num2;
 } else if (op == '/') {
 if (num2 != 0) {
 result = num1 / num2;
 } else {
 std::cout << "Error: Divisor cannot be 0!" << std::endl;
 return 1; // Abnormal exit
 }
 } else {
 std::cout << "Error: Unsupported operator!" << std::endl;
 return 1;
 }
 
 std::cout << "Result: " << num1 << " " << op << " " << num2 << " = " << result << std::endl;
 return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter the first number: 
Please enter an operator (+ - * /): 
Please enter the second number: 
Error: Divisor cannot be 0!
Error: Unsupported operator!
Result:    = 

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter the first number: 10
Please enter an operator (+ - * /): *
Please enter the second number: 5
Result: 10 * 5 = 50

💡 نصيحة: يستخدم هذا البرنامج if-else (ستُغطى بالتفصيل في الدرس 06) — يمكنك نسخه حاليًا وفهم المنهج العام.


❓ أسئلة شائعة

س ما الفرق بين int وdouble؟ متى أستخدم أيهما؟
ج int يخزن أعدادًا صحيحة (مثل 25، -3)، double يخزن أعداد فاصلة عائمة (مثل 19.99، 3.14). قاعدة عامة: عدّ/عمر/سنوات → int؛ سعر/طول/معدلات → double.
س لماذا يستخدم char علامات اقتباس مفردة وstring علامات اقتباس مزدوجة؟
ج char هو حرف واحد، يستخدم علامات اقتباس مفردة (مثل 'A'string هي عدة أحرف، تستخدم علامات اقتباس مزدوجة (مثل "Hello"). لاحظ أن "A" و'A' نوعان مختلفان تمامًا.
س ما الفرق بين const و#define؟
ج const كلمة مفتاحية في C++ مع فحص أنواع — أكثر أمانًا وموصى بها (مثل const double PI = 3.14159;). #define ماكرو بأسلوب C بدون فحص أنواع — غير موصى به.
س هل يمكن استخدام أحرف صينية في أسماء المتغيرات؟
ج نظريًا نعم (C++11 تدعم معرّفات Unicode)، لكن يُنصح بشدة بعدم فعل ذلك — دعم المترجمات المتقاطعة يختلف والكود يصعب صيانته. لا تكتب كودًا مثل int Age = 25;.

▶ مثال 3: تحويل الأنواع (صعوبة ⭐)

CPP
#include <iostream>

int main() {
    int a = 5;
    double b = 3.7;

    // Implicit conversion
    double c = a + b;
    std::cout << "Implicit conversion: " << c << std::endl;

    // Explicit conversion (C-style)
    int d = (int)b;
    std::cout << "C-style cast: " << d << std::endl;

    // C++-style conversion
    int e = static_cast<int>(b);
    std::cout << "C++-style cast: " << e << std::endl;

    return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Implicit conversion: 
C-style cast: 
C++-style cast: 
💡 نصيحة: static_cast<T>() هي طريقة تحويل الأنواع الموصى بها في C++، أكثر أمانًا من الأسلوب C-style (T).



📖 ملخص

📝 تمارين

  1. أساسي (صعوبة ⭐): اكتب برنامجًا يعرّف ثلاثة متغيرات: name (string)، age (integer)، score (floating-point)، يعين قيمًا لكل منها، ويخرجها.
TEXT 📖 للعرض فقط
My name is Alice,this year 20 years old,FinalScore 92.5 points。
  1. متوسط (صعوبة ⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال نصف قطر دائرة، ثم حساب وإخراج المحيط والمساحة (المحيط = 2πr، المساحة = πr²).

  2. عرّف π كثابت (3.14159)

  3. أخرج بمنزلتين عشريتين (تلميح: استخدم std::fixed وstd::setprecision، يتطلب #include <iomanip>)

  4. تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا يحوّل درجة فهرنهايت إلى مئوية:

  5. دع المستخدم يدخل درجة حرارة بالفهرنهايت

  6. استخدم المعادلة C = (F - 32) × 5/9 لحساب الدرجة المئوية

  7. أخرج النتيجة (منزلة عشرية واحدة)

  8. مثال: إدخال 68، إخراج "68°F = 20.0°C"

  1. أنواع C++ الأساسية: int (عدد صحيح)، double (فاصلة عائمة)، char (حرف)، bool (منطقي)، string (سلسلة نصية)

9. 🚀 الخطوة التالية

الآن بعد أن تعلمت عن المتغيرات وأنواع البيانات، سنتعلم بعد ذلك العوامل في C++ (الدرس 04) — تمكين المتغيرات من إجراء العمليات الحسابية والمقارنات والأحكام المنطقية.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%