PDA

View Full Version : سوال: مربع جادویی



amin513
یک شنبه 04 اسفند 1387, 10:37 صبح
سلام.کسی می تونه توضیح برنامه مربع جادویی رو بنویسه.برنامه رو دارم.کد برنامه این هست:

#include<stdio.h>
#include<stdlib.h>
#define MaxRows 20
void main()
{ int n;
int *Square[MaxRows];
//get the odd number to start
printf("please enter your number");
scanf("%d",&n);
//allocate memory to array Square;
for(int row=0;row<n;++row)
Square[row]=(int *) malloc (n*sizeof(int));
//initialization the Square matrix;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
*(*(Square+i)+j)=0;
int k=2;
int num=2;
int j=n/2,l;
i=0;
*(*(Square)+(n/2))=1;
while(num<=n*n)
{
if(i-1>=0)
{ k=i+2;
k=k-3; }
else k=n-1;
if(j-1<0)
l=n-1;
else l=j-1;
if((*(*(Square+k)+l))!=0)
{i=i+1;
}
else
{i=k;j=l;}
*(*(Square+i)+j)=num;
num++;
}
for(i=0;i<n;i++)
{
printf("\n");
for(int j=0;j<n;j++)
printf("%d\t",*(*(Square+i)+j));
}
free(Square);
return;}

فقط تشريحش كنيى لطفا.ضروريه.ضروري

فاطمه وطن دوست
یک شنبه 04 اسفند 1387, 16:03 عصر
سلام




مربع جادوئی ، به مربعی گفته میشه که جمع سطرها و ستون ها و قطر اصلی اون با هم برابر هست .


مثلا این مربع رو ببینید .




http://upload.iranblog.com/1/1235345325.jpg





حاصل جمع سطر و ستون و قطر اصلی ، در این مثال میشه عدد 15


فرمولی که چطور میفهمند مجموع عناصر قطر اصلی و سطرها و ستون ها برابر با 15 میشه در مثال بالا رو یادم نمیاد ، سرچ کنید.


قانون اول : عدد 1 همیشه در سطر اول و وسط قرار میگیره !

مثلا تو نرم افزار متلب : تابعی هست با عنوان Magic که کارش درست کردن همچین مربعی هست . ( این مربع اولین بار توسط یه نقاش که
در حال کشیدن نقاشی بوده بدون اینکه خودش متوجه بشه طراحی شده – اسم نقاش رو یادم نیست ولی تو هلپ نرم افزر متلب تصویر به همراه تاریخچه اش هست . )
مثلا اگر بنویسیم Magic (3) یه جدول 3*3 میسازه ! و اعداد 1- 9 رو توی این جدول قرار میده . ( 3 به توان 2 میرسه)
در مرحله ی بعد شروع به پر کردن این جدول میکنه ، طبق قانون 1 عدد اول رو در خانه وسط از سطر اول قرار میدیم.
نکته بعدی در مورد دسته بندی اعداد هست ( اعداد در 3 دسته 3 تایی قرار میگیرند !)
دسته اول : 1و2و3
دسته دوم:4و5و6
دسته سوم :7و8و9
نکته ی بعدی : وقتی میخوایم اولین عدد دسته بعدی رو بنویسیم باید اون عدد رو دقیقا در زیر آخرین عدد دسته قبلی قرار بدیم!
نکته بعدی : نحوه قرار دادن اعداد به صورت ( بالا – راست –Direction ) میباشد .
نکته بعدی: ( در مورد بیرون افتادن اعداد از اطراف بالا)
اگر عدد در بیرون از جدول افتاد اون موقع عدمون رو توی همون ستونولی سطر اخر قرار میدیم !
نکته بعدی : ( در مورد بیرون افتادن اعداد از اطراف راست)
اگر عدد در بیرون از جدول افتاد اون موقع عدمون رو توی همون سطرولی ستون اخر از سمت چپ قرار میدیم !

amin513
یک شنبه 04 اسفند 1387, 23:52 عصر
ممنون تا جايي متوجه شدم اما منظور از اين چيزها رو نمي دونم.اگه ميشه يه توضيحي بدين.

#define MaxRows 20

int *Square[MaxRows];

*(*(Square+i)+j)=0;

فاطمه وطن دوست
سه شنبه 06 اسفند 1387, 12:51 عصر
سلام

http://upload.iranblog.com/1/1235507559.jpg

http://upload.iranblog.com/1/1235479294.jpg

http://upload.iranblog.com/1/1235485317.jpg

http://upload.iranblog.com/1/1235492798.jpg

kh1387
سه شنبه 06 اسفند 1387, 19:55 عصر
سلام
اگه منظورتون روش ایجاد مربع هستش اینگونه ساخته می شه
ابتدا عدد یک رو در سطر اول و وسط قرار می دهیم.
بعد مربع رو پیوسته فرض کنید به این معنا که اگر مثلا در یک مربع سه در سه گفتند سطر اول و ستون 5 به این معناست که شما از سطر اول و ستون اول شروع به شمردن کنید و ستون به ستون جلو بروید و هر وقت ستونها که در اینجا سه تا هست تمام شد برگردید به سمت چپ که ستون 5 می شه دقیقاً سطر اول و ستون وسط
حال ابتدا یک رو در وسط سطر اول بگذارید و بعد به بالا و سمت چه رفته و عدد بعدی (2) رو بذارید و باز هم همینطور بالا و سمت چپ رفته و عدد سه و همینطور تا آخر ...
اگر به جایی رسیدید که آن خانه پر بود در پاین همان مربع قبلی عدد رو بذارید.
امیدوارم بدردتون بخوره، البته سخت نیست ولی یه ذره دقت میخواد.
هر وقت این رو فهمیدید کد نویسیش مشکلی نداره.
اگه متوجه نشدید بگید تا براتون بیشتر توضیح بدم.

amin513
چهارشنبه 07 اسفند 1387, 03:33 صبح
سلام
دوست عزيزم توضيحي كه دادي خوب بود.اما من مي خوام برا استادم تو دانشگاه توضيح بدم:لبخند:
اگه مي شه يه جور بگو كه بتونم توضيح بئم.كم نيارم.ممنون ميشم.

amin513
چهارشنبه 07 اسفند 1387, 17:58 عصر
سلام
من اينكه اعداد چطور ميرن تو خونه مربع رو بلدم.فقط ميخوام بدونم دليل اينكه اين كد ها نوشتن چيه:
int k=2;
int num=2;
int j=n/2,l;
i=0;
*(*(Square)+(n/2))=1;
while(num<=n*n)
{

if(i-1>=0)
{ k=i+2;
k=k-3; }
else k=n-1;
if(j-1<0)
l=n-1;
else l=j-1;
if((*(*(Square+k)+l))!=0)
{i=i+1;
}

else
{i=k;j=l;}
*(*(Square+i)+j)=num;
num++;
}
for(i=0;i<n;i++)
{
printf("\n");
for(int j=0;j<n;j++)
printf("%d\t",*(*(Square+i)+j));
}
free(Square);
return 0;}

majid.fe
پنج شنبه 15 اسفند 1392, 11:41 صبح
به این وبلاگ هم یه سری بزنین شاید به دردتون بخوره:
http://decoding.blogfa.com/