1 / 38

آرايه ها

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

fordon
Download Presentation

آرايه ها

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. آرايه ها

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

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

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

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

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

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

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

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

  10. Enter an average: 12 Enter an average: 15 Enter an average: 12 Enter an average: 17 Enter an average: 16 max = 17.00 , position = 4 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(); }

  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

  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

  19. جستجوي يك مقدار در آرايهجستجوي ترتيبي • اين تابع در آرايه حركت كرده اگر به مولفه مساوي با مورد جستجو برسد انديس آن و در غير اينصورت عدد منفي برميگرداند. int lsearch (int arr[] , int len, int val) { for (int i=0;i<len;i++) if (arr[i] == val) return i; return -1; }

  20. 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; }

  22. x low mid high bsearch(x , 10 , 4)

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

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

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

  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); for ( i=0 ; i<10 ; i++) { for( j=0 ; j<10 ; j++) printf("%5d" , table[i][j] ); printf("\n" ); } getch(); }

  27. آرايه دو بعدي بعنوان آرگومان تابع void f1(int x[][10],int len); void f2(int x[5][10]); ارسال آرايه دو بعدي همانند آرايه يك بعدي است با اين تفاوت كه شما ميتوانيد تعداد سطرها را ذكر نكنيد

  28. مثال: برنامه‌اي كه عناصر ماتريس 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(); }

  29. 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); } }

  30. خروجي Enter mat[0][0]: 3 Enter mat[0][1]: 4 Enter mat[1][0]: 5 Enter mat[1][1]: 6 Enter mat[2][0]: 7 Enter mat[2][1]: 8 ROW MAX --------------------- 1 4 2 6 3 8

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

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

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

  34. void Read_Mat1 (int m[][3] , int len); void Read_Mat2 (int m[][4] , 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]; } for ( i=0 ; i < 2 ; i++) { printf( “\n”); for( j=0 ; j < 4 ; j++) printf( “%5d”, mat3[i][j] ); } getch(); }

  35. خروجي Enter mat1[0][0]: 1 Enter mat1[0][1]: 2 Enter mat1[0][2]: 3 Enter mat1[1][0]: 5 Enter mat1[1][1]: 4 Enter mat1[1][2]: 7 Enter mat2[0][0]: 8 Enter mat2[0][1]: 9 Enter mat2[0][2]: 5 Enter mat2[0][3]: 8 Enter mat2[1][0]: 10 Enter mat2[1][1]: 0 Enter mat2[1][2]: 12 Enter mat2[1][3]: 21 Enter mat2[2][0]: 0 Enter mat2[2][1]: 5 Enter mat2[2][2]: 9 Enter mat2[2][3]: 12 28 24 56 86 80 24 136 208

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

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

More Related