Описание применения
Данная программа позволяет строить магические квадраты размерности 6x6. Теория магических квадратов прошла долгий и сложный путь развития. Долгое время теория не находили широкого применения, ввиду того что для решения соответствующих естественнонаучных и технических задач не было необходимости в применении теории магических квадратов. Теория рассматривалась лишь в качестве одного из математических курьёзов. Только в XIX и XX вв. интерес к магическим квадратам вспыхнул с новой силой. Их стали исследовать с помощью методов высшей алгебры и операционного исчисления. Сегодня они применяются в криптографии и приборостроении. Традиционной сферой применения магических квадратов являются талисманы. К примеру, талисман Луны обладает определенными свойствами: предохраняет от кораблекрушения и болезней, делает человека любезным, способствует предотвращению дурного намерения, а так же укрепляет здоровье. Его гравируют на серебре в день и час Луны, когда Солнце или Луна находится в первых десяти градусах Рака. Однако существуют и магические квадраты для стихий и знаков Зодиака. Применяться данная программа может для развития мышления у детей, как развлечение для взрослых и как база, которую можно изменить и сделать программу более сложной, добавить различные уровни сложности.
Заключение
В настоящее время в нашу жизнь широко внедряются информационные технологии. На сегодняшний день, наверное, не осталось такой области, где бы они ни применялись. Постоянно растет объем и сложность обрабатываемой информации, требуются все новые и новые виды ее представления. Как показывает практика, большинство пользователей уже не представляют себе, как бы они выполняли свою работу, с которой прекрасно справлялись еще 10 – 15 лет назад, без помощи компьютера. В ходе исследовательской работы разработана тестирующая программа. Проектирование выполнено в системе Delphi. В работе: · представлена информация о магическом квадрате и используемом методе заполнения магического квадрата; · приведен теоретический материал о компонентах, используемых в программе; · представлен листинг программы; · приведен анализ и тестирование программы с подробным описанием. В наше время магические квадраты продолжают привлекать к себе внимание любителей математических игр и развлечений. Возросло число книг по занимательной математике, в которых содержатся головоломки и задачи, связанные с необычными квадратами. Для их успешного решения требуются не столько специальные знания, сколько смекалка и умение под- мечать числовые закономерности. Решение таких задач послужит прекрасной «гимнастикой для ума». Понять удивительную красоту, содержащуюся в магических квадратах не всякому дано, но один раз осознав стройность чисел можно получить огромное удовольствие. В результате написания данной курсовой работы был сделаны выводы: 1. Магические квадраты – это нечто удивительное, интересное и увлекательное. 2. Заполнять магические квадраты несложно, но необходимо знать некоторые правила. 3. Главными чертами магических квадратов являются не только ясность, чёткость и логика, но и эстетичность, стройность и красота. 4. Законы квадратов отражают законы красоты. В ходе работы познакомилась с более широкими возможностями языка программирования Delphi, по сравнению с языком Pascal. Постараюсь применить полученные знания при участии в олимпиадном движении по программированию. В ходе выполнения курсового проекта пришлось сталкиваться с некоторыми проблемами. Над программой было проведено ряд испытаний и тестов. В результате все ошибки и недочеты были устранены. Реализованные в проекте процедуры и функции работают без ошибок. Ошибки могут быть вызваны неправильной эксплуатацией программы или изменением кода.
1. Архангельский А.Я. Delphi 6. Справочное пособие – М.: ЗАО «Издательство БИНОМ», 2001. 2. Болл У., Коксетер Г. «Математические эссе и развлечения» - М.: Мир, 1986. 3. Культин Н.Б. Основы программирования в Delphi 7 – СПб.: БХВ-Петербург, 2003. 4. Постников М.М. «Магические квадраты» - М.: Наука, 1964. 5. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов – СПб.: Питер, 2008. -640 с. 6. Флёнов М. В. Библия Delphi - Москва, 2012.
Приложение Б Листинг программы type mass = array [0..5] of Integer; TForm1 = class(TForm) MagicSquare: TStringGrid; mm1: TMainMenu; N1: TMenuItem; N2: TMenuItem; GroupBox1: TGroupBox; pm1: TPopupMenu; None1: TMenuItem; N11: TMenuItem; N21: TMenuItem; N31: TMenuItem; N41: TMenuItem; N51: TMenuItem; CheckButton: TButton; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; procedure N51Click(Sender: TObject); procedure MagicSquareMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FillFixedLines(); function CheckAll():Boolean;//Проверяет правильность заполнения поля function CheckLines():Boolean;//проверяет совпадения в стоках и столбцах function CheckBorderLines():Boolean; procedure CheckButtonClick(Sender: TObject); procedure MagicSquareDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure N2Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure N6Click(Sender: TObject);//Проверяет "Соответстиве боковым линиям" private { Private declarations } public { Public declarations } end; var Form1: TForm1; SelectCol,SelectRow:Integer; Game: Integer; implementation uses Math, Unit2; {$R *.dfm} procedure TForm1.N51Click(Sender: TObject); begin MagicSquare.Cells[SelectCol,SelectRow]:= IntToStr((Sender as TMenuItem).Tag); end; procedure TForm1.MagicSquareMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SelectCol:= (X) div 32; SelectRow:= (Y) div 32; if (SelectCol <= 0) or (SelectCol >= 7) then Exit; if (SelectRow <= 0) or (SelectRow >= 7) then Exit; pm1.Popup(X+Left,Y+Top); end; procedure Clear(var a:mass); var i:Integer; begin for i:= 0 to 5 do a[i]:=0; end; procedure TForm1.FormCreate(Sender: TObject); begin // FillFixedLines(); end; function TForm1.CheckAll():Boolean; begin if not CheckBorderLines() then begin ShowMessage('Столбцы и строки, примыкающие к границам должны им соответствовать!'); CheckAll:= False; Exit; end; if not CheckLines() then begin ShowMessage('Строка или столбец имеет повторяющееся значение!'); CheckAll:= False; Exit; end; end; function TForm1.CheckLines():Boolean; var i,j:Integer; Col,Row:mass; begin Clear(Col); Clear(Row); for i:=1 to 6 do begin Clear(Row); for j:=1 to 6 do if Row[StrToInt(MagicSquare.Cells[i,j])] = 0 then Inc(Row[StrToInt(MagicSquare.Cells[i,j])]) else begin CheckLines:= False; Exit; end; end; for j:=1 to 6 do begin Clear(Col); for i:=1 to 6 do if Col[StrToInt(MagicSquare.Cells[i,j])] = 0 then Inc(Col[StrToInt(MagicSquare.Cells[i,j])]) else begin CheckLines:= False; Exit; end; end; CheckLines:=True; end; function CheckFill():Boolean; var i,j:Integer; begin for i:=1 to 6 do for j:= 1 to 6 do if Form1.MagicSquare.Cells[i,j] = '' then begin Result:= False; Exit; end; Result:= True; end; function TForm1.CheckBorderLines():Boolean; var i,count:Integer; begin count:= 0; for i:= 1 to 6 do if not(MagicSquare.Cells[i,1] = MagicSquare.Cells[i,0]) and not(MagicSquare.Cells[i,1] = '0') then begin CheckBorderLines:= False; Exit; end; CheckBorderLines:= True; end; procedure TForm1.FillFixedLines(); var i:Integer; t:Integer; a:mass; begin Randomize(); Clear(a); for i:=1 to 6 do //Заполняем первый столбец рандомом begin t:= Random(5)+1; while not(a[t] = 0) do begin t:= Random(6); end; Inc(a[t]); MagicSquare.Cells[0,i]:= IntToStr(t); end; if MagicSquare.Cells[0,6] = '0' then MagicSquare.Cells[0,6]:= IntToStr(Random(4)+1); Clear(a); a[StrToInt(MagicSquare.Cells[0,1])]:= 1; MagicSquare.Cells[1,0]:= MagicSquare.Cells[0,1]; for i:=2 to 6 do begin t:= Random(5)+1; while not(a[t] = 0) do begin t:= Random(6); end; Inc(a[t]); MagicSquare.Cells[i,0]:= IntToStr(t); end; if MagicSquare.Cells[6,0] = '0' then MagicSquare.Cells[6,0]:= IntToStr(Random(4)+1); Clear(a); a[StrToInt(MagicSquare.Cells[6,0])]:= 1; MagicSquare.Cells[7,1]:= MagicSquare.Cells[6,0]; for i:=2 to 6 do begin t:= Random(5)+1; while not(a[t] = 0) do begin t:= Random(6); end; Inc(a[t]); MagicSquare.Cells[7,i]:= IntToStr(t); end; if MagicSquare.Cells[7,6] = '0' then MagicSquare.Cells[7,6]:= IntToStr(Random(4)+1); Clear(a); a[StrToInt(MagicSquare.Cells[7,6])]:= 1; a[StrToInt(MagicSquare.Cells[0,6])]:= 1; MagicSquare.Cells[6,7]:= MagicSquare.Cells[7,6]; MagicSquare.Cells[1,7]:= MagicSquare.Cells[0,6]; for i:=2 to 5 do begin t:= Random(5)+1; while not(a[t] = 0) do begin t:= Random(6); end; Inc(a[t]); MagicSquare.Cells[i,7]:= IntToStr(t); end; //В процессе заполнения, некоторые значения получили нуули! //Избавимся от них for i:=2 to 6 do if MagicSquare.Cells[i,0] = '0' then MagicSquare.Cells[i,0]:= IntToStr(Random(4)+1); for i:=2 to 6 do if MagicSquare.Cells[7,i] = '0' then MagicSquare.Cells[7,i]:= IntToStr(Random(4)+1); for i:=2 to 6 do if MagicSquare.Cells[i,7] = '0' then MagicSquare.Cells[i,7]:= IntToStr(Random(4)+1); for i:=2 to 6 do if MagicSquare.Cells[0,i] = '0' then MagicSquare.Cells[0,i]:= IntToStr(Random(4)+1); end; procedure TForm1.MagicSquareDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var i,j:Integer; begin if (Arow = 0) or (Arow = 7) or (ACol = 0) or (ACol = 7) then MagicSquare.Canvas.Brush.Color:= clGreen else if MagicSquare.Cells[ACol,Arow] = '0' then MagicSquare.Canvas.Brush.Color:= clBlack else MagicSquare.Canvas.Brush.Color:= clWhite; MagicSquare.Canvas.FillRect(Rect); MagicSquare.Canvas.TextOut(Rect.Left+2,Rect.Top,MagicSquare.Cells[Acol,Arow]); end; procedure TForm1.N2Click(Sender: TObject); begin CLose(); end; procedure TForm1.N3Click(Sender: TObject); var i,j:Integer; S: string; Sub: TStringList; SubMass: array [1..8] of String; Count: Integer; begin Randomize; Game:= RandomRange(1, 6); Sub:= TStringList.Create; Sub.LoadFromFile('start/' + IntToStr(Game) + '.txt'); S:= Sub.Strings[0]; Count:= 1; while Pos(' ', S) <> 0 do begin SubMass[Count]:= Copy(S, 1, Pos(' ', S) - 1); S:= Copy(S, Pos(' ', S) + 1, MaxInt); Inc(Count); end; for I:= 1 to MagicSquare.RowCount - 1 do begin MagicSquare.Cells[I, 0]:= SubMass[I]; end; S:= Sub.Strings[1]; Count:= 1; while Pos(' ', S) <> 0 do begin SubMass[Count]:= Copy(S, 1, Pos(' ', S) - 1); S:= Copy(S, Pos(' ', S) + 1, MaxInt); Inc(Count); end; for I:= 1 to MagicSquare.RowCount - 1 do begin MagicSquare.Cells[7, I]:= SubMass[I]; end; S:= Sub.Strings[2]; Count:= 1; while Pos(' ', S) <> 0 do begin SubMass[Count]:= Copy(S, 1, Pos(' ', S) - 1); S:= Copy(S, Pos(' ', S) + 1, MaxInt); Inc(Count); end; for I:= 1 to MagicSquare.RowCount - 1 do begin MagicSquare.Cells[I, 7]:= SubMass[I]; end; S:= Sub.Strings[3]; Count:= 1; while Pos(' ', S) <> 0 do begin SubMass[Count]:= Copy(S, 1, Pos(' ', S) - 1); S:= Copy(S, Pos(' ', S) + 1, MaxInt); Inc(Count); end; for I:= 1 to MagicSquare.RowCount - 1 do begin MagicSquare.Cells[0, I]:= SubMass[I]; end; end; procedure Check; var Sub: TStringList; S, S1: String; I, X: Integer; begin if not CheckFill() then begin ShowMessage('Поле должно быть заполнено полностью'); Exit; end; Sub:= TStringList.Create; Sub.LoadFromFile('finish/' + IntToStr(Game) + '.txt'); S:= ''; for I:= 1 to Form1.MagicSquare.RowCount - 2 do for X:= 1 to Form1.MagicSquare.RowCount - 2 do begin S:= S + Form1.MagicSquare.Cells[X, I] + ' '; end; S1:= ''; for I:= 0 to Sub.Count - 1 do begin S1:= S1 + Sub.Strings[I]; end; if S = S1 then ShowMessage('Вы выиграли!!') else ShowMessage('Вы проиграли.'); end;
|