تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
سلام دوستان عزیز
من کد زیر رو برای یک آرایه 3*3 نوشتم ولی نتونستم یک حالت کلی تعریف کنم که آرایه n*n رو بعنوان ورودی بگیره و 90 درجه بچرخونه
آرایه مفروض :
33 22 11
66 55 44
99 88 77
بعد از اعمال تابع :
11 44 77
22 55 88
33 66 99
int i,j;
void read2d(float a[][3])
{
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
a[i][j]=(rand()%90+10);
}
}
void print2d(float a[][3])
{
cout<<"\n";
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
cout<<"\t"<<a[i][j];
cout<<endl;
}
}
void rotat(float a[][3])
{
float t;
t=a[0][0];
a[0][0]=a[2][0];
a[2][0]=a[2][2];
a[2][2]=a[0][2];
a[0][2]=t;
t=a[0][1];
a[0][1]=a[1][0];
a[1][0]=a[2][1];
a[2][1]=a[1][2];
a[1][2]=t;
}
int main()
srand(time(NULL));
{float p[3][3];
read2d(p); //reads array's elements from user
cout<<"\n\n\n\nP : \n";
print2d(p);
print2d(p); //prints arrayes elements on screen
rotat(p);
cout<<"\n\n\n\nnew P : \n";
print2d(p);
getch();
print2d(p); //prints arrayes elements on screen
return 0;
}
حالا می خوام یه راه حل برام بگین که چطور این تابع ()rotat رو تعریف کنم تا بتونه هر آرایه ای رو که بصورت مربعی بهش ارسال می شه رو بعنوان ورودی بگیره و جای عناصرش رو تغییر بده
نقل قول: تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
اینو من با جاوا نوشتم ولی منطقش یکی هست:
public static int[][] rotate(int[][] arr) {
int[][] temp;
temp = new int[arr.length][arr[0].length];
int n = arr.length;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
temp[j][ n - 1 - i] = arr[i][j];
}
}
return temp;
}
نقل قول: تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
در ++c وقتی می خوای آرایه ای رو بصورت[][]a بعنوان پارامتر در تابعی تعریف کنی کامپایلر error میده حتی موقع تعریف داخل برنامه این نوع تعریف برای کامپایلر قابل قبول نیست و حتما باید عدد بعد دوم قید بشه مثلا [5][]a رو قبول میکنه و این مشکل اصلی منه که نمیدونم چطور این قضیه رو دور بزنم ! حتما باید راه حلی باشه
نقل قول: تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
یکیم ور رفتم تونستم اینو بنویسم اگه توضیح خواستی بگو ( الان باس برم )
#include <iostream>
#include <stdlib.h>
using namespace std;
void rotat(float** s, int n)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << s[i][j] << " ++++ ";
cout << endl;
}
}
int main()
{
int n = 8;
float** a1 = (float**)malloc(sizeof(float) * n);
for(int i = 0; i < n; i++)
{
a1[i] = (float*)malloc(sizeof(float) * n);
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
a1[i][j] = i + j;
}
rotat(a1, n);
return 0;
}
نقل قول: تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
خیلی ممنون از کمکتون ، من سورس کدمو آپدیت کردم و همه کد رو گذاشتم تا مشکلم برای شما واضح تر بشه طریقه گرفتن ورودی و چاپ اونا زیاد اهمیتی ندارن
فقط "شیوه ارسال آرایه n*n به این توابع "هست که هنوز برام بصورت حل نشده باقیست:افسرده:
نقل قول: تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی
با توجه به چیزی که گفتی کد بالا باید مشکلت رو حل کنه.
پارامتر به صورت ارایه دو بعدی تعریف نشده اما کار همون رو به خوبی انجام میده.
تو تابع rotat پارمتر s یک پوینری هست که به یک پوینتر دیگه اشاره داره. هرخونه ( n تا خونه ) که در اشاره گر اول قرار داره خودش به n تا خونه ارایه/حافظه دوم اشاره میکنه.
با این دستور میایم یه پوینتر میسازیم که به یکسری پوینتر دیگه ( n تعاد) اشاره میکنه
float** a1 = (float**)malloc(sizeof(float) * n);
و این جا هم میایم به تک تک پوینتر هایی که با دستور بالا ایجاد کردیم ، مقدار/حافظه میدیم ( هر پوینتر بالا در هر خونش ادرس یک خونه از ارایه دوم رو نگه میداره ).
for(int i = 0; i < n; i++) {
a1[i] = (float*)malloc(sizeof(float) * n);
}
اینجام فقط برای تست اومدم به خونه ها مقدار دادم
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++)
a1[i][j] = i + j;
}