Advertisement
anticlown

Laba.4.Dop.1_Determinant(Delphi)

Mar 3rd, 2023
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 17.70 KB | None | 0 0
  1. Unit UnitMain;
  2.  
  3. Interface
  4.  
  5. Uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.ComCtrls,
  8.   Vcl.Menus, Vcl.ExtCtrls;
  9.  
  10. Type
  11.   TMatrix = Array Of Array Of Integer;
  12.   TfrmForm = Class(TForm)
  13.     pBack: TPanel;
  14.     btConfirmMatrix: TButton;
  15.     btConfirmSize: TButton;
  16.     btFindDeterminant: TButton;
  17.     eSize: TEdit;
  18.     lbMatrixRequirement: TLabel;
  19.     lbSizeRequierement: TLabel;
  20.     lbTaskInfo: TLabel;
  21.     lbWelcome: TLabel;
  22.     mmMainMenu: TMainMenu;
  23.     miFileMenu: TMenuItem;
  24.     miOpenFromFile: TMenuItem;
  25.     miSaveToFile: TMenuItem;
  26.     miInfoAboutDeveloper: TMenuItem;
  27.     miInstruction: TMenuItem;
  28.     pumPopupMenu: TPopupMenu;
  29.     strgrMatrix: TStringGrid;
  30.     svdSaveToFileDialog: TSaveDialog;
  31.     opdOpenFromFileDialog: TOpenDialog;
  32.     lbAnswer: TLabel;
  33.     lbFinalResult: TLabel;
  34.     Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  35.     Procedure FormCreate(Sender: TObject);
  36.     Procedure miInfoAboutDeveloperClick(Sender: TObject);
  37.     Procedure miInstructionClick(Sender: TObject);
  38.     Procedure miOpenFromFileClick(Sender: TObject);
  39.     Procedure eSizeChange(Sender: TObject);
  40.     Procedure eSizeKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  41.     Procedure eSizeKeyPress(Sender: TObject; Var Key: Char);
  42.     Procedure btConfirmMatrixClick(Sender: TObject);
  43.     Procedure btConfirmSizeClick(Sender: TObject);
  44.     Procedure strgrMatrixKeyDown(Sender: TObject; Var Key: Word;
  45.       Shift: TShiftState);
  46.     Procedure strgrMatrixKeyPress(Sender: TObject; Var Key: Char);
  47.     Procedure btFindDeterminantClick(Sender: TObject);
  48.     Procedure miSaveToFileClick(Sender: TObject);
  49.   End;
  50.  
  51. Var
  52.   frmForm: TfrmForm;
  53.   PreviousSize: Integer;
  54.   InputMatrix: TMatrix;
  55.  
  56. Implementation
  57.  
  58. {$R *.dfm}
  59.  
  60. Function IsFileCorrect(Path: String): Boolean;
  61. Const
  62.     MIN_SIZE = 1;
  63.     MAX_SIZE = 10;
  64.     MIN_VALUE = -99;
  65.     MAX_VALUE  = 99;
  66. Var
  67.     InputFile: TextFile;
  68.     IsCorrect: Boolean;
  69.     Size, MatrixSize, I, J: Integer;
  70.     Matrix: TMatrix;
  71. Begin
  72.     AssignFile(InputFile, Path);
  73.     IsCorrect := True;
  74.  
  75.     Try
  76.         Try
  77.             Reset(InputFile);
  78.             Readln(InputFile, Size);
  79.  
  80.             If (Size < MIN_SIZE) Or (Size > MAX_SIZE) Then
  81.                 IsCorrect := False
  82.             Else
  83.             Begin
  84.                 MatrixSize := Size;
  85.                 SetLength(Matrix, MatrixSize, MatrixSize);
  86.                 I := 0;
  87.  
  88.                 While (IsCorrect) And (I < MatrixSize) Do
  89.                 Begin
  90.                     J := 0;
  91.  
  92.                     While (IsCorrect) And (J < MatrixSize) Do
  93.                     Begin
  94.                         Read(InputFile, Matrix[I, J]);
  95.                         If (Matrix[I, J] < MIN_VALUE) Or (Matrix[I, J] > MAX_VALUE) Then
  96.                             IsCorrect := False;
  97.                         Inc(J);
  98.                     End;
  99.  
  100.                     Inc(I);
  101.                 End;
  102.             End;
  103.         Finally
  104.             CloseFile(InputFile);
  105.         End;
  106.     Except
  107.         IsCorrect := False;
  108.     End;
  109.  
  110.     IsFileCorrect := IsCorrect;
  111. End;
  112.  
  113. Procedure GetSizeFromFile(Path: String; Var Size: Single; Var IsCorrect: Boolean);
  114. Var
  115.    InputFile: TextFile;
  116.    Null: String;
  117. Begin
  118.     IsCorrect := True;
  119.     Try
  120.         AssignFile(InputFile, Path);
  121.         Try
  122.             Reset(InputFile);
  123.             Readln(InputFile, Null);
  124.  
  125.             If (Null <> '') Then
  126.               IsCorrect := True
  127.         Else
  128.         Begin
  129.             IsCorrect := False;
  130.             Application.MessageBox('Файл пуст!', 'Ошибка', MB_ICONERROR);
  131.         End;
  132.         Finally
  133.             Close(InputFile);
  134.         End;
  135.     Except
  136.         Application.MessageBox('Ошибка доступа!', 'Ошибка', MB_ICONERROR);
  137.     End;
  138.  
  139.     If (IsCorrect) Then
  140.     Begin
  141.         Try
  142.             Try
  143.                 Reset(InputFile);
  144.                 Readln(InputFile, Size);
  145.             Finally
  146.                 Close(InputFile);
  147.             End;
  148.         Except
  149.             IsCorrect := False;
  150.         End;
  151.     End;
  152. End;
  153.  
  154. Function GetMatrixFromFile(Path: String; Size: Single; Matrix: TMatrix; Var IsCorrect: Boolean): TMatrix;
  155. Var
  156.    InputFile: TextFile;
  157.    I, J: Integer;
  158.    Null: String;
  159. Begin
  160.     IsCorrect := True;
  161.     Try
  162.         AssignFile(InputFile, Path);
  163.         Reset(InputFile);
  164.         Readln(InputFile, Null);
  165.         If (Null <> '') Then
  166.             IsCorrect := True
  167.         Else
  168.         Begin
  169.             IsCorrect := False;
  170.             Application.MessageBox('Данные в файле введены неверно или отсутствуют!', 'Ошибка', MB_ICONERROR);
  171.         End;
  172.  
  173.     Except
  174.         Application.MessageBox('Ошибка доступа!', 'Ошибка', MB_ICONERROR);
  175.     End;
  176.  
  177.     If (IsCorrect) Then
  178.     Begin
  179.         Try
  180.             Reset(InputFile);
  181.             Readln(InputFile);
  182.             For I := Low(Matrix) To High(Matrix) Do
  183.                 For J := Low(Matrix[0]) To High(Matrix[0]) Do
  184.                     Read(InputFile, Matrix[I, J]);
  185.         Except
  186.             IsCorrect := False;
  187.         End;
  188.         Close(InputFile);
  189.     End;
  190.  
  191.     GetMatrixFromFile := Matrix;
  192. End;
  193.  
  194. Function FindDeterminant(Matrix: TMatrix): Integer;
  195. Var
  196.     Sign, I, K, J, M, Counter, Sum: Integer;
  197.     Minor: TMatrix;
  198. Begin
  199.     Sum := 0;
  200.     If High(Matrix) = 0 Then
  201.         FindDeterminant := Matrix[0, 0]
  202.     Else
  203.     Begin
  204.         SetLength(Minor, High(Matrix), High(Matrix));
  205.         Counter := 0;
  206.         For K := 0 To High(Matrix) Do
  207.         Begin
  208.             Sign := -1;
  209.             For M := 0 To K Do
  210.                 Sign := -Sign;
  211.             For I := 1 To High(Matrix) Do
  212.                 For J := 0 To High(Matrix) Do
  213.                 Begin
  214.                     If (J <> K) Then
  215.                     Begin
  216.                         Minor[I - 1, (Counter Mod High(Matrix))] := Matrix[I, J];
  217.                         Inc(Counter);
  218.                     End;
  219.                 End;
  220.             Sum := Sum + (Sign * Matrix[0, K] * FindDeterminant(Minor));
  221.         End;
  222.         FindDeterminant := Sum;
  223.     End;
  224. End;
  225.  
  226. Procedure TfrmForm.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  227. Begin
  228.     If Application.MessageBox(PChar('Вы уверены, что хотите выйти?'), PChar('Выход'),
  229.         MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1 + MB_TASKMODAL) = IDYES Then
  230.           CanClose := True
  231.           Else
  232.           Begin
  233.               CanClose := False;
  234.           End;
  235. End;
  236.  
  237. Procedure TfrmForm.FormCreate(Sender: TObject);
  238. Begin
  239.     UnitMain.PreviousSize := 1;
  240. End;
  241.  
  242. Procedure TfrmForm.miInfoAboutDeveloperClick(Sender: TObject);
  243. Const
  244.     FIRST_MESSAGE = 'Ф.И.О.: Карась А.С. a.k.a Clownfish' + #13#10;
  245.     SECOND_MESSAGE = 'Группа: 251004' + #13#10;
  246.     THIRD_MESSAGE = 'Контакты: предварительная запись вживую по адресу' + #13#10;
  247.     FOURTH_MESSAGE = 'г.Гродно, ул.Мостовая, д.31';
  248. Begin
  249.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE,'О разработчике');
  250. End;
  251.  
  252. Procedure TfrmForm.miInstructionClick(Sender: TObject);
  253. Const
  254.     FIRST_MESSAGE = '- Вводимыми значениями могут являться только целые числа!' + #13#10;
  255.     SECOND_MESSAGE = '- Диапазон ввода размера матрицы: 1...10' + #13#10;
  256.     THIRD_MESSAGE = '- Диапазон вводимых значений: -99...99. ' + #13#10;
  257.     FOURTH_MESSAGE = '- Для ввода из файла используйте вкладку ''Файл'' - ''Открыть''.' + #13#10;
  258.     FIFTH_MESSAGE = '- Для сохранения в файл используйте вкладку ''Файл'' - ''Сохранить''.' + #13#10;
  259. Begin
  260.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE
  261.                             + FOURTH_MESSAGE + FIFTH_MESSAGE, 'Справка');
  262. End;
  263.  
  264. Procedure TfrmForm.miOpenFromFileClick(Sender: TObject);
  265. Var
  266.     SizeFromFile: Single;
  267.     IsCorrect: Boolean;
  268.     I, J: Integer;
  269.     Matrix, MatrixFromFile: TMatrix;
  270. Begin
  271.     If opdOpenFromFileDialog.Execute() Then
  272.         If IsFileCorrect(opdOpenFromFileDialog.FileName) Then
  273.         Begin
  274.             GetSizeFromFile(opdOpenFromFileDialog.FileName, SizeFromFile, IsCorrect);
  275.             UnitMain.PreviousSize := Round(SizeFromFile);
  276.  
  277.             SetLength(Matrix, UnitMain.PreviousSize, UnitMain.PreviousSize);
  278.             SetLength(MatrixFromFile, UnitMain.PreviousSize, UnitMain.PreviousSize);
  279.             MatrixFromFile := GetMatrixFromFile(opdOpenFromFileDialog.FileName, UnitMain.PreviousSize, Matrix, IsCorrect);
  280.  
  281.             If (IsCorrect) Then
  282.             Begin
  283.                 eSize.Text := SizeFromFile.ToString;
  284.                 btConfirmSizeClick(Sender);
  285.  
  286.                 For I := Low(MatrixFromFile) To High(MatrixFromFile) Do
  287.                     For J := Low(MatrixFromFile[0]) To High(MatrixFromFile[0]) Do
  288.                     Begin
  289.                         strgrMatrix.Cells[J, I] := FloatToStr(MatrixFromFile[I, J]);
  290.                     End;
  291.                 btConfirmMatrixClick(Sender);
  292.             End;
  293.         End
  294.         Else
  295.             Application.MessageBox('Данные в файле некорректны, попробуйте ещё раз.', 'Ошибка!', MB_ICONERROR);
  296. End;
  297.  
  298. Procedure TfrmForm.eSizeChange(Sender: TObject);
  299. Begin
  300.     If Length(eSize.Text) > 0 Then
  301.         btConfirmSize.Enabled := True
  302.     Else
  303.     Begin
  304.         btConfirmSize.Enabled := False;
  305.     End;
  306. End;
  307.  
  308. Procedure TfrmForm.eSizeKeyDown(Sender: TObject; Var Key: Word;
  309.   Shift: TShiftState);
  310. Begin
  311.     TEdit(Sender).ReadOnly := (Shift=[ssShift]) Or (Shift=[ssCtrl]);
  312. End;
  313.  
  314. Procedure TfrmForm.eSizeKeyPress(Sender: TObject; Var Key: Char);
  315. Begin
  316.     If eSize.Text = '1' Then
  317.     Begin
  318.         btConfirmSize.Enabled := False;
  319.         eSize.MaxLength := 2;
  320.         If Not ((Key = '0') Or (Key = #8)) Then
  321.             Key := #0
  322.         Else
  323.             btConfirmSize.Enabled := True;
  324.     End
  325.     Else
  326.     Begin
  327.         eSize.MaxLength := 1;
  328.         btConfirmSize.Enabled := True;
  329.     End;
  330.     If (eSize.SelStart = 0) And (Key = '0') Then
  331.         Key := #0;
  332. End;
  333.  
  334. Procedure TfrmForm.btConfirmSizeClick(Sender: TObject);
  335. Const
  336.     MIN_VALUE = 1;
  337.     MAX_VALUE = 10;
  338. Var
  339.     IsCorrect: Boolean;
  340.     Value, I, J: Integer;
  341. Begin
  342.     IsCorrect := True;
  343.  
  344.     Try
  345.         Value := StrToInt(eSize.Text);
  346.  
  347.         If (Value < MIN_VALUE) Or (Value > MAX_VALUE) Then
  348.             IsCorrect := False;
  349.     Except
  350.         IsCorrect := False;
  351.     End;
  352.  
  353.     If IsCorrect Then
  354.     Begin
  355.         lbMatrixRequirement.Visible := True;
  356.         strgrMatrix.Visible := True;
  357.         strgrMatrix.Enabled := True;
  358.         btConfirmMatrix.Visible := True;
  359.         btConfirmMatrix.Enabled := True;
  360.         btConfirmSize.Default := False;
  361.         btConfirmMatrix.Default := True;
  362.         btConfirmSize.Enabled := False;
  363.         btFindDeterminant.Enabled := False;
  364.  
  365.         If UnitMain.PreviousSize <> StrToInt(eSize.Text) Then
  366.         Begin
  367.             For I := 1 To strgrMatrix.RowCount - 1 Do
  368.                 For J := 1 To strgrMatrix.ColCount - 1 Do
  369.                     strgrMatrix.Cells[J, I] := '';
  370.         End;
  371.  
  372.         UnitMain.PreviousSize := StrToInt(eSize.Text);
  373.         SetLength(UnitMain.InputMatrix, UnitMain.PreviousSize, UnitMain.PreviousSize);
  374.         strgrMatrix.RowCount := UnitMain.PreviousSize;
  375.         strgrMatrix.ColCount := UnitMain.PreviousSize;
  376.     End
  377.     Else
  378.     Begin
  379.         Application.MessageBox('Проверьте корректность данных и повторите попытку!', 'Ошибка');
  380.         strgrMatrix.Enabled := False;
  381.         btConfirmMatrix.Enabled := False;
  382.         btConfirmSize.Default := True;
  383.         btConfirmMatrix.Default := False;
  384.         btConfirmSize.Enabled := True;
  385.         btFindDeterminant.Enabled := True;
  386.     End;
  387. End;
  388.  
  389. Procedure TfrmForm.strgrMatrixKeyDown(Sender: TObject; Var Key: Word;
  390.   Shift: TShiftState);
  391. Begin
  392.     TEdit(Sender).ReadOnly := (Shift=[ssShift]) Or (Shift=[ssCtrl]);
  393. End;
  394.  
  395. Procedure TfrmForm.strgrMatrixKeyPress(Sender: TObject; Var Key: Char);
  396. Var
  397.     Col, Row: Word;
  398.     Temp: String;
  399. Begin
  400.     btConfirmMatrix.Enabled := True;
  401.     btFindDeterminant.Enabled := False;
  402.  
  403.     Col := strgrMatrix.Col;
  404.     Row := strgrMatrix.Row;
  405.  
  406.     Col := strgrMatrix.Col;
  407.     Row := strgrMatrix.Row;
  408.  
  409.     If Not(Key In ['0'..'9', #08, #45]) Then
  410.         Key := #0;
  411.     If (strgrMatrix.Cells[Col, Row] = '0') And (Key = '0') Then
  412.         Begin
  413.             Delete(Temp, Length(Temp), 1);
  414.             Key := #0;
  415.         End;
  416.     Temp := strgrMatrix.Cells[Col, Row];
  417.     If Length(strgrMatrix.Cells[Col, Row]) > 0 Then
  418.         Try
  419.             If (Temp[1] = '-') Then
  420.             Begin
  421.                 If (Key = '-') Then
  422.                     Key := #0;
  423.                 If (Length(strgrMatrix.Cells[Col, Row]) = 1) And (Key = '0') Then
  424.                     Key := #0;
  425.                 If (Length(strgrMatrix.Cells[Col, Row]) > 2) And Not (Key In [#8, #127]) Then
  426.                 Begin
  427.                     Delete(Temp, Length(Temp), 1);
  428.                     Key := #0;
  429.                 End;
  430.             End
  431.             Else
  432.             Begin
  433.                 If (Key = '-') Then
  434.                 Begin
  435.                     Try
  436.                         StrToInt(strgrMatrix.Cells[Col, Row] + '-');
  437.                     Except
  438.                         Key := #0;
  439.                     End;
  440.                 End;
  441.  
  442.                 If (Length(strgrMatrix.Cells[Col, Row]) > 1) And Not (Key In [#8, #127]) Then
  443.                 Begin
  444.                     Delete(Temp, Length(Temp), 1);
  445.                     Key := #0;
  446.                 End;
  447.             End;
  448.         Finally
  449.             //пока ничего
  450.         End;
  451. End;
  452.  
  453. Procedure TfrmForm.btConfirmMatrixClick(Sender: TObject);
  454. Const
  455.     MAX_VALUE = 99;
  456. Var
  457.     I, J, TempElem: Integer;
  458.     IsBlanc: Boolean;
  459.     IsCorrect: Boolean;
  460.     Str: String;
  461. Begin
  462.     IsBlanc:= False;
  463.  
  464.     For I := 1 To strgrMatrix.RowCount - 1 Do
  465.         For J := 1 To strgrMatrix.ColCount - 1 Do
  466.         Begin
  467.             Str := strgrMatrix.Cells[J, I];
  468.             If Str = '' Then
  469.                     IsBlanc:= True;
  470.         End;
  471.  
  472.  
  473.     If IsBlanc Then
  474.         Application.MessageBox('Вы не заполнили последовательность полностью. Пожалуйста, заполните пустые поля!','Ошибка')
  475.     Else
  476.     Begin
  477.         I := 0;
  478.         IsCorrect := True;
  479.  
  480.         While IsCorrect And (I < strgrMatrix.RowCount - 1) Do
  481.         Begin
  482.             J := 0;
  483.             While IsCorrect And (J < strgrMatrix.ColCount - 1) Do
  484.             Begin
  485.                 Try
  486.                     TempElem := StrToInt(strgrMatrix.Cells[J, I]);
  487.                     If (Abs(TempElem) > MAX_VALUE) Then
  488.                         IsCorrect := False;
  489.                 Except
  490.                     IsCorrect := False;
  491.                 End;
  492.                 Inc(J);
  493.                 If Not IsCorrect Then
  494.                 Begin
  495.                     Application.MessageBox('Вы допустили ошибку в ячейке.', 'Ошибка!', MB_ICONERROR);
  496.                     strgrMatrix.SetFocus;
  497.                 End;
  498.             End;
  499.             Inc(I);
  500.         End;
  501.  
  502.         If IsCorrect Then
  503.         Begin
  504.             For I := Low(UnitMain.InputMatrix) To High(UnitMain.InputMatrix) Do
  505.                 For J := Low(UnitMain.InputMatrix[0]) To High(UnitMain.InputMatrix[0]) Do
  506.                     UnitMain.InputMatrix[I, J] := StrToInt(strgrMatrix.Cells[J, I]);
  507.  
  508.             btFindDeterminant.Visible := True;
  509.             btFindDeterminant.Enabled := True;
  510.             btFindDeterminant.Default := True;
  511.             btConfirmMatrix.Default := False;
  512.             btConfirmMatrix.Enabled := False;
  513.         End;
  514.     End;
  515. End;
  516.  
  517. Procedure TfrmForm.btFindDeterminantClick(Sender: TObject);
  518. Var
  519.     Determinant: Integer;
  520. Begin
  521.     lbAnswer.Visible := True;
  522.     Determinant := FindDeterminant(InputMatrix);
  523.     lbFinalResult.Visible := True;
  524.     lbFinalResult.Caption := IntToStr(Determinant);
  525.     miSaveToFile.Enabled := True;
  526. End;
  527.  
  528. Procedure TfrmForm.miSaveToFileClick(Sender: TObject);
  529. Var
  530.     OutputFile: TextFile;
  531.     I, J: Integer;
  532. Begin
  533.     If svdSaveToFileDialog.Execute() And FileExists(svdSaveToFileDialog.FileName) Then
  534.     Begin
  535.         AssignFile(OutputFile, svdSaveToFileDialog.FileName);
  536.  
  537.         Try
  538.             Try
  539.                 Rewrite(OutputFile);
  540.  
  541.                 Writeln(OutputFile, 'Входные данные: ');
  542.                 Writeln(OutputFile, UnitMain.PreviousSize);
  543.                 For I := Low(UnitMain.InputMatrix) To High(UnitMain.InputMatrix) Do
  544.                 Begin
  545.                     For J := Low(UnitMain.InputMatrix[0]) To High(UnitMain.InputMatrix[0]) Do
  546.                         Write(OutputFile, UnitMain.InputMatrix[I, J], ' ');
  547.                     Write(OutputFile, #13#10);
  548.                 End;
  549.  
  550.                 Write(OutputFile, 'Ответ: ' + #13#10);
  551.                 Write(OutputFile, frmForm.lbFinalResult.Caption);
  552.  
  553.                 Application.MessageBox('Данные успешно записаны в файл!', 'Сохранение', MB_ICONINFORMATION);
  554.             Finally
  555.                 CloseFile(OutputFile);
  556.             End;
  557.         Except
  558.             Application.MessageBox('Отказано в доступе! Измените параметры файла! ', 'Ошибка!', MB_ICONERROR);
  559.         End;
  560.     End
  561.     Else
  562.         Application.MessageBox('Введено некорректное имя файла или закрыто окно сохранения!', 'Ошибка!', MB_ICONERROR);
  563. End;
  564.  
  565. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement