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

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

var array_name = [ [value1,value2,value3], [val1,val2,val3] ] 

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

var numbers = [
                [ 1,  2,  3,  4,  5],
                [ 6,  7,  8,  9, 10],
                [11, 12, 13, 14, 15]
              ];

در کد بالا یک آرایه به نام numbers تعریف شده است که دارای سه عنصر است. البته هر کدام از این عناصر خود یک آرایه می باشند. یعنی آرایه numbers آرایه ای است از 3 آرایه. هر کدام از این آرایه ها هم 5 عنصر دارند. پس می توان گفت که آرایه numbers در واقع یک جدول با 3 سطر و 5 ستون می باشد. می‌توان مقدار دهی به عناصر را به صورت دستی انجام داد مانند :

numbers = [Array.new(5), Array.new(5), Array.new(5)]

numbers[0][0] =  1
numbers[0][1] =  2
numbers[0][2] =  3
numbers[0][3] =  4
numbers[0][4] =  5
numbers[1][0] =  6
numbers[1][1] =  7
numbers[1][2] =  8
numbers[1][3] =  9
numbers[1][4] = 10
numbers[2][0] = 11
numbers[2][1] = 12
numbers[2][2] = 13
numbers[2][3] = 14
numbers[2][4] = 15

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

گردش در میان عناصر آرایه‌های چند بعدی

گردش در میان عناصر آرایه‌های چند بعدی نیاز به کمی دقت دارد. یکی از راههای آسان استفاده از حلقه for…in تو در تو است. به مثال زیر توجه کنید:

 1: nestedArray = [
 2:     [1, 2, 3, 4, 5     ],
 3:     [6, 7, 8, 9, 10    ],
 4:     [11, 12, 13, 14, 15]
 5: ]
 6: 
 7: for array in nestedArray
 8:   for number in array
 9:     print "#{number} "
10:   end
11:   puts
12: end
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

گردش در میان مقادیر عناصر یک آرایه چند بعدی خیلی راحت است. حلقه for…in اول (خطوط 12-7) برای گردش در میان عناصر آرایه اصلی یعنی numbers و حلقه for…in دوم (خطوط 10-8) برای گردش در میان عناصر آرایه های عضو، به کار رفته است. یعنی حلقه اول ابتدا وارد سطر اول می شود و فورا حلقه دوم در میان ستون های این سطر گردش می کند و مقادیر داخل آنها را چاپ می کند، سپس حلقه for اول وارد دومین سطر می شود و … . بعد از اینکه دومین حلقه تکرار به پایان رسید، فوراً دستورات بعد از آن اجرا خواهند شد، که در اینجا دستور puts است که به برنامه اطلاع می‌دهد که یک خط جدید ایجاد کند. حال بیایید آنچه را از قبل یاد گرفته‌ایم در یک برنامه به کار بریم. این برنامه نمره چهار درس مربوط به سه دانش آموز را از ما می‌گیرد و معدل سه دانش آموز را حساب می‌کند.

 1: studentGrades = [
 2:     Array.new(4),
 3:     Array.new(4),
 4:     Array.new(4)
 5: ]
 6: 
 7: student = 0
 8: while student < studentGrades.length
 9:   puts "Enter grades for Student #{student + 1}"
10:   
11:   total  = 0
12:   grade  = 0
13:   while grade < studentGrades[student].length
14:     print "Enter Grade ##{grade + 1}: "
15:     studentGrades[student][grade] = gets.to_f
16:     total += (studentGrades[student][grade]).to_f
17:     grade += 1
18:   end
19: 
20:   puts "Average is: #{(total / (studentGrades[student].length))}\n\n"
21:   student += 1
22: end
Enter grades for Student 1
Enter Grade #1: 92
Enter Grade #2: 87
Enter Grade #3: 89
Enter Grade #4: 95
Average is 90.75

Enter grades for Student 2
Enter Grade #1: 85
Enter Grade #2: 85
Enter Grade #3: 86
Enter Grade #4: 87
Average is 85.75

Enter grades for Student 3
Enter Grade #1: 90
Enter Grade #2: 90
Enter Grade #3: 90
Enter Grade #4: 90
Average is 90.00

در برنامه بالا یک آرایه دو بعدی بعدی تعریف شده است (خط 5-1). برای درک بهتر آرایه و برنامه به کد زیر توجه کنید:

            Grade 1     Grade 2     Grade 3     Grade 4

Student 1     92          87          89          95

Student 2     85          85          86          87

Student 3     90          90          90          90

برای پیمایش جدول بالا، که سطرهای آن را دانش آموزان و ستون های آن را نمرات دانش آموزان تشکیل می دهند باید از یک حلقه تو در تو استفاده کنیم (خط 22-7). در اولین حلقه while یک متغیر به نام student تعریف کرده‌ایم که تعداد دانش آموزان یا تعداد سطرها در آن قرار می‌گیرد (خط 7). از خاصیت length برای تشخیص تعداد دانش آموزان استفاده شده است. در اینجا lenght عدد 3 را به ما می دهد. وارد بدنه حلقه while می‌شویم. یک متغیر به نام total تعریف می‌کنیم که جمع نمرات وارد شده برای دانش آموز در آن قرار می‌گیرد (خط 11). یک متغیر هم تعریف کرده ایم که تعداد نمرات دانش آموزان را در خود ذخیره می کند (خط 12). سپس برنامه یک پیغام را نشان می‌دهد و از شما می‌خواهد که نمرات دانش آموز را وارد کنید (student + 1). عدد 1 را به student اضافه کرده‌ایم تا به جای نمایش Student 0، با Student 1 شروع شود، تا طبیعی‌تر به نظر برسد (خط 12).

سپس به دومین حلقه while در خط 13 می‌رسیم. وظیفه این حلقه گردش در میان ستون ها، که همان نمرات دانش آموز است، می‌باشد. برنامه چهار نمره مربوط به دانش آموز را می‌گیرد. هر وقت که برنامه یک نمره را از کاربر دریافت می‌کند، نمره به متغیر total اضافه می‌شود (خط 16). وقتی همه نمره‌ها وارد شدند، متغیر total هم جمع همه نمرات را نشان می‌دهد. در خط 21 معدل دانش آموز نشان داده می‌شود. معدل از تقسیم کردن total (جمع) بر تعداد نمرات به دست می‌آید. از studentGrades[student].length هم برای به دست آوردن تعداد نمرات استفاده می‌شود.