Как написать код программы, подбирающей магический квадрат 5х5 перебором? - VBA

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Прошу помощи. Не знаю, как написать код программы, подбирающей магический квадрат 5х5 перебором для VBA. Помогите, пожалуйста. Есть наработки ниже
ПРОГРАММА ПОСТРОЕНИЯ МАГИЧЕСКИХ КВАДРАТОВ Разработанная программа на языке Turbo Pascal позволяет строить магические квадраты любой четности при n≤19. Можно брать и большие значения n, но при n>19 квадрат не помещается на экране монитора). http://levvol.ru/ar2.php
Листинг программы
  1. Program MagicSquares;
  2. {Построение магических квадратов}
  3. Uses CRT;
  4. Type a_type=array[1..50,1..50] of integer;
  5. Var i,j,n:integer;
  6. a:a_type;
  7. t:boolean;
  8. {логическая переменная true (правда) или false (ложь)}
  9. x,y:integer;
  10. Label 1;
  11. {метка}
  12. Procedure Print(n:integer; a:a_type);
  13. {процедура вывода}
  14. Var i,j:integer;
  15. Begin
  16. for i:=1 to n do begin
  17. for j:=1 to n do write(a[i,j]:4);
  18. writeln('');
  19. end;
  20. end;
  21. Procedure WinSh(x1,y1,x2,y2,col1,col2:word);
  22. {процедура вывода окна}
  23. Begin
  24. TextBackGround(black);
  25. Window (x1+1,y1+1,x2+1,y2+1);
  26. {тень - черный прямоугольник}
  27. ClrScr;
  28. TextBackGround(col1);
  29. Window(x1,y1,x2,y2);
  30. ClrScr;
  31. TextColor(col2);
  32. {рисование рамки}
  33. GotoXY(2, 1); write('г');
  34. for i:=1 to x2-x1-2 do write('=');
  35. GotoXY(x2-x1,1); write('=');
  36. GotoXY(2,y2-y1+1);
  37. write('L'); for i:=1 to x2-x1-2 do write('=');
  38. GotoXY(x2-x1,y2-y1+1); write('-');
  39. for j:=2 to y2-y1 do begin
  40. GotoXY(2,j); write('¦');
  41. GotoXY(x2-x1,j); write('¦');
  42. end;
  43. End;
  44. Procedure OddMagic(n:integer; var a:a_type);
  45. {Процедура формирования магического квадрата при нечетном n. Описание алгоритма в сопроводительной записке }
  46. Var
  47. i,j,k:integer;
  48. p,l:integer;
  49. Begin
  50. for i:=1 to n do
  51. for j:=1 to n do a[i,j]:=0;
  52. j:=n div 2 +1; p:=sqr(n); i:=1; a[i,j]:=1;
  53. for l:=2 to p do begin
  54. i:=i-1;
  55. j:=j+1;
  56. if (i=0) and (j<>n+1) then i:=n;
  57. if (j=n+1) and (i<>0) then j:=1;
  58. if ((i=0) and (j=n+1)) or (a[i,j]<>0) then
  59. {важен порядок условий!}
  60. begin
  61. i:=i+2;
  62. j:=j-1;
  63. end;
  64. a[i,j]:=l;
  65. end;
  66. end;
  67. Procedure Two (n:integer; var a:a_type);
  68. {Процедура построения квадрата при n обычной четности: n=6,10,14,18...}
  69. Var
  70. u,i,j,k,m,z:integer;
  71. b:a_type;
  72. Begin
  73. u:= n div 2;
  74. m:=(u-1) div 2;
  75. OddMagic(u,b);
  76. {вызов процедуры построения квадрата при нечет-ном u}
  77. k:=u*u;
  78. for i:=1 to n do
  79. for j:=1 to n do begin
  80. if (i>=1) and (i<=u) and (j>=1) and (j<=u) then a[i,j]:=b[i,j];
  81. if (i>=u+1) and (i<=n) and (j>=u+1) and (j<=n) then a[i,j]:=b[i-u,j-u]+k;
  82. if (i>=1) and (i<=u) and (j>=u+1) and (j<=n) then a[i,j]:=b[i,j-u]+2*k;
  83. if (i>=u+1) and (i<=n) and (j>=1) and (j<=u) then a[i,j]:=b[i-u,j]+3*k;
  84. end;
  85. for i:=1 to u do
  86. if i=u div 2+1 then begin
  87. j:= u div 2+1;
  88. for k:=1 to m do begin
  89. z:=a[i,j];
  90. {обмен данными}
  91. a[i,j]:=a[i+u,j];
  92. a[i+u,j]:=z;
  93. j:=j-1
  94. end;
  95. end
  96. else begin
  97. j:=1;
  98. for k:=1 to m do begin
  99. z:=a[i,j];
  100. {обмен данными}
  101. a[i,j]:=a[i+u,j];
  102. a[i+u,j]:=z;
  103. j:=j+1
  104. end;
  105. end;
  106. j:=n;
  107. for k:=1 to m-1 do begin
  108. for i:=1 to u do begin
  109. z:=a[i,j]; a[i,j]:=a[i+u,j]; a[i+u,j]:=z;
  110. {обмен данными}
  111. end;
  112. j:=j-1
  113. end;
  114. end;
  115. Procedure Four(n:integer; var a:a_type);
  116. {Процедура построения квадрата при n двойной четности: n=4,8,12,16...}
  117. Var i,j,k:integer;
  118. p,l:integer;
  119. i1,j1,x,y:integer;
  120. Begin
  121. l:=1; p:=n*n;
  122. for i:=1 to n do
  123. for j:=1 to n do begin
  124. a[i,j]:=l;
  125. inc(l)
  126. {l:=l+1}
  127. end;
  128. i:=2;
  129. while i<=n-2 do begin
  130. if i mod 4=0 then j:=4
  131. else j:=2;
  132. while j<=n-2 do begin
  133. for i1:=0 to 1 do
  134. for j1:=0 to 1 do begin
  135. y:=i+i1; x:=j+j1;
  136. a[y,x]:=p-a[y,x]+1;
  137. end;
  138. j:=j+4;
  139. end;
  140. i:=i+2
  141. end;
  142. k:=4;
  143. while k<=n-4 do begin
  144. a[1,k]:=p-a[1,k]+1; a[1,k+1]:=p-a[1,k+1]+1;
  145. a[n,k]:=p-a[n,k]+1; a[n,k+1]:=p-a[n,k+1]+1;
  146. a[k,1]:=p-a[k,1]+1; a[k+1,1]:=p-a[k+1,1]+1;
  147. a[k,n]:=p-a[k,n]+1; a[k+1,n]:=p-a[k+1,n]+1;
  148. k:=k+4
  149. end;
  150. a[1,1]:=p-a[1,1]+1;
  151. a[n,n]:=p-a[n,n]+1;
  152. a[1,n]:=p-a[1,n]+1;
  153. a[n,1]:=p-a[n,1]+1;
  154. end;
  155. Procedure Test(n:integer; a:a_type; var t:boolean; var x,y:integer);
  156. {Процедура проверки сумм по строкам, столбцам и диагоналям квад-рата}
  157. Var s,z:array [1..50] of integer;
  158. {массивы для записи сумм по строкам и столбцам}
  159. sd,zd:integer;
  160. i,j,k:integer;
  161. sum:integer;
  162. Begin
  163. sum:=n*(n*n+1) div 2;
  164. for k:=1 to n do begin
  165. s[k]:=0;
  166. z[k]:=0
  167. end;
  168. sd:=0; zd:=0;
  169. for i:=1 to n do
  170. for j:=1 to n do begin
  171. s[i]:=s[i]+a[i,j];
  172. z[j]:=z[j]+a[i,j]
  173. end;
  174. for k:=1 to n do begin
  175. sd:=sd+a[k,k];
  176. zd:=zd+a[k,n-k+1];
  177. end;
  178. k:=1; t:=true;
  179. while (k<=n) and (t) do begin
  180. if s[k]<>sum then begin
  181. t:=false;
  182. {ошибка по строкам}
  183. y:=1;
  184. x:=k
  185. {номер строки}
  186. end;
  187. k:=k+1
  188. end;
  189. if (t) then begin
  190. k:=1;
  191. while (k<=n) and (t) do begin
  192. if z[k]<>sum then begin
  193. t:=false;
  194. {ошибка по столбцам}
  195. y:=2;
  196. x:=k
  197. {номер столбца}
  198. end;
  199. k:=k+1
  200. end;
  201. end;
  202. if (t) then if sd<>sum then begin
  203. t:=false;
  204. {ошибка по главной диагонали}
  205. y:=3;
  206. x:=0;
  207. end;
  208. if (t) then if zd<>sum then begin
  209. t:=false;
  210. {ошибка по побочной диагонали}
  211. y:=4;
  212. x:=0;
  213. end;
  214. if t then writeln('Тест прошел успешно');
  215. End;
  216. Begin
  217. {Основная программа}
  218. 1:
  219. TextBackGround(blue);
  220. ClrScr;
  221. WinSh(20,3,60,6,blue,white);
  222. GotoXY(9,2); write('Магический квадрат');
  223. GotoXY(10,3); write('(c) 2006 г.');
  224. Window(1,1,80,25); TextColor(yellow); TextBackGround(blue);
  225. GotoXY(60,18); write(' 8 ¦ 1 ¦ 6');
  226. GotoXY(60,19); write('===+===+===');
  227. GotoXY(60,20); write(' 3 ¦ 5 ¦ 7');
  228. GotoXY(60,21); write('===+===+===');
  229. GotoXY(60,22); write(' 4 ¦ 9 ¦ 2');
  230. TextColor(white); TextBackGround(white);
  231. for x:=2 to 79 do begin
  232. GotoXY(x,25);
  233. write(' ');
  234. end;
  235. GotoXY(5,25);
  236. write('Размерность =0 - конец работы программы. Рекомендуем размерность от 3 до 19');
  237. Winsh(30,10,50,12,cyan,white);
  238. repeat
  239. TextColor(white);
  240. GotoXY(4,2); write('Размерность=');readln(n);
  241. until (n<>1) and (n<>2);
  242. {квадрат для n=1 и для n=2 строить нельзя}
  243. if n=0 then halt;
  244. {выход из программы}
  245. {Если n-нечетно, то OddMag, иначе ...}
  246. if odd(n) then OddMagic(n,a)
  247. else if n mod 4=0 then Four(n,a)
  248. else Two(n,a);
  249. TextBackGround(blue);
  250. Window(1,1,80,25);
  251. ClrScr;
  252. TextColor(yellow);
  253. ClrScr;
  254. {вывод}
  255. Writeln('Магический квадрат ',n,'x',n);
  256. Print(n,a);
  257. writeln('');
  258. Test(n,a,t,x,y);
  259. {Процедура тестирования квадрата}
  260. if (t) then
  261. writeln('Суммы по столбцам, строкам и диагоналям =',n*(n*n+1) div 2)
  262. else begin
  263. writeln('Ошибка');
  264. case y of
  265. 1: writeln('Ошибка в строке ',x);
  266. 2: writeln('Ошибка в столбце ',x);
  267. 3: writeln('Ошибка по главной диагонали');
  268. 4: writeln('Ошибка по побочной диагонали')
  269. end;
  270. end;
  271. readln;
  272. goto 1;
  273. End.
null

Alex77755

, покажите нам новичкам, пожалуйста, как задать кодом построение магического квадрата для VBA. Блесните познаниями, если они есть. Достаточно схемы для матрицы 3х3. Остальное будет по аналогии. Согласно сумме арифметической прогрессии, определяем сумму ряда (столбца, строки и диагонали) для каждой размерности: • Матрица 2х2: ((1 + 4) * 4/2)/2 = 2,5 (не целое) — построить магический квадрат нельзя! • Матрица 3х3: ((1 + 9) * 9/2)/3 = 15 — построить магический квадрат можно! • Матрица 4х4: ((1 + 16) * 16/2)/4 = 34 — построить магический квадрат можно! • Матрица 5х5: ((1 + 25) * 25/2)/5 = 65 — построить магический квадрат можно! • Матрица 6х6: ((1 + 36) * 36/2)/6 = 111— построить магический квадрат можно! • И т. п. и т. д.

Решение задачи: «Как написать код программы, подбирающей магический квадрат 5х5 перебором?»

textual
Листинг программы
  1. Function Create_Magic(n As Integer) As Integer()
  2. Dim R() As Integer
  3.  
  4.     ReDim R(0 To n - 1, 0 To n - 1) As Integer
  5.    
  6.     ss% = (n - 1) \ 2
  7.     nn% = 1
  8.    
  9.     For i% = 0 To (n - 1)
  10.         For j% = 0 To n - 1
  11.             X% = (-ss% + i% + j% + n) Mod n
  12.             y% = (ss% + i% - j% + n) Mod n
  13.             R(X%, y%) = nn
  14.             nn = nn + 1
  15.         Next j%
  16.     Next i%
  17.    
  18.     Create_Magic = R
  19.  
  20. End Function
  21.  
  22. Sub Test()
  23. Dim X() As Integer
  24.  
  25.     X = Create_Magic(5)
  26.    
  27.     For i% = 0 To 4
  28.         For j% = 0 To 4
  29.             Cells(i% + 1, j% + 1).Value = X(i%, j%)
  30.         Next j%
  31.     Next i%
  32.  
  33. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы