المتغيرات والأنواع
لحل المشكلات البرمجية، نحتاج إلى تخزين البيانات والعمل عليها، مثل الأرقام أو الحروف أو الكلمات. نقوم بتخزين هذه البيانات داخل المتغيرات.
مثال
#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كما تلاحظ في المثال، أغلب الأعداد الحقيقية لا يمكن تمثيلها بدقة تامة باستخدام 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 |