دورة c++ المستوى الأول هي شرح يتضمن كافة أمثلة المستوى الأول من لغة سي بلس بلس للمبتدئين. ستتمكن في هذه الدورة من تعلّم أساسيّات البرمجة وآلية عملها في أجهزة الحاسوب.
كما سيتسنّى لك تطوير مهارات التّحليل في قراءة الشّيفرات البرمجيّة وفقاً لكافة أنواع البرامج التي تعمل على إنشائها. ستحتوي هذه الصفحة على أكثر من 15 درساً مع تطبيق الأمثلة.
لغة البرمجة سي هي واحدة من أهمّ اللّغات متعدّدة الأغراض والاستخدامات. حيث تدعم البرمجة الكائنيّة و الاستدعاء الذاتي للمتغيرات. قام ببنائِها كلاً من Ken Thompson وBrian Kernighan و Dennis Ritchie للعمل على تطوير نواة نظام التشغيل Linux.
تتضمّن اللغة استخداماً واسعاً ومطلقاً في إنتاج البرمجيّات المعاصرة. والتي من شأنها تصدير البرمجيات لأشهر المنصّات الرقميّة, كما أنها بدورها واحدةً من أقرب اللّغات وصولاً إلى عتاد الحاسوب.
سوف تتطلب منك دورة سي العديد من الأدوات لكي يتسنّى لك إتمام كافّة الشروحات المُرفقة وأهمُها:
الأمثلة قابلة للتحميل من جوجل درايف وفي حال قررت متابعة القراءة عبر الهاتف , ستتمكن من العثور عليها عبر التّطبيقات المرفقة في الهاتف.
توفر مكتبة C القياسية العديد من المزايا وأهمّها تفاعل المستخدم مع وحدات الإدخال والإخراج (IO) في نظام التشغيل. أدوات C ++ القياسية التي تساعدنا في تكوين جملة الطباعة واستخراج المتغيرات لتظهر على شاشة وحدة التحكم الخاصة بك.
جملة الطباعة هي وظيفة متصلة في مكتبة c ++ القياسية ، وهي واحدة من أسرع وظائف الطباعة مقارنة بغيرها من الدّوال. تتيح لك هذه الوظيفة طباعة ما يلي:
كما هو الحال بالنّسبة لأي عنصر أو صف أو مصفوفة فإن جملة الطباعة في لغة سي ++ تمكّنك من طباعة أي عنصر وإظهار نتائجه على شاشة الحاسب حيث أن عمليات المعالجة تشتمل على طباعة أية مدخلات.
#include<iostream> using namespace std; int main() { char z = 'h'; std::cout << "This is char z : " << z << endl; return 0; }
تستخدم لغة C ++ معادلات باقي القسمة على نطاقٍ واسع ، خاصةً في خوارزميّات الرياضيّات. بالتالي لا يتم الاستغناء عنها في معالجة الرسومات. وأيضاً ربما تشمل خوارزميات محرّكات البحث لاستثناء بعض النتائج من الظّهور.
وتعتمد النّسبة الباقية أساسًا على التحقّق من قبول قسمة رقم على آخر ، وما هو الفائض أو الباقي من القسمة بين الرقمين.
توفر لك دورة c ++ العديد من الأمثلة والشّروحات حول طريقة التّعامل مع تلك الأنواع من الوظائف. فهي تشتمل على استخراج باقي القسمة من متغيرين.
وعلى فرض أنّنا نريد قسمة عددين صحيحين ، على سبيل المثال: 4 مقسومة على 2 ، فإن فإن الناتج هو 2. ولكن باقي القسمة في هذه الحالة يساوي صفرًا. لأن الرقم 4 هو مضاعف 2 ولا يوجد باقٍ لنقسم عليه.
وإن قمنا بعكس العمليّة بحيث قمنا بقسمة 2 على 4 ، ولأن الرقم 2 غير قابل للقسمة على 4 في الأعداد الصحيحة. فإن باقي القسمة يكون 2 لأن عمليّة القسمة في الاعداد الصّحيحة غير ممكنة.
يتم الإشارة إلى الباقي في لغة C بالرمز٪ . وهو علامة النّسبة المئوية والمعامل في لغة C . والآن سنقوم بإعداد متغيّرين من النّوع الصّحيح ونضع قيمة الباقي داخل متغير آخر من نفس النوع.
يرجى اتباع هذه الخطوات معنا.
نحدد متغيرين ونضع قيمة في كل متغير. وعلى فرض أنّ a = 5 و b = 13 على شكل:
#include<iostream> using namespace std; int main() { int a = 5; int b = 13; return 0; }
ثم نضيف متغيرًا لحفظ باقي القسمة عند تنفيذها:
#include<iostream> using namespace std; int main() { int a = 5; int b = 13; int mod = a % b; return 0; }
ونستعرض قيمة الباقي بعد وضعه في متغير mod على النحو التالي:
#include<iostream>
using namespace std;
int main()
{
int a = 5;
int b = 13;
int mod = a % b;
std::cout << "a modulus b = " << mod << endl;
return 0;
}
بعد تنفيذ الكود السابق ، يكون باقي القسمة 5.
من فضلك ، لكي تفهم معامل القسمة جيدًا في دورة c ++ ، انسخ الكود التالي إلى المحرر الخاص بك.
#include<iostream> using namespace std;
int main()
{
int a = 5;
int b = 13;
int mod = a % b;
std::cout << "value of a = " << a << endl;
std::cout << "value of b = " << b << endl;
std::cout << "a modulus b = " << mod << endl;
return 0;
}
تهانينا لك بإتمام القسم الثاني من دورة c ++ مع تمنياتنا لك بالتوفيق والنجاح.
في C ++ , وعند التعامل مع كود كبير ونشره للمطوّرين. سنحتاج إلى إدراج بعض التّعليقات ضمن مشروعنا من أجل تقديم شروحات تتعلق حول آلية عمل البرنامج.
سيتم شرح التعليقات في دورة تعلم البرمجة لغة c ++ والتي ستتطرق إلى استخدامها كثيرا في وصف وشرح الكود الخاص بك.
تفيد التعليقات كثيرًا في منح المطورين تعليمات وإرشادات حول مبدأ عمل الشيفرة. بما في ذلك الأجزاء الحساسة من الدوال والتي يصعب السيطرة على مجرياتها ببعض الأحيان.
وبالتالي فإن من أهم أساسيات تقييم جودة الكود هو وجود بعض الإرشادات التي تسمح للمطورين بفهمها وإدراك ماهيتها.
أنواعُها
هناك لغاتٍ أخرى تستخدم نفس علامات C ++ أثناء التعليق. وتختلف طريقة التّعليق من لغة إلى أخرى. ويبدو ذلك واضحا في أثناء التعامل مع المحرّرات.
يقوم المترجم بقراءة الكود ، متجاهلاً منطقة التعليق. والتي غالبًا ما يتمّ التّعبير عنها ببعض الإشارات في بادئة ونهاية السّطر. ولأن التعليق يساعدنا في تحليل وفهم المشروع ، سنذكر تلك الحروف التي تحتوي على قلب التعليق هي :
قم بتطبيق شيفرة التعليقات في محرر الكود الخاص بك.
#include<iostream> using namespace std; /* welcome to c++ language */ // welcome to c++ language int main() { std::cout <<"Hello World"<< endl; return 0; }
توفر لك دورة c++ نوعين من التعليقات التي تم ذكرهما في الشّيفرة السابقة. ولا مصادر أخرى مؤكّدة عن وجود أنواعٍ أخرى مُختلفة.
توفّر لك دورة c++ امثلة عديدة حول استخدامات Postfix و Prefix. فهي تُمهّد لك طريقاً جيداً لمعرفة أهم الفروقاتِ بين استخدام معاملات اللغة قبل وبعد المتغيرات. وما هي أهمّ التغييرات التي تطرأ عند تشغيل البرنامج.
فهي تتمثّل باستخدام معاملات الزّيادة والنّقصان (++، -) في c ++. ما يعني إمّا قبل المتغيّر أو بعده.
عند استخدام المعاملات ، يجب استخدام المتغيرات الرقمية من النوع int أو float أو double. وتسمّى عملية وضع المعامل قبل المتغير بطريقة Prefix. وأمّا معاملات ما بعد المتغير بطريقة postfix.
هناك العديد من عمليات postfix والبادئة في C ++. حيث أصبح من الصعب بشكل متزايد شرح وتنفيذ بعضها ، بالتّالي سنذكر فقط الطّرق الأكثر استخدامًا في هاتين الميزتين.
تعتمد هذه الميزة على الأداء الحسابي والمنطق قبل ظهور النتائج من على شاشة(الكونسول). وذلك لــ عرض القيمة الظاهرة جراء تنفيذ العملية، حيث يقوم المترجم بإحداث التغيير قبل ظهور المتغير على الشّاشة.
#include<iostream> using namespace std; int main() { int a = 5; --a; cout << a << endl; return 0; }
تعتمد هذه الميزة على أداء العمليّة الحسابيّة بعد إغلاق شاشة الكونسول. سواء أكانت تتصف بالزّيادة أو النّقصان. ولكن لا يمكننا رؤية النتيجة بعد عمليّة الإغلاق.
#include<iostream> using namespace std; int main() { int a = 5; a--; cout << a << endl; return 0; }
إنّ أغراض استخدام إحدى الطريقتين متعدّدة. ومع ذلك ، فإن التعامل مع Prefix يدلي بنتائج جيّدة في برمجة الرسومات. خاصّةً عند معاينة عمليّات الاستدعاء وأثناء إجراء مُعادلات باقي القسمة.
تُفيد أيضاً في التّعامل مع قواعد البيانات على صفحة الخادم , حيث لا تقتصر على لغة سي فحسب. ربما تحتاج للعمل عليها عند استدعاء النتائج وطباعتها في صفحات HTML.
بعد أن تكوّنت لديك فكرة جيّدة عن أهمّ الفروقات بين Postfix و Prefix. قم بمعاينة الشيفرة التالي في محرر الكود الخاص بك.
#include<iostream> using namespace std; int main() { int a = 5; --a; cout <<"This method is prefix : "<< a << endl; a--; cout << "This method is postfix : " << a << endl; int a = 5; ++a; cout << "This method is prefix : " << a << endl; a++; cout << "This method is postfix : " << a << endl; return 0; }
لقد تعرفت في دورة c ++ أهم استخدامات Postfix و Prefix نرجو منك عزيزي القارئ تطبيق الأمثلة في محرر الكود الخاص بك.
الدّوال هي بمثابة كتلةٍ من التّعليمات البرمجية والّتي يتم تنفيذها بمجرد الاتصال بها. حيث أنّ الدوال إحدى الوظائف المهمّة في لغة C ++. والتي توفر استخدامًا وتنسيقاً جيدين للذاكرة.
لقد كانت الفكرةُ من استخدام الدّوال, العمل على تجريد وفصل المتغيّرات المتكرّرة. والتي غالباً ما يصحبُها خياراتٍ محدودة في التسمية. ذلك للحيلولة دون التّداخل في مُسمّياتها بالتالي توقف الشيفرة عن العمل.
يجب أن تحتوي الدّوال على خصائص تُظهر وظيفتها بوضوح. وهي تستند إلى:
#include<iostream> using namespace std; void test(); int main() { return 0; }
#include<iostream> using namespace std; void test(); int main() { return 0; } void test() { std::cout << "I am a function !"; }
تختلف طرق تعريف الدّوال فبعض المبرمجين يبدأ بتعريف الدالة أولاً ثمّ تنفيذها رأساً. أمّا البعض الآخر فإنّه يقوم بالإعلان عنها ومعالجتها في أماكن أخرى وكلا الطريقتين تفِي بالحاجة.
#include<iostream> using namespace std; void test(); int main() { test(); return 0; } void test() { std::cout << "I am a function !"; }
في دورة c ++ قمنا باستخدام طريقةً أكثر شموليّةً. لكي يتسنى لك معرفة ماهيّة الدّوال وكيف تعمل في لغات البرمجة.
يمكن أن نعتبرها الدّالة الرّئيسية لكلّ لغة. أو أنّها المكان الخاص باستدعاء كلّ ما تمّ إنشاؤه في المشروع(البرنامج).
وفي الواقع يصعب العثور على دالّة main في المشاريع الكبيرة.
ولكن عندما تصبّ بكامل اهتمامك في قراءة الشّيفرة، يُمكنك معرفة مكانها جيدًا وتمييزها عن بقيّة الدّوال.
في الواقع ، هذه الدّالة بمثابة ملتقىً لتنفيذ البرنامج. حيث لا يمكن تشغيل الشّيفرة دون المرور بالدالة main. بالإضافة وحتى أنظمة التشغيل في لغات الحاسب تعمل في غُضونها.
لا يمكن تكرار دالة main عند تعريفها أكثر من مرة في البرنامج. بل يتمّ وضعها ولمرة واحدة فقط داخل المشروع. حينئذٍ سيُدرك المترجم ذلك تلقائيًا وبأنّ القراءة الكاملة للشّيفرة وتنفيذها سيتمّ عبرها.
يتسنّى لك استدعاء كل ما قمت بكتابته في صفحاتك عبر دالّة main وعن طريق:
#include<iostream> using namespace std; int main() { std::cout << "This is returned function main"; return 0; }
لقد تم ذكر نوع واحد من دالة main في دورة c ++. وبالرّغم من أنّك تستطيع استخدام بديلاً آخر من نوع void.
في c++ وعند التعامل مع المتغيّرات الثابتة. فإن المتغيّر يحافظ على القيم المخزّنة بداخله طوال عمر البرنامج. وعادةً ما يتم الإشارة إليه بكلمة static.
على سبيل المثال ، نقوم بإنشاء متغير من النوع static int val = 0. وهذه العلامة تُشير إلى أنّه محجوز في ذاكرةٍ خاصة للمتغيرات الثابتة. دون الرجوع أو التبديل إلى قيمة أخرى، وهذا ما يميّزه عن سائر الأنواع الأخرى.
قد تختلف لغات البرمجة في طرق الوصول إلى المتغيرات الثابتة من داخل الكائن. ولكن في C ++. يتم الوصول إلى المتغير الثابت عن طريق تضمين اسم الكائن (الفئة) ووضع علامتين: النقاط الرأسية. حينئذٍ سيظهر لك تلقائيًا.
على سبيل المثال ، سنعرض لك رمزًا لعدّادٍ داخل الكائن ونجعل قيمته تزداد تلقائيًا عند ولادة أي كائن من نفس الفئة. قم بإلغاء الثابت من المتغير ولاحظ الفرق.
#include<iostream> using namespace std; class mut { private: static int count; int k; public: mut() { count++; k = count; } int getcount() { return k; } }; int mut::count = 0; int main() { mut s1, s2, s3; cout << "Count is : " << s1.getcount() << endl; cout << "Count Is : " << s2.getcount() << endl; cout << "Count is : " << s3.getcount() << endl; return 0; }
سيتم شرح المتغيرات الثابتة بشكل مخصّص في مستوياتٍ متقدمة من اللغة. حيث سيتسنّى لنا استخدامها في مشاريعٍ كبيرة.
توفّر لك دورة سي العديد من المتغيّرات والتي بدورها الأكثر استخداماً في جميع لغات البرمجة. فمنها ما هو أعداد صحيحة. أو أعداد عشرية أو أحرف أو غيرها.
هناك أنواع عدّة من المتغيرات في لغات البرمجة. لكنها تشترك في نفس الخصائص مع فروقاتٍ بسيطة في التّسمية. و في لغة ++ C ، الأنواع الرئيسية للمتغيرات هي:
استخدامات المتغيرات متعدّدة ، وهي الحافظة الرئيسية لجميع قيم مشغل البرنامج. بالإضافة أنه لا يمكن التخلي عنها. كما أنّها تعد من مكونات البرمجة بذاتها ، وهي مؤثر قوي على الدوال والصفوف وأيضاً الحلقات recursion.
بعدما تعرّفت على أنواع المتغيرات في دورة c ++. قم بالتمعّن في الشيفرة التاليّة ومن ثم نسخها في محرر الكود الخاص بك.
int main() { int a = 0; char b = 'h'; bool c = false; double d = 1.4; float e = 1.5555; std::cout << "This is int : " << a << endl; std::cout << "This is char : " << b << endl; std::cout << "This is bool : " << c << endl; std::cout << "This is double : " << d << endl; std::cout << "This is float : " << e << endl; return 0; }
هي دالة شاذة لا تمكنها خصائصها من إرجاع قيمة ما ولا يتم إسنادها لمتغيرات. فهي تعالج القيم بداخلها. من أشهر تسمياتها الدّالة باطلة أو void.
لها أوجه استخداماتٍ عدّة في اللّغة. حيث أنها تؤثر على القيم المحدّدة في الشيفرة, كما تعمل على إدارة الذاكرة بشكلٍ جيد في حال تعذّر الحاجة لجلبِ القيم.
على سبيل المثال ، عند تعريف متغير من النوع int وإدراجه في دوال من نوع void. فإنه يخضع لتأثيرها في قيمته وتنتهي من المعالجة دون إرجاع أي عنصر للمترجم. وفي نهاية المطاف لا يحتاج هذا النوع من الدوال إلى تعريف متغير جديد.
/* static variable with Class */
#include<iostream>
using namespace std;
int val = 5;
void var()
{
val = 10;
}
int main()
{
var();
std::cout << "Your Value is : " << val << endl;
return 0;
}
يصحّ تسميتها أيضا بدوال Retro. وهي تشير إلى أغراض استخدام في غاية الأهمّية للغة C. حيث يمكنك إرجاع قيمة ما تمّت معالجتها داخل الدّالة ومن ثمّ تمريرها إلى متغيّر آخر ، وبناءً عليه يتمّ الإجراء.
لا تختلف كثيرًا عن شاكلة الدّوال من نوع void ، إلاّ أن أهمّ الفروقات الناجمة عنها هي بذاتها إحدى خصائصها. والقيمة المُرجعة غالباً ما تكون من نوعها.
int var() { int var = 5; return var; }
float var() { float var = 5; return var; }
string var() { string var = "test"; return var; }
كما أشرنا في سطور الأمثلة أعلاه. فإنّ نوع المتغير الذي قمنا بتحديده في بداية الدالة هو ما يجب إرجاعه. حيث لن تعمل الدالة إلا بإرجاع نفس النوع من المتغيّرات.
وأنواع دوال الإرجاع حسب متغيرات C القياسية:
هناك العديد من الأمثلة على الدّوال الرجعيّة(recursion). وفي دورة c ++ المستوى الأول سنحاول تبسيط المسألة قَدر المُستطاع وفي مثالٍ واحد.
#include<iostream> using namespace std; int var() { int var = 10; return var; } int main() { int receive= var(); std::cout<< "Your Value is : " << receive<< endl; return 0; }
متغيّر String وهو مصفوفةٌ من الأحرف في الذاكرة. حيث أنّها فئة مشتقّة من مساحة الاسم std. وكل حرف داخل سلسلة يحتوي على 8 بت.
الحرف char هو أصغر وحدة تتشكّل في الذّاكرة من الأحرف الأساسيّة. حيث تعتمد زيادة حجم الذّاكرة في متغير char على تحديد مساحةٍ من القيم قابلة للزيادة تلقائياً.
في لغة سي القياسيّة تم إضافة namespace يحتوي على مكتبة Strings. حيث كان المبرمجين يعتمدون قبل ذلك على إنشاء مصفوفة Static من الأحرف char. وغالباً ما يتم الإشارة إليها بمساحاتٍ محدودة.
في دورة c ++ سنتعرف على أنواع وصيغ مختلفة من استخدامات String.
هناك أكثر من طريقة في الإشارة الى متغير string، بما في ذلك:
في حوزتنا مثال يوضح لك ماهيّة النصوص وكيفية استخدامها. في دورة c ++ المستوى 1. لن يتسنّى لنا الإشارة بكافة صيغ التّعريف. حيث سنتولّى ذكر أهمّها في تعريف النصوص.
#include<iostream> #include<string> using namespace std; int main() { string s1("Man"); string s2 = " World"; string s3; s3 = s1; cout << "s3 = " << s3 << endl; s3 = "neither " + s1 + " nor"; s3 += s2; cout << " s3 = " << s3 << endl; s1.swap(s2); cout << s1 << " nor " << s2 << endl; return 0; }
تهانيناً لك بإتمام الدرس الحادي عشر من لغة c ++.
يتم الإشارة إليه بالتّعريف char بلغة C ++. وهي مساحة محجوزة مخصّصة ويمكن استخدامها كثيرًا. كما أن فئة string القياسيّة تم بناؤها في متغيّرات الحروف.
دالة Setw قادرة على اختيار جملة محددة من بين النصوص. ستختار هذه الوظيفة أول جملة مطبوعة. لكن طول الكلمة لا يتجاوز 20 حرفًا.
عند تحديد أي متغيّر من نوع char ، ننصحك بطرح الطول الإجمالي للحرف من قيمة كافية في الذاكرة. لتفادي تجاوز سعة الذاكرة التي قمت بتحديدها.
لفهمِ متغيرات char في دورة c ++ ، انسخ الكود التالي في محرر الكود الخاص بك.
include<iostream> #include<iomanip> using namespace std; int main() { const int max = 20; char str[max - 1]; //because null value of character cout << "Enter An String "; cin >> setw(max) >> str; cout << "You Entered n" << str; return 0; }
ليس شائعاً بكثرة في أساسيات تعلم اللغة نظراً لقلة استخدامه أثناء ربط مكتبات الأطراف الثالثة. لكن نعتبره أساساً في تحليلِ البيانات. خاصّة عند بناءِ شيفرة في لغة C القياسية.
في دورة c ++.سنقدم لك الشّروحات حول طريقة استخدام وحدة الإدخال.
الجمل في C ++ سهلة التنفيذ وغير مزعجة. في الماضي ، كان استخدام لغة C ++ متطلباً في إدخال البيانات قبل تصميم واجهات رسومية. بالإضافة الى الحاجة لاستخدام جمل الإدخال المختلفة وربطها في قواعد البيانات ليتم جلب البيانات عند الحاجة.
هو بطبيعته أمرٌ برمجي يسمح لـ C ++ بقراءة معلومات الإدخال. حيث إما عرضها على الشّاشة أو الاحتفاظ بها في الذاكرة المؤقتة.
انسخ هذه الشيفرة في المحرر الخاص بك. لترى كيف تعمل وحدة الإدخال من مكتبة C++ القياسية.
#include<iostream> using namespace std; int main() { const int size = 30; char str[size]; cout << "Enter An String : "; cin >> str; cout << "You Entered : n" << str; return 0; }
في دورة c ++. سنُدلي بأهم عناصر الاستخدام وهي المعاملات.
المعاملات من أساسيات لغات البرمجة. حيث تدل على استخدام علامات الجمع والطرح والقسمة والضرب (+ ، – ، / ، *). أو أكبر من وأقل من (<،>). بالتالي غيرها من العوامل التي سيتم التطّرق لها فيما بعد.
يمكن استخدام المعاملات في C ++ لأداء العمليات الحسابية والمنطقية في المعالجة. مما تؤدي غالبًا إلى نتائج وفروقاتٍ في شاشة الكونسول.
تتوفر المعاملات في لغة C ، على شكل:
#include<iostream> using namespace std; int main() { bool c = true; if (c) { cout << "True" << endl; } return 0; }
#include<iostream> using namespace std; int main() { int arr[10]; return 0; }
struct foo { int x; float y; }; int main() { struct foo var; struct foo* values; var.x = 5; (& var)->y = 14.3; values->y = 22.4; (*values).x = 6; return 0; }
int main() { int a = 5; a++; cout << a << endl; a--; cout << a << endl; return 0; }
#include<iostream> using namespace std; int main() { int a = 5; --a; cout <<"This method is prefix : "<< a << endl; return 0; }
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; int *pointer = &a; ++*pointer; // use of * Asterisk std::cout <<"This value of a after affected by pointer : "<< a<< endl; return 0; }
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; int *pointer = &a; //use of Address ++*pointer; std::cout <<"This value of a after affected by pointer : "<< a<< endl; return 0; }
#include<iostream>
using namespace std;
int main()
{
int x = 15;
int y = 7;
int multi = x * y;
int divide = x / y;
int mod = y % x;
std::cout << "x multi y = " << multi << endl;
std::cout << "x divide y = " << divide << endl;
std::cout << "y modulus x = " << mod << endl;
return 0;
}
std::cout << "This is int a : " << 20 << endl; std::cout << "This is int a : " << a << endl; std::cout << "This is char z : " << z << endl;
if (x <= y) { std::cout << "Hello World"; }
if (x == y && x != z) { std::cout << "Hello World"; }
وهناك أيضا الكثير من المعاملات التي تعذّر لنا جلبها في هذه الوحدة. لكن المعاملات الرئيسية تتمثّل في إشارات الجمع والطرح والضرب والقسمة , وعلامة يساوي.
موضوع for loops مزعج قليلًا للمبتدئين ، لذلك نطلب منك التركيز جيداً. و سنحاول تبسيط المسألة قدر المستطاع.
For loop هي بالأصل دالة تبدأ بالكلمة for والشرط والتنفيذ داخل الأقواس. والحلقة for هي عصبٌ مهمّ لــ لغة البرمجة C ++ ولغات البرمجة الأخرى. فهي بمثابة حاسبة تعمل بتوالي الأرقام جمعاً أو طرحاً أو الإثنين معاً(في مراحل متقدمة).
على سبيل المثال , وفي حال أنّك تريد البحث في مصفوفة تحتوي على 8 عناصر. فسيكون ذلك على النحو التالي:
#include <string> #include <iostream> int main() { using std::string; string str[8] = { "Welcome" , "To" , "C++" , "Hello" , "World" , "Free" , "circle" , "online"}; }
وإن كنت تريد طباعة العناصر على شاشة (الكونسول). فإنّك ستقوم بطباعة عناصر المصفوفة واحدًا تلو الآخر ، بحيث يبدو ذلك كما يلي:
#include <string> #include <iostream> int main() { using std::string; string str[8] = { "Welcome" , "To" , "C++" , "Hello" , "World" , "Free" , "circle" , "online"}; std::cout << str[0] << std::endl; std::cout << str[1] << std::endl; std::cout << str[2] << std::endl; std::cout << str[3] << std::endl; std::cout << str[4] << std::endl; std::cout << str[5] << std::endl; std::cout << str[6] << std::endl; std::cout << str[7] << std::endl; return 0; }
ما يصح لنا تسمية العمليّة بــ HardCoding. فهي تتعاملُ مع عددٍ من البيانات يدويًا. وهذه المسألة بالتالي قد تُجدي نفعًا في عنصرًا أو عنصرين لكنها مُرهقة للغاية إن كنت تريد طباعة 200 عنصر.
على سبيل المثال ،لن يكن الأمر مرهقًا على مستوى الطباعةِ فحسب، ولكن أيضًا في جلب البيانات ومعالجتها. بالرغم من ذلك , جاءَت دالًة for loop لتكن بذلك الحل الأمثل للتجوّل فيما بين العناصر كافةً.
مكونات دالة for loop هي:
سنعمل خطوة بخطوة في كتابة الكود أولاً:
سنقوم بإضافة مصفوفة مكونة من عناصر عدّة.
#include <string> #include <iostream> int main() { using std::string; string str[8] = { "Welcome" , "To" , "C++" , "Hello" , "World" , "Free" , "circle" , "online"}; for (int i = 0; i < 8; i++) { } return 0; }
المتغير i هو العداد للحلقة التكرارية ، ويجب ألاّ ننسى وضع الفاصلة المنقوطة في C بالطريقة المبينة في الشيفرة.
على سبيل المثال, تخيّل أن هنالك قلم يكتب في حلقة for. وفي كل دورة يضبط من قيمة ساعة العد ومن ثمّ يعمل على زيادتها.
بعد ذلك يدخل في جسم الحلقة for. و بالتالي يعود مرة أخرى للأعلى. ثمّ يضبط قيم العداد من جديد ، وهكذا دواليك.
في الواقع ، القلم هو المترجم ، الذي يستمرّ في الدوران داخل الحلقة التكرارية حين تنتهي. ثم ينتقل إلى مهامٍ أخرى أو ينهي البرنامج.
هذا هو إيقاع البرمجة. إن أتقنتها في فهم الحلقات التكرارية ، وستفهم الكثير لاحقًا.
قم بنسخ شيفرة حلقة for:
#include <string> #include <iostream> int main() { using std::string; string str[8] = { "Welcome" , "To" , "C++" , "Hello" , "World" , "Free" , "circle" , "online"}; for (int i = 0; i < 8; i++) { std::cout << str[i] << " "; } std::cout << "n"; system("PAUSE"); return 0; }
من أجل تعزيز أهميّة الحلقة for. يجب أن ندرك أن المصفوفات لها عناوين وعناصر في الذاكرة. وكل عنوان في مكان مختلف في الذاكرة.
على سبيل المثال ، إذا أردنا الوصول إلى عنصر str [ 3]. التي تحتوي على القيمة “Hello” ، في عداد الحلقة التكرارية. فكل ما علينا فعله هو استخدام جملة الطباعة ليظهر العنصر على الشاشة.
يمكن تسميتها أيضا بالبوّابات المنطقيّة في لغاتِ البرمجة. حيث أنّها تحتوي على شرطٍ يحتمل الصّواب أو الخطأ. بالإضافة إلى أن استخداماتها عديدة ومتنوعة داخل الشّيفرة. فهي بمثابةِ نقطة الالتقاء والّتي من خلالها يدوّن المبرمج خياراته المُتاحة للعتاد.
تتكون الجملة الشرطيّة من صيغة عامّة . حيث تدلّ على خصائصها وهي:
if (x) { //do something }
الجمل الشرطيّة لها فوائد للمبرمج و للمشروع ، ومن أهمّها:
في دورة c++ نقدّم جملة شرطيّة قصيرة.
#include <string> #include <iostream> int main() { using std::string; string str[8] = { "Welcome" , "To" , "C++" , "Hello" , "World" , "Free" , "circle" , "online"}; for (int i = 0; i < 8; i++) { if (str[i] == "Hello") //if statement { std::cout << str[i] << " "; } } std::cout << "n"; system("PAUSE"); return 0; }
من فضلك قم بتطبيق الشيفرة في محرر الكود الخاص بك.
المصفوفة، هي حيّز من المساحة يتم تخصيصه في الذاكرة ، حيث يتكون من متغيّر يحتوي على قيمٍ عدة من العناصر.
يعود استخدام المصفوفات لحاجة من المبرمجين في تنظيم وتنسيق العناصر في الذاكرة. فهي تعود عليهم بالفائدة في حال كان هناك أعداداً كبيرة من العناصر يصعب التّعامل معها.
على سبيل المثال ، عند تحديد 3 متغيرات ، int a = 5 ، int b = 1 ، int c = 6 ، سيتطلب ذلك منك المرور بكافة العناصر وكأنك قمت بدورٍ حسابي عوضاً عن الحاسوب.
وهذا من شأنه ضعف وهشاشة الشيفرة البرمجيّة. لذلك كان لا بد لك من بناء مصفوفة وتعبئة البيانات اللازمة. دون أدنى اكتراث لأماكن وجودها في الذاكرة.
تختلف طريقة طباعة أو قراءة المصفوفة. عن الطرق التقليدية لتعريف المتغيرات وقراءتها.
على سبيل المثال ، وعند طباعة متغير من النوع int a = 6. نسمي هذا المتغير باسم فريد من نوعه داخل المحرر.
لكن عند طباعة المتغيرات داخل المصفوفة أعلاه. نقوم بعمل حلقة تكرارية للمرور بكافة العناصر فيها وجلب البيانات اللاّزمة منها دون معرفة تفاصيلها في الذاكرة.
الفهرس هو مخزن الذاكرة الذي يحوي مكان وعنوان تلك المتغيرات. بالتالي تحدد قيمها بحريّة تامّة ودون الحاجة لاستخدام أسماء وتعريفاتٍ إضافية.
في دورة c ++ المستوى الأول سنتطرق إلى تضمين مثالٍ واحد حول المصفوفات.
#include<iostream>
using namespace std;
int main()
{
int a[4];
cout << "Please Enter Values : n";
for (int i = 0; i <= 3; i++)
{
cin >> a[i];
}
cout << "We Have Finished Fill Array";
for (int i = 0; i < 4; i++)
{
cout << "Inserted " << a[i] << endl;
}
return 0; }
قد تحتاج أحيانًا إلى كتابة الفئات أو الكائنات على صفحة واحدة. من ثمّ تنفيذها مع دوالها خارجياً وعند الحاجة. هل هذا ممكن؟.
نعم هذا ممكن. تتمثل إحدى خصائص الوظائف أو الدوال في أنه يمكن تنفيذها في طريقة الإعلان والتعريف. في هذا الدرس ، سنضع رمزًا للفئات الموجودة لدينا في مكان ما. ثم ننفّذ الوظائف خارج حدود الكائن وذلك عن طريق الاتصال المباشر به.
في بعض الأحيان تتطلب منا الشيفرة بعض التنظيم ، وحلول البرمجة متعددة آنذاك. ونحن الآن أمام لغة تتيح لنا العديد من الحلول.
لذلك كان من السهل على المبرمجين جعل الصفوف في صفحات أخرى من لغة سي. ومن ثم استدعائها وتنفيذها في مكان آخر.
الآن, سنتعلّم سويّاً إنشاء Class ووضع بعض الدوال والمتغيرات بداخله. ومن ثم نقم باستدعائه في صفحة MAIN الخاصة بلغة C++.
سنقوم بعمل Class بمتغيرين ومتغير ثالث يقوم باستقبال النتيجة. بالتالي نعمل على تنفيذها في دالّتين داخل الــ Class.
class calculate
{
private:
int x = 10;
int y = 15;
int res;
public:
void process();
int getResult();
};
لاحظ أننا صنعنا Class هنا وقمنا بتسميته calculate. وأعطيناه قيمًا داخلية للمتغيرات x و y. وسيعيد المتغير res القيمة جراء جمع المتغيرين بدالّة.
تستطيع عمل Declaration(تعيين) اسم الدالة بداخل Class. ومن ثم تقوم بالاتصال بها من الخارج. شريطة القيام بتعريف اسم Class التي أتت الدالة منه.
في دورتنا هذه (دورة c ++). نريد استخدام طريقة أخرى. ولتكن الاتصال من خارج Class. وإجراء بعض العمليّات الحسابية بنفس متغيراته.
void calculate::process() { res = x + y; }
int calculate::getResult() { return res; }
لاحظ أننّا قمنا باستدعاء دوال Class السابق. ومنها دالة الحساب process. والتي جمعنا فيها قيمة x و y ووضعناها في متغير يسمى res. والذي سيتم تطبيقه في دالة رجعية getResult.
ننتقل الآن إلى المرحلة الأخيرة ، وهي الاتصال بالكائن الذي قمنا بإنشائه . بالتالي يصبح الكود الرئيسي كما يلي:
int main()
{
calculate test;
test.process();
int val = test.getResult();
std::cout << “The Result Is : ” << val << endl;
return 0;
}
في السطر الأول ، حددنا الكائن ، وهو من نوع Calculate (الكلاس الذي قمنا ببنائه سابقًا). ثم أطلقنا عليه اسم test، وأطلقنا عليه اسم دالة process.
وبما أن وظيفة get Result هي دالة إرجاع قيمة. فقد تلقّينا قيمتها داخل متغير حدّدناه في الأساسي. وهو نوع val من نوع الدّالة تمامًا. بحيث تظهر قيمة المتغير في شاشة الكونسول.
لقد حاولنا قدر المستطاع تبسيط الشروحات حول الصفوف في دورة c++ مستوى المبتدئين. كما أن للصّفوف استخداماتٍ واسعة في لغة سي. وفي وجودها ستتمكن من عزل الكثير من القُمامة البرمجية.
المؤشرات من أهم خصائص لغة C ++. فهي تحمل بداخلها أهم عنصر من المتغيرات وهو العناوين. حيث تتحكم في عمليات الذاكرة بشكل واسع وغير محدود. وهذا ما يميز C ++ عن لغات أخرى تفتقر إلى هذه الميزة.
تؤدي المؤشرات دورها بشكل مثالي. حيث إنها قادرة على الوصول إلى عناوين المتغيرات الأخرى والتحكم في موضعها في الذاكرة. ويتم تحديد المؤشرات بواسطة هذا النحو الخاص int * p = & x.
لتفادي تعقيد المسألة . إذا نظرنا إلى المتغير عند تعريفه. فسنجد أنه مكون من:
بعد أن قمنا بشرح بسيط شكل المتغيرات في الذاكرة ومكوناتها. سنقوم بتوضيح المؤشرات بمثال عملي بسيط يتناسب مع المستوى المطروح في دورة c ++. فلا تكترث من صعوبة الخطوات السابقة.
سنقدم مثالاً لجلب عنوان المتغير الذي حددناه مسبقاً في الذاكرة:
نحدد متغير عدد صحيح .
#include<iostream> using namespace std; int main() { int a = 5; return 0; }
نقوم بطباعة قيمة المتغير متبوعة بعنوان محجوز في الذاكرة. بحيث يبدو الرمز كما في المثال:
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; return 0; }
قم بمعاينة وتشغيل هذا الرمز لإظهار نتيجة الكونسول كما يلي:
في حال انتابتك بعض الصعوبات في هذا المستوى ، يرجى قراءة الدرس مرة أخرى. ومن ثمّ تطبيق جميع الأمثلة في محرر الكود الخاص بك.
من أهم خصائص ووظائف المؤشرات أنها يمكن لها التأثير في قيم المتغيرات الأخرى. على سبيل المثال. الآن سنقوم بتعريف المؤشر الأول في الذاكرة وربطه بعنوان المتغير a الذي حددناه سابقًا.
نحدد المؤشر ونسميه Pointer* وهو أيضًا من نوع الأعداد الصحيحة. ومن المهم تحديد مؤشرات نوع المتغير.
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; int *pointer = &a; return 0; }
نلاحظ هنا أن المؤشر يجب أن يأخذ عنوان المتغير أثناء التعريف. فمن غير المقبول من قبل المترجم تحديد المؤشر ثم ربطه لاحقًا في عنوان المتغير.
نقوم بزيادة قيمة المتغير a بالمؤشر باستخدام طريقة البادئة. بحيث يصبح شكل الكود كما في المثال.
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; int *pointer = &a; ++*pointer; //This is pointer and we increased a value through it using prefix method return 0; }
في الخطوة الأخيرة ، سنطبع قيمة المتغير a لنرى تأثير المؤشر.
من فضلك ، لفهم المؤشرات جيدًا في دورة c ++. انسخ الرموز التالية في محرر التعليمات البرمجية الخاص بك.
#include<iostream> using namespace std; int main() { int a = 5; std::cout << "This is value of a : " << a << endl; std::cout << "This is address of a : " << &a << endl; int *pointer = &a; ++*pointer; std::cout <<"This value of a after affected by pointer : "<< a<< endl; return 0; }
عزيزي القارئ , في حال وجدت أن درس المؤشرات في دورة c++ ينتابه بعض الصعوبات . ننصحك بالتركيز على الدروس السابقة وركن المؤشرات إلى حين الحاجة إليه.
بعد أن أنهيت دورة c++ المستوى الأول ,بالتالي ستكون قادرا على تنفيذ بعض البرامج والتمييز بين أنواع المتغيرات والصفوف والدوال.
لقد تم وضع هذه الدورة التعليمية في صفحة واحدة وبشكل مختصر ويسير لتتمكن من حصر اللغة وأساسياتها في دورة واحدة.
تهانينا لك بإتمام دورة c++ والبدء بالتقنية من الأساسيات, مع أطيب تمنياتي لك بالنجاح والتوفيق.