بدلاً من استخدام الأرقام مثل 10110000 01100001
(Binary) للقيام بعملية معينة على الكمبيوتر, يمكن استخدام لغات برمجة مثل C++ والتي تسمح ب:
- برمجة برامج معقدة بشكل اسهل (بكثير)
لكن لغات البرمجة لا يستطيع المعالج أن يتعامل معها بشكل مباشر وبذلك:
بعد كتابة الكود, نحتاج الى "تجميعه" (compile) وتحويله الى Binary ليصبح برنامج قابل للتشغيل.
يوجد الكثير من الطرق لتجميع برامج C++, أهمها:
- cpp.sh (سهل جداً وينصح به بشدة, لكن يحتاج الى شبكة الأنترنت بشكل دائم)
- DevC++ (سهل)
- Visual Studio (سهل)
- Visual Studio Code + MinGW (مستخدمين متقدمين فقط)
مستخدمي Linux: أسهل طريقة هي تنزيل
g++
بشكل مباشر واستعماله مع اي محرر كود.
- في حال cpp.sh, بكل بساطة يمكن زيارة الموقع, كتابة أي كود والضغط على Run بالأسفل لشتغيل الكود ومشاهدة النتائج.
- في حال DevC++, 🤷 انا لم استخدمه مسبقاً
- في حال Visual Studio, بعد انشاء مشروع واضافة كود عليه, يمكن تشغيل البرنامج مباشرة بالضغط على زر ▷
- في حال MinGW, استخدم
g++
, مثلاً لو كان اسم الملف الذي يحتوي الكودmain.cpp
يمكن الكتابة ضمن اي Terminal التالي:g++ main.cpp -o main
- بعد ذلك يصبح ملف اسمه
main.exe
موجود وقابل للتشغيل
استخدم الكود البسيط التالي لتجريب هذه العملية:
#include <iostream>
int main()
{
std::cout << "Hello, world!";
}
هذا الكود يكتب "Hello World" فقط.
سوف نحلل كل سطر في الكود.
#include <iostream>
هذا السطر يدل على أننا نريد استخدام محتويات المكتبة التي اسمها iostream
في هذا البرنامج.
int main()
هذا السطر يقوم بتعريف تابع اسمه main
. هذا التابع هو أول تابع يعمل في البرنامج. هذا التابع يجب أن يكون مجود في كل برنامج.
السطرين:
{
...
}
يعبران على أن كل كود بينهما هو جزء من التابع main
.
ضمن التابع يوجد سطر واحد:
std::cout << "Hello World";
في هذا السطر, std::cout
و >>
يسمحان بكتابة أحرف او أرقام كخرج للبرنامج. هذا البرنامج يقوم بكتابة Hello World
عند تشغيله, نتيجة لذلك.
- التعليمات (statements): هي سطر كود يقوم بشيئ معين. مثلا
int x = 5;
تعليمة تقوم بتعريف متحولx
بقيمة5
(ويتم تخزين المتحول في ال RAM) - التعبيرات (expressions): هو شيئ يعبر عن قيمة معينة. مثلا
x+5
اوx/2
- مجموعة كود (block): هي مجموعة تعلميات بين اقواس من الشكل
{}
كل تعليمة تكون بسطر منفرد (عادة) وتنتهي بفاصلة منقوطة ;
.
في المثال السابق:
"Hello World"
هو تعبير (قيمة وليس عملية)std::cout
هو تعبير (قيمة وليس عملية)std::cout << "Hello, world!";
هي تعليمة (عملية كاملة).{ std::cout << "Hello, world!"; }
هي block
ترتيب الكود:
- يجعل القراءة سهلة
- يسهل ايجاد الأخطاء في الكود
قواعد اساسية:
- يجب وضع كل تعلمية بسطر منفرد (مهم جداً)
- يجب وضع مسافة واحدة في معظم الحالات الممكنة فيها
- مثلا
int x=5;
هي تعليمة صحيحة ولكنint x = 5;
هي أيضا صحيحة ولذلك يتم تفضل الثانية على الأولى.
- مثلا
- يجب وضع Tab (مسافة طويلة, يوجد زر مخصص في آخر الكيبورد جهة اليسار) عند الدخول لكل block
هي صحيحة ولكن:
int main() { int x = 5; }
هي اصح (بكثير).int main() { int x = 5; }
يمكن كتابة تعليقات ضمن الكود من غير ان تأثر في الكود, حيث يقوم المجمع (compiler) بتجاهلها تماما عند التجميع. التعليقات تفيد في:
- كتابة شروحات وتوضيحات ضمن الكود
- فوائد اخرى غير مهمة للمبتدئين 😜
يوجد نوعين للتعليقات:
- تعليقات تأخذ سطر واحد فقط من حيث كتابة
//
الى نهاية السطر (لاحظ اللون المختلف للتعليق)int main() { std::cout << "Hello World"; // prints hello world }
- تعليقات تأخذ أكثر من سطر, تبدأ ب
/*
وتنتهي ب*/
:int main() { /* هذا السطر يقوم بكتابة Hello World وبعد ذلك يتم اغلاق البرنامج بشكل مباشر. */ std::cout << "Hello World"; }
🚩 سيتم استخدام التعليقات من الآن فصاعدة لتقديم بعض الشروحات ضمن هذا المستند.
كل برنامج, بشكل أو بآخر, يقوم بمعالجة معلومات. مثلاً البرنامج السابق يقوم بمعالجة المعلومة Hello World
ليتم طباعتها.
يتم تخزين المعلومات بما يسمى المتحولات (variables). مثال عن تعريف متحول اسمه x
:
int x = 5;
هذا المتحول هو من نوع int
وقيمته 5
.
في لغة C++, للمتحولات انواع, بعضها لتخزين الأعداد الصحيحة, وبعضها للأعداد التي تحوي فواصل, وبعضها للأحرف, الخ.
الأنواع الأساسية:
النوع | الأستخدام |
---|---|
int |
عدد صحيح |
float او double |
عدد له فواصل |
char |
حرف واحد فقط |
bool |
يقبل true او false فقط. |
لاحظ اننا كنا نستعمل "Hello World" في السابق, والذي هو اكثر من حرف واحد. هذا النوع هو حالة خاصة ونوعه هو
std::string
, والذي يستخدمchar
داخليا ويمكن التعرف عليه بشكل افضل لاحقا.
نقوم بتعريف عدة متحولات:
int number_of_apples = 5;
float temperature = 24.22; // Celsius
double battery_level; // هذا المتحول لا يحوي قيمة
يمكن تغيير قيمة المتحولات فيما بعد (من دون ذكر النوع مرة أخرى)
number_of_apples = 8;
temperature = 14.0; // Celsius
battery_level = 78.8; // الأن أصبح هذا المتحول له قيمة
مكتبة iostream توفر بعض الأدوات للتعامل مع الدخل والخرج للبرنامج. نهتم حاليا بثلاث متغيرات ضمنها:
std::cout
std::cin
std::endl
كلمة cout
هي اختصار ل "Character Output". يمكن استخدام هذا المتغير كالتالي:
std::cout << "Hello World";
هذا الكود يطبع "Hello World" على الشاشة عند تشغيله. يمكن تخيل هذا الكود على انه <<
هي اسهم تنقل "Hello World"
الى std::cout
.
يمكن ايضا اخراج عدة قيم بتعليمة واحدة:
int temperature = 25;
std::cout << "The temperature is: " << temperature;
بشكل مماثل, cin
هي اختصار ل "Character Input" ويمكن استخدامها كالتالي:
int x;
std::cin >> x;
عندما يبدأ البرنامج سينتظر لحين يقوم المستخدم بإدخال رقم والضغط على Enter, بعدها يقوم بتخزين الرقم المدخل في المتحول x
.
🤔 ماذا يحدث لو كان الدخل يحتوي احرف؟
لو قمت بتشغيل الكود التالي:
std::cout << "drink";
std::cout << "water";
سيكون الناتج كالتالي:
drinkwater
وذلك لأنك لم تضف بالكود على انك تريد النزول الى سطر جديد بعد كلمة drink.
كلمة endl
هي اختصار الى "End Line" وبكل بساطة هو متغير عادي يمكن اخراجه عن طريق std::cout
ليسبب النزول الى سطر جديد:
std::cout << "drink" << std::endl;
std::cout << "water";
سيكون الناتج كالتالي:
drink
water
التوابع ببساطة هي وسيلة لتجميع كود معين بوحدات صغيرة يمكن اعادة استخدامها. مثال عن تابع:
int add(int a, int b) {
return a + b;
}
int main() {
std::cout << add(10, 5);
}
من المهم ترتيب التوابع في الوقت الحالي.
ماذا تتوقع أن يكون الخرج؟ سيكون 15.
في السطر:
int add (int a, int b)
نقوم بتعريف تابع, اسمه add
ويقوم بارجاع عدد صحيحة (اول int
) ويأخذ متحولين كدخل للتابع (بين القوسين), من النوع int
واسمهما a
و b
.
{
...
}
القوسين يدلان على الblock الي تتبع للتابع
return a + b
كلمة return
تقوم بالأشار الى اننا نريد ارجاع قيمة a + b
.
عندما يعمل البرنامج:
- يبدأ في
main
- ينتقل الى
add
مع العددين 10 و 5 - يقوم بحساب المجموع, 15
- يتم ارجاع العدد 15 للتابع
main
- تتم تمرير القيمة ل
std::cout
لتظهر على الشاشة
- بعض التوابع قد لا تقوم بارجاع قيمة, ولذلك تستعمل كلمة
void
لنوع خرج التابع عند تعريفه.
يمكن في لغات البرمجة القيام (او عدم) القيام بعمليات محددة بحسب اذا ما كان شرط معين محقق او لم يكن.
الصيغة العامة:
if (شرط) {
// الشرط محقق هنا
}
ويمكن وضع بعدا كلمة else
والي تفيد في القيام بعملية مختلفة في حال كان الشرط غير محقق:
if (شرط) {
// الشرط محقق
} else {
// الشرط غير محقق
}
مثال:
int main() {
// لنأخذ قيمة حرارة الجو من المستخدم
float temperature;
std::cout << "Please enter temperature: ";
std::cin >> temperature;
// هل الحرارة أكثر من 25؟
if (temperature > 25) {
std::cout << "It is hot today" << std::endl;
} else {
std::cout << "It is cold today" << std::endl;
}
}
يمكن أيضا استخدام كلمة else if
لتجريب شرط اخر في حال كان الأول غير محقق. كصيغة عامة:
if (شرط) {
// شرط محقق
} else if (شرط اخر) {
// شرط اخر محقق
} else {
// الشرطين غير محققين
}
مثال عن فائدة else if
: لو كان عندك مستخدمين في البرنامج وكان منهم مديرين, ومنهم مشرفين, منهم مستخدمين عاديين, فيمكن كتابة شرط كالتالي:
if (المستخدم هو مدير) {
// تنفيذ كود خاص بالمدراء للبرنامج
} else if (المستخدم هو مشرف) {
// تنفيذ كود خاص بالمشرفين للبرنامج
} else {
// تنفيذ كود للمستخدمين العاديين فقط
}
الحلقات تسمح بإعادة تنفيذ كود معين طالما شرط معين محقق.
الصيغة العامة:
for (التهيئه الأولية; الشرط; الخطوة) {
// تنفيذ كود طالما الشرط محقق
}
- التهئية الأولية هي تعليمة واحدة عادة يتم فيها تعريف متحول ليتم استخدامه كعداد للحلقة
- الشرط يستعمل فيه العداد المعرف مسبقا غالبا
- الخطوة هي تعليمة يتم تشغيلها عند نهاية كل حلقة
مثال:
for (int i = 0; i < 5; i = i + 1) {
std::cout << "i = " << i << std::endl;
}
النتيجة ستكون:
i = 0
i = 1
i = 2
i = 3
i = 4
تعمل حلقة for
السابقة بالشكل التالي:
- تبدأ بتعريف متحول
i
وله قيمة0
- تقوم بالتحقق من الشرط
i < 5
, هل هو محقق؟ - في حال كان محقق, يتم تشغيل الكود وكتابة الكلام على الشاشة
- يتم بعد ذلك تشغيل
i = i + 1
- ثم تعود الحلقة للتحقق من الشرط, وهكذا
عندا يصبح الشرط غير محقق, تنتهي الحلقة
حلقات while
بسيطة جداً:
while (شرط محقق) {
// كود
}
مثال:
int age = 0;
while (age > 0 && age < 100) {
std::cout << "Please enter your age: ";
std::cin >> age;
}
هذا البرنامج يطلب من المستخدم ادخال عمره, لكن في حال قام بإدخال رقم غير صحيح مثلا 0 او 150 فيعود ويسأل المستخدم مجددا عن العمر.
- يمكن دائما, بشكل فعلي, التحويل بين
for
وwhile
- لكن
for
غالبا تستخدم عندا يتم عد شيئ معين, وغالبا يكون عدد الحلقات معروف بشكل مسبق - في حين
while
يتم استخدامها في حال عدم وضوح عدد الحلقات من البداية - في معظم الوقت يتم استعمال
for
بدلا منwhile
بشكل فعلي.
\n