آرایه ها
آرایه، نوعی متغیر است که، لیستی از آدرسهای مجموعهای از دادههای هم نوع را، در خود ذخیره میکند. تعریف چندین متغیر از یک نوع برای هدفی یکسان بسیار خسته کننده است. مثلاً اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها استفاده کنید. مطمئناً تعریف این همه متغیر بسیار کسالت آور و خسته کننده است. اما با استفاده از آرایه میتوان همه آنها را در یک خط تعریف کرد. در زیر راهی ساده برای تعریف یک آرایه نشان داده شده است :
var arrayName = [datatype]()
arrayName که نام آرایه را نشان میدهد. Datatype نوع دادههایی را نشان میدهد که آرایه در خود ذخیره میکند. کروشه که نوع داده در داخل آن قرار میگیرد و نشان دهنده استفاده از آرایه است و در نهایت علامتهای باز و بسته پرانتز که در ادامه در مورد آنها توضیح میدهیم. هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد. به عنوان مثال برای نامگذاری آرایهای که اعداد را در خود ذخیره میکند. برای مثال، فرض کنید میخواهیم یک آرایه تعریف کنیم که مقادیر صحیح را در خود ذخیره کند:
var numbers = [Int] ()
در کد بالا ما یک آرایه خالی تعریف کردهایم که قرار است اعداد صحیح را در خود ذخیره کند. حال چطور مقادیرمان را به این آرایه اضافه کنیم؟ برای این منظور از عملگر =+ استفاده میکنیم:
numbers += [1] numbers += [2] numbers += [3] numbers += [4] numbers += [5]
همانطور که در کد بالا مشاهده میکنید بعد از عملگر =+، مقادیری که قرار است به آرایه اضافه شوند را، در داخل کروشه مینویسیم. توجه کنید که هر عنصر از آرایه دارای یک اندیس است. اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود. به عنوان مثال شما یک آرایه 5 عضوی دارید، اندیس آرایه از 0 تا 4 میباشد چون طول آرایه 5 است پس 1-5 برابر است با 4. این بدان معناست که اندیس 0 نشان دهنده اولین عضو آرایه است و اندیس 1 نشان دهنده دومین عضو و الی آخر. برای درک بهتر مثال بالا به شکل زیر توجه کنید :
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید. کسانی که تازه شروع به برنامه نویسی کردهاند معمولاً در گذاشتن اندیس دچار اشتباه میشوند و مثلاً ممکن است در مثال بالا اندیسها را از 1 شروع کنند. اگر بخواهید به یکی از اجزائ آرایه با استفاده از اندیسی دسترسی پیدا کنید که در محدوده اندیسهای آرایه شما نباشد با پیغام خطای Index out of range مواجه میشوید و بدین معنی است که شما آدرسی را میخواهید که وجود ندارد. یکی دیگر از راههای تعریف سریع و مقدار دهی یک آرایه به صورت زیر است :
var arrayName: [datatype] = [val1, val2, ..., valN]
در این روش شما میتوانید فوراً بعد از تعریف اندازه آرایه مقادیر را در داخل کروشه قرار دهید. به یاد داشته باشید که هر کدام از مقادیر را با استفاده از کاما از هم جدا کنید. به مثال زیر توجه کنید :
var numbers: [Int] = [ 1, 2, 3, 4, 5 ]
این مثال با مثال قبل هیچ تفاوتی ندارد و تعداد خطهای کدنویسی را کاهش میدهد. شما میتوانید با استفاده از اندیس به مقدار هر یک از اجزاء آرایه دسترسی یابید و آنها را به دلخواه تغییر دهید. یکی دیگر از راههای تعریف آرایه در زیر آمده است. شما میتوانید هر تعداد عنصر را که خواستید در آرایه قرار دهید بدون اینکه نوع آرایه را مشخص کنید. به عنوان مثال :
var numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
در این مثال ما 10 مقدار را به آرایه اختصاص دادهایم. روش دیگر برای تعریف آرایه به صورت زیر است:
var arrayname :[dataType] = Array(repeating: ... , count: ...)
در این روش بعد از علامت مساوی کلمه کلیدی Array را نوشته و در داخل پرانتزها از دو کلمه repeating و count استفاده میکنید. کلمه count، تعداد عناصر آرایه را مشخص میکند و کلمه repeating هم یک مقدار اولیه را در داخل عناصر آرایه قرار میدهد. به کد زیر توجه کنید:
var numbers :[Int] = Array(repeating: 0, count: 5)
کد بالا یک آرایه با نام number ایجاد کرده که دارای 5 خانه است و در داخل هر خانه هم عدد 0 قرار دارد:
[0, 0, 0, 0, 0]
حال چگونه به همچین آرایهای، مقادیری را که میخواهیم، اختصاص دهیم؟ به کد زیر توجه کنید:
1: var numbers :[Int] = Array(repeating: 0, count: 5) 2: 3: print("Element 4 before initialize : ", numbers[3]) 4: 5: numbers[0] = 1 6: numbers[1] = 2 7: numbers[2] = 3 8: numbers[3] = 4 9: numbers[4] = 5 10: 11: print("Element 4 after initialize : ", numbers[3])
Element 4 before initialize : 0 Element 4 after initialize : 4
در خط 1 کد بالا یک آرایه تعریف و تمام 5 خانه آن را با عدد صفر مقداردهی کردهایم. برای اطمینان در خط 3 مقدار هارمین عنصر را چاپ کردهایم. همانطور که در خروجی مشاهده میکنید، عدد 0 نمایش داده میشود. در ادامه و در خطوط 9-5، آرایه را با مقادیر جدید پر میکنیم. در این خطوط ابتدا نام آرایه و در داخل کروشه اندیس خانهای که قرار است مقداری را در داخل آن قرار دهیم، مینویسیم. سپس با استفاده از علامت = مقدار را به آن خانه اختصاص میدهیم. خانه چهارم آرایه که اندیس آن 3 است را با مقدار 4، مقداردهی و در خط 11 بار دیگر مقدار این خانه را چاپ میکنیم. مشاهده میکنید که در خروجی، عدد 4 نمایش داده میشود. یعنی شکل نهایی این آرایه به صورت زیر است:
1, 2, 3, 4, 5
دستیابی به مقادیر آرایه با استفاده از حلقه for
در زیر مثالی در مورد استفاده از آرایهها آمده است. در این برنامه 5 مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
1: var numbers :[Int?] = Array(repeating: 0, count: 5) 2: var total = 0 3: var average :Double 4: 5: for i in 0..<numbers.count 6: { 7: print("Enter a number: ", terminator:"") 8: numbers[i] = Int(readLine()!) 9: } 10: for i in 0..<numbers.count 11: { 12: total += numbers[i]! 13: } 14: 15: average = Double(total / numbers.count) 16: 17: print("Average = \(average)", terminator:"")
Enter a number: 90 Enter a number: 85 Enter a number: 80 Enter a number: 87 Enter a number: 92 Average = 86
در خط 1 یک آرایه تعریف شده است که میتواند 5 عدد صحیح را در خود ذخیره کند. هنگام تعریف این آرایه از علامت ? استفاده کردهایم و با این کار به برنامه می گوییم که ممکن است در ادامه یا در هنگام اجرای برنامه مقادیری را به خانههای آرایه که همه با 0 پر شدهاند، اختصاص دهیم. خطوط 2 و 3 متغیرهایی تعریف شدهاند که از آنها برای محاسبه میانگین استفاده میشود. توجه کنید که مقدار اولیه total صفر است تا از بروز خطا هنگام اضافه شدن مقدار به آن جلوگیری شود. در خطوط 5 تا 9 یک حلقه for برای تکرار و گرفتن ورودی از کاربر تعریف شده است. کلاً کار این حلقه این است که مقادیر را از کاربر میگیرد و در داخل خانههای آرایه قرار میدهد. از خاصیت count آرایه برای تشخیص تعداد اجزای آرایه استفاده میشود. اگر چه میتوانستیم به سادگی در حلقه for مقدار 5 را برای شرط قرار دهیم ولی استفاده از خاصیت count آرایه کار راحتتری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه for با تغییر جدید هماهنگ میشود. در خط 8 ورودی دریافت شده از کاربر به نوع Int تبدیل و در آرایه ذخیره میشود. اندیس استفاده شده در number (خط 8) مقدار i جاری در حلقه است. برای مثال در ابتدای حلقه مقدار i صفر است بنابراین وقتی در خط 8 اولین داده از کاربر گرفته میشود، اندیس آن برابر صفر میشود. در تکرار بعدی i یک واحد اضافه میشود و در نتیجه در خط 8 و بعد از ورود دومین داده توسط کاربر اندیس آن برابر یک میشود. این حالت تا زمانی که شرط در حلقه for برقرار است ادامه مییابد. در خطوط 13-10 از حلقه for دیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده است. در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده به عنوان اندیس استفاده میکنیم.
هر یک از اجزای عددی آرایه به متغیر total اضافه میشوند. بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط 15). مقدار total را بر تعداد اجزای آرایه (تعداد عددها) تقسیم میکنیم. برای دسترسی به تعداد اجزای آرایه میتوان از خاصیت count آرایه استفاده کرد. توجه کنید که در خط 15 ما حاصل عبارت را به نوع Double تبدیل کردهایم بنابراین نتیجه عبارت یک مقدار از نوع double خواهد شد و دارای بخش کسری میباشد. حال اگر عملوندهای تقسیم را به نوع Double تبدیل نکنیم نتیجه تقسیم یک عدد از نوع صحیح خواهد شد و دارای بخش کسری نیست. خط 17 مقدار میانگین را در صفحه نمایش چاپ میکند. طول آرایه بعد از مقدار دهی نمیتواند تغیر کند. به عنوان مثال اگر یک آرایه را که شامل 5 جز است مقدار دهی کنید دیگر نمیتوانید آن را مثلاً به 10 جز تغییر اندازه دهید. البته تعداد خاصی از کلاسها مانند آرایهها عمل میکنند و توانایی تغییر تعداد اجزای تشکیل دهنده خود را دارند. آرایهها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور از آنها استفاده کنید بسیار مهم است.