Advertisement
Vladislav8653

2.4

Mar 6th, 2023 (edited)
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 15.48 KB | None | 0 0
  1. unit Unit1;
  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.StdCtrls, Vcl.Grids, Vcl.Menus;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Label1: TLabel;
  12.     Label2: TLabel;
  13.     Label3: TLabel;
  14.     Label4: TLabel;
  15.     Label5: TLabel;
  16.     Label6: TLabel;
  17.     StringGrid1: TStringGrid;
  18.     StringGrid2: TStringGrid;
  19.     Label7: TLabel;
  20.     Label8: TLabel;
  21.     Label9: TLabel;
  22.     Edit1: TEdit;
  23.     Button1: TButton;
  24.     SaveDialog1: TSaveDialog;
  25.     OpenDialog1: TOpenDialog;
  26.     MainMenu1: TMainMenu;
  27.     PopupMenu1: TPopupMenu;
  28.     N1: TMenuItem;
  29.     N2: TMenuItem;
  30.     N3: TMenuItem;
  31.     N4: TMenuItem;
  32.     N5: TMenuItem;
  33.     Button2: TButton;
  34.     procedure Button2Click(Sender: TObject);
  35.     procedure Edit1Change(Sender: TObject);
  36.     procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  37.     procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  38.       const Value: string);
  39.     procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
  40.     procedure Button1Click(Sender: TObject);
  41.     procedure N5Click(Sender: TObject);
  42.     procedure N4Click(Sender: TObject);
  43.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  44.     procedure N2Click(Sender: TObject);
  45.     procedure N3Click(Sender: TObject);
  46.   private
  47.     { Private declarations }
  48.   public
  49.     { Public declarations }
  50.   end;
  51.  
  52. Type
  53.     TMatrix = Array of Array of Integer;
  54.     TVector = Array of Integer;
  55.     TStr = Array of String[5];
  56.  
  57. var
  58.   Form1: TForm1;
  59.   Path, Result : String;
  60.   IsFileOpen : Boolean;
  61.  
  62. Const
  63.     BAD = 100000;
  64.  
  65. implementation
  66.  
  67. {$R *.dfm}
  68.  
  69. Function TransferMatrixVector (N, StartI, StartJ: Integer; Arr : TMatrix): TVector;
  70. Var
  71.     I, K, J, HalfN: ShortInt;
  72.     Quarter : TVector;
  73. Const
  74.     Min = 4;
  75. Begin
  76.     K := 0;
  77.     SetLength(Quarter,(N * N div Min));
  78.     HalfN := N div 2;
  79.     For I := StartI To StartI + HalfN - 1 Do
  80.         For J := StartJ To StartJ + HalfN - 1 Do
  81.             Begin
  82.                 Quarter[K] := Arr[I][J];
  83.                 Inc (K);
  84.             End;
  85.  
  86.     TransferMatrixVector := Quarter;
  87. End;
  88.  
  89.  
  90.  
  91. procedure TForm1.Button2Click(Sender: TObject);
  92. Var
  93.     N, J, I: Integer;
  94.     IsCorrect : Boolean;
  95. begin
  96.     IsCorrect := True;
  97.     try
  98.         N := StrToInt(Edit1.Text);
  99.     except
  100.         IsCorrect := False;
  101.     end;
  102.     If N mod 2 <> 0 then
  103.     begin
  104.         IsCorrect := False;
  105.         Edit1.Text := '';
  106.         MessageBox(Form1.Handle, Pchar('Размер матрицы должен быть четным числом!'), 'Ошибка', MB_ICONSTOP);
  107.     end;
  108.     If Iscorrect then
  109.     begin
  110.         StringGrid1.Visible := True;
  111.         Label7.Visible := True;
  112.         StringGrid1.ColCount := N;
  113.         StringGrid1.RowCount := N;
  114.     end;
  115. end;
  116.  
  117.  
  118. procedure TForm1.Edit1Change(Sender: TObject);
  119. Var
  120.     I, J : Integer;
  121. begin
  122.      StringGrid1.Visible := False;
  123.      StringGrid2.Visible := False;
  124.      Label7.Visible := False;
  125.      N3.Enabled := False;
  126.      If Length (Edit1.Text) = 0 then
  127.         Button2.Enabled := False
  128.      else
  129.      begin
  130.         Button2.Enabled := True;
  131.      end;
  132.      For I := 0 to StringGrid1.ColCount - 1 do
  133.         For J := 0 to StringGrid1.RowCount - 1 do
  134.             StringGrid1.Cells[J, I] := '';
  135.      For I := 0 to StringGrid2.ColCount - 1 do
  136.         For J := 0 to StringGrid2.RowCount - 1 do
  137.             StringGrid2.Cells[J, I] := '';
  138. end;
  139.  
  140. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  141. begin
  142.     If (Key = #13) and (Button2.Enabled) then
  143.         Button2.Click;
  144.     If (Not(Key In ['2'..'9', #08, #46])) Then
  145.         Key := #0;
  146. end;
  147.  
  148. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  149. begin
  150.     CanClose := MessageBox(Form1.Handle, 'Вы уверены, что хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION)=ID_YES;
  151. end;
  152.  
  153. procedure TForm1.N4Click(Sender: TObject);
  154. begin
  155.     Application.MessageBox('Возможные размеры матрицы: 2, 4, 6, 8.'#13#10'Диапазон элементов матрицы: -9999 .. 99999.', 'Инструкция', 0);
  156. end;
  157.  
  158. procedure TForm1.N5Click(Sender: TObject);
  159. begin
  160.     Application.MessageBox('Арефин Владислав гр.251004', 'Разрабочик', 0);
  161. end;
  162.  
  163. procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
  164. Const
  165.     LIM = 4; // значит 5 - реальный лимит символов
  166. begin
  167.     If (Not(Key In ['0'..'9', #08, #46, '-'])) Then
  168.         Key := #0;
  169.     With Sender As TStringGrid Do
  170.     Begin
  171.         If (Length(StringGrid1.Cells[Col, Row]) > LIM) then
  172.             If (Not(Key In [#08, #46])) Then
  173.                 Key := #0;
  174.         If (Length(StringGrid1.Cells[Col, Row]) <> 0) and (Key = '-')  then
  175.             Key := #0;
  176.     End;
  177. end;
  178.  
  179. procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  180.   const Value: string);
  181. var
  182.     I, J : Integer;
  183.     IsCorrect : Boolean;
  184.     Temp : String;
  185. begin
  186.     IsCorrect := True;
  187.  
  188.     For I := 0 to StringGrid1.ColCount - 1 do
  189.         For J := 0 to StringGrid1.RowCount - 1 do
  190.             If (Length(StringGrid1.Cells[I, J]) = 0) Then
  191.             begin
  192.                 Button1.Visible := False;
  193.                 IsCorrect := False;
  194.             end;
  195.  
  196.     If IsCorrect then
  197.     begin
  198.          Button1.Visible := True;
  199.     end;
  200.     N3.Enabled := False;
  201.     StringGrid2.Visible := False;
  202. end;
  203.  
  204.  
  205.  
  206. procedure TForm1.Button1Click(Sender: TObject);
  207. Var
  208.     Arr : TMatrix;
  209.     BufferFor1, BufferFor2, BufferFor3, BufferFor4 : TVector;
  210.     StartI, StartJ, Chose, I, J, N, K1, K2, K3, K4: Integer;
  211.     IsCorrect : Boolean;
  212.     q, w, e, r : String;
  213. begin
  214.     IsCorrect := True;
  215.     N := StringGrid1.ColCount;
  216.     StringGrid2.ColCount := N;
  217.     StringGrid2.RowCount := N;
  218.     SetLength(Arr, N, N);
  219.     Result := 'Исходная матрица:' + #13#10;
  220.     For I := 0 to StringGrid1.ColCount - 1 do
  221.     Begin
  222.         For J := 0 to StringGrid1.RowCount - 1 do
  223.             Try
  224.                 Arr[I, J] := StrToInt(StringGrid1.Cells[J, I]); //!
  225.                 Result := Result + StringGrid1.Cells[J, I] + ' ';
  226.             Except
  227.                 StringGrid1.Cells[J, I] := '';
  228.                 IsCorrect := False;
  229.                 MessageBox(Form1.Handle, Pchar('Элементами матрицы могут быть только числа!'), 'Ошибка', MB_ICONSTOP);
  230.             End;
  231.         Result := Result + #13#10;
  232.     End;
  233.     Result := Result + #13#10;
  234.     Result := Result + 'Преобразованная матрица:' + #13#10;
  235.  
  236.     If IsCorrect then
  237.     Begin
  238.         StartI := 0;
  239.         StartJ := StartI;
  240.         BufferFor1 := TransferMatrixVector (N, StartI, StartJ, Arr);
  241.         StartI := 0;
  242.         StartJ := N div 2;
  243.         BufferFor2 := TransferMatrixVector (N, StartI, StartJ, Arr);
  244.         StartI := N div 2;
  245.         StartJ := 0;
  246.         BufferFor3 := TransferMatrixVector (N, StartI, StartJ, Arr);
  247.         StartI := N div 2;
  248.         StartJ := StartI;
  249.         BufferFor4 := TransferMatrixVector (N, StartI, StartJ, Arr);
  250.         K1 := 0;
  251.         K2 := 0;
  252.         K3 := 0;
  253.         K4 := 0;
  254.         N := N * 2;
  255.         For I := Low(Arr) To High(Arr)  do
  256.             For J :=  Low(Arr) To High(Arr) Do
  257.                 Arr[I, J] := 0;
  258.         N := N div 2;
  259.         For I := 0 To N - 1  do
  260.         Begin
  261.             For J := 0 To N - 1 Do
  262.                 Begin
  263.                     If ((I < N div 2) and (J < N div 2)) then
  264.                     Begin
  265.                         Arr[I,J] := BufferFor4[K1];
  266.                         q := q + IntToStr(Arr[I,J]) + ' ';
  267.                         Inc (K1);
  268.                     End;
  269.                     If ((I < N div 2) and (J > N div 2 - 1)) then
  270.                     Begin
  271.                         Arr[I,J] := BufferFor3[K2];
  272.                         w := w + IntToStr(Arr[I,J]) + ' ';
  273.                         Inc (K2);
  274.                     End;
  275.                     If ((I > N div 2 - 1) and (J < N div 2)) then
  276.                     Begin
  277.                         Arr[I,J] := BufferFor1[K3];  //
  278.                         e := e + IntToStr(Arr[I,J]) + ' ';
  279.                         Inc (K3);
  280.                     End;
  281.                     If ((I > N div 2 - 1) and (J > N div 2 - 1)) then
  282.                     Begin
  283.                         Arr[I,J] := BufferFor2[K4];
  284.                         r  := r + IntToStr(Arr[I,J]) + ' ';
  285.                         Inc (K4);
  286.                     End;
  287.  
  288.                 End;
  289.         End;
  290.         For I := 0 to StringGrid2.ColCount - 1 do
  291.         Begin
  292.             For J := 0 to StringGrid2.RowCount - 1 do
  293.             Begin
  294.                 StringGrid2.Cells[J, I] := IntToStr(Arr[I, J]);//!
  295.                 Result := Result + StringGrid2.Cells[J, I] + ' ';
  296.             End;
  297.             Result := Result + #13#10;
  298.         End;
  299.         StringGrid2.Visible := True;
  300.     End;
  301.     N3.Enabled := True;
  302. end;
  303.  
  304.  
  305.  
  306. Function CheckFileDataForN(Num: String): Boolean;
  307. Const
  308.     MAX_LIM = 99999;
  309.     MIN_LIM = 2;
  310. Var
  311.     NewNum: Integer;
  312.     IsCorrect: Boolean;
  313. Begin
  314.     NewNum := 0;
  315.     IsCorrect := True;
  316.     Num := Trim (Num);
  317.     Try
  318.         NewNum := StrToInt(Num);
  319.     Except
  320.         MessageBox(Form1.Handle, Pchar('Не получилось преобразовать N к целочисленному типу данных. Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  321.         IsCorrect := False;
  322.     End;
  323.     If(IsCorrect And ((NewNum > MAX_LIM) Or (NewNum < MIN_LIM))) Then
  324.     Begin
  325.         Num := IntToStr(NewNum);
  326.         MessageBox(Form1.Handle, Pchar('N вне разрешенного диапазона! Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  327.         IsCorrect := False;
  328.     End;
  329.     CheckFileDataForN := IsCorrect;
  330. End;
  331.  
  332.  
  333. Function Open (): String;
  334. Begin
  335.     With Form1 Do
  336.     Begin
  337.         If OpenDialog1.Execute Then
  338.         Begin
  339.             Path := OpenDialog1.FileName;
  340.             IsFileOpen := True;
  341.         End
  342.         Else
  343.             IsFileOpen := False;
  344.     End;
  345.     Open := Path;
  346. End;
  347.  
  348. Function TakeDataFromFile2(Number2: String; Var FileOutput: TextFile): String;
  349. Var               //N
  350.     IsRight : Boolean;
  351. Begin
  352.     IsRight := True;
  353.     Try
  354.         Readln(FileOutput, Number2);
  355.         Number2 := Trim (Number2);
  356.         IsRight := CheckFileDataForN(Number2);
  357.     Except
  358.     End;
  359.     If(Not(IsRight)) Then
  360.         TakeDataFromFile2 := ''
  361.     Else
  362.         TakeDataFromFile2 := Number2;
  363. End;
  364.  
  365.  
  366. function SeparateString (Str : String) : TStr;
  367. Var
  368.     StrArr : TStr;
  369.     I, K : Integer;
  370.     Flag : Boolean;
  371. Begin
  372.     K := 0;
  373.     SetLength(StrArr, (Str.Length div 2) + 1);
  374.     For I := 0 To Str.Length div 2 do
  375.         StrArr[i] := '';
  376.     I := 1;
  377.     While I <= Str.Length Do
  378.     begin
  379.         Flag := true;
  380.         While (Str[I] <> ' ') and (I <= Str.Length) Do
  381.         Begin
  382.             StrArr[K] := StrArr[K] + Str[I];
  383.             Inc(I);
  384.             Flag := False;
  385.         End;
  386.         If Not(Flag) then
  387.             Inc(K);
  388.         If Flag then
  389.             Inc(I);
  390.     end;
  391.     I := 1;
  392.     K := 0;
  393.     While Str[I] <> '' Do
  394.     Begin
  395.         If Str[I] = ' ' then
  396.             Inc(K);
  397.         Inc(I);
  398.     End;
  399.     SetLength(StrArr, K + 1);
  400.     Result := StrArr;
  401. End;
  402.  
  403. function ConvertStringToArray (StringGridColCount : Integer; Var FileOutput: TextFile) : TVector;
  404. Var
  405.     I: Integer;
  406.     Arr : TVector;
  407.     Str : String;
  408.     StrArr : TStr;
  409. Const
  410.     MIN = -9999;
  411.     MAX = 99999;
  412. Begin
  413.     Readln(FileOutput, Str);
  414.     SetLength(Arr, StringGridColCount);
  415.     for I := Low(Arr) to High(Arr) do
  416.         Arr[I] := 0;
  417.     Str := Trim(Str);
  418.     StrArr := SeparateString (Str);
  419.     If (High(StrArr) + 1 <> StringGridColCount) then
  420.     begin
  421.         SetLength (Arr, 1);
  422.         Arr[0] := BAD;
  423.         MessageBox(Form1.Handle, Pchar('Количество элементов массива не совпадает с заявленным. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  424.         ConvertStringToArray := Arr;
  425.         Exit
  426.     end;
  427.     try
  428.         For I := Low(Arr) to High(Arr) do
  429.             Arr[I] := StrToInt (StrArr[I]);
  430.     except
  431.         SetLength (Arr, 1);
  432.         Arr[0] := BAD;
  433.         MessageBox(Form1.Handle, Pchar('Не удалось преобразовать исходные данные в целочисленный тип. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  434.         ConvertStringToArray := Arr;
  435.         Exit
  436.     end;
  437.     For I := Low(Arr) to High(Arr) do
  438.         If (Arr[I] > MAX) or (Arr[I] < MIN) then
  439.         begin
  440.             SetLength (Arr, 1);
  441.             Arr[0] := BAD;
  442.             MessageBox(Form1.Handle, Pchar('Исходные данные выходят за границы допустимых. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  443.             ConvertStringToArray := Arr;
  444.         end;
  445.     ConvertStringToArray := Arr;
  446. End;
  447.  
  448.  
  449. procedure TForm1.N2Click(Sender: TObject);
  450. Var
  451.     FileInput: TextFile;
  452.     Num, I, J: Integer;
  453.     Str1 : String;
  454.     //Str1 : Array Of String;
  455.     Arr : TVector;
  456.     Counter : Integer;
  457. begin
  458.     Num := 0;
  459.     Path := Open;
  460.     AssignFile(FileInput, Path);
  461.     Reset(FileInput);
  462.     If(IsFileOpen) Then
  463.     Begin
  464.         Str1 := TakeDataFromFile2(IntToStr(Num), FileInput);
  465.     End;
  466.     if Not(Str1 = '') then
  467.     Begin
  468.         Edit1.Text := Str1;
  469.         Button2.Click;
  470.     End
  471.     Else
  472.     Begin
  473.         Edit1.Text := #0;
  474.     End;
  475.     Counter := 0;
  476.     if (Str1 <> '') then
  477.         Begin
  478.             For J := 0 To StrToInt(Str1) - 1 Do
  479.             Begin
  480.                 Arr := ConvertStringToArray(StrToInt(Str1), FileInput);
  481.                 if (Arr[0] <> BAD) then
  482.                 Begin
  483.                     for I := Low(Arr) to High(Arr) do
  484.                     Begin
  485.                         StringGrid1.Cells[I, J] := IntToStr(Arr[I]);
  486.                         Inc (Counter);
  487.                     End;
  488.                 End
  489.                 else
  490.                 Begin
  491.                     for I := Low(Arr) to StrToInt(Str1) - 1 do
  492.                     Begin
  493.                         StringGrid1.Cells[J, I] := '';
  494.                     End;
  495.                     Edit1.Text := '';
  496.                     Exit
  497.                 End;
  498.             End;
  499.             If Counter = StrToInt(Str1) * StrToInt(Str1)  then
  500.                 Button1.Visible := True
  501.             else
  502.             begin
  503.                 Button1.Visible := False;
  504.             end;
  505.             StringGrid2.Visible := False;
  506.         End;
  507.     CloseFile(FileInput);
  508. end;
  509.  
  510.  
  511.  
  512.  
  513. procedure TForm1.N3Click(Sender: TObject);
  514. Var
  515.     FileOutput: TextFile;
  516.     IsCorrect : Boolean;
  517. begin
  518.     IsCorrect := True;
  519.     Path := Open;
  520.     If (IsFileOpen) Then
  521.     Begin
  522.         try
  523.             AssignFile(FileOutput, Path);
  524.             Rewrite(FileOutput);
  525.             Write(FileOutput, Result);
  526.         except
  527.             IsCorrect := False;
  528.             Application.MessageBox('Запись в файл не удалась.', 'Ошибка', MB_ICONSTOP);
  529.         end;
  530.         if IsCorrect then
  531.         Begin
  532.             Application.MessageBox('Запись файла выполнена успешно.', 'Результат', 0);
  533.             CloseFile(FileOutput);
  534.         End;
  535.     End;
  536. end;
  537. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement