post

لمحة حول ميزات 2018.1 Unity النسخة التجريبية

السلام عليكم ورحمة الله وبركاته ، طرحت شركة unity تسخة تجريبية للإصدار الجديد لمحركها لعام 2018 تحت رقم إصدار 2018.1 ، حيث قامت بذكر أهم الأجزاء التي سيحتويه والتي ستكون مضمنة في النسخة النهائية من الإصدار، حيث سيحتوي الإصدار على الكثير من التحسينات والإضافات الجديدة مثل نظام التفاصيل الزائدة Tessellation for Metal و إستحدام كرت الشاشة في الإضاءة غير المباشرة GPU Instancing ، إضافة منظور ال PS4 لنافذة Game Resolution وتحسينات على نظام الجزئيات Particle system والتحسين على بلجت التصدير FBX وغيرها الكثير. وهنا ذكر لأهم الميزات لهذه النسخة :

* نظام تصيير جديد  Scriptable Render Pipeline

حيث قدمت الشركة في هذه النسخة نظام إظهار آني real-time rendering ذو الإختصار SRP ، حيث أنه تم تصميمه خصيصاً لمواكبة الأجهزة الحديثة وكروت الشاشة السريعة جداً ، فبدلاً من النظر إلى ملايين أسطر البرمجة بلغة السي ++ أصبح الآن بالإمكان التعامل معه بواسطة لغة السي شارب و عمل شيدرز سريع للمواد Material Shaders بسهولة. حيث ستقوم الشركة بوضع أنظمة جاهزة Templates تستطيع من خلالها إختيار طريقة العرض التي ستلائم مشروعك بتقسيمين : Lightweight  حيث سيكون مثالي لأجهزة الموبايل والأجهزة الخفيفة و High-Definition حيث سيكون ملائم للمواصفات العالية جداً مثل أجهزة الحاسوب وغيرها.

* أداة visual shader creation

حيث تم تطوير هذه الأداة خصيصاً للمصممين والرسامين ، فبواسطة هذه الأداة يمكنك عمل مواد معقدة من خلال طريقة ال Graph Nodes  ،  فبدلاً من كتابة Shaders خاصة بواسطة الأسطر البرمجية أصبح بإمكانك عمل Shader كامل بواسطة ربط ال Nodes ببعضها لتحصل على الشكل النهائي الذي تريده ، وهذه الميزة كانت من أكثر الميزات طلباً من جمهور المطورين وتم الإستجابة لهم من الشركة .

* قريباً C# Job System

تحسينات وتطويرات ستكون متاحة قريباً تزيد من كفاءة اللعبة خاصة لمن يقوم بكتابة الأسطر البرمجة بلغة السي شارب

* تعديل على المواصفات الدنيا System Requirements

قامت الشركة بحذف العديد من الأمور التي كانت ضمنياً متاحة داخل المحرك وذلك بهدف جعل المحرك أكثر مرونة، وتركت باب الحصول على الميزات السابقة متاحة بتنزيلها منفصلة عن المحرك ، فقد قامت بفصل إمكانية إستيراد مواد Substance Designer materials وفصل Wii U  و فصل Windows XP in standalone player و فصل محرر MonoDevelop حيث أنها تنصح بإستخدام فيجوال ستوديو من شركة مايكروسوفت ، وقامت بزيادة مواصفات macOS إلى النسخة 10.11 على الأقل ، وهي تعمل على فصل نظام الجزئيات التقليدي  Legacy Particle System في النسخة القادمة وإستبداله بنظام جديد

يجدر بالذكر أن النسخة هي نسخة تجريبية ويمكنك تنزيلها والمشاركة بها من خلال هذا الرابط : https://unity3d.com/unity/beta

 

 

post

#14 الدوال Methods – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OXW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الدوال Methods

 

السلام عليكم و رحمة الله و بركاته ، و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة لمبتدئين كلياً بواسطة السي شارب

درس اليوم ” الدوال الـ Method “

و هي من أساسيات البرمجة و هي التي أعطت للمطورين إمكانية أن يقوم بتنفيذ مشروعه دون أن يقوم بتكرار الأسطر البرمجية أكثر من مرة

سابقاً لم يكن هناك دوال و كان المطور مجبراً على كتابة أسطر برمجية متتالية ، فتجد أن البرنامج عبارة عن 1000 سطر على سبيل المثال ، كلها متتالية حيث ينفذ السطر الأول ثم الثاني فالثالث و هكذا ….. مما كان يجعل الأمر صعباً

و خصوصاً في حال وجود أي خطأ في البرنامج فيجب أن يقوم بتتبع للبرنامج ليصل إلى مكان الخطأ

 

كما تعلمنا في كل الدروس السابقة نقوم بإنشاء مشروع جديد و نختار Visual C# ثم Console Application و سنكتب اسم البرنامج هذه المرة ” Methods ”
و تكلمنا أنه يجب أن نقوم بالبدء بالكتابة بين قوسي الدالة void Main

لكن في هذا الدرس سنتعرف إلى طريقة جديدة و مفهوم جديد يمكننا بواسطته إنشاء دوال .

و الدالة يمكن شرحها بأنها قطعة برمجية  Block of Code تبدأ بقوس و تنتهي بقوس آخر ، و تحمل اسم , حيث يتم استدعاء هذا الاسم لتقوم بالعمل الخاص بها .

لاحظو الدالة الرئيسية void Main و هي الدالة التي يبدأ بها الـبرنامج

سنقوم الآن بكتابة دالة رئيسية و سنقوم بشرحها و شرح التركيبة الخاصة بها

هذه الدالة يمكن استخدامها و استدعاؤها في الدوال الأخرى كالتالي :

أخذ اسم الدالة (PrintMessage) ثم فتح القوس الخاص بها و اغلاقه و كتابة الفاصلة المنقوطة .

و لا ننسى أن نقوم بكتابة الدالة ReadLine

عند تشغيل التطبيق سيقوم بطباعة Hello World !

الفكرة من الدوال أنه يمكنك إضافة العديد من الأسطر البرمجية في وِحدة خاصة بها ، بحيث في حال الحاجة إلى تكرار الأسطر ، فيمكنك استدعاؤها عن طريق اسمها دون الحاجة لكتابة كافة الأسطر .

شرح الدالة

في البداية يجب أن تقوم بكتابة الدالة خارج الـ void Main  لأنه لا يمكن كتابة دالة داخل دالة

لذلك إذا أردت كتابة دالة فيجب كتابتها خارج الدوال الأخرى

الترتيب غير مهم هنا و هذا يعني أنه بإمكانك كتابتها قبل أو بعد الـ void Main

و عند الحاجة إليها أقوم بكتابة اسمها دون كتابة الأسطر البرمجية الموجودة بداخلها

 

فوائد الدوال :

(1) : استدعاء أسطر برمجية يتم كتابتها أكثر من مرة ، بحيث تقوم بكتابتها مرة واحدة داخل الدالة ثم تقوم باستدعاء الدالة في كل مرة تحتاج إلها .

(2) : عدم تكرار الأسطر البرمجية نفسها

(3) : تقوم بتنظيم المشروع

(4) : في حال حصول أي مشكلة يمكن تعديلها بشكل بسيط في مكان واحد دون تتبع التطبيق بشكل كامل

 

هذه القضايا سنتكلم عنها في الدروس القادمة و سنتحدث الآن عن الدالة void

 

 

الـ void هي نوع من أنواع البيانات أو أنواع الـ Data مثل integer  و  string

لكنها لا تعود بقيمة و سنتعرف عليها بعد قليل

يمكننا نقل السطر ;()Console.ReadLine إلى الدالة التي قمنا بإنشائها

 

هذا التطبيق يعد بسيطاً ، لذلك سنأخذ برنامجاً قمت بكتابته سابقاً ، و هو يحتوي على تكرار للاسطر البرمجية و سنقوم بإضافة الدوال  لتحسينه و ترتيبه بشكل أفضل

 

هذا البرنامج يسأل المستخدم عن اسمه و اسم عائلته ، ثم يسأل عن المدينة التي ولد فيها ، ثم يقوم بإظهار رسالة تحتوي على العناصر السابقة بشكل معكوس كما تعلمنا في الدرس السابق ، و ذلك عن طريق الدالة Array.Reverse

لدينا الآن أسطر برمجية مكررة في هذا التطبيق ، حيث يقوم بطباعة جملة ثم يقوم بمطالبة المستخدم بعملية إدخال و يكرر هذا الأمر

ثم يقوم بتعريف Array من النوع char  ثم يأمر بتحويلها إلى مصفوفة ثم يقوم بعملية عكس لهذه المصفوفة

إذا لدينا ثلاث أسئلة و لكل سؤال 4 عمليات

و بالتالي لدينا تقريباً 12 سطر

و في النهاية يقوم بتعريف متغير جديد باسم result

و يقوم باستخدام الحلقة foreach ليقوم بأخذ هذه الأحرف و يجمعها ليعطي هذه النتيجة

نلاحظ عند تشغيل التطبيق أنه أخذ كلمة كلمة و لم يعكس الجملة كاملة ، حيث قمت بإدخال Osama  ثم  Deep ثم amman

فأخذ الاسم الأول و قام بعكسه ، ثم أضاف مسافة قبل الاسم الثاني ثم تابع أخذ الاسم الثاني و المدينة ،

عندها قام بإعطاء النتيجة كالتالي

Result : amaso peed namma

لنرى كيف نكتب دالة توفر علينا هذا الكم من الكتابة ، فبدلاً من كتابة 16 سطر سنقوم بكتابة 4 اسطر فقط و استدعاء هذه الدالة

 

الآن نقوم بتعريف دالة جديدة

ثم نكتب التالي ضم قوسي الدالة {   }

كما في المثال التالي :

 

في البداية سنقوم بالتطبيق على الـ firstName فقط ، سنستدعي الدالة ليقوم بعرض الموجود داخلها .

المتغير الأول هو السؤال و المتغير الثاني هو ناتج المدخل

الآن سيقوم بطباعة السؤال و ثم يكون بعملية عكس للأحرف المدخلة في الجواب

حيث يقوم بتحويله لمجموعة من character  و اسنادها في متغير جديد ثم يقوم بعكسها باستخدام الدالة Array.Reverse

و في النهاية سيقوم بطباعة firstNameArray

الآن لدينا الجزء المتكرر في كل المراحل السابقة و قد أصبح ضمن الدالة التي قمنا بإنشائها

الآن نقوم بعملية استدعاء للدالة التي قمنا بإنشائها

عندها سيسأل عن الاسم الأول و يطلب إدخاله ، و سيأخذ القيمة من المستخدم و يدخلها في متغير نصي  و يتابع

عند تشغيل التطبيق سيسأل عن الاسم و عند ادخال osama  يقوم بطباعة osama لكن بالشكل المعكوس … أي  amaso

 

الآن لنلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

لاحظوا أنه سيكون لدينا مشكلة إذا قمنا بكتابة هذه الدالة للاسم الثاني و اسم المدينة

المشكلة هي أنه إذا قمت باستدعاء اسم الدالة فعندها سيقوم بطباعة الاسم الأول لوحده ، و نحن لا نريد هذا

نحن نريد أن يقوم بإرجاع القيمة الناتجة و استخدامها لاحقا

 

فقد تكلمنا أن الـ void لا يرجع أي قيمة ، لكن بإمكاننا استبدال هذا النوع بـ string

أي أن هذه الدالة ستقوم بعمليات معينة ثم ستعيد نصاً إلى مكان استدعائها

 

بما أن هذه الدالة أصبحت من النوع string  و ليس void  فيجب أن ترجع قيمة و بالتالي ستحتوي على return لشيء ما في نهايتها

و القيمة التي نريد ارجاعها هي النص الموجود لدينا  فيصبح السطر الأخير :

;Return string.concat(firstNameArray)

عندها سيكون هذا السطر راجعاً من الدالة DisplayResult

أي أنني في الأعلى يمكنني أن أقوم بتعريف

;()string firstName = DisplayResult

و النوع الموجود قبل إشارة المساواة من النوع string وبالتالي DisplayResult ذات الأمر ، لأن الدالة الموجودة في الأسفل من النوع string و النتيجة الراجعة من النوع string

نقوم بتشغيل التطبيق لنتأكد من صحة المعلومات و نلاحظ أنني لا اريد أن أقوم بطباعة الناتج داخل الدالة الثانية بل سأقوم بطباعته في الدالة void

 

فعلا قام التطبيق بطباعة osama  بشكل معكوس

سنلاحظ بعد قليل أن هذه الدالة قامت باختصار كاف الاسطر السابقة

 

و نتذكر أن الدوال من الممكن أن تكون int , string أو أي نوع من أنواع البيانات و يمكن أن تكون دالة لا ترجع قيمة مثل void

الشرط الأساسي أنه إذا لم تكن من النوع void فيجب عليك أن تقوم بإرجاع قيمة و هذه الدالة قامت بعمليات معينة و قامت بإرجاع الناتج النهائي
يمكننا الحصول على القيمة المرجعة عن طريق وضعها على الجانب الأيمن لإشارة المساواة في السطر الذي قمنا به باستدعاء الدالة و سيتم تخزينها مباشرة في firstName

الآن أريد استخدام هذه الدالة ليس فقط لطباعة الاسم الأول
بل لطباعة الاسم الأول و الأخير و السؤال عن المدينة التي ولد فيها

إذا في الدالة يمكنك أن تقوم بإرسال قيمة
لذلك سنقوم بتعريف متغير جديد

عندما نقوم باستدعاء الدالة يجب أن نرسل قيمة يتم ارسالها إلى الدالة

 

لذلك سنقوم بحذف السؤال في الدالة و نجعله قادماً من مكان استدعائها

إذا سنأخذ المتغير question و نضعه بعد string  بين قوسي الدالة (  )

الناتج كالتالي

سنقوم باستدعاء الدالة و نرفق معها السؤال بين القوسين ، عندها سيأخذ السؤال و يقوم بطباعته مباشرة و يقوم بعمليات معينة و يقوم بإرجاع القيمة النهائية إلى هذا المكان

 

الآن قمنا بإرسال هذا النص إلى الدالة و قام بطباعته و استخدام القيمة المرسالة مع هذه الدالة

نقوم بتعريف متغير جديد اسمه lastName ، و سأسأله سؤال ” ما هو اسمك الأخير” و القيمة الراجعة من الدالة سيقوم بإسناده للمتغير lastName
ثم نسأله عن مكان الولادة

لاحظو أن هذه الثلاث أسطر هي فعليا 12 سطر
لنتأكد أن القيمة الراجعة صحيحة

ثم نقوم بطباعة الناتج النهائي

بتشغيل التطبيق سيسأل عن الاسم الأول و الأخير و المدينة ، و سيقوم بعرض ذات النتيجة التي عرضها في التجربة الأولى

في حال حدوث مشكلة لا يجب تتبع الأسطر كلها ، بل نقوم بتتبع أسطر الدالة القليلة
حيث استخدمناها لتقليل عدد الأسطر

 

نصل الآن لنهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله

 

ملخص الدرس :

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الرابع عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على  الدوال Methods أو ما يسمى Function في لغات أخرى، والتي تعتبر العصب الرئيسي الذي يقوم عليه أي تطبيق ولا يخلو منها.

الدوال Methods :

يمكن تعريف الدالة على أنها قطعة برمجية Code Block تبدأ بجملة تعريفية بإسمها ونوعها سواء كانت نصية string أو رقمية int أو لا ترجع أي قيمة void أو أي نوع آخر. والدوال لها العديد من الميزات أهمها:
– تقليل عدد التكرارات الموجودة في التطبيق، وبالتالي قلة عدد الأسطر الإجمالي.
– تنظم المشروع، بحيث تكون الأسطر البرمجية الخاصة بعملية معينة في مكان واحد.
– سهولة إيجاد المشاكل المنطقية في حال وجودها لاحقاً.
و طريقة كتابة الدالة هكذا :
Method_Type Method_Name ()
}
{

خصائص الدوال :

كما ذكرنا قبل قليل، إن كانت الدالة غير النوع void ( لا ترجع أي قيمة)، أي أنها من النوع int أو string أو float أو أي نوع آخر، فيجب أن تقوم بإضافة سطر return value في نهايتها ويمكن الحصول على العائد من الدالة بعملية الإسناد، أيضاً يمكن إرسال قيم عند مناداة الدالة لإستخدامها داخل الدالة وهي ما تدعى arguments أو parameters ، وهي متغيرات يتم إستخدامها داخل الدالة للقيام بالمهمة الموكلة لها.

مصطلحات الدرس :

Methods :

Block of Code :

return :

float :

arguments :

parameters :

الأسطر البرمجية التي تم إستخدامها في الدرس :

post

#13 المصفوفات Arrays – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : YIL

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  المصفوفات Arrays

السلام عليكم و رحمة الله و بركاته , و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

في درس اليوم سنتكلم إن شاء الله عن المصفوفات أو الـ Arrays

تعريف المصفوفات :

يمكن تعريفها على أنها وعاء يحتوي على قيم بداخلها , أو هي عبارة عن صندوق فواكه يحتوي على عدداً من التفاح على سبيل المثال , و كل تفاحة لها قيمة الخاصة  ، و الصندوق الحامل لها يسمى المصفوفة .

 

نذهب إلى File  ثم New ثم project و نتأكد من اختيار #Visual Cو نختار Console App
تكلمنا سابقاً أن المكان المخصص لكتابة الأكواد البرمجية هو بين قوسي الدالة void Main

كي لا نضيع الوقت قمت بكتابة هذه الاسطر سابقاً و سأقوم بلصقها هنا

لاحظو أنني قمت بتعريف خمسة متغيرات هنا ، و كل متغير يحتوي على قيمة معينة

نريد الآن أن نقوم بالبحث عن الرقم 16 ، عندها سأكون مجبراً على كتابة جمل شرطية if statement  لكل متغير لكي أحصل على القيمة و أقارنها بالقيمة المطلوبة

في البداية نسأل هل قيمة المتغير number1 تساوي 16

ثم ننتقل إلى الثاني … الثالث ……. الخامس و هكذا

في هذه الحالة سأكون مضطراً لكتابة كل المتغيرات و كتابة عدد كبير من جمل if statement

هنا يأتي دور المصفوفة Array

سأقوم مبدئيا بتحويل الجمل السابقة إلى جمل ملاحظات

يمكن تعريف الـ array كالتالي

;int[ ] myNumber = new int [5]

لاحظو في هذا السطر قمت بتعريف مصفوفة اسمها myNumber  من النوع integer و تحتوي على خمس قيم

قمنا بكتابة الأقواس المربعة بعد النوع مباشرةً

الآن أصبح عندي 5 عناصر أو خمس خانات استطيع التعامل معهم

كيف يمكنني أن أقوم بإدخال قيم إلى هذه العناصر ؟

يمكننا فعل ذلك كالتالي :

;myNumber[0] = 10
;myNumber[1] = 22
;myNumber[2] = 14
;myNumber[3] = 66
;myNumber[4] = 22

الخانة الموجودة بين القوسين [ ] تسمى index

لذلك عندما تريد استدعاء عنصر ضمن المصفوفة تضع اسم المصفوفة و رقمه بين الأقواس [  ] مع ملاحظة أن الخانة الأولى يجب أن تحمل الرقم 0

إذاً من خلال الأسطر السابقة قمت بإدخال قيم إلى العناصر الموجودة ضمن الـ Array

الآن ماذا لو أردت أن أقوم بعملية استدعاء للقيم ؟

سأقوم من خلال التالي بطباعة قيمة أحد العناصر في المصفوفة

;Console.WriteLine(myNumber[2] )

 و لا ننسى كتابة الدالة ReadLine لنتمكن من مشاهدة النتائج.

نقوم بتشغيل التطبيق و نلاحظ أن التطبيق قام بطباعة القيمة 14

طريقة ثانية

الآن هناك طريقة ثانية لتعريف المصفوفة و إدخال القيم بها مباشرةً .

;int [ ] myNumbes = new int [ ] {1, 5 , 3 , 4 , 66 , 55 }

و كما تكلمنا لو اردنا طباعة القيمة رقم 3 فسنكتب :

; Console.WriteLine(myNumber[2] )

 

هناك إمكانية لطباعة ” عدد العناصر الموجودة داخل المصفوفة “

عن طريق التالي :

;Console.WriteLine(myNumber.Length)

هنا قمنا بطلب أخذ الـ Length ، و هو كم عدد العناصر الموجودة ضمن المصفوفة

و لو قمنا بعمل تشغيل للتطبيق ، سنحصل على القيمة 6 ، و هو فعلاً عدد عناصر المصفوفة السابقة .

في الاسطر السابقة استعملنا النوع integer ، و بالمثل يمكننا استعمال أي نوع آخر

مثلا هنا أقوم بكتابة

;  string[] myStrings = new string[] { “Ahmad”, “Mohammad”, “Shady”, “Safaa” }

و بالمثل سنقوم بطباعة قيمة العنصر رقم 3

 

;Console.WriteLine(myStrings[2] )

و لاحظ أنه قام بطباعة شادي

 

تحدثنا في المحاضرة السابقة عن For Loop Statement  التي تقوم بعملية تكرار لأوامر معينة ، لاحظة الآن سأقوم باستخدامها لطباعة كل عناصر المصفوفة

و ذلك كالتالي :

 

لاحظو أنه قام بطباعة كل عنصر من عناصر المصفوفة و ذلك بناءً على الـى Length

لاحظو أن عدد العناصر في المصفوفة هو 4 و هذا يعني أن myStrings.Length يساوي 4

و لذلك عندما وصل إلى الرقم 3 لقيمة i  فهو فعلياً وصل إلى آخر عنصر في المصفوفة ، و عندما أصبحت i = 4 يقوم بالخروج من الحلقة و ذلك لأن 4 تساوي 4 و ليست أصغر منها طبقاً لشرط الحلقة و بالتالي بعد أن أصبح شرط الحلقة غير محقق قام بالخروج منها

حلقة foreach

هناك أيضاً حلقة يتم استخدامها بشكل كبير مع المصفوفات ، ألا و هي  foreach

شرح هذه الحلقة :

بعد إضافة foreach  نقوم بتعريف متغير من النوع الذي تم تعريف المصفوفة به
و هنا قمنا بتعربفه من النوع string  تبعاً لنوع المصفوفة myStrings و بالنسبة لاسم المتغير الجديد فهو اختياري لأننا سنقوم باستخدامه حصراً ضمن الاقواس {  }

ثم نقوم بإضافة الكلمة المحجوزة in ثثم اسم المصفوفة و ذلك بدون أقواس [  ]

عمل الحلقة :

في كل مرة سيقوم بأخذ أحد العناصر (على الترتيب) ثم يقوم بإسناده الى المتغير name و يقوم بطباعته

و لاحظ أننا لم نقم بإعطائه الـ index  الخاص بالعنصر و إنما طلبنا منه أن يقوم بجلب جميع العناصر الموجودة داخل المصفوفة

 

 

هناك أيضاً إمكانية للتعامل بشكل أكبر مع المصفوفات :

 

إذا كان لدي نص معين و أردت أن أقوم بطباعة هذا النص بالعكس ( عمليةReverse )

هناك نوع جديد من أنواع البيانات هو النوع char و تكلمنا سابقاً أنه يقبل حرفاً واحداً فقط

;’char x = ‘a

الآن لدينا التالي :

;!! string myWords = “i need to go to the hospital now

يمكنني  أن أحصل على مصفوفة من myWords عن طريق الجملة :

;()Char[ ] x = myWords.ToCharArray

من خلال هذا الجملة نقوم بفصل جميع الحروف الموجودة في النص و تحويلها إلى عناصر في المصفوفة

myWords.ToCharArray تقوم بالعودة بمصفوفة يتم اسنادها للمصفوفة x  من النوع char

و نلاحظ هنا أننا قمنا بكتابة char و ليس فقط Array في myWords.ToCharArray لأنني أريد تحويل جميع الخانات خانة خانة إلى النوع char

الآن لو قمت بوضع بكتابة الحلقة foreach كما في التالي :

لو قمت بتنفيذ التطبيق سيقوم بطباعة الجملة حرف حرف في كل سطر

و لعكس المصفوفة نقوم بكتابة التالي :

سنشاهد عند تنفيذ التطبيق أنه قام بطباعة الجملة بشكل معكوس على نفس السطر .

 

طبعاً المصفوفات لها استخدامات أكثر مما تم ذكره ، و الدروس القادمة ستكون كفيلة بصقل مهارتك باستخدام الـ Array

نصل الآن إلى نهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله .

ملخص الدرس :

تعريف المصفوفات:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثالث عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على المصفوفة وكيف يمكننا تعريف عدد كبير من المتغيرات تحت سقف واحد، وكيف أنه يمكننا إستدعاء العناصر بواسطة حلقات تكرارية.

المصفوفة Array :

يمكن تشبيه المصفوفة أنا عبارة عن صندوق فاكهة يحتوي تفاح، حيث أن هناك عدد كبير من التفاح غير أنه غير متساوي في المواصفات، فهناك الكبير وهناك ذو الحلاوة أكثر وهناك ذو الحمرة أكثر، غير أنهم يتشاركون بصفه أنهم جميعاً من النوع الواحد ألا وهو التفاح، والمصفوفة يمكن أن تكون أي نوع من أنواع البيانات الموجودة بداخل لغة السي شارب، سواءاً كانت نصية أو رقمية أو حتى متجهات ثلاثية البعد.
ويتم حجز المصفوفة بكنابة نوعها ثم أقواس مربعة ثم إسم المصفوفة ثم إعطاءها رقم للعناصر التي ستكون بداخلها هكذا :
int[] myNumbers = new int[5];

أو كما في المثال التالي :

مصطلحات الدرس :

Arrays :

Length :

foreach :

 index  :

Zero Base :

Reverse :

char :

ToCharAray :

 

post

#12 الحلقة التكرارية For – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : PQW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الحلقة التكرارية

السلام عليكم و رحمة الله و بركاته , و أهلاً و سهلا بكم في دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

الحلقة التكرارية التي لا يخلو application  من استخدامها لما فيها من تسهيل و اختصار للوقت

و كما نبدأ عادةً

ندخل الى File ==> New ==> Project  ,
و نختار #Visual C  ثم نختار Consloe application

سنسمي هذا الـ application  باسم  ForIteration

كما تكلمنا في الدروس السابقة المكان المناسب للبدء بكتابة الأسطر البرمجية هو بين قوسي الدالة  void Main

 

يطلب مني أحد الزبائن أن أقوم بطباع جملة معينة خمس مرات , فمن خلال معلوماتنا السابقة يمكننا كتابة التالي

;Console.WriteLine(“Statement 1”)
;Console.WriteLine(“Statement 2”)
;Console.WriteLine(“Statement 3”)
;Console.WriteLine(“Statement 4”)
;Console.WriteLine(“Statement 5”)

;()Console.ReadLine

ثم نقوم بعمل تشغيل للبرنامج لنرى أن البرنامج قد قام بطباعة الجمل المطلوبة بشكل صحيح

لنفرض أن الزبون قد غير رأيه و أراد طباعة 100 جملة

بإمكاننا أن نقوم بنسخ الجمل السابقة و تكرارها لمئة مرة مع التعديل على كل جملة , لكن هذه الطريقة مهدرة للوقت و غير احترافية .

فكيف يمكننا عمل ” حلقة تكرارية ” لنصل إلى النتيجة ؟؟

هنا يأتي دور الحلقة التكرارية For Loop

For (    int  i   =  0;          i   <   20 ;      i++    )

و لتفصيل الـ  Expression الخاص بالحلقة :

;Int i = 0 : قمنا بتعريف متغير من النوع integer  و قمنا بإعطائه قيمة ابتدائية تساوي الصفر , حيث قمنا بعمليتي Declaration  و Assignment  في نفس الجملة .

;i < 20 : الشرط Condition  , و يجب أن يكون محققاً ليقوم بتنفيذ الحلقة

;i++ : معدل النقصان أو الزيادة للمتغير i  . و هو مشابه لـ i = i + 1 ;

 

تقوم بالحلقة بالتأكد من تحقق الشرط , و كما هو واضح فإن 0 و هي القيمة الأولية أصغر من 20 فالشرط محقق
تبدأ الزيادة بعد تنفيذ السطر الأخير من الحلقة , أي أنها تقوم بالتنفيذ حتى السطر الأخير ثم تبدأ بعملية الزيادة, و في تطبيقنا ستقوم بتنفيذ السطر

;Console.WriteLine(“statement” +i)

ثم تبدأ بعده بالزيادة

و نلاحظ عند التشغيل أن أول قيمة هي 0 مع أننا قمنا بكتابة  ++i , و يمكننا جعله يبدأ من القيمة 1 و ذلك بتعديل القيمة الأولية إلى 1 . كما يمكننا جعله ينفذ الجملة رقم 20 و ذلك من خلال تبديل الشرط إلى  (i  أصغر أو تساوي الـ 20 )


الآن سوف ننتقل لمرحلة جديدة , ألا و هي أن نستعمل الجملة الشرطية if statement  داخل حلقة For

سيقوم هنا بالتحقق من الشرط ” هل 1 أصغر أو يساوي الـ 20 ؟ ” نعم الشرط محقق ! سينتقل لتنفيذ الحلقة

سيقوم بالتحقق من محتوى الحلقة :

If (i == 8)
;Console.WriteLine(“Found  ” + i)

هل 1 = 8 ؟؟ الجواب لا … يعود للبداية مع زيادة 1
تصبح قيمة  i تساوي 2 و يسأل هل 2 أصغر أو تساوي 20 ؟ الجواب نعم ، يذهب لتنفيذ الحلقة فيسأل هل 2 تساوي 8 ؟ الجواب لا فيعود للبداية مع زيادة 1 في كل مرة

عندما يصل إلى الرقم 8 : يسأل هل i = 8 أصغر أو تساوي الـ 20 ؟ الجواب نعم
يذهب لتنفيذ الحلقة فيسأل هل 8 = 8 ؟ الجواب نعم فيقوم بتنفيذ الشرط و طباعة ” Found  8″. إلا أنه قام بتنفيذ الحلقة 20 مرة و لكن لم تتم كتابة سوى الحالة الثامنة و ذلك بسبب الشرط المذكور سابقاً .

إذاً : الـ Expression  الخاص بالحلقة يحتوي على :

◘ القسم الأول و هو القسم الذي يتم فيه تعريف المتغير الذي ستتم عليه عملية الزيادة و النقصان , و يتم في هذا القسم إعطاؤه قيمةً أوليةً .

◘ القسم الثاني و هو القسم الذي يحتوي على الشرط الواجب تحققه ليتم تنفيذ الحلقة و بمجرد أن يصبح شرط الحلقة غير محقق ( أي بعد الانتهاء من الرقم 20 ) يقوم بالخروج من الحلقة تلقائياً و تنفيذ الاسطر التالية ضمن التطبيق

◘ القسم الثالث و هو الذي يتم فيه تحديد مقدار الزيادة أو النقصان .و لا يشترط أن يكون i++  فيمكن التحكم به و جعله i +2  على سبيل المثال و عندها ستكون نتيجة التطبيق

Statement 1
statement 3
statement 5
.
.
statement 19

و بإمكانك جعل الـ Expression  كالتالي :

For    (   int i  =  20   ;        i  >=  1   ;    i – –   )

بالتالي قمنا بعكس العملية  , حيث سيبدأ من القيمة 20 و يقوم بالتحقق منها ثم البدء بعملية النقصان 1 ثم 1 ثم 1 ….

 

طباعة جدول الضرب

نستخدم لهذا الغرض حلقة For داخل حلقة For  ثانية .

و عند كتابة حلقة For    داخل حلقة ثانية فلا يجوز تعريف  نفس المتغير ، لأنه كما تعلمنا لا يجوز تعريف نفس المتغير مرتين
و نلاحظ أن + في هذا الـ Exprssion  ليست عملية حسابية ، بل هي لوصل نص مع نص آخر.

و لو اردنا طباعة جدول الضرب كاملا (مئة جملة ) بدون حلقة For  قد تقع في الأخطاء ، فضلاً عن الوقت المهدور

 

يمكننا أيضاً عمل بعض الرسومات باستخدام For Loop
عندما يبدأ التطبيق يبدأ بحالة i = 1
يدخل إلى الحلقة الثانية ، و يسأل هل j = 1   ، نعم صحيح ، فيقوم بطباعة نجمة  ثم الانتقال إلى حالة j = 2
و هي لا تحقق الشرط ( 2 اصغر او تساويi (1)  ) فيخرج من الحلقة و يقوم بتنفيذ تتمة الحلقة الأولى و هي كتابة سطر جديد ،
ثم  يذهب للحلقة الأولى ، و يقوم بعملية الزيادة على i   لتصبح 2
و هي تحقق الشرط ، فيذهب لتنفيذ الحلقة الثانية ويسأل هل  j   أصغر أو تساوي i  (2) ؟ نعم صحيح فيقوم بطباعة ” * ”
ثم يقوم بعملية الزيادة على  j  لتصبح 2 ثم يسأل هل j أصغر او تساوي i(2) ؟ هي تحقق الشرط فيقوم بكتابة نجمة أخرى على نفس السطر ، لأننا استخدمنا الدالة Write  و ليس WriteLine
ثم يذهب للحالة الثالثة و هي لا تحقق الشرط … فيخرج من الحرق الثانية و ينتقل من طباعة النجمات على نفس السطر إلى طباعة سطر جديد ،
و هكذا حتى يصل إلى i  تساوي 10 ليقوم بكتابة 10 نجمات ،
و عندما يصل إلى i = 11 يصبح شرط الحلقة غير محققاً فيقوم بالخروج منها


و هكذا نكون قد تعلمنا استخدام الجملة الشرطية داخل حلقة For  كما تعلمنا استعمال حلقة For  داخل حلقة For  أُخرى

 

نصل إلى نهاية درسنا ، ألقاك في الدرس التالي إن شاء الله

 ملخص الدرس :

مفهوم الحلقة التكرارية:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثاني عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على معنى الحلقة التكرارية for Iteration Statement وكيف يمكننا أن ننفذ أسطر برمجية معينة عدد من المرات بناءاً على تحقق شرط معين

الحلقة التكرارية for Iteration Statement :

لا يخلو أي تطبيق برمجي من تواجد الحلقات التكرارية لما فيها من أهمية وإختصار للوقت والجهد والحصول على نتائج عالية، ومن أشهر الحلقات التكرارية جملة For التي يمكن بواسطتها تنفيذ عدد من الأسطر البرمجية عند تحقق شرط معين، وتتكون هذه الحلقة من 3 أقسام رئيسية هي :
– تعريف متغير الحلقة : حيث يتم هنا تعريف المتغير الذي ستستخدمه الحلقة التكرارية ويتم إعطاءه قيمة أولية أي أننا نقوم بعمل Variable Declaration و Variable Initialization في نفس المقطع
– شرط الحلقة : وسحتوي على تعبير Expression حيث أن الناتج لهذا التعبير سيكون إما قيمة صحيحة True أو خاطئة False وبناءاً عليه ستستمر الحلقة التكرارية بالعمل طالما هذا الشرط محقق
– معدل التغيير : وهو مقدار الزيادة أو النقصان بعد إنتهاء تنفيذ دورة واحدة، ويكون التغيير على المتغير الذي تم تعديله في القسم الأول.

مصطلحات الدرس :

FOR Loop :

Efficient :

Syntax :

Iteration :

increment :

initial :

Two FOR Loop :

post

#10 الجملة الشرطية IF – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : MHD

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الجملة الشرطية if Statement

الجملة الشرطية if statement:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ العاشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، سنتعرفُ على الجمل الشرطية والتي تعد أهم ركائز البرمجة، وهي ما ستطلق العنان لمخيلتك لكتابة العديد من التطبيقات الحقيقية، فستتعلم كيف تبني منطق logic تكون مخرجاته مختلفة بناءً على قيمةٍ معينة، ويمكن أن تكون هذه القيمة من مدخلات المستخدم بواسطة لوحة المفاتيح، أو قيمة قمنا بمعالجتها بناءً على متغيرات سابقة، وعندما أقول منطق logic، أعني أننا سنقوم بمقارنة شرط معين، وبناءً عليه سنتخذ إجراءات معينة، من خلال تنفيذ قطعة برمجية Code Block مختلفة باختلاف النتيجة.

تطبيق لعبة التخمين:

لإنشاء مشروع جديد، سأقوم بتكرار ما قمنا به في الدروس السابقة، سأذهب إلى قائمة File — > New — > Project، ومن شاشة New Project سأحرص على اختيار Visual C#، ثم اختيار Console Application، سأقوم بعدها بإعادة تسمية هذا المشروع إلى Decisions، ومن ثم نضغط على زر OK، ليبدأ برنامج الـ Visual Studio بتهيئة مشروع جديد، سأقوم بكتابة لعبة بسيطة، وسأبدأ بالكتابة داخل قوسي Static void Main في السطر رقم 13، يمكنك إيقاف الفيديو بعدما أقوم بإنهائه، لتتمكن من متابعتي:

	public static void Main()
	{
		    Console.WriteLine("**Osama's Big Givaway**");
            Console.Write("Choose 1,2 or 3 : ");
            string userValue = Console.ReadLine();

            if (userValue == "1")
            {
                string message = "Wow!! You won a new car";
                Console.WriteLine(message);
            }

            Console.ReadLine();
	}

لا ننسى أن نقوم بحفظ التطبيق، أو يمكننا تجاوز ذلك بتنفيذ التطبيق. لو قمنا بتنفيذ التطبيق، سنجد جوائز قيمة من العم أسامة، ويطلب التطبيق من المستخدم إدخال إحدى الأرقام التالية: 1 أو 2 أو 3، فلو قمتُ بإدخال القيمة 1 والضغط على زر Enter، ستجد رسالة “واو لقد رَبِحْتَ سيارة جديدة”، لا تخف من نفاذ الكمية ستحصل على السيارة الخاصة بك. ثم سأضغط على زر Enter لينتهي التطبيق، سأقومُ بتنفيذه مرةً أخرى فأنا أود الحصول على جوائز كبيرة أخرى، سأدخل الرقم 2، ستجدُ أنه لم يحصل شيء، ولو قمنا بتنفيذه مرة أخيرة وأدخلنا رقم 3 أو أي شيء آخر، ستجد أنه أيضاً لم يطبع أي شيء.

جملةُ اتخاذِ قرار Decision Statement :

دعنا الآن نشرح التطبيق ونتكلم عن الجملة الشرطية if Statement، التي قمت بكتابتها في الأسطر 17 إلى 21، والتي هي هدفنا الأساسي من هذا الدرس، فالجملة الشرطية if Statement، تسمى جملةُ اتخاذِ قرار Decision Statement، لأننا سنتخذ قرار بواسطتها لتنفيذَ أسطرٍ برمجيةٍ داخل الأقواس التالية، بناءً على نتيجة الشرط الموجود بين الأقواس هنا، ففي هذا المثال سيقوم التطبيق بالتحقق من القيمة التي سيدخلها المستخدم، بواسطة الدالة ReadLine التي تعرفنا عليها في الدروس السابقة، ومن ثم إسناد القيمة إلى المتغير userValue من النوع string، وبناءً على القيمة سيقوم التطبيق بعمل مقارنة مع النص “1”، بشكل بسيط هذه الجملة تعني: هل قيمة المتغير userValue تطابق القيمة “1”؟

ستلاحظ أيضاً أنني استخدمت علامتي مساواة، وليس علامة واحدة، ففي الدروس السابقة تعرفنا أن إشارة المساواة المفردة =، هي إشارة إسناد Assignment Operator،  فنحن نقوم بإسناد قيمة ما قام المستخدم بإدخاله، إلى المتغير userValue باستخدام إشارة المساواة. لكننا عندما نقوم باستخدام إشارتي مساواة متتاليتين، فإننا نقوم بعمل مقارنة تطابق بين القيمتين، فإن كانتا متطابقتين ستكون النتيجة صحيحة True، وإن لم تتطابقا فستكون النتيجة خاطئة False. وفي حالة المطابقة، أي أن النتيجة كانت صحيحة True، سيقوم التطبيق بتنفيذ القطعة البرمجية الـ Code Block، التي تتبع الجملة الشرطية مباشرةً، أما إن لم تتطابق القيم وكانت النتيجة خاطئة False، فإن التطبيق سيقوم بتجاهل القطعة البرمجية التي تتبع الجملة if statement، وسيقوم بمتابعة تنفيذ الأسطر بعد أن يتخطاها.

الجملة الشرطية else if :

ستجد أن لعبتنا ناقصة، فلا يوجد جوائز لمن قام بإدخال رقم 2 أو رقم 3، أيضاً ماذا إن قام المستخدم بإدخال قيمة 4 مثلاً أو أي قيمة أخرى؟ نحن بحاجة لضبط كافة الاحتمالات التي سيقوم المستخدم بإدخالها، لذلك دعني أكمل كتابة الأسطر البرمجية، من خلال كتابة else if  أسفل القطعة البرمجية الخاصة بجملة if الأولى، وسأقوم بكتابة ذلك كالتالي:

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

        if (userValue == "1")
        {
			string message = "Wow!! You won a new car";
            Console.WriteLine(message);
        }
		else if (userValue == "2")
        {
			string message = "Wow!! You won a new boat";
            Console.WriteLine(message);
        }
		else if (userValue == "3")
        {
			string message = "Wow!! You won a soup";
            Console.WriteLine(message);
        }

        Console.ReadLine();
	}

كما ترى أنه يمكن إستخدام جملة else if في حال أردنا مقارنة قيم أخرى، ففي تطبيقي هنا قمت باستخدام اثنتين منهما، فإن لم يتحقق الشرط الأول،  سيقوم التطبيق بالانتقال إلى الشرط الثاني، وإن لم يتحقق الشرط الثاني، سينتقل إلى الشرط الثالث وهكذا، بحسب عدد جمل else if التي قمتَ بكتابتها، لكن إن تحقق الشرط الأول، فلن يقوم بالتحقق من الشروط اللاحقة، وسيقوم بتنفيذ الأسطر من 18 إلى 21 ومن ثم الانتقال إلى السطر 33 مباشرة، بالمثل إن كان ناتج المقارنة في الجملة الشرطية الأولى في سطر 17 False، سينتقل للتحقق من الشرط الثاني في السطر 22 فإن تحقق الشرط، سيقوم بتنفيذ الأسطر من 23 إلى 26، ثم سيقوم بالانتقال مباشرة إلى السطر 32 وهكذا. دعنا الآن نقوم بتنفيذ التطبيق مرة أخرى لنرى ماذا سنحصل إن أدخلنا الرقم 2، والرقم 3.

أما في حال قمتُ بإدخال رقم 4 أو أي شيء آخر، ستجد أن التطبيق لا يطبع شيء، وهنا يأتي دور الجملة الشرطية else statement، حيث أن التطبيق سينفذها في حال عدم تحقق أي شرط قمنا بكتابته سابقاً، وهي ما نطلق عليه اسم Catch all case.

الجملة الشرطية else :

ولفعل ذلك سأقوم بكتابة جملة else statement، بعد كل الجمل الشرطية التي قمنا بكتابتها، أي في السطر رقم 32 سأقوم بكتابة:

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

        if (userValue == "1")
        {
			string message = "Wow!! You won a new car";
            Console.WriteLine(message);
        }
		else if (userValue == "2")
        {
			string message = "Wow!! You won a new boat";
            Console.WriteLine(message);
        }
		else if (userValue == "3")
        {
			string message = "Wow!! You won a soup";
            Console.WriteLine(message);
        }
		else
		{
			string message = "wrong choice";
            Console.WriteLine(message);			
		}

        Console.ReadLine();
	}

لو قمنا الآن بتنفيذ التطبيق، وأدخلنا أي قيمة خارج الاحتمالات الثلاث السابقة، وضغطنا على زر Enter، سنجد الرسالة التي قمنا بكتابتها في أقواس جملة else statement، الشكل الذي قمنا بكتابته هو شكل الجملة الشرطية if statement، حيث يجب وجود جملة if في بدايتها، وأنت مخير بعدها في إضافة أي عدد تريده من جمل else if، وأيضاً لك كامل الحرية بإضافة الـ else statement، التي اتفقنا أنه يتم تنفيذها في حال لم يتحقق أي شرط قبلها.

أكثر إنتاجية more Efficient :

بعد الانتهاء من شرح الجملة الشرطية if statement، ستجد أني قمت بكتابة العديد من الأسطر المكررة، وقمت بكتابتها بشكل مقصود، لنتعلم معاً كيف يمكنك أن تكون مطوراً أكثر فاعلية more Efficient، في كتابة أسطرك البرمجية، فهناك العديد من الأسطر التي يمكنك تعديلها بل الاستغناء عنها نهائياً،  فأكثر جملة قمتُ بتكرارها هي جملة الطباعة:  Console.WriteLine

حيث أني قمت بتكرارها في الأسطر: 20 و25 و30 و35، ولأنها موجودة في كل الشروط، سيتم تنفيذها على كل الأحوال، بالتالي يمكنني وضعها بعد كل الجمل الشرطية مرة واحدة فقط، سأقوم بوضعها في السطر رقم 38 وحذف كل التكرارات السابقة، لكن بعد فعل ذلك ستجد أن هناك خط أحمر متعرج، ظهر تحت المتغير message في السطر 35، وهو دليل على وجود خطأ في هذا المتغير، ولو قمنا بوضع مؤشر الفأرة عليه، سنحصل على رسالة مفادها أن هذا المتغير غير معرف في النطاق الحالي، سنتحدث عن النطاقات scope في دروس مقبلة إن شاء الله، لكن لتوضيح الخطأ بشكل مبسط، يجب أن تعرف أنه عند حجز متغير داخل قطعة برمجية، لن يكون متاح خارج هذه القطعة، بمعنى آخر أنك لو قمت بحجز متغير داخل قطعة برمجية، تبدأ بقوس وتنتهي بآخر لن يكون هذا المتغير متاح خارج هذه الأقواس، ولحل هذه المشكلة يتوجب علينا تعريف هذا المتغير خارج القطعة البرمجية الحالية، بالتالي سيكون متاح لكل القطع البرمجية الداخلية، لذلك قبل بداية الجمل الشرطية سأقوم بحجز المتغير message، وإسناد قيمة أولية فارغة له،

بعد قيامي بذلك ستجد ظهور أخطاء جديدة، مفادها أنه لا يمكنك تعريف نفس هذا المتغير أكثر من مرة، فكما تعرفنا سابقاً أنه لا يمكن حجز نفس اسم متغير مرتين. ولحل هذه المشكلة سنقوم بإزالة الكلمة string من جميع الجمل، لتصبح جملة إسناد فقط، لو قمتُ بتنفيذ التطبيق الآن، ستجد أنه سيظهر النتائج بدون أي مشاكل، إلا أننا قمنا بزيادة كفاءة التطبيق، وذلك بتقليل عدد الأسطر المكتوبة، بالإضافة إلى عدم تكرار حجز متغيرات في كل مرة، هناك إمكانية لتقليص حجم الأسطر البرمجية أكثر، فإن كان عدد الأسطر البرمجية في داخل قطع الجمل الشرطية، if  و else if و else لا يزيد عن سطر واحد، فيمكن حذف أقواس القطعة البرمجية، وبما أن تطبيقنا لا يحتوي على أكثر من جملة واحدة داخل الأقواس، فبإمكاننا إزالتها، ولتوضيح ضرورة الأقواس الخاصة بالجمل الشرطية، سأقوم بالإبقاء على أقواس جملة else الأخيرة، وسأقوم بإضافة جملة أخرى، يتم ربطها مع الجملة السابقة كالتالي :

	public static void Main()
	{
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

		string message;
        if (userValue == "1")
			message = "Wow!! You won a new car";
		else if (userValue == "2")
			message = "Wow!! You won a new boat";
		else if (userValue == "3")
			message = "Wow!! You won a soup";
		else
		{
			message = "wrong choice";	
			message = message + ", You Lose!!";
		}
		
		Console.WriteLine(message);	
        Console.ReadLine();
	}

الآن سأقوم بإزالة الأقواس الخاصة بجملة else statement ، وسأقوم بتنفيذ التطبيق مرة أخرى وأدخل القيمة 3، ستحصل على نتيجة غريبه وستقول: لقد ربحت الشوربة، كيف خسرت؟ السبب أن معنى الأسطر الحالية هو أن الجملة الثانية سيتم تنفيذها بعد الجمل الشرطية كلها، لكن نحن نريدها أن تكون حصراً مع جملة else statement، لذلك سنقوم بوضعها في داخل الأقواس الخاصة بالجملة.

ستجدُ في السطر الأخير أني قمت بإسناد قيمة جديدة للمتغير message، وهي القيمة القديمة مضافاً إليها جملة أخرى، وهناك طريقة مختصرة ومستخدمة بشكل كبير، بدلاً من كتابة اسم المتغير مرتين في نفس السطر، وهذه الجملة تعني أنه قم بإضافة قيمة إلى القيمة الحالية للمتغير، وهي منتشرة كثيراً في وسط المبرمجين المتقدمين.

الجملة الشرطية المختصرة conditional operator :

سأقوم بتحويل الأسطر السابقة إلى فقرة ملاحظة، لأننا سنتعرف إلى شكل مبسط للجملة الشرطية إن أردنا مقارنة قيمة واحدة فقط، وذلك باستخدام إشارة جديدة تسمى conditional operator، وسأقوم بنسخ الثلاث أسطر الأولى لأني سأستخدمها مرة أخرى، وسأكتب الأسطر التالية :

	public static void Main()
	{
		/*
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();

		string message;
        if (userValue == "1")
			message = "Wow!! You won a new car";
		else if (userValue == "2")
			message = "Wow!! You won a new boat";
		else if (userValue == "3")
			message = "Wow!! You won a soup";
		else
		{
			message = "wrong choice";	
			message = message + ", You Lose!!";
		}
		
		Console.WriteLine(message);	
		*/
		
		Console.WriteLine("**Osama's Big Givaway**");
        Console.Write("Choose 1,2 or 3 : ");
        string userValue = Console.ReadLine();
		
		string message = (userValue == "1") ? "car" : "nothing";
        Console.Write("you won ");
        Console.Write(message);
        Console.Write(".");
		
        Console.ReadLine();
	}

في السطر رقم 40، قمت بحجز متغير وإسناد قيمة له بناء على قيمة userValue، فبعد إشارة المساواة الـ Assignment operator، وضعت مقارنة داخل القوسين بواسطة إشارة المساواة مرتين، حيث سيكون ناتج المقارنة إما صحيح true أو خاطئ false، بعدها بواسطة إشارة السؤال التي تسمى conditional operator، وضعت قيمتين، حيث سيتم إسناد القيمة الأولى إن كان ناتج المقارنة true، أو سيتم إسناد القيمة الثانية إن كان ناتج المقارنة خاطئ false، دعنا ننفذ التطبيق وندخل 1، ستجد أني ربحت سيارة، وإن نفذناه مرة أخرى وأدخلت أي شيء آخر سأربح لا شيء. وهذا هو الشكل المختصر للجملة الشرطية، لكني لا أحبذ استخدامه لأنه مبهم قليلاً، ولأن الجملة if statement أقرب لفهم الإنسان منها، ولكن وجب علي تبيانها لك في حال شاهدتها لاحقاً في أي تطبيق آخر.

الإستبدال بواسطة الـ Replacement code :

الآن في الأسطر 41 و 42 و 43، ستلاحظ أني قمت بطباعة نصوص باستخدام Write method، لتبقى على نفس السطر، وتعمدت فصلها في 3 جمل لأنني سأعلمك طريقة، ستسهل عليك عملية ربط النصوص في حال كان هناك متغير في وسطها، فلا داعي لأن تقوم بربط 3 نصوص باستخدام إشارة الربط + مرتين، فيمكنك إستخدام الـ Replacement code ، حيث سيتم استبدال الرقم صفر مع القوسين بالقيمة التي تتبع الفاصلة، ولو قمت بتنفيذ التطبيق ستجد نفس القيمة المتوقعة. بإمكانك أيضاً طباعة قيمتين، فلو قمت بالتنفيذ، ستجد أنه قام باستبدال {0} بقيمة المتغير userValuse، وبالمثل قام باستبدال {1} بقيمة المتغير message، كما يمكنك إضافة العدد الذي تريد من الـ Replacement code.

لعلك تسأل الآن: لماذا بدأنا بالرقم صفر بين الأقواس؟ أليس الأصح أن نبدأ من الرقم واحد؟ الحقيقة أن لغة السي شارب تبدأ العد من الرقم 0، وتستخدم ذلك في كثير من الأمور كما سنتعلم في دروس متقدمة إن شاء الله، لذلك يطلق على لغة الـ C# اسم Zero based Language، أي أن نقطة العد فيها يبدأ من 0 وليس 1.

تهنئة وطلب :

بعد تعرفنا على الجملة الشرطية if statement، والهيكلية الخاصة بها نصل إلى نهاية هذا الدرس، لكن إنتظر! هذا الدرس العاشر، وهذا يعني أنك لازلت مستمراً في هذه السلسلة، وهذا دليل كافٍ عن صدق نيتك في أن تصبح مطوراً للتطبيقات، لذلك وبالنيابة عن فريق عمل منصة طورني أرسل لك تحيةً حارة، وأتمنى لك التوفيق في إكمال هذه السلسلة، وأطلب منك تكرماً إن وجدت فائدةً في الدروس السابقة، أن تقوم بنشرها على حسابك في شبكات التواصل الاجتماعية، فهناك الكثير ممن يجد صعوبة في استكشافها، فدروس منصة طورني مجانية وباللغة العربية، وفريق طورني يحرص على إخراج محتوى ذو جودة عالية، فإخراج الحلقات يستهلك ساعات طويلة، وبنشرك للدروس، تكون قد ساعدتنا للوصول إلى هذه الفئة.

مهمة لك :

في الختام، سأطلب منك كتابة تطبيق يسأل المستخدم عن فئة عمره، حيث ستجعلهُ يختار من 4 فئات ( يعني يدخل “1” أو “2” أو “3” أو “4” ):
الفئة الأولى: إن كان عمره 15 سنة أو أقل،
الفئة الثانية: إن كان عمره بين 16 و 25،
الفئة الثالثة: إن كان عمره بين 26 و 40،
والفئة الأخيرة: إن كان عمره 41 أو أكثر،
وبناءً على فئته ستقدم له نصيحة مناسبة له، فمثلاً لو كان عمره أقل من 15 سنة وأدخل الرقم “1” ستنصحه بالإكثار من تناول الشوربة اللذيذة وهكذا. قم بإرفاق النتيجة على حسابك الشخصي مع عمل Mention لحسابي الشخصي وإرفاق #طورني. نصل إلى نهاية هذا الدرس، ألقاك في الدرس التالي إن شاء الله.

 

مصطلحات الدرس :

if Statement : الجملة الشرطية التي تنفذ أسطر معينة إذا تحقق الشرط
Conditional Operator : شكل مختصر جداً للجملة الشرطية والمعامل يكون علامة ( ؟ ) بدلاً من كلمة if
 Logic : جملة منطقية بمعنى الناتج إما ( صحيح ) أو ( خاطئ)
Decision Statement : جملة قرار تنفذ شء إذا كان الشرط صحيح
Code block : قطعة برمجية تبدأ بقوس وتنتهي بقوس آخر، وفي بعض الأحيان يكون لها إسم
static void Main : الدالة الرئيسية التي يقوم التطبيق بالبدء منها
Assignment Operator : عامل المساواة وال1ي يقوم بعملية إسناد القيمة على اليسار إلى القيمة التي على اليمين
True : شرط صحيح
False : شرط خاطئ
evaluation : تقييم ومحاولة مساواة
else if: جملة تأتي بعد جملة if لتضع شرط ثاني في حال لم يتحقق الشرط الأول
else : الجملة التي يتم تنفيذها إذا لم يتحقق كل الشروط التي قبلها
catch all cases : وهي جملة else
 Efficient : طريقة نموذجية
Replacement Code : طريقة لإضافة متغير داخل نص بدلاً من إضافة رمز الوصل +

post

#9 المتغير النصي String – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : ZRO

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  المتغيرات الجزء الثاني

المتغيرات Variables

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ التاسع من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في الدرس الماضي تحدثنا عن المتغيرات الـ Variables، وتعرفنا على النوع العددي Integer من خلال الكلمة المحجوزة int، الآن سنتعرف على نوع جديد من المتغيرات، تجدون على الشاشة المثال الذي قمنا بكتابته في الدرس السابق، لا أريد حذف الجمل التي قمت بكتابتها، فبدلاً من ذلك، سأقوم بتحويل الأسطر التي كتبتها إلى جمل ملاحظات، ولكننا سنتعلم طريقة أسرع من كتابة // في بداية كل سطر، مما يوفر الكثير من الوقت، وذلك من خلال طريقتين:

* الأولى من خلال الأيقونة المتاحة في برنامج الـ Visual Studio، فبعد اختيار جميع الأسطر المراد تحويلها إلى جمل ملاحظات، قم بالضغط على الأيقونة في الأعلى، التي تحمل الاسم Comment out the selected lines، وستجد أن جميع الأسطر تحولت إلى جمل ملاحظات ذو لون أخضر، ولإرجاع الجمل لوضعها الطبيعي، يمكنك الضغط على الأيقونة المجاورة للأيقونة السابقة على اليمين.

* والطريقة الثانية وهي الأكثر شيوعاً، هي إضافة / واحدة ثم إتباعها بنجمة، لتحديد بداية فقرة الملاحظة، ثم في النهاية سأقوم بإضافة نجمة أولاً ثم / لإنهاء تحديد الفقرة.

 

النوع النصي string variables :

الآن سأقوم بكتابة مثال جديد للتعرف على نوع آخر من أنواع بيانات المتغيرات، وللسرعة سأقوم بكتابة المثال كاملاً، ثم سنقوم بتفصيله بعد الانتهاء منه، يمكنك إيقاف الفيديو لكتابة المثال حال ما أنتهي منه:

Console.WriteLine("What is your name?");
Console.Write("Enter your first name: ");
string myFirstName;
myFirstName = Console.ReadLine();
string myLastName;
Console.Write("Enter your last name: ");
myLastName = Console.ReadLine();
Console.WriteLine("Hello " + myFirstName + " " + myLastName);
Console.ReadLine();

قبل البدء بشرح الأسطر التي قمتُ بكتابتها، لا ننسى أن نقوم بحفظ الملف لنتأكد من عدم ضياع أي شيء، وذلك من قائمة File — > Save All، مع ملاحظة أن البرنامج يقوم بالحفظ التلقائي كل مرة تقوم بتنفيذ التطبيق.

قراءة مدخلات نصية من المستخدم :

التطبيق التالي يسأل المستخدم عن اسمه الأول، واسم عائلته ومن ثم يطبع جملة ترحيبية به، وإن قمنا بتنفيذ التطبيق، ستجد أنه يسألني عن اسمي الكامل ثم يطلب مني إدخال الاسم الأول، سأقوم بإدخال Osama ، وبعد الانتهاء سأضغط Enter من لوحة المفاتيح للانتقال إلى السؤال الثاني، الذي يسألني عن اسمي الأخير، وسأقوم بإدخال Deep والضغط على زر Enter، لأجد بالنهاية أنه طبع جملة Hello Osama Deep، سأضغط أخيراً على زر Enter للخروج من التطبيق.

الآن لو نظرت إلى بعض الأسطر ستجدها مألوفة لديك، ففي السطر الأول استخدمنا الدالة WriteLine Method، لطباعة جملة السؤال الموجودة بين أقواس الدالة، ولاحظ أننا استخدمنا WriteLine وليس Write، لأننا نريد طباعة السؤال ثم الانتقال إلى سطر جديد، ثم في السطر التالي قمنا باستخدام الدالةWrite Method ، الموجودة في الكلاس Console ، وسنتعرف عن مفهوم الكلاس أكثر في الدروس المقبلة إن شاء الله،

والـ Write Method تقوم بطباعة الجملة وتبقى في نفس السطر، لأننا نريد من المستخدم إدخال الاسم الأول في نفس السطر، في السطر التالي قمنا بتعريف متغير اسمه myFirstName، وهو من النوع string، وهو نوع جديد سنستخدمه كثيراً في تطبيقاتنا المستقبلية، ويتيح لك هذا النوع وضع مجموعة من الخانات الموجودة على لوحة المفاتيح، سواءُ كانت حروفاً أو أرقاماً أو حتى إشارات، وكما تعلمنا قبل قليل بخصوص حجز المتغيرات، فإننا نقوم هنا بحجز موقع في الذاكرة يتناسب مع النوع string،

الدالة ()ReadLine  :

وفي السطر التالي ستجد تركيبةً جديدةً عليك، ولتفسير هذا السطر سنقوم بتفكيكه إلى ثلاثة أقسام:

فالقسم الأول هو اسم المتغير الذي نريد إسناد قيمة جديدة له، ألا وهو المتغير myFirstName،

والقسم الثاني هي إشارة المساواة الـ Assignment operator، التي تحدثنا أنها تأخذ كل ما على يمينها وتضعه في يسارها،

والقسم الثالث هو الجانب الأيمن من المساواة، والذي يتكون من الدالة ReadLine، ولكنها أتت بحالة خاصة هنا، فقد تعمنا في الدروس السابقة أن الـ ReadLine Method، تستخدم لمنع التطبيق من الخروج المباشر عند الوصول إلى نهايته، وذلك بانتظار قيمة من المستخدم تنتهي بزر Enter، ولكن استخدامها الحقيقي هو استقبال معلومات من المستخدم، لاستعمالها ومعالجتها داخل تطبيقنا، ففي هذا السطر سيحدث التالي، سينتظر التطبيق من المستخدم أن يقوم بإدخال جملة تنتهي بزر Enter، ثم سيقوم بإسناد القيمة المدخلة ووضعها في المتغير myFirstName.

وفي الأسطر التالية يقوم بتكرار ما قمنا بفعله مع المتغير myFirstName، عدا أنه يسأل المستخدم عن اسم عائلته، ويقوم بوضع القيمة المدخلة في المتغير النصي myLastName. وفي الجملة قبل الأخيرة، وبعد إسناد قيم للمتغيرين myFirstName و myLastName، سنقوم بتركيب جملة جديدة نرحب فيها بالمستخدم، وهنا إستخدامٌ جديدٌ لإشارة الجمع +، ففي المثال الأول الذي كتبناه في بداية الدرس، قمنا باستخدام إشارة الجمع لإيجاد حاصل جمع عددين من منظور حسابي، لكن في مثالنا الأخير ، استخدمنا إشارة الجمع لربط نص مع نص آخر، فأنا أود وصل كلمة Hello مع ناتج قيمة الاسم الأول، يجب أن نتعلم كيف تقوم نفس الإشارة Operator، بالتعامل مع أنواع المتغيرات المختلفة، لأننا سنلاحظ أهمية ذلك، كلما تقدمنا في دروس هذه السلسلة إن شاء الله.

لاحظ أيضاً أني قمت بإضافة مسافةٍ واحدةٍ بين الاسم الأول والاسم الأخير، فأنا لا أريد الحصول على الاسمين ملتصقين معاً، وفي السطر الأخير قمنا باستخدام الدالة ReadLine، لتمنع التطبيق من الخروج مباشرة، ولتعطينا مهلة لمشاهدة النتائج. لنقم مرة أخرى بتشغيل التطبيق.

الـ variables سلاح قوي :

بعد الانتهاء من الأمثلة السابقة، أصبحت تمتلك سلاحاً قوياً خلال مسيرتك لتعلم تطوير التطبيقات، فمعرفة التعامل مع المتغيرات سواءً كانت بحجز مكان له، أو باختيار نوع مناسب لما سيحتويه أو بكيفية إعطاءه قيم واستدعاءه، هي أهم ركائز تطوير التطبيقات، فلا يخلوا أي تطبيق من استعمال المتغيرات، وبما أنك أصبحت قادراً على أخذ قيم من المستخدم، أصبح بإمكانك الآن البدء بكتابة تطبيقات تقوم بمعالجة هذه القيم، لإخراجها بصيغة تتناسب مع ما يحتاجه المستخدم من التطبيق.

ملاحظات حول إستخدام المتغيرات variables :

الملاحظة الأولى: قم بإعطاء اسم مناسب لمتغيرك

وهو أمر في غاية الأهمية، وهو ما يحدد إن كنت ستصبح مطور عادي أم ستصبح مطور منظماً في شؤونك، فلو رجعنا إلى المثال الأول، ستلاحظ أني قمت باستخدام متغيرات x وy، وهي متغيرات قد استخدمناها في حل المعادلات الرياضية في دراستنا. لذلك قد تبدوا مفهومةَ المعنى إن قمت بالنظر لها للوهلة الأولى، لكن عند البدء بكتابة المشاريع الكبيرة، يجب أن نكون حريصين على إعطاء المتغير، اسماً يدل على وظيفته أو على طبيعة القيم التي سيحتويها، فلو قمنا مثلاً بتغيير اسم المتغير myFirstName إلى x ، وتركت مشروعك فترة،  ثم عدت إليه ستسأل نفسك مستغرباً: ليس لدي أي فكرة عن القيمة التي ستكون بداخل هذا الـ x، مما يضطرك للعودة إلى الأسطر السابقة لتتبع استخداماته، لعل تطبيقنا الحالي بسيط وقصير، لكن تخيل غداً عندما يحتوي تطبيقك على مئات الأسطر، سيكون من الصعب عليك تتبع الأسطر البرمجية لإيجاد وظيفة متغير ما، لذلك احرص من الآن على انتقاء اسمٍ مناسبٍ لمتغيرك، وحاول قدر الإمكان أن يكون سهل القراءة ومفهوماً لأي شخص يقرأ أسطرك، بحيث لو اضطررت للاستعانة بمساعدة صديق، لا تدعه يعاني كثيراً لحل مشكلتك، لقد عانينا كثيراً من هذه المشكلة، وهذه النقطة مهمة جداً، وهي فعلاً ما يميزك عن غيرك من المطورين، الذين تجد أسطرهم البرمجية مليئة بـ، r , b , xx , yy, ccc وهكذا.

قم بإرجاع المتغير x إلى اسمه السابق myFirstName، وستلاحظ وجود خاصية جميلة في برنامج الـ Visual Studio، والتي تسهل لك تعديل المتغيرات وتجعلك أسرع في إنتاج وتطوير التطبيق، فبعد تغيير اسم أي متغير، ستلاحظ وجود مصباح صغير بجانب هذا المتغير يسمى Quick Action، حيث إن ضغطت عليه ستجد أنه يطرح عليك، إن كنت تريد تغيير هذا المتغير في كل مكان قمت باستخدامه، حتى على صعيد جميع ملفات مشروعك، سأضغط عليه وسأجد أنه قام بتعديل المتغير في السطرين التاليين.

الملاحظة الثانية: Camel Casing

لربما لاحظت أني قمت باستخدام شكل غريب للمتغير myFirstName، فهو يحتوي على أحرف كبيرة في وسط الكلمات، للوهلة الأولى يبدوا شيئاً غريباً، ولكنك بعد فهمه ستعتمده بشكل كبير لما فيه سهولةٌ لقراءة أسماء المتغيرات، وهذه الطريقة تسمى Camel Casing، حيث أقتبس المطورين شكل سنم الجمل للاستعانة به في تسمية المتغيرات، فتجد أن اسم المتغير myFirstName يحتوي على ثلاث كلمات،  my و first و name ، ولأنه من قواعد كتابة المتغيرات، عدم وجود مسافات في وسطه، فلو قمت بكتابة الكلمات ملتصقةً معاً بأحرف صغيرة، سيكون من الصعب عليك إيجاد بدايات الكلمات، بالتالي قمنا بجعل أول حرف من كل كلمة حرفاً كبيراً ما عدا أول حرف.

الملاحظة الثالثة: لغة الـ #C لغةٌ حساسةٌ للأحرف Case Sensitive

وللتأكيد على حساسية لغة الـ C# لحالة الحروف، فلو قمت بتغيير الاسم myFirstName، إلى الاسم myfirstname بحروف صغيرة، ستلاحظ أن برنامج الـ Visual Studio أظهر أخطاء في الأسطر التالية، لأننا تكلمنا أن لغة الـ C# لغةٌ حساسةٌ للأحرف Case Sensitive، بالتالي فإن المتغير myFirstName بصيغة الـ Camel Casing، يختلف عن المتغير myfirstname ذو الأحرف الصغيرة.

الملاحظة الرابعة: لا يمكن إستخدام كلمات محجوزة

فلا يمكنك تعريف اسم لمتغير مرتين، ولا يمكنك إستخدام اسمٍ مطابقٍ لكلمات لغة الـ #C المحجوزة، ولكي تفهم ما أقصد، لنفترض أني احتجت لحجز متغير جديد في ذاكرة الكمبيوتر، ويحمل نفس الاسم myFirstName،  لاحظ ظهور خط أحمر متعرج تحت الاسم الجديد، وكأن المترجم يقول لك:
المعذرة، لن أسمح لك بالمرور يا سيدي، لأن البطاقة التي تحتوي هذا الاسم، قد تم أخذها مسبقاً.ولو قمنا بالنظر إلى قائمة الـ Error List، أو وضع مؤشر الفأرة على الخط الأحمر، سنجد رسالة مفادها، بمعنى أن هذا الاسم موجود مسبقاً في هذا النطاق. كما أنه لا يمكنك تعريف متغير اسمه int أو string.

الملاحظة الخامسة: حجز وإسناد قيمة في نفس السطر

يمكن حجز مساحة للمتغير وإعطاءه قيمة أولية في نفس السطر، فيمكننا الاستغناء عن السطر رقم 29 وتعريف نوع المتغير في السطر 31، وهذه الطريقة تسمى Initialization، وهي مهمة لأنه يتوجب عليك إعطاء قيمة أولية للمتغير في أقرب فرصة سنحت لك، وبذلك تضع المتغير في وضع صحيح، أيضاً أغلب المطورين يميلون للتقليل من حجم الأسطر البرمجية، لتسريع كتابة التطبيق ولسهولة قراءته أيضاً.

هل يتوجب علينا حفظ أسماء المتغيرات؟

الآن بعد التعرف على طريقة الـ Camel Casing، وبعد تأكيد أن لغة الـ C# لغة حساسة للأحرف، لعلك تقع في حيرة وتسأل نفسك:
هل فعلاً يتوجب أن أقوم بحفظ كل هذه المتغيرات؟ وبما أن الحرف الكبير يختلف عن الحرف الصغير، هل سأحفظ كل هذا المتغيرات بحروفهم الكبيرة والصغيرة؟ والحقيقة أن الجواب على هذين السؤالين، يعتمد على طبيعة محرر النصوص الذي تقوم بكتابة أسطرك البرمجية عليه، فسبب تشديدي منذ بداية السلسلة على اختيار برنامج الـ Visual Studio، هو أنه يحتوي على خاصية الـ IntelliSense في محرر نصوصه، فهناك العديد من الميزات التي تسهل عليك الكتابة، فلو حاولت كتابة كلمة my ، ستجد نافذة صغيرة ظهرت أسفل الكلمة التي أقوم بكتابتها، وتحتوي على أقرب احتمال لما أقوم بكتابته، فيمكننا الاختيار بالأسهم ثم الضغط على مفتاح Enter، أو كتابة الشيء الذي يلي الكلمة ألا وهو إشارة المساواة في حالتنا هنا، ليقوم البرنامج تلقائياً بإكمال الكلمة كاملة. هذه الخاصية تمنعك في الوقوع في الأخطاء الإملائية Syntax Error، وتزيد من كفاءتك كمطور للتطبيقات، ولو رجعت بالفيديو لوجدتني خلال كتابتي الأسطر البرمجية، أستخدم هذه الخاصية بشكل أساسي، ولا أقوم بكتابة كل حرف لكل المتغيرات والكلمات المحجوزة.

تحويل قيمة نصية إلى قيمة عددية :

الآن ماذا إن أردت معالجة البيانات التي يدخلها المستخدم؟ لنقم بكتابة تطبيق يطلب من المستخدم إدخال عددين، حيث سنقوم بطباعة حاصل جمعهما، بالبداية سأقوم بجعل الأسطر السابقة جمل ملاحظات، وذلك باستخدام نجمة فقرة الملاحظة، ثم سأقوم بكتابة التالي:

Console.Write("Enter #1: ");
int myFirstNumber = Console.ReadLine();
Console.Write("Enter #2: ");
int mySecondNumber = Console.ReadLine();
int sum = myFirstNumber + mySecondNumber;
Console.WriteLine("The Summation is: " + sum);
Console.ReadLine();

ستلاحظ وجود أخطاء برمجية في السطرين 39 و 40، وإن حاولت وضع مؤشر الفأرة عليهم ستجد جملة: Cannot implicitly convert type string to int  ، ومعناها أنه لا يمكنك وضع قيمة نصية في متغير عددي، فالدالة ReadLine تقوم بإرجاع قيمة نصية، وبالتالي لا يمكننا وضع القيمة النصية في المتغير العدي من النوع Integer، ولحل هذه المشكلة، سنحاول تحويل القيمة المدخلة إلى قيمة عددية، من خلال الدالة int.Parse() ، لاحظوا الآن أن الخطأين قد إختفيا، وإن حاولنا تنفيذ التطبيق سيعمل من غير أي مشاكل،  لاحظ إن قمت بإدخال حرف بدلاً من رقم، سيظهر لك خطأ أثناء التنفيذ  ، وهذا موضوع متقدم سنتعرف عليه في دروس قادمة إن شاء الله،

قواعد تسمية المتغيرات :

ملخص الدرس أن حجز متغير يتم بذكر نوع البيانات التي سيحملها،  ثم متبوعاً باسم المتغير الذي سنقوم بمناداته كل ما احتجنا له، ويمكن أيضاً إعطاءه قيمةً أوليةً في نفس السطر كما هو ظاهر على الشاشة:

DataType VarName ;
DataType VarName = Value;

أما بالنسبة لقواعد تسمية المتغيرات، فيمكن تلخيصها بالنقاط التالية:

* أن يبدأ بحرف، ويمكن إستخدام الحروف العربية ولكن لا أنصح بذلك
* يجوز إستخدام الرمز _ Underscore في البداية أو أي مكان آخر
* لا يجوز إستخدام المسافات في وسط الاسم.
* يجوز إستخدام الأرقام ما عدا أول خانة.
* ألا يكون اسم المتغير محجوزاً سابقاً، أو من أسماء كلمات اللغة المحجوزة.
* لغة الـ #C لغة حساسة فالمتغير Age يختلف عن AGE.

النهاية والواجب :

إلى هنا نكون قد وصلنا إلى نهاية درسنا، لكني سأطلب منك أن تقوم بكتابة تطبيق يسأل المستخدم إدخال عددين، وتقوم بتخزين هذين العددين، لأنك ستقوم بطباعة خمس جمل حسابية،
الجملة الأولى ستظهر حاصل مجموع العددين،
والجملة الثانية ستظهر حاصل طرح العددين،
والجملة الثالثة ستظهر حاصل ضرب العددين،
والجملة الرابعة ستكون حاصل قسمة العددين،
والجملة الأخيرة قم بكتابة: This Program Developed By وأضف اسمك إليه،

مع العلم أن إشارة العمليات التي ستحتاجها هي ( + – * / ) ، الموجودة على لوحة المفاتيح والظاهرة على الشاشة، قم بكتابة التطبيق وبعد الانتهاء منه، قم بأخذ صورة للمخرجات من شاشة الـ Console، وأضف الصورة إلى حسابك على تويتر أو الفيسبوك، ولا تنسى أن تقوم بعمل Mention لحسابي الشخصي، وإرفاق هاشتاق #طورني، لأقوم بإلقاء نظرة عليه.

حسابات الأستاذ أسامة الشخصيةFacebook , Twitter

هناك من سيقوم بعمله بشكل بسيط، لكني متأكد أن هناك من سيقوم بإضافة لمسات خاصة تميزه عن غيره. نصل إلى نهاية درسنا، ألقاك في الدرس التالي إن شاء الله.

مصطلحات الدرس :

string : متغير نصي يحتوي على كل خانة من خانات لوحة المفاتيح سواءاً الحروف الإنجليزية أو العربية أو الرموز والأرقام
int : إختصار لـ Integer  أي عدد صحيح لا كسور فيه مثل 25
Comment Out The Selected Lines : تحويل الأسطر المظللة إلى جمل ملاحظة
Uncomment The selected Lines :  تحويل الأسطر المظللة من جمل ملاحظة إلى أسطر برمجية يتم تنفيذها
File : ملف
Save All : حفظ جميع المستندات والملفات المفتوحة على البرنامج
What is Your Name : ما هو إسمك
Enter Your First / Last Name : أدخل إسمك الأول والأخير
WriteLine : دالة Method تقوم بطباعة سطر كامل ثم تنزل سطر جديد
Console Class : كلاس يحتوي على مجموعة من الدوال يمكن إستخدامها للتعامل مع الشاشة السوداء
Assignment Operator : علامة المساواة (=) وتقوم بإسناد قيمة ما على الطرف الأيمن إلى مكان ما على الطرف الأيسر
ReadLine : دالة تقرأ جملة كاملة بشرط أن تنتهي بزر الإدخال Enter
Quick Action : شكل مصباح أصفر يمكن الضغط عليه لإختيار مقترحات أو تعديلات سريعة وهو مفيد جداً
Camel Casing : طريقة تسمية متعارف عليها للكلمات الملتصقة، بحيث يكون كل أول حرف من الكلمة حرف كبير
Case Sensitive : لغة حساسة للأحرف، فالحرف الصغير يختلف عن الحرف الكبير مثل go تختلف عن Go
A Local Variable Or Function Named “myFirstNAme” is already Defined In This scope : المتغير معرف مسبقاً 
Initialization : إعطاء قيمة أولية للمتغير
IntelliSense : ميزة ذكية تقدم لك إقتراحات وتصويبات للوضع الحالي 
Syntax Error : وهو خطأ في تركيبة السطر البرمجي، وغالباً يكون خطأ إملائي في شكل الأحرف
Enter number 1 : أدخل الرقم الأول
Summation : حاصل الجمع
myFirstNumber : رقمي الأول
mySecondNumber : رقمي الثاني
Cannot implicitly convert type string to int : لا يمكن تحويل النوع النصي إلى عددي ضمنياً
Method : دالة تحتوي على مجموعة من الأسطر البرمجية التي تقوم بوظيفة معينة
Parse : دالة لتحويل نوع إلى نوع آخر
Underscore : علامة ( _ )
Age : عمر
Mention : ذكر وتنويه
This Program Developed By : هذا البرنامج تم تطويره بواسطة

post

#8 المتغيرات Variables – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : XVD

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  المتغيرات الجزء الأول

المتغيرات Variables

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثامن من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب،  في البداية أحب أن أشارككم فرحتي، بحصولي على شهادة مطور معتمد من Unity، الشركة الرائدة في مجال تطوير الألعاب، من خلال محركها الشهير Unity، والذي يمكنك بواسطته تطوير ألعاب، لجميع أنواع المنصات المتوفرة حالياً، سواء للـ PC أو الـ Mobile، أو حتى الـ Consoles مثل PlayStation وغيرها، فالشهادة التي حصلت عليها، ستكون تعزيزاً لما هو معلن على منصة طورني، حيث ستكون السلسلة التالية لسلسلة البرمجة هذه، سلسلة تعلم أساسيات تطوير الألعاب باستخدام محرك الألعاب Unity، والتي أعدك أن تقضي أوقاتاً ممتعة فيها بإذن الله، في هذا الدرسْ سنتكلمُ عن مفهوم المتغيرات Variables، وكيف تقوم بحجز مكان مناسب لمتغيرك في ذاكرة الحاسوب، وكيف تقوم بإعطائه قيماً تستخدمها في تطبيقك، بالبداية دعنا ننظر إلى المعادلة الموجودة على الشاشة،

3 + x = 8

فإن قمت بدراسة مادة الحساب، فلابد أنك شاهدت مثل هذه المعادلة الحسابية، فإن طلبتُ منك أن تقوم بإيجاد قيمة x، فأنا متأكد أنك ستجيب من غير تردد أن قيمة المتغير x هي 5، بنفس التحليل الذي استخدمته في المعادلة السابقة، قم بالنظر الى الأسطر البرمجية الظاهرة على الشاشة:

x = 3;
y = x + 4;
Console.WriteLine(y);

بإستخدام الخبرة البرمجية التي تمتلكها، ستجد أن ناتج y سيكون الرقم 7، وهذا بالضبط ما سيتم طباعته على الـ Console،

المعادلات الرياضية :

كما تعلنا سابقاً عن لغة الـ C#، أنها لغة مفهومة للبشر، فالأسطر الظاهرة على الشاشة، مطابقة تماماً لما تعلمناه في المعادلات الرياضية، عدا عن أن هناك فاصلة منقوطة في نهاية كل سطر، وأصبحنا نعرف معناها بناءً على الدروس السابقة، وستجد نفسك خلال تقدمنا في الدروس القادمة، أنك في معظم الأحيان ستفهم الأسطر البرمجية، حتى قبل أن أقوم بشرحه لك.

وغالباً ستكون مطابقة لجمل استخدمتها في الماضي، مثل التعامل مع الحساب والمعادلات الرياضية وغيرها. بالعودة إلى المثال الظاهر على الشاشة، فإن الحرفين x وy الموجودين أمامنا، يطلق عليها اسم المتغيرات أو Variables، ويمكن تعريف المتغير على أنه صندوق وهمي، يتواجد في ذاكرة الحاسوب، حيث بإمكانك استدعاءه لمعرفة القيمة التي يخزنها، وبالتالي يمكنك أيضاً أن تودع قيماً فيه، أو أن تستبدلها بقيم جديدة كلياً، وهذه هي استخدامات الـ Variables الأساسية.

 

أنواع البيانات  Variables Data Types :

ويمكن للمتغيرات أن تحتوي على قيم متنوعة، منها العدد الصحيح كما هو في مثالنا الحالي، ويمكن أن تحتوي على خانة واحدة فقط، ويمكن أن تحتوي على فقرات نصية طويلة، ويمكن أيضاً أن تحتوي على التاريخ والوقت، أو حتى أنواعاً جديدةً تقوم أنت بإنشائها، كما سنلاحظ في الدروس القادمة إن شاء الله. نعود لمثالنا حيث ستجد أن قيمة المتغيرات هي قيمة عددية، فقيمة المتغير x هي العدد الصحيح 3، وقيمة المتغير y هي حاصل جمع قيمة المتغير x، مضافاً إليها الرقم 4 ليصبح الإجمالي هو العدد الصحيح 7.

التطبيق الحالي نظرياً صحيح، لكنه غير مقبول لدى لغة الـ C#، لأننا لم نقم بحجز الصندوق الوهمي الخاص بكل متغير. تعرفنا في الدروس السابقة أنه بعد الـ Compile Process، سيقوم الـ .NET run-time بتنفيذها، ومن مسؤولياته الأساسية حجز مساحاتٍ كافيةٍ في الذاكرة، للمتغيرات التي قمنا باستخدامها بناءً على نوع قيمها، ففي مثالنا هنا يجب أن نخبر الـ Run-time، بضرورة حجز مساحة في الذاكرة للمتغيرين x,y، بما يتناسب مع حجم القيمة العددية لكليهما، كيف نقوم بذلك؟ هذا ما سوف نتعرف عليه معاً في هذا الدرس إن شاء الله.

حجز المتغيرات Variables Declaration :

لإنشاء مشروع جديد، سأقوم بتكرار ما قمنا به في الدروس السابقة، سأذهب إلى قائمة File — > New — > Project، ومن شاشة New Project سأحرص على اختيار Visual C#، ثم اختيار Console Application، سأقوم بعدها بإعادة تسمية هذا المشروع إلى Variables، ومن ثم نضغط على زر OK، ليبدأ برنامج الـ Visual Studio بتهيئة مشروعنا الجديد، ببناء الـ Solution والـ Project بالهيكلية التي تعرفنا عليها في الدرس السابق، وسأجد ملف Program.cs ظاهر في وسط الشاشة، حيث يمكنني البدء بكتابة الأسطر البرمجية، بين الأقواس الموجودة في السطر 12 والسطر 14.

أنوه أن كل الملاحظات التي ذكرتها في الدروس السابقة، يمكنك تطبيقها متى شعرت بعدم وصول المعلومة، قم بإيقاف الفيديو وكرره متى احتجت لذلك، خذ وقتك حتى تتمكن من تطوير مهارة تمييز الفروقات، سواءً حالة الحروف الصغيرة Small Letter أو الكبيرة Capital Letter، أو بالفروقات بين علامات الترقيم والفواصل والمسافات، التي سنستخدمها خلال كتابتنا الأسطر البرمجية، قم بتطوير مهارة المطابقة بين ما أقومُ بكتابتهِ على شاشتي، وبين ما تقومُ أنتَ بكتابته على نسختك من برنامج الـ Visual Studio، وفي حال ظهور خطوط حمراء متعرجة تحت الجمل، قم بالتحري بطريقتك الخاصة لاكتشاف حلٍ لهذا الخطأ.

لحجز مكان يتناسب مع نوع المتغير في الذاكرة، نحن بحاجة لإخبار الـ Compiler بفعل ذلك، وعملية الحجز هذه تسمى Variables Declaration، أي أننا سنخبر الـ .NET Run-time، بحجز مساحة كافية في ذاكرة الحاسوب، من خلال تحديد إسم ونوع لهذا المتغير، كما سأقوم بكتابته الآن:

int x;
int y;

في السطرين السابقين سألنا الـ .NET run-time، أن يقوم بحجز مساحة للمتغيرين x وy، من النوع int وهي إختصار لكلمة Integer أي عدد صحيح، والعددُ الصحيحُ هو مصطلحٌ في علم الرياضيات، يمثل العدد الكامل الذي لا كسور عشرية فيه، فمثلاً الرقم 5 هو رقم صحيح، لكن الرقم 5.6 هو رقم غير صحيح لأنه يحتوي على رقم بعد الفاصلة العشرية، بالإضافة إلى أن النوع Integer في لغة الـ C# يمثل الأعداد الصحيحة، فإن القيمة يجب أن تكون بين سالب بليونين وكسور، وموجب بليونين وكسور، وهذا حجم القيمة التي يتم حجزها في الذاكرة لهذا النوع، أما في حال كنا نحتاج أن نتعامل مع رقم أكبر من القيم السابقة، فنحن نحتاج إلى نوع غيرِ نوعِ العدد الصحيح Integer، وسنتعرف على الأنواع الأخرى لاحقاً إن شاء الله.

مثال عملي على المتغيرات Variables :

بعد الـ Variables Declaration، دعنا نقوم بإكمال كتابتنا للأسطر البرمجية كما في المثال أول الدرس،

x = 3;
y = x + 4;
Console.WriteLine(y);
Console.ReadLine();

لنتمكن من مشاهدة النتائج قبل خروج البرنامج بسرعة. إن قمنا بتنفيذ التطبيق سنجد أن المخرجات هي نفسها التي توقعناها سابقاً، كما نشاهد الآن على الشاشة أننا حصلنا على قيمة 7. إن لم تحصل على هذه القيمة، قم بإيقاف الفيديو وتتبع ما قمتُ بكتابته لتتأكد من صحةِ ما قمتَ أنت بكتابته.

الآن بعد ما قمنا بحجز المتغيرات في السطر رقم 13 و14، قمنا في الأسطر 16 و17 بإسناد قيم للمتغيرات، باستخدام إشارة المساواة =، وهذه الإشارة تسمى Assignment Operator، وسنتعرف على حالات خاصة منها في دروس متقدمة إن شاء الله. وإشارة المساواة تقوم بأخذ كل ما على الجانب الأيمن وتضعه في الجانب الأيسر،

وتطبيق ذلك على مثالنا هنا، يمكننا القول، أعطني قيمة 3 وضعها في المتغير الذي اسمه x، وبالمثل في السطر التالي، نقوم بإضافة قيمة إلى المتغير y، عدا أننا نقوم بشيء إضافي هنا، ألا وهو استدعاء قيمة المتغير x أولاً، فنحن نسأل الحاسوب أن يقوم بالبحث عن موقع المتغير x في الذاكرة، ثم نقوم بأخذ قيمته وجمعها مع الرقم 4، ليتم إسناد القيمة الكلية إلى المتغير y. وفي السطر رقم 19، نقوم بطباعة قيمة المتغير y، على شاشة الـ Console من خلال استدعاء موقعه في الذاكرة.

لتأكيد ضرورة حجز المتغيرات قبل استخدامها، سأقوم بتحويل السطر الذي يحتوي على تعريف المتغير x إلى سطر ملاحظة، تعلمنا أنه لفعل ذلك يلزم إضافة double slash // إلى بداية السطر،  بعد فعل ذلك، سنلاحظ ظهور خطوطٍ حمراءَ متعرجة، تحت المتغير في السطر رقم 16 والسطر رقم 17، وإن قمت بوضع مؤشر الفأرة على موضع الخطأ ستجد رسالة:

The name x Does not exist in the current context

والتي تعني أن x غير معرّف، ولكنك لربما تقول:  لقد قمنا بتعريفه هذا المتغير وها هو في السطر رقم 13، لكن كما اتفقنا في درس سابق، أننا بتحويل سطر برمجي إلى جملة ملاحظة Comment Statement، فإننا نخبر مترجم لغة الـ C# والمعروف بالـ .NET run-time، أن يقوم بتجاهل هذا السطر تماماً وكأنه غير موجود.

وكأن حال الـ Compiler ينظر إلى المتغير x ويقول لنا:  ما هذا الشيءُ هنا؟ من هذا الـ x الذي تتحدث عنه؟ لم أسمع به من قبل، ولا أعرف ماذا تريد مني أن أفعل به، إن لم تعطني معلومات أكثر عن هذا المدعو x، سأرفع العلم الأحمر في وجهك، ولن أدعك تمر تحت هذه الظروف الغامضة. لكي نقوم بحل المشكلة التالية، ولكي نرضي السيد الـ Compiler المحترم، يجب علينا التراجع عن جملة الملاحظة، لنجعلها جملة صريحة يمكن تنفيذها.

 

مصطلحات الدرس :

