آموزش دستورات شرطی در سی شارپ

Ratings
(1)

به کنترل اینکه کدام خط از کدها باید در ادامه اجرا شوند، انشعاب گذاری(Branching) گفته می شود. خط کدی که باید به آن پرش کنیم، توسط برخی عبارت های شرطی کنترل می شود. این عبارت شرطی، بر اساس مقایسه ای بین یک مقدار تست و یک یا چند مقدار امکان پذیر، با استفاده از منطق بولی انجام می شود. در این بخش، به شرح سه تکنیک انشعاب گذاری زیر که در سی شارپ در دسترس است می پردازیم:

  1. عملگر سه گانه(Ternary)
  2. دستور if
  3. دستور switch

عملگر سه گانه(Ternary)

ساده ترین راه برای انجام یک مقایسه، این است که از عملگر سه گانه که در فصل آخر توضیح داده شده است استفاده کنیم. شما قبلاً با عملگرهای یونری(یگانه یا unary) که بر روی یک عملوند کار می کند و با عملگرهای باینری که بر روی دو عملوند کار می کنند آشنا شده اید، بنابراین کار با عملگر سه گانه که بر روی سه عملوند کار می کند، نباید برای شما عجیب باشد. سینتکس و قواعد نوشتاری عملگر سه گانه به صورت زیر است:

test ? a : b

در کد بالا، مقدار test مورد ارزیابی قرار می گیرد و یک مقدار بولین را تولید می کند و نتیجه ی این عملگر بسته به مقدار به دست آمده، یا a خواهد بود یا b .

در مثال زیر، اگر مقدار متغیر myInteger کمتر از 10 باشد، مقدار true ایجاد می شود و بنابراین عبارت اولیه یعنی Less than 10 در متغیر resultString قرار می گیرد و در غیر این صورت، عبارت دوم در این متغیر قرار می گیرد:

string resultString = (myInteger < 10) ? "Less than 10" : "Greater than or equal to 10";

توضیحات بیشتر

نتیجه ی عملگر سه گانه ی بالا در هر دو حالت، در متغیر resultString قرار می گیرد. در این دستورات، متغیر myInteger کوچکتر از عدد 10 قرار گرفته است. اگر ارزش این عبارت شرطی true باشد، عبارت اول پس از علامت سوال در داخل متغیر resultString قرار می گیرد و اگر ارزش آن false باشد، عبارت دوم پس از علامت سوال در متغیر resultString قرار می گیرد. بعنوان مثال، اگر متغیر myInteger کمتر از 4 باشد، آنگاه متغیر resultString برابر با عبارت Less than 10 خواهد شد.


استفاده از دستور if

استفاده از دستور if بسیار مفیدتر و متنوع تر است و یک راه مفید برای تصمیم گیری است. برخلاف دستور سه گانه، دستور if نتیجه ای را برنمی گرداند(بنابراین ما نمی توانیم از آن در انتساب ها استفاده کنیم). به جای آن، می توانیم از این دستور برای اجرایِ شرطیِ دیگر دستورات استفاده کنیم.

در زیر، ساده ترین راه برای استفاده از دستور if نشان داده شده است، به طوری که condition ارزیابی می شود(این مقدار برای کامپایل شدن باید یک مقدار بولین ایجاد کند) و اگر ارزش عبارت condition برابر با true باشد، خط کدی که به دنبال آن می آید، اجرا می شود:

if (condition) 
{
  // باید اجرا شوند if بودن شرط ture کدهایی که در صورت
}

پس از اینکه این کد اجرا شد، یا اگر به خاطر false بودن مقدار  condition اجرا نشود، اجرای برنامه در خط بعدی از کدها ادامه می یابد. ما همچنین می توانیم با استفاده از دستور else در ترکیب با دستور if، کدهای اضافی را مشخص کنیم. اگر ارزش condition برابر با false شود، این دستورات درون else اجرا خواهند شد.

if (condition)
{
  // بودن شرط باید اجرا شوند true کدهایی که در صورت
} 
else 
{
  // بودن شرط باید اجرا شوند false کدهایی که در صورت
}

بعنوان یک مثال فوری، می توانیم کد زیر را که از عملگر سه گانه استفاده می کند، با استفاده از دستور if else به صورت زیر بنویسیم:

string resultString = (myInteger < 10) ? "Less than 10" : "Greater than or equal to 10";

چون که نتیجه ی دستور if نمی تواند به یک متغیر انتساب داده شود، ما باید یک مقدار را به صورت جداگانه به متغیر مورد نظر انتساب دهیم:

string resultString;
if (myInteger < 10)
  resultString = "Less than 10";
else
  resultString = "Greater than or equal to 10";

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


خودتان امتحان کنید

1. یک برنامه کنسول جدید به نام Ch04Ex02 در سی شارپ ایجاد کنید و آن را در پوشه ی C:\BeginningCSharp7\Chapter04 ذخیره کنید.

2. کد زیر را در Program.cs اضافه کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Convert;

namespace Ch04Ex02
{
    class Program
    {
        static void Main(string[] args)
        {
            string comparison;
            WriteLine("Enter a number:");
            double var1 = ToDouble(ReadLine());
            WriteLine("Enter another number:");
            double var2 = ToDouble(ReadLine());
            if (var1 < var2)
                comparison = "less than";
            else
            {
                if (var1 == var2)
                    comparison = "equal to";
                else
                    comparison = "greater than";
            }
            WriteLine($"The first number is {comparison} " + $"the second number.");
            ReadKey();
        }
    }
}

3. کدها را اجرا کنید و دو عدد را در خط فرمان وارد کنید(به تصویر 4.2 توجه کنید).

(تصویر 4.2)

(تصویر 4.2)

 


توضیحات کدها

بخش اول این کدها بسیار آشنا به نظر می رسد. و دو مقدار ورودی را از کاربر دریافت می کند:

string comparison;
WriteLine("Enter a number:");
double var1 = ToDouble(ReadLine());
WriteLine("Enter another number:");
double var2 = ToDouble(ReadLine());

سپس ما یک رشته(string) را بر اساس مقداری که برای متغیر var1 و var2 به دست می آید، در یک متغیر رشته ای به نام comparison قرار می دهیم. اول بررسی می کنیم که متغیر var1 کوچکتر از var2 است یا نه:

if (var1 < var2)
  comparison = "less than";

اگر این طور نباشد، پس var1 بزرگتر یا مساوی با var2 است. سپس در بخش مربوط به else، نیاز داریم یک مقایسه دیگر انجام دهیم:

else
 {
  if (var1 == var2)
    comparison = "equal to";

و بخش else از مقایسه ی دوم،  تنها وقتی انجام می شود که var1 بزرگتر از var2 باشد:

else
  comparison = "greater than";
}

 در نهایت، ما مقدار مقایسه را در کنسول(console) می نویسیم:

WriteLine("The first number is {0} the second number.", comparison);

 تورفتگی به کار رفته در اینجا، یک روش برای انجام این مقایسه ها است. اما شما می توانید به طور معادل، کدهای خود را به صورت زیر نیز بنویسید:

if (var1 < var2)
comparison = "less than";
if (var1 == var2)
comparison = "equal to";
if (var1 > var2)
comparison = "greater than";

 از معایب این روش این است که ما صرف نظر از مقادیر var1 و var2 این سه مقایسه را انجام می دهیم. در بخش اول، تنها بررسی می کنیم که عبارت var1 < var2 برابر با true باشد و در غیر این صورت، دو مقایسه دیگر انجام می شود(زیرا ما مقایسه ی var1 == var2 را نیز انجام داده ایم). که باعث می شود خط کدهای کمتری اجرا شوند. تفاوت کارایی در اینجا اندک است، اما در برنامه هایی که سرعت اجرا بسیار مهم است، قابل توجه خواهد بود.


بررسی شروط بیشتر در استفاده از دستور if

