درس دوم – عبارات، انواع و متغیرها در 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 Meysam";

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


آرایه‌ها(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 Meysam", "This is C# Persian Blog"}

…..

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

…..

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

My name is Meysam

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

منابع مورد استفاده در این مطلب :

 

C# Tutorial For Beginners

Author : Joe Mayo

Copyright © 2001-2003

www.csharp-station.com

 

C# Unleashed

By : Joe Mayo

Publication : SAMS 2002

C# Reference

By : Microsoft C# Team

Publication : Microsoft Press 2001

  
نویسنده : ali gooliof ; ساعت ٤:٠۳ ‎ب.ظ روز ۱۳۸٧/٢/٦
تگ ها :