++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 أي القيم truefalse.
  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
charchar16_t
char32_t
class
compl
const
constexpr
const_cast
continue
decltype
default
delete
dodouble
dynamic_cast
else
enum
explicit
export
extern
false
float
for
friend
gotoif
inline
int
long
mutable
namespace
new
noexcept
not
not_eq
nullptr
operatoror
or_eq
private
protected
Public
register
reinterpret_cast
requires
return
short
signed
sizeofstatic
static_assert
static_cast
struct
switch
template
this
thread_local
throw
true
try
typedeftypeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq


أمر الطباعة cout

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

مثال

main.cpp

  1. #include <iostream>
  2. int main()
  3. {
  4. std::cout << “armk“;
  5. return 0;
  6. }

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

  • armk

شرح الكود

  • الأمر #include <iostream> الموجود في السطر الأول يقوم بتضمين الحزمة iostream التي تحتوي على الأوامر الأساسية التي نحتاجها في التطبيقات التي تعتبر Console Application و التي سنستخدمها في أغلب البرامج مثل أمر الطباعة cout و غيره من الأوامر و الدوال الجاهزة التي ستمر معك لاحقاً في الدورة.
  • سبب وضع std:: قبل cout هو أن الأمر cout موجود فيه.
  • الدالة main() التي قمنا بتعريفها ابتداءاً من السطر الثالث يجب أن يكون نوعها int لأنها تمثل نقطة البداية في البرنامج.
  • وضع return 0; في السطر السادس و كآخر أمر في الدالة main() هو أمر متعارف عليه, و فكرته إرسال الرقم 0 لنظام التشغيل عند انتهاء أو إغلاق البرنامج بشكل طبيعي. هكذا سيتمكن نظام التشغيل من التفريق بين الإنهاء الطبيعي للبرنامج والإنهاء المفاجئ ( Crash ) الذي يحدث نتيجة خطأ ما.

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

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

  • لعرض رقم, ضعه كما هو.
  • لعرض قيمة متغير, ضعه كما هو.
  • لعرض حرف يجب وضعه بين ‘ ‘.
  • لعرض كلمة أو نص, يجب وضعه بين ” “.

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. int main()
  3. {
  4. char *name = “Ali”;
  5. int year = 1996;
  6. std::cout << “Hello my name is “ << name << “, I born in “ << year;
  7. return 0;
  8. }

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

  • Hello my name is Ali, I born in 1996

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

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

مثال

main.cpp

  1. #include <iostream>
  2. int main()
  3. {
  4. std::cout << “armk” << std::endl << “C++ course”;
  5. return 0;
  6. }

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

  • armk
  • C++ course

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

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

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std; // std هنا قمنا بتضيمن النطاق
  3. int main()
  4. {
  5. cout << “armk” << endl << “C++ course”;
  6. return 0;
  7. }

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

  • armk
  • C++ course

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

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. cout << “armk\nC++ course”;
  5. return 0;
  6. }

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

  • Harmash.com
  • C++ course

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. cout << “armk\n”;
  5. cout << “C++ course”;
  6. return 0;
  7. }

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

  • armk
  • C++ course

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

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout << “Name:\tAli Rabeei\n”;
  6. cout << “Job:\tProgrammer”;
  7. return 0;
  8. }

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

  • Name: Ali Rabeei
  • Job: Programmer

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

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout << “Yes, you hear the alert :)\a”;
  6. return 0;
  7. }

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

  • Yes, you hear the alert :)

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

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

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

مثال

main.cpp

  1. #include <iostream>
  2. using namespace std; int main() {cout << “armk“<<endl<<“C++ course”;return 0;

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

  • armk
  • 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 حتى لو لم تحدد ذلك بنفسك لهذا السبب تستطيع تخزين قيم أصغر من صفر فيها.

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

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

النوعالحجم في الذاكرةالقيمة التي يمكن تخزينها
char1Byteبين 128 و 127
unsigned char1Byteبين 0 و 255
short int2Bytesبين 32768 و 32767
unsigned short int2Bytesبين 0 و 65535
int4Bytesبين 2147483648 و 2147483647
unsigned int4Bytesبين 0 و 4294967295
long int4Bytesبين 2147483648 و 2147483647
unsigned long int4Bytesبين 0 و 4294967295
long long int8Bytesبين 9223372036854775808 و 9223372036854775807
unsigned long long int8Bytesبين 0 و 18446744073709551615
float4Bytesبين 1.17549e-038 و 3.40282e+038
double8Bytesبين 2.22507e-308 و 1.79769e+308
long double12Bytesبين 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++ للحاسوب و لكن هذا الأمر ليس شيء عليك القلق بشأنه خاصةً في هذه المرحلة.

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