درس سوم – دستورالعمل‌های کنترلی و شرطی

 درس سوم – دستورالعمل‌های کنترلی و شرطی

 

در این درس با دستورالعمل‌های کنترل و انتخاب در C# آشنا می‌شوید. هدف این درس عبارتست از :

  • یادگیری دستور if
  • یادگیری دستور switch
  • نحوه بکارگیری دستور break در دستور switch
  • درک صحیح از نحوه بکارگیری دستور goto

 

بررسی دستور if و انواع مختلف آن

در درسهای گذشته، برنامه‌هایی که مشاهده می‌کردید از چندین خط دستور تشکیل شده بودند که یکی پس از دیگری اجرا می‌شدند و سپس برنامه خاتمه می‌یافت. در این برنامه‌ها هیچ عمل تصمیم‌گیری صورت نمی‌گرفت و تنها دستورات برنامه به ترتیب اجرا می‌شدند. مطالب این درس نحوه تصمیم‌گیری در یک برنامه را به شما نشان می‌دهد.

 

اولین دستور تصمیم‌گیری که ما آنرا بررسی می‌نماییم، دستورالعمل if است. این دستور دارای سه فرم کلی : تصمیم‌گیری ساده، تصمیم‌گیری دوگانه، تصمیم‌گیری چندگانه می‌باشد.

 

مثال 1-3 – فرم‌های دستورالعمل if

using System;

 

class IfSelect

{

  public static void Main()

   {

    string myInput;

    int myInt;

    Console.Write("Please enter a number: ");

    myInput = Console.ReadLine();

    myInt = Int32.Parse(myInput);

    //تصمیم‌گیری ساده و اجرای عمل داخل دو کروشه

    if (myInt > 0)

     {

      Console.WriteLine("Your number {0} is greater than zero.", myInt);

     }

    //تصمیم‌گیری ساده و اجرای عمل بدون استفاده از دو کروشه

    if (myInt < 0)

      Console.WriteLine("Your number {0} is less than zero.", myInt);

    // تصمیم‌گیری دوگانه

    if (myInt != 0)

     {

      Console.WriteLine("Your number {0} is not equal to zero.", myInt);

     }

    else

     {

      Console.WriteLine("Your number {0} is equal to zero.", myInt);

     }

    // تصمیم‌گیری چندگانه

    if (myInt < 0 || myInt == 0)

     {

      Console.WriteLine("Your number {0} is less than or equal to zero.",  myInt);

     }

    else if (myInt > 0 && myInt <= 10)

    {

     Console.WriteLine("Your number {0} is between 1 and 10.", myInt);

    }

    else if (myInt > 10 && myInt <= 20)

    {

     Console.WriteLine("Your number {0} is between 11 and 20.", myInt);

    }

    else if (myInt > 20 && myInt <= 30)

    {

     Console.WriteLine("Your number {0} is between 21 and 30.", myInt);

    }

   else

   { 

    Console.WriteLine("Your number {0} is greater than 30.", myInt);

   }

  } //Main()پایان متد

} //IfSelectپایان کلاس 

 

برنامه 1-3 از یک متغیر myInt برای دریافت ورودی از کاربر استفاده می‌نماید، سپس با استفاده از یک سری دستورات کنترلی، که همان دستور if در اینجاست، عملیات خاصی را بسته به نوع ورودی انجام می‌دهد. در ابتدای این برنامه عبارت Please enter a umber: در خروجی چاپ می‌شود. دستور Console.ReadLine() منتظر می‌ماند تا کاربر ورودی وارد کرده و سپس کلید Enter را فشار دهد. همانطور که در قبل نیز اشاره کرده‌ایم، دستور Console.ReadLine() عبارت ورودی را به فرم رشته دریافت می‌نماید پس مقدار ورودی کاربر در اینجا که یک عدد است به فرم رشته‌ای در متغیر myInput که از نوع رشته‌ای تعریف شده است قرار می‌گیرد. اما میدانیم که برای اجرای محاسبات و یا تصمیم‌گیری بر روی اعداد نمی‌توان از آنها در فرم رشته‌ای استفاده کرد و باید آنها را بصورت عددی مورد استفاده قرار داد. به همین منظور باید متغیر myInput را به نحوی به مقدار عددی تبدیل نماییم. برای این منظور از عبارت Int32.Parse() استفاده می‌نماییم. این دستور مقدار رشته‌ای متغیر داخل پرانتزش را به مقدار عددی تبدیل کرده و آنرا به متغیر دیگری از نوع عددی تخصیص می‌دهد. در این مثال نیز همانطور که دیده می‌شود، myInput که تز نوع رشته‌ای است در داخل پرانتز قرار گرفته و این مقدار برابر با myInt که از نوع int است قرار گرفته است. با این کار مقدار عددی رشته ورودی کاربر به متغیر myInt تخصیص داده می‌شود. (توضیح کامل‌تری در مورد Int32 و سایر تبدیلات مشابه به‌ آن در درسهای آینده و در قسمت نوع‌های پیشرفته مورد بررسی قرار می‌گیرند.)حال ما متغیری از نوع مورد نظر در دست داریم و می‌توانیم با استفاده از دستور if بر روی آن پردازش انجام داده و تصمیم‌گیری نماییم.

 

دستور if

اولین دستور بصورت if (boolean expression) {statements} آورده شده است. دستور if با استفاده از کلمه کلیدی if آغاز می‌شود. سپس یک عبارت منطقی درون یک زوج پرانتز قرار می‌گیرد . پس از بررسی این عبارات منطقی دستورالعمل/دستورالعمل‌های داخل کروشه اجرا می‌شوند. همانطور که مشاهده می‌نمایید، دستور if یک عبارت منطقی را بررسی می‌کند. در صورتیکه مقدار این عبارات true باشد دستورهای داخل بلوک خود را اجرا می‌نماید(قبلا توضیح داده شد که دستورهایی که داخل یک زوج کروشه {} قرار می‌گیرند در اصطلاح یک بلوک نامیده می‌شوند.) و در صورتیکه مقدار آن برابر با false باشد اجرای برنامه به بعد از بلوک if منتقل می‌شود. در این مثال همانطور که ملاحظه می‌نمایید، عبارت منطقی دستور if بشکل if(myInt > 0) است. در صورتیکه مقدار myInt بزرگتر از عدد صفر باشد، دستور داخل بلوک if اجرا می‌شود و در غیر اینصورت اجرای برنامه به بعد از بلوک if منتقل می‌گردد.

 

دومین دستور if دراین برنامه بسیار شبیه به دستور اول است، با این تفاوت که در این دستور، دستور اجرایی if درون یک بلوک قرار نگرفته است. در صورتیکه بخواهیم با استفاده از دستور if تنها یک دستورالعمل اجرا شود، نیازی به استفاده از بلوک برای آن دستورالعمل نمی‌باشد. استفاده از بلوک تنها زمانی ضروری است که بخواهیم از چندین دستور استفاده نماییم.

 

