Presentation is loading. Please wait.

Presentation is loading. Please wait.

آرايه ها.

Similar presentations


Presentation on theme: "آرايه ها."— Presentation transcript:

1 آرايه ها

2 آرايه ها آرايه مجموعه اي از عناصر همنوع است.
هر آرايه داراي نامي است كه مانند متغيرهاي معمولي نامگذاري ميشود آرایه یک مجموعه از محلهای متوالی حافظه است هر محل یک عنصر آرایه به شمار می رود. براي دسترسي به عناصر آرايه از متغيري بنام انديس (index) استفاده ميگردد. به همين دليل، آرايه را متغير انديس دار ميگويند. برای دسترسی به هر عنصر آرایه باید محل آنرا در آرایه بدانیم یعنی یک انديس به محل آن داشته باشیم.

3 تعريف آرايه يك بعدي نوع آرايه نام آرايه [طول آرايه];
در آرايه يك بعدي كه نام ديگر آن ليست است ميتوان با يك انديس به عناصر آن دست يافت. آرايه هاي يك بعدي در c++ به شكل زير تعريف ميشوند: نوع آرايه نام آرايه [طول آرايه]; نوع آرايه (element type) می تواند یکی از انواع داده اي قابل استفاده در زبان C++ باشد. نام آرايه (array name) براي دسترسي به عناصر آرايه مورد استفاده قرار ميگيرد و از قوانین اسم گذاری متغییرها پیروی می کند.. طول آرايه (number of elements) كه يك عدد ثابت صحيح مثبت است، تعداد عناصر آرايه را تعيين مينمايد. Example code available in code/arrays/arraydecls.cpp

4 تعريف متغير آرايه اي از نوع int با 6 عنصر
2 bytes Each int is 2 bytes arr[0] arr[1] arr[5] int arr[6];

5 دسترسي به عناصر آرايه در c++ عنصر اول هر آرایه با انديس صفر مشخص ميشود. توجه داشته باشيد كه عناصر آرايه در خانه هاي متوالي حافظه قرار دارند. پس، آخرین عنصر یک آرایه n عنصری در محل n-1 ام قرار دارد. لذا، اگر سعی کنید عنصر n ام را بخوانید با خطای اجرا مواجه خواهید شد. براي دسترسي به هر عنصر از انديس آن استفاده ميشود مثلاً x[2] = 5 عنصر دوم را برابر با 5 قرار ميدهد. x X[5] X[4] X[3] X[2] X[1] X[0]

6 ميزان حافظه و آدرس عناصر
ميزان حافظه اي كه به آرايه اختصاص داده ميشود به طريق زير محاسبه ميگردد: ميزان حافظه آرايه = (تعداد عناصر آرايه) × (طول نوع داده آرايه) اگر عنصر اول آرايه در آدرس A قرار داشته باشد و نوع داده‌‌ آرايه n بايت باشد. آدرس عنصر i ام از رابطه زير محاسبه ميشود: آدرس عنصر iام = A + n × i برای مشخص کردن انديس هر عنصر می توان از عبارات طبیعی زبان C++ استفاده کرد. x[17] , x[i+3] , x[a+b+c]

7 مثال: برنامه اي که با تعريف آرايه اي بطول 10 مقدار هر عنصر آرايه را برابر با انديس آن عنصر قرار دهد و سپس مجموع مربعات عناصر آرايه را محاسبه کرده و به خروجي ببرد

8 sum += array[i] * array[i];
void main() { int array[10] , i , sum = 0 ; for (i=0 ; i < 10 ; i++) array[i] = i; sum += array[i] * array[i]; printf(“ the sum square of array: %d “ , sum); getch(); } the sum square of array: 285

9 مثال: برنامه اي که معدل 5 دانشجو را از ورودي گرفته، در آرايه اي قرار دهد و بيشترين معدل و محل وجود آن را پيدا کرده و به خروجي ميبرد

10 void main() { const int n=5; float ave[n]; int i , p ; for (i=0 ; i < n ; i++) printf( “Enter an average:”); scanf( “%f” , &ave[i]); } p = 0; for (i=1 ; i < n ; i++) if (ave[i] > ave[p] ) p = i; printf(“\n max = %5.2f, position = %d” , ave[p] , p+1); getch(); Enter an average: 12 Enter an average: 15 Enter an average: 17 Enter an average: 16 max = , position = 4

11 جهت تسلط به بحث آرايه ها بايد موارد زير مورد توجه قرار گيرند:
الف) تعريف يك آرايه ب) نحوه دستيابي به يك المان از آرايه ج) نحوه مقداردهي اوليه آرايه د) نحوه ارسال آرايه به تابع ه) چند كاربرد از آرايه ها

12 مقدار دهي اوليه به آرايه ها
می توان آرایه ها را هنگام تعریف آنها مقدار دهی اولیه نیز کرد. int iArray[5] = { 1,8,3,6,12}; double dArray[2] = { 0.707, 0.707}; char s[] = { 'R', 'P', 'I' }; اگر آرایه را مقدار دهی اولیه کنید نیازی به مشخص کردن سایز آرایه نیست. در مثال فوق طول آرايه s برابر با 3 در نظر گرفته ميشود

13 آرايه يک بعدي بعنوان آرگومان تابع
اگر آرايه بعنوان آرگومان تابع باشد، پارامتر معادل آن به سه صورت زير تعريف ميشود: 1- آرايه اي با طول مشخص 2- آرايه اي با طول نامشخص که در اينصورت بهتر است طول آرايه نيز بعنوان آرگوماني ديگر منتقل شود 3- استفاده از اشاره گر که مشابه به آرايه با طول نامشخص است

14 مثال: چاپ يك آرايه در خروجي
می توان آرایه را به این صورت به تابع فرستاد و نیازی به مشخص کردن سایز آرایه نیست void print_array (int arr[], int len) { for (int i=0;i<len;i++) printf( " Arr[%d] = %d\n" , i , arr[i] ); } void main() int test[4]={1,5,7,4}; print_array (test , 4); Arr[0]= 1 Arr[1]= 5 Arr[2]= 7 Arr[3]= 4 On the course home page in code/arrays/printarray.cpp

15 تمرين برنامه اي که تعداد 10 عدد صحيح را از ورودي ميخواند و ابتدا اعداد منفي و سپس اعداد مثبت را به خروجي ميبرد تعداد اعداد مثبت و منفي را نيز مشخص ميکند برنامه اي بنويسيد که تعداد 5 عدد از ورودي خوانده و سپس آنها را به ترتيب معکوس درون آرايه ديگري کپي کند نتيجه را نيز در خروجي نمايش دهد

16 مرتب سازي آرايه ها اعمال مرتب سازي و جستجو، عمومي ترين اعمالي هستند كه در برنامه نويسي انجام ميشوند. اگر يك ليست مرتب باشد در اينصورت عمليات جستجو سريعتر انجام ميگيرد مرتب سازي آرايه ها به دو صورت صعودي و نزولي انجام ميگيرد. مرتب سازي صعودي: x[0] < x[1] < x[2] <…<x[n] مرتب سازي نزولي: x[0] > x[1] > x[2] >…>x[n]

17 مرتب سازي حبابي اين روش مرتب سازي بسيار ساده و قابل درك ميباشد
در اين روش، بايد چندين مرتبه در طول آرايه حركت نمود و دوبه دوي عناصر با هم مقايسه ميشوند و در صورت لزوم جاي عناصر با هم عوض ميشود.

18 مرتب سازي حبابي يك آرايه
void bubble (int arr[] , int len) { int i,j,tmp; for (i=0 ; i<len-1 ; i++) for (j=i+1 ; j < len ; j++) if (arr[i]>arr[j]) tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } void main() int test[4]={1,5,7,4}; bubble (test , 4); print_array (test , 4); 1 4 5 7 On the course home page in code/arrays/printarray.cpp

19 جستجوي يك مقدار در آرايه جستجوي ترتيبي
اين تابع در آرايه حركت كرده اگر به مولفه مساوي با مورد جستجو برسد انديس آن و در غير اينصورت عدد منفي برميگرداند. int lsearch (int arr[] , int len, int val) { for (int i=0;i<len;i++) if (arr[i] == val) return i; return -1; } On the course home page in code/arrays/printarray.cpp

20 50 4 5 8 30 12 20 11 3 9 x[9] x[8] x[7] x[6] x[5] x[4] x[3] x[2] x[1] x[0] x lsearch(x , 10 , 5) int lsearch (int arr[] , int len, int val) { for (int i=0;i<len;i++) if (arr[i] == val) return i; return -1; }

21 جستجوي يك مقدار در آرايه (ادامه...) جستجوي دودويي
اين جستجو در آرايه مرتب انجام ميشود int bsearch (int arr[] , int len, int val) { int mid , low = 0 , high = len -1; while (low<=high) mid = (low+high)/2; if (arr[mid] == val) return mid; else if (arr[mid] > val) high = mid-1; else low = mid+1; } return -1; On the course home page in code/arrays/printarray.cpp

22 50 4 9 8 30 12 20 11 3 5 x[9] x[8] x[7] x[6] x[5] x[4] x[3] x[2] x[1] x[0] x 50 30 20 12 11 9 8 5 4 3 low mid high bsearch(x , 10 , 4)

23 آرايه هاي چند بعدي می توان آرایه ای از آرایه ها درست کرد
در c++ آرايه هايي با بيش از يك بعد ميتوان درست كرد ولي اغلب برنامه نويسان از آرايه هاي 2 بعدي استفاده ميكنند. تعريف يك آرايه 2 بعدي به شكل زير انجام ميگيرد نوع آرايه نام آرايه [تعداد سطرها][تعداد ستونها]; يك آرايه n بعدي به شكل زير تعريف ميگردد. نوع آرايه نام آرايه [بعد 1] [بعد 2]…[nبعد ];

24 موقعيت عناصر آرايه در يك آرايه 2 بعدي
int A[4][3] Col 0 Col 1 Col 2 Row 0 A[0][0] A[0][1] A[0][2] Row 1 A[1][0] A[1][1] A[1][2] Row 2 A[2][0] A[2][1] A[2][2] Row 3 A[3][0] A[3][1] A[3][2]

25 موقعيت عناصر آرايه دو بعدي در حافظه
A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2] A[2][0] A[2][1] A[2][2] A[3][0] A[3][1] A[3][2] A[0] A[1] A[2] A[3] char A[4][3]; اگر A[0][0] در آدرس M حافظه باشد، آنگاه A[i][j] در آدرس زير خواهد بود: M+(i*3+j)*sizeof(char)

26 مثال: جدول ضرب با استفاده از آرايه دوبعدي
void main () { int table[10][10] , i , j; for ( i=0 ; i<10 ; i++) for( j=0 ; j<10 ; j++) table[i][j] = (i+1) * (j+1); printf("%5d" , table[i][j] ); printf("\n" ); } getch(); Available via the course home page in code/arrays/2darray.cpp

27

28 آرايه دو بعدي بعنوان آرگومان تابع
ارسال آرايه دو بعدي همانند آرايه يك بعدي است با اين تفاوت كه شما ميتوانيد تعداد سطرها را ذكر نكنيد void f1(int x[][10],int len); void f2(int x[5][10]); Available via the course home page in code/arrays/2darray.cpp

29 مثال: برنامه‌اي كه عناصر ماتريس 2×3 را از ورودي خوانده، بزرگترين عنصر هر سطر را پيدا كند و به خروجي ببرد. void minput (int [][2],int); void mcal (int mat[][2],int); void main () { int mat[3][2]; clrscr(); minput ( mat , 3); mcal ( mat , 3); getch(); }

30 void minput (int m[][2],int r) { for (int i=0 ; i < r ; i++)
for(int j=0 ; j < 2 ; j++) printf(“Enter mat[%d][%d]: ”, i , j); scanf(“%d” , &m[i][j] ); } void mcal (int mat[][2],int r) int i , j , rmax; printf(“\nROW \t\t MAX”); printf(“\n ”); for ( i=0 ; i< r ; i++) rmax = mat[i][0]; for( j=1 ; j< 2 ; j++) if (mat[i][j] > rmax) rmax = mat[i][j]; printf(“\n%3d \t\t %3d:”, i+1 , rmax); Available via the course home page in code/arrays/2darray.cpp

31 خروجي Enter mat[0][0]: 3 Enter mat[0][1]: 4 Enter mat[1][0]: 5
ROW MAX

32 ارسال آرايه ها به توابع بصورت فراخواني با مرجع ميباشد.
نكته مهم ارسال آرايه ها به توابع بصورت فراخواني با مرجع ميباشد. يعني هر تغييري كه در تابع روي آرايه انجام پذيرد در مرجع اوليه آن اعمال ميشود.

33 مقداردهي اوليه به آرايه هاي دو بعدي
آرايه هاي دو بعدي همانند آرايه هاي يك بعدي ميتوانند مقداردهي اوليه شوند. int y[2][3] ={1,3,4,7,6,15}; int y[2][3] ={{1,3,4},{7,6,15}}; int y [3] ={1}; اگر تعداد عناصري كه مقدار دهي اوليه شده اند از تعداد عناصر مشخص شده كمتر باشند در اينصورت مابقي عناصر مقدار صفر ميگيرند.

34 مثال: برنامه اي بنويسيد كه كه دو ماتريس را از ورودي خوانده و ماتريس حاصلضرب را در خروجي نمايش دهد.

35 void Read_Mat1 (int m[][3] , int len);
void main () { int mat1[2][3] , mat2[3][4] , mat3[2][4]={0}; Read_Mat1 ( mat1 , 2); Read_Mat2 ( mat2 , 3); int i , j , k; for ( i=0 ; i < 2 ; i++) for( j=0 ; j < 4 ; j++) mat3[i][j]=0; for( k=0 ; k < 3 ; k++) mat3[i][j] += mat1[i][k] * mat2[k][j]; } printf( “\n”); printf( “%5d” , mat3[i][j] ); getch(); Available via the course home page in code/arrays/2darray.cpp

36 خروجي Enter mat1[0][0]: 1 Enter mat1[0][1]: 2 Enter mat1[0][2]: 3
خروجي

37 نكته اگر تعداد عناصر آرايه مشخص نباشد، بايد حداكثر تعداد مورد انتظار را در نظر گرفت.

38 تمرين برنامه ضرب ماتريسها را به گونه اي اصلاح كنيد كه بتواند هر دو ماتريس مجاز را كه ابعاد آنها كمتر از 6×6 است را در هم ضرب كند. توجه: ابعاد و درايه‌هاي هر ماتريس از كاربر گرفته شود.


Download ppt "آرايه ها."

Similar presentations


Ads by Google