به آموزش زبان C (قسمت دوم – آرایه ها) خوش اومدید.
بازبینی اول : در تاریخ ۹۹/۱۱/۰۷ انجام شد!
آرایه ها:
آرایه ها متغیرهای ویژه ای هستند که می توانند بیش از یک متغیر را تحت نام یک نوع متغیر در خود نگه دارند. مثلا شما میتونید ۱۰ تا متغیر از نوع int را درون یک آرایه تعریف و نگهداری کنید. که توسط یک ایندکس [] تعداد آنها مشخص می شود مثال زیر یک آرایه است:
/* defines an array of 10 integers */
int numbers[10];
عدد ۱۰ در بالا تعداد متغیرهای آرایه را مشخص می کند که ۱۰ عدد است. یعنی ما ۱۰ متغیر از نوع int در این آرایه داریم. حالا فرض کنید می خواهیم به متغیرهای درون این آرایه دسترسی داشته باشیم. باید چه کار کنیم؟ برای این کار کافیست شماره متغیر را صدا بزنیم.
نکته مهم: متغیرهای درون آرایه از شماره صفر تا یکی کمتر از تعداد متغیرهای آرایه شمارش می شوند. یعنی برای دسترسی به اولین متغیر آرایه بالا باید شماره ۰ (صفر) را بخوانیم و برای دسترسی به آخرین متغیر باید شماره ۹ را بخوانیم. حالا فرض کنید می خواهیم تک تک متغیرها را صدا بزنیم و آنها را مقدار دهی کنیم و بعد یک متغیر از آرایه را در خروجی چاپ کنیم به کد زیر توجه کنید:
int numbers[10];
/* populate the array */
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
numbers[5] = 60;
numbers[6] = 70
numbers[7] = 80
numbers[8] = 90
numbers[9] = 100;
/* print the 7th number from the array, which has an index of 6 */
printf("The 7th number in the array is %d", numbers[۶]);
مشخص است که در متغیر های بالا ما چیزی با عنوان numbers[10] نداریم!
تذکر: آرایه ها فقط باید به صورت یک نوع متغیر تعریف شوند یعنی باید همه متغیرهای یک آرایه دارای نوع یکسان باشند. زیرا متغیرهای یک آرایه به صورت دنباله ای از مقادیر در حافظه میکروکنترلر یا کامپیوتر تعریف می شوند که همین کار باعث شده دسترسی به یک آرایه در حافظه خیلی کارآمد و سریع باشد.
تمرین:
به تکه کد زیر توجه کنید، آیا می تونید اشکال اون را پیدا کنید و اصلاح نمائید؟
#include
int main() {
/* TODO: define the grades variable here */
int average;
grades[0] = 80;
/* TODO: define the missing grade
so that the average will sum to 85. */
grades[2] = 90;
average = (grades[0] + grades[1] + grades[2]) / 3;
printf("The average of the 3 grades is: %d", average);
return 0;
}
جواب: کد بالا یک میانگین گیر است که میانگین سه عدد را محاسبه می کند اما این کد دارای دو اشکال اساسی است:
اول اینکه آرایه grades تعریف نشده است.
دوم اینکه متغیر grades[1] مقدارش مشخص نیست.
حالا فرض کنیم که می خواهیم میانگین ۳ عدد برابر ۸۵ شود در این صورت باید عدد grades[1] برابر ۸۵ باشد. تا میانگین ۳ عدد برابر ۸۵ شود.
پس کد صحیح به شکل زیر خواهد بود:
#include <stdio.h>
int main() {
/* TODO: define the grades variable here */
int grades[3];
int average;
grades[0] = 80;
/* TODO: define the missing grade
so that the average will sum to 85. */
grades[1] = 85;
grades[2] = 90;
average = (grades[0] + grades[1] + grades[2]) / 3;
printf("The average of the 3 grades is: %d", average);
return 0;
}
نکته: همانطور که ملاحظه می کنید آرایه grades از نوع int تعریف شده است. زیرا همه متغیرهای آن از نوع عددی هستند.
آرایه های چندبعدی:
در بخش قبل ما با آرایه های تک بعدی آشنا شدیم. یعنی تنها یک رشته اعداد درون یک آرایه قرار می گرفتند. اما زبان C قابلیت این را دارد که بتوان چند رشته متغیر یا چند رشته عدد یا کاراکتر را درون یک آرایه تعریف کرد که به این آرایه ها، آرایه های چند بعدی گفته می شود.
فرم کلی آرایه های چند بعدی به صورت زیر تعریف می شود:
type name[size1][size2]...[sizeN];
که در آن چند رشته با سایز های مختلف وجود دارد.مثل مثال زیر:
int foo[۱][۲][۳];
و یا مثال زیر:
char vowels[۱][۵] = {
{'a', 'e', 'i', 'o', 'u'}
};
آرایه های چند بعدی خیلی شبیه ماتریس ها هستند که دارای سطر و ستون می باشند. در ادامه با آن ها بیشتر آشنا می شویم:
آرایه دو بعدی:
ساده ترین فرم آرایه های چند بعدی آرایه دو بعدی است. درواقع آرایه دو بعدی شامل یک لیست از آرایه های تک بعدی است. برای تعیین کردن یک آرایه از نوع integer دو بعدی به صورت زیر آن را باید تعریف کرد:
type arrayName [x][y];
که در آن نوع type می تواند از جنس هر نوع متغیری مانند (int, char, long, long long, double,…) باشد. و arrayName هم می تواند یک اسم دلخواه استاندارد در زبان C باشد. در واقع یک آرایه دو بعدی می تواند به عنوان یک جدول در نظر گرفته شود که دارای تعداد [x] سطر و تعداد [y] ستون است. به طور مثال یک آرایه دو بعدی با سه سطر و چهار ستون به صورت زیر خواهد بود:
در این حالت هر المان در آرایه a به صورت فرم a[i][j] تعریف می شود،که a نام آرایه است و i و j ایندکس های یکتا برای تعیین المان ها هستند که هر عضو آرایه a را مشخص می کنند.
نکته: شما لازم نیست حتما تعداد یا سایز سطرها را تعیین کنید به مثال زیر توجه کنید:
char vowels[][۵] = {
{'A', 'E', 'I', 'O', 'U'},
{'a', 'e', 'i', 'o', 'u'}
};
در واقع در مثال بالا تعداد سطرها برابر ۲ است اما اگر تعداد آن را نیز مشخص نکنید کامپایلر ایراد نمی گیرد.
تعریف آرایه های دوبعدی:
در مثال زیر یک آرایه دو بعدی با ۳ سطر و ۴ ستون را می بینید. برای اینکه آن را ساده تر تعریف کنید می توان عدد ۳ را نیز خالی بزارید و فقط تعداد ستون ها را مشخص کنید:
int a[۳][۴] = {
{۰, ۱, ۲, ۳} , /* initializers for row indexed by 0 */
{۴, ۵, ۶, ۷} , /* initializers for row indexed by 1 */
{۸, ۹, ۱۰, ۱۱} /* initializers for row indexed by 2 */
};
اما به فرمت تعریف زیر نیز نگاه کنید:
int a[3][4] = {۰,۱,۲,۳,۴,۵,۶,۷,۸,۹,۱۰,۱۱};
به نظر شما این تعریف درست است؟
در واقع این فرم نیز شبیه فرم قبلی است و درست است. زیر کامپایلر خود تعداد سطرها و ستون ها را طبق تعریف شما می سنجد و تعیین می کند.
نحوه دسترسی به المان های آرایه دو بعدی:
هر المنت در آرایه دو بعدی با استفاده از ایندکس ها مشخص می شود به طور مثال آرایه a در مثال قبل را در نظر بگیرید فرض کنید ما می خواهیم به عدد ۱۰ از آرایه a دسترسی داشته باشیم. در این صورت باید آن ها فراخوانی کنیم.
int val = a[۲][۲];
اگه دقت کنید می بینید قوانین فراخوانی آرایه یک بعدی در اینجا نیز صادق است یعنی برای خواندن از صفر شروع می کنیم: یعنی سطر صفرم، سطر اول و سطر دوم. یعنی برای دسترسی به سطر سه جای ایندکس عدد ۲ را می زاریم.حالا اگر مقدار val را چاپ کنید عدد ۱۰ چاپ خواهد شد.
تمرین مهم:
بیائید یک تمرین جون دار را با هم انجام بدهیم:
در این تمرین می خواهیم معدل نمرات یک گروه ۵ نفره از دانش آموزان را در دو درس ریاضی و فیزیک بدست آوریم.
برای انجام این تمرین از دو آرایه دو بعدی به نام های grades استفاده می کنیم که نمرات متناظر با ریاضی در سطر اول ذخیره شده (grades[0]) و نمرات متناظر با در فیزیک در سطر دوم (grades[1]) ذخیره شده اند. برای انجام این تمرین مراحل زیر را انجام می دهیم:
۱- نمرات را در یک آرایه دو بعدی از اعداد قرار می دهیم
۲- با استفاده از یک حلقه for نمرات را جمع می کنیم
۳- میانگین یا معدل نمرات را در هر درس محاسبه می کنیم
حال سوال اینجاست: با توجه به مراحل بالا به نظر شما ایراد کد زیر در کجاست؟
#include <stdio.h>
int main() {
/* TODO: declare the 2D array grades here */
float average;
int i;
int j;
grades[0][0] = 80;
grades[0][1] = 70;
grades[0][2] = 65;
grades[0][3] = 89;
grades[0][4] = 90;
grades[1][0] = 85;
grades[1][1] = 80;
grades[1][2] = 80;
grades[1][3] = 82;
grades[1][4] = 87;
/* TODO: complete the for loop with appropriate terminating conditions */
for (i = 0; i < ; i++) {
average = 0;
for (j = 0; j < ; j++) {
average += grades[i][j];
}
/* TODO: compute the average marks for subject i */
printf("The average marks obtained in subject %d is: %.2f\n", i, average);
}
return 0;
}
جواب:
اگر با دقت به کد بالا نگاه کنید متوجه می شوید که آرایه دو بعدی تعریف نشده است. پس باید آن را به صورت زیر تعریف نموده تا کد نوشته شده به درستی کار کند:
#include <stdio.h>
int main() {
int grades[2][5];
float average;
int i;
int j;
grades[0][0] = 80;
grades[0][1] = 70;
grades[0][2] = 65;
grades[0][3] = 89;
grades[0][4] = 90;
grades[1][0] = 85;
grades[1][1] = 80;
grades[1][2] = 80;
grades[1][3] = 82;
grades[1][4] = 87;
for (i = 0; i < 2; i++) {
average = 0;
for (j = 0; j < 5; j++) {
average += grades[i][j];
}
average /= 5.0;
printf("The average marks obtained in subject %d is: %.2f\n", i, average);
}
return 0;
}
تحلیل کد:
اجازه دهید کد نوشته شده برای تمرین بالا را تحلیل کنیم:
خب در ابتدای کد یک آرایه دو بعدی را مشاهده می کنید با نام int grades[2][5] که یعنی آرایه از نوع integer یا عدد صحیح بوده و دارای دو سطر و پنج ستون است. عدد ۲ تعداد درسها (درس ریاضی و فیزیک) و عدد ۵ نمرات ۵ دانش آموز.
متغیر float average قرار است میانگین نمرات را نشان دهد و چون میانگین ممکن است عدد اعشاری باشد پس به صورت متغیر float تعریف می شود.
دو متغیر i و j از نوع int بوده و قرار است در حلقه for استفاده شوند (نگران عدم آشنایی با حلقه for نباشید زیر در مباحث بعدی بررسی خواهند شد.)
در مرحله بعد تمام متغیرهای آرایه دو بعدی عدد گذاری شده اند که همان نمرات دانش آموزان می باشند.
اما در ادامه دو حلقه for مشاهده می شود که حلقه اول به تعداد سطرها تکرار می شود (۲ سطر) و حلقه دوم به تعداد ستون ها تکرار می شود. در واقع روند کار اینجوریه که همه نمرات سطر اول با هم جمع می شوند به وسیله معادله average += grades[i][j] و سپس تقسیم بر تعداد می شوند به وسیله معادله average /= 5.0 تا میانگینشون بدست بیاد و سپس توسط دستور printf معدل یا میانگین نمرات هر درس بدست میاد.
ممکن است بعضی عبارات در این کد نا مفهوم باشد! ولی اصلا نگران نباشید در این تمرین هدف فقط آشنایی با آرایه دو بعدی می باشد
پایان آموزش زبان C (قسمت دوم – آرایه ها)