دستور if-else

در بیشتر موارد از تصمیم‌گیری‌های دوگانه یا چندگانه استفاده می‌شود. در این نوع تصمیم‌گیری‌ها، دو یا چند شرط مختلف بررسی می‌شوند و در صورت true بودن یکی از آنها عمل مربوط به آن اجرا می‌گردد. سومین دستور if در این برنامه نشان دهنده یک تصمیم‌گیری دوگانه است. در این حالت درصورتیکه عبارت منطقی دستور if برابر با true باشد دستور بعد از if اجرا می‌شود و در غیر اینصورت دستور بعد از else به اجرا در می‌آید. در حقیقت در این حالت می‌گوئیم " اگر شرط if صحیح است دستورات مربوط به if را انجام بده و درغیر اینصورت دستورات else را اجرا کن".

فرم کلی دستور if-else بصورت زیر است :

if (boolean expression)

   {statements}

else

   {statements}

که در آن boolean expression عبارت منطقی است که صحت آن مورد بررسی قرار می‌گیرد و statements دستور یا دستوراتی است که اجرا می‌گردند.

 

دستور if-else if … else یا if تودرتو

در صورتیکه نیاز باشد تا چندین حالت منطقی مورد بررسی قرار گیرد و دستورات مربوط به یکی از آنها اجرا شود، از فرم تصمیم‌گیری چندگانه استفاده می‌نماییم. این نوع استفاده از دستور if در اصطلاح به if تودرتو (Nested If) معروف است چراکه در آن از چندین دستور if مرتبط به یکدیگر استفاده شده است. چهارمین دستور if در مثال 1-3 استفاده از if تودرتو  را نشان می‌دهد. در این حالت نیز دستور با کلمه کلیدی if آغاز می‌گردد. شرطی بررسی شده و در صورت true بودن دستورات مربوط به آن اجرا می‌گردد. اما اگر مقدار این عبارت منطقی false بود آنگاه شرطهای فرعی دیگری بررسی می‌شوند.این شرطهای فرعی با استفاده از else if مورد بررسی قرار می‌گیرند. هر یک از این شرطها دارای عبارات منطقی مربوط به خود هستند که در صورت true بودن عبارت منطقی دستورات مربوط به آنها اجرا می‌گردد و در غیر اینصورت شرط بعدی مورد بررسی قرار می‌گیرد. باید توجه کنید که در ساختار if تودرتو تنها یکی از حالتها اتفاق می‌افتد و تنها یکی از شرطها مقدار true را بازمی‌گرداند.

فرم کلی if تودرتو بشکل زیر است :

if (boolean expression)

   {statements}

else if (boolean expression)

   {statements}

else

   {statements}

عملگرهای OR و AND  (|| و &&)

نکته دیگری که باید در اینجا بدان اشاره کرد، نوع شرطی است که در عبارت منطقی دستور if آخر مورد استفاده قرار گرفته است. در این عبارت منطقی از عملگر || استفاده شده است که بیانگر OR منطقی است. عملگر OR زمانی مقدار true بازمی‌گرداند که حداقل یکی از عملوندهای آن دارای مقدار true باشد. بعنوان مثال در عبارت (myInt < 0 || myInt == 0)، در صورتیکه مقدار متغیر myInt کوچکتر یا مساوی با صفر باشد، مقدار عبارت برابر با true است. نکته قابل توجه آنست که در زبان ‍C#، همانطور که در درس دوم به آن اشاره شد، دو نوع عملگر OR وجود دارد. یکی OR منطقی که با || نمایش داده می‌شود و دیگری OR معمولی که با | نشان داده می‌شود. تفاوت بین این دو نوع OR در آنست که OR معمولی هر دو عملگر خود را بررسی می‌نماید اما OR منطقی تنها در صورتیکه عملگر اول آن مقدار false داشته باشد به بررسی عملگر دوم خود می‌پردازد.

 

عبارت منطقی (myInt > 0 && myInt <= 10) حاوی عملگر AND شرطی (&&) می‌باشد. این عبارت در صورتی مقدار true بازمی‌گرداند که هر دو عملوند AND دارای مقدار true باشند. یعنی در صورتیکه myInt هم بزرگتر از صفر باشد و هم کوچگتر از 10، مقدار عبارت برابر با true می‌گردد. در مورد AND نیز همانند OR دو نوع عملگر وجود دارد. یکی AND معمولی (&) و دیگری AND شرطی (&&). تفاوت این دو نیز در آنست که AND معمولی (&) همیشه هر دو عملوند خود را بررسی می‌نماید ولی AND شرطی (&&) تنها هنگامی به بررسی عملوند دوم خود می‌پردازد که مقدار اولین عملوندش برابر با true باشد. عملگرهای منطقی  (|| و &&) را در اصطلاح عملگرهای میانبر (short-circuit) می‌نامند چراکه تنها در صورت لزوم عملوند دوم خود را بررسی می‌نمایند و از اینرو سریعتر اجرا می‌شوند.

 

بررسی دستور switch

همانند دستور if، دستور switch نیز امکان تصمیم‌گیری را در یک برنامه فراهم می‌نماید.

مثال 2-3 – دستورالعمل switch

using System;

 

class SwitchSelect

 {

   public static void Main()

   {

    string myInput;

    int myInt;

    begin:

    Console.Write("Please enter a number between 1 and 3: ");

    myInput = Console.ReadLine();

    myInt = Int32.Parse(myInput);

    // بهمراه متغیری از نوع صحیح switch دستور

    switch (myInt)

    {

     case 1:

        Console.WriteLine("Your number is {0}.", myInt);

        break;

     case 2:

        Console.WriteLine("Your number is {0}.", myInt);

        break;

     case 3:

        Console.WriteLine("Your number is {0}.", myInt);

        break;

     default:

        Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);

        break;

    } //switchپایان بلوک

   decide:

   Console.Write("Type "continue" to go on or "quit" to stop: ");

   myInput = Console.ReadLine();

   // بهمراه متغیری از نوع رشته‌ای switch دستور

   switch (myInput)

   {

    case "continue":

       goto begin;

    case "quit":

       Console.WriteLine("Bye.");

       break;

    default:

       Console.WriteLine("Your input {0} is incorrect.", myInput);

       goto decide;

   } //switchپایان بلوک

  } //Main()پایان متد

} //SwitchSelectپایان کلاس

 

مثال 2-3 دو مورد استفاده از دستور switch را نشان می‌دهد. دستور switch بوسیله کلمه کلیدی switch آغاز شده و به دنبال آن عبارت دستور switch قرار می‌گیرد. عبارت دستور switch می‌تواند یکی از انواع زیر باشد : sbyte, byte, short, ushort, int, uint, long, ulong, char, string, enum .(نوع enum در مبحث جداگانه‌ای مورد بررسی قرار خواهد گرفت.) در اولین دستور switch در مثال 2-3، عبارت دستور switch از نوع عددی صحیح (int) می‌باشد.

 

