C# .Netالبرمجةتطوير الألعابتَعلُمُ البرمجةِ للمبتدئينَ

#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 : طريقة لإضافة متغير داخل نص بدلاً من إضافة رمز الوصل +

مقالات ذات صلة

‫11 تعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى