الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Creating a Magic Square

مغلق
بدأه ابتسم في 20 أبريل 2005 · 19 رد · 1,477 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

This is my JAVA Assignment

Creating a Magic Square

Magic square:the sum of the rows,the sum of the columns and the sum of the diagonals of a nxn matrix will be the same!(n is odd number)

Use two dimensional array to generat a miagic square.

The rules to generat a magic square are:

The number uesd : 1,2,….,n*n.

Example:

8 1 6

3 5 7

4 9 2

Example2:

17 29 1 8 15

3 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

شرح بسيط :

عند وضع العدد في خانه فإن العدد الذي يله يأخذ الخانة التالية في السطر الذي يعلوه اي تضيف عدد الى رقم الخانة و تنقص رقم من عدد الاسطر.

اذا لم يكن هناك سطر بالاعلى فإن العدد يوضع في آخر سطر في الخانه التي على يمين العدد السابق

:rolleyes: املك بعض الافكار الرئيسة عن طريقة الحل و اتمنى ان اجد مساندة منكم

#2

يرجى وضع المحاولة البرمجية وسوف نقوم بالمساعدة و اعطاء التلميحات..

و ارجو من حضرتك ملاحظة اننا لا نقوم بحل الوظائف و ذلك ضمن شروط المنتدى

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#3

السلام عليكم

هناك آلية معينة لتعبئة قيم المصفوفة فنبدأ مثلا من وسط السطر الاول

وعلينا الاحتفاض بأخر مكان وضعنا فيه والمكان الذي سيعبأ في الخطوة التالية لأنه إذا وصلنا إلى خانة معبأة فنرجع إلى الخانة التي تحت الخانة السابقة

ونسير خطوة إلى أعلى أي ينقس رقم السطر واحد وخطو إلى اليمين إي يزاد رقم العامود واحد وعندما يصبح رقم السطر -1 نضع عدد الاسطر -1 وعندما يصبح رقم العامود يساوي عدد الأعمدة نضعه صفر وهكذا يتم البرمان عند الخروج من حدود المصفوفة ونستعمل عداد للقيم التي ستخزن بالمصفوفة يبدأ بالقيمة 1 ونزيده كل خطوة 1 وهو يتحكم بالتكرار حيث هنك تكرار واحد ويستمر طالما العداد اصغر أو يساوي عدد الاسطر ضرب عدد الاعمدة علما أن المصفوفة يجب أن تكون مربعة وعدد أسطرها عدد فردي

يجب تمهيد جميع عناصر المصفوفة بالقيمة صفر كي نختبر إذا مررنا بالخانات ووضعنة قيم فيها أم لا وإذا تم ملئ خانة نتابع عملية التعبئة من الخانة التي تكون تحت الخانة السابقة مباشرة

حاول البدء بالبرمجة وتتبقى العون والمساعدة على افكارك

والسلام

#4

الأخ الفاضل رامي العيساوي

اعتذر ما اذا كان موضوعي ظهر و كانه طلب حل فروضي الدراسية , كطالب برمجة مبتدئ اعرف جمالية احساس المبرمج و هو يحاول كتابة برنامج ليخرجة بأفضل طريقة ممكنه لذلك اردت ان اضع الموضوع هنا ليستمتع الجميع بجمالية التجربة و تحدي الوصول للحل الكثر عملية! لا اطلب اجابة لسؤال انما فقط اطرح فكرتي و احب استقبال نقدكم..

و اكرر اعتذاري

#5
kkhalil2005 كتب:
السلام عليكم

هناك آلية معينة لتعبئة قيم المصفوفة فنبدأ مثلا من وسط السطر الاول

وعلينا الاحتفاض بأخر مكان وضعنا فيه والمكان الذي سيعبأ في الخطوة التالية لأنه إذا وصلنا إلى خانة معبأة فنرجع إلى الخانة التي تحت الخانة السابقة

ونسير خطوة إلى أعلى أي ينقس رقم السطر واحد وخطو إلى اليمين إي يزاد رقم العامود واحد وعندما يصبح رقم السطر -1 نضع عدد الاسطر -1 وعندما يصبح رقم العامود يساوي عدد الأعمدة نضعه صفر وهكذا يتم البرمان عند الخروج من حدود المصفوفة ونستعمل عداد للقيم التي ستخزن بالمصفوفة يبدأ بالقيمة 1 ونزيده كل خطوة 1 وهو يتحكم بالتكرار حيث هنك تكرار واحد ويستمر طالما العداد اصغر أو يساوي عدد الاسطر ضرب عدد الاعمدة علما أن المصفوفة يجب أن تكون مربعة وعدد أسطرها عدد فردي

يجب تمهيد جميع عناصر المصفوفة بالقيمة صفر كي نختبر إذا مررنا بالخانات ووضعنة قيم فيها أم لا وإذا تم ملئ خانة نتابع عملية التعبئة من الخانة التي تكون تحت الخانة السابقة مباشرة

حاول البدء بالبرمجة وتتبقى العون والمساعدة على افكارك

والسلام

و عليكم السلام ورحمة الرحمن

احببت فكرة وضع الصفر في جميع الخانات! :rolleyes:

اشكر مشاركتك

#6

ساقوم طرح البرنامج على خطوات

حيث ان الفكرة الاسياسية في نظري هي عمل برنامج في الـ2D Arrayو كما تفضل الاخ kkhalil2005 فإن اعطاء قيمة الصفر لجميع الخانات تسهل عملية اختبار ما اذا كانت الخانه فارغة ام لا

هنا اطرح لكم الجزء الاول من الحل و هو انشاء 2D Array يعتمد عدد الاسطر و الصفوف فية على الرقم الذي ادخل المستخدم

import javax.swing.JOptionPane;
public class MagicSquare
	{
	public static void main (String args[])
  {
  int s,y,x;
  String S;  
  S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);
  
  int A[][];
  A=new int;
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 A[y][x]=0;}
  A=new int;
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 System.out.print(A[y][x]+" ");
 	 System.out.println();}  
  System.exit(1);
  }
	}

أمهلوني بعض الوقت لطرح الجزء الثاني من الحل وهو اختبار ما اذا كان المكان فارغا لوضع القيمة ام لا ..استقبل اي ملاحظات على القسم الاول الذي يساقوم بالغيير فية بناء على ما يتطلب الجزء الثاني

#7

السلام عليكم

لا تقم بإجراء تكرار for متداخل لتعبئة المصفوفة بل قم فقط بتكرار for واحد يبدأ من 1 ويستمر حتى s*s إي آخر عدد يجب وضعه في المصفوفة:

واستعمل الموقع الحالي :

curRow=0;

curCol=s/2;

A[0][curCol]=1;

for(int n=2; n<= s*s; n++) {

oldRow=curRow;

oldCol=curCol;

اختبار اذا خرجنا من الاعلى فنرجع إلى الاسفل (العمل على رقم الاسطر)

اختبار اذا خرجنا من آخر السطر فنرجع إلى بدايته (العمل على رقم الاعمدة)

اختبار اذا الخانة الحالية مملوءة نرجع إلى الخنة التي تحت الخانة السابقة وننتبه اذا خرجنا من اسفى المصفوفة عند الانتقال الى الخنة التي تحت الخانة السابقة فننتقل حينئذ على اعلى المصفوفة

ثم نضع قيمة n في الموقع الجديد ويتنتهي التكرار للرجوع لبدايته والنتابعة مع رقم آخر

ثم يمكن طباعة المصفوفة بالستعمال تكرار for متداخل

#8

انتبه

في البرنامج قمت مرتين بانشاء الكاين A

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#9
import javax.swing.JOptionPane;
public class MagicSquare
	{
	public static void main (String args[])
  {
  int s,y,x;
  String S;  
  S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);
  
  int A[][]; int n=1;
  A=new int;
	/* This steps is to give zero value */
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 A[y][x]=0;}
	/* The end of steps is to give zero value */
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
  {if (n==1)
	/* For the first number */
 	 A[0][s/2] = n;
  else
  {	if(A[y][x]==0)
 	 {
    if (x==s)	
 	 x--;
    else
 	 if(y== -1)
 	 y=s-1;
 	 A[y][x]=n;
 	 }
  else
  y--;
  A[y][x]=n;
  }
	}
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
  A[y][x]=n;
  System.out.print(A[y][x]+" ");      System.out.println();}
n++;}

	/*The end of Magic Square*/
  System.exit(1);
  }
	}

هذا هو الجزء الثاني من البرنامج

لكن النتاج يظهر

0 1 0

0 0 0

0 0 0

فكيف اصلح هذا الخلل؟!

#10
kkhalil2005 كتب:
السلام عليكم

لا تقم بإجراء تكرار for متداخل لتعبئة المصفوفة بل قم فقط بتكرار for واحد يبدأ من 1 ويستمر حتى s*s إي آخر عدد يجب وضعه في المصفوفة:

عندما اطلعت على ردك بالامس لم فهم قصدك :s و الان فهمت :D

ساجرب الفكر تبدوا ممتعة اكثر!

هلا قمت بالاطلاع على الجزء الثاني من البرنامج و اعطاءي رايك فية اذا سمحت!

اشكر حسن تعاونكم

#11
khwlani كتب:
انتبه

في البرنامج قمت مرتين بانشاء الكاين A

نعم لاحظت ذلك بعد طرح الرد فهل يوجد طريقة لتعديلة في الرد؟

اشكر ملاحظتك الكريمة

هل لي برايك في الجزء الثاني من البرنامج

و اكرر شكري

#12

السلام عليكم

لقد اجريت تكرار متداخل وتيتعمل عدادات هاذين التكارارين بعملية التعبءة مهكذا لا تتبع مجرى أو طريقة التعبئة السليمة لانك تمر على المصفوفة من أول سطر إلى آخر سطر الانتقال من خانة إلى اخرى يتم حسابيا انطلاقا من الموقع الاول الذي تيتعمله وليس له علاقة بعدادت التكرار

اعتذر لانه ليس عندي وقت

حاول تتبع الخطوات التي ذكرتها سابقا مع تكرار واحد من 1 إى s*s واحسب مواقع الخانات بالطريقة التي ذكرتها سابقا مع الاحتفاض بالموقع الحالي والموقع الجديد

بالتوفيق

#13

حاولت ان اغيير بعض الشيء في البرنامج الى هذا...

import javax.swing.JOptionPane;
public class k
	{
	public static void main (String args[])
  {
  int s,y,x;
  String S;  
  y=0;
  x=0;
  S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);
  
  int A[][];
  A=new int;

	/* This steps is to give zero value */

  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 A[y][x]=0;}

	/* The end of steps is to give zero value */

 	 A[0][s/2] = 1;
  for(int n=2; n<= s*s; n++)
 	 {if(A[y][x]==0)
 	 {
    if (x==s)	
 	 x--;
    else
 	 if(y== -1)
 	 {y=s-1;
 	 A[y][x]=n;
 	 }
    else
 	 {y--;
 	 A[y][x]=n;
 	 }
  }
}
  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
  System.out.print(A[y][x]+" ");      
  System.out.println();}

	/*The end of Magic Square*/
  System.exit(1);
  }
	}

و لكن يظهر لي ما توضحة الصورة بعد ادخال الرقم!

post-31813-1114453675_thumb.jpg

#14
kkhalil2005 كتب:
السلام عليكم

لقد اجريت تكرار متداخل وتيتعمل عدادات هاذين التكارارين بعملية التعبءة مهكذا لا تتبع مجرى أو طريقة التعبئة السليمة لانك تمر على المصفوفة من أول سطر إلى آخر سطر الانتقال من خانة إلى اخرى يتم حسابيا انطلاقا من الموقع الاول الذي تيتعمله وليس له علاقة بعدادت التكرار

اعتذر لانه ليس عندي وقت

حاول تتبع الخطوات التي ذكرتها سابقا مع تكرار واحد من 1 إى s*s واحسب مواقع الخانات بالطريقة التي ذكرتها سابقا مع الاحتفاض بالموقع الحالي والموقع الجديد

بالتوفيق

و عليكم السلام و رحمة الله..

في البداية اشكر تواصلك الجميع جزاك الرحمن عني خيرا..

سأحاول اعادة صايغة البرنامج مع التركيز على النقطة التي ذكرتها بإذن الله

اكرر شكري و اعتذر على تعطيلكم..

جزاك الرحمن خيرا

#15
import javax.swing.JOptionPane;
public class z
	{
	public static void main (String args[])
  {
  int s,y,x;
  String S;  
  S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);
  if (s%2==0)
  {S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);}
  int A[][];
  A=new int;

	/* This steps is to give zero value */

  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 A[y][x]=0;}

	/* The end of steps is to give zero value */

	/* For the first number */
 	 y=0;
 	 x=(s/2);
 	 A[y][x] = 1;
	/*For the other numbers*/

  {for (int n=2;n<=(s*s);n++)
 	 {x++;
 	 y--;	
	/* is x & y in the arry ? */
 	 if (x<s && x>0)
    {
    if (y<s && y>0)
   	 {
   	 if (A[y][x]==0) 	 /* if y & x in the arry & A[y][x]=0 give n value to A[y][x]*/
   	 A[y][x]=n;  
    else
   	 {
   	 y++;
   	 x--;
   	 if(x==s)
   	 x=0;
   	 if (y>0)
   	 y=s-1;
   	 A[y][x]=n;	
   	 }
   	 }  /* if y & x in the arry & A[y][x]!=0 give n value to A[y++][x--]*/
 	 else
    if(x==s)
   	 {
   	 x=0;
   	 if (y>0)
   	 y=s-1;
   	 {
   	 if (A[y][x]==0)
   	 A[y][x]=n;
    else
   	 {
   	 y++;
   	 x--;
   	 if(x==s)
   	 x=0;
   	 if (y>0)
   	 y=s-1;
   	 A[y][x]=n;
   	 }
   	 }
   	 }
 	 else
    if (y<0)
   	 {y=s-1;
   	 if (A[y][x]==0)
   	 A[y][x]=n;
    else
   	 {
   	 y++;
   	 x--;
   	 A[y][x]=n;
   	 }
   	 }
    }
 	 }
 	 }
	/*The end of Magic Square*/

	/*For printing the numbers*/

	for (y=0; y<s; y++)
  {for (x=0; x<s; x++)
 	 System.out.print(A[y][x]+" ");
 	 System.out.println();}	
  System.exit(1);
  }
	}

تم تعديل هذه المشاركة بواسطة ابتسم في 2 مايو 2005 في 21:17

#16

يكون الناتج في البرنامج الاخير

0 1 0

0 0 0

2 0 0

؟!؟!

خطوات بسيطة و اصل للحل النهائي الاخير بإذن الله

كم هو جميل ان تتحدى نفسك!

#17

السلام عليكم

سأقرا برنامجك وأحاول إيجاد الاخطاء اعلمك لاحقا بها

#18

الخطأ في البرنامج هو

عندما تكون x اكبر من عدد الخانات!

ساحاول تعديلة

#19

السلام عليكم ورحمة الله وبركاته

لقد صعبت عليك الامر كثير والمشكلة تحصل على ما اضن عندما تصل إلى خانة ممتلئة بكيفية العودة الى الخانة السابقة خاصة اذا كنا على الاطراف وكذلك هناك خطأ عندما تختبر قيمة y>0 فيجب اختبارها ان كانت اقل من صفر

على كل حال قرأت الشروط ولم اتابعها بدقة كلها وفضلت اكتب الحل وهو كالتالي

	do {
  String S = JOptionPane.showInputDialog("Enter an odd number");
	s = Integer.parseInt(S);
  } while (s % 2 == 0);

  int A[][] = new int;

	/* This steps is to give zero value */

	for (y = 0; y < s; y++)
  for (x = 0; x < s; x++)
 	 A[y][x]=0;

	/* The end of steps is to give zero value */

	/* For the first number */
 	 y = 0;
	x = s / 2;
	A[y][x] = 1;
	int oldy, oldx;
	/*For the other numbers*/
  for (int n =2; n <= s*s; n++){
 	 oldx = x;  // save the current location
    oldy = y; 
    // find the next location
    y--; 
    x++;
    if (y < 0)  // if y out of square
   	 y = s - 1;
    if (x == s) // if x out of square
   	 x = 0;
    if (A[y][x] == 0) // if location is free
   	 A[y][x] = n;	// fill the current number
    else {  // current location is busy so return to previous one
   	 x = oldx; 
   	 y = oldy;
   	 y++; 	 // pass to location directly under it
   	 if (y == s)	// if y is out of square
      y = 0;
   	 A[y][x] = n;	// fill directly without any verification
    }
  } // The end of Magic Square

	// Printing the numbers the magic square

حاول التفريق بمسافة جدولية بين الارقام عند الطباعة  \t 
	System.exit(0);
 }
}
#20
import javax.swing.JOptionPane;
public class z
	{
	public static void main (String args[])
  {
  int s,y,x;
  String S;  
  S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);
  if (s%2==0)
  {S=JOptionPane.showInputDialog("Enter an odd number");
  s=Integer.parseInt(S);}
  int A[][];
  A=new int;

	/* This steps is to give zero value */

  for (y=0; y<s; y++)
 	 {for (x=0; x<s; x++)
 	 A[y][x]=0;}

	/* The end of steps is to give zero value */

	/* For the first number */
 	 y=0;
 	 x=(s/2);
 	 A[y][x] = 1;
	/*For the other numbers*/

  {for (int n=2;n<=(s*s);n++)
 	 {x++;
 	 y--;	
	/* is x & y in the arry ? */
 	 if (x<s && x!=-1)
    {
    if (y<s && y!=-1)
   	 {
   	 if (A[y][x]==0) 	 
/* if y & x in the arry & A[y][x]=0 give n value to A[y][x]*/
   	 A[y][x]=n;  
    else
   	 {
   	 y=y+2;
   	 x--;
   	 if(x>=s)
   	 x=0;
   	 if(x<=-1)
   	 x=s-1;
   	 if (y<=-1)
   	 y=s-1;
   	 if (y>=s)
   	 y=0;
   	 A[y][x]=n;	
   	 }
   	 }  
/* if y & x in the arry & A[y][x]!=0 give n value to A[y++][x]*/

 	 else
  /* if y=s or y=-1 */
    if (y<=-1)
   	 {y=s-1;
   	 if (A[y][x]==0)
   	 A[y][x]=n;
    else
   	 {
   	 y=y+2;
   	 x--;
   	 if(x>=s)
   	 x=0;
   	 if(x<=-1)
   	 x=s-1;
   	 if (y<=-1)
   	 y=s-1;
   	 if (y>=s)
   	 y=0;
   	 A[y][x]=n;	
   	 }
   	 }
    }
 	 else
    if(x>=s)
   	 {
   	 x=0;
   	 if (y<=-1)
   	 y=s-1;
   	 {
   	 if (A[y][x]==0)
   	 A[y][x]=n;
    else 
   	 {
   	 y=y+2;
   	 x--;
   	 if(x>=s)
   	 x=0;
   	 if(x<=-1)
   	 x=s-1;
   	 if (y<=-1)
   	 y=s-1;
   	 if (y>=s)
   	 y=0;
   	 A[y][x]=n;	
   	 }
   	 }
   	 }
 	 else
    if(x>=s&& y<=-1)
    {x=s-1;
    y=0;
    if (A[y][x]==0)
   	 A[y][x]=n;
    else 
   	 {
   	 y=y+2;
   	 x--;
   	 if(x>=s)
   	 x=0;
   	 if(x<=-1)
   	 x=s-1;
   	 if (y<=-1)
   	 y=s-1;
   	 if (y>=s)
   	 y=0;
   	 A[y][x]=n;	
   	 }
   	 }
    
 	 }
 	 }
	/*The end of Magic Square*/

	/*For printing the numbers*/

	for (y=0; y<s; y++)
  {for (x=0; x<s; x++)
 	 System.out.print(" "+A[y][x]+"\t");
 	 System.out.println();}	
  System.exit(1);
  }
	}

في هذه المحاولة تخلصت من الاخطاء التي سبقت و بقت لدي مشكلة صغيرة و هي انه عندما يصل الى اخر خانه في السطر الاول لا يستطيع التغيير لخانة اخرى ؟

الاخ kkhalil2005

جزاك الرحمن خيرا ساطلع على حلك و ملاحظاتك و احاول التعديل

شكرا

هذا الموضوع مغلق.

مواضيع مشابهة