آرايه

جمعه ، 28 مرداد 1390 ، 11:34 مدیریت کل سایت
چاپ

به نام خدا

در این بخش موارد زیر را توضیح خواهیم داد:

آرایه

آدرس دهی در آرایه

مقدار دهی اولیه آرایه

پیدا کردن یک مقدار در آرایه

مرتب سازی آرایه ها

آرایه به عنوان پارامتر ورودی تابع

آرایه یک بعدی پویا

آرایه دو بعدی پویا

 

آرایه

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

در واقع وقتی تعداد متغیرها زیاد می شوند اگر به هر متغیر یک اسم اختصاص دهیم دسترسی به آن ها بسیار دشوار می شود. فرض کنید که 1000 متغیر از نوع int داریم و می خواهیم که مقدار آن را از کاربر بگیریم. به این منظور می بایست 1000 بار دستور گرفتن داده یا همان cin را بنویسیم و هر بار نام متغیر را عوض کنیم. اما اگر از آرایه استفاده کنیم تنها نوشتن یک دستور cin کافی است.

آرایه ها هر کدام دارای دو مولفه هستند. مولفه اول نام آرایه است که برای تمام متغیرها یکسان است و مولفه دوم اندیس هر متغیر است که باعث متمایز شدن هر متغیر از متغیر دیگر در یک آرایه می شود. اندیس هر آرایه را در [ ] قرار می دهند و اسم آرایه را نیز در قبل آن می آورند. اندیس خانه های آرایه از 0 شروع می شود و تا n-1 ادامه پیدا می کند که n تعداد خانه های آرایه است. شکل زیر بیانگر مفهوم آرایه است:

array1

که در آن a نام آرایه می باشد.

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

;[تعداد خانه های آرایه]    اسم آرایه     نوع داده

int a[1000];

باید توجه داشت که در سی پلاس پلاس تعداد خانه های یک آرایه حتما باید در هنگام تعریف مشخص شود و در حین استفاده نمی توان تعداد آن را تغییر داد. البته برای حل این مشکل دو راه وجود دارد: یکی استفاده از آرایه پویا و دیگری استفاده از بردار یا همان vector می باشد (بردار را در منوی کتابخانه ها و توابع آن توضیح داده ایم).

آرایه بالا همان طور که در شکل مشاهده می شود فقط دارای یک مولفه می باشد که به اصطلاح به آن یک بعدی می گویند. می توان در یک آرایه از چند مولفه استفاده کرد که برای مثال به آن آرایه 5 بعدی می گویند. برای تعریف آن مثل تعریف آرایه قبل استفاده می کنیم با این تفاوت که تعداد خانه های  هر مولفه را در [ ] می آوریم. برای مثال برای تعریف یک آرایه با اسم a به طوری که 3 بعدی باشد و تعداد خانه های بعد اول 10، تعداد خانه های بعد دوم 13 و تعداد خانه های بعد سوم 2 باشد و نوع داده ای آن از جنس کارکتر باشد به صورت زیر عمل می کنیم:

char a [10] [13] [2];

برای دسترسی به آن نیز کافی است که سه مولفه را در کنار نام آرایه بیاوریم. برای مثال برای مقدار دهی  به خانه ای از آرایه که دارای مولفه اول با اندیس 0 و مولفه دوم با اندیس 10 و مولفه سوم با اندیس 1 می باشد، عبارت زیر را می نویسیم:

a [0] [10] [1]='c';

 

آدرس دهی در آرایه

اسم آرایه در واقع آدرس اولین خانه از آرایه است و به بیان دیگر اسم آرایه یک اشاره گر است. یعنی اگر به تنهایی a را بیاوریم مقدار آن برابر با آدرس اولین خانه از آرایه می باشد. برای دسترسی به خانه های بعدی کافی است اندیس آن خانه را با اسم آرایه جمع کنیم. برای مثال آدرس خانه n ام در آرایه a برابر است با a+n.


 

مقدار دهی اولیه آرایه:

به طور کلی برای کار با آرایه از حلقه for استفاده می کنیم چراکه اندیس های یک آرایه شامل اعداد صحیح پشت سر هم هستند و برای دسترسی به آن ها بهترین کار استفاده از این نوع حلقه است. برای مقدار دهی اولیه آرایه کافی است در یک حلقه for با n بار تکرار که n تعداد خانه های آرایه است مقدار هر خانه را با مقداری که می خواهیم، مساوی قرار دهیم. برای مثال فرض کنید یک آرایه 100 تایی از جنس int داریم و می خواهیم مقدار دهی اولیه را طوری انجام دهیم که مقدار هر آرایه برابر با 2 برابر اندیس آن خانه باشد. به صورت زیر عمل می کنیم:

