در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش سی شارپ (#C) قسمت 14 : آشنایی با آرایه ها و دستور For Each

در بخش قبلی آموزش زبان سی شارپ با دستورات کنترلی و حلقه ها آشنا شدیم. در این بخش قصد داریم با مبحث آرایه ها و دستور foreach آشنا شویم. همانطور که در قسمت آشنایی با متغیرها گفتیم، یک متغیر خانه ای از حافظه است که می توان مقداری را در داخل آن ذخیره کرد. برای مثال دستور زیر متغیری از نوع string و با نام name تعریف کرده و مقدار ITPro را داخل آن قرار می دهد:

string name = "ITPro";

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

{type}[] numbers = new {type}[{length}];

در قسمت type نوع داده ای که قصد داریم به عنوان آرایه ایجاد شود و در قسمت length باید تعداد خانه های آرایه را مشخص کنیم. برای مثال فرض کنید که قصد داریم یک آرایه 10 خانه ای از نوع int ایجاد کنیم:

int[] numbers = new int[10];

بوسیله کد بالا یک آرایه 10 خانه ای از نوع int برای ما ایجاد می شود. برای مثال دوم یک آرایه 20 خانه ای از نوع string ایجاد می کنیم:

string[] names = new string[20];

در مرحله بعد باید با نحوه دسترسی به خانه های آرایه آشنا شویم. در دو حالت ما نیاز به دسترسی به خانه های آرایه خواهیم داشت:

  1. قرار دادن مقدار داخل یکی از خانه های آرایه
  2. گرفتن مقدار یکی از خانه های آرایه

ابتدا نحوه قرار دادن مقدار را با هم بررسی می کنیم:

string[] names = new string[20];
names[10] = "ITPro.ir";

همانطور که مشاهده می کنید ابتدا نام متغیر، سپس داخل [] اندیس خانه ای از آرایه که قصد داریم مقدار داخل آن قرار بگیرد را می نویسیم. اما به یک نکته توجه کنید که اندیس آرایه ها از شماره 0 شروع می شود. یعنی در کد بالا که عدد 10 را نوشتیم، اشاره به خانه نهم آرایه می کنید. برای مثال در یک آرایه 10 خانه ای، عدد 0 به خانه اول و عدد 9 به خانه دهم اشاره می کند.

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

string[] names = new string[10];
names[0] = "Reza";
names[1] = "Hossien";
names[2] = "Mohammad";
Console.WriteLine(names[1]); // output Hossein

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

int[] numbers = new[] { 2,6,3,1,7,9};

در کد بالا، آرایه ای از نوع int تعریف شده و مقادیر مشخص شده داخل {} در خانه های آرایه قرار میگیرد. در مثال قبلی آرایه تعریف شده حاوی 6 خانه خواهد بود (بر اساس تعداد اعداد داخل {}).

می توان برای راحتی کار، از نوشتن []int صرفنظر کرد:

int[] numbers = { 2,6,3,1,7,9};

کد بالا، دقیقاً کار کد قبلی را انجام می دهد.

زمانی که ما یک آرایه تعریف می کنیم، می توانیم بوسیله دستور for به خانه های آرایه دسترسی داشته باشیم. برای مثال، فرض کنید برنامه ای می خواهیم بنوسیم که 10 عدد را از کاربر دریافت کرده، سپس حاصل جمع این 10 عدد را در خروجی چاپ کند.

1. در ابتدا باید آرایه ای که اعداد داخل آن باید ذخیره شوند را تعریف کنیم:

int[] nums = new int[10];

2. در قدم بعدی باید 10 عدد را از کاربر دریافت کرده و در خانه های آرایه ذخیره کنیم. دقت کنید، 10 مرتبه عملیات دریافت اطلاعات از کاربر تکرار می شود، پس ما باید یک حلقه تشکیل داده و داخل آن حلقه اقدام به دریافت اعداد از کاربر نماییم:

for (int index = 0; index <= 9; index++)
{
    Console.Write("Enter number " + (index + 1) + " of 10: ");
    nums[index] = int.Parse(Console.ReadLine());
}

دقت کنید که شمارنده حلقه از عدد صفر شروع شده و تا زمانی که مقدار شمارنده کوچکتر یا مساوی عدد 9 باشد تکرار خواهد شد. ما می توانیم از عدد شمارنده برای دسترسی به خانه های آرایه نیز استفاده کنیم. همچنین قبل از دریافت عدد، پیغامی مناسب به کاربر جهت وارد کردن عدد نمایش می دهیم.

3. در مرحله بعد، باید تک تک خانه های آرایه را خوانده و حاصل جمع را در یک متغیر جانبی ذخیره کنیم:

int sum = 0;
for (int index = 0; index <= 9; index++)
{
    sum = sum + nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

می توان دستور داخل حلقه for را به صورت خلاصه تر نوشت:

int sum = 0;
for (int index = 0; index <= 9; index++)
{
    sum += nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

خاصیت Length

فرض کنید، ما طول آرایه ای که تعریف کردیم را نمی دانیم! در این مواقع می توان با خاصیت Length طول آرایه را بدست آورد. در مثال زیر نحوه بدست آوردن طول آرایه با خاصیت Length را بررسی می کنیم:

string[] names = {"ITPro.IR","Mohammad","Hossein","Farhad","Saeed","Sadegh","Mahmoud"};
Console.WriteLine(names.Length); // Output => 7

دستور بالا، مقدار 7 که تعداد آیتم های آرایه یا طول آرایه می باشد را در خروجی چاپ می کند. این خاصیت مقداری از نوع int برای ما بر می گرداند.

حال مثال قبلی که حاصل جمع اعداد را حساب می کرد به صورت زیر تغییر می دهیم:

int sum = 0;
for (int index = 0; index < nums.Length; index++)
{
    sum += nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

ما قسمت شرط دستور for را جوری تغییر دادیم که حلقه تا زمانی که شمارنده کوچتر از طول آرایه باشد تکرار شود. دقت کنید که به جای => ما از > استفاده کردیم. زیرا Length طول آرایه را برمیگرداند و به دلیل شروع شدن خانه های آرایه از اندیس 0 حلقه باید یک عدد کمتر از طول خانه های آرایه تکرار شود.

آرایه های چند بعدی

در مثال های قبلی، آرایه هایی که ایجاد کردیم، متغییرهایی بودند که شامل چندین خانه بودند. به این آرایه ها آرایه های خطی نیز می گویند. اما فرض کنید قصد داریم جدول ضرب 9 در 9 را در یک آرایه ذخیره کنیم. برای این کار باید از آرایه های چند بعدی استفاده کنیم. برای مثال، دستور زیر یک آرایه 2 بعدی شامل 9 سطر و 9 ستون را تعریف می کند:

int[,] martix = new int[9,9];

برای ابعاد بیشتر باید تعداد اعداد داخل [] را بیشتر کنیم:

int[,,] martix = new int[9,9,9];

در مثال زیر، یک آرایه 9 در 9 تعریف کرده و جدول ضرب 9 در 9 را داخل آن ذخیره می کنیم و در نهایت خروجی را چاپ می کنیم:

int[,] matrix = new int[9,9];

for (int col = 0; col < 9; col++)
{
    for (int row = 0; row < 9; row++)
    {
        matrix[col, row] = (col + 1)*(row + 1);
    }
}

for (int col = 0; col < 9; col++)
{
    for (int row = 0; row < 9; row++)
    {
        Console.Write(matrix[col, row] + "\t");
    }
    Console.WriteLine();
}

آرایه های نامنظم یا Jagged Arrays

در قسمت قبلی با آرایه های چند بعدی آشنا شدیم، مثل آرایه های 2**2 یا 3**3 یا 2**4، اما فرض کنید قصد داریم آرایه دو بعدی با تعداد خانه های نامساوی تعریف کنیم، در قسمت آرایه های چند بعدی هر سطر از آرایه دارای تعداد خانه های مشخص بود، مثل 3 سطر و 2 ستون، اما فرض کنید می خواهیم هر سطر از آرایه تعداد خانه های متفاوتی داشته باشد. برای مثال، سطر اول 5 خانه، سطر دوم 6 خانه، سطر سوم 2 خانه و ... برای اینجور مواقع ما می توانیم از آرایه های نامنظم استفاده کنیم. شیوه تعریف آرایه های نامنظم به صورت زیر است:

int[][] jaggedArray = new int[3][];

با دستور بالا یک آرایه سه خانه ای که هر یک از خانه های آن نیز یک آرایه است تعریف کردیم. حالا باید برای تک تک خانه های آرایه نیز، آرایه ایجاد کنیم:

jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];

می توان هر یک از خانه های آرایه را به صورت مستقیم مانند مثال زیر مقدار دهی نیز کرد:

jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

در مثال بالا، یک آرایه 3 خانه ای که خانه اول دارای 5 خانه، خانه دوم دارای سه 3 و خانه سوم دارای 2 خانه می باشد را ایجاد کردیم.

برای دسترسی به خانه های آرایه باید از دو اندیس استفاده کرد، اندیس اول برای آرایه اول و اندیس دوم برای آرایه دوم:

jaggedArray[0][1] = 77;
Console.WriteLine("{0}", jaggedArray[0][1]);

دستور foreach

در زبان سی شارپ، زمانی که ما یک آرایه تعریف می کنیم، در حقیقت یک مجموعه قابل شمارش (Enumerable) تعریف کرده ایم. در دات نت مجموعه های قابل شمارش زیادی وجود دارند که در بخش های بعدی با آنها بیشتر آشنا خواهیم شد. اما منظور از قابل شمارش چست؟ نوع های قابل شمارش، نوع هایی می باشند که ما می توانیم بوسیله دستور foreach به خانه های آنها دسترسی داشته باشیم. ساختار کلی دستور foreach به صورت زیر است:

foreach({type} {variable-name} in {collection})
{
    // loop syntaxes
}
  1. قسمت type باید نوع متغیری که مجموعه بر اساس آن تعریف شده را مشخص کنیم. برای مثال، اگر آرایه ای داریم که خانه های آن از نوع int است، باید به جای type نوع int را بنویسیم. به جای type می توان از کلمه کلیدی var که در بخش های قبلی با آن آشنا شدیم نیز استفاده کرد.
  2. قسمت variable-name باید نام متغیری که خانه های آرایه در آن قرار می گیرند را مشخص کنیم. این نام کاملاً دلخواه است.
  3. در قسمت collection نام مجموعه ای که قصد داریم به خانه های آن دسترسی داشته باشیم را می نویسیم.

شیوه عملکرد دستور foreach به این صورت است که حلقه ای بر روی مجموعه مورد نظر ایجاد می شود، سپس هر یک از خانه های آن مجموعه خوانده شده و مقدار آن داخل متغیری که نام آن را در بخش variable-name مشخص کردیم قرار میگیرد و ما می توانیم در هر تکرار به آیتم خانه های آرایه به ترتیب قرار گیری در مجموعه دسترسی داشته باشیم. به مثال زیر توجه کنید:

string[] names = {"ITPro.IR","Mohammad","Hossein","Farhad","Saeed","Sadegh","Mahmoud"};

foreach (var name in names)
{
    Console.WriteLine(name);
}

بوسیله دستور بالا، کلیه آیتم های آرایه names در خروجی چاپ خواهد شد. دستور foeach بالا دقیقاً معادل دستور for زیر می باشد:

for (int index = 0; index < names.Length; index++)
{
    Console.WriteLine(names[index]);
}

دستور foreach هنگام کار با مجموعه ها به شدت مورد استفاده قرار می گیرد. اما توجه داشته باشید اگر در برنامه ای که قصد نوشتن آن را دارید، سرعت اجرای کدها از اهمیت زیادی برخوردار است، دستور for سرعت اجرای بیشتری نسبت به دستور foreach دارد.

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

نویسنده : حسین احمدی

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

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

#آرایه_ها_در_سی_شارپ #استفاده_از_دستور_foreach_در_سی_شارپ #آموزش_زبان_سی_شارپ #آموزش_برنامه_نویسی_c# #آموزش_مقدماتی_برنامه_نویسی #آشنایی_با_jagged_arrays #دستور_foreach #آموزش_برنامه_نویسی #آرایه_های_نامنظم_در_سی_شارپ
عنوان
1 آموزش سی شارپ (#C) قسمت 1 : مقدمه رایگان
2 آموزش سی شارپ (#C) قسمت 2 : ابزارهای مورد نیاز دوره رایگان
3 آموزش سی شارپ (#C) قسمت 3 : آشنایی با .NET Framework یک رایگان
4 آموزش سی شارپ (#C) قسمت 4 : آشنایی با .NET Framework دو رایگان
5 آموزش سی شارپ (#C) قسمت 5 : آشنایی با محیط ویژوال استودیو رایگان
6 آموزش سی شارپ (#C) قسمت 6 : ساختار برنامه ها و کامپایلر سی شارپ رایگان
7 آموزش سی شارپ (#C) قسمت 7 : دستورات کنسول و متغیرها رایگان
8 آموزش سی شارپ (#C) قسمت 8 : نوع های داده اولیه رایگان
9 آموزش سی شارپ (#C) قسمت 9 : آشنایی با عملگرها رایگان
10 آموزش سی شارپ (#C) قسمت 10 : دستورات کنترلی و حلقه ها یک رایگان
11 آموزش سی شارپ (#C) قسمت 11 : دستورات کنترلی و حلقه ها دو رایگان
12 آموزش سی شارپ (#C) قسمت 12 : دستورات کنترلی و حلقه ها سه رایگان
13 آموزش سی شارپ (#C) قسمت 13 : دستورات کنترلی و حلقه ها چهار رایگان
14 آموزش سی شارپ (#C) قسمت 14 : آشنایی با آرایه ها و دستور For Each رایگان
15 آموزش سی شارپ (#C) قسمت 15 : آشنایی با متدها یک رایگان
16 آموزش سی شارپ (#C) قسمت 16 : آشنایی با متدها دو رایگان
زمان و قیمت کل 0″ 0
13 نظر
فرهاد خانلری

عالی بود مهندس جان جهت درک بیشتر و تمرین نظر شما چیه که انتهای هر درس یا هر دوره یک یا دو مثال قرار دهید ، مثال هایی که تمام اون بخش یا دوره رو در بر بگیره و دوستان خودشون جواب بدن و در نهایت شما جواب رو انتخاب کنی یا خودت جواب رو بدی.

اینجوری هم همکاری بین دوستان زیاد خواهد شد هم حس یادگیری برانگیخته خواهد شد.

فرهاد خانلری

کاربر mdg2000 مهندس حسین احمدی Developer سایت itpro هستند و این روز ها سخت مشغول به روز رسانی نرم افزار سایتمون هستند و سرشون شلوغه .

شکیبا باشید.

mdg2000

مهندس جان چرا ادامه نمیدی؟

mhrnia

سلام

اولین باره دارم با برنامه سی شارپ کار میکنم (خواهشا راهنماییی کنید)

برنامه ای طول عرض مستطیلی ومربعی را خوانده محیط ومساحت مستطیل ومربع رامحاسبه می کند ؟؟؟؟؟؟

آیا برای مستطیل ومربع برنامه جداگانه ای بنوسیم ؟؟؟

حسین احمدی

سلام دوست عزیز، لطفاً سوالتون رو در قالب یک سوال مطرح کنید.

mhrnia

این توسط mhrnia در تاریخ يكشنبه, 6 دی 1394 حذف شده است.

Reason: .

انجام دادم نشد میشه راهنمایی کنید!!

maverick

سلام .

میشه قطعه کد مقایسه دو آرایه یک بعدی که هر کدام 5خانه دارند رو بنویسید

یعنی تک تک خانه ها رو با هم مقایسه کنه و هر دو از نوع int هستند

یعنی اگه مثلا خانه 1 اولی با خانه 3 دومی برابر بود یه عمل دیگه انجام بده و اگه خانه مثلا 2 اولی با 2 دومی برابر بود یه کار دیگه انجام بده.

محمد محرابی

چند مثال

مثال 1. در مثال زیر ابتدا آرایه ای با استفاده از حلقه for با مقادیری پر میشود؛ سپس با استفاده از حلقه foreach مقادیر داخل آرایه در خروجی چاپ میشود.

            int sum = 0;
            int[] nums = new int[10]; // تعریف آرایه با 10 خانه

            // پرکردن آرایه
            for (int i = 0; i < 10; i++)
                nums[i] = i;

            Console.WriteLine("use foreach to display and sum the values");

            // چاپ مقادیر داخل آرایه در خروجی
            foreach (int x in nums)
            {
                Console.WriteLine("Value is: " + x);
                sum += x; // در هر دور از حلقه مقدار هر خانه از آرایه با مقادیر قبل جمع میشود
            }

            Console.WriteLine("Summation: " + sum); // نمایش مجموع مقادیر داخل آرایه 

خروجی

use foreach to display and sum the values
Value is: 0
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Value is: 6
Value is: 7
Value is: 8
Value is: 9
Summation: 45

مثال 2. یک آرایه دوبعدی تعریف میشود سپس با استفاده از دو حلقه از مقادیر پر میشود. سپس با استفاده از حلقه foreach مقدار هر درایه از مارتیس (آرایه 3x5) در خروجی چاپ میشود. مجموع درایه ها نیز محاسبه و چاپ میشود.

    int sum = 0; 
    int[,] nums = new int[3,5]; 
 
    for(int i = 0; i < 3; i++)  
      for(int j=0; j < 5; j++) 
        nums[i,j] = (i+1)*(j+1); 
 
    foreach(int x in nums) { 
      Console.WriteLine("Value is: " + x); 
      sum += x; 
    } 
    Console.WriteLine("Summation: " + sum); 

خروجی

Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Value is: 2
Value is: 4
Value is: 6
Value is: 8
Value is: 10
Value is: 3
Value is: 6
Value is: 9
Value is: 12
Value is: 15
Summation: 90

مثال 3. جستجو در آرایه با استفاده از حلقه foreach.

در مثال زیر مقدار 5 در آرایه سرچ میشود و در صورتی که یافت شد متغیر found که با مقدار false از قبل پر شده بود با مقدار جدید true مقدار دهی میشود و با بررسی شرط و انجام دستور داخل شرط (break) از بدنه حلقه خارج میشود. سپس چون مقدار متغیر true است با شرط آخر برنامه مقدار Value found! در خروجی چاپ خواهد شد.

    int[] nums = new int[10]; 
    int val; 
    bool found = false; 
 
    for(int i = 0; i < 10; i++)  
      nums[i] = i; 
 
    val = 5; 
 
    foreach(int x in nums) { 
      if(x == val) { 
        found = true; 
        break; 
      } 
    } 
 
    if(found)  
      Console.WriteLine("Value found!"); 

خروجی

Value found!
hoseinsalime

خروجی روی تکست باکس-یا روی فرم چاپ شه

int[,] matrix = new int[9,9];

for (int col = 0; col < 9; col++)

{

for (int row = 0; row < 9; row++)

{

matrix[col, row] = (col + 1)*(row + 1);

}

}

for (int col = 0; col < 9; col++)

{

for (int row = 0; row < 9; row++)

{

Console.Write(matrix[col, row] + "\t");

}

Console.WriteLine();

}

zahra .m

سلام استاد.وقت بخیر

در آرایه های نامنظم میشه از دو نوع داده مختلف برای هر گروه آرایه استفاده کرد؟

حسین احمدی

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

var objs = new object[10];
objs[0] = new int[] { 4, 5, 7, 1 };
objs[1] = new string[] { "Item1", "Item2" };
zahra .m

متشکرم استاد!

azad1000

من میخام به یک آرایه دو بعدی مقدار دهی کنم که دو بعد اون از یک نوع نیستند.

مثلا یک بعد اسامی دانشجویان و یک بعد معدل اونهاست و بعد میخام دانشجوها رو طبق معدلشون کلاس بندی کنم.

چطور باید مقداردهی رو انجام بدم؟

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

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