Variables : المتغيرات هي صناديق وهمية تتواجد في ذاكرة الحاسوب تحتوي على قيم بأنواع معينة
Unity : محرك ألعاب بإمكانك تطوير ألعاب عليه سواءاً 2D أو 3D ويمكن تصديرها لكل المنصات مثل Android, iOS, Xbox,Playstation وغيرها
Compile process : عملية تحويل الأسطر البرمجية التي تقوم بكتابتها إلى تطبيق مخرجات ( EXE أو حسب نوع المشروع) يمكن نشره للزبائن.
Dot Net Run-time : المكون الرئيسي الذي يعتمد عليه برنامج Visual Studio ويتكون من العديد من الطبقات الخدمية
Project : المشروع الذي نقوم بتطويره ويكون تحت Solution واحد فقط
New : جديد
Console Application : تطبيق شاشة سوداء يقوم بطباعة أسطر متتالية وتتميز ببساطتها وقوة أداءها
solution : الحل البرمجي وهو أعلى وأكبر حاوية للمشروع، ويمكن أن يتكون من أكثر من Projects
Program : البرنامج أو التطبيق الذي تقوم بتطويره
Small Letter : الأحرف الإنجليزية الصغيرة مثل حرف t الصغير
Capital Letter : الأحرف الإنجليزية الكبيرة مثل حرف T الكبير
Variables Declaration : حجز مكان في ذاكرة الحاسوب يتناسب مع نوع المتغير
int : إختصار لـ Integer  أي عدد صحيح لا كسور فيه مثل 25
Console.ReadLine : دالة تقرأ جملة كاملة بشرط أن تنتهي بزر الإدخال Enter
Assignment Operator : علامة المساواة (=) وتقوم بإسناد قيمة ما على الطرف الأيمن إلى مكان ما على الطرف الأيسر
Double Slash : علامة ( // ) وتستخدم لتحويل السطر البرمجي إلى جملة ملاحظة
The name x Does not exist in the current context : الإسم ( x ) غير معرف في القطعة البرمجية الحالية
Comment Statement : جملة ملاحظة، وهي جملة لا يتم تنفيذها وتستخدم لشرح وظيفة الأسطر البرمجية

post

#7 ملفاتُ المشروعِ Project Files – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : SND

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  ملفات المشروع ومخرجاته

 >>>تحميل مشروع الدرس<<<

هيكلية المشروع

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ السابعِ من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرسْ سنتكلمُ عن كيفيةِ تنظيمِ ملفاتِ العمل، وكيفَ أنَّ البرنامجَ يقومُ بتنظيمها، تحتَ مشروعْ Project وتحتَ Solution، وسنتعرفُ أيضاً على كيفيةِ إيجادها على الـ Hard Disk Drive، وسنشاهدُ لمحةً عن محتوياتِ هذهِ الإعدادات. فعندما نقومُ بإنشاءِ مشروعٍ جديد، يقومُ برنامجُ الـ Visual studio تلقائياً بتهيئةِ المشروع، حيثُ يقومُ بإنشاءِ جميعِ الإعداداتِ والملفاتِ والمصادرِ المهمة، الخاصةِ بالنوعِ الذي اخترناه، فإعداداتِ مَشروعِ الـ Web Development، تختلفُ عنْ إعداداتِ مشروعِ الـ Console، وهكذا.

 

نافذة Solution Explorer

حيثُ أنَّ أهمَّ ملفٍ في مشروعنا الأولِ هو ملفُ Program.cs، الذي نراهُ في وَسطِ الشاشة، فإذا نَظرتَ إلى القِسمِ الأيمنِ مِنَ الشاشة، ستجدُ قائمةَ Solution Explorer، تحتوي على كافةِ عناصرِ المشروعِ، وهذهِ القائمةُ تعتبرُ أهمَّ نَافذةٍ بعدَ مُحررِ النصوص، وستلاحظُ أنَّ هناكَ ملفاً يحمل الاسم Program.cs، وهوَ الملفُ الذي قمنا بكتابةِ أسطُرِنا الأولى عليه، حيثُ إنْ قمتَ بإغلاقِ شاشةِ الملفِ الموجودِ في وسطِ الشاشة، يمكننا فتحهُ منْ جديدٍ بالضغطِ على اسمهِ في قائمةِ المشروع. وستلاحظُ أنَّ الـ Solution الخاصَّ بنا، يحتوي على Project واحدٍ فقط، واسمُهُ HelloWorld وأنهُ مِنَ النوعِ #C، وبإمكانكَ إضافةُ عِدةِ مشاريعٍ تَحتَ Solution واحد، فالـ Solution هُوَ الحاويةُ لجميعِ المشاريعِ المترابطةِ ببعضها، وهوَ أكبرُ مِنَ المشروعِ Project، فإن قمنا مثلاً بالضغط على اسمِ الـ Solution بالزرِّ الأيمن، واخترنا Add –> New Project، سنتمكنُ مِنْ إضافةِ مشروعٍ جديد، مع إمكانيةِ تغييرِ نوعِ المشروعِ الجديدِ بلْ حتى تغييرَ لُغةِ بَرمجته.

 

مجلد ملفات المشروع

بَعدَ التعرُفِ على نافذةِ الـ Solution Explorer، لعلكَ تتساءلُ حولَ مكانِ ملفاتِ هذا المشروعِ على الـHDD ، ولمعرفةِ ذلكَ يجبُ عليكَ تَذكُرُ مَسارِ المشروع، وهُوَ المكانُ الذي قمنا باختيارِهِ عِندَ إنشاءِ المشروع، حَيثُ لو تَذكرْ أننا قُمنا في مَشروعنا الأول، باختيارِ إنشاءِ مُجلدِ المشروعِ في المسارِ الافتراضيِّ للبرنامج، ألا وهوَ مُجلدُ My Document الموجودُ في جهازنا، ولو قُمنا بالذهابِ هناك،  ستجدُ مجلداً باسمِ البرنامجِ مَعَ رَقمِ إصداره، كما هو ظاهِرٌ عنديْ هنا: Visual Studio 2017 ، إن قمتَ بفتحهِ ستجدُ مجلداتٍ كثيرة، سنختارُ مُجلدَ Projects منها، لنَجِدَ مُجلدَ المشروعِ الخاصِ بنا،

وتَجدُرُ الإشارةُ هنا إلى أنهُ مِنَ الأفضل، أنْ تَقومَ بإنشاءِ مُجلدٍ خاصٍ يحتوي على كلِّ مشاريعك، حيثُ تَقومُ بفرزِ مَشاريعِكَ المستقبليةِ حَسبَ نوعها، والأفضلُ أنْ تضعُهُ في Drive غير الـ OS Drive، لضمانِ سلامتهِ في حالِ حُدوثِ أيِّ خَلَلٍ في نظامِ التشغيلِ الذي تمتلكه. أما الآنْ ولهدفِ الدراسةِ والتعلم، فلا بأسَ في وضعِ المشاريعِ في المكانِ الافتراضيِّ للبرنامج، وأيضاً سيكونُ المكانُ الذي ستقومُ بنقلِ المشاريعِ التي قمتُ بكتابتها، لتقارِنَها بتطبيقكَ في حالِ حدوثِ أيِّ مشكلةٍ عندك، حيثُ كما ذكرتُ في بدايةِ السلسلة، أني سأقومُ بإرفاقِ ملفاتِ العملِ مَعَ النسخةِ النصيةِ للدرس، ولكيْ تقومَ بفتحِ الملفِ يُمكننا أخذَ المثالِ التالي،  فبعدَ تَحميلِ الملفِ قُمْ بفكِ ضغطه،  وقمُ بوضعِ المجلدِ الناتجِ بجانبِ المشاريعِ الأخرى، وقم بالرجوعِ إلى البرنامج، ومنْ قائمةِ File –> Open –> Project/Solution، قُم باختيارِ المشروعِ المستهدف، وتأكدْ مِن فتحِ الملفْ .sln الخاصِ به، وسيظهرُ لكَ المشروعُ بملفاتهِ الرئيسية.

 

محتوى ملف المشروع

بالعودةِ إلى مُجلدِ المشاريع، ستجد مجلد HelloWorld ، الخاص بالـ Solution الذي قمنا بكتابتِه في تطبيقِنا الأول، بالدخولِ إليه ستجدُ ملفَ HelloWorld.sln وهو ملفُ المشروعِ الكامل، إن قمتَ بفتحِه بأيِ محررِ نصوص، مثلَ الـ Notepad ++،  ستجدُ أنهُ يحتوي على معلوماتٍ خاصةٍ بهيكليةِ المشروع، بالطبعِ لن نقومَ بتعديلِ أيِ شيءٍ هنا، لكن من بابِ الإحاطةِ بالشيء، أحببتُ أنْ أريكَ محتوياتِ هذا الملف، وبالمثلِ أيضاً إن قمتَ بالدخولِ إلى مجلدِ المشروعِ Project، سنجد ملفَ HelloWorld.csproj، وهو الملفُ الذي يحتوي على كافةِ إعداداتِ المشروعِ أيضاً، قم بفتحِه وستجدُ العديدَ من المعلومات، لن نقومَ بتعديلِ أيِ شيءٍ، ولكن من بابِ الإحاطةِ بالشيءِ أيضاً.

 

مخرجات المشروع

وأخيراً ستجدُ مجلداً يحملُ الاسمَ Bin، اختصاراً لكلمةِ Binary، وستجدُ جميعَ مخرجاتِ المشروعِ هنا، لأن عمليةَ البناء Process of Compilation،  تأخذُ أسطرَك البرمجيةِ المقروءةِ للبشر، وتقوم بتحويلِها إلى صيغةٍ مفهومةٍ للحاسوب. إن قمتَ بتصفحِ المجلدِ سنجدُ أن هناك مجلداً أخراً يحملُ الاسمَ Debug، ويظهرُ هذا المجلدُ في حالِ قيامِك بتنفيذِ التطبيقِ من داخلِ البرنامج، حيث أن هناك وضعيتين للمخرجات، الأولى هي وضعيةُ اكتشافِ الأخطاءِ Debug Mode، حيث يقومُ البرنامج ُببناء ِالتطبيق، وتخصيصِه لإمكانيةِ اكتشافِ الأخطاءِ ومتابعتِها، والوضعيةُ الثانيةُ هي وضعية ُالنشرِ Release Mode، وهي النسخة ُالنهائيةُ الجاهزةُ للتصدير، سنتكلم عن الوضعيتين أكثرَ في الدروس المتقدمة.

الآن عند الدخولِ إلى مجلدِ الـ Debug، ستجدُ أن هناك ملفاً تنفيذياً اسمُه HelloWorld.exe، وهو من النوعِ exe المختصرِ من Executable File، لو قمتَ بتشغيلِه ستجدُ نفسَ مخرجاتِ ما كان يظهرُ في داخلِ البرنامج. هذا الملفُ تقريباً يمكنك نقلَه لأيِ جهازٍ آخر، مع ملاحظةِ أنه نسخةُ Debug Version، فإنْ قمتَ بنقلِ هذا الملفِ إلى جهازِ صديقك، سيعملُ غالباً منْ غيرِ مشاكل، مَعَ مراعاةِ أنَّ هذا النوعَ خاصٌ بنظامِ التشغيلِ ويندوز.

ويجبُ التنويهُ هُنا، أنَّ هذهِ الأنواعِ تعتبرُ في بعضِ الأحيانِ خطرة، فتأكدْ مِنْ خُلوِ الملفِ مِنَ الفايروساتِ قبلَ فتحه، لأنَّ العديدَ منَ القراصنةِ يَستخدمونَ هذه الأنواع، لسهولةِ وخفةِ حجمها، ويُمكنكَ عَملُ Scan لهُ بواسطةِ أيِّ بَرنامجِ حماية، أو إستخدامِ موقع virustotal.com، في حالِ عِدمِ امتلاكِكَ لأيِّ برنامجِ حماية، كانتْ هذهِ لمحةٌ عنْ هيكليةِ الملفاتِ الخاصةِ بِكلِ مشروع، أتمنى أن تكونَ قدْ استفدتَ منها، أراكَ في الدرسِ التالي إن شاء الله.

مصطلحات الدرس :

Solution : الحل البرمجي وهو أعلى وأكبر حاوية للمشروع، ويمكن أن يتكون من أكثر من Projects

Project : المشروع الذي نقوم بتطويره ويكون تحت Solution واحد فقط

Hard Disk Drive : القرص الصلب ويسمى إختصاراً HDD والذي يحتوي على جميع ملفات النظام والمشاريع

Web Development : تطوير تطبيقات الويب ممثلة بصفحات الويب ومواقعه

Console : شاشة سوداء تطبع أسطر متتالية وتتميز بسهولتها وقوة أداءها

Program.cs : هو الملف الرئيسي الذي نقوم بكتابة أسطرنا البرمجية الأولى عليه ويحتوي على الدالة الرئيسية Main

Solution Explorer : نافذة تقوم بعرض جميع مكونان الحل البرمجي، من مشاريع ومكتبات ودوال

OS Drive : قرص ال HDD الذي يحتوي على نظام التشغيل Operating System

SLN : هو إمتداد الملف Extension  الخاص بالمشروع Solution

Process of Compilation : عملية تحويل الأسطر البرمجية التي تقوم بكتابتها إلى تطبيق مخرجات ( EXE أو حسب نوع المشروع) يمكن نشره للزبائن.

Debug : عملية إستكشاف الأخطاء

Debug Mode : نظام مخرجات ومعالجة يحتوي على معلومات إضافية من هدفها إستكشاف الأخطاء وإعطاء تقارير

Release Mode : نظام مخرجات نهائي يتم إرساله للزبائن مباشرة

EXE : ملف تنفيذي Executable File يعمل على نظام Windows

Virus Total : موقع إلكتروني يمكنك رفع ملفات لإستكشاف إن كانت تحتوي على برامج خبيثة؟

 

 

 

post

#6 فهمُ التطبيقِ الأول – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : LPC

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  فهمُ التطبيقِ الأول

لماذا قمنا بكتابةِ ذلك؟

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرس السادس من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في البدايةِ أودُ الإشارةَ إلى منتدى منصةِ طورني، حيثُ أودُ شكرَ كلِّ الأعضاءِ الذينَ أثروهُ بمواضيعهم، وأطلبُ منكَ زيارتَهُ في حالِ احتياجكَ لأيِّ مساعدة، ففيهِ الكثيرُ ممنْ يودونَ مساعدتك.

في هذا الدرسِ سنقومُ بالتعرفِ أكثر، على الأسطرِ البرمجيةِ التي كتبناها في تطبِيقِنا الأول، سابقاً كنْتُ أريدُ مِنكَ التركيزَ على، ماذا كتبنا وكيفيةِ الكتابة، لكنْ الآن سنقومُ بالتركيزِ على لماذا قُمنا بكتابةِ ذلك، وبما أننا قُمنا بالتعرفِ على بعضِ قواعدِ الكتابة، ستكونُ متهيئاً لكافةِ المعلوماتِ التي سنتعلمها في هذا الدرس.

إجادة لغات البرمجة :

عندما تنوي تعلمَ تطويرِ التطبيقات، وبعدَ اختياركَ للغةِ البرمجةِ التي ارتحتَ لها، أنتَ بحاجةٍ إلى التعرفِ على قسمينِ أساسيينِ لإجادةِ هذهِ اللغة، فمعرفتكَ لأسماءِ وأفعالِ الأسطرِ البرمجية، أو ما يُطلقُ عليهِ اسمُ الـ Syntax، هو فعلياً القسمُ الأولُ مِنَ الموضوع، أما القسمُ الثاني، فهو مَعرفةُ الكلماتِ المحجوزةِ الـ Keywords المعدّةِ مسبقاً، والتي تكونُ متاحةً للاستخدامِ في كتابةِ تطبيقك.

وتقدمُ لنا شَركةُ Microsoft شيئاً يدعى Dot Net Framework ، الذي يُقدمُ مَجموعةً مِنَ المكوناتِ لتسهيلِ عمليةِ التطوير، وسنقومُ بشرحِ بعضٍ مِنْ مُكوناته، بما يتناسبُ مَع مُستوى هذهِ السلسلة، فالعنصرُ الأولُ هوَ المكتباتُ البرمجية Class Library، حيثُ قامتْ الشركةُ بكتابةِ العديدِ مِنَ المكتباتِ البرمجية، التي يَحتاجُها تَطبيقنا بشكلٍ أساسي، مِثلَ التعاملِ مَعَ المعادلاتِ الرياضية، والتعامُلِ مع النصوصِ، والتعاملِ مع التاريخِ والوقتِ، وإظهارِ المعلوماتِ على الشاشة، وأمورٍ كثيرةٍ سنتعرفُ عليها مُستقبلاً، كل هذهِ المكتباتِ كانَ منَ الصعبِ علينا كتابتُها، خصوصاً أنها أساسيةٌ في كلِّ تطبيق.

والمُكونُ الثاني مِنْ مُكوناتِ الـ .Net Framework هو ، الـ Runtime والمعروفُ بـ CLR، المختصرُ مِنَ المصطلحِ Common Language Runtime، ويمكنَ تشبيهَهُ بالفقاعةِ التي تُحيطُ بتطبيقَك، حيثُ يعيشُ تطبيقُكَ داخلَ هذهِ الفقاعةِ وتقومُ بحمايته، وتتكفلُ بالعديدِ منَ التفاصيلِ ذو المستوى المتدني Low Level، لتدعكَ تركزُ بشكلٍ أساسيٍ على هدفِ التطبيق، ولا تقلقْ بشأن أمورٍ مثلِ نوعِ نظامِ التشغيلِ، أو إدارةِ الذاكرةِ المستخدمة Memory Usage، أو حتى بطريقةِ التعاملِ مع الملفاتِ في القرصِ الصلب، وفي نفسِ الوقت، يقوم الـ CLR، بتقديمِ طبقةِ حمايةٍ للزبونِ نفسه، حيثُ يَمنعكَ كمطورٍ للتطبيقاتِ بالحصولِ على معلوماتهم الخاصة، أو بالعبثِ بأجهزتهم دونَ أخذِ إذنٍ مسبقٍ منهم، حيثُ تظهرُ رسالةٌ للزبونِ تخبرُهُ أنكَ تحتاجُ هذهِ الصلاحية.

الدوال Methods :

بعدَ المقدمةِ البسيطةِ حول الـ .Net Framework ، نعودُ لتطبيقنا الأول، حيثُ ستجدُ في السطرِ الثالثِ عشرْ أننا استخدمنا مكتبةً برمجية، تقومُ بطباعةِ نصٍ على الشاشة، وقمنا بإعطائهِ النصْ بينَ علامتي تنصيص،  فنحنُ لا نهتمُ بكيفيةِ القيامِ بهذا الأمر، بل نهتمُ بالنتيجة، لاحظْ أننا في هذا السطرِ قمنا باستخدامِ داله Method، قام بكتابتها شخصٌ منْ شركة Microsoft، لأخذِ جملةٍ وطباعتِها على الشاشة، وفي السطرِ الـرابعِ عشر أخبرنا التطبيقَ أنْ ينتظر، بواسطة الكلمة المحجوزة ReadKey، لكي يقومَ المستخدمُ بإدخالِ حرفٍ قبل إنهاءِ التطبيق، وسببُ وضعِ هذهِ الجملةِ أننا نريدُ رؤيةَ نتيجة الطباعة في الجملة السابقة، وفي حال لم تَضعْها فسيطبعُ التطبيقُ الجملة، وسيصلُ إلى نهايةِ التطبيقِ ويخُرجُ منه، دونَ أن يسمحَ لكَ برؤيةِ النتيجة.

 جمل الملاحظات Comment : 

ولرؤيةِ ذلكَ قمْ بجعلِها جملةَ ملاحظة Comment، وذلكَ بكتابةِ // قبلَ بدايةِ السطر،  وتعني أنَّ التطبيقَ لن يقومَ بتنفيذِ هذهِ الجملةَ وسيتجاهلها، بإمكاننا حذفُ هذا السطرِ نهائياً، لكنْ ربما نحتاجهُ لاحقاً، ولا داعي لكتابتهِ منْ جديد، وجُمَلُ الملاحظاتِ تتعدى هذهِ الميزةِ بميزاتٍ أخرى، فتستطيعُ مِنْ خِلالها كتابةَ ملاحظاتٍ لفقرةٍ برمجية، لتتذكرَ وظيفتها بالضبط، وتكونُ مذكَّرَةً لكَ في حالِ عودتكَ بعدَ فترةٍ منَ الزمن، أو تكونُ شَرحاً لشخصٍ آخرٍ يريدُ التعديلَ على أسطركَ البرمجية.

إن حاولتَ تنفيذَ التطبيق الآن، ستجدُ أنَّ هناكَ شاشةً ظهرتْ ثم اختفتْ بسرعة، وذلكَ لأن التطبيقَ قامَ بتنفيذِ الأسطرِ على التوالي، فقامَ بطباعةِ الجملةِ ثم وصلَ إلى نهايةِ التطبيق، وخرجَ من التطبيقِ ليعودَ مرةً أخرى إلى برنامج الـ Visual Studio، أما إن تراجعنا عنْ جملةِ الملاحظة،  وقمنا بتشغيلِ التطبيق، سنرى جملةَ Hello World، وسينتظرُ البرنامجُ مِنَّا إدخالَ أيِّ حرفٍ لينتهي مِنَ التطبيق، ويَجدرُ بالذكرِ أنَّ هناكَ كلمةً مرادفةً لـ ReadKey، إلا وهي ReadLine، وتقومُ بانتظارِ مدخلاتٍ ثم زر Enter، حيثُ لو قمنا باستبدالها الآن، وقمنا بتشغيلِ التطبيق، يمكننا كتابةُ الكلماتِ التي نريد، ويجبُ أن ننهِيَها بزرِّ الإدخال Enter منْ لوحةِ المفاتيح.

القطع البرمجية Code Block :

في درسنا السابق تعرفنا بشكل بسيط، على مفهوم الـ Code Block، وتعرفنا أنها عبارةٌ عنْ قطعةٍ برمجيةٍ تبدأُ بقوسٍ وتنتهي بآخر، وفي هذا التطبيقِ هناكَ العديدُ مِنَ القطعِ البرمجية، و تحملُ القطعةُ البرمجيةُ غالباً اسماً، ففي مثالنا هنا، هذهِ القطعةُ البرمجيةُ تحملُ اسم Main، وهذهِ القطعةُ البرمجيةُ تُسمى داله Method، ومن المتعارفِ عليهِ أنَّ الـ Main Method، هيَ الدالةُ التي يَبدأُ بها التطبيقُ في كلِّ مرةٍ تَقومُ بتشغيله، ولا أريدكَ أنْ تقلقَ بشأنِ الكلماتِ الموجودةِ قبلَ كلمةِ Main، لأننا سنتكلمُ عنها لاحقاً إن شاء الله، ولو لاحظتَ معي أيضاً، أنَّ الـ Main Method موجودةٌ داخلَ قطعةٍ برمجيةٍ أخرى، اسمها Program وهي من النوع Class، وهي المكانُ الذي سيحوي كلَّ الـ Methods التي سنكتُبُها لاحقاً، ولهُ الكثيرُ من الخصائِصِ والميزاتِ التي سنتكلمُ عنها لاحقاً، وستلاحظُ أيضاً أن الـ Class موجودٌ في قطعةٍ برمجيةٍ أخرى، اسمها HelloWorld وهي مِنَ النوع namespace، وهيَ الحاويةُ لجميعِ الـ Classes الموجودةِ بداخلِ برنامجك، وستجدُ أنَّ اسمَها مُطابقٌ لاسمِ المشروعِ الذي أنشأناه سابقاً.

لو لاحظت في تطبيقنا الأول، أننا قمنا باستدعاءِ مكتبات Classes، واستخدمنا بعضَ الدوالِ Methods الموجودةِ ضِمنها، فقدْ قمنا باستدعاءِ الـ Console Class، واخترنا الـ WriteLine Method منه، فبمجردِ كتابةِ اسم الـ Class وإتباعهِ بنقطه، سترى جميعَ الـ Methods المتوفرةِ بداخله، وهذه النقطةُ Dot بعد اسم الـ Class، تَعملُ عَمَلَ فهرس الكتابِ الذي يسمحُ لكَ بمعرفةِ الوحداتِ الموجودةِ فيه، ويطلقُ عليها اسم Member Accessor، ونلاحظُ أنَّ جميعَ الدوال Methods، تبدأ بقوسٍ وتنتني بآخر، وبعضُها تحتوي على قيمٍ بداخلِ الأقواسِ كما WriteLine، تستخدمها الدالةُ في إجراءِ وظيفتها، وبعضها الأخرْ لا يحتاجُ لتلكَ القيمِ مثل ReadLine، وسنقومُ لاحقاً بالحديثِ أكثرَ عنْ هذهِ القيمِ التي تتواجدُ بينَ الأقواس، وكلْ ما عليكَ معرفتهُ الآن، هو أنَّ استدعاءَ الدالةِ يتمُّ بذكِرِ اسمها وكتابةِ أقواسها، وإعطاءِها قيماً إنْ كانتْ تَحتاجُ ذلك.

كما تحدثنا في الدرسِ السابقِ بخصوصِ الفاصلةِ المنقوطة، أنها كقواعدِ كتابةِ الجملِ في اللغةِ العربية، تأتي في نهايةِ الجملةِ البرمجيةِ لتخبرَ البرنامِجَ أنَّ هذا السطرَ قدْ انتهى، فكما رأينا سابقاً أننا لو قمنا بوضعِ السطرينِ في سطرٍ واحد، فلن يحدثَ أي مشكلة، وبالمثلِ أيضاً، إن قُمتَ بتقسيمِ الجملةِ إلى عدةِ أقسامٍ، فلن يحدثَ أيُّ مشكلةٍ أيضاً، والشيءُ المهمُ هنا أنْ تنتهي الجملةُ البرمجيةُ بالفاصلةِ المنقوطة، والجميلُ بالأمرِ أنكَ إنْ تركتَ مسافاتٍ زائدة، فإن برنامجَ الـ Visual Studio وبمجردِ وضعِ الفاصلةِ المنقوطة، سيقومُ تلقائياً بترتيبِ السطرِ بشكلٍ متناسق، ولذلك لتسهيلِ عمليةِ قراءةِ البرنامجِ بشكلٍ أفضل، فضلاً عن أنَّ البرنامجَ قامَ بوضعِ ألوانٍ متنوعة، حسَبَ نوعِ الكلمة، وذلكَ لتَسهُلَ عليكَ القراءةُ أيضاً، وهذا ما سوفَ نتعرفُ عليهِ في الدروسِ المقبلةِ. أراك في الدرسِ التالي إن شاء الله.

مصطلحات الدرس :

Syntax : التركيب الإصطلاحي للسطر البرمجي، أو منطق السطر البرمجي الواحد
Class Library : مجموعة من الدوال Methods التي تقوم بأعمال معينة تحت حاوية واحدة ألا وهي الـ Class
Dot Net FrameWork : المكون الرئيسي الذي يعتمد عليه برنامج Visual Studio ويتكون من العديد من الطبقات الخدمية
Keywords : كلمة محجوزة
Runtime : المعروف أيضاً بالمختصر CLR  القادم من Common Language Runtime وهو وسيط بين أسطرك البرمجية وبين لغة الآلة
Low Level : مستوى متدني وهنا نستخدمه للدلالة على لغة الآلة Assembly Language
Memory Usage : إدارة حجم الذاكرة المستخدمة
Method : دالة تحتوي على مجموعة من الأسطر البرمجية التي تقوم بوظيفة معينة
ReadKey : تقوم بقراءة حرف من لوحة المفاتيح
Double Slash :  // يتم إستخدامها لتحويل السطر البرمجي إلى سطر ملاحظة غير قابل التنفيذ
ReadLine : تقرأ جملة كاملة بشرط أن تنتهي بزر الإدخال Enter
Code Blocks : قطعة برمجية تحتوي على أسطر برمجية تبدأ بقةس وتنتهي بآخر وفي بعض الأحيان تحمل إسم
Main Method : الدالة الرئيسية التي يبدأ تنفيذ التطبيق منها ( يمكن تغييرها لاحقاً )
Program : البرنامج أو التطبيق الذي تقوم بتطويره
NameSpace : مكتبة ومجموعة من ال Classes التي تؤدي وظائف مختلفة
Class : مجموعة من الدوال Methods تحتوي على أسطر برمجية تؤدي وظائف معينة
Console : شاشة سوداء تقوم بطباعة أسطر متتالية وتتميز ببساطتها وقوة أداءها
Member : عضو ، لكن المقصود بها هنا هو جميع التوابع الخاصة بدالة أو ب Class أو ب Namespace معين
Member Accessor : وهي أداة ال النقطة ( . ) حيث بمجرد وضعها يقوم برنامج Visual Studio من خلال ال Intellisense بعرض جميع المحتويات الداخلية
WriteLine : دالة Method تقوم بطباعة سطر كامل ثم تنزل سطر جديد

post

#5 قواعدُ الكتابةِ Syntax – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : MTQ

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  قواعدُ الكتابةِ

قواعدُ الكتابةِ في لغةِ الـ #C :

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرس الخامس من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، كما أني أخطأتُ في نطقِ ترتيبِ اسمِ السلسلةِ في المقطعِ السابق، هناكَ أخطاءٌ شائعةٌ يقعُ بها المطورونَ في بدايةِ طريقِهمْ، سنقومُ في هذا الدرسِ بالتَّعرفِ على أهمِّا، وستكونُ أيضاً فرصةً ممتازةً لكَ، لتتعلمَ بعضاً منْ قواعدِ كتابةِ الأسطرِ البرمجيَّةِ الخاصةِ بلغةِ الـ #C، فكمَا هناكَ قواعدٌ للغةِ العربية، يُوجدُ أيضاً قواعدٌ للغةِ الـ #C يجبُ الالتزامُ بها، لذلكَ سأقومُ بإدراجِ أمثلةٍ تحتوي على أخطاءٍ برمجيةٍ، لنقومَ بحلها ونتعرفَ على قواعدِ هذهِ اللغة.

الخطأ الأول :

إنْ حاولتَ تنفيذَ التطبيقِ التَّالي، ستجدُ رسالةً مُفادُها أنَّ هنالكَ أخطاءً أثناءَ عمليةِ البناءِ، ويسألُكَ البرنامجُ عمَّا إن كنتَ تريدُ تكرارَ، أخِرِ مرةٍ كانَ التطبيقُ فيهِ خالياً مِنَ الأخطاءِ، دائماً اختر لا لهذهِ الرِّسالةِ، لأنَّنا نهتمُ بالتعديلاتِ الحاليَّةِ لا التعديلاتِ السابقة. ولو قُمتَ بالنَّظرِ إلى أسفلِ الشَّاشةِ، ستجدُ أنَّ هناكَ قائمةً بالأخطاءِ الموجودةِ Error List، غالباً سيكونُ محتَوى الرِّسالةِ مفهوماً لكَ، لكنْ في بعضِ الأحيانِ ستجدُ صُعوبةً في فَهمِهَا، خصوصاً في مرحلةِ البدايةِ، أيضاً يُمكنُكَ تحريكُ مؤشرِ الـ Mouse، على الجملةِ الخاطئةِ في نافذةِ الأسطرِ البرمجيَّةِ، وستظهرُ لكَ رسالةٌ صغيرةٌ تحتوي على ملخصِ الخطأ، ليسَ هذا فحسبٌ، بلْ إنَّ برنامجَ الـ Visual Studio، يساعدُكَ في كثيرٍ منَ الأحيانِ على اكتشافِ موضِعِ الخطأِ، بوضعِ خطٍ أحمرٍ متعرجٍ تحتَهُ، وأحياناً يكونُ الخطُ أزرقَ اللونِ أو أخضرَ حسبَ طبيعةِ الخطأِ، وسنهتمُ حالياً بالخطِ المتعرجِ ذي اللونِ الأحمرِ، لأنَّهُ دليلٌ على أنَّ هذهِ الجملةَ بالتَّحديدِ، تحتاجُ اهتمامَكَ لأنَّ فيها شيئاً يجبُ إصلاحُهُ.

فيتَّضحُ في مثالِنَا هذَا، أنَّ المشكلةَ هيَ أنَّ الأسطرَ البرمجيَّةَ خارجُ نطاقِ الأقواسِ المطلوبةِ، أو ما يطلقُ عليها اسمُ الـ Code Blocks، أيْ القطعةُ البرمجيةُ الَّتي تبدأُ بقوسٍ وتنتهِي بقوسٍ آخرَ، وسنتعرفُ أكثرَ على هذا المصطلحِ في الدُّروسِ المقبلةِ إن شاء الله، ولإصلاحِ هذا الخطأِ، يجبُ علينا سحبُ الأسطرِ البرمجيَّةِ، ووضعُهَا داخلَ المكانِ المخصصِ لها، بعدَ القيامِ بذلكَ ستجدُ أنَّ التَّطبيقَ أصبحَ خالياً منَ الأخطاءِ، وبإمكانِكَ تنفيذهُ بدونِ أيِّ مشاكلٍ، منْ خلالِ المثالِ السَّابقِ تعلمْنَا قاعدةً منْ قواعدِ لغةِ ال C#، ألا وهيَ أنَّ هنالِكَ اختلافاً في النتيجة، بناءً على مكانِ كتابةِ الأسطرِ البرمجيَّةِ.

الخطأ الثاني :

في هذا المثالِ أيضاً نجدُ أنَّ هنالِكَ أخطاءً في نافذةِ Error List، وهناكَ خطٌ متعرجٌ ذو لونٍ أحمرٍ تحتَ كلمةِ Console، وخطٌ متعرجٌ في نهايةِ السطرِ أيضاً، عدَا أنَّ رسالةَ الخطأِ هذهِ يمكنُ فهمُ محتواها، فالرسالةُ تُخبرنَا أنَّنا نسينَا وضعَ فاصلةٍ منقوطةٍ semicolon  في نهايةِ الجملةِ، فكمَا يجبُ أنْ تنتهيَ الجملةُ بعلامةِ ترقيمٍ في قواعدِ اللغاتِ، فمنْ قواعدِ لغةِ الـ #C، وضعُ فاصلةٍ منقوطةٍ في نهايةِ كلِّ سطرٍ برمجيٍّ، وتجدرُ الإشارةُ هنا إلى أنَّهُ إنْ قمتَ بوضعِ الجملتينِ في نفسِ السطرِ، فلنْ يظهرَ أيُّ خطأٍ لأنَّ كلتا الجملتينِ تنتهيانِ بالفاصلةِ المنقوطة، وسيقومُ المترجمُ بمعرفةِ أنُهما منفصلتان، حتى إن كانتا في نفسِ السطر، ولكنْ منْ بابِ التَّرتيبِ وسهولَةِ القِراءةِ، فالأفضلُ أنْ نضعَ كلَّ جملةٍ في سطرٍ منفصلٍ، منَ المثالِ السابقِ تعلمنا القاعدةَ الثانيةَ منْ قواعدِ لُغةِ الـ #C، ألا وهيَ وجوبُ وضعِ فاصلةٍ منقوطةٍ في نهايةِ كلِّ سطرٍ برمجيٍّ.

الخطأ الثالث :

في هذا المثالِ لمْ يقمِ المترجمُ بالتعرفِ على الكلماتِ الَّتي فوقَ الخطِ المُتعرجِ، لأنَّهُ اعتبرها كلماتٍ محجوزةً أو مُتغيراتٍ لا نصٍ، وتعرفنَا سابقاً أنَّهُ لكتابةِ أيِّ نصٍ يجبُ أنْ نضعَهُ بينَ علامتي تنصيصٍ، لكي نُخبرَ المترجمَ أنَّ هذهِ الجملةَ هيَ جملةٌ نصيَّةٌ، والرَّجاءُ طباعتُهَا كمَا هيَ، ولإصلاحِ هذا الخطأِ قمْ بوضعِ علامتيِّ تنصيصٍ كالتالي: (ضعْ علامتيِّ التَّنصيصِ) ، منَ المثالِ السابقِ تعلمنا القاعدةَ الثالثةَ منْ قواعدِ لُغةِ الـ #C ، ألا وهيَ أنَّهُ في حالِ طباعةِ نصٍ يجبُ وضعهُ بينَ علامتيِّ تنصيصٍ.

الخطأ الرابع :

أمَّا في المثالِ التالِي، فسنتعرفُ هنا على أكثرِ الأخطاءِ شيوعاً، ألا وهيَ صيغةُ أحرفِ الكلماتِ المحجوزةِ، حيثُ ستجدُ رسالةً مفادُها أنَّ المترجِمَ لمْ يَقمْ بالتَّعرفِ على كلمةِ console، وستسألُ نفسكَ: لقد قمتُ بكتابتِهَا بشكلٍ صحيحٍ فلِمَ الخطأُ؟

والجوابُ هوَ أنكَ لو لاحظتَ أثناءَ كتابتِنا للَّتطبيقِ الأوَّلِ، أنَّي قمتُ بالتَّنويهِ على ضرورةِ كتابةِ الكلمةِ بحرفٍ كبيرٍ في بدايتِها، ولحلِّ هذهِ المشكلَةِ يجبُ تغييرُ كلمةِconsole  إلى Console ،

أعلمُ أنَّكَ ستجدُ صعوبةً في تقبُّلِ هذهِ النقطةِ بالتحديدِ، لأنَّنا لمْ نتعودْ على هذهِ الدقةِ في كتاباتِنَا أو في حياتِنَا العمليةِ، ولكنْ عندَ التَّعاملِ معَ الحاسوبِ يجبُ عليكَ أنْ تكونَ بتلكَ الدِّقةِ، وستتعودُ على هذا الأمرِ خلالَ ممارستكَ للبرمجةِ أكثرَ فأكثرَ.

ومنَ المثالِ السابقِ تعلمنا القاعدةَ الرابعةَ منْ قواعدِ لُغةِ الـ #C ، ألا وهيَ أنَّ هذهِ اللغةَ حساسةٌ لصيغةِ أحرفِ الكلمةِ Case Sensitive  ، بمعنَى أنَّ الحرفَ الصغيرَ small letter c، والحرفَ الكبيرَ capital letter C، تعنِي أنَّكَ تقومُ بكتابةِ كلمتينِ مختلفتينِ كُلياً.

الخطأ الخامس :

وفي مثالِنَا الأخيرِ ، ستجدُ أنَّ المشكلةَ مشابهةٌ تماماً للمثالِ السابقِ، حيثُ أنَّنا لمْ نراعِ الحروفَ الكبيرةَ في الكلمتينِread key، والجميلُ في الأمرِ أنَّهُ إنْ لمْ تكنْ بتلكَ الدِّقةِ، أو لمْ تكنْ قادراً على حفظِ هذهِ الكلماتِ بشكلٍ صحيحٍ، فإنَّ برنامجَ الـ Visual Studio سيساعدُكَ في ذلكَ، ليسَ في اقتراحِ إكمالِ الكلمةِ فحسب، بلْ بكتابتِها بشكلٍ صحيحٍ أيضاً، فلو قمتَ بكتابةِ الكلمةِ readkey بأحرفٍ صغيرةٍ، ستلاحظُ أنَّ البرنامجَ وبمجردِ فتحِ الأقواسِ قامَ بإصلاحِها تلقائياً، بالتالي قامَ بتقليلِ الأخطاءِ الَّتي قدْ تقعُ فيها مُستقبلاً، ولعلَّهُ يتبادرُ إلى ذهنكَ الآنَ، أنَّهُ إنْ كانَ البرنامجُ يقومُ بالإصلاحِ تلقائياً، فلِمَ تقومُ بالتركيزِ على ضرورةِ الانتباهِ إلى صيغةِ أحرفِ الكلماتِ؟

والحقيقةُ أنَّي أريدُ تثبيتَ هذهِ القاعدةِ، لأنَّكَ إنِ اضطررتَ لاستخدامِ محررٍ للنصوصِ غيرَ برنامج الـVisual Studio ، ولمْ يكنْ بهِ خاصيةُ إصلاحِ الأخطاءِ أوتوماتيكياً، أنْ تكونَ قادراً على تذكُّرِ صيغةِ الكلماتِ المحجوزةِ.

فوائد معرفة قواعد الكتابة :

لو قمتَ بكتابةِ تطبيقِنَا الأوَّلِ بشكلٍ صحيحٍ، فلقدْ اجتزتَ أوَّلَ وأهمَّ مرحلةٍ لبناءِ وتطويرِ التَّطبيقاتِ. أمَّا إنْ واجهتكَ مشكلةٌ ولمْ تستطعْ حلَّهَا، فقمْ بمقارنَةِ ما قمتُ بكتابتهِ حرفاً حرفاً، وخذْ وقتكَ الكافِي حتَّى تكتشفَ طريقةَ حلِّهَا، لأنَّهُ معَ مرورِ الوقتِ ستقفزُ عينُكَ مباشرةً إلى مكانِ الخطأِ، وستكونُ قادراً على التَّنبؤِ بطريقةِ حلِّها بشكلٍ سريعٍ. أيضاً سأقومُ بإرفاقِ التَّطبيقِ الَّذي كتبناهُ معاً، لتتمكنَ منْ مقارنتهِ بما قمتَ أنتَ بكتابتهِ.

أراك في الدرس التالي إن شاء الله.

مصطلحات الدرس :

Error List : قائمة تحتوي جميع الأخطاء الحالية في التطبيق المفتوح
Code Blocks : قطعة برمجية تبدأ بقوس وتنتهي بقوس آخر وأحياناً يكون لها إسم في أولها
Semicolon : فاصلة منقوطة
Console : شاشة سوداء تطبع أسطر ممالية وتتميز بسهولتها وقوتها
Case  Sensitive : أي أن حالة الأحرف تختلف فالكلمة go تختلف تماماً عن الكلمة Go وعن gO
IntelliSense : ميزة ذكية تقدم لك إقتراحات وتصويبات للوضع الحالي