for(int i=0;i<100;i++){

a[i]=2*i;

}//end for i

 

در این حلقه i از 0 شروع می شود و تا 99 ادامه پیدا می کند. در هر بار اجرای حلقه 2 برابر اندیس آرایه یا همان i را در خانه ای از آرایه با اندیس i می ریزد.

اگر آرایه دو بعدی بود کافی است از دو حلقه for تو در تو و اگر سه بعدی بود از 3 حلقه تو دو تو و... استفاده کنیم. برای مثال برای مقدار دهی اولیه با مقدار صفر به تمام خانه های آرایه ای دو بعدی 20 در 10 به ترتیب زیر عمل می کنیم:

for(int i=0;i<20;i++){

for(int j=0; j<10;j++){

a [i] [j]=0;

}//end for j

}//end for i

 

 


پیدا کردن یک مقدار در آرایه

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

یک آرایه 20 تایی داریم. اندیس خانه از حافظه که برابر 198 است را پیدا کنید.

برای حل این مسئله یک متغیر به اسم index در نظر می گیریم و هر وقت مقدار آرایه برابر 198 شد، اندیس آن را در index می ریزیم.

 

int index;

for (int i=0; i<20; i++){
if ( a[i] ==198){

 index=i;
break;
 }//end if

}//end for i



در خط اول index را از نوع int تعریف کرده ایم. سپس در یک حلقه for شرط if را قرار داده ایم. و گفته ایم هر جا که مقدار آرایه برابر با 198 بود، اندیس آن خانه را در index بریز و سپس از حلقه با دستور break خارج شو. البته این حل کامل نیست چرا که اگر در یک آرایه دو بار عدد 198 را داشته باشیم این برنامه تنها اندیس خانه اول را نشان می دهد.

 


مرتب سازی آرایه ها:

منظور از مرتب سازی آرایه به این صورت است که خانه ای از آرایه که مقدار آن از خانه های دیگر بزرگ تر است دارای اندیس کمتری باشد. مثال آن مرتب سازی نمرات یک کلاس به ترتیب نزولی می باشد.

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

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

for (int i=0;i

for(int j=i+1;j

if(a[i] int temp=i;
i=j;
j=temp;
}//end if

 

در داخل if برای اینکه مقدار i از بین نرود از متغیر کمکی temp استفاده می شود. نکته دیگر این است که در حلقه for دوم نیازی نیست تمام خانه های آرایه چک شود. تنها کافی است خانه های بعدی آرایه با اندیس i با آن مقایسه شود.

 


آرایه به عنوان پارامتر ورودی تابع

همان طور که گفته شد اسم آرایه یک اشاره گر است. پس برای استفاده از آرایه در یک تابع  از روش فراخوانی تابع با اشاره گر ها استفاده می کنیم.

در تعریف تابع:

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

int f1 (int a[20]){...}

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

int f2 (int a[]){...}

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

int f3(int a[],int size){...}

در هنگام استفاده از تابع:

کافی است که اسم تابع را در پارامتر های ورودی بیاوریم. برای سه مثال بالا داریم:

int main(){

int b[20];

int c[100];

f1(b);

f2(c);

f3(c,100);

return 0;

}

 

 


آرایه یک بعدی پویا

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

برای ساختن آرایه پویا مثل ساختن متغیر پویا عمل می کنیم. برای مثال ابتدا تعداد خانه های آرایه را از کاربر می گیریم و آرایه ای با آن تعداد می سازیم:

int main(){

int n; //size of array

cin>>n;

int *a;

a = new int [n];

return 0;

}

 

 


آرایه دو بعدی پویا

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

int main(){
int **a;
int n,m;
cin >> n;
a = new int *[ n ];
cin>>m;
for ( int i = 0 ; i < n ; i++ )
a[ i ] = new int [ m];
return 0;
}//end programme

 

به علت این که آرایه دو بعدی است از دو عدد * استفاده می کنیم. ابتدا بعد اول را به صورتی که نشان داده شده از جنس پویا معرفی می کنیم و سپس با یک حلقه for برای هر اندیس از بعد اول آرایه ی پویای دو بعدی می سازیم. این آرایه که در ماتریس ها و... کاربرد زیادی دارد m در n می باشد.

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

آخرین بروز رسانی مطلب در شنبه ، 25 خرداد 1392 ، 01:49