Advertisement
ksyshshot

Lab.4.2

Mar 1st, 2023
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 16.94 KB | Source Code | 0 0
  1. unit Lab_4_2_Form;
  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.Menus, Vcl.StdCtrls;
  8.  
  9. type
  10.   TForm_4_2 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     NFile: TMenuItem;
  13.     NOpenFile: TMenuItem;
  14.     NSaveFile: TMenuItem;
  15.     NInstruction: TMenuItem;
  16.     NAbout: TMenuItem;
  17.     LabelTask: TLabel;
  18.     LabelDeleteOperation: TLabel;
  19.     LabelInsertOperation: TLabel;
  20.     LabelChangeOperation: TLabel;
  21.     ButtonOpenTask: TButton;
  22.     EditDeleteOperation: TEdit;
  23.     EditInsertOperation: TEdit;
  24.     EditChangeOperation: TEdit;
  25.     ButtonFindPrice: TButton;
  26.     LabelFinalPrice: TLabel;
  27.     EditFinalPrice: TEdit;
  28.     OpenDialog1: TOpenDialog;
  29.     SaveDialog1: TSaveDialog;
  30.     LabelSourceString: TLabel;
  31.     EditSourceString: TEdit;
  32.     EditDesiredString: TEdit;
  33.     LabelDesiredString: TLabel;
  34.     procedure NAboutClick(Sender: TObject);
  35.     procedure ButtonOpenTaskClick(Sender: TObject);
  36.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  37.     procedure EditDeleteOperationKeyPress(Sender: TObject; var Key: Char);
  38.     procedure EditInsertOperationKeyPress(Sender: TObject; var Key: Char);
  39.     procedure EditChangeOperationKeyPress(Sender: TObject; var Key: Char);
  40.     procedure NInstructionClick(Sender: TObject);
  41.     procedure EditDeleteOperationChange(Sender: TObject);
  42.     procedure EditInsertOperationChange(Sender: TObject);
  43.     procedure EditChangeOperationChange(Sender: TObject);
  44.     procedure EditSourceStringChange(Sender: TObject);
  45.     procedure EditDesiredStringChange(Sender: TObject);
  46.     procedure ButtonFindPriceClick(Sender: TObject);
  47.     procedure NOpenFileClick(Sender: TObject);
  48.     procedure NSaveFileClick(Sender: TObject);
  49.   private
  50.     { Private declarations }
  51.   public
  52.     { Public declarations }
  53.   end;
  54.  
  55. var
  56.   Form_4_2: TForm_4_2;
  57.  
  58. implementation
  59.  
  60. {$R *.dfm}
  61.  
  62. uses UnitAbout, UnitError, UnitExit, UnitInstruction_4_2, UnitTask_4_2;
  63.  
  64. const
  65.     MAX_VALUE =  1000;
  66.     MIN_VALUE = 0;
  67.     MAX_STR = 200;
  68.     MIN_STR = 1;
  69.  
  70. function DelAndInsert(X, Y: String; I, CostDel, CostIns, Count: Integer; var Price: Integer): Integer;
  71. begin
  72.     if I <= Count then
  73.     begin
  74.         Delete(X, I, 1);
  75.         Insert(Y[I], X, I);
  76.         Price := CostDel + CostIns + DelAndInsert(X, Y, (I + 1), CostDel, CostIns, Count, Price);
  77.     end;
  78.     DelAndInsert := Price;
  79. end;
  80.  
  81. function ChangeElement(var X, Y: String; I, CostCh, Count: Integer; var Price: Integer): Integer;
  82. begin
  83.     if I <= Count then
  84.     begin
  85.         X[I] := Y[I];
  86.         Price := CostCh + ChangeElement(X, Y, (I + 1), CostCh, Count, Price);
  87.     end;
  88.     ChangeElement := Price;
  89. end;
  90.  
  91. function FindInterimPrice(X, Y: String; CostDelete, CostInsert, CostChange, Count: Integer): Integer;
  92. var
  93.     I, Answer: Integer;
  94. begin
  95.     Answer := 0;
  96.     if ((CostDelete + CostInsert) < CostChange) then
  97.         FindInterimPrice := DelAndInsert(X, Y, 1, CostDelete, CostInsert, Count, Answer)
  98.     else
  99.         FindInterimPrice := ChangeElement(X, Y, 1, CostChange, Count, Answer);
  100. end;
  101.  
  102. procedure TForm_4_2.ButtonFindPriceClick(Sender: TObject);
  103. var
  104.     X, Y: String[200];
  105.     CostInsert, CostDelete, CostChange, Count, FinalPrice: Integer;
  106.     IsCorrect: Boolean;
  107.     Error: String;
  108. begin
  109.     //EditFinalPrice.Text := IntToStr(FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count));
  110.     IsCorrect := true;
  111.     Error := '';
  112.     FinalPrice := 0;
  113.     Try
  114.         CostDelete := StrToInt(EditDeleteOperation.Text);
  115.         if (CostDelete > MAX_VALUE) or (CostDelete < MIN_VALUE) then
  116.         begin
  117.             IsCorrect := false;
  118.             Error := 'Цена удаления элемента не входит в допустимый диапазон. ';
  119.         end;
  120.         CostInsert := StrToInt(EditInsertOperation.Text);
  121.         if (CostInsert > MAX_VALUE) or (CostInsert < MIN_VALUE) then
  122.         begin
  123.             IsCorrect := false;
  124.             Error := Error + 'Цена вставки элемента не входит в допустимый диапазон. ';
  125.         end;
  126.         CostChange := StrToInt(EditChangeOperation.Text);
  127.         if (CostChange > MAX_VALUE) or (CostChange < MIN_VALUE) then
  128.         begin
  129.             IsCorrect := false;
  130.             Error := Error + 'Цена замены элемента не входит в допустимый диапазон. ';
  131.         end;
  132.         X := EditSourceString.Text;
  133.         if (Length(X) > MAX_STR) or (Length(X) < MIN_STR) then
  134.         begin
  135.             IsCorrect := false;
  136.             Error := 'Длина исходной строки не входит в допустимый диапазон. ';
  137.         end;
  138.         Y := EditDesiredString.Text;
  139.         if (Length(Y) > MAX_STR) or (Length(Y) < MIN_STR) then
  140.         begin
  141.             IsCorrect := false;
  142.             Error := 'Длина желаемой строки не входит в допустимый диапазон. ';
  143.         end;
  144.     Except
  145.         IsCorrect := false;
  146.         Error := Error + 'Некорректно введено одно из значений цены. ';
  147.     End;
  148.     if (IsCorrect) then
  149.     begin
  150.         if (Length(X) = Length(Y)) then
  151.         begin
  152.             Count := Length(Y);
  153.             FinalPrice :=  FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  154.         end
  155.         else
  156.         begin
  157.             if Length(X) < (Length(Y)) then
  158.             begin
  159.                 Count := Length(X);
  160.                 FinalPrice := FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  161.                 FinalPrice := FinalPrice + CostInsert * (Length(Y) - Length(X));
  162.             end
  163.             else
  164.             begin
  165.                 Count := Length(Y);
  166.                 FinalPrice := FindInterimPrice(X, Y, CostDelete, CostInsert, CostChange, Count);
  167.                 FinalPrice := FinalPrice + CostDelete * (Length(X) - Length(Y));
  168.             end;
  169.         end;
  170.         EditFinalPrice.Text := IntToStr(FinalPrice);
  171.         NSaveFile.Enabled := true;
  172.     end
  173.     else
  174.     begin
  175.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  176.         UnitError.FormError.ShowModal();
  177.         UnitError.FormError.LabelError.Caption := '';
  178.     end;
  179. end;
  180.  
  181. procedure TForm_4_2.ButtonOpenTaskClick(Sender: TObject);
  182. begin
  183.     UnitTask_4_2.FormTask_4_2.ShowModal();
  184. end;
  185.  
  186. procedure TForm_4_2.EditChangeOperationChange(Sender: TObject);
  187. begin
  188.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  189.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  190.     or (EditChangeOperation.Text = '') then
  191.         ButtonFindPrice.Enabled := false
  192.     else
  193.         ButtonFindPrice.Enabled := true;
  194.     EditFinalPrice.Text := '';
  195. end;
  196.  
  197. procedure TForm_4_2.EditChangeOperationKeyPress(Sender: TObject; var Key: Char);
  198. begin
  199.     if not(Key in [#8, #13, '0'..'9']) then
  200.         Key := #0;
  201.     if (Length(EditChangeOperation.Text) = 0) and (Key in [#13, '0']) then
  202.         Key := #0;
  203.     if (Length(EditChangeOperation.Text) = 1) and not(EditChangeOperation.Text[1] = '1') then
  204.         EditChangeOperation.MaxLength := 3;
  205.     if (Length(EditChangeOperation.Text) = 3) and not(EditChangeOperation.Text = '100') then
  206.         EditChangeOperation.MaxLength := 3
  207.     else
  208.         EditChangeOperation.MaxLength := 4;
  209.     if (Length(EditChangeOperation.Text) = 3) and (EditChangeOperation.Text = '100') and not(Length(EditChangeOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  210.         Key := #0;
  211.     if (Length(EditChangeOperation.SelText) > 0) and (Key = '0') then
  212.         Key := #0;
  213.     //if (Length(EditChangeOperation.Text) > 0) and (Key = #13) then
  214.     //    ButtonFindAnswerClick(Sender);
  215. end;
  216.  
  217. procedure TForm_4_2.EditDeleteOperationChange(Sender: TObject);
  218. begin
  219.     if (EditInsertOperation.Text = '') or (EditChangeOperation.Text = '')
  220.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  221.     or (EditDeleteOperation.Text = '') then
  222.         ButtonFindPrice.Enabled := false
  223.     else
  224.         ButtonFindPrice.Enabled := true;
  225.     EditFinalPrice.Text := '';
  226. end;
  227.  
  228. procedure TForm_4_2.EditDeleteOperationKeyPress(Sender: TObject; var Key: Char);
  229. begin
  230.     if not(Key in [#8, #13, '0'..'9']) then
  231.         Key := #0;
  232.     if (Length(EditDeleteOperation.Text) = 0) and (Key in [#13, '0']) then
  233.         Key := #0;
  234.     if (Length(EditDeleteOperation.Text) = 1) and not(EditDeleteOperation.Text[1] = '1') then
  235.         EditDeleteOperation.MaxLength := 3;
  236.     if (Length(EditDeleteOperation.Text) = 3) and not(EditDeleteOperation.Text = '100') then
  237.         EditDeleteOperation.MaxLength := 3
  238.     else
  239.         EditDeleteOperation.MaxLength := 4;
  240.     if (Length(EditDeleteOperation.Text) = 3) and (EditDeleteOperation.Text = '100') and not(Length(EditDeleteOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  241.         Key := #0;
  242.     if (Length(EditDeleteOperation.SelText) > 0) and (Key = '0') then
  243.         Key := #0;
  244.     //if (Length(EditDeleteOperation.Text) > 0) and (Key = #13) then
  245.     //    ButtonFindPrice(Sender);
  246. end;
  247.  
  248. procedure TForm_4_2.EditDesiredStringChange(Sender: TObject);
  249. begin
  250.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  251.     or (EditChangeOperation.Text = '') or (EditSourceString.Text = '')
  252.     or (EditDesiredString.Text = '') then
  253.         ButtonFindPrice.Enabled := false
  254.     else
  255.         ButtonFindPrice.Enabled := true;
  256.     EditFinalPrice.Text := '';
  257. end;
  258.  
  259. procedure TForm_4_2.EditInsertOperationChange(Sender: TObject);
  260. begin
  261.     if (EditDeleteOperation.Text = '') or (EditChangeOperation.Text = '')
  262.     or (EditSourceString.Text = '') or (EditDesiredString.Text = '')
  263.     or (EditInsertOperation.Text = '') then
  264.         ButtonFindPrice.Enabled := false
  265.     else
  266.         ButtonFindPrice.Enabled := true;
  267.     EditFinalPrice.Text := '';
  268. end;
  269.  
  270. procedure TForm_4_2.EditInsertOperationKeyPress(Sender: TObject; var Key: Char);
  271. begin
  272.     if not(Key in [#8, #13, '0'..'9']) then
  273.         Key := #0;
  274.     if (Length(EditInsertOperation.Text) = 0) and (Key in [#13, '0']) then
  275.         Key := #0;
  276.     if (Length(EditInsertOperation.Text) = 1) and not(EditInsertOperation.Text[1] = '1') then
  277.         EditInsertOperation.MaxLength := 3;
  278.     if (Length(EditInsertOperation.Text) = 3) and not(EditInsertOperation.Text = '100') then
  279.         EditInsertOperation.MaxLength := 3
  280.     else
  281.         EditInsertOperation.MaxLength := 4;
  282.     if (Length(EditInsertOperation.Text) = 3) and (EditInsertOperation.Text = '100') and not(Length(EditInsertOperation.SelText) > 0) and not(Key in ['0', #8, #13]) then
  283.         Key := #0;
  284.     if (Length(EditInsertOperation.SelText) > 0) and (Key = '0') then
  285.         Key := #0;
  286.     //if (Length(EditInsertOperation.Text) > 0) and (Key = #13) then
  287.     //    ButtonFindAnswerClick(Sender);
  288. end;
  289.  
  290. procedure TForm_4_2.EditSourceStringChange(Sender: TObject);
  291. begin
  292.     if (EditDeleteOperation.Text = '') or (EditInsertOperation.Text = '')
  293.     or (EditChangeOperation.Text = '') or (EditDesiredString.Text = '')
  294.     or (EditSourceString.Text = '') then
  295.         ButtonFindPrice.Enabled := false
  296.     else
  297.         ButtonFindPrice.Enabled := true;
  298.     EditFinalPrice.Text := '';
  299. end;
  300.  
  301. procedure TForm_4_2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  302. Var
  303.     Res: Integer;
  304. begin
  305.     Res := UnitExit.FormExit.ShowModal();
  306.     If Res = mrOk Then
  307.         CanClose := True
  308.     Else
  309.         CanClose := False;
  310. end;
  311.  
  312. procedure TForm_4_2.NAboutClick(Sender: TObject);
  313. begin
  314.     UnitAbout.FormAbout.ShowModal();
  315. end;
  316.  
  317. procedure TForm_4_2.NInstructionClick(Sender: TObject);
  318. begin
  319.     UnitInstruction_4_2.FormInstruction.ShowModal();
  320. end;
  321.  
  322. procedure TForm_4_2.NOpenFileClick(Sender: TObject);
  323. var
  324.     F: TextFile;
  325.     Path, Error, SourceStr, DesiredStr: String;
  326.     CostDelete, CostInsert, CostChange: Integer;
  327.     IsCorrect: Boolean;
  328. begin
  329.     IsCorrect := true;
  330.     Error := '';
  331.     if OpenDialog1.Execute() then
  332.     begin
  333.         Path := OpenDialog1.FileName;
  334.         AssignFile(F, Path);
  335.         try
  336.             Reset(F);
  337.             try
  338.                 Readln(F, CostDelete);
  339.                 if (CostDelete < MIN_VALUE) or (CostDelete > MAX_VALUE) then
  340.                 begin
  341.                     IsCorrect := false;
  342.                     Error := Error + 'Значение цены удаления элемента не входит в допустимый диапазон. ';
  343.                 end;
  344.                 if EoF(F) then
  345.                 begin
  346.                     IsCorrect := false;
  347.                     Error := 'В файле недостаточно элементов. ';
  348.                 end
  349.                 else
  350.                     Readln(F, CostInsert);
  351.                 if (CostInsert < MIN_VALUE) or (CostInsert > MAX_VALUE) then
  352.                 begin
  353.                     IsCorrect := false;
  354.                     Error := Error + 'Значение цены вставки элемента не входит в допустимый диапазон. ';
  355.                 end;
  356.                 if EoF(F) then
  357.                 begin
  358.                     IsCorrect := false;
  359.                     Error := 'В файле недостаточно элементов. ';
  360.                 end
  361.                 else
  362.                     Readln(F, CostChange);
  363.                 if (CostChange < MIN_VALUE) or (CostChange > MAX_VALUE) then
  364.                 begin
  365.                     IsCorrect := false;
  366.                     Error := Error + 'Значение цены замены элемента не входит в допустимый диапазон. ';
  367.                 end;
  368.                 if EoF(F) then
  369.                 begin
  370.                     IsCorrect := false;
  371.                     Error := 'В файле недостаточно элементов. ';
  372.                 end
  373.                 else
  374.                     Readln(F, SourceStr);
  375.                 if (length(SourceStr) < MIN_STR) or (length(SourceStr) > MAX_STR) then
  376.                 begin
  377.                     IsCorrect := false;
  378.                     Error := Error + 'Длина исходной строки не входит в диапазон допустимых значений. ';
  379.                 end;
  380.                 if EoF(F) then
  381.                 begin
  382.                     IsCorrect := false;
  383.                     Error := 'В файле недостаточно элементов. ';
  384.                 end
  385.                 else
  386.                     Readln(F, DesiredStr);
  387.                 if (length(DesiredStr) < MIN_STR) or (length(DesiredStr) > MAX_STR) then
  388.                 begin
  389.                     IsCorrect := false;
  390.                     Error := Error + 'Длина желаемой строки не входит в диапазон допустимых значений. ';
  391.                 end;
  392.                 if not(EoF(F)) then
  393.                 begin
  394.                     IsCorrect := false;
  395.                     Error := 'В файле найдены лишние элементы. ';
  396.                 end;
  397.             except
  398.                 IsCorrect := false;
  399.                 Error := 'Найдено некорректное значение в файле. ';
  400.             end;
  401.             CloseFile(F);
  402.         except
  403.             IsCorrect := False;
  404.             Error := Error + 'Нет доступа к файлу';
  405.         end;
  406.     end;
  407.     if not(IsCorrect) then
  408.     begin
  409.         UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  410.         UnitError.FormError.ShowModal();
  411.         UnitError.FormError.LabelError.Caption := '';
  412.     end
  413.     else
  414.     begin
  415.         EditDeleteOperation.Text := IntToStr(CostDelete);
  416.         EditInsertOperation.Text := IntToStr(CostInsert);
  417.         EditChangeOperation.Text := IntToStr(CostChange);
  418.         EditSourceString.Text := SourceStr;
  419.         EditDesiredString.Text := DesiredStr;
  420.     end;
  421. end;
  422.  
  423. procedure TForm_4_2.NSaveFileClick(Sender: TObject);
  424. var
  425.     SaveFile: TextFile;
  426.     SavePath, Error: String;
  427.     Answer: Integer;
  428.     IsCorrect: Boolean;
  429. begin
  430.     IsCorrect := True;
  431.     Error := '';
  432.     if SaveDialog1.Execute() then
  433.     begin
  434.         SavePath := SaveDialog1.FileName;
  435.         AssignFile(SaveFile, SavePath);
  436.         Try
  437.             Rewrite(SaveFile);
  438.             Try
  439.                 Writeln(SaveFile, 'Полученная стоимость: ', EditFinalPrice.Text);
  440.             Finally
  441.                 CloseFile(SaveFile);
  442.             End;
  443.         Except
  444.             IsCorrect := False;
  445.             Error := 'Нет доступа к файлу';
  446.         End;
  447.         if not(IsCorrect) then
  448.         begin
  449.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  450.             UnitError.FormError.ShowModal();
  451.             UnitError.FormError.LabelError.Caption := '';
  452.         end
  453.         else
  454.             NSaveFile.Enabled := false;
  455.     end;
  456. end;
  457.  
  458. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement