مراجعة الدّالّة
هيكل برنامج C++
#include <iostream> using namespace std; int main() { cout << "Welcome to OOP in C++" << endl; return 0; }
دعونا نحلل بنية كل سطر أوامر والغرض منه في الكود السابق :
#include <iostream>
البنية: يبدأ هذا السطر بتوجيه #include للمعالج المسبق، متبوعًا بملف الـ(heading) المحاط بأقواس زاوية.
الغرض: يتضمن هذا السطر مكتبة دفق الإدخال/الإخراج (iostream)، والتي تعتبر ضرورية لتنفيذ عمليات الإدخال والإخراج في C++. يوفر دوال مثل cin للإدخال و cout للإخراج.
using namespace std;
البنية: استخدام مساحة الاسم std؛ يعلن السطر أن الكود سيستخدم مساحة الاسم std.
الغرض: تحتوي مساحة الاسم std على مكونات مكتبة C++ القياسية، بما في ذلك cout وendl المستخدم في التعليمات البرمجية. ومن خلال تضمين هذا السطر، يمكنك استخدام هذه المكونات دون تحديد مساحة الاسم بشكل صريح في كل مرة تستخدمها فيها.
int main() {
البنية: يمثل هذا السطر بداية الدالة الرئيسية main، وهي نقطة الدخول لكل برنامج C++.
الغرض: الدالة الرئيسية هي المكان الذي يبدأ فيه تنفيذ البرنامج. إنه مطلوب في كل برنامج C++، والكود الموجود داخل الأقواس المتعرجة {} يحدد نص الدالة الرئيسية.
cout << "Welcome to OOP in C++" << endl;
البنية: يستخدم هذا السطر كائن cout لطباعة النص "Welcome to OOP in C++" إلى شاشة المخرجات. يتم استخدام عامل التشغيل << لتمرير النص إلى المخرجات.
الغرض: هذا السطر مسؤول عن عرض رسالة ترحيب على شاشة المخرجات، تشير إلى أن البرنامج يركز على البرمجة كائنية التوجه (OOP) في لغة C++.
return 0; }
البنية: الإسترجاع بقيمة 0؛ يشير السطر إلى نهاية الدالة الرئيسية. يتم إرجاع الرقم 0 إلى نظام التشغيل، مما يشير إلى تنفيذ البرنامج بنجاح.
الغرض: الإسترجاع بقيمة 0؛ يعد السطر طريقة شائعة للإشارة إلى الإنهاء الناجح للبرنامج. عادةً ما يتم إرجاع القيمة 0 إلى نظام التشغيل للإشارة إلى أن البرنامج تم تنفيذه بدون أخطاء.
المكتبات في لغة C++
في لغة C++، المكتبة عبارة عن مجموعة من الدوال والفئات والإجراءات المترجمة مسبقًا والتي يمكن استخدامها بواسطة البرنامج. توفر هذه المكتبات مجموعة من الدوال التي يمكن استخدامها لأداء المهام الشائعة، بدءًا من عمليات الإدخال/الإخراج الأساسية إلى الحسابات الرياضية المعقدة. توفر المكتبات طريقة لنموذجية التعليمات البرمجية، وتعزيز إعادة استخدام التعليمات البرمجية، وتبسيط عملية التطوير من خلال توفير حلول جاهزة لمختلف المهام.
فيما يلي بعض الجوانب الرئيسية للمكتبات في C++:
- مكتبة النماذج القياسية (STL):
تعد مكتبة C++ القياسية، والتي يشار إليها غالبًا باسم مكتبة النماذج القياسية (STL)، جزءًا أساسيًا من لغة C++. وتتضمن نطاقًا واسعًا من الخوارزميات العامة (مثل الفرز والبحث) وهياكل البيانات (مثل المتجهات والقوائم والخرائط) التي يتم تنفيذها باستخدام القوالب. تعمل STL على تبسيط البرمجة من خلال توفير حلول فعالة وعامة للمشاكل الشائعة. - الملفات الرأسية Header Files:
يتم توزيع مكتبات C++ عادةً كملفات رأسية (بامتداد .h أو .hpp) وملفات تنفيذ (بملحق .cpp). تحتوي الملفات الرأسية على إعلانات الدوال والفئات والكيانات الأخرى التي يمكن استخدامها في برنامجك، بينما تحتوي ملفات التنفيذ على الكود الفعلي. - مكتبة IOStream:
تعد مكتبة iostream جزءًا أساسيًا من مكتبة C++ القياسية وتوفر دوال لعمليات الإدخال والإخراج. تتضمن cin (للإدخال) وcout (للإخراج)، من بين فئات الدفق الأخرى. فيما يلي مثال لاستخدام مكتبة iostream:#include <iostream> int main() { std::cout << "Hello, C++!" << std::endl; return 0; }
- مكتبة الـMath:
توفر مكتبة cmath مجموعة من الدوال الرياضية، مثل الدوال المثلثية واللوغاريتمية والدوال الأسية. - المكتبات المعرفة من قبل المستخدم:
وبصرف النظر عن المكتبات القياسية، يمكنك إنشاء مكتباتك الخاصة لتغليف وتنظيم التعليمات البرمجية الخاصة بك. يتضمن ذلك إنشاء ملفات رأسية تعلن عن الدوال والفئات، وملفات التنفيذ التي تحدد سلوكها. يمكنك بعد ذلك تضمين مكتبتك المخصصة في برامج C++ الأخرى.
الدالة في لغة C++
في مجال البرمجة، تلعب الدوال دورًا محوريًا في تنظيم التعليمات البرمجية، وتعزيز إمكانية إعادة الاستخدام، وتعزيز النهج المنظم لحل المشكلات. في لغة C++، الدالة هي وحدة قائمة بذاتها من التعليمات البرمجية مصممة لأداء مهمة محددة أو تحقيق هدف معين. فهي تحتوي على مجموعة من التعليمات، مما يسمح لك بتقسيم البرنامج المعقد إلى أجزاء أصغر وأكثر قابلية للإدارة.
المفاهيم الرئيسية
1. Modularity:
تتيح الدوال تحليل البرنامج إلى وحدات أصغر وأكثر قابلية للإدارة. تتعامل كل دالة مع جانب محدد من الوظيفة العامة، مما يعزز بنية التعليمات البرمجية المعيارية والمنظمة.
2. قابلية إعادة الاستخدام:
بمجرد تعريف الدالة، يمكن إعادة استخدامها في أجزاء مختلفة من البرنامج أو حتى في برامج أخرى. وهذا يعزز مبدأ "لا تكرر نفسك" (DRY)، مما يوفر الوقت والجهد.
3. التجريد:
توفر الدوال مستوى من التجريد، مما يسمح لك بالتركيز على الوظائف عالية المستوى دون التورط في تفاصيل التنفيذ. يعمل هذا التجريد على تحسين إمكانية قراءة التعليمات البرمجية وتبسيط عملية تصحيح الأخطاء.
4. Parameters وقيم الإرجاع Return:
يمكن أن تقبل الدوال parameters الإدخال وقيم الإرجاع، مما يسمح بالتعليمات البرمجية الديناميكية والتفاعلية. توفر الـparameters طريقة لتمرير المعلومات إلى دالة، بينما تسمح قيم الإرجاع للدوال بإرسال النتائج مرة أخرى إلى كود الاستدعاء.
بناء الجملة الأساسي
تتبع دالة C++ النموذجية بناء الجملة الأساسي هذا:
returnType functionName(parameterType1 parameterName1, parameterType2 parameterName2, ...) { // Function body: Code to perform the desired task // Optionally, a return statement to provide a result back to the caller }
دعونا نحلل المكونات:
returnType: يحدد نوع البيانات التي ستعيدها الدالة (إن وجدت).
functionName: المعرف الفريد للدالة.
parameters: قيم الإدخال التي تتلقاها الدالة.
functionBody: مجموعة التعليمات التي تحدد سلوك الدالة.
مثال 1:
#include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int main() { cout << sum(10,20) << endl; return 0; }
برنامج C++ هذا هو برنامج بسيط يقوم بحساب وعرض مجموع رقمين.
- تحديد دالة المجموع:
int sum(int x, int y) { return x + y; }
تقوم مجموعة التعليمات البرمجية التالية بإنشاء دالة تسمى sum. تأخذ رقمين (x و y) وتعيد مجموعهما.
- استخدم الدالة Sum في الجزء الرئيسي main:
int main() { cout << sum(10, 20) << endl; return 0; }
هنا، الجزء الرئيسي main يشبه مدير البرنامج. يقول: "مرحبًا، احسب مجموع 10 و20 باستخدام دالة المجموع، وأرني النتيجة على الشاشة." إن endl يشبه الضغط على Enter على لوحة المفاتيح؛ ينتقل إلى السطر التالي.
- تشغيل البرنامج:
عند تشغيل هذا البرنامج يقوم بعملية الحساب (10 + 20) داخل دالة المجموع، ثم يعرض النتيجة (30) على الشاشة. الإرجاع return 0; يخبر الكمبيوتر أن كل شيء سار على ما يرام.
بالطبع يمكن للمستخدم إدخال البيانات المراد حسابها باستخدام cin باستخدام هذا الأمر:
cin >> x >> y;
يمكن أن يكون هذا الأمر موجودًا داخل الدالة الرئيسية، ولكن من الأفضل استخدامه داخل الدالة نفسها للحصول على كود أكثر وضوحًا.
انظر المثال التالي:
#include <iostream> using namespace std; int sum(int x, int y) { cout << "Enter two numbers:\n"; cin >> x >> y; return x + y; } int main() { int x = 0, y = 0; int z = sum(x, y); cout << "The sum is = " << z << endl; return 0; }
يطلب هذا الكود من المستخدم إدخال رقمين، وجمعهما معًا، ثم عرض النتيجة.
- تحديد دالة المجموع:
int sum(int x, int y) { cout << "Enter two numbers:\n"; cin >> x >> y; return x + y; }
تعرف مجموعة التعليمات البرمجية هذه دالة تسمى sum. يطلب من المستخدم إدخال رقمين، وقراءة هذه الأرقام من لوحة المفاتيح (cin)، ثم إرجاع مجموع تلك الأرقام.
- استخدم الدالة Sum في الجزء الرئيسي main:
int main() { int x = 0, y = 0; int z = sum(x, y); cout << "The sum is = " << z << endl; return 0; }
في الجزء الرئيسي main، يبدأ بإعطاء x وy القيمة 0. ثم يستدعي دالة المجموع، ويمرر x وy كوسائط. تحصل الدالة sum على مدخلات المستخدم، وتضيف الأرقام، وترجع النتيجة. يتم تخزين النتيجة في z. وأخيرًا، يعرض المجموع برسالة باستخدام cout.
لذا، باختصار، هذا البرنامج يشبه آلة حاسبة تفاعلية بسيطة. يطلب منك رقمين، ويجمعهم معًا، ثم يظهر لك النتيجة على الشاشة.
يعد توفير القيم الأولية للمتغيرات أمرًا بالغ الأهمية لتجنب الأخطاء.
مثال 2:
#include <iostream> using namespace std; double avg(double m1, double m2, double m3) { return (m1 + m2 + m3) / 3; } int main() { cout << avg(100, 60, 50); return 0; }
يقوم هذا الكود بحساب وعرض متوسط ثلاثة أرقام.
تأخذ الدالة avg ثلاثة أرقام (m1 وm2 وm3)، وتقوم بجمعها معًا وتقسيمها على 3 وإرجاع النتيجة. هذه هي الطريقة التي تحسب بها متوسط ثلاثة أرقام.
في الجزء الرئيسي، يتم استدعاء الدالة avg مباشرةً باستخدام ثلاثة أرقام (100 و60 و50) كوسيطات. ثم يستخدم cout لعرض النتيجة، وهي متوسط هذه الأرقام الثلاثة.
مثال 3:
#include <iostream> using namespace std; int max(int n1, int n2, int n3) { int m = n1; if (m < n2) m = n2; if (m < n3) m = n3; return m; } int main() { cout << max(100, 20, 800); return 0; }
يقوم هذا الكود بعرض ثلاث أرقام وطباعة الرقم الأكبر بينهم.
تأخذ الدالة max ثلاثة أرقام (n1 وn2 وn3) وتستخدم العبارات الشرطية (if) لتحديد العدد الأكبر قيمة فيما بينها. يبدأ باعتبار n1 القيمة الكبرى الأولية ثم يستخدم العبارات الشرطية (if) لمقارنتها بالقيم الأخرى. كلما تم استيفاء الشرط، يتم تحديث القيمة القصوى. ثم يتم إرجاع القيمة الكبرى.
في الجزء الرئيسي، يستدعي مباشرة الدالة max بثلاثة أرقام (100، 20، و800) كوسيطات. ثم يستخدم cout لعرض النتيجة، وهي القيمة الأكبر بين هذه الأرقام الثلاثة.
يمكننا إيجاد قيمة صُغرى بين القيم الأخرى باستخدام نفس المنطق ولكن مع تغيير الشروط.
مثال 4:
#include <iostream> using namespace std; void p() { cout << "myName\n"; } int main() { p(); return 0; }
يعرف هذا الكود دالة ثم يستدعي تلك الدالة في الجزء الرئيسي من البرنامج.
تستخدم الدالة المسماة p كلمة أساسية void قبل اسم الدالة مما يعني أن هذه الدالة لا تُرجع أي قيمة. داخل الدالة، يستخدم cout لعرض النص "myName" على الشاشة.
في الجزء الرئيسي، يتم إستدعاء الدالة p. عند استدعاء دالة، ينتقل البرنامج إلى تلك الدالة، وينفذ المهام الموجودة بداخلها، ثم يعود إلى حيث تم استدعاؤها. في هذه الحالة، ينتقل إلى الدالة p، ويطبع "myName" على الشاشة، ثم يعود إلى الدالة الرئيسية.
- الآن دعونا نتحدث عن دالة void:
الدالة void هي دالة لا تُرجع قيمة. في هذا المثال، تعتبر الدالة p دالة void لأنها تحتوي على الكلمة الأساسية void قبل اسمها.
تكون دوال void مفيدة عندما تريد من إحدى الدوال تنفيذ مهمة أو مجموعة من المهام دون الحاجة إلى تقديم نتيجة إلى جزء البرنامج الذي يستدعيها.
مثال 5:
#include <iostream> using namespace std; int mul(int x = 10, int y = 50) { return x*y; } int main() { cout << mul(10) << endl; cout << mul(10, 2) << endl; cout << mul() << endl; return 0; }
يوضح هذا الرمز استخدام الـarguments الافتراضية في دالة.
تقوم الدالة المسماة mul بضرب رقمين (x وy). الجزء المثير للاهتمام هو أن كلا من x وy لهما قيم افتراضية معينة (10 و50 على التوالي). إذا لم يتم توفير هذه القيم عند استدعاء الدالة، فسيتم استخدام هذه القيم الافتراضية.
في الجزء الرئيسي، يتم استدعاء الدالة mul عدة مرات باستخدام مجموعات مختلفة من الـarguments:
mul(10): يستخدم القيمة الافتراضية 50 لـ y، لذلك يتم ضرب 10 في 50.
mul(10, 2): يستخدم كلا من 10 و2 المقدمين كـarguments، لذلك يقوم بضرب 10 في 2.
mul(): نظرًا لعدم توفير أي وسائط، فإنه يستخدم كلا القيمتين الافتراضيتين (10 و50)، لذلك يقوم بضرب 10 في 50.
- الآن دعونا نتحدث عن الـarguments الافتراضية:
تسمح لك الـarguments الافتراضية بتوفير قيم للـparameters في إعلان الدالة، لذلك إذا لم يقدم المتصل قيمًا، فسيتم استخدام القيم الافتراضية.
في هذا المثال، تحتوي الدالة mul على قيم افتراضية لكل من x وy، مما يجعلها مرنة عند استدعاء الدالة بأعداد مختلفة من الـarguments.
مثال 6:
#include <iostream> using namespace std; void ref(int &x, int &y) { x += 1; y += 1; } int main() { int p = 0, t = 0; ref(p, t); cout << "p = " << p << endl; cout << "t = " << t << endl; return 0; }
يوضح هذا الرمز مفهوم "الاستدعاء حسب المرجع".
تحتوي الدالة المسماة ref على جزء مثير للاهتمام وهو أنها تأخذ المراجع (&x و&y) كـparameters، مما يشير إلى أنها ستقوم مباشرة بتعديل قيم المتغيرات التي تم تمريرها إليها.
في الجزء الرئيسي، يعلن عن متغيرين (p وt) ويقوم بتهيئتهما إلى 0. ثم يستدعي الدالة ref مع p وt كوسيطتين. داخل الدالة ref، يتم زيادة كل من p وt بمقدار 1. وأخيرًا، يتم طباعة قيم p وt بعد استدعاء الدالة باستخدام cout.
- الآن دعونا نتحدث عن الإستدعاء حسب المرجع:
في لغة C++، عندما تقوم بتمرير parameters إلى دالة حسب المرجع (باستخدام &)، تتلقى الدالة عناوين الذاكرة الخاصة بالمتغيرات الفعلية، وليس فقط نسخًا من قيمها.
وهذا يعني أن أي تغييرات يتم إجراؤها على الـparameters داخل الدالة تؤثر بشكل مباشر على المتغيرات الأصلية خارج الدالة.
في هذا المثال، تقوم الدالة ref بتعديل قيم p وt مباشرة لأنه يتم تمريرهما حسب المرجع.
الدوال الجاهزة Built-in functions
الدوال الجاهزة في C++ هي دوال محددة مسبقًا توفرها لغة برمجة C++. تعد هذه الدوال جزءًا من مكتبة C++ القياسية وتقدم حلولاً جاهزة للمهام الشائعة. وهي مصممة لتنفيذ عمليات محددة ويمكن للمبرمجين استخدامها دون الحاجة إلى كتابة التعليمات البرمجية الكاملة لتلك العمليات.
إليك شرح بسيط:
- أدوات جاهزة:
تشبه الدوال الجاهزة الأدوات المتوفرة بالفعل لتستخدمها. بدلاً من إنشاء هذه الأدوات من الصفر، يمكنك ببساطة استخدام الدوال الجاهزة لتنفيذ مهام متنوعة. - جزة من مكتبة C++ القياسية:
هذه الدوال هي جزء من مكتبة C++ القياسية، وهي عبارة عن مجموعة من الأدوات الدوال التي تأتي مع كل C++ compiler. لا تحتاج إلى إنشاء أو تثبيت أي شيء إضافي لاستخدامها. - العمليات المشتركة:
تم تصميم الدوال الجاهزة لتنفيذ عمليات شائعة مثل الإدخال/الإخراج، والحسابات الرياضية، ومعالجة السلسلة، والمزيد. تتضمن الأمثلة cout وcin للطباعة والقراءة من شاشة النتائج، وsqrt للجذر التربيعي، وstrlen للحصول على طول السلسلة. - توفير الوقت:
باستخدام الدوال الجاهزة، يمكنك توفير الكثير من الوقت والجهد. لا تحتاج إلى كتابة تعليمات برمجية معقدة للمهام التي يتم التعامل معها بالفعل بواسطة هذه الدوال. - الاتساق عبر المنصات:
نظرًا لأن هذه الدوال جزء من المكتبة القياسية، فإنها توفر طريقة متسقة لتنفيذ العمليات عبر الأنظمة الأساسية والمترجمين المختلفين. وهذا يجعل التعليمات البرمجية الخاصة بك أكثر قابلية للنقل ويضمن أنها تعمل بشكل مماثل على أنظمة مختلفة.
في جوهرها، الدوال الجاهزة في لغة C++ تشبه صندوق الأدوات الذي يأتي مع اللغة. أنها توفر مجموعة من الأدوات التي يمكنك استخدامها لجعل مهام البرمجة الخاصة بك أسهل وأسرع وأكثر توحيدًا. عندما تصبح أكثر دراية بـ C++، ستكتشف هذه الدوال وتستفيد منها لتبسيط التعليمات البرمجية الخاصة بك.
فيما يلي بعض الدوال الجاهزة الأكثر شيوعًا في لغة C++:
- دوال الإدخال والإخراج Input/Output Functions:
cout: يستخدم لعرض المخرجات على شاشة النتائج.
cin: يستخدم لأخذ المدخلات من المستخدم من خلال شاشة المخرجات. - دوال العمليات الرياضية:
()sqrt: حساب الجذر التربيعي.
()abs: إعادة القيمة المطلقة لعدد ما.
()pow: رفع العدد إلى قوّة. - دوال النصوص string:
()strlen: إرجاع طول السلسلة.
()strcpy: نسخ نص string إلى نص string آخر.
()strcat: جمع نصّين. - دوال الأحرف:
()isalpha: التحقق مما إذا كان الحرف هو حرف أبجدي.
()isdigit: يتحقق مما إذا كان الحرف رقمًا.
()toupper: تحويل الحرف إلى أحرف كبيرة. - دوال المصفوفات:
()sizeof: إرجاع حجم نوع البيانات أو المصفوفة.
()فرز: فرز العناصر في مصفوفة بترتيب تصاعدي. - دوال الذاكرة:
()malloc: يخصص مقدارًا محددًا من الذاكرة ديناميكيًا.
()free: لتحرير الذاكرة التي تم تخصيصها مسبقًا باستخدام malloc. - دوال الوقت والتاريخ:
()time: إرجاع الوقت الحالي بالثواني.
()ctime: تحويل قيمة زمنية إلى تمثيل نص.
مثال 7:
#include <iostream> #include <cmath> #include <algorithm> using namespace std; int main() { cout << abs(-10) << endl; cout << max(10, 20) << endl; cout << max(max(10, 20), 30) << endl; int x = 10, y = 20; swap(x,y); cout << "x = " << x << endl; cout << "y = " << y << endl; return 0; }
يوضح هذا الكود استخدام العديد من الدوال الجاهزة من مكتبات و.
- abs(-10): حساب القيمة المطلقة لـ -10 وطباعة النتيجة (10) على شاشة المخرجات.
- (10، 20)max: يبحث عن القيمة الأكبر بين عددين (10 و 20) ويطبع النتيجة (20) على شاشة المخرجات.
- max(max(10, 20), 30): يقارن بين ثلاثة أرقام (10، 20، و30) ويجد العدد الأكبر بينها. يقوم بطباعة النتيجة (30) إلى شاشة المخرجات.
- (x، y)swap: مبادلة قيم x و y. بعد هذا السطر، x سيكون 20، و y سيكون 10.
المخرجات:
10 20 30 x = 20 y = 10