PDA

View Full Version : تابعی برای تغییر دادن 90 درجه ای محل عناصر در یک آرایه مربعی



77777778
سه شنبه 11 تیر 1392, 11:31 صبح
سلام دوستان عزیز
من کد زیر رو برای یک آرایه 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 رو تعریف کنم تا بتونه هر آرایه ای رو که بصورت مربعی بهش ارسال می شه رو بعنوان ورودی بگیره و جای عناصرش رو تغییر بده

hadi0x7c7
سه شنبه 11 تیر 1392, 23:32 عصر
اینو من با جاوا نوشتم ولی منطقش یکی هست:


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

77777778
چهارشنبه 12 تیر 1392, 07:45 صبح
در ++c وقتی می خوای آرایه ای رو بصورت[][]a بعنوان پارامتر در تابعی تعریف کنی کامپایلر error میده حتی موقع تعریف داخل برنامه این نوع تعریف برای کامپایلر قابل قبول نیست و حتما باید عدد بعد دوم قید بشه مثلا [5][]a رو قبول میکنه و این مشکل اصلی منه که نمیدونم چطور این قضیه رو دور بزنم ! حتما باید راه حلی باشه

saied_hacker
چهارشنبه 12 تیر 1392, 08:56 صبح
یکیم ور رفتم تونستم اینو بنویسم اگه توضیح خواستی بگو ( الان باس برم )

#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;
}

77777778
چهارشنبه 12 تیر 1392, 09:37 صبح
خیلی ممنون از کمکتون ، من سورس کدمو آپدیت کردم و همه کد رو گذاشتم تا مشکلم برای شما واضح تر بشه طریقه گرفتن ورودی و چاپ اونا زیاد اهمیتی ندارن
فقط "شیوه ارسال آرایه n*n به این توابع "هست که هنوز برام بصورت حل نشده باقیست:افسرده:

saied_hacker
پنج شنبه 13 تیر 1392, 13:11 عصر
با توجه به چیزی که گفتی کد بالا باید مشکلت رو حل کنه.
پارامتر به صورت ارایه دو بعدی تعریف نشده اما کار همون رو به خوبی انجام میده.

تو تابع 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;
}