در مثال قبلی، ما سه شرط برای مقدار متغیر var1 مشخص کردیم. موارد مذکور، تمام مواردی بودند که برای این متغیر امکان داشت تا بررسی شوند. گاهی اوقات، ممکن است بخواهیم مقادیر خاصی را بررسی کنیم؛ بعنوان مثال اگر متغیر var1 برابر با 1، 2، 3، یا 4 باشید و همین طور الی آخر. اگر بخواهیم از کدی مانند مثال بالا استفاده کنیم، منجر به ایجاد کدهای تو در توی آزاردهنده می شود:

if (var1 == 1)
{
    // Do something.
}
else
{
    if (var1 == 2)
    {
        // Do something else.
    }
    else
    {
        if (var1 == 3 || var1 == 4)
        {
            // Do something else.
        }
        else
        {
            // Do something else.
        }
    }
}

نکته: این یک خطای متداول است که شروط به صورت if (var1 == 3 || var1 == 4) را به صورت if (var1 == 3 || 4) بنویسیم. در اینجا، با توجه به اولویت عملگرها، عملگر == در ابتدا پردازش می شود و به عملگر || امکان نمی دهد تا بر روی یک بولین و یک عملوند عددی اجرا شود که این باعث ایجاد خطا می شود.


در چنین موقعیت هایی، به صورت زیر عمل کنید:

if (var1 == 1)
{
    // Do something.
}
else if (var1 == 2)
{
    // Do something else.
}
else if (var1 == 3 || var1 == 4)
{
    // Do something else.
}
else
{
    // Do something else.
}

خوانایی این کدها، نسبت به کدهای بالاتر بیشتر است. وقتی که با موقعیت هایی مانند این مواجه می شوید، می توانید از دستور switch استفاده کنید.


استفاده از دستور switch در سی شارپ

دستور switch مشابه با دستور if است و بر اساس مقدار یک تست، به صورت مشروط، کدها را اجرا می کند. اما دستور switch به ما امکان می دهد تا چندین تست را به جای یک تست تکی، در یک دفعه انجام دهیم. این تست، به جای اینکه از شرط هایی مثل "بزرگتر از X" استفاده کند، به مقادیر مجزایی محدود می شود. اما می تواند یک تکنیک قدرتمند به حساب آید. ساختار اصلی یک دستور switch به صورت زیر است:

switch(expression) 
{
  case x:
    // قطعه کد1
    break;
  case y:
    // قطعه کد2
    break;
  default:
    // قطعه کد3
    break;
}

در کدهای بالا، مقدار expression با هریک از مقادیر x و y که در کنار آنها کلمه ی case قرار دارند مقایسه می شود. اگر یک تطابق ایجاد شود، آنگاه کدی که به این تطابق اختصاص دارد اجرا می شود. اما اگر هیچ تطابقی وجود نداشته باشد، آنگاه کد درون بخش default (اگر وجود داشته باشد) اجرا می شود. در انتهای هر بخش از این شرط ها، یک عبارت به نام break وجود دارد. اگر در جریان اجرای یک دستور switch ، پس از پردازش یک بلوکِ case، یک case دیگر را نیز پردازش کنیم، این کار غیرقانونی است.


نکته: رفتاری که در آن، جریان اجرا از یک بلوکِ case به بلوک بعدی ممنوع است، یکی از رفتارهایی است که سی شارپ را از ++C متمایز می کند. در ++C، پردازش دستورات case از یک مورد به مورد دیگر، مجاز است.


در کدهای بالا، دستور break به سادگی به هر case خاتمه می دهد و به case بعدی می رود. در کدهای سی شارپ، متدهای جایگزینی برای جلوگیری از جریان یافتن، از یک case به یک case دیگر وجود دارد. ما می توانیم به جای اینکه از ساختار دستور switch استفاده کنیم، از دستور return استفاده کنیم که باعث خاتمه یافتن تابع فعلی می شود(برای اطلاعات بیشتر در این زمینه به فصل 6 مراجعه کنید)؛ و یا اینکه می توانیم از دستور goto استفاده کنیم. دستورات goto (همان طور که قبلا توضیح داده شد) در اینجا به کار می آیند؛ زیرا دستورات case در حقیقت برچسب هایی را در کدهای  سی شارپ تعریف می کنند. به مثال زیر توجه کنید:

switch (condition)
{
  case x:
    // باشد، اجرا می شوند x برابر با condition کدهایی که اگر
    goto case y;
  case y:
    // باشد، اجرا می شوند y برابر با condition کدهایی که اگر
    break;
}

 مثال:

switch (condition)
{
  case x:
  case y:
    // باشد، اجرا می شوند y برابر با condition باشد یا x برابر با condition کدهایی که اگر
     
    break;
 ...
}

این شرط ها همچنین روی دستور default نیز اعمال می شوند. هیچ قانونی وجود ندارد که شرط کند که این دستور باید در انتهای لیست مقایسه ها قرار گیرد و اگر بخواهیم می توانیم آن را در کنار دستور case قرار دهیم. اضافه کردن یک نقطه ی شکست با دستور break یا return تضمین می کند که یک مسیر اجرای معتبر در ساختار تمام case ها وجود دارد.


مثال خودتان امتحان کنیدِ زیر، از یک دستور switch برای نوشتن رشته های(string) مختلف در کنسول، استفاده می کند؛ بسته به مقداری که ما برای یک رشته ی تستی وارد می کنیم:

1. یک اپلیکیشن کنسول جدید در ویژوال استودیو ایجاد کنید و نام آن را Ch04Ex03 بگذارید و آن را در مسیر زیر Save کنید:

C:\BeginningCSharp7\Chapter04

2. کدهای زیر را در فایل Program.cs قرار دهید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Ch04Ex03
{
    class Program
    {
        static void Main(string[] args)
        {
            const string myName = "benjamin";
            const string niceName = "andrea";
            const string sillyName = "ploppy";
            string name;
            WriteLine("What is your name?");
            name = ReadLine();
            switch (name.ToLower())
            {
                case myName:
                    WriteLine("You have the same name as me!");
                    break;
                case niceName:
                    WriteLine("My, what a nice name you have!");
                    break;
                case sillyName:
                    WriteLine("That's a very silly name.");
                    break;
            }
            WriteLine($"Hello {name}!");
            ReadKey();

        }
    }
}

 3. کدها را اجرا کنید و یک نام را وارد کنید. نتیجه در تصویر 4.3 نشان داده شده است:

(تصویر 4.3)

 


 این کدها چگونه کار می کنند؟

در کدهای بالا، سه ثابت(constant) رشته ای(string)، تعریف شده اند، که سه رشته را از کاربر دریافت می کنند و سپس متنی را بر اساس رشته ی وارد شده، در کنسول(console) می نویسد. در خط شماره 17، ما یک متغیر به نام name تعریف کرده ایم. وقتی که ما نام وارد شده در متغیر  را با مقادیر ثابت(constant) مقایسه می کنیم، ابتدا آن را با استفاده از دستور زیر، به حروف کوچک تبدیل می کنیم:

name.ToLower()

این متد، یک فرمان استاندارد است که با تمام متغیرهای رشته ای(string variables) کار می کند و وقتی هایی که مطمئن نیستیم که کاربر چه چیزی را وارد کرده است، به کار می آید. با استفاده از این روش، رشته های Benjamin و benJamin و benjamin به صورت عبارت benjamin در می آیند.

دستور switch به تنهایی تلاش می کند تا رشته ی وارد شده را با مقادیر ثابتی که ما تعریف کرده ایم، مورد تطابق قرار دهد، و در صورت موفقیت، یک پیغام به کاربر می نویسد تا به کاربر خوش آمد بگوید. اگر هیچ تطابقی حاصل نشد، تنها یک خودش آمدگویی عمومی به او نشان داده می شود.

 

کتاب آموزش سی شارپ, آموزش برنامه نویسی, آموزش سی شارپ

  • بازدید: 715

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال