# برمجة سي ++

إن لغة البرمجة سي++ (++C) هي واحدة من أكثر لغات البرمجة استخدامًا و أوسعها إنتشارًا بالإضافة إلى جدتها لغة البرمجة سي. تعتبر لغة سي++ من لغات البرمجة الكائنية التوجه (Object-Oriented programming)، وإن كان من الممكن استخدامها بشكل بنيوي (Structural) أو كمزيج من الإثنين.
جزء كبير من لغة سي++ تعتبر من لغات البرمجة عالية المستوى. ولغات البرمجة عالية المستوى هي اللغات التي ظهرت لتسريع عملية البرمجة حيث أن تعليماتها أقرب ماتكون إلى لغة الإنسان وهذا ما يجعل عملية البرمجة أكثر سرعةً وسهولةً. تسهّل لغة سي++ الأسلوب المهيكل والمنهجي لعملية تصميم البرامج، حيث تتألّف برامج هذه اللغة من مكونات تسمّى الأصناف (classes) والدوال (functions) وبالتالي يمكن تقسيم عمليّة تعلّم لغة سي++ إلى قسمين: يعتمد الأول منها على تعلّم لغة سي++ نفسها، في حين يسمح الثاني بتعلّم كيفية استخدام الأصناف الملحقة بهذه اللّغة واستخدام التوابع الموجودة ضمن المكتبة المعياريّة ANSI C.

## ماذا تحتاج للبدء ؟

* تحتاج مصرّف (compiler) (مترجم يقوم بتحويل ما تكتبه إلى لغة الآلة التي يفهمها المعالج)، ورابط (linker)، ومحرر نصوص. بعض بيئات التحرير توفر هذه الثلاث. لاختيار أحد بيئات التطوير المتكاملة، يمكنك رؤية المقارنة بينها على هذه الصفحة في ويكيبيديا الإنجليزية. وفي ما يلي بعض الإقتراحات :
* فيجوال سي ++ (++Visual C)، من شركة ميكروسوفت، وهو مغلق المصدر وغير مجاني.
* برنامج (Intel® C++ Compiler 9.1)، مغلق المصدر ومجاني لمدّة معينة. للتحميل
* بيئة (Quincy 2005) الذي يأتي مع مصرّف gcc وأدوات أخرى حرّة. للتحميل
* استخدام برامج حزمة مينجوي، تعمل من سطر أوامر دوس (DOS) بشكل عام وتستخدم مصرّف (gcc) وأدوات أخرى مرافقة. للتحميل
* استخدام بيئة إكليبس (Eclipse CDT)، و هي مجانية ومفتوحة المصدر. للتحميل.
* برنامج Dev C++ ، وهو مجاني ومفتوح المصدر.
* برنامج Code Blocks ، وهو مجاني ومفتوح المصدر.للتحميل.

## قائمة الموضوعات و الدروس

