القائمة الرئيسية

الصفحات

تعلم السي بلاس بلاس

C++ نظرة عامة على لغة C++

هل أنا جاهز لتعلم لغة C++ ؟

إذا كنت مبتدئاً في البرمجة, يجب أن تدرس الخوارزميات قبل أن تبدأ مباشرةً بدراسة لغة C++, لأنك بحاجة لمعرفة مبادئ البرمجة قبل أن تتعلم أي لغة برمجة.
لا تقلق إذا لم يسبق لك أن تعلمتها لأننا شرحنا الخوارزميات من الصفر.يمكنك تعلم ذلك هنا


نصيحة

لا تحاول تعلم لغة C++ ما لم تتعلم الخوارزميات قبلها لأنك قد تواجه صعوبة كبيرة في فهم الكود أحياناً حتى لو كان الكود مشروح بتفصيل و سهل الفهم.
و قم بدراسة جميع الدروس بنفس الترتيب الموضوعين فيه لأننا شرحنا جميع الأفكار بشكل مترابط.

ما هي لغة C++ ؟

C++ تكتب سي بلاس بلاس باللغة العربية و هي لغة برمجة تجميعية ( Compiled ) و كائنية ( Object Oriented ) تضم العديد من مميزات لغات البرمجة عالية المستوى ( High Level ) و منخفضة المستوى ( Low Level ) و هذا يعني أنك قادر على فعل ما تشاء بها.
هذه اللغة الرائعة مصممة لتعمل على جميع أنظمة التشغيل المعروفة مثل ويندوز, ماك, لينكس, إندرويد إلخ.. و هي تعتبر من أقوى و أشهر لغات البرمجة على الإطلاق و يطلق عليها "أم اللغات" نظراً لأنها لغة قوية و موجودة منذ زمن طويل.

تم بناء هذه اللغة بالأساس كتطوير للغة C من قبل Bjarne Stroustrup أثناء عمله في مختبرات Bell لتكون أطروحته في رسالة الدكتورا عام 1979.
من ذلك الحين و حتى وقتنا الحالي تم تطوير هذه اللغة بشكل مستمر و اخر إصدار رسمي لها هو C++ 17.

لا يوجد شعار رسمي للغة C++ و لكن في العادة و عند البحث عن دورات لتعلمها أونلاين فإنك تجدهم يستخدموا شعار يشبه التالي.

ماذا يمكنني ان أطور بلغة C++ ؟

لغة C++ تعتبر لغة عامة الهدف ( General Purpose ) مما يعني انها قادرة على بناء أي برنامج.
القوة الحقيقة لها تتجلى في المشاريع والبرامج الكبيرة مثل:

  • بناء و تطوير انظمة التشغيل ومن اشهر انظمة التشغيل المبنية بهذه اللغة Windows, Linux, MacOS, Android.

  • بناء و تطوير البرامج الكبيرة مثل برامج أدوبي ( مثل Photoshop و Premier ) و المتصفح Firefox.

  • بناء و تطوير الالعاب و من أشهر الألعاب التي طورت بهذه اللغة Counter Strike, MacOSDoom, Warcraft.

مميزات لغة C++ بالنسبة للمطورين

  1. لها شعبية هائلة و هناك الكثير من المراجع لمن يريد تعلمها.

  2. القدرة على التحكم باستخدام الذاكرة بشكل كبير.

  3. خفيفة وسريعة وتستهلك موارد نظام أقل مقارنة بلغات مثل جافا وبايثون.

  4. بالامكان تحويل كود مكتوب بلغة C لكود بلغة C++ بسهولة.

مميزات لغة C++ عن باقي لغات البرمجة

  1. مفتوحة المصدر
    لن تدفع أي مبلغ لتعمل على لغة C++, فهي مصدر مفتوح و مجانية و ستبقى مجانية مدى الحياة.


  2. خفيفة
    تستطيع البرمجة بها حتى و لو كان حاسوبك ضعيفاً أو قديماً.


  3. البساطة
    تعلمها سهل جداً بعد أن تفهم برمجة الكائنات.


  4. سرعة الترجمة
    تتم ترجمة لغة C++ إلى أوامر يفهمها الجهاز بشكل سريع جداً.


  5. لغة كائنية ( Object Oriented )
    مع أن لغة C++ صممت لتكون قريبة من عتاد الجهاز و قريبة للغات منخفضة المستوى إلا أنها تتيح لمستخدمها بناء الكلاسات والتعامل معها بطرق منهجيات البرمجة الكائنية ( OOP ) مثل الوراثة و تعدد الأشكال و غيرها من المبادئ التي ستتعلمها لاحقاً في الدورة.


  6. متعددة النماذج
    تسمح لغة C++ لمستخدمها باختيار الطريقة المناسبة له لكتابة الكود البرمجي من بين عدة نماذج مختلفة مثل النموذج الهيكلي ( Structural ) الشبيهة بلغة C والنموذج الكائني ( Object Oriented ) الشبيه بلغة جافا.


  7. الدعم الكبير
    لغة C++ من اللغات القديمة نسبيا والمنتشرة بشكل كبير مما جعل منها لغة ذات شعبية كبيرة و مصادر تعلم مختلفة و متعددة و دعم كبير من قبل مجتمع المطورين.

لمن تم إعداد هذا المرجع؟

تم إعداد هذا المرجع ليتلاءم مع جميع الأشخاص الذين يريدون التعلم.
إذاً سواء كنت هاوياً, طالباً أو مبرمجاً, فإن هذا المرجع سيساعدك على فهم أساسيات لغة C++ و الوصول إلى مستوى متقدم جداً.

في الدرس التالي سنرشدك لتحميل الأدوات التي سنستخدمها لبناء و تشغيل كود C++ على حاسوبك.

C++ تحميل و تنصيب أدوات C++

طريقة عمل برنامج مكتوب بلغة C++

الكود الذي تكتبه على الكمبيوتر لا يعمل بشكل مباشر بل يمر بعدة مراحل تباعاً حتى يعمل تماماً كما في الصورة التالية.

إذاً يمر الكود المكتوب بلغة C++ بثلاث مراحل حتى يصبح في النهاية برنامج يمكن تشغيله على الحاسوب.
في البدابة يقوم الـ preprocessor بتشذيب وتجهيز الملفات النصية لتدخل بعدها في عملية التجميع ( Compiling ) حيث يتم تحويل الملفات النصية الى ملفات ( نوعها Binary ) يفهمها الحاسوب مع المحافظة على بعض صفات الكود مثل أسماء المتغيرات والدوال ومن ثم يقوم الموصل ( Linker ) بوصل كل أجزاء البرنامج المختلفة ودمجها مع بعضها لتصبح ملف تنفيذي واحد ( نوعه EXE ) يمكن تشغيله في أي وقت مثل أي تطبيق عادي.


معلومة تقنية

الـ preprocessor, الـ Compiler و الـ Linker هي مجرد برامج صغيرة تعمل مع بعضها بشكل متناسق حتى تحول كل الكود الذي قمنا بكتابته في المشروع لبرنامج عادي يمكن تشغيله بنقرة واحدة.

تجهيز بيئة العمل لتطوير تطبيقات بلغة C++

يوجد الكثير من بيئات العمل التي تمكنك من العمل على تطوير البرامج بلغة C++ مهما كان نظام التشغيل الذي تستخدمه مثل:
Eclipse - CodeBlocks - CLion - Dev C++ الخ..

في هذه الدورة سنعلمك كيف تقوم بتحميل, تنصيب و استخدام برنامج CodeBlocks المجاني من أجل كتابة و تجربة الكود حاسوبك الشخصي.
كما سنعلمك أيضاً كيف تستخدم خدمة أونلاين في حال أردت كتابة كود C++ بدون تنصيب أي برنامج على حاسوبك.


ملاحظة

في حال كنت تستخدم نظام ويندوز و تستخدم برنامج Visual Studio فيمكنك استخدامه نفسه لكتابة الكود بدل برنامج CodeBlocks.
لمعرفة كيف تكتب كود C++ باستخدام برنامج Visual Studio إبحث في يوتيوب عن: visual studio setup for c++ و شاهد أي فيديو تريد.

في حال كنت تستخدم نظام ماك و تستخدم برنامج XCode فيمكنك استخدامه نفسه لكتابة الكود بدل برنامج CodeBlocks.
لمعرفة كيف تكتب كود C++ باستخدام برنامج XCode إبحث في يوتيوب عن: xcode setup for c++ و شاهد أي فيديو تريد.


خطوات تحميل و تنصيب و فتح برنامج CodeBlocks

شاهد الخطوات التالية لتتعلم كيف تقوم بتحميل و تنصيب إصدار برنامج CodeBlocks الملائم لحاسوبك.
ملاحظة: سبب إستخدامنا لبرنامج CodeBlocks هو أنه مجاني, سهل الإستخدام و يساعد كثيراً في كتابة الكود.

شاهد الخطوات »



خطوات إنشاء مشروع جديد و تشغيله في برنامج CodeBlocks

هنا وضعنا خطوات إنشاء مشروع ( أي برنامج ) جديد في CodeBlocks.
إنتبه: عليك إتباع هذه الخطوات في كل مرة تريد فيها تجربة الكود على الكمبيوتر.

شاهد الخطوات »



خطوات تحديد إصدار المترجم ( Compiler)

هنا وضعنا خطوات تحديد إصدار المترجم و هذا الأمر سيساعدك على اختيار الإصدار الذي تريده بكل سهولة.
كما أننا سنحدد الإصدار الذي سنعمل عليه لذلك عليك اتباع هذه الخطوات الآن و اتباعها كلما أردت تغيير إصدار المترجم.

شاهد الخطوات »

الشكل العام لأي برنامج مكتوب بلغة C++

الملف الأساسي في المشروع يجب أن يكون شكله كالتالي.

#include <iostream>

	  int main()
	  {
	  // هنا يجب أن تضع الأوامر التي ستتنفذ عند تشغيل البرنامج
	  return 0;
	  }
	

  • الكود الذي يتنفذ مباشرةً عند تشغيل البرنامج هو الكود الذي نكتبه بداخل حدود الدالة main() و قبل الأمر return 0.

  • سنتطرق إلى مزيد من التفاصيل في الدرس التالي.

فائدة السطر using namespace std;

عند إنشاء أي مشروع جديد تلاحظ في الملف main.cpp أنه يوجد الأمر using namespace std; في السطر الثالث كالتالي.

#include <iostream>

	  using namespace std;

	  int main()
	  {
	  cout << "Hello world!" << endl;     // نستخدمه لطباعة أي نص نريد للمستخدم لكن لا تشغل بالك به الآن cout << الأمر
	  return 0;
	  }
	


لماذا أجد الأمر using namespace std; موضوع ضمن كود المشروع إذا لم يكن وجوده إجبارياً؟

في البداية هذا السطر معناه أنك تريد تضمين الأشياء الموجودة بداخل المكتبة std بشكل مباشر في المشروع.
في حال أردت إزالة هذا السطر ستكون مجبر على تحديد إسم المكتبة التي تستخدم منها الأمر cout و cin و غيرها من الأوامر التي سنتعلمها في دروس لاحقة.

الآن سيكون شكل الكود كالتالي في حال أردت إزالة الأمر using namespace std; منه.

#include <iostream>

	  int main()
	  {
	  std::cout << "Hello world!" << endl;   // مكان وجود هذا الأمر C++ حتى نحدد لمترجم لغة cout قبل كلمة std:: لاحظ أننا أضفنا
	  return 0;
	  }
	


في هذه الدورة سنقوم بتضمين المكتبة std في أغلب الأمثلة حتى يكون حجم الكود أصغر و أسهل عليك في القراءة, أي سنبقي الأمر using namespace std; في الكود.


ملاحظة

من الآن و حتى إنتهاء سلسلة دروس C++ ستكون دروسك عبارة عن شروحات صغيرة لكل مفهوم جديد تتعلمه, و بهذه الطريقة ستفهم كل مبادئها.

C++ خطوات تحميل و تنصيب برنامج CodeBlocks

خطوات تحميل برنامج CodeBlocks

  1. إبحث في جوجل عن codeblocks.

  2. أنقر على رابط أول موقع يظهر لك في نتائج البحث و سيكون الموقع هو موقع codeblocks نفسه كما يظهر في الرابط.

  1. بعد أن يفتح موقع codeblocks الرسمي, قم النقر على Downloads حتى تذهب للصفحة التي يمكن فيها إختيار نسخة البرنامح الذي ستستخدمه.

  1. في هذه الصفحة الجديدة ستجد عدة خيارات لتحميل البرنامج.
    قم بالنقر على خيار Download the binary release لأنها أسهل نسخة من ناحية التنصيب على الحاسوب.

  1. في هذه الصفحة ستجد عدة خيارات للتحميل. إنزل في الصفحة حتى تجد قسم التحميل بنظام التشغيل الذي تستخدمه.
    ملاحظة: نحن نسنخدم نظام ويندوز لهذا سنتوجه لخيارات التحميل الخاصة بنظام ويندوز.

  2. بعدها قم بتحميل برنامج mingw-step.exe من خلال النقر على رابط التحميل الذي يظهر بجانبه من موقع FossHUB أو من موقع Sourceforge.net.
    بعد أن تنقر على رابط التحميل من موقع FossHUB ستفتح صفحة جديدة و يبدأ تحميل البرنامج بشكل تلقائي.

إلى هنا, تكون قد قمت بتحميل برنامج CodeBlocks بنجاح و خطوتك التالية هي تنصيبه.

خطوات تنصيب برنامج CodeBlocks

  1. بعد تحميل CodeBlocks قم بفتحه حتى تبدأ بتنصيبه.
    أنقر بزر الفأرة الأيمن على الملف, ثم إختر Run as administrator.

  1. إضغط على Next.

  1. ضع علامة صح على I Agree.

  1. قم بإبقاء كل شيء مختاراً و إضغط على Next.

  1. إضغط على Install.

  1. بعد أن ينتهي تنصيب البرنامج بنجاح سيسألك إن كنت تريد تشغيله الآن.
    إضغط على Yes لأنه يوجد خطوات بسيطة يجب أن تفعلها أول مرة تقوم فيها بتشغيل برنامج CodeBlocks و سنفعلها الآن.

  1. أنقر على GNU GCC Compiler, ثم أنقر على ثم Set as default, ثم أنقر على OK.

  1. الآن ستلاحظ أن واجهة برنامج CodeBlocks ستفتح و سيظهر لك رسالة فيها أربع خيارات.
    إختر Yes, associate Code::Blocks with C/C++ file types ثم إضغط على OK.

إلى هنا, تكون قد قمت بتنصيب برنامج CodeBlocks بنجاح.

خطوات تشغيل برنامج CodeBlocks

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

بعد أن تجد أيقونة البرنامج, أنقر عليه فقط و سيفتح كالتالي.


الآن, قم بالعودة للدرس لتتعلم كيف تنشئ مشروع جديد (أي برنامج) بواسطة CodeBlocks و تقوم بتشغيله.

C++ خطوات إنشاء مشروع جديد في برنامج CodeBlocks

خطوات إنشاء مشروع جديد

  1. أنقر على File, ثم New, ثم Project كالتالي.

  1. أنقر على Console Application ثم على الزر Go كالتالي.

  1. قم بوضع علامة صح على الخيار Skip this page next time ثم أنقر على Next حتى لا تظهر لك هذه الصفحة مرة أخرى كالتالي.

  1. أنقر على ++C و من ثم أنقر على Next كالتالي.


  1. قم بتحديد الإسم الذي تريد وضعه للمشروع و مسار المجلد الذي تريد أن يتم فيه حفظه على حاسوبك, ثم أنقر على Next كالتالي.


  1. لا تعدل أي شيء في هذه الصفحة, أنقر Next كالتالي فقط.


  1. بعد أن يتم إنشاء المشروع بنجاح سيظهر بداخل قائمة المشاريع كالتالي.


  1. لرؤية الملف الأساسي في المشروع و الذي يمكنك كتابة الكود بداخله, إفتح المجلد Sources ثم أنقر على الملف main.cpp كالتالي.


  1. لتشغيل هذا البرنامج و الذي سيعرض لك فقط جملة "Hello world!" أنقر على الزر Build and run كالتالي.


  1. بعد تشغيل البرنامج سيفتح موجه الأمر (و الذي يسمى CMD أو Console) و يظهر بداخله نتيجة التشغيل كالتالي.

خطوات تشغيل المشروع بشكل صحيح

قبل تشغيل أي مشروع يجب أن تقوم بتحويل كود المشروع لملف تنفيذي نوعه EXE و هنا في حال كان الكود فيه أي مشكلة ستظهر لك.
عندما تقوم بتحويل كل كود المشروع لملف تنفيذي EXE فأنت بذلك تفعل ما يسمى Build للمشروع.
ملاحظة: هذا الأمر تفعله بنقرة واحدة فقط و ستتعلم كيف تفعل ذلك بكل سهولة بعد قليل.

في برنامج CodeBlocks يمكنك أن تحول كود المشروع لملف تنفيذ و تشغله بنقرة واحدة فقط إن أردت و هذا الأمر يسمى Build and Run.


إنتبه جيداً

إذا قمت بتعديل كود المشروع و حفظته فقط بدون أن تفعل Build - أي بدون أن تقوم بتحويل كود المشروع لملف تنفيذي - ثم قمت بتشغيله فسيظهر لك عند التشغيل نتيجة آخر مرة فعلت فيها Build و ليس نتيجة الكود الذي حفظته آخر مرة.

لذلك ننصحك دائماً بان تفعل Build في حال أردت فقط التشييك على كود المشروع.
و ننصحك بأن تفعل Build and Run دفعة واحدة في حال أردت التشييك على كود المشروع و تشغيله.

C++ خطوات تحديد إصدار المترجم في برنامج CodeBlocks

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

كمثال بسيط, إذا أردت استخدام الكلمة auto في الكود, يجب أن تحدد لبرنامج CodeBlocks أنك تتعامل مع إصدار المترجم [-std=c++11] لأن الإصدارات الأقدم من هذا الإصدار لم تكن الكلمة auto قد أضيفت فيها بعد و هذا يعني أنها تعتبر شيء غير معروف بالنسبة للإصدارات القديمة و يؤدي لظهور مشاكل في الكود عند تشغيله.


الآن لتحديد رقم الإصدار الذي تتعامل معه, يمكنك اتباع هذه الخطوات البسيطة:

C++ أسلوب كتابة الكود في لغة C++

مبادئ كتابة الكود في C++

في البداية عليك معرفة أن كل ما ستتعلمه في هذا الدرس عبارة عن شرح نظري لأساليب كتابة الكود.
إذاَ في هذا الدرس ستتعلم كيف تكتب كود C++ بشكل صحيح يفهمه الكمبيوتر و يفهمه أي شخص يحاول قراءة الكود الذي ستقوم أنت بكتابته مستقبلاً عند بناء تطبيقاتك الخاصة.


Case Sensitivity

لغة C++ تطبق مفهوم الـ Case Sensitivity, و هذا يعني أنها تميز بين الأحرف الكبيرة و الأحرف الصغيرة.

مثال: note و Note ليسوا شيئاً واحداً.



Strictly Typed

لغة C++ تطبق مفهوم الـ Strictly Typed, و هذا يعني أنه يجب تحديد نوع المتغير مباشرةً عند تعريفه (مثل عدد صحيح , حرف , عدد عشري , الخ..) و لا يمكن تغيير نوع البيانات المخزنة فيه لاحقاً كما هو الحال في لغة جافا C و C#, و على خلاف بعض اللغات الأخرى مثل بايثون و جافا سكريبت.



إسم الكلاس

يفضل أن يبدأ إسم الكلاس بحرف كبير و في حال كان إسم الكلاس يتألف من أكثر من كلمة, إجعل أول حرف من كل كلمة كبيراً.

أمثلة

في حال كان إسم الكلاس يتألف من كلمة واحدة.

                    class Car{ }
	  

في حال كان إسم الكلاس يتألف من أكثر من كلمة.

                    class CppFirstClass{ }
	  


إسم المتغير

إستخدم الأحرف الصغيرة عند اختيار أسماء للمتغيرات و في حال كان إسم المتغير يتألف من أكثر من كلمة إبدأ كل كلمة بحرف كبير ابتداءً من الكلمة الثانية.

أمثلة

في حال كان إسم المتغير يتألف من كلمة واحدة.

                    int color;
	  

في حال كان إسم المتغير يتألف من أكثر من كلمة.

                    int firstCarColor;
	  


إسم الدالة

إستخدم الأحرف الصغيرة عند اختيار أسماء للدوال و في حال كان إسم الدالة يتألف من أكثر من كلمة إبدأ كل كلمة بحرف كبير ابتداءً من الكلمة الثانية.

أمثلة

في حال كان إسم الدالة يتألف من كلمة واحدة.

                    void color();
	  

في حال كان إسم الدالة يتألف من أكثر من كلمة.

                    void changeCarColor();
	  


التعليقات

نستخدم التعليقات لنضع ملاحظات حول الكود الذي كتبناه فقط, لكي لا ننسى كيف برمجنا الكود في حال أردنا مراجعته أو التعديل عليه بعد وقت طويل.
التعليقات لا تؤثر إطلاقاً على الكود المكتوب, و في لغة C++ يوجد أسلوبين لوضع التعليقات:

  • تعليق على سطر واحد.

  • تعليق على عدة أسطر.


أمثلة

في حال كان التعليق يتألف من سطر واحد, نضع الرمز // قبل كتابة التعليق.

                    // this is a one line comment    تعليق سطر واحد
	  

في حال كان التعليق يتألف من عدة أسطر, نبدأ التعليق بالرمز /* و ننهيه بالرمز */.

                    /*
		This is multlines comment 
		هذا تعليق
		يتألف من
		عدة سطور
		*/
	  

تذكر: أنت لست مجبراً على وضع تعليقات في برامجك. و لكننا ننصحك بوضع تعليقات دائماً حتى تساعدك في فهم الكود الذي كتبته.

الأحرف المستخدمة في وضع الأسماء في C++

أي إسم نضعه لمتغير, دالة, كلاس, كائن إلخ.. يسمى identifier في البرمجة.
في C++ كل عنصر نريد خلقه علينا إعطاءه إسم خاص, أي علينا تحديد الـ identifier له.
إذاً يتم التمييز بين العناصر في C++ من خلال أسمائهم, أي من خلال الـ Identifiers.


قواعد إلزامية عند إعطاء الأسماء

  1. جميع الـ Identifiers يجب أن يبدأوا بحرف كبير بين A-Z أو حرف صغير بين a-z أو الشحطة _.

  2. يمنع بدء الـ Identifiers برقم.

  3. يمنع استخدام الـ Literals أي القيم true, false.

  4. يمنع إستخدام أي كلمة من الكلمات المحجوزة ( Keywords ).

  5. لا تنسى أن C++ تطبق مبدأ الـ Case Sensitive.


ركز على أول حرف فقط

أمثلة للأسماء التي يسمح باستخدامها: Harmash , name , _number

أمثلة للأسماء التي يمنع استخدامها: 1st , -cash , @user

الكلمات المحجوزة في C++

جميع الكلمات التالية محجوزة للغة C++, أي لا يمكن إستخدامها كـ Identifiers.

alignas
alignof and
and_eq
auto
bitand
bitor
bool
break
case
catch
char
char16_t
char32_t
class
compl
const
constexpr
const_cast
continue
decltype
default
delete
do
double
dynamic_cast
else
enum
explicit
export
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
noexcept
not
not_eq
nullptr
operator
or
or_eq
private
protected
Public
register
reinterpret_cast
requires
return
short
signed
sizeof
static
static_assert
static_cast
struct
switch
template
this
thread_local
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq

C++أمر الطباعة cout >>

أمر الطباعة cout

بشكل عام, نستخدم الأمر cout لطباعة أي شيء نريد في الكونسول.
عند إستخدام الأمر cout يجب أن تضع العامل << قبل أي شيء تريد تمريره له حتى يتم طباعته.


مثال

main.cpp
                    #include <iostream>

		int main()
		{
		std::cout << "Harmash.com";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
	  

شرح الكود

  • الأمر #include <iostream> الموجود في السطر الأول يقوم بتضمين الحزمة iostream التي تحتوي على الأوامر الأساسية التي نحتاجها في التطبيقات التي تعتبر Console Application و التي سنستخدمها في أغلب البرامج مثل أمر الطباعة cout و غيره من الأوامر و الدوال الجاهزة التي ستمر معك لاحقاً في الدورة.

  • سبب وضع std:: قبل cout هو أن الأمر cout موجود فيه.

  • الدالة main() التي قمنا بتعريفها ابتداءاً من السطر الثالث يجب أن يكون نوعها int لأنها تمثل نقطة البداية في البرنامج.

  • وضع return 0; في السطر السادس و كآخر أمر في الدالة main() هو أمر متعارف عليه, و فكرته إرسال الرقم 0 لنظام التشغيل عند انتهاء أو إغلاق البرنامج بشكل طبيعي. هكذا سيتمكن نظام التشغيل من التفريق بين الإنهاء الطبيعي للبرنامج والإنهاء المفاجئ ( Crash ) الذي يحدث نتيجة خطأ ما.



مبادئ الطباعة الأساسية

عليك مراعاة المبادئ التالية عند استخدام الأمر cout.

  • لعرض رقم, ضعه كما هو.

  • لعرض قيمة متغير, ضعه كما هو.

  • لعرض حرف يجب وضعه بين ' '.

  • لعرض كلمة أو نص, يجب وضعه بين " ".

طباعة عدة أشياء دفعة واحدة بواسطة الأمر cout في C++

لدمج عدة أشياء مختلفة و عرضها باستخدام الأمر cout نضع الرمز << بين كل شيئين نريد طباعتهما.


في المثال التالي, قمنا بإنشاء برنامج يحتوي على متغيرين name و year.
بعدها قمنا بعرضهما كجملة واحدة.

مثال

main.cpp
                    #include <iostream>

		int main()
		{
		char *name = "Ali";
		int year   = 1996;

		std::cout << "Hello my name is " << name << ", I born in " << year;
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Hello my name is Ali, I born in 1996
	  

عرض المحتوى على سطر جديد C++

عند عرض المحتوى بواسطة الأمر cout يمكنك تحديد نهاية السطر من خلال وضع العامل endl و عندها سيظهر أي شيء تطبعه بعده على سطر جديد.
معلومة: endl إختصار لجملة End Line.


مثال

main.cpp
                    #include <iostream>

		int main()
		{
		std::cout << "Harmash.com" << std::endl << "C++ course";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
		C++ course
	  

سبب وضع std:: قبل العامل endl هو أن العامل endl موجود فيه.

أهمية الكلمة using في C++

في البداية, سنشرح الكلملة using بتفصيل ممل في درس لاحق نظراً لأهميتها في المشاريع.
الآن, إذا أردت أن تكتب الأمرين cout و endl بشكل مباشر بدون الحاجة لأن تكتب قبلهما std::, قم بتضيمن النطاق std مرة واحدة في الملف و عندها تصبح قادر على استخدام أي شيء موجود فيه بشكل مباشر.

لتضمين النطاق std في الملف main.cpp نكتب using namespace std; فوق الدالة main().


الآن, سنعيد نفس المثال السابق مع تضمين النطاق std بشكل مباشر.

مثال

main.cpp
                    #include <iostream>
		using namespace std;   // std هنا قمنا بتضيمن النطاق

		int main()
		{
		cout << "Harmash.com" << endl << "C++ course";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
		C++ course
	  

النزول على سطر جديد بواسطة الرمز \n في C++

إذا أردت النزول على سطر جديد بدون الحاجة لكتابة << endl فيمكنك تمرير \n كنص.
ملاحظة: أغلب المبرمجين يفضلون تمرير \n بدل كتابة << endl لأنها مختصرة أكثر.

معلومة: \n إختصار لجملة New Line.


في المثال التالي قمنا بتمرير \n كنص للأمر cout من أجل النزول على سطر جديد.

مثال

main.cpp
                    #include <iostream>
		using namespace std;

		int main() {
		cout << "Harmash.com\nC++ course";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
		C++ course
	  


هنا قمنا بإعادة المثال السابق تماماً مع كتابة أمرين cout هذه المرة.
ملاحظة: هذا الأسلوب أسهل من ناحية القراءة و التعديل و لهذا ننصح باعتماده بدلاً من الأسلوب السابق.

مثال

main.cpp
                    #include <iostream>
		using namespace std;

		int main() {
		cout << "Harmash.com\n";
		cout << "C++ course";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
		C++ course
	  

وضع عدة مسافات فارغة بواسطة الرمز \t في C++

إذا أردت وضع عدة مسافات فارغة دفعة واحدة و بشكل مرتب فالأفضل أن تستخدم الرمز \t بدل وضع المسافات بنفسك.
من الأشياء التي قد تجعلك تستخدم \t هي أنه عند طباعة عدة أسطر تجده يحاول عرضهم لك بشكل متناسق لإظهار المحتوى بشكل أسهل للقراءة.

معلومة: \t إختصار لجملة Tab Space.


في المثال التالي قمنا بوضع الرمز \t بين الكلمات من أجل وضع مسافة تلقائية بينهم بشكل مرتب.

مثال

main.cpp
                    #include <iostream>
		using namespace std;

		int main()
		{
		cout << "Name:\tAli Rabeei\n";
		cout << "Job:\tProgrammer";
		return 0;
		}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Name:   Ali Rabeei
		Job:    Programmer
	  

إصدار صوت تنبيه بواسطة الرمز \a في C++

إذا أردت إصدار صوت تنبيه لجعل المستخدم ينتبه للكونسول, يمكنك ذلك بكل سهولة من خلال تمرير الرمز \a كنص للأمر cout.

معلومة: \a إختصار لكلمة Alert.


في المثال التالي قمنا باستخدام الرمز \a لتشغيل صوت تنبيه في جهاز المستخدم.

مثال

main.cpp
                    #include <iostream>
		using namespace std;

		int main()
		{
		cout << "Yes, you hear the alert :)\a";
		return 0;
		}
	  

لا تنسى رفع صوت الحاسوب حتى تسمع صوت التنبيه عند التشغيل و سيظهر لك النص التالي أيضاً.

                    Yes, you hear the alert :)
	  

المسافات الفارغة و ترتيب الكود في C++

لغة C++ لا تتأثر بالمساحات البيضاء ( White Spaces ) مثل المسافات والأسطر الفارغة حتى انه يمكن كتابة بعض البرامج بالكامل في سطر واحد و لكن لا ننصح ابداً بذلك و يفضل ترك مسافات و أسطر فارغة حتى تكون قادر على مراجعة و استيعاب الكود بسهولة تامة عند الرجوع إليه.


في المثال التالي قمنا بكتابة نفس المثال السابق على سطر واحد.
تنبيه: رغم أن الأسلوب التالي لا يوجد فيه أي مشكلة برمجياً, إلاّ أننا ننصحك بعدم إعتماد هذا الأسلوب إطلاقاً عند كتابة الكود.

مثال

main.cpp
                    #include <iostream>
		using namespace std; int main() {cout << "Harmash.com"<<endl<<"C++ course";return 0;}
	  

سنحصل على النتيجة التالية عند التشغيل.

                    Harmash.com
		C++ course
	  

مفهوم أنواع البيانات في C++

أي شيء تتعامل معه في C++ له نوع محدد و له طريقة خاصة للتعامل معه فيها; فمثلاً الأرقام لها طريقة للتعامل معها, النصوص لها طريقة للتعامل معها, الدوال لها طريقة للتعامل معها و هكذا.

في C++ يوجد أنواع بيانات بسيطة و جاهزة يمكنك التعامل معها سنطلعك عليها بتفصيل في هذا الدرس, و يوجد أنواع أخرى جاهزة ستتعلمها لاحقاً في الدورة لأنه لأنك غير مستعد لها بعد, كما تستطيع تعريف أنواع جديدة و هذا الأمر ستتعلمه لاحقاً أيضاً.


أنواع البيانات في C++

البيانات في C++ تنقسم لثلاث أقسام رئيسية كما في الصورة التالية.

أنواع البيانات الأساسية التي سنتعرف عليها و سنبدأ بالتعامل معها من الآن هي الأنواع الأولية ( Primary ) و التي تعتبر نفسها في أغلب لغات البرمجة.
و نود الإشارة إلى أننا سنتعرف على جميع الأنواع الأخرى المذكورة لاحقاً في الدورة عندما نصبح مستعدين لها.


ملاحظة

قد تجد مسميات أخرى تطلق على أنواع البيانات و هذا شيء طبيعي جداً, فمثلاً قد تجد أنواع البيانات الأولية ( Primary ) يقال لها أنواع بدائية ( Basic Data type ) أو أنواع تأتي ضمن اللغة مباشرةً ( Built-in ) و غير ذلك و لكن الفكرة هي نفسها و هذه كلها إختلافات غير مهمة على الإطلاق.

أنواع البيانات الأولية في C++

أهم أنواع البيانات الأولية في C++ و أكثرها استخداماً هي:
int - float - double - bool - char


النوع int

يستخدم هذا النوع لتخزين عدد صحيح, أي عدد لا يحتوي على فاصلة عشرية.

مثال

int x = 10;
	


النوع float

يستخدم هذا النوع لتخزين عدد يمكن أن يحتوي على فاصلة عشرية.
يمكن لهذا العدد أن يحتوي على 7 أرقام بعد الفاصلة.

مثال

float x = 12.5;
	


النوع double

يستخدم هذا النوع لتخزين عدد يمكن أن يحتوي على فاصلة عشرية.
يمكن لهذا العدد أن يحتوي على 15 رقم بعد الفاصلة لهذا يعتبر أكثر دقة من النوع float في العمليات الحسابية الدقيقة.

مثال

double x = 12.5;
	


النوع bool

يستخدم هذا النوع لتخزين إما القيمة true و إما القيمة false.

مثال

bool x = true;
	


النوع char

يستخدم هذا النوع لتخزين حرف أجنبي أو لتخزين عدد صحيح قيمته تمثل حرف نسبةً لرقم الآسكي كود ( ASCII Code ) الخاص به.
فمثلاً char x = 65; نفسها تماماً إن كتبت char x = 'A';.
سبب تحول الرقم 65 إلى الحرف 'A' في الذاكرة هو أنه في نظام ASCII الرقم 65 يمثل الحرف 'A'.

مثال

char x = 'A';
	

ملاحظة

النوع char يمكنه تخزين أي حرف أجنبي بدون مشاكل لأن الحرف الأجنبي يحتاج مساحة 1Byte من الذاكرة فقط حتى يتم تخزينه.
بينما الحرف العربي يحتاج مساحة 2Bytes من الذاكرة حتى يتم تخزينه بشكل صحيح.

لهذا السبب, عند التعامل مع الأحرف العربية يستحسن تخزين الحرف الواحد كمصفوفة نوعها char تتألف من عنصرين أو كنص عادي نوعه string.
لا داعي للقلق بشأن تخزين الأحرف العريبة لأن ما ذكرناه الآن سيمر معك في دروس لاحقة.

تحديد خصائص أنواع البيانات في C++

في C++ يوجد مجموعة كلمات يقال لها Data Type Modifiers يمكنك استخدامها لتحديد خصائص القيم التي يمكن تخزينها, مثل هي يمكن أن تكون قيم أصغر من صفر أم لا, بالإضافة إلى تكبير حجم المساحة التي يتم تخصيصها لكل نوع في الذاكرة مما يجعلك قادر على تخزين قيم أكبر.

الأنواع char و int و double يمكن تحديد خصائص القيم التي يمكن تخزينها فيها إذا أضفنا معها إحدى الكلمات التالية:

  • signed نضيفها لأحد الأنواع السابقة إذا أردنا تحديد أن قيمة المتغير لا يهم إن كانت أكبر, أصغر أو تساوي صفر.

  • unsigned نضيفها لأحد الأنواع السابقة إذا أردنا تحديد أن قيمة المتغير لا يمكن أن تكون أصغر من صفر.

  • short نضيفها لأحد الأنواع السابقة إذا أردنا تحديد أن حجم الذاكرة التي سيتم تخصيصها للمتغير هو 2Byte.

  • long نضيفها لأحد الأنواع السابقة إذا أردنا تحديد أن حجم الذاكرة التي سيتم تخصيصها للمتغير هو 8Byte.


معلومة تقنية

إفتراضياً الأنواع char - int - float - double جميعا تعتبر signed حتى لو لم تحدد ذلك بنفسك لهذا السبب تستطيع تخزين قيم أصغر من صفر فيها.


خصائص أنواع البيانات

الجدول التالي يوضح المساحة التي يحتاجها كل نوع في الذاكرة و القيم التي يمكن تخزينها فيه سواء تم استخدام النوع لوحده أو تم تحديد خصائصه.

النوع الحجم في الذاكرة القيمة التي يمكن تخزينها
char 1Byte بين -128 و 127
unsigned char 1Byte بين 0 و 255
short int 2Bytes بين -32768 و 32767
unsigned short int 2Bytes بين 0 و 65535
int 4Bytes بين -2147483648 و 2147483647
unsigned int 4Bytes بين 0 و 4294967295
long int 4Bytes بين -2147483648 و 2147483647
unsigned long int 4Bytes بين 0 و 4294967295
long long int 8Bytes بين -9223372036854775808 و 9223372036854775807
unsigned long long int 8Bytes بين 0 و 18446744073709551615
float 4Bytes بين 1.17549e-038 و 3.40282e+038
double 8Bytes بين 2.22507e-308 و 1.79769e+308
long double 12Bytes بين 3.3621e-4932 و 1.18973e+4932

في حال أردت استخدام أي نوع مع تحديده خصائصه فيمكنك استخدام أي نوع تم ذكره في الجدول كالتالي.

مثال

// short int هنا استخدامنا النوع
	  short int x = 4545;

	  // long long int هنا استخدامنا النوع
	  long long int y = -50050012;

	  // unsigned long int هنا استخدامنا النوع
	  unsigned long int = 880045023;
	

هناك الكثير من الأنواع الجاهزة التي يمكنك استخدامها و لكننا تطرقنا لأشهرها و الأكثر استخداماً من بينها. و نود الإشارة إلى أن خصائص الأنواع المذكورة قد تختلف قليلاً بحسب المترجم المستخدم لتفسير كود لغة C++ للحاسوب و لكن هذا الأمر ليس شيء عليك القلق بشأنه خاصةً في هذه المرحلة.


في الدرس التالي ستتعلم جميع الأساليب التي تستطيع اتباعها لتعريف متغيرات تستخدم أنواع البيانات التي تعلمناها في هذا الدرس.

مفهوم المتغيرات في C++

المتغيرات ( variable ) عبارة عن أماكن يتم حجزها في الذاكرة بهدف تخزين بيانات فيها أثناء تشغيل البرنامج.
النوع الذي نعطيه للمتغير يجعل نظام التشغيل يحدد نوع البيانات الذي يمكن تخزينه في المساحة المحجوزة لهذا المتغير في الذاكرة.

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

مثال

main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;             // قيمته تساوي 10 a هنا قمنا بتعريف متغير إسمه
	  cout << "a = " << a;    // a هنا قمنا بطباعة قيمة المتغير

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 10
	

أساليب تعريف المتغيرات في C++

في البداية أنواع المتغيرات هي نفسها أنواع البيانات الأولية التي ذكرناها في الدرس السابق و هي:
int - float - double - bool - char

الآن, من خلال الأمثلة سنعلمك عدة أساليب يمكنك إتباعها لتعريف المتغيرات و تصغير حجم الكود.


المثال الأول

في حال كنت تريد تعريف عدة متغيرات من نفس النوع و بدون إعطائهم قيم أولية.

تستطيع تعريفهم هكذا.

                    int a;
	  int b;
	  int c;
	

و تستطيع إختصار الكود كالتالي.

                    int a, b, c;
	

المثال الثاني

في حال كنت تريد تعريف عدة متغيرات من نفس النوع و إعطائهم قيم مباشرةً عند إنشائهم.

تستطيع تعريفهم هكذا.

                    int a = 10;
	  int b = 20;
	  int c = 30;
	

و تستطيع إختصار الكود كالتالي.

                    int a=10, b=20, c=30;
	

المثال الثالث

في حال كنت تريد تعريف عدة متغيرات من نفس النوع و لكن طبيعتهم مختلفة و بدون قيم.
هنا بالرغم من أن a عبارة عن متغير, b عبارة عن مصفوفة أحادية, و c عبارة عن مصفوفة ثنائية; إلَا أنهم جميعهم نوعهم int.

تستطيع تعريفهم هكذا.

                    int a;
	  int b[5];
	  int c[3][4];
	

و تستطيع إختصار الكود كالتالي.

                    int a, b[5], c[3][4];
	

مصطلحات مهمة حول المتغيرات في C++

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

  • عملية تعريف متغير بدون إعطائه قيمة تسمى Declaration.

  • عملية إعطاء قيمة لمتغير تم إنشاؤه سابقاً تسمى Assigning.

  • عملية تعريف متغير و إعطائه قيمة مباشرةً عند إنشائه تسمى Initialisation.


أمثلة شاملة

هنا فعلنا Declare لمتغير جديد, أي قمنا بتعريف متغير جديد بدون إعطائه قيمة أولية.

                    int a;
	

هنا فعلنا Assign لمتغير, أي قمنا بإعطاء قيمة لمتغير كان في الأصل موجوداً.

                    a = 10;
	

هنا فعلنا Initialise لمتغير جديد, أي قمنا بإنشاء متغير جديد و إعطائه قيمة أولية.

                    double Sum = 0;
	

ملاحظة

إذا قمت بتعريف متغير بدون إعطائه أي قيمة, ثم حاولت طباعة قيمته فإن مترجم لغة C++ يقوم بإرجاع آخر قيمة كانت موجودة في الذاكرة مكان هذا المتغير.
إذاً هذا الأمر يحدث في حال حاولت طباعة قيمة متغير لم تفعل له سوى Declare.

إرشادات مهمة لمعالجة الأخطاء في C++

بعد أن فهمت المصطلحات الأساسية الخاصة بالمتغيرات, سنقوم الآن بإعطائك بعض الأمثلة التي تحتوي على أخطاء مقصودة لتعليمك كيف تعرف طبيعة الخطأ و بالتالي كيف تصلح الخطأ بنفسك.


الخطأ الأول

أحياناً يقوم المبرمج بتعريف متغير و عرض قيمته قبل أن يعطيه أي قيمة فيظهر له قيم عشوائية فيه.
أي المشكلة أنه حاول عرض قيمة متغير فعل له Declare فقط بدون أن يفعل له Assign.

مثال

main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a;                  // بدون إعطائه أي قيمة أولية a هنا قمنا بتعريف متغير إسمه
	  cout << "a = " << a;    // a هنا قمنا بطباعة قيمة المتغير

	  return 0;
	  }
	

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.
القيمة التي تظهر في المتغير a هي قيمة عشوائية كانت موجودة في الذاكرة كما ذكرنا قبل قليل.

                    a = 4360638
	

في برنامج CodeBlocks سيظهر لك التحذير التالي الذي يعني أنك تحاول طباعة قيمة متغير لا يملك قيمة في الأساس.

warning: 'a' is used uninitialized in this function [-Wuninitialized]


الخطأ الثاني

أحياناً يقوم المبرمج بوضع إسم متغير بدون أن يكون قد قام بتعريف هذا المتغير من قبل.
أي المشكلة أنه نسيَ أن يفعل له Declare. من الأساس و هذا الأمر يؤدي لعدم تشغيل البرنامج كله.

مثال

main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  cout << "a = " << a;    // مع أننا لم نقم بتعريفه بالأساس a هنا قمنا بطباعة قيمة

	  return 0;
	  }
	

سيظهر لك الخطأ التالي عند التشغيل و الذي يعني أنك تحاول طباعة قيمة متغير لم تقم بتعريفه بالأساس.

error: 'a' was not declared in this scope

الخطأ الثالث

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

الأن عليك معرفة أنه في حال كانت القيمة التي تحاول تخزينها في المتغير أكبر من القيمة التي يمكن تخزينها فيه, سيتم وضع جزء منها في المتغير و ليس القيمة التي كنت تريد تخزينها فيه و بالتالي ستخسر القيمة الحقيقية التي كنت تريد تخزينها. هذا الأمر يجب أن تنتبه له جيداً حتى تخزّن البيانات بشكل صحيح بدون فقدان أي جزء منها.

الآن, بما أن النوع int يمكنه أن يخزن القيمة 2147483647 كحد أقصى كما شاهدنا في الدرس السابق, لاحظ ما سيحدث إن حاولنا تخزين قيمة أكبر من القيمة القصوى التي يمكن أن يستوعبها فيه.

مثال

main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10000000000000;     // و نحن ندرك أنه لا يمكن تخزين هذه القيمة الكبيرة فيه a هنا قمنا بوضع قيمة في المتغير
	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.
القيمة التي تظهر في المتغير a هي جزء من القيمة التي كنت تحاول تخزينها في المتغير كما ذكرنا قبل قليل.

                    a = 1316134912
	

في برنامج CodeBlocks سيظهر لك التحذير [Overflow] الذي يعني أن المساحة المخصصة للمتغير في الذاكرة لا يمكنها أن تستوعب القيمة التي تحاول تخزينها فيه.

warning: overflow in implicit constant conversion [-Woverflow]

في الدرس التالي سنتعرف على الرموز التي يمكن أن نستخدمها في الكود و التي تسمى بالعوامل.

مفهوم العوامل في C++

العوامل ( operators ) عبارة عن رموز لها معنى محدد, و يمكننا تقسيم العوامل إلى 5 مجموعات أساسية كالتالي:

  • Arithmetic Operators

  • Comparison Operators

  • Logical Operators

  • Bitwise Operators

  • Assignment Operators


هناك أيضاً عوامل أخرى, سنراها في آخر الدرس.

العوامل التي تستخدم في العمليات الحسابية (Arithmetic Operators)

إسم العامل رمزه مثال شرح الكود
Assignment = a = b أعطي a قيمة b
Addition + a + b أضف قيمة b على قيمة a
Subtraction - a - b إطرح قيمة b من قيمة a
Unary plus + +a أضرب قيمة a بالعامل +
Unary minus - -a أضرب قيمة a بالعامل -
Multiplication * a * b أضرب قيمة a بقيمة b
Division / a / b أقسم قيمة a على قيمة b
Modulo % a % b للحصول على آخر رقم يبقى عندما نقسم قيمة a على قيمة b
Increment ++ a++ لإضافة 1 على قيمة a و تستخدم في الحلقات
Decrement -- a-- لإنقاص 1 من قيمة a و تستخدم في الحلقات

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++العوامل التي تستخدم في العمليات الحسابية

العامل = (Assignment Operator)

العامل = يستخدم لإعطاء قيمة للمتغير.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 5;     // 5 القيمة a أعطينا المتغير
	  int b = a;     // a قيمة المتغير b أعطينا المتغير

	  cout << "a = " << a << endl;
	  cout << "b = " << b;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 5
	  b = 5
	


العامل + (Addition Operator)

العامل + يستخدم لإضافة قيمة على قيمة, أي في عمليات الجمع.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 3;
	  int b = 4;

	  int c = a + b;   // c = 3 + 4 = 7

	  cout << "c = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    c = 7
	


العامل - (Subtraction Operator)

العامل - يستخدم لإنقاص قيمة من قيمة, أي في عمليات الطرح.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 3;
	  int b = 4;

	  int c = a - b;   // c = 3 - 4 = -1

	  cout << "c = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    c = -1
	


العامل + (Unary-Plus Operator)

يعني ضرب القيمة بالعامل +.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // b لها في المتغير Unary-Plus قيمة أكبر من صفر, ثم وضعنا قيمة الـ a هنا وضعنا في المتغير
	  int a = 10;
	  int b = +a;        // b = +(10) = 10

	  cout << "b = " << b << endl;

	  // b لها في المتغير Unary-Plus قيمة أصغر من صفر, ثم وضعنا قيمة الـ a هنا وضعنا في المتغير
	  a = -10;
	  b = +a;           // b = +(-10) = -10

	  cout << "b = " << b;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    b = 10
	  b = -10
	


العامل - (Unary-Minus Operator)

يعني ضرب القيمة بالعامل -.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // b لها في المتغير Unary-Minus قيمة أكبر من صفر, ثم وضعنا قيمة الـ a هنا وضعنا في المتغير
	  int a = 10;
	  int b = -a;        // b = -(10) = -10

	  cout << "b = " << b << endl;

	  // b لها في المتغير Unary-Minus قيمة أصغر من صفر, ثم وضعنا قيمة الـ a هنا وضعنا في المتغير
	  a = -10;
	  b = -a;           // b = -(-10) = 10

	  cout << "b = " << b;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    b = -10
	  b = 10
	


العامل * (Multiplication Operator)

العامل * يستخدم لضرب قيمة بقيمة, أي في عمليات الضرب.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 6;
	  int b = 5;

	  int c = a * b;     // c = 6 * 5 = 30

	  cout << "c = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    c = 30
	


العامل / (Division Operator)

العامل / يستخدم لقسمة قيمة على قيمة, أي في عمليات القسمة.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 8;
	  int b = 5;

	  int c = a / b;     // c = 8 / 5 = 1

	  cout << "c = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    c = 1
	

ملاحظة: سبب عدم ظهور أي أرقام بعد الفاصلة هو أننا عرفنا المتغيرات كأعداد صحيحة int.



العامل % (Modulo Operator)

العامل % يقال له الـ Modulo و يسمى Remainder في الرياضيات و هو آخر رقم يبقى من عملية القسمة.
إذاً نستخدم الـ Modulo للحصول على آخر رقم يبقى من عملية القسمة.
و له فوائد كثيرة, فمثلاً يمكننا إستخدامه لمعرفة ما إذا كان الرقم مفرد أو مزدوج ( أي Even or Odd ) و هذا شرحناه بتفصيل في مادة الخوارزميات.

في هذا المثال سنقوم بتخزين الرقم الذي يبقى من القسمة في المتغير c.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 8;
	  int b = 5;

	  int c = a % b;     // c = 8 % 5 = 3

	  cout << "c = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    c = 3
	


العامل ++ (Increment Operator)

العامل ++ يستخدم لزيادة قيمة المتغير واحداً, و هذا الأسلوب يستخدم كثيراً في الحلقات لزيادة قيمة العداد واحداً في كل دورة بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 5;

	  a++;     // a = 5 + 1 = 6

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 6
	


العامل -- (Decrement Operator)

العامل -- يستخدم لإنقاص قيمة المتغير واحداً, و هذا الأسلوب يستخدم كثيراً في الحلقات لإنقاص قيمة العداد واحداً في كل دورة بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 5;

	  a--;     // a = 5 - 1 = 4

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 4
	

العوامل التي تستخدم في المقارنات (Comparison Operators)

إسم العامل رمزه مثال شرح الكود
Equal to == (a == b) هل قيمة a تساوي قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true
Not equal to != (a != b) هل قيمة a لا تساوي قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true
Greater than > (a > b) هل قيمة a أكبر من قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true
Less than < (a < b) هل قيمة a أصغر من قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true
Greater than
or Equal to
>= (a >= b) هل قيمة a أكبر أو تساوي قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true
Less than
or Equal to
<= (a <= b) هل قيمة a أصغر أو تساوي قيمة b ؟
إذا كان الجواب نعم فإنها ترجع true

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++ العوامل التي تستخدم للمقارنة

العامل == (Equal To Operator)

العامل == يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول تساوي قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول تساوي قيمة المتغير الثاني؟

  • إذا كانت تساويها سيكون الجواب true و بالتالي سينفذ الكود.

  • أما إذا لم تكن تساويها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 10;
	  int c = 20;

	  // سيتم تنفيذ أمر الطباعة b تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == b )
	  {
	  cout << "a = b";
	  }

	  // سيتم تنفيذ أمر الطباعة c تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == c )
	  {
	  cout << "a = c";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = b
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الأول لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الثاني لأن جواب الشرط كان false.



العامل != (Not Equal To Operator)

العامل != يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول لا تساوي قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول لا تساوي قيمة المتغير الثاني؟

  • إذا كانت لا تساويها سيكون الجواب true و بالتالي سينفذ الكود.

  • أما إذا كانت تساويها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 10;
	  int c = 20;

	  // سيتم تنفيذ أمر الطباعة b لا تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a != b )
	  {
	  cout << "a != b";
	  }

	  // سيتم تنفيذ أمر الطباعة c لا تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a != c )
	  {
	  cout << "a != c";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a != c
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الثاني لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الأول لأن جواب الشرط كان false.



العامل > (Greater Than Operator)

العامل > يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول أكبر من قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول أكبر من قيمة المتغير الثاني؟

  • إذا كانت أكبر منها سيكون الجواب true و بالتالي سينفذ الكود.

  • إذا لم تكن أكبر منها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 5;

	  // سيتم تنفيذ أمر الطباعة b أكبر من قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a > b )
	  {
	  cout << "a > b";
	  }

	  // سيتم تنفيذ أمر الطباعة a أكبر من قيمة المتغير b الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( b > a )
	  {
	  cout << "b > a";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a > b
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الأول لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الثاني لأن جواب الشرط كان false.



العامل < (Less Than Operator)

العامل < يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول أصغر من قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول أصغر من قيمة المتغير الثاني؟

  • إذا كانت أصغر منها سيكون الجواب true و بالتالي سينفذ الكود.

  • إذا لم تكن أصغر منها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 5;

	  // سيتم تنفيذ أمر الطباعة b أصغر من قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a < b )
	  {
	  cout << "a < b";
	  }

	  // سيتم تنفيذ أمر الطباعة a أصغر من قيمة المتغير b الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( b < a )
	  {
	  cout << "b < a";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    b < a
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الثاني لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الأول لأن جواب الشرط كان false.



العامل >= (Greater Than or Equal To Operator)

العامل >= يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول أكبر أو تساوي قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول أكبر أو تساوي قيمة المتغير الثاني؟

  • إذا كانت أكبر منها أو تساويها سيكون الجواب true و بالتالي سينفذ الكود.

  • إذا لم تكن أكبر منها أو تساويها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 5;
	  int b = 5;
	  int c = 10;

	  // سيتم تنفيذ أمر الطباعة b أكبر أو تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a >= b )
	  {
	  cout << "a >= b" << endl;
	  }

	  // سيتم تنفيذ أمر الطباعة c أكبر أو تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a >= c )
	  {
	  cout << "a >= c" << endl;
	  }

	  // سيتم تنفيذ أمر الطباعة a أكبر أو تساوي قيمة المتغير c الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( c >= a )
	  {
	  cout << "c >= a" << endl;
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a >= b
	  c >= a
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الأول و الثالث لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الثاني لأن جواب الشرط كان false.



العامل <= (Less Than or Equal To Operator)

العامل <= يستخدم لتنفيذ كود معين إذا كانت قيمة المتغير الأول أصغر أو تساوي قيمة المتغير الثاني.

عندما نضعه في الشرط فإنه يعني هل قيمة المتغير الأول أصغر أو تساوي قيمة المتغير الثاني؟

  • إذا كانت أصغر منها أو تساويها سيكون الجواب true و بالتالي سينفذ الكود.

  • إذا لم تكن أصغر منها أو تساويها سيكون الجواب false و بالتالي لن ينفذ الكود.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 5;
	  int b = 5;
	  int c = 10;

	  // سيتم تنفيذ أمر الطباعة b أصغر أو تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a <= b )
	  {
	  cout << "a <= b" << endl;
	  }

	  // سيتم تنفيذ أمر الطباعة c أصغر أو تساوي قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a <= c )
	  {
	  cout << "a <= c" << endl;
	  }

	  // سيتم تنفيذ أمر الطباعة a أصغر أو تساوي قيمة المتغير c الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( c <= a )
	  {
	  cout << "c <= a" << endl;
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a <= b
	  a <= c
	

نلاحظ أنه نفذ أمر الطباعة الموضوع في الشرط الأول و الثاني لأن جواب الشرط كان true.
لم ينفذ أمر الطباعة الموضوع في الشرط الثالث لأن جواب الشرط كان false.

العوامل التي تستخدم في وضع شروط منطقية (Logical Operators)

إسم العامل رمزه مثال شرح الكود
AND && (a && b) هل قيمة a و b تساويان true ؟
هنا يجب أن يتم تحقيق الشرطين ليرجع true
OR || (a || b) هل قيمة a أو b أو كلاهما تساويان true ؟
هنا يكفي أن يتم تحقيق شرط واحد من الشرطين ليرجع true
NOT ! !a هل قيمة a لا تساوي true ؟
إذا كان الجواب نعم فإنها ترجع true

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++العوامل التي تستخدم لوضع شروط منطقية

العامل && (AND Operator)

العامل && يستخدم لتنفيذ كود معين إذا تحقق الشرط الأول و الشرط الثاني.

  • أي إذا كانت نتيجة الشرط الأول تساوي true و نتيجة الشرط الثاني تساوي true سينفذ الكود.

  • إذا لم تكن نتيجة كلا الشرطين تساوي true لن ينفذ الكود.


المثال الأول

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  // تساوي 20 سيتم تنفيذ أمر الطباعة b تساوي 10, و قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == 10 && b == 20 )
	  {
	  cout << "The first and the second conditions return true";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    The first and the second conditions return true
	

نلاحظ أنه نفذ أمر الطباعة لأن جواب الشرطين الموضوعين في الجملة if هو true.


المثال الثاني

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  // تساوي 50 سيتم تنفيذ أمر الطباعة b تساوي 10, و قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == 10 && b == 50 )
	  {
	  cout << "The first and the second conditions return true";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

	

نلاحظ أنه لم ينفذ أمر الطباعة لأن جواب الشرط الثاني الموضوع في الجملة if هو false.



العامل || (OR Operator)

العامل || يستخدم لتنفيذ كود معين إذا تحقق على الأقل واحد من الشروط الموضوعة.
إذاً هنا يكفي أن يرجع أحد الشرطين القيمة true حتى يتم تنفيذ الأوامر الموضوعة.


المثال الأول

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  // تساوي 50 سيتم تنفيذ أمر الطباعة b تساوي 10, أو قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == 10 || b == 50 )
	  {
	  cout << "One of the conditions return true";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    One of the conditions return true
	

نفذ أمر الطباعة لأن جواب الشرط الأول الموضوع في الجملة if هو true.


المثال الثاني

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  // تساوي 50 سيتم تنفيذ أمر الطباعة b تساوي 50, أو قيمة المتغير a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( a == 50 || b == 50 )
	  {
	  cout << "One of the conditions return true";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

	

نلاحظ أنه لم ينفذ أمر الطباعة لأن جواب الشرط الأول و الثاني الموضوعين في الجملة if هو false.



العامل ! (NOT Operator)

العامل ! يستخدم لتنفيذ كود معين إذا لم يتحقق أي شرط تم وضعه.
أي إذا أرجع الشرط أو جميع الشروط الموضوعة القيمة false سيتم تنفيذ الأوامر الموضوعة.


المثال الأول

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;

	  // لا تساوي 10 سيتم تنفيذ أمر الطباعة a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( !(a == 10) )
	  {
	  cout << "The condition return false";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

	

لم ينفذ أمر الطباعة لأن جواب الشرط هو true.


المثال الثاني

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;

	  // لا تساوي 20 سيتم تنفيذ أمر الطباعة a الشرط التالي يعني أنه إذا كانت قيمة المتغير
	  if( !(a == 20) )
	  {
	  cout << "The condition return true";
	  }

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    The condition return true
	

نفذ أمر الطباعة لأن جواب الشرط هو false.

العوامل التي تستخدم للتعامل مع الـ bits (Bitwise Operators)

إسم العامل رمزه مثال شرح الكود
Bitwise AND & a & b العامل & يحسب ناتج جمع الـ bits المشتركة بين a و b
Bitwise OR | a | b العامل | يحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين a و b
Bitwise XOR ^ a ^ b العامل ^ يحسب ناتج جمع الـ bits الغير مشتركة بين a و b
Bitwise compliment OR ~ ~a العامل ~ يقلب الـ bits التي تساوي 0 إلى 1 و يقلب الـ bits التي تساوي 1 إلى 0,
ثم يضيف عليهم 1 و يحسب ناتج جمعهم, بعدها يضرب الجواب بالعامل ( - ) ثم يعطينا جواب سلبي.
Left shift << a << 2 العامل << يزيح الـ bits من آخر اليسار إلى أول اليمين.
العدد 2 يعني أننا سنزيح آخر إثنين bits و نضعهم في الأول.
Right shift >> a >> 2 العامل >> يزيح الـ bits من أول اليمين إلى آخر اليسار.
العدد 2 يعني أننا سنزيح أول إثنين bits و نضعهم في الأخير.

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++العوامل التي تستخدم للتعامل مع الـ Bits

العامل & (Bitwize AND)

العامل & يحسب ناتج جمع الـ bits المشتركة بين قيمتين.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;      // a = 10 = 00000000000000000000000000001010
	  int b = 75;      // b = 75 = 00000000000000000000000001001011

	  int c = a & b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a << " & " << b << " = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    10 & 75 = 10
	

هنا قمنا بتعليم الـ bits المشتركة و التي تم جمعها باللون الاصفر.

a = 10;      // 10 = 00000000000000000000000000001010
b = 75;      // 75 = 00000000000000000000000001001011

c = a & b;   //  c = 00000000000000000000000000001010
             //  c = 10


العامل | (Bitwize OR)

العامل | يحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين قيمتين.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;      // 10 = 00000000000000000000000000001010
	  int b = 75;      // 75 = 00000000000000000000000001001011

	  int c = a | b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a << " | " << b << " = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    10 | 75 = 75
	

هنا قمنا بتعليم الـ bits المشتركة و الغير مشتركة و التي تم جمعها باللون الاصفر.

a = 10;      // 10 = 00000000000000000000000000001010
b = 75;      // 75 = 00000000000000000000000001001011

c = a | b;   //  c = 00000000000000000000000001001011
             //  c = 75


العامل ^ (Bitwize XOR)

العامل ^ يحسب ناتج جمع الـ bits الغير مشتركة بين قيمتين.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;      // 10 = 00000000000000000000000000001010
	  int b = 75;      // 75 = 00000000000000000000000001001011

	  int c = a ^ b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a << " ^ " << b << " = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    10 ^ 75 = 65
	

هنا قمنا بتعليم الـ bits الغير مشتركة و التي تم جمعها باللون الاصفر.

a = 10;      // 10 = 00000000000000000000000000001010
b = 75;      // 75 = 00000000000000000000000001001011

c = a | b;   //  c = 00000000000000000000000001000001
             //  c = 65


العامل ~ (Bitwize Compliment OR)

العامل ~ يقلب الـ bits التي تساوي 0 إلى 1 و يقلب الـ bits التي تساوي 1 إلى 0.
بعدها يتم حساب الناتج باتباع مبدأ single precision floating point number.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;     // 10 = 00000000000000000000000000001010
	  int c = ~a;     //  c = 11111111111111111111111111110111 = -11

	  cout << "~" << a << " = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    ~10 = -11
	


العامل << (Left Shift)

العامل << يمسح bits من ناحية اليسار ثم يبدل كل bit تم مسحها منهم بصفر و يضعهم من ناحية اليمين.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;       // 10 = 00000000000000000000000000001010
	  int c = a << 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a << " << 2 = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    10 << 2 = 40
	

هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = 10;       // 10 = 00000000000000000000000000001010

c = a << 2;   //  c = 00000000000000000000000000101000 = 40
              //  c = 40


العامل >> (Right Shift)

العامل >> عندها حالتين: قد يكون العدد أكبر من صفر أو أصغر من صفر.

  • إذا كان العدد أكبر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بصفر و يضعهم من ناحية اليسار.

  • إذا كان العدد أصغر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بواحد ليحافظ على إشارة الناقص و يضعهم من ناحية اليسار.


المثال الأول

الحالة الأولى: إذا كان العدد أكبر من صفر.

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 9;        // 9 = 00000000000000000000000000001001
	  int c = a >> 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a << " >> 2 = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

9 >> 2 = 2

هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = 9;        // 9 = 00000000000000000000000000001001

c = a >> 2;   // c = 00000000000000000000000000000010
              // c = 2

المثال الثاني

الحالة الثانية: إذا كان العدد أصغر من صفر.

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // Note " >> " converts the number in 32 bits form

	  int a = -9;       // -9 = 11111111111111111111111111111000
	  int c = a >> 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

	  cout << a <<  " >> 2 = " << c;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    -9 >> 2 = -3
	

هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = -9;       // -9 = 11111111111111111111111111110111

c = a >> 2;   //  c = 11111111111111111111111111111101
              //  c = -3

العوامل التي تستخدم لإعطاء قيم للمتغيرات (Assignment Operators)

إسم العامل رمزه مثال شرح الكود
Basic Assignment = a = b ضع قيمة b في a.
Add AND Assignment += a += b أضف قيمة a على قيمة b و خزن الناتج في a
Susbtract AND Assignment -= a -= b أنقص قيمة a من قيمة b و خزن الناتج في a
Multiply AND Assignment *= a *= b أضرب قيمة a بقيمة b و خزن الناتج في a
Divide AND Assignment /= a /= b أقسم قيمة a على قيمة b و خزن الناتج في a
Modulo AND Assignment %= a %= b أقسم قيمة a على قيمة b و خزن آخر رقم يبقى من عملية القسمة في a
Left shift AND Assignment <<= a <<= 2 أزح آخر إثنين bits و ضعهم في الأول ثم خزن الناتج في a
Right shift AND Assignment >>= a >>= 2 أزح أول اثنين bits و ضعهم في الآخر ثم خزن الناتج في a
Bitwise AND Assignment &= a &= b أحسب ناتج جمع الـ bits المشتركة بين a و b و خزن الناتج في a
Bitwise exclusive OR and Assignment ^= a ^= b أحسب ناتج جمع الـ bits الغير مشتركة بين a و b و خزن الناتج في a
Bitwise inexclusive OR and Assignment |= a |= b أحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين a و b و خزن الناتج في a

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++العوامل التي تستخدم لإعطاء قيم للمتغيرات

العامل = (Basic Assign)

العامل = يستخدم لإعطاء قيمة لمتغير.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 10
	


العامل += (Add and Assign)

العامل += يستخدم لإضافة قيمة ما على قيمة المتغير بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  a += b;        // a  =  a + b  =  10 + 20  =  30

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 30
	


العامل -= (Susbtract and Assign)

العامل -= يستخدم لطرح قيمة ما من قيمة المتغير بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  a -= b;           // a  =  a - b  =  10 - 20  =  -10

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = -10
	


العامل *= (Multiply and Assign)

العامل *= يستخدم لضرب قيمة المتغير بقيمة ما بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 20;

	  a *= b;   // a  =  a * b  =  10 * 20  =  200

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 200
	


العامل /= (Divide and Assign)

العامل /= يستخدم لقسم قيمة المتغير على قيمة ما بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 100;
	  int b = 20;

	  a /= b;   //   a  =  a / b  =  100 / 20  =  5

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 5
	


العامل %= (Modulo and Assign)

العامل %= يستخدم لتخزين الباقي من قسمة قيمة المتغير على قيمة ما بكود أقل.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 7;

	  a %= b;   //   a  =  a % b  =  10 % 7  =  3

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 3
	


العامل <<= (Left shift and Assign)

في المثال التالي, العامل <<= يعني إمسح bits من ناحية اليسار ثم بدل كل bit تم مسحها منهم بصفر و ضعهم من ناحية اليمين ثم ضع الناتج في المتغير من جديد.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  a <<= 2;   //   a  =  a << 2  =  00000000000000000000000000001010 << 2  =  00000000000000000000000000101000  =  40

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 40
	


العامل >>= (Right shift and Assign)

في المثال التالي, العامل >>= يعني إمسح bits من ناحية اليمين ثم بدل كل bit تم مسحها منهم بصفر و ضعهم من ناحية اليسار ثم ضع الناتج في المتغير من جديد.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  a >>= 2;   //   a  =  a >> 2  =  00000000000000000000000000001010 >> 2  =  00000000000000000000000000000010  =  2

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 2
	


العامل &= (Bitwise and Assign)

العامل &= يعني أحسب ناتج جمع الـ bits المشتركة بين المتغير a و المتغير b ثم خزن الناتج في المتغير a.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 75;

	  a &= b;   //   a  =  a & b  =  00000000000000000000000000001010  &  00000000000000000000000001001011  =  00000000000000000000000000001010  =  10

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 10
	


العامل |= (Bitwise exclusive OR and Assign)

العامل |= يعني أحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين المتغير a و المتغير b ثم خزن الناتج في المتغير a.

مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;
	  int b = 75;

	  a |= b;   //   a  =  a | b  =  00000000000000000000000000001010  |  00000000000000000000000001001011  =  00000000000000000000000001001011  =  75

	  cout << "a = " << a;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    a = 75
	

عوامل أخرى مهمة في C++

إسم العامل رمزه إستخدامه
Conditional ?: يطلق عليه أيضاً إسم Ternary Operator لأنه يأخذ ثلاث عناصر ليعمل.
يمكن إستعماله بدل جمل الشرط if و else في حال كنت تريد إعطاء قيمة للمتغير.
Size of sizeof() يستخدم لمعرفة حجم المساحة المخصصة في الذاكرة لأي شيء يتم تمريره بين القوسين.
الرقم الذي يتم إرجاعه يمثل الحجم بالـ Byte.
Address & يستخدم لمعرفة عنوان المساحة المخصصة في الذاكرة للشيء الذي يتم وضعه بعده مباشرةً.
العنوان الذي يتم إرجاعه يتم إرجاعه بشكل Hexadecimal.
Pointer * يستخدم لوضع مؤشر لشيء تم تعريفه مما يجعلك قادر على الوصول إليه بشكل مباشر من أي مكان تريد من خلال عنوانه في الذاكرة.
Comma , تستخدم الفاصلة لتنفيذ أكثر من عملية حسابية و من ثم إسناد قيمتها كلها في متغير واحد.
مع الإشارة إلى أنه يجب وضع فاصلة بين كل عملتين تفوم بوضعهما.

هنا وضعنا مثال لكل عامل موجود في الجدول شاهد الأمثلة »

C++عوامل أخرى مهمة

العامل ?: (Conditional Operator)

العامل ?: يقال له Conditional أو Ternary Operator لأنه يأخذ ثلاث عناصر ليعمل.
يمكن إستعماله بدل جمل الشرط if و else في حال كنت تريد إعطاء قيمة للمتغير.


بناؤه

variable x = (expression) ? value if true : value if false
  • expression:   يمثل الشرط الذي نضعه.

  • value if true:   تمثل القيمة التي ستعطى للمتغير x إذا تحقق الشرط نضعها بعد الرمز ?.

  • value if false:   تمثل القيمة التي ستعطى للمتغير x إذا لم يتحقق الشرط نضعها بعد الرمز :.



المثال الأول

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;

	  // b إن لم تكن كذالك سيتم وضع القيمة 30 في المتغير ,b تساوي 1 سيتم وضع القيمة 20 في المتغير a إذا كانت قيمة المتغير
	  int b = (a == 1) ?20 :30;

	  cout << "b = " << b;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    b = 30
	

نلاحظ أنه تم وضع القيمة 30 في b لأن نتيجة الشرط كانت false.


المثال الثاني

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  int a = 10;

	  // b إن لم تكن كذالك سيتم وضع القيمة 30 في المتغير ,b أكبر من 1 سيتم وضع القيمة 20 في المتغير a إذا كانت قيمة المتغير
	  int b = (a > 1) ?20 :30;

	  cout << "b = " << b;

	  return 0;
	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    b = 20
	

نلاحظ أنه تم وضع القيمة 20 في b لأن نتيجة الشرط كانت true.

العامل sizeof() (Size Of Operator)

يستخدم لمعرفة حجم المساحة المخصصة في الذاكرة لأي شيء يتم تمريره بين القوسين.
الرقم الذي يتم إرجاعه يمثل الحجم بالـ Byte.


المثال الأول

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // C++ هنا قمنا بطباعة الحجم الذي يتطلبه كل نوع جاهز في لغة
	  cout << "Size of char: " << sizeof(char) << endl;
	  cout << "Size of int: " << sizeof(int) << endl;
	  cout << "Size of float: " << sizeof(float) << endl;
	  cout << "Size of double: " << sizeof(double) << endl;
	  cout << "Size of short int: " << sizeof(short int) << endl;
	  cout << "Size of long int: " << sizeof(long int) << endl;
	  cout << "Size of long long int: " << sizeof(long long int) << endl;
	  cout << "Size of long double: " << sizeof(long double) << endl;

	  return 0;
	  }

	

سنحصل على النتيجة التالية عند التشغيل.

                    Size of char: 1
	  Size of int: 4
	  Size of float: 4
	  Size of double: 8
	  Size of short int: 2
	  Size of long int: 4
	  Size of long long int: 8
	  Size of long double: 12
	


المثال الثاني

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // int و نوعه x هنا قمنا بتعريف متغير إسمه
	  int x = 5;

	  // x هنا قمنا بطباعة الحجم الذي تم حجزه في الذاكرة من أجل المتغير
	  cout << "Size of x in memory: " << sizeof(char) << " Byte\n";

	  return 0;
	  }

	

سنحصل على النتيجة التالية عند التشغيل.

                    Size of x in memory: 1 Byte
	

العامل & (Address)

يستخدم لمعرفة عنوان المساحة المخصصة في الذاكرة للشيء الذي يتم وضعه بعده مباشرةً.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // int و نوعه x هنا قمنا بتعريف متغير إسمه
	  int x = 5;

	  // في الذاكرة x هنا قمنا بطباعة عنوان المساحة التي تم تخصيصها للمتغير
	  cout << "Address of x in memory: " << &x;

	  return 0;
	  }
	

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

                    Address of x in memory: 0x72feec
	

العامل * (Pointer)

يستخدم لوضع مؤشر للشيء عند تعريفه مما يجعلك قادر على الوصول إليه بشكل مباشر من أي مكان تريد من خلال عنوانه في الذاكرة.


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // 5 و قيمته x هنا قمنا بتعريف متغير إسمه
	  int x = 5;

	  // x و قمنا بتعريفه كمؤشر للمتغير y هنا قمنا بتعريف متغير إسمه
	  // أصبحا يشيران لنفس القيمة المخزنة في الذاكرة y و المتغير x إذاً المتغير
	  int *y = &x;

	  // x و التي هي نفسها قيمة المتغير y هنا قمنا بطباعة القيمة الموضوعة في المتغير
	  cout << "y contain x value which is: " << *y;

	  return 0;
	  }
	

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

                    y contain x value which is: 5
	

ملاحظة

ستتعرف على المؤشرات و كيفية التعامل معهم بشكل مفصل لاحقاً في الدورة; و يكفي أن تفهم معنى كلمة مؤشر.

العامل , (Comma)

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


مثال

Main.cpp
                    #include <iostream>
	  using namespace std;

	  int main()
	  {
	  // x هنا قمنا بتعريف متغير إسمه
	  int x;

	  // s تساوي 1, ثم أضفنا عليها 2, ثم ضربناها بالرقم 5. و في النهاية وضعنا الناتج في المتغير x هنا قمنا بجعل قيمة
	  int s = (x = 1, x += 2, x *= 5);

	  // s هنا قمنا بطباعة قيمة المتغير
	  cout << "s = ((1) + 2) * 5 = " << s;

	  return 0;
	  }
	

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

                    s = ((1) + 2) * 5 = 15