آموزش کامل کار با دستور if...else در سی شارپ - if else in csharp


دات وایت | DotWhite.ir
آموزش کامل کار با دستور if...else در سی شارپ - if else in csharp

در این پست از دات وایت آموزش کامل کار با دستور شرطی if...else در سی شارپ را یاد خواهید گرفت در این پست سعی شده تا جایی که ممکن است دستور if...else را کامل توضیح بدیم.

 

if ساده ترين دستور انشعاب است. دستور if ميگويد: اگر يك شرط برقرار است، پس دستوراتي را اجرا كن، در غير اينصورت از آنها بگذر. شرط يك عبارت بولين است. اين عبارت شامل دستوراتي است كه به يك مقدار ارزيابي ميشود. يك عبارت بولين با مقدار true يا false ارزيابي ميشود. 

توصيف رسمي دستور if بصورت زير است:

if(عبارت)

دستور1

اين ساختار نوعي توصيف از دستور if است كه در مستندات كامپايلر مييابيد. آن به شما نشان ميدهد، دستور if عبارت را در داخل پرانتزها ميگيرد و اگر عبارت به مقدار true ارزيابي گردد، دستور1 اجرا ميشود. توجه كنيد كه دستور 1 ميتواند يك بلوك از دستورات در داخل {} باشد.  (همانطور كه در مثال (1) ارائه شده است.)

مثال (1)

using System;
namespace Branching
 {
 class Test
      {
      static void Main( )
{
      int valueOne = 10;
      int valueTwo = 20;
      int valueThree = 30;
      Console.WriteLine( "Testing valueOne against valueTwo..." );
      if ( valueOne > valueTwo )
 {
       Console.WriteLine( "ValueOne: {0} larger than ValueTwo: {1}",valueOne, valueTwo );
 }
      Console.WriteLine( "Testing valueThree against valueTwo..." );
      if ( valueThree > valueTwo )
 {
       Console.WriteLine( "ValueThree: {0} larger than ValueTwo: {1}",valueThree, valueTwo );
           } // end if
           } // end Main
      } // end class
 } // end namespace

نکته : در هر جايي از C#كه ميتوانيد يك دستور بنويسيد، ميتوانيد بجاي آن بلوكي از دستورات را در داخل {} بنويسيد. 

 

در اين برنامه ي ساده، سه متغير valueThree,valueTwo,valueOne به ترتيب با مقادير 10، 20 و 30 اعلان گرديد. دستور if اول تست ميكند، آيا valueOne بزرگتر از valueTwoاست:

 if (ValueOne>ValueTwo) 

  {

      Console Write Line("Value One:{0} Laser then Value Two: {1}" ValueOne , ValueTwo); 

  } 

چون (10valueOne) كوچكتر از (20valueTwo) است، دستور if شكست ميخورد (مقدار false بر ميگرداند) و بدنه ي دستور if را اجرا نميكند. سپس تست ميكند آيا valueThree بزرگتر از valueTwo است: 

if (ValueThree>ValueTwo) 

  { 

     Console. Write Line("Value Three:{0}longer than Value Two:{1}", Value Three , Value Two); 

  } 

چون (30valueThree) بزرگتر از (20valueTwo) است، عبارت بولين مقدار trueبر ميگرداند، سپس دستور را اجرا ميكند. دستور در اين مثال بلوكي است كه متد WriteLine فراخواني ميشود. خروجي منعكس ميكند كه if اول شكست ميخورد، ولي ifدوم موفق است. 

Testing Value One against Value Two…. 

Testing Value Three against Value Two…

 Value Three : 30 larger than Value Two : 20

بلوك هاي تك دستوري if :

 

توجه كنيد كه بلوك دستورهاي if نشان داده شده در مثال (1) هر كدام فقط يك دستور واحد در بردارند (يك فراخواني از ()WriteLine). در چنين مواردي ميتوانيد آكولادهاي باز و بسته بلوك if را ننويسيد. پس ممكن است مثال (1) را بصورتي كه در مثال (2) نشان داده شده، رونويسي كنيد.

 مثال (2)

using System; 

namespace Branching

 { 

      class Test

        { 

         static void Main( ) 

 {

     int valueOne = 10;

     int valueTwo = 20;

     int valueThree = 30;

     Console.WriteLine( "Testing valueOne against valueTwo..." ); 

     if ( valueOne > valueTwo )

       Console.WriteLine( "ValueOne: {0} larger than ValueTwo: {1}", valueOne, valueTwo );

    Console.WriteLine( "Testing valueThree against valueTwo..." );

    if ( valueThree > valueTwo )

      Console.WriteLine( "ValueThree: {0} larger than ValueTwo: {1}", valueThree, valueTwo );

           } // end Main 

       } // end class

   } // end namespace

حتي در صورتي كه فقط يك دستور در بلوك if باشد، استفاده از آكولادها ايده خوبي است. دو دليل وجود دارد:

 اول اينكه، خواندن و فهم كدها بوسيله آكولادها راحتتر است. كدي كه خواندن آن راحتتر باشد نگهداري آن نيز راحت تر است. 

نکته : منظور از نگهداري كد تغييراتي است كه با تغيير نيازها يا رفع عيوب بر روي دستورات داده مي شود.

 دليل دوم استفاده از آكولادها، دوري از يك خطاي معمول است. وقتي دستور ديگري به if اضافه ميشود، اضافه كردن آكولادها فراموش ميشود. كد نشان داده شده در مثال (3) را ملاحظه كنيد. برنامهنويس مقدار valueThreeرا به 3 تغيير داده است و يك دستور دوم به بلوك if اضافه كرده است. 

مثال (3)

using System;

namespace Branching

{

    class Test

    {

        static void Main()

        {

            int valueOne = 10;

            int valueTwo = 20;

            int valueThree = 10;

            Console.WriteLine("Testing valueOne against valueTwo...");

            if (valueOne > valueTwo)

                Console.WriteLine("ValueOne: {0} larger than ValueTwo: {1}",

                valueOne, valueTwo);

            Console.WriteLine("Testing valueThree against valueTwo...");

            if (valueThree > valueTwo)

                Console.WriteLine("ValueThree: {0} larger than ValueTwo: {1}",

                valueThree, valueTwo);

            Console.WriteLine("Good thing you tested again!");

        } // end Main

    } // end class

 

} // end namespace

 

حال قبل از خواندن هر چيزي، كد را مرور كرده و خودتان تصميم بگيريد كه خروجي چه چيزي بايد باشد. با نگاهكردن به پاراگراف قبلي گول نخوريد. پس با اينكه فكر ميكنيد كه ميدانيد خروجي چه چيزي خواهد شد، به موارد زير نگاهي بياندازيد. 

Testing Value One against Value Two

 Testing Value Three against Value Two

 Good thing you tested again 

آيا متعجب شديد ؟

 

 برنامه نويس به دليل فقدان آكولادها و فرورفتگي فريب ميخورد. بخاطر داريد كه فرورفتگي يك فضاي خالي است و بوسيله كامپايلر ناديده گرفته ميشود. از نگاه برنامهنويس دستور دوم ( "... thing Good ") بخشي از بلوك if است

       if (valueThree > valueTwo)

            Console.WriteLine("ValueThree: {0} larger than ValueTwo: {1}",valueThree, valueTwo);

       Console.WriteLine("Good thing you tested again!");

كامپايلر فقط اولين دستور بعد از if را به عنوان بدنهي آن اجرا ميكند. دستور دوم بخشي از دستور if نيست. از نظر كامپايلر دستور ifشبيه زير است .

  if (valueThree > valueTwo)

             Console.WriteLine("ValueThree: { 0} larger than ValueTwo: { 1}", valueThree,valueTwo);

        Console.WriteLine("Good thing you tested again!");

اگر ميخواهيد دستور دوم بخشي از if باشد، بايستي همانطور كه در زير ميبينيد، آكولادها را بكار بريد.

  if (valueThree > valueTwo)

      {

           Console.WriteLine("ValueThree: {0} larger than ValueTwo: {1}",valueThree, valueTwo);

           Console.WriteLine("Good thing you tested again!");

       }

بيشتر برنامهنويسان C #به دليل جلوگيري از سردرگمي، در همه دستورات if آكولادها را بكار ميبرند، حتي اگر بدنه if فقط يك خط باشد. 

 

سبك هاي آكولادها

 

 چندين روش براي شكلدادن آكولادها در دستور ifوجود دارد، اما بيشتر برنامه نويسان يكي از سه سبك را بكار خواهند برد. 

اول

if (condition)

{

// statement

}

سبك دوم

if (condition)

{

// statement

}

سبك سوم

if (condition){

// statement

}

سه سبك مختلف

 

 سبك اول كه در اين كتاب استفاده ميشود، آكولادها را در زير كلمه كليدي ifقرار ميدهد و محتواي بلوك if را تو رفته ميكند. سبك دوم كمتر استفاده ميشود. آكولادها را به همراه محتواي آنها تو رفته ميكند. سبك سوم آكولاد باز را در همان خط دستور ifو آكولاد بسته را در زير دستور ifقرار ميدهد. سبك سوم به سبك R&K معروف است.( اختصار كلمات Ritchie ,Kernighan (كه نويسندگان اولين كتاب زبان برنامهنويسي C هستند. كتاب آنها بسيار بانفوذ بود كه بيشتر برنامه نويسان يك تعهد قوي به اين سبك آكولادها احساس ميكنند. چون سبك R&Kكمتر واضح است، اين كتاب اولين سبك را بكار خواهد برد. 

 

 

ارزیابی کوتاه

 

قطعه كد زير را ملاحظه كنيد:

int x=8;

 int y= 15;

 if ( ( x==8) // ( y==12) ) 

در اينجا دستور if كمي پيچيده است. كل دستور if پرانتزگذاري شده است، پس بايد پارانتزهاي بيروني به true ارزيابي شوند تا اينكه دستور if به true ارزيابي شود. در داخل پارانتزهاي بيروني دو عبارت وجود دارد: (==8x (و (==12y (كه بوسيله يك عملگر or (||) مجزا ميشوند. چون x مساوي 8 است، عبارت اول (==8x (به true ارزيابي ميشود و لازم نيست عبارت دوم(==12y (ارزيابي گردد و اينكه آيا y مساوي 12 است، مهم نيست و كل عبارت به true ارزيابي ميشود. بطور مشابه اين قطعه كد را ملاحظه كنيد:

  int x=8; 

int y=12; 

 if ( ( x==5) & & (y==12) )

باز نيازي نيست عبارت دوم ارزيابي شود، چون عبارت اول false است، عمل and به false ارزيابي خواهد شد. در چنين مواردي كامپايلر C #ارزيابي كوتاه انجام خواهد داد. تست دوم هرگز انجام نخواهد شد. اين ويژگي به شما اجازه ميدهد، آن را قبل از انجام هر كاري روي مقدار تست كنيد كه از احتمال يك استثناء دوري ميكند. اين يك مثال كوتاه است. 

   public bool QuotientOverTwenty(float dividend, float divisor)

        {

            if (divisor != 0 && dividend / divisor > 20)

            {

                return true;

            }

            return false;

        }

در اين كد فقط ميخواهيم تصميم بگيريم آيا باقيمانده بزرگتر از 20 است. اما براي دوري از استثناء تقسيم بر صفر بايستي مطمئن شويم كه مقسوم عليه صفر نباشد. با ارزيابي كوتاه در صورتي كه بخش اول if به false ارزيابي شود، هرگز بخش دوم اجرا نخواهد شد. دوماً اينكه مختصر بوده و فهم آن سادهتر از نوشتن آن است.

 public bool QuotientOverTwenty(float dividend, float divisor)

        {

            bool retVal = false;

            if (divisor != 0)

            {

                if (dividend / divisor > 20)

                    retVal = true;

            }

            return retVal;

        }

دستورات if.. else 

اغلب ميخواهيد با توجه به اينكه نتيجه يك شرط true است، يك مجموعه از دستورات اجرا شود، در غير اينصورت مجموعه ديگري اجرا گردد. اين عمل يك منطق همانند اين را مجاز ميدارد:" اگر سن شما بيشتر از 25 باشد، ممكن است يك ماشين كرايه كرده باشيد، در غير اين صورت بايستي از قطار استفاده كنيد".

 بخش مربوط به " در غير اينصورت" منطق بالا، در دستور else اجرا ميشود. براي مثال، ميتوانيد مثال 3-2 را تغيير دهيد تا با اينكه آيا valueOne بزرگتر از valueTwo است يا نه؟ پيام مناسبي چاپ كند. همانطور كه در مثال 3-5 ميبينيد. 

مثال (4)

using System;

namespace Branching

{

    class Test

    {

        static void Main()

        {

            int valueOne = 10;

            int valueTwo = 20;

            Console.WriteLine("Testing valueOne against valueTwo...");

            if (valueOne > valueTwo)

            {

                Console.WriteLine("ValueOne: {0} larger than ValueTwo: {1}",

                valueOne, valueTwo);

            } // end if

            else

            {

                Console.WriteLine("Nope, ValueOne: {0} is NOT larger than ValueTwo:{ 1}", valueOne, valueTwo );

            } // end else

        } // end Main

    } // end class

} // end namespace

خروجي بصورت زير است :

Testing valueOne against valueTwo... 

 Nope, ValueOne: 10 is NOT larger than ValueTwo: 20 

چون عمل تست در دستور if شكست ميخورد، بدنه دستور if رد شده و بدنه دستور else اجرا ميشود و در صورتي كه تست موفق آميز باشد، بدنه دستور if اجرا ميشود و بدنه دستور else رد خواهد شد. 

 

دستورات if تو در تو 

براي ادارهكردن شرطهاي پيچيده، تودرتو كردن دستورهاي if امكانپذير است. براي مثال، فرض كنيد يك برنامهاي نياز داريد كه دما را ارزيابي كرده و اطلاعات زير را برگرداند: 

   - اگر دما كمتر از 32 درجه باشد، بايد يخ زدگي جاده را هشدار دهد.

   - اگر دما دقيقا مساوي 32 درجه باشد، بايد به شما درباره احتمال يخزدگي گزارش دهد. 

   - اگر دما بزرگتر از 32 درجه باشد، بايد اطمينان دهد كه يخزدگي اصلا وجود ندارد.

 راه هاي مناسب زيادي براي نوشتن اين برنامه وجود دارد. مثال (5) يكي از اين روشها را با استفاده از دستور if تودرتو ارائه ميكند. 

 

مثال (5)

using System;

class Values

{

    static void Main()

    {

        int temp = 32;

        if (temp <= 32)

        {

            Console.WriteLine("Warning! Ice on road!");

            if (temp == 32)

            {

                Console.WriteLine("Temp exactly freezing, beware of water.");

            }

            else

            {

                Console.WriteLine("Watch for black ice! Temp: {0}", temp);

            }

        }

 

    }

 

}

منطق مثال(5) بدين صورت است: ابتدا تست ميكند آيا دما كمتر يا مساوي 32 است. اگر باشد، يك هشدار چاپ ميكند:

if ( temp<=32)

 Console. Write line ( " warning Ice on road "); 

سپس برنامه بررسي ميكند، آيا دما مساوي 32 درجه است، اگر باشد يك پيام چاپ ميكند و اگر نباشد، بايد دما كمتر از 32 بوده و برنامه پيام بعدي را چاپ ميكند.

توجه كنيد كه دستور if دوم درون دستور if اول است. پس منطق else بدين صورت است: " چون آن انجام نشده پس دما كمتر يا مساوي 32 است و چون مساوي 32 نيست، پس بايد كمتر از 32 باشد".

 روش ديگر، زنجيركردن بيش از يك دستور if بوسيله عبارت if else است، كه بعضي از برنامهنويسان #C بكار ميبرند. برنامه شرط دستور ifاول را تست ميكند. اگر false باشد، كنترل برنامه به else عبور ميكند، كه با دستور if ديگري دنبال ميشود كه شرط متفاوتي را تست ميكند. براي مثال، ميتوانيد مثال(5) را رونويسي كنيد تا با سه تست مشخص كند، آيا دما از درجه يخبندان بزرگتر، كوچكتر يا مساوي است. همانطور كه در مثال 3-7 نشان داده ميشود. 

 

using System;

class Values

{

    static void Main()

    {

        int temp = 32;

        if (temp < 32)

        {

            Console.WriteLine("Warning! Ice on road!");

        }

        else if (temp == 32)

        {

            Console.WriteLine("Temp exactly freezing, beware of water.");

        }

        else

        {

            Console.WriteLine("Watch for black ice! Temp: {0}", temp);

        }

    }

}

اين مثال ابتدا شرط ifاول را تست ميكند، آيا دما كوچكتر از 32 است؟ چون دما دقيقاً 32 است. عبارت اول false است و كنترل به دستور if else عبور ميكند. دستور if دومtrue است، پس دستور سوم ( دستورelse (هرگز اجرا نميگردد. لطفاً توجه كنيد كه اين كد معادل كد زير است:

 using System;

class Values

{

    static void Main()

    {

        int temp = 32;

        if (temp < 32)

        {

            Console.WriteLine("Warning! Ice on road!");

        }

        else

        {

            if (temp == 32)

            {

                Console.WriteLine("Temp exactly freezing, beware of water.");

            }

            else

            {

                Console.WriteLine("Watch for black ice! Temp: {0}", temp);

            }

        }

    }

}

در هر حالت، اگر از عبارت if else استفاده ميكنيد، مطمئن شويد كه دستور تست نهايي به جاي if else از else استفاده كرده باشد تا اگر هيچ كدام از شرطها برقرار نبود، اين دستور اجرا گردد. 



تاریخ انتشار : یکشنبه 05 دي 1395 ساعت: 14:5 | نظرات()
برچسب ها : , , , , , ,

نویسنده :

بازديد : 473

موضوع: سی شارپ , کد های مفید ,

بخش نظرات این مطلب
نام
ایمیل (منتشر نمی‌شود) (لازم)
وبسایت
:) :( ;) :D ;)) :X :? :P :* =(( :O @};- :B /:) :S
نظر خصوصی
مشخصات شما ذخیره شود ؟ [حذف مشخصات] [شکلک ها]
کد امنیتیرفرش کد امنیتی