المتغيرات وأنواع البيانات في C++
ما هذا ولماذا؟
تخيل أنك تلعب لعبة كمبيوتر. لديك مخزون: سيف، جرعة صحة، عملات ذهبية. في البرمجة نفس الشيء — نحتاج إلى مكان لتخزين البيانات التي يعمل بها البرنامج. المتغيرات هي مثل الصناديق أو العلب التي يمكنك وضع رقم أو كلمة أو شيء آخر فيها. كل صندوق له اسم (مثل عدد_الأرواح أو اسم_البطل)، ويمكنك وضع نوع معين فقط من الأشياء فيه: في واحد أرقام، في آخر نصوص، في ثالث نعم/لا.
أنواع البيانات هي قواعد تقول: "في هذا الصندوق يمكنك وضع الأعداد الصحيحة فقط"، "وفي هذا يمكنك وضع الكلمات فقط". لماذا هذا ضروري؟ حتى لا يخلط الكمبيوتر بين الأمور: إذا قلت إن في الصندوق رقم، فيمكنك جمع الأرقام وطرحها وضربها. أما إذا كان هناك نص، فيمكنك القيام بعمليات أخرى: ربط الكلمات، البحث عن الحروف. بدون أنواع البيانات سيكون هناك فوضى — كما لو أن السيف في اللعبة تحول فجأة إلى جرعة، وبدأت العملات في التحدث.
بالنسبة للطالب، هذا مهم لأن أي برنامج هو التعامل مع البيانات. هل تريد صنع آلة حاسبة؟ تحتاج أرقامًا. هل تريد لعبة بها حوارات؟ تحتاج نصوصًا (سلاسل). هل تريد التحقق مما إذا كان اللاعب قد اجتاز المستوى؟ تحتاج قيمًا منطقية (صواب/خطأ). المتغيرات والأنواع هي الأساس الذي يُبنى عليه كل شيء آخر.
الصياغة وأمثلة الكود
في لغة C++، يجب أولاً تعريف المتغير — إخبار الكمبيوتر: "اسمع، أريد صندوقًا باسم كذا، وسيحتوي على بيانات من نوع كذا". يتم ذلك كالتالي: نكتب أولاً نوع البيانات، ثم اسم المتغير، ثم (إذا لزم الأمر) علامة يساوي والقيمة.
#include <iostream> // لكي نتمكن من عرض النص على الشاشة
using namespace std; // لكي لا نكتب std:: قبل كل كلمة
int main() {
// مثال 1: عدد صحيح (int)
int العمر = 14; // ننشئ متغيرًا "العمر" من نوع int (عدد صحيح) ونضع فيه 14
cout << "عمري: " << العمر << endl; // نعرضه على الشاشة
// مثال 2: عدد عشري (double) — للكسور
double الطول = 1.65; // الطول بالمتر، يمكن تخزين 1.65
cout << "طولي: " << الطول << " م" << endl;
// مثال 3: نص (string)
string الاسم = "أليس"; // كلمة أو جملة بين علامتي اقتباس
cout << "اسمي هو " << الاسم << endl;
// مثال 4: النوع المنطقي (bool) — فقط true (صواب) أو false (خطأ)
bool يحب_البرمجة = true; // true = 1, false = 0
cout << "هل يحب البرمجة؟ " << يحب_البرمجة << endl; // سيعرض 1 (لأنه true)
// مثال 5: حرف (char) — حرف واحد أو رقم بين علامتي اقتباس مفردة
char الحرف_الأول = 'A';
cout << "الحرف الأول من الاسم: " << الحرف_الأول << endl;
return 0; // انتهى البرنامج بنجاح
}
لاحظ: في C++، كل تعبير ينتهي بفاصلة منقوطة ;. إذا نسيتها، لن يتم تجميع البرنامج (لن يفهم الكمبيوتر أين تنتهي التعليمات).
مثال آخر — كيف يمكن تغيير المتغيرات:
int النقاط = 0; // في البداية 0
النقاط = 10; // الآن 10
النقاط = النقاط + 5; // الآن 15 (نأخذ القيمة القديمة، نضيف 5)
cout << النقاط << endl; // سيعرض 15
لا يمكن تغيير نوع البيانات: إذا عرّفت int، فلا يمكنك وضع نص فيه لاحقًا. سيعترض الكمبيوتر.
المقارنة مع بايثون
في بايثون، الأمر أبسط: لا تحتاج إلى تحديد نوع البيانات. بايثون يخمن بنفسه ما تقصده. لكن هذه البساطة تأتي على حساب السرعة والدقة — في C++ تعرف بالضبط مقدار الذاكرة التي يشغلها كل متغير، والبرنامج يعمل بشكل أسرع.
انظر كيف تبدو نفس الأمثلة في بايثون:
# بايثون: لا حاجة لكتابة int, string, bool — النوع يُحدد تلقائيًا
العمر = 14 # بايثون يفهم بنفسه أن هذا رقم
الطول = 1.65 # وهذا رقم عشري
الاسم = "أليس" # هذه سلسلة نصية
يحب_البرمجة = True # نوع منطقي
الحرف_الأول = 'A' # حرف (في بايثون هذا أيضًا سلسلة، لكن من حرف واحد)
print("عمري:", العمر)
print("طولي:", الطول, "م")
print("اسمي هو", الاسم)
print("هل يحب البرمجة؟", يحب_البرمجة)
print("الحرف الأول من الاسم:", الحرف_الأول)
هل الفرق واضح؟ في C++ نكتب int العمر = 14;، بينما في بايثون نكتب فقط العمر = 14. بايثون لا يتطلب تعريف النوع — إنه ينظر إلى القيمة ويقرر بنفسه. لكن إذا حاولت في C++ كتابة int العمر = "أليس";، فسيصدر المترجم خطأ. في بايثون، يمكنك كتابة العمر = "أليس" ولن يعترض — لكن لاحقًا، إذا حاولت جمع العمر مع رقم، سيتعطل البرنامج أثناء التنفيذ.
فرق آخر: في C++ تحتاج إلى تضمين المكتبات (مثل #include <iostream> للإخراج على الشاشة)، بينما في بايثون العديد من الأشياء مدمجة بالفعل. بالنسبة للطالب، بايثون أسهل للبدء، لكن C++ يعطي فهمًا أعمق لكيفية عمل الكمبيوتر.
الأخطاء الشائعة للمبتدئين
- نسيان الفاصلة المنقوطة. هذا هو الخطأ الأكثر شيوعًا. سيقول المترجم: "خطأ: توقع فاصلة منقوطة". فقط ضع
;في نهاية كل تعليمة. - استخدام متغير غير مُعرّف. إذا كتبت
cout << x;والمتغيرxلم يتم تعريفه، فلن يفهم المترجم ما هو. دائمًا عرّف أولاً:int x = 5; - الخلط بين علامات الاقتباس. للسلاسل النصية (عدة أحرف) تحتاج إلى علامات اقتباس مزدوجة:
"مرحبا". للحرف الواحد — علامات مفردة:'A'. إذا خلطت بينهما، سيحدث خطأ. - تعيين قيمة من نوع خاطئ. على سبيل المثال،
int a = 3.14;— قد يحذرك المترجم بأن الجزء العشري سيُفقد (ستصبح القيمة 3).