Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 28.06.2010, 18:36   #1 (permalink)
twister-answer
Новичок
 
Регистрация: 28.06.2010
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Магический квадрат

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

Код:
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;
И есть просьба еще!....... если кому не сложно... помогите написать программу которая будет: Имитировать полет снаряда в условиях силы тяжести... а то у меня с графикой в делфи очень туго..

Огромное спасибо, всем отозвавшимся
twister-answer вне форума   Ответить с цитированием

Старый 28.06.2010, 18:36
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Тема с похожих содержанием уже встречалась, можете прочитать

Красный Квадрат
Срочно! Нужна программа. Нужно на компьютере начертить квадрат 15см.
Нарисовать квадрат с перекрестием внутри

Старый 28.06.2010, 18:43   #2 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

Как то интересно ты все делаешь..Я толком не помню паскаль но одно скажу тебе точно.. ты задаёшь двумерный массив,не чем его не заполняя, сразу начинаешь что то проверять как одномерный(что не верно) ...и проверка будет совсем по другому...
для начала заполни двумерный массив и выведи его на экран, потом выполни условие проверки для него и вывод "вердикта!"
массив сделай лучше поменьше(а то запаришся его заполнять в ручную, а random-ом он тебе где то с 1000 раза только этот квадрат сформирует)
сделай 3 на 3 и random задай удобный что бы "генерил" каждый 3 раз нужную матрицу
Dram вне форума   Ответить с цитированием
Старый 28.06.2010, 19:30   #3 (permalink)
twister-answer
Новичок
 
Регистрация: 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.
twister-answer вне форума   Ответить с цитированием
Старый 28.06.2010, 20:51   #4 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

че то тут у вас уже набуровлено даже не разберусь наверн ))
В общем я бы сделал проще : создаем двумерный массив и потом в циклах считаем его строки, столбцы диагонали и сверяем их друг с другом, последовательно если хоть одно отличие нашлось то вывод матрица не "магическая" ..ведь задача стоит проверить маг. квадрат а не построить
Dram вне форума   Ответить с цитированием
Старый 28.06.2010, 21:18   #5 (permalink)
DDS
Member
 
Регистрация: 15.02.2009
Сообщений: 695
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 523
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 28.06.2010, 21:47   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от twister-answer Посмотреть сообщение
Народ! Подскажите, что не так в программе.
Задание: Выяснить, является ли заданная квадратная матрица «магическим квадратом».
Магический квадрат - это матрица в которой сумма всех строк, всех столбцов и всех диагоналей равны.
Да всё не так.
Прежде всего, прошу прощения, я буду разбирать программу только с точки зрения Паскаля - с "дельфийскими" прибамбасами разбирайтесь сами.
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;
Vladimir_S вне форума   Ответить с цитированием
Старый 28.06.2010, 22:04   #7 (permalink)
DDS
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.
DDS вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
magic, делфи, инфа, проги


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.