Добавлен: 28.06.2023
Просмотров: 57
Скачиваний: 2
btn2: TButton; {кнопка проверки}
mmo1: TMemo; {поле ввода значений ячеек квадрата}
dlgOpen1: TOpenDialog;
btn3: TButton; {диалог открытия файла}
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
{выбрать файл на диске}
if dlgOpen1.Execute then
begin
mmo1.Lines.Clear; {очистить поле ввода}
mmo1.Lines.LoadFromFile(dlgOpen1.FileName); {загрузить в поле ввода содержимое файла }
end;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
baseSum,curSum,i,j,rows,cols,ncols: Integer;
s:string;
List: TStrings;
rectOk,digitsOk,magicOk: Boolean;
M: array of array of Integer;
begin
rectOk:=true; {квадрат имеет одинаковое количество строк и столбцов}
digitsOk:=True; {в ячейках квадрата записаны только целые числа }
ncols:=0; {счетчик колонок}
rows:=mmo1.Lines.Count; {количество строк в поле ввода }
{1. Расчет размеров кдварата }
for i:=1 to rows do
begin
{1.1. Разбить текущую строку на ячейки, разделитель - пробел }
s:=mmo1.Lines[i-1];
List := TStringList.Create;
try
ExtractStrings([' '], [], PChar(s), List);
{1.2. посчитать количество колонок }
cols:=List.Count;
{1.3. В случае несовпадения количества колонок в разных строках -
выдать флаг, что квадрат записан не правильно}
if (ncols=0) then ncols:=cols
else if (cols<>ncols) then rectOk:=false;
finally
List.Free;
end;
end;
{ при несовпадении количества строк и колонок выдать предупреждение,
что квадрат неправильный }
if (rows<>ncols) then rectOk:=false;
if (not rectOk) then MessageDlg('Не совпадает количество строк и столбцов',mtError,[mbCancel], 0)
else
begin
{ 2. Считывание ячеек квадрата }
{2.1. Выделение памяти под массив }
SetLength(M,rows,ncols);
{2.2. Считывание значений }
for i:=1 to rows do
begin
s:=mmo1.Lines[i-1];
List := TStringList.Create;
try
ExtractStrings([' '], [], PChar(s), List);
cols:=List.Count;
for j:=1 to cols do
begin
try
M[i-1,j-1] := StrToInt(List[j-1]);
except
on Exception : EConvertError do
{ если не удалось сконвертировать строку - выдать флаг,
что в ячейках квадрата присутствуют нечисловые данные }
digitsOk:=false;
end;
end;
finally
List.Free;
end;
end;
if (not digitsOk) then MessageDlg('Неправильный формат чисел в ячейках',mtError,[mbCancel], 0)
else
begin
if (rows=0) then MessageDlg('Не заданы входные данные',mtError,[mbCancel], 0)
else
begin
{расчет суммы по первой строке }
baseSum:=0;
for i:=1 to ncols do baseSum:= baseSum + M[0,i-1];
magicOk:=true;
{ расчет сумм по строкам и столбцам, если сумма не равна базовой,
то выдлать флаг, что квадрат не магический }
for i:=1 to ncols do
begin
curSum:=0;
for j:=1 to rows do
begin
curSum:=curSum + M[j-1,i-1];
end;
if (curSum<>baseSum) then magicOk:=false;
curSum:=0;
for j:=1 to rows do
begin
curSum:=curSum + M[i-1,j-1];
end;
if (curSum<>baseSum) then magicOk:=false;
end;
{ расчет суммы по диагонале слева направо }
curSum:=0;
for j:=1 to rows do
begin
curSum:=curSum + M[j-1,j-1];
end;
if (curSum<>baseSum) then magicOk:=false;
{расчет суммы по диагонали справа налево }
curSum:=0;
for j:=1 to rows do
begin
curSum:=curSum + M[j-1,ncols - j];
end;
if (curSum<>baseSum) then magicOk:=false;
{выдача результата}
if (magicOk) then MessageDlg('Это магический квадрат',mtInformation,[mbOK], 0)
else MessageDlg('Это не магический квадрат',mtInformation,[mbOK], 0);
end;
end;
M:=NIL; {освобождение памяти }
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
dlg: TForm2;
begin
{показать окно о программе}
dlg:=TForm2.Create(self);
dlg.ShowModal;
dlg.Free;
end;
end.
2.4 Тестирование программы
Для тестирования работы программы требуется запустить исполняемый файл magicrect.exe и загрузить тестовый пример sample.txt для анализа (путем нажатия на кнопку «Загрузить из файла». Вид окна после загрузки примера представлен на рисунке 6.
Рис.6 Вид окна после загрузки тестового примера.
После нажатия на кнопку «Проверка» должно появится сообщение «Это магический квадрат»:
Рис.7 Результат обработки тестового примера.
Если изменить первую цифру на букву «а», то результат будет представлять собой сообщение об ошибке:
Рис.8 Сообщение об ошибке при неправильных входных данных.
Теперь если заменить букву «а» на цифру «0», то результат будет представлять собой сообщение о том, что исходные данные не являются магическим квадратом.
Рис.9 Сообщение о том, что исходные данные не являются магическим квадратом
ЗАКЛЮЧЕНИЕ
В ходе курсовой работы получены навыки в составлении алгоритмов, реализации их во время программирования программного продукта, а также в отладке разработанной программы. Также закреплены навыки работы среде визуального проектирования программ Delphi с использованием языка программирования Object Pascal.
Цели и задачи курсовой работы выполнены полностью.