تخطَّ إلى المحتوى

المتغيرات وأنواع البيانات في C++‎

الدرس 2 من 11 · C++

C++‎ وُلدت من رحم لغة C، فورثت قوتها وسرعتها، وأضافت إليها أدوات حديثة تجعل الكتابة أسهل وأأمن. في هذا الدرس ستتعرف على المتغيرات وأنواع البيانات في C++‎، وستلاحظ كيف تجعل أدوات مثل string و cout العمل أسهل بكثير مما هو في C.

#include <iostream>
#include <string>
using namespace std;
int main() {
string name = "سارة";
int points = 10;
points += 5;
cout << name << " لديها " << points << " نقطة" << endl;
return 0;
}
الناتج
سارة لديها 15 نقطة
  • الصيغة: النوع ثم الاسم ثم القيمة، وفاصلة منقوطة في النهاية.
  • cout << تطبع كل ما يُرسل إليها، ويمكن سلسلة عدة قيم بـ << متتالية.
  • endl سطر جديد.
  • using namespace std; تسمح لنا بكتابة cout و string بدلاً من std::cout و std::string.

تخيّل cout مثل حزام نقل في مصنع: كل << تضع قطعة جديدة على الحزام، والحزام يوصلها كلها للشاشة بالترتيب.

int students = 30;
double price = 12.5;
bool isOpen = true;
char grade = 'A';
cout << students << " " << price << " " << isOpen << " " << grade << endl;
cout << boolalpha << isOpen << endl;
الناتج
30 12.5 1 A
true
النوع يخزن
int أعداد صحيحة
double أعداد عشرية
bool true أو false
char حرف واحد بين علامتين مفردتين
string نص بين علامتين مزدوجتين (يحتاج #include <string>)

لاحظ أن cout تطبع bool كرقم: 1 للصح و 0 للخطأ، كما في C. وإذا أضفت boolalpha تطبع الكلمتين true و false.

في C كانت النصوص مصفوفات حروف تحتاج حذراً شديداً في الحجم. في C++‎ هناك النوع string الذي يدير الذاكرة بنفسه:

string first = "Ahmed";
cout << first.length() << endl;
cout << first + " Ali" << endl;
الناتج
5
Ahmed Ali

length() لطول النص، و + لدمج النصوص مباشرة، دون أن تقلق من حجم الذاكرة.

cout << 10 / 4 << endl;
cout << 10.0 / 4 << endl;
cout << 10 % 4 << endl;
الناتج
2
2.5
2

قسمة عددين صحيحين تحذف الكسر، تماماً كما في C. اجعل أحد الطرفين عشرياً للحصول على الكسر.

auto city = string("القاهرة");
auto count = 3;
const double TAX = 0.14;
  • auto: يستنتج المترجم النوع من القيمة: count من نوع int. مفيدة جداً مع الأنواع الطويلة التي ستراها لاحقاً.
  • const: قيمة لا يمكن تغييرها بعد تعريفها.
int n = stoi("25");
cout << n + 5 << endl;
cout << to_string(42) + "!" << endl;
double avg = 7.9;
cout << static_cast<int>(avg) << endl;
الناتج
30
42!
7
  • stoi (من string to int): من نص إلى عدد صحيح، ومثلها stod للعشري.
  • to_string: من رقم إلى نص.
  • static_cast<int>(...): التحويل الصريح بأسلوب C++‎، وهو أوضح وأأمن من أسلوب C (int). ولاحظ أنه يقطع الكسر ولا يقرّب.
#include <iomanip>
cout << fixed << setprecision(2) << 12.5 << endl;
الناتج
12.50

fixed مع setprecision(2) تعرض رقمين بعد الفاصلة دائماً. وانتبه: هذا الإعداد يبقى سارياً على كل الأرقام العشرية التي تطبعها بعده.

#include <iostream>
#include <string>
using namespace std;
int main() {
string productName = "سماعة";
double unitPrice = 150.0;
int quantity = 2;
double total = unitPrice * quantity;
cout << "المنتج: " << productName << endl;
cout << "الإجمالي: " << total << " جنيه" << endl;
return 0;
}
الناتج المتوقع
المنتج: سماعة
الإجمالي: 300 جنيه

لاحظ أن cout تطبع 300 وليس 300.0، لأنها تحذف الأصفار غير الضرورية افتراضياً. تحدٍّ: اجعلها تطبع 300.00 باستخدام fixed و setprecision.

  • نسيان #include: استخدام string بدون #include <string> قد يعمل أحياناً ويفشل في مترجم آخر. أضف الملفات التي تحتاجها دائماً.
  • دمج نص مع رقم بـ +: "العمر: " + 14 لا يعمل كما تتوقع. استخدم << مع cout، أو to_string(14).
  • متغير بلا قيمة أولية: int x; يحمل قيمة عشوائية. أعطه قيمة دائماً.

سؤال

ما ناتج cout << static_cast<int>(9.8);؟

سؤال

ماذا تطبع cout << true; بدون boolalpha؟

  • cout << للطباعة، و endl لسطر جديد، و using namespace std; لاختصار الكتابة.
  • الأنواع الأساسية: int و double و bool و char، و string للنصوص الحديثة.
  • auto تستنتج النوع، و const للثوابت.
  • stoi و to_string للتحويل بين النصوص والأرقام، و static_cast للتحويل الصريح.
  • fixed و setprecision لتنسيق الأرقام العشرية، وتأثيرهما يستمر.