Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Магический квадрат (http://www.tehnari.ru/f41/t37452/)

twister-answer 28.06.2010 18:36

Магический квадрат
 
Народ! Подскажите, что не так в программе.
Задание: Выяснить, является ли заданная квадратная матрица «магическим квадратом».
Магический квадрат - это матрица в которой сумма всех строк, всех столбцов и всех диагоналей равны.

Код:

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;

И есть просьба еще!....... если кому не сложно... помогите написать программу которая будет: Имитировать полет снаряда в условиях силы тяжести... а то у меня с графикой в делфи очень туго:tehnari_ru_117:..

Огромное спасибо, всем отозвавшимся :tehnari_ru_953:

Dram 28.06.2010 18:43

Как то интересно ты все делаешь..Я толком не помню паскаль но одно скажу тебе точно.. ты задаёшь двумерный массив,не чем его не заполняя, сразу начинаешь что то проверять как одномерный(что не верно) ...и проверка будет совсем по другому...
для начала заполни двумерный массив и выведи его на экран, потом выполни условие проверки для него и вывод "вердикта!" ;)
массив сделай лучше поменьше(а то запаришся его заполнять в ручную, а random-ом он тебе где то с 1000 раза только этот квадрат сформирует)
сделай 3 на 3 и random задай удобный что бы "генерил" каждый 3 раз нужную матрицу

twister-answer 28.06.2010 19:30

там была процедура главная в проге...
вот пожалуйста вся прога целиком:
Код:

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.


Dram 28.06.2010 20:51

че то тут у вас уже набуровлено :D даже не разберусь наверн ))
В общем я бы сделал проще : создаем двумерный массив и потом в циклах считаем его строки, столбцы диагонали и сверяем их друг с другом, последовательно если хоть одно отличие нашлось то вывод матрица не "магическая" ..ведь задача стоит проверить маг. квадрат а не построить ;)

DDS 28.06.2010 21:18

Блин, очень лень разбираться в вашей программе и тем более что-то писать...
Ладно, если не много подождёте сделаю...

Vladimir_S 28.06.2010 21:47

Цитата:

Сообщение от twister-answer (Сообщение 354276)
Народ! Подскажите, что не так в программе.
Задание: Выяснить, является ли заданная квадратная матрица «магическим квадратом».
Магический квадрат - это матрица в которой сумма всех строк, всех столбцов и всех диагоналей равны.

Да всё не так.
Прежде всего, прошу прощения, я буду разбирать программу только с точки зрения Паскаля - с "дельфийскими" прибамбасами разбирайтесь сами.
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;


DDS 28.06.2010 22:04

Я сделал так...
Код:

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.



Часовой пояс GMT +4, время: 10:37.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.