28.06.2010, 18:36 | #1 (permalink) |
Новичок
Регистрация: 28.06.2010
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Магический квадрат
Задание: Выяснить, является ли заданная квадратная матрица «магическим квадратом». Магический квадрат - это матрица в которой сумма всех строк, всех столбцов и всех диагоналей равны. Код:
procedure TForm1.Button2Click(Sender: TObject); // Процедура нажатия на кнопку "Магический квадрат" var a:array[1..10,1..10]of integer;//матрица, которую проверяем на "магичность" magic, // магический квадрат или нет (=0 - нет, =1 - да) i, // счётчик циклов sum:integer; // сумма элементов строки матрицы begin //Проверяем заполненную матрицу на «магичность» magic:=1; // предполагаем, что матрица магический квадрат sum:=0; // пока сумма элементов строки матрицы = 0 //подсчитываем сумму for i:=1 to 10 do sum:=sum+a[i,1]+a[i,2]+a[i,3]+a[i,4]+a[i,5]+a[i,6]+a[i,7]+a[i,8]+a[i,9]+a[i,10]; //проверяем все строки for i:=1 to 10 do if(sum <> a[i,1]+a[i,2]+a[i,3]+a[i,4]+a[i,5]+a[i,6]+a[i,7]+a[i,8]+a[i,9]+a[i,10]) then magic:=0; //проверяем все столбцы for i:=1 to 10 do if(sum <> a[1,i]+a[2,i]+a[3,i]+a[4,i]+a[5,i]+a[6,i]+a[7,i]+a[8,i]+a[9,i]+a[10,i]) then magic:=0; //проверяем диагонали if(sum <> a[1,1]+a[2,2]+a[3,3]+a[4,4]+a[5,5]+a[6,6]+a[7,7]+a[8,8]+a[9,9]+a[10,10]) then magic:=0; // ВЫВОДИМ РЕЗУЛЬТАТ if (magic=1) then label3.caption:='Матрица является Магическим квадратом' else label3.caption:='Матрица не является Магическим квадратом'; end; Огромное спасибо, всем отозвавшимся |
28.06.2010, 18:36 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Тема с похожих содержанием уже встречалась, можете прочитать Красный Квадрат Срочно! Нужна программа. Нужно на компьютере начертить квадрат 15см. Нарисовать квадрат с перекрестием внутри |
28.06.2010, 18:43 | #2 (permalink) |
Экономичный вид памяти
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
|
Как то интересно ты все делаешь..Я толком не помню паскаль но одно скажу тебе точно.. ты задаёшь двумерный массив,не чем его не заполняя, сразу начинаешь что то проверять как одномерный(что не верно) ...и проверка будет совсем по другому...
для начала заполни двумерный массив и выведи его на экран, потом выполни условие проверки для него и вывод "вердикта!" массив сделай лучше поменьше(а то запаришся его заполнять в ручную, а random-ом он тебе где то с 1000 раза только этот квадрат сформирует) сделай 3 на 3 и random задай удобный что бы "генерил" каждый 3 раз нужную матрицу |
28.06.2010, 19:30 | #3 (permalink) |
Новичок
Регистрация: 28.06.2010
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
там была процедура главная в проге...
вот пожалуйста вся прога целиком: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, Grids, Menus, jpeg, ExtCtrls; type TForm1 = class(TForm) StringGrid1: TStringGrid; SpinEdit1: TSpinEdit; Label2: TLabel; Button1: TButton; Button2: TButton; Button4: TButton; MainMenu1: TMainMenu; N1: TMenuItem; Label1: TLabel; Label4: TLabel; Label3: TLabel; Button3: TButton; Button5: TButton; procedure SpinEdit1Change(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure N1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i,j:byte; implementation uses Unit2; {$R *.dfm} procedure TForm1.SpinEdit1Change(Sender: TObject); begin StringGrid1.RowCount:=strtoint(SpinEdit1.Text); StringGrid1.ColCount:=strtoint(SpinEdit1.Text); end; procedure TForm1.Button1Click(Sender: TObject); begin randomize; for i:=0 to strtoint(spinEdit1.Text) do for j:=0 to strtoint(spinEdit1.Text) do StringGrid1.Cells[i,j]:=inttostr(random(100)); end; procedure TForm1.Button5Click(Sender: TObject); begin StringGrid1.Options:=StringGrid1.Options-[goEditing]; Button5.Visible:=false; Button3.Visible:=true; end; procedure TForm1.Button4Click(Sender: TObject); begin Application.Terminate; end; procedure TForm1.Button2Click(Sender: TObject); // Процедура нажатия на кнопку "Магический квадрат" var a:array[1..10,1..10]of integer;//матрица, которую проверяем на "магичность" magic, // магический квадрат или нет (=0 - нет, =1 - да) i, // счётчик циклов sum:integer; // сумма элементов строки матрицы begin //Проверяем заполненную матрицу на «магичность» magic:=1; // предполагаем, что матрица магический квадрат sum:=0; // пока сумма элементов строки матрицы = 0 //подсчитываем сумму for i:=1 to 10 do sum:=sum+a[i,1]+a[i,2]+a[i,3]+a[i,4]+a[i,5]+a[i,6]+a[i,7]+a[i,8]+a[i,9]+a[i,10]; //проверяем все строки for i:=1 to 10 do if(sum <> a[i,1]+a[i,2]+a[i,3]+a[i,4]+a[i,5]+a[i,6]+a[i,7]+a[i,8]+a[i,9]+a[i,10]) then magic:=0; //проверяем все столбцы for i:=1 to 10 do if(sum <> a[1,i]+a[2,i]+a[3,i]+a[4,i]+a[5,i]+a[6,i]+a[7,i]+a[8,i]+a[9,i]+a[10,i]) then magic:=0; //проверяем диагонали if(sum <> a[1,1]+a[2,2]+a[3,3]+a[4,4]+a[5,5]+a[6,6]+a[7,7]+a[8,8]+a[9,9]+a[10,10]) then magic:=0; // ВЫВОДИМ РЕЗУЛЬТАТ if (magic=1) then label3.caption:='Матрица является Магическим квадратом' else label3.caption:='Матрица не является Магическим квадратом'; end; procedure TForm1.N1Click(Sender: TObject); begin form2.show; end; procedure TForm1.Button3Click(Sender: TObject); begin StringGrid1.Options:=StringGrid1.Options+[goEditing]; Button3.Visible:=false; Button5.Visible:=true; end; end. |
28.06.2010, 20:51 | #4 (permalink) |
Экономичный вид памяти
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
|
че то тут у вас уже набуровлено даже не разберусь наверн ))
В общем я бы сделал проще : создаем двумерный массив и потом в циклах считаем его строки, столбцы диагонали и сверяем их друг с другом, последовательно если хоть одно отличие нашлось то вывод матрица не "магическая" ..ведь задача стоит проверить маг. квадрат а не построить |
28.06.2010, 21:18 | #5 (permalink) |
Member
Регистрация: 15.02.2009
Сообщений: 695
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 523
|
Блин, очень лень разбираться в вашей программе и тем более что-то писать...
Ладно, если не много подождёте сделаю... |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
28.06.2010, 21:47 | #6 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Прежде всего, прошу прощения, я буду разбирать программу только с точки зрения Паскаля - с "дельфийскими" прибамбасами разбирайтесь сами. 1. Начинаете Вы с того, что подсчитываете сумму ВСЕХ ЭЛЕМЕНТОВ МАТРИЦЫ! Вопрос - зачем? И это Вы делаете весьма странным образом. Кто Вам мешает ввести второй счетчик? 2. Далее. В обоих циклах ("проверяем все строки" и "проверяем все столбцы") Вы ВНОВЬ СУММИРУЕТЕ ВСЕ ЭЛЕМЕНТЫ МАТРИЦЫ! Естественно, эти суммы совпадут с исходной. 3. В цикле "проверяем диагонали" Вы суммируете элементы ТОЛЬКО ГЛАВНОЙ ДИАГОНАЛИ. Эта сумма, разумеется, с исходной не совпадет. Для начала предлагаю не оптимальный, но зато простой вариант: Код:
procedure TForm1.Button2Click(Sender: TObject); // Процедура нажатия на кнопку "Магический квадрат" var a:array[1..10,1..10]of integer;//матрица, которую проверяем на "магичность" magic, // магический квадрат или нет (=0 - нет, =1 - да) i,j // счётчик циклов sum, sum_base:integer; // сумма элементов строки матрицы begin //Проверяем заполненную матрицу на «магичность» magic:=1; // предполагаем, что матрица магический квадрат sum_base:=0; // пока сумма элементов строки матрицы = 0 //подсчитываем сумму for i:=1 to 10 do sum_base:=sum_base+a[1,i]; //проверяем все строки, кроме первой (сумму ее элементов мы приняли в качестве базовой). for i:=2 to 10 do begin sum:=0; for j:=1 to 10 do sum:=sum+a[i,j]; if sum<>sum_base then magic:=0; end; //проверяем все столбцы for j:=1 to 10 do begin sum:=0; for i:=1 to 10 do sum:=sum+a[i,j]; if sum<>sum_base then magic:=0; end; //проверяем диагонали sum:=0; for i:=1 to 10 do sum:=sum+a[i,i]; if sum<>sum_base then magic:=0; sum:=0; for i:=1 to 10 do sum:=sum+a[i,10-i+1]; if sum<>sum_base then magic:=0; // ВЫВОДИМ РЕЗУЛЬТАТ if (magic=1) then label3.caption:='Матрица является Магическим квадратом' else label3.caption:='Матрица не является Магическим квадратом'; end; |
|
28.06.2010, 22:04 | #7 (permalink) |
Member
Регистрация: 15.02.2009
Сообщений: 695
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 523
|
Я сделал так...
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure exit; begin ShowMessage('Не магический квадрат!'); halt; end; procedure TForm1.FormCreate(Sender: TObject); const n=3; var a:array[1..n,1..n]of integer; i,j:byte; s,s1:integer; begin randomize; for i:=1 to n do for j:=1 to n do begin a[i,j]:=1{random(10)}; Form1.StringGrid1.cells[i-1,j-1]:=IntToStr(a[i,j]); end; s:=0; s1:=0; for i:=1 to n do s:=a[i,i]+s; for i:=1 to n do begin for j:=1 to n do s1:=s1+a[i,j]; if s1<>s then exit; s1:=0; end; for i:=1 to n do begin for j:=n downto 1 do s1:=s1+a[i,j]; if s1<>s then exit; s1:=0; end; for j:=1 to n do begin for i:=1 to n do s1:=s1+a[i,j]; if s1<>s then exit; s1:=0; end; ShowMessage('Магический квадрат!'); end; end. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
magic, делфи, инфа, проги |
|
|