* ملاحظة: يحتوي كل موضوع على شرح مبسط لفكرة و هدف الدرس، الغرض من هذا الشرح هو تنظيم كتابة الدروس و المحافظة على تسلسلها بشكل منطقي.
* من الممكن - بعد الانتهاء من الكتاب - اختصار هذه الشروح الصغيرة بشكل أكبر بحيث لا تزيد عن خمس كلمات.
* مقدمة في البرمجة
** التفكير في كيفية عمل الأشياء، إيجاد حلول للمشاكل، الخ
* الدرس الأول
** البرنامج الأول(الفارغ)، شرح مفاهيم أساسية: نقطة الدخول إلى البرنامج، نقطة الخروج، لماذا الـ main؟ فكرة عامة عن تقسيم البرامج الكبيرة إلى أجزاء صغيرة (برامج جزئية).
* الدرس الثاني
** الكتابة على الشاشة، العمليات الأساسية، الجمع و الطرح، المتغيرات، الثوابت (litteral constants).
* الدرس الثالث
** القراءة من المستخدم، تابع العمليات الرياضية و الاشارات في اللغة
* الدرس الرابع
** السير المنطقي للبرنامج، الأوامر الشرطية، الاشارات الشرطية، و منطقها
* الدرس الخامس
** تمارين، حل مشكلات بسيطة، أمثلة للتفكير البرمجي، التركيز على عقلية التحليل .. الخ.
* الدرس السادس
** الدوال (functions)، تقسيم البرنامج إلى برامج جزئية (حسب المهام)، إرسال الإعدادات (parameters) الخ.
* الدرس السابع
** تابع الدوال (functions)، مفهوم الـ expression و الـ return value، استخدام الدوال (functions) كعمليات حسابية، نطاق المتغيرات scope الخ.
* الدرس الثامن
** استخدام الدوال (functions) لتحسين بنية و تركيب البرامج، تحسين برامجنا السابقة.
* الدرس التاسع
** تطبيقات و تمارين، مزيد من المشاكل و حلولها
* الدرس العاشر
** المصفوفات (arrays)، مفهوم الـ initialization بشكل عام، و تطبيقه على المصفوفات و بيان حالاته الاستثنائية.
* الدرس الحادي عشر
** مفاهيم عامة عن الذاكرة، طبيعة المصفوفات في الذاكرة، مقدمة عن المؤشرات.
* الدرس الثاني عشر
** استخدام المصفوفات في البرامج، التفكير في استخدامها، فوائدها، تطبيقات، الخ.
* الدرس الثالث عشر
** مقدمة عن المؤشرات: مفهوم الـ statically allocated و الـ dynamically allocated بالنسبة للمتغيرات، الكومبايلر و أسماء المتغيرات و عناوينها في الذاكرة، استخدام المؤشرات للوصول إلى المتغيرات اللتي تم حجزها ديناميكيا.
* الدرس الرابع عشر
** تطبيق على المؤشرات: إرسال عناوين المتغيرات إلى الدوال (functions)، مع تركيز على شرح الستاك و توضيح عدم جواز إرجاع مؤشر لمتغير داخلي في فنكشن، مع مقدمة عن الرفرنس في السي بلص بلص.
* الدرس الخامس عشر
** الـ struct، تجميع معلومات متعلقة ببعضها، تمثيل حالة كائنات حقيقية، الخ.
* الدرس السادس عشر
** تطبيقات عملية على الـ struct
* الدرس السابع عشر
** استخدام الـ struct و المؤشرات لعمل linked list. نقاط القوة الضعف في الـ linked list و متى يمكن استخدامها، مع تطبيق بسيط.
* الدرس الثامن عشر
** الأقسام (class)، توضيح عام من ناحية لغوية، الـ syntax الخاص بالأقسام الخ.
* الدرس التاسع عشر
** البرمجة الشيئية / الكانئية، الكائنات objects، مفاهيم متعمقة .. تحليل المشكلة إلى أشياء وكائنات، الخصائص والتصرفات، attrbutes and behaviour .. الخ.
* الدرس العشرون
** تابع مفاهيم متعمقة عن البرمحة الشيئية.. تصميم الحلول باستخدام الكائنات، ذكر بسيط لقضايا الـ cohesion and coupling، مع تطبيقات عملية، و لو بسيطة.
* الدرس الحادي و العشرون
** مناقشة مواضيع الـ cohesion، coupling،1235 association: التفكير جيدا في تصميم الفئات بشكل جيد ومتماسك، فصل المهام الزائدة عن الـ class إلى فئات classes أخرى، الربط بين الكائنات، تقليل التداخل coupling.
* الدرس الثاني و العشرون
** الوراثة (inheritance)، مع تطبيقات.
* الدرس الثالث و العشرون
** الـ (polymorphism).
* الدرس الرابع و العشرون
** تطبيقات عملية تستخدم المفاهيم اللتي تمت مناقشتها، مع التقديم لبعض الـ (design patterns)، كالـ (singleton) مثلا.