تمرین آرایه دوبعدی
مثال 5- برنامه ای بنویسید که mو n را از ورودی بگیرد و آرایه ای به طول و عرض n و m بسازد و آن را از ورودی گرفته، سپس عناصر سطرهای آرایه را در شماره سطر ضرب کند و دوباره آن را چاپ کند:
#include <conio.h> #include <iostream.h> int main() { int a[10][5],b[10][5]; for(int i=0;i<10;i++) //daryaft araye { for(int j=0;j<5;j++) { cin>>a[i][j]; } } for(int i=0;i<10;i++) //zarb dar i { for(int j=0;j<5;j++) { b[i][j]=i*a[i][j]; } } for(int i=0;i<10;i++) //chape araye varun { for(int j=0;j<5;j++) { cout<<b[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
مثال 6- برنامه ای بنویسید که نمرات m درس n دانش آموز را با استفاده از دستور rand در یک آرایه دو بعدی قرار دهد و سپس ماکزیمم نمره ی هر دانش آموز را در انتهای نمرات هر دانش آموز قرار دهد و نمرات و ماکزیمم ها را نمایش دهد.
در واقع باید برنامه ای بنویسید که یک آرایه دو بعدی را با دستور rand بسازد. ( عناصر آرایه بین 0 تا 20 باشند) . بعد از آن در هر سطر ماکزیمم را پیدا کرده و ماکزیمم ها را در ستون اضافه ای در انتهای آرایه اضافه کند و آرایه جدید را نمایش دهد:
برای حل باید توجه کنیم که یک آرایه دو بعدی n*m داریم. حال می خواهیم در انتهای هر سطر یک خانه اضافه کنیم. در کل می خواهیم یک ستون به انتهای همه سطرها بچسبانیم. پس آرایه جدید n ُطر قبلی را دارد. اما ستونهایش یکی افزایش می یابد و m+1 ستون دارد.
پس آرایه جدید n*m+1 می باشد که این ستون اضافی از ماکزیمم های هر سطر تشکیل شده است.
منظور از استفاده از دستور rand شکل زیر است:
int num=rand%21;
که با این دستور در متغیر num( بر فرض مثال) یک عدد بین صفر تا 20 قرار داده میشود.
برنامه ی این سوال به صورت زیر خواهد بود:
#include <conio.h> #include <iostream.h> int main() { int n,m; cin>>n>>m; int a[n][m],b[n][m+1]; for(int i=0;i<n;i++) //daryaft araye { for(int j=0;j<m;j++) { a[i][j]=rand()%21; b[i][j]=a[i][j]; } } for(int i=0;i<m;i++) //zarb dar i { int max=a[i][0]; //onsore avale har satr ra meghdar avalie max gharar midahim for(int j=0;j<m;j++) { if(a[i][j]>max) max=a[i][j]; } b[i][m]=max; //por kardane sotune akhar ya akahrin khaneye har satr dar arayeye b } for(int i=0;i<n;i++) //chape araye varun { for(int j=0;j<m+1;j++) { cout<<b[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
برای تمرین، مثال بالا را به این صورت تعمیم دهید که میانگین نمرات هر دانش آموز را در انتهای هر ستون اضافه کنیم( یعنی یک سطر به آخر آرایه اضافه شود) و در آخرین خانه ی این سطر میانگین میانگین ها را نمایش دهید. ( تمرین بسیار مناسبی است برای امتحان!!)
مثال 7- برنامه ای بنویسید که ارایه ی دو بعدی text را از نوع کاراکتر با دستور rand بسازد و آرایه ی دیگری بسازد که در آن حروف بزرگ به حروف کوچک و حروف کوچک به حروف بزرگ و همه ی اعداد به 0 و سایر کاراکتر ها به * تبدیل شده باشند و آرایه ی دوم را نمایش دهد.
#include <conio.h> #include <iostream.h> int main() { int n,m; cin>>n>>m; char text[n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { text[i][j]=32+rand()%96; } } char newtext[n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { int asc=(int)text[i][j]; if(asc>=65 && asc<=90) { asc=asc+32; newtext[i][j]=(char)asc; } else if(asc>=97 && asc<=122) { asc=asc-32; newtext[i][j]=(char)asc; } else if(asc>=48 && asc<=57) { newtext[i][j]='0'; } else { newtext[i][j]='*'; } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cout<<newtext[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
دستور زیر برای ساختن آرایه تنها از کاراکترهای قابل دیدن نوشته شده است(کد اسکی کاراکترهای قابل دیدن از 32 تا 127 می باشند)
text[i][j]=32+rand()%96;
مثال 8- برنامه ای بنویسید که یک آرایه دو بعدی را با استفاده از دستور rand بسازد و سپس عناصر آرایه را به صورت سطری با استفاده از یکی از روشهای مرتب سازی مرتب کند. ( تنها از یک آرایه استفاده کنید)
#include <conio.h> #include <iostream.h> int main() { int n,m; cin>>n>>m; int a[n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { a[i][j]=rand()%20; } } int satr,t; for(int satr=0;satr<n;satr++) //moratab sazi har satr az bozorg be kuchak { for(int s=0;s<m;s++) //algoritme moratab sazi { int key=a[satr][s]; for(t=s-1;t>=0;t--) { if(a[satr][t]<key) a[satr][t+1]=a[satr][t]; else break; } a[satr][t+1]=key; } //payane algoritme moratab sazi } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cout<<a[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
مثال 9- برنامه ای بنویسید که جدول ضرب 8 در 8 را در یک آرایه بریزد و نمایش دهد: ( دیگه این یکی آب خوردن شده تا الان، مگه نه؟! )
#include <conio.h> #include <iostream.h> int main() { int a[9][9]; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { a[i][j]=i*j; cout<<a[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
مثال 10 - برنامه ای بنویسید که مثلث خیام پاسکال را تا سطر 10 ام آن نمایش دهد: (فرض کرده ایم که شماره سطر ها از 0 شروع می شود)
مثلث را از سمت چپ صاف بکشید مثل شکل زیر
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
...
در اینگونه مسائل که آرایه دو بعدی استفاده می کنیم به تمام خانه ها مقدار اولیه صفر می دهیم تا خانه هایی که در آخر اصلا مقداری به آنها نمی دهیم و نمی خواهیم که چاپ هم بشوند( تا شکل نهایی مثلثی شود) تا به جای 0 درونشان، فاصله چاپ کنیم.
#include <conio.h> #include <iostream.h> int main() { int a[10][10]; for(int i=0;i<10;i++) //harekat ruye satr ha { a[i][0]=1; //avalin onsore har satr 0 mishavad for(int j=1;j<10;j++) //baghieye araye ra FELAN 0 mikonim a[i][j]=0; } for(int i=1;i<10;i++) //az satre shoare yek { int j; for(j=1;j<i;j++) //az sotune shomare yek { a[i][j]=a[i-1][j]+a[i-1][j-1]; //dasture mosalat khayam } a[i][i]=1; //khaneye i ome satr i ham bayad 1 bashad } for(int i=0;i<9;i++) //namayesh { for(int j=0;j<10;j++) { if(a[i][j]==0) //agar 0 bud fasele chap shavad cout<<" "; else //dar gheyre in surat adade darune khane chap shavad cout<<a[i][j]<<"\t"; } cout<<endl; } getch(); return 0; }
مثال 11- برنامه ای بنویسید که مثلث زیر را تا 10 سطر نمایش دهد:
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
...
برای نوشتن این برنامه باید دقت کنیم که برای کشیدن 10 سطر از این جدول( که شماره آخرین سطر 9 می شود) در هر سطر چه چیزهایی را باید بکشیم...
در سطر صفرم ، 9 تا فاصله و یک عدد 1 قرار میدهیم.
در سطر یکم هشت تا فاصله و سپس از یک تا 2( شماره سطر به اضافه ی یکی) می شمریم و بعد شمارشمان را تا یک معکوس می کنیم.
در سطر دوم هفت تا فاصله و بعد از یک تا سه( شماره سطر به اضافه ی یکی) می شمریم و بعد شمارشمان را تا یک معکوس می کنیم.
در سطر iام ، نه منهای i تا فاصله و بعد از یک تا i به اضافه ی یکی میشمریم و بعد شمارشمان را معکوس می کنیم.
پس در حلقه ی بیرونی که تعداد سطرها را طی می کند سه تا حلقه داریم. حلقه ی اول برای فاصله ها( از خانه ی صفر تا خانه ی 9 منهای i از سط i را پر میکند) و حلقه ی دوم برای شمارش صعودی( از خانه ی 9 منهای i تا خانه ی 9ام را پر میکند) و حلقه ی سوم برای شمارش نزولی( از خانه ی 9ام تا خانه ی ده به اضافه ی i را پر میکند) !
برنامه ی آن به صورت زیر می باشد:
#include <conio.h> #include <iostream.h> int main() { int a[10][2*10-1]; for(int i=0;i<10;i++) { for(int j=0;j<19;j++) a[i][j]=0; } for(int i=0;i<10;i++) { for(int j=0;j<9-i;j++) //halgehye fasele ha { a[i][j]=0; //be jaye fasele 0 migozarim. } int s=1; for(int j=9-i;j<10;j++) //halgheye so'udi { a[i][j]=s; s++; } s=s-2; for(int j=10;j<10+i;j++) //halgheye nozuli { a[i][j]=s; s--; } } for(int i=0;i<10;i++) //namayesh { for(int j=0;j<19;j++) { if(a[i][j]==0) //agar 0 bud fasele chap shavad cout<<" "; else //dar gheyre in surat adade darune khane chap shavad cout<<a[i][j]; // digar faseleye tab nemigozarim } cout<<endl; } getch(); return 0; }
این مسئله یکم پیچیده بود اما مسئله ی مهمیه!
اگر مسئله ی دیگری به ذهنتون میرسه که به این مبحث مربوط میشه حتما در میون بذارید.