به دنبال دستور و عبارت switch، بلوک switch قرار می‌گیرد که در آن گزینه‌هایی قرار دارند که جهت منطبق بودن با مقدار عبارت switch مورد بررسی قرار می‌گیرند. هر یک از این گزینه‌ها با استفاده از کلمه کلیدی case مشخص می‌شوند. پس از کلمه کلیدی case خود گزینه قرار می‌گیرد و به دنبال آن ":" و سپس دستوری که باید اجرا شود. بعنوان مثال به اولین دستور switch در این برنامه توجه نمایید. در اینجا عبارت دستور switch از نوع int است. هدف از استفاده از دستور switch آنست که از بین گزینه‌های موجود در بلوک switch، گزینه‌ای را که مقدارش با مقدار عبارت switch برابر است پیدا شده و عمل مرتبط با آن گزینه اجرا شود. در این مثال مقدار متغیر myInt بررسی می‌شود. سپس اگر این مقدار با یکی از مقادیر گزینه‌های داخل بلوک switch برابر بود، دستور یا عمل مربوط به آن گزینه اجرا می‌گردد. توجه نمایید که در این مثال منظور ما از گزینه همان عدد پس از case است و منظور از دستور عبارتی است که پس از ":" قرار گرفته است. بعنوان مثال، در دستور زیر :

 

case 1:

     Console.WriteLine("Your number is {0}.", myInt);

عدد 1، گزینه مورد نظر ما و دستور Console.WriteLine(…)، عمل مورد نظر است. در صورتیکه مقدار myInt برابر با عدد 1 باشد آنگاه دستور مربوط به case 1 اجرا می‌شود که همان Console.WriteLine("Your number is {0}.", myInt); است. پس از منطبق شدن مقدار عبارت switch با یکی از case ها، بلوک switch باید خاتمه یابد که این عمل بوسیله استفاده از کلمه کلیدی break، اجرای برنامه را به اولین خط بعد از بلوک switch منتقل می‌نماید.

 

همانطور که در ساختار دستور switch مشاهده می‌نمایید، علاوه بر case و break، دستور دیگری نیز در داخل بلوک وجود دارد. این دستور یعنی default، برای زمانی مورد استفاده قرار می‌گیرد که هیچ یک از گزینه‌های بلوک switch با عبارت دستور switch منطبق نباشند. به عبارت دیگر درصورتیکه مقدار عبارت switch با هیچ یک از گزینه‌های case برابر نباشد، دستور مربوط به default اجرا می‌گردد. استفاده از این دستور در ساختار بلوک switch اختیاری است. همچنین قرار دادن دستور break پس از دستور default نیز اختیاری می‌باشد.

 

همانطور که قبلاً نیز گفته شد پس از هر دستور case، به منظور خاتمه دادن اجرای بلوک switch باید از یک break استفاده نمود. دو استثنا برای این موضوع وجود دارد. اول اینکه دو دستور case بدون وجود کد و دستورالعملی در بین آنها، پشت سر هم قرار گیرند و دیگری در زمانیکه از دستور goto استفاده شده باشد.

 

در صورتیکه دو دستور case بدون وجود کدی در بین آنها، پشت سر یکدیگر قرار گیرند، بدین معناست که برای هر دو case مورد نظر یک عمل خاص در نظر گرفته شده است. به مثال زیر توجه نمایید.

switch (myInt)

 {

   case 1:

   case 2:

   case 3:

      Console.WriteLine("Your number is {0}.", myInt);

      break;

   default:

     Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);

     break;

 }

در این مثال، همانطور که مشاهده می‌کنید، سه دستور case بدون وجود کدی در بین آنها پشت سر یکدیگر قرار گرفته‌اند. این عمل بدین معناست که برای تمامی گزینه‌های 1، 2 و 3 دستور  ;(Console.WriteLine("Your number is {0}.", myInt اجرا خواهد شد. یعنی اگر مقدار myInt برابر با هر یک از مقادیر 1، 2 و 3 باشد، یک دستور برای آن اجرا می‌شود.

 

نکته قابل توجه دیگر در مورد بلوک switch آنست که، دستورات case حتماً نباید یک دستور باشد بلکه می‌توان از یک بلوک دستور برای case استفاده نمود.

 

دومین استفاده از دستور switch در مثال 2-3، دارای عبارتی از نوع رشته‌ایست. در این بلوک switch چگونگی استفاده از دستور goto نیز نشان داده شده است. دستور goto اجرای برنامه را به برچسبی (label) که معین شده هدایت می‌نماید. در حین اجرای این برنامه، اگر کاربر رشته continue وارد نماید، این رشته با یکی از گزینه‌های دومین switch منطبق می‌شود. چون دستور case مربوط به این گزینه دارای دستور goto است، اجرای برنامه به برچسبی که این دستور مشخص کرده فرستاده می‌شود، بدین معنی که اجرای برنامه به ابتدای جایی می‌رود که عبارت begin: در آنجا قرار دارد (در اوایل متد Main()). بدین صورت اجرای برنامه از بلوک switch خارج شده و به ابتدای برنامه و در جائیکه برچسب begin: قرار گرفته ارسال می‌شود. در این برنامه، استفاده از چنین حالتی استفاده از goto باعث ایجاد یک حلقه شده است که با وارد کردن عبارت quit اجرای آن به پایان می‌رسد.

 

در صورتیکه هیچ یک از عبارات continue و یا quit وارد نشوند، اجرای switch به گزینه default می‌رود و در این گزینه ابتدا پیغام خطایی بر کنسول چاپ شده و سپس با استفاده از دستور goto پرشی به برچسب decide صورت می‌گیرد. پس از پرش به برچسب decide، از کاربر پرسیده می‌شود که آیا می‌خواهد اجرای برنامه را ادامه دهد یا خیر.( با وارد کردن گزینه‌های continue یا quit) همانطور که می‌بینید در اینجا نیز حلقه‌ای تولید شده است.

 

استفاده از دستور goto در بلوک switch می‌تواند موثر باشد اما باید توجه نمایید که استفاده‌های بی مورد از دستور goto باعث ناخوانا شدن برنامه شده و عیب‌یابی (Debug) برنامه را بسیار دشوار می‌نماید. در برنامه‌نویسی‌های امروزی استفاده از دستور goto بغیر از موارد بسیار لازم و ضروری منسوخ شده و به هیچ عنوان توصیه نمی‌شود. برای تولید و ساخت حلقه نیز دستورات مفید و سودمندی در زبان تعبیه شده‌اند که استفاده از goto را به حداقل می‌رسانند. دستورات حلقه در مبحث آینده مورد بررسی قرار خواهند گرفت.

 

نکته پایانی این مبحث آنست که توجه نمایید که به جای استفاده از دستور switch می‌توانید از چندین دستور if-else استفاده نماید. دو قطعه برنامه زیر معادل یکدیگر می‌باشند.

switch(myChar)

  {

    case 'A' :

          Console.WriteLine("Add operation ");

          break;

    case 'M' :

          Console.WriteLine("Multiple operation ");

          break;

    case 'S' :

          Console.WriteLine("Subtraction operation ");

          break;

    default :

          Console.WriteLine("Error, Unknown operation ");

          break;

  }

معادل بلوک switch با استفاده از if-else

if (myChar == 'A')

   Console.WriteLine("Add operation ");

else if (myChar == 'M')

   Console.WriteLine("Multiple operation ");

else if (myChar == 'S')

   Console.WriteLine("Subtraction operation ");

else

   Console.WriteLine("Error, Unknown operation ");

 

همانطور که ملاحظه می‌کنید استفاده از بلوک دستور switch بسیار ساده‌تر از استفاده از if-else های تودرتو است.

 

در این درس با نحوه تصمیم‌گیری در برنامه بوسیله دستور if و switch آشنا شدید. با نحوه عملکرد و استفاده دستور goto نیز آشنایی پیدا کردید. در پایان مجدداً یادآوری می‌کنم که در استفاده از دستور goto با احتیاط عمل نمایید و به جز در موارد ضروری از آن استفاده نکنید.

ادامه درس دوم

 ادامه درس دوم

آرایه‌ها(Arrays)

 

یکی دیگر از انواع داده‌ای در زبان C#، آرایه‌ها (Arrays) می‌باشند. یک آرایه را به عنوان مخزنی برای نگهداری اطلاعات در نظر می‌گیریم که دارای لیستی از محلهایی است که در آنها اطلاعات ذخیره شده است و از طریق این لیست می‌توان به اطلاعات آنها دسترسی پیدا نمود. به هنگام اعلان آرایه‌ها باید نوع، اندازه و تعداد بعد آنها را نیز معین نمود.

 

مثال 4- آرایه‌ها و عملیات بر روی آنها

using System;

class Array

{

  public static void Main()

   {

     int[] myInts = { 5, 10, 15 };

     bool[][] myBools = new bool[2][];

     myBools[0] = new bool[2];

     myBools[1] = new bool[1];

     double[,] myDoubles = new double[2, 2];

     string[] myStrings = new string[3];

     Console.WriteLine("myInts[0]: {0}, myInts[1]: {1}, myInts[2]: {2}", myInts[0],

     myInts[1], myInts[2]);

    myBools[0][0] = true;

    myBools[0][1] = false;

    myBools[1][0] = true;

    Console.WriteLine("myBools[0][0]: {0}, myBools[1][0]: {1}", myBools[0][0],

    myBools[1][0]);

    myDoubles[0, 0] = 3.147;

    myDoubles[0, 1] = 7.157;

    myDoubles[1, 1] = 2.117;

    myDoubles[1, 0] = 56.00138917;

    Console.WriteLine("myDoubles[0, 0]: {0}, myDoubles[1, 0]: {1}", myDoubles[0, 0],   myDoubles[1, 0]);

    myStrings[0] = "Joe";

    myStrings[1] = "Matt";

    myStrings[2] = "Robert";

    Console.WriteLine("myStrings[0]: {0}, myStrings[1]: {1}, myStrings[2]: {2}",

    myStrings[0], myStrings[1], myStrings[2]);

   }

}

خروجی مثال 4 بصورت زیر است :

myInts[0]: 5, myInts[1]: 10, myInts[2]: 15

myBools[0][0]: True, myBools[1][0]: True

myDoubles[0, 0]: 3.147, myDoubles[1, 0]: 56.00138917

myStrings[0]: Joe, myStrings[1]: Matt, myStrings[2]: Robert

 

در این مثال انواع مختلفی از آرایه‌ها اعلان شده‌اند. در ابتدا یک آرایه تک بعدی، سپس آرایه‌ای دندانه‌دار و در نهایت نیز یک آرایه دو بعدی در این مثال اعلان شده‌اند.

اولین اعلان در این برنامه مربوط به اعلان آرایه تک بعدی myInts می‌باشد که از نوع int بوده و دارای 3 عضو می‌باشد که تعداد این اعضا با اعلان چند مقدار در داخل { } معین شده است. همانطور که از این اعلان دریافت میشود، آرایه تک بعدی بصورت زیر تعریف می‌شود :

type[] arrayName;

که در آن type نوع آرایه و arrayName نام آرایه ایست که تعریف می‌نمائیم.

اما در ابتدا گفته شد که به هنگام اعلان آرایه‌ها اندازه آنها نیز باید مشخص شود. برای تعیین اندازه آرایه، یعنی تعدا عناصری که آرایه در خود جای می‌دهد، می‌توان به چند روش عمل نمود. اولین و ساده‌ترین روش که در این مثال نیز آورده شده است، تخصیص مقادیری به آرایه در داخل یک  زوج { } است. بسته به نوع آرایه، تعداد عناصری که داخل این زوج { } قرار می‌گیرند، تعداد عناصر آرایه می‌باشند و مقادیر عناصر آرایه نیز همان مقادیری است که داخل { } قرار گرفته است. به عنوان مثال در مثال 4، اولین آرایه ما دارای 3 عنصر است که مقادیر آنها به ترتیب برابر با 5، 10 و 15 می‌باشد.

روش دیگر جهت تعیین اندازه آرایه استفاده از روش تعریف کامل آرایه است که به فرم کلی زیر می‌باشد.

type[] arrayName = new type[n];

که در این تعریف، استفاده از کلمه کلیدی new باعث ایجاد نمونه‌ای جدید از نوع مورد نظر، می‌شود. n نیز تعداد عناصر آرایه است که می‌خواهیم آنرا تولید نماییم. در این حالت باید توجه داشت که آرایه‌ای تهی را تولید نموده‌ایم و هیچ عنصری را در آرایه جای نداده‌ایم و در برنامه باید آرایه را مقدار دهی نماییم. به مثال زیر توجه کنید.

int[] myArray = new int[15];

این مثال آرایه‌ای تک بعدی از نوع int را با اندازه 15 عنصر تولید می‌نماید. یعنی این آرایه قادر است تا 15 عنصر از نوع int را در خود ذخیره نماید.

 

گونه دیگری از آرایه‌ها، آرایه‌های چند بعدی (Multi Dimensional Arrays) هستند که برای نگهداری اطلاعات از چندین بعد استفاده می‌کنند و بیشتر برای نگداری جداول و ماتریسها مورد استفاده قرار می‌گیرند. فرم کلی اعلان این آرایه‌ها بصورت زیر است :

type[ ,  , … , ]  arrayName = new type[n1, n2, …. , nm];

که در آن تعداد ابعاد آرایه با ویرگول مشخص شده و n1 تا nm نیز تعداد عناصر هر یک از ابعاد است. بعنوان مثال تعریف یک آرایه سه بعدی به فرم زیر است :

char[ , , ] charArray = new char[3,5,7];

در این مثال یک آرایه سه بعدی از نوع char تولید کرده‌ایم که ابعاد آن به ترتیب دارای 3، 5 و 7 عنصر می‌باشند.

 

نوع دیگری از آرایه‌ها، آرایه‌های دندانه‌دار (Jagged Arrays) هستند. این نوع آرایه‌ها تنها در زبان ‍C# وجود دارند و در صرفه‌جویی حافظه بسیار موثر میباسند. یک آرایه دندانه‌دار، در حقیقت یک آرایه تک بعدی است که هر یک از اعضای آن خود یک آرایه تک بعدی می‌باشند. اندازه این عناصر می‌تواند متفاوت باشد و تفاوت این آرایه‌ها با‌ آرایه‌های چند بعدی در همین جا نمایان می‌شود. استفاده از این آرایه‌ها در مواردی کاربرد دارد که نیازی نیست تا تمامی ابعاد آرایه دارای تعداد عناصر مساوی باشند. بعنوان مثال فرض کنید می‌خواهید آرایه‌ای جهت نگهداری تعداد روزهای ماههای مختلف سال تهیه کنید. در صورتیکه بخواهید از آرایه چند بعدی استفاده نمایید، چون تعداد روزهای تمامی ماههای سال یکسان نیست، مجبورید تا تعداد عناصر تمام بعدهای آرایه را برابر با بزرگترین تعداد روز ماهها، یعنی 31، تعریف نمایید. ولی چون تنها 6 ماه دارای 31 روز می‌باشند، برای 6 ماه دیگر تعدادی از عناصر آرایه هیچگاه مورد استفاده قرار نمی‌گیرند و حافظه را به هدر داده‌ایم. اما در صورتیکه برای این مثال از آرایه‌های دندانه‌دار استفاده نماییم، می‌توانیم یک آرایه دندانه‌دار 12 عنصری تعریف نماییم و سپس تعداد عناصر هر یک از اعضای آنرا برابر با تعداد روزهای ماه مورد نظر تعریف کنیم :

با استفاده از آرایه چند بعدی :

int[ , ] monthArray = new int[12,31];

با استفاده از آرایه دندانه‌دار :

int[][] monthArray = new int[12][];

در تعریف اول که در آن از آرایه چند بعدی استفاده کردیم، مشاهده می‌کنید که آرایه‌ای دو بعدی تعریف کرده‌ایم که بعد اول آن 12 عضو و بعد دوم آن 31 عضو دارد. این عمل دقیقاً همانند ایجاد یک جدول برای نگهداری روزهای ماههای سال است.

اما در حالت دوم که  در آن از آرایه دندانه‌دار بهره برده‌ایم، یک آرایه تعریف نموده‌ایم که بعد اول آن 12 عضو دارد ولی بعد دوم آنرا را تعریف نکرده‌ایم که دارای چند عضو است و هر یک از عناصر بعد اول آرایه می‌تواند دارای تعداد اعضای متفاوتی باشد که با استفاده از این روش می‌توان به هر یک از ماههای سال تعداد روزهای مورد نظر آن ماه را تخصیص داد و فضایی بلا استفاده ایجاد نخواهیم کرد. توجه نمایید که چون تعداد عناصر بعد دیگر این آرایه معین نشده است در برنامه باید این تعداد عنصر را مشخص نماییم :

monthArray[1] = new int[31];

monthArray[10] = new int [30];

مشاهده می‌کنید که به هر ماه، تعدا عنصر مورد نیاز خود را تخصیص داده‌ایم. تنها باید به تفاوت اعلان آرایه‌های دندانه‌دار با آرایه‌های چند بعدی توجه نمایید.

 

دسترسی به عناصر آرایه از طریق اندیس امکان پذیر است. اندیس شماره محل ذخیره‌سازی داده‌های ما می‌باشد که با دادن این شماره می‌توانیم به داده مورد نظر دسترسی پیدا کنیم. در C# همانند C و C++ اندیس خانه‌های آرایه از صفر آغاز می‌گردد یعنی اولین خانه آرایه دارای شماره صفر است و عناصر بعدی به ترتیب یک واحد به اندیسشان اضافه می‌گردد. پس شماره اندیس آرایه همیشه یک واحد کمتر از تعداد عناصر آن است، یعنی آرایه‌ای که 10 عضو دارد بزرگترین اندیس خانه‌هایش 9 می‌باشد. دسترسی به عناصر هر یک از ابعاد آرایه با اندیس امکان پذیر است. معمولاً به بعد اول آرایه سطر و به بعد دوم آن ستون می‌گوید. مثلاً monthArray[3,7] عنصر واقع در سطر 3 و ستون 7 آرایه را مشخص می‌نماید.(توجه داشته باشید که اندیس دهی آرایه از صفر آغاز می‌شود و بعنوان مثال intArray[12] به خانه شماره 12 آرایه اشاره می‌کند اما فراموش نکنید چون اندیس آرایه از صفر آغاز می‌شود خانه شماره 12 آرایه، سیزدهمین داده شما را در خود جای می‌دهد.)

 

12

11

10

9

8

7

6

5

4

3

2

1

0

 

اگر شکل فوق را آرایه‌ای تک بعدی تصور نمایید، مشاهده می‌نمایید که خانه شماره 5 آرایه حاوی اطلاعات مربوط به ششمین داده ورودی شما می‌باشد.

 

نکته دیگری که باید در مورد تعریف آرایه‌های این مثال متذکر شوم در مورد آریه‌هائیست که از نوع string تعریف می‌شوند. دوستانی که با زبان C کار کرد‌ه‌اند حتماً می‌دانند که آرایه‌ای از نوع رشته‌ای در C وجود ندارد و برای نگهداری چندین رشته در یک آرایه باید از آرایه دو بعدی استفاده کرد. در C# این قابلیت فراهم شده تا با استفاده از یک آرایه تک بعدی بتوان چندین رشته را ذخیره نمود بدین صورت که هر یک از عناصر آرایه نک بعدی محلی برای ذخیره‌سازی یک رشته است و همانند زبان C نیاز به پردازش‌های گاه پیچیده بر روی آرایه‌های چند بعدی بمنظور کار با رشته‌ها، وجود ندارد. بعنوان یک توضیح کمی اختصاصی عرض می‌کنم که در زبان‌هایی مانند C، در صورتیکه می‌خواستید چندین رشته را در آرایه‌ای ذخیره کنید تا بتوانید با اندیس به آنها دسترسی داشته باشید، مجبور به تعریف یک آرایه دو بعدی بودید که با استفاده از تنها اندیس اول آرایه می‌توانستید به عناصر رشته‌ای آرایه دسترسی پیدا کنید، اما در C# تنها با استفاده از یک آرایه تک بعدی می‌توان همان کار را انجام داد.

string[] stringArray = {"My name is Hadi", "This is C# Persian Blog"}

…..

Console.WriteLine("{0}",stringArray[0]);

…..

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

My name is Hadi

 

 

مطلب این درس در اینجا به پایان می‌رسد. در صورتیکه نیاز دارید تا در مورد عملگرهای زبان C# بیشتر توضیح دهم حتماً ذکر کنید تا در مطلب بعدی توضیح کاملتری در مورد آنها برای شما تهیه کنم. خیلی دوست داشتم که در مورد تمام عملگرهای زبان C# در همین درس توضیح بدهم اما هم فرصت اندک است و هم حجم مطلب این قسمت زیاد می‌شد و هم اینکه فکر کردم احتمالاً دوستان با این عملگرها آشنایی دارند. نکته‌ دیگری که باید به آن اشاره کنم و اینست که در این سایت سعی شده است تا زبان برنامه‌نویسی C# به سادگی و به سرعت آموزش داده شود و علت اینکه به برخی از جزئیات تخصصی پرداخته نمی‌شود نیز همین مطلب می‌باشد. در آینده در مورد آرایه‌ها بیشتر صحبت می‌کنم چون عناصر مفید و سودمندی هستند. امید است پس از کامل کردن مطالب مقدماتی در این سایت و با همکاری شما عزیزان بتوانم به مطالب پیشرفته‌تری از زبان C# بپردازم. بیان نظرات و پیشنهادات شما چه در زمینه مطالب ارائه شده و چه در زمینه متن ارائه شده به شما از لحاظ سادگی و روانی در درک، مرا در امر بهبود مطالب یاری می‌نماید.

درس دوم – عبارات، انواع و متغیرها در C#

درس دوم – عبارات، انواع و متغیرها در C#

 

در این درس به معرفی عبارات، انواع و متغیرها در زبان C# می‌پردازیم. هدف از این درس بررسی موارد زیر است :

  • آشنایی با متغیرها
  • فراگیری انواع(Types) ابتدایی در C#
  • فراگیری و درک عبارات(Expressions) در C#
  • فراگیری نوع رشته‌ای(String) در زبان C#
  • فراگیری چگونگی استفاده از آرایه‌ها(Arrays) در زبان C#

 

متغیرها، به بیان بسیار ساده، مکانهایی جهت ذخیره اطلاعات هستند. شما اطلاعاتی را در یک متغیر قرار می‌دهید و از این اطلاعات بوسیله متغیر در عبارات ‍‍C# استفاده می‌نمایید. کنترل نوع اطلاعات ذخیره شده در متغیرها بوسیله تعیین کردن نوع برای هر متغیر صورت می‌پذیرد.

C# زبانی بسیار وابسته به انواع است، بطوریکه تمامی عملیاتی که بر روی داده‌ها و متغیرها در این زبان انجام می‌گیرد با دانستن نوع آن متغیر میسر می‌باشد. قوانینی نیز برای تعیین اینکه چه عملیاتی بر روی چه متغیری انجام شود نیز وجود دارد.(بسته به نوع متغیر)

 

انوع ابتدایی زبان C# شامل : یک نوع منطقی(Boolean) و سه نوع عددی اعداد صحیح(integer)، اعداد اعشاری(Floating points) و اعداد دسیمال(Decimal) می‌باشد.(به انواع Boolean از اینرو منطقی می‌گوییم که تنها دارای دو حالت منطقی صحیح(True) و یا غلط(False) می‌باشند.)

 

مثال 1 – نشان دادن مقادیر منطقی (Boolean)

using System;

class Booleans

{

  public static void Main()

   {

    bool content = true;

    bool noContent = false;

    Console.WriteLine("It is {0} that C# Persian provides C# programming language

        content.", content);

    Console.WriteLine("The statement above is not {0}.", noContent);

   }

}

در این مثال، مقادیر منطقی متغیر‌های Boolean به عنوان قسمتی از جمله در خروجی نمایش داده می‌شوند. متغیر‌های bool تنها می‌توانند یکی از دو مقدار true یا false را داشته باشند، یعنی همانند برخی از زبانهای برنامه‌سازی مشابه، مانند C و یا C++، مقدار عددی نمی‌پذیرند، زیرا همانگونه که می‌دانید در این دو زبان هر مقدار عددی صحیح مثبت بغیر از صفر به عنوان true و عدد صفر به عنوان false در نظر گرفته می‌شود و در حقیقت نوع bool در این دو زبان نوعی integer می‌باشند. اما در زبان C# انواع bool یکی از دو مقدار true یا false را می‌پذیرند. خروجی برنامه بالا به صورت زیر است :

It is True that C# Persian provides C# programming language content.

The statement above is not False.

جدول زیر تمامی انواع عددی صحیح ‍C#، اندازه آنها و رنج قابل قبول آنها را نشان می‌دهد.

 

رنج قابل قبول

اندازه به بیت

نوع

128- تا 127

8

sbyte

0 تا 255

8

byte

32768- تا 32767

16

short

0 تا 65535

16

ushort

2147483648- تا 2147483647

32

int

0 تا  4294967295

32

uint

9223372036854775808- تا 9223372036854775807

64

long

0 تا 18446744073709551615

64

ulong

 

از این انواع برای محاسبات عددی استفاده می‌گردد. یک نوع دیگر را نیز می‌توان در این جدول اضافه نمود و آن نوع char است. هر چند شاید از نظر بسیاری از دوستانی که با زبانهای دیگر برنامه‌سازی کار کرده‌اند این تقسیم بندی غلط به نظر آید، اما باید گفت که در زبان C# نوع char نیز نوع خاصی از انواع عددی است که رنجی بین صفر تا 65535 دارد و اندازه آن نیز 16 بیتی است، اما به جای نمایش دادن مقادیر عددی تنها می‌تواند بیان کننده یک کاراکتر باشد. در آینده در این مورد بیشتر توضیح خواهم داد.

 

جدول زیر تمامی انواع عددی اعشاری زبان C# را نمایش می‌دهد.

 

رنج قابل قبول

دقت

اندازه به بیت

نوع

 تا  

7 رقم

32

float

   تا 

15-16 رقم

64

double

  تا  

28-29 رقم دسیمال

128

decimal

 

انواعی از نوع floating point هنگامی استفاده می‌شوند که محاسبات عددی به دقت‌های اعشاری نیاز داشته باشند. همچنین برای منظورهای تجاری استفاده از نوع decimal بهترین گزینه است. این نوع تنها در زبان C# وجود دارد و در زبانهای مشابه به آن نظیر Java چنین نوعی در نظر گرفته نشده است.

 

در یک زبان برنامه‌سازی نتایج بوسیله ایجاد یک سری عبارت تولید می‌گردند. عبارات از ترکیب متغیرها و عملگرها در دستورالعمل‌های یک زبان ایجاد می‌گردند.(توجه نمایید که عبارت معادل expression و دستورالعمل معادل statement می‌باشد که ایندو با یکدیگر متفاوت می‌باشند.) جدول زیر عملگرهای موجود در زبان C#، حق تقدم آنها و شرکت‌پذیری آنها را نشان می‌دهد.

 

شرکت‌پذیری

عملگر(ها)

نوع عمل

از چپ

(x)   x.y   f(x)   a[x]   x++   x--

new   typeof   sizeof   checked   unchecked

عملیات ابتدایی

از چپ

+   -   !   ~   ++x   --x   (T)x

عملیات یکانی

از چپ

*   /  %

عملیات ضربی

از چپ

-   +

عملیات جمعی

از چپ

<<   >>

عمل شیفت

از چپ

< > <= >= is

عملیات رابطه‌ای

از راست

==   !=

عملیات تساوی

از چپ

&

عمل AND منطقی

از چپ

|

عمل OR منطقی

از چپ

^

عمل XOR منطقی

از چپ

&&

عمل AND شرطی

از چپ

||

عمل OR شرطی

از چپ

?:

عمل شرطی

از راست

=   *=  /=   %=  +=  -=  <<=  >>=  &=  ^=  |=

عمل انتساب

 

شرکت‌پذیری از چپ بدین معناست که عملیات از چپ به راست محاسبه می‌شوند. شرکت‌پذیری از راست بدین معناست که تمامی محاسبات از راست به چپ صورت می‌گیرند. به عنوان مثال در یک عمل تساوی، ابتدا عبارات سمت راست تساوی محاسبه شده و سپس نتیجه به متغیر سمت چپ تساوی تخصیص داده می‌شود.

 

مثال 2- عملگرهای یکانی (Unary)

using System;

class Unary

{

  public static void Main()

  {

    int unary = 0;

    int preIncrement;

    int preDecrement;

    int postIncrement;

    int postDecrement;

    int positive;

    int negative;

    sbyte bitNot;

    bool logNot;

    preIncrement = ++unary;

    Console.WriteLine("Pre-Increment: {0}", preIncrement);

    preDecrement = --unary;

    Console.WriteLine("Pre-Decrement: {0}", preDecrement);

    postDecrement = unary--;

    Console.WriteLine("Post-Decrement: {0}", postDecrement);

    postIncrement = unary++;

    Console.WriteLine("Post-Increment: {0}", postIncrement);

    Console.WriteLine("Final Value of Unary: {0}", unary);

    positive = -postIncrement;

    Console.WriteLine("Positive: {0}", positive);

    negative = +postIncrement;

    Console.WriteLine("Negative: {0}", negative);

    bitNot = 0;

    bitNot = (sbyte)(~bitNot);

    Console.WriteLine("Bitwise Not: {0}", bitNot);

    logNot = false;

    logNot = !logNot;

    Console.WriteLine("Logical Not: {0}", logNot);

  }

}

به هنگام محاسبه عبارات، دو عملگر x++ و  x—(که در اینجا کاراکتر x بیان کننده آن است که عملگرهای ++ و – در جلوی عملوند قرار می‌گیرند post-increment و post-decrement) ابتدا مقدار فعلی عملوند (operand) خود را باز می‌گرداند و سپس به عملوند خود یک واحد اضافه کرده یا از آن یک واحد می‌کاهند. عملگر ++ یک واحد به عملوند خود اضافه می‌کند و عملگر – یک واحد از عملوند خود می‌کاهد. بدین ترتیب عبارت x++ معادل است با عبارت x=x+1 و یا x+=1 اما همانطور که گفته شد باید توجه داشته باشید که این عملگرها(++ و --) ابتدا مقدار فعلی عملوند خود را برگشت می‌دهند و سپس عمل خود را روی آنها انجام می‌دهند. بدین معنی که در عبارت x=y++ در صورتیکه در ابتدای اجرای برنامه مقدار x=0 و y=1 باشد، در اولین اجرای برنامه مقدار x برابر با 1 یعنی مقدار y می‌شود و سپس به متغیر y یک واحد افزوده می‌شود، در صورتیکه اگر این عبارت را بصورت x=++y بنویسیم در اولین اجرای برنامه، ابتدا به مقدار متغیر y یک واحد افزوده می‌شود و سپس این مقدار به متغیر x تخصیص داده می‌شود که در این حالت مقدار متغیر x برابر با 2 می‌شود.(در مورد عملگر – نیز چنین است.) پس با این توضیح می‌توان گفت که دو عملگر ++x و –x ابتدا به عملوند خود یک واحد اضافه یا یک واحد از آن کم می‌کنند و سپس مقدار آنها را باز می‌گردانند.

 

در مثال 2، مقدار متغیر unary در قسمت اعلان برابر با 0 قرار گرفته است. هنگامیکه از عملگر ++x استفاده می‌کنیم، به مقدار متغیر unary یک واحد افزوده می‌شود و مقدارش برابر با 1 می‌گردد و سپس این مقدار، یعنی 1، به متغیر preIncrement تخصیص داده می‌شود. عملگر –x مقدار متغیر unary را به 0 باز می‌گرداند و سپس این مقدار را به متغیر preDecrement نسبت می‌دهد.

هنگامیکه از عملگر x-- استفاده می‌شود، مقدار متغیر unary، یا همان مقدار صفر، به متغیر postDecrement تخصیص داده می‌شود و سپس از مقدار متغیر unary یک واحد کم شده و مقدار این متغیر به 1- تغییر می‌کند. سپس عملگر x++ مقدار متغیر unary، یعنی همان 1-، را به متغیر postIncrement تخصیص می‌دهد و سپس یک واحد به مقدار متغیر unary می‌افزاید تا مقدار این متغیر برابر با 0 (صفر) شود.

 

مقدار متغیر bitNot در هنگام اعلان برابر با صفر است. با استفاده از عملگر نقیض بیتی (~) (یا عملگر مکمل‌گیری) متغیر bitNot بعنوان یک بایت در نظر گرفته می‌شود و مقدار آن منفی یا نقیض می‌شود. در عملیات بیتی نقیض بدین معناست که تمامی یکها به صفر و تمامی صفرها به یک تبدیل شوند. در این حالت نمایش باینری عدد صفر یا همان 00000000 به نقیض آن یعنی 11111111 تبدیل می‌گردد.

 

در این مثال به عبارت (sbyte)(~bitNot) توجه نمایید. هر عملی که بر روی انواع short،unshort ، byte و sbyte انجام شود، مقداری از نوع int را باز می‌گرداند. بمنظور اینکه بتوانیم نتیجه دلخواه را به متغیر bitNot تخصیص دهیم باید از فرمت (Type) operator استفاده نماییم که در آن Type نوعی است می‌خواهیم نتیجه ما به آن نوع تبدیل شود و operator عملی است که بر روی متغیر صورت می‌پذیرد. به بیان دیگر چون می‌خواهیم مقدار متغیر bitNot بصورت بیتی در نظر گرفته شود، پس باید نتیجه عمل ما بصورت بیتی در آن ذخیره شود که استفاده از نوع sbyte باعث می‌شود تا نتیجه به فرم بیتی (یا بایتی) در متغیر ما ذخیره شود. باید توجه نمایید که استفاده از فرمت (Type) یا در اصطلاح عمل Casting، در مواقعی که می‌خواهیم تغییری از یک نوع بزرگتر به نوع کوچکتر ایجاد نماییم، مورد استفاده قرار گیرد، چرا که در این حالات ممکن است با از دست دادن اطلاعات مواجه باشیم. در این مثال چون می‌خواهیم نوع بزرگتر int را به(32 بیتی) به نوع کوچکتر sbyte (8 بیتی) تبدیل نماییم، بدین منظور باید بطور صریح از عمل Casting استفاده نماییم تا اطلاعاتی در این تبدیل از بین نرود. در مورد تبدیل انواع کوچکتر به انواع بزرگتر(مثلا تبدیل sbyte به int) نیازی به استفاده از عمل Casting نیست چرا که امکان از بین رفتن اطلاعات وجود ندارد. در ضمن باید به یک نکته مهم توجه نمایید و آن تبدیل انواع علامتدار(Signed) و بدون علامت(Unsigned) به یکدیگر است. در این حالت خطر بسیار مهمی داده‌های شما را تهدید می‌نماید. بحث در مورد مسائل پیچیده‌تر در مورد تبدیل انواع علامتدار و و بدون علامت به یکدیگر در اینجا نمی‌گنجد و سعی می‌کنم تا آنها را در مطالب بعدی و در جای لازم مورد بحث و بررسی قرار دهم.(در صورتیکه برخی از مطالب این قسمتها برای شما به خوبی قابل درک نیست، نگران نباشید چراکه در آینده در مثالهایی که خواهید دید تمامی این مطالب را در عمل نیز حس کرده و با آنها آشنا خواهید شد.)

 

عملگر بعدی که در این برنامه مورد استفاده قرار گرفته است، عملگر نقیض منطقی یا همان "!" است که امکان تغییر مقدار یک متغیر Boolean را از true به false و بالعکس را فراهم می‌آورد. در مثال بالا(مثال شماره 2) مقدار متغیر logNot پس از استفاده از عملگر "!" از false به true تغییر کرده است. با توجه به توضیحات اخیر خروجی زیر از برنامه مثال 2 مورد انتظار است :

Pre-Increment: 1

Pre-Decrement 0

Post-Decrement: 0

Post-Increment -1

Final Value of Unary: 0

Positive: 1

Negative: -1

Bitwise Not: -1

Logical Not: True

مثال 3 – عملگرهای دوتایی

using System;

class Binary

{

  public static void Main()

  {

    int x, y, result;

    float floatResult;

    x = 7;

    y = 5;

    result = x+y;

    Console.WriteLine("x+y: {0}", result);

    result = x-y;

    Console.WriteLine("x-y: {0}", result);

    result = x*y;

    Console.WriteLine("x*y: {0}", result);

    result = x/y;

    Console.WriteLine("x/y: {0}", result);

    floatResult = (float)x/(float)y;

    Console.WriteLine("x/y: {0}", floatResult);

    result = x%y;

    Console.WriteLine("x%y: {0}", result);

    result += x;

    Console.WriteLine("result+=x: {0}", result);

  }

}

خروجی این برنامه به فرم زیر است :

x+y: 12

x-y: 2

x*y: 35

x/y: 1

x/y: 1.4

x%y: 2

result+=x: 9

مثال 3 استفاده‌های متفاوتی از عملگرهای دوتایی را نشان می‌دهد.(منظور از عملگر دوتایی، عملگری است که دارای دو عملوند می‌باشد مانند عملگر جمع "+"). بسیاری از عملگرهای مورد استفاده در این مثال عملگرهای ریاضی هستند و نتیجه عمل آنها مشابه عملی است که از آنها در ریاضیات دیده‌اید. از نمونه این عملگرها می‌توان به عملگرهای جمع "+"، تفریق "-"، ضرب "*" و تقسیم "/" اشاره نمود.

 

متغیر floatResult از نوع اعشاری یا float تعریف شده است. در این مثال نیز صریحاً از عمل Casting جهت اسفاده از دو متغیر x و y که از نوع int هستند، برای انجام عملی که نتیجه‌اش از نوع float است، استفاده کرده‌ایم.

 

در این مثال از عملگر "%" نیز استفاده کرده‌ایم. این عملگر در عملیات تقسیم کاربرد دارد و باقیمانده تقسیم را برمی‌گرداند. یعنی دو عملوند خود را بر یکدیگر تقسیم می‌کند و باقیمانده این تقسیم را برمی‌گرداند.

 

در این مثال همچنین فرم جدیدی از عمل انتساب را بصورت result+=x مشاهده می‌نمایید. استفاده از عملگرهای انتسابی که خود ترکیبی از دو عملگر هستند، جهت سهولت در امر برنامه‌نویسی مورد استفاده قرار می‌گیرند. عبارت فوق معادل result = result+x می‌باشد. یعنی مقدار قبلی متغیر result با مقدار متغیر x جمع می‌شود و نتیجه در متغیر result قرار می‌گیرد.

 

یکی دیگر از انواعی که تا کنون با آن سر و کار داشته‌ایم نوع رشته‌ای (string) است. یک رشته، از قرار گرفتن تعدادی کاراکتر در کنار یکدیگر که داخل یک زوج کوتیشن " " قرار گرفته‌اند، ایجاد می‌گردد. بعنوان مثال "Hi This is a string type". در اعلان متغیرها نیز در صورت تعریف متغیری از نوع رشته‌ای، در صورت نیاز به تخصیص مقدار به آن، حتماً کاراکترهایی که می‌خواهیم بعنوان یک رشته به متغیرمان نسبت دهیم را باید داخل یک زوج کوتیشن " " قرار دهیم. به مثال زیر توجه نمایید.

string Name;

Name = "My name is Hadi";

همانطور که در این مثال مشاهده می‌نمایید، متغیری از نوع رشته‌ای تحت نام Name تعریف شده است و سپس در جایی از برنامه که نیاز به تخصیص مقدار برای این متغیر وجود دارد، عبارت مورد نظر را داخل دو کوتیشن قرار داده و به متغیر خود تخصیص داده‌ایم. رشته‌ها از پر کاربرد ترین انواع در زبان‌های برنامه‌سازی جهت ایجاد ارتباط با کاربر و دریافت اطلاعات از کاربر می‌باشند.(همانطور که در درس قبل اول نیز گفته شد، دستور Console.ReadLine() یک رشته را از ورودی دریافت می‌نماید.) در مثالهایی که در طی درسهای این سایت خواهید دید، نمونه‌های بسیاری از کاربرد انواع مختلف و نیز نوع رشته‌ای را خواهید دید.