HunteryS

Untitled

Nov 13th, 2024
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.43 KB | None | 0 0
  1. Program Lab3_1;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Procedure PrintCondition();
  7. Begin
  8.     Writeln('Данная программа перекодирует текст на основе таблицы перекодировки');
  9.     Writeln('Каждый символ из строки St1 будет заменен на соответствующий символ из строки St2');
  10. End;
  11.  
  12. Function ReadNum(Min, Max: Integer): Integer;
  13. Var
  14.     Num: Integer;
  15.     IsCorrect: Boolean;
  16. Begin
  17.     Repeat
  18.         IsCorrect := True;
  19.         Try
  20.             Readln(Num);
  21.         Except
  22.             Write('Некорректный ввод! Введите значение еще раз: ');
  23.             IsCorrect := False;
  24.         End;
  25.         If (IsCorrect) And ((Num < Min) Or (Num > Max)) Then
  26.         Begin
  27.             Write('Недопустимое значение! Введите значение еще раз: ');
  28.             IsCorrect := False;
  29.         End;
  30.     Until (IsCorrect);
  31.     ReadNum := Num;
  32. End;
  33.  
  34. Function UniquenessOfSymbols(S : String) : Boolean;
  35. Var
  36.     I, J : Integer;
  37.     Uniquenes : Boolean;
  38. Begin
  39.     Uniquenes := True;
  40.     For I := 1 To Length(S)  Do
  41.     Begin
  42.         For J := I + 1 To Length(S) Do
  43.         Begin
  44.             If (S[I] = S[J]) Then
  45.             Begin
  46.                 Uniquenes := False;
  47.             End;
  48.         End;
  49.     End;
  50.     UniquenessOfSymbols := Uniquenes;
  51. End;
  52.  
  53. Function HasCommonCharacters(St1, St2: String): Boolean;
  54. Var
  55.     I, J : Integer;
  56.     Uniquenes : Boolean;
  57. Begin
  58.     Uniquenes := True;
  59.     For I := 1  To Length(St1)  Do
  60.     Begin
  61.         For J := 1 To Length(St2) Do
  62.         Begin
  63.             If (Uniquenes) And (St1[I] = St2[J]) Then
  64.             Begin
  65.                 Uniquenes := False;
  66.             End;
  67.         End;
  68.     End;
  69.     HasCommonCharacters := Uniquenes;
  70. End;
  71.  
  72. Function GetNewText(InputText, St1, St2: String): String;
  73. Var
  74.     I, J: Integer;
  75. Begin
  76.     For I := 1 To Length(InputText) Do
  77.         For J := 1 To Length(St1) Do
  78.             If InputText[I] = St1[J] Then
  79.             Begin
  80.                 InputText[I] := St2[J];
  81.             End;
  82.     GetNewText := InputText;
  83. End;
  84.  
  85.  
  86. Function CheckFile(Path : String): Boolean;
  87. Var
  88.     InputFile: TextFile;
  89.     Line, St1, St2, Text: String;
  90.     LineCount: Integer;
  91.     IsFileCorrect: Boolean;
  92. Begin
  93.     IsFileCorrect := True;
  94.     LineCount := 0;
  95.  
  96.     // Проверка на существование файла и его расширение
  97.     If FileExists(Path) Then
  98.     Begin
  99.         AssignFile(InputFile, Path);
  100.         If (ExtractFileExt(Path) = '.txt') Then
  101.         Begin
  102.             Try
  103.                 Reset(InputFile);
  104.  
  105.                 // Чтение строк из файла
  106.                 While Not Eof(InputFile) And (LineCount < 3) Do
  107.                 Begin
  108.                     Readln(InputFile, Line);
  109.                     LineCount := LineCount + 1;
  110.  
  111.                     // Строка 1 - St1
  112.                     If LineCount = 1 Then
  113.                         St1 := Line
  114.                     // Строка 2 - St2
  115.                     Else If LineCount = 2 Then
  116.                         St2 := Line
  117.                     // Остальной текст (для перекодировки)
  118.                     Else
  119.                         Text := Text + Line + ' ';
  120.                 End;
  121.  
  122.                 // Проверки на корректность содержимого файла
  123.                 If LineCount < 2 Then
  124.                 Begin
  125.                     Writeln('Ошибка: файл должен содержать хотя бы две строки для перекодировки.');
  126.                     IsFileCorrect := False;
  127.                 End;
  128.  
  129.                 // Проверка строки St1
  130.                 If (IsFileCorrect) And ((Length(St1) = 0) Or Not UniquenessOfSymbols(St1)) Then
  131.                 Begin
  132.                     Writeln('Ошибка: строка St1 некорректна (пустая или с повторяющимися символами).');
  133.                     IsFileCorrect := False;
  134.                 End;
  135.  
  136.                 // Проверка строки St2
  137.                 If (IsFileCorrect) And ((Length(St2) = 0) Or Not UniquenessOfSymbols(St2)) Then
  138.                 Begin
  139.                     Writeln('Ошибка: строка St2 некорректна (пустая или с повторяющимися символами).');
  140.                     IsFileCorrect := False;
  141.                 End;
  142.  
  143.                 // Проверка на общие символы между St1 и St2
  144.                 If (IsFileCorrect) And Not HasCommonCharacters(St1, St2) Then
  145.                 Begin
  146.                     Writeln('Ошибка: строки St1 и St2 содержат общие символы.');
  147.                     IsFileCorrect := False;
  148.                 End;
  149.  
  150.                 // Проверка на одинаковую длину строк St1 и St2
  151.                 If (IsFileCorrect) And (Length(St1) <> Length(St2)) Then
  152.                 Begin
  153.                     Writeln('Ошибка: строки St1 и St2 имеют разную длину.');
  154.                     IsFileCorrect := False;
  155.                 End;
  156.  
  157.                 // Закрытие файла
  158.                 CloseFile(InputFile);
  159.             Except
  160.                 Writeln('Не удалось открыть файл.');
  161.                 IsFileCorrect := False;
  162.             End;
  163.         End
  164.         Else
  165.         Begin
  166.             Writeln('Файл не типа txt!');
  167.             IsFileCorrect := False;
  168.         End;
  169.     End
  170.     Else
  171.     Begin
  172.         Writeln('Файл не существует!');
  173.         IsFileCorrect := False;
  174.     End;
  175.  
  176.  
  177.     CheckFile := IsFileCorrect;
  178. End;
  179.  
  180. Procedure InputSt(var St1, St2 : String);
  181. Var
  182.     IsCorrect: Boolean;
  183. Begin
  184.     Repeat
  185.         IsCorrect := True;
  186.         Write('Введите строку St1 (таблица перекодировки): ');
  187.         Try
  188.             Readln(St1);
  189.         Except
  190.             IsCorrect := False;
  191.         End;
  192.         If (IsCorrect) And (Length(st1) = 0) Or Not UniquenessOfSymbols(St1) Then
  193.         Begin
  194.             IsCorrect := False;
  195.             Writeln('Строка 1 некорректна(Она либо пуста, либо имеет одинаковые символы ) ');
  196.         End;
  197.  
  198.     Until IsCorrect;
  199.  
  200.     Repeat
  201.         IsCorrect := True;
  202.         Write('Введите строку St2 (таблица перекодировки): ');
  203.         Try
  204.             Readln(St2);
  205.         Except
  206.             IsCorrect := False;
  207.         End;
  208.         If (IsCorrect) And (Length(St2) = 0) Or Not UniquenessOfSymbols(St2) Or Not HasCommonCharacters(St1, St2) Then
  209.         Begin
  210.             IsCorrect := False;
  211.             Writeln('Строка 2 некорректна(Она либо пуста, либо имеет одинаковые символы ) ');
  212.         End;
  213.  
  214.         If (Length(St1) <> Length(St2)) Then
  215.         Begin
  216.             IsCorrect := False;
  217.             Writeln('Строки имеют разную длину!');
  218.         End;
  219.  
  220.     Until IsCorrect;
  221.  
  222. End;
  223.  
  224. Function ReadFile(Path: String): String;
  225. Var
  226.     Text, BufText: String;
  227.     InputFile: TextFile;
  228. Begin
  229.     AssignFile(InputFile, Path);
  230.     Reset(InputFile);
  231.  
  232.     Repeat
  233.         Readln(InputFile, BufText);
  234.         Text := Text + BufText + ' ';
  235.     Until Eof(InputFile);
  236.     Close(InputFile);
  237.  
  238.     ReadFile := Text;
  239. End;
  240.  
  241. Function InputDataFromFile(Var St1, St2 : String): String;
  242. Var
  243.     PathFile, Line, Text: String;
  244.     InputFile: TextFile;
  245.     LineCount: Integer;
  246. Begin
  247.     Writeln('Данные в файле должны содержать:'#10' 1) строка перекодировки St1'#10' 2) строка перекодировки St2'#10' 3) текст для перекодировки');
  248.  
  249.     Repeat
  250.         Write('Введите путь к файлу с его расширением: ');
  251.         Readln(PathFile);
  252.     Until CheckFile(PathFile);
  253.  
  254.     AssignFile(InputFile, PathFile);
  255.     Reset(InputFile);
  256.     LineCount := 0;
  257.     Text := '';
  258.  
  259.     While Not Eof(InputFile) Do
  260.     Begin
  261.         Readln(InputFile, Line);
  262.         LineCount := LineCount + 1;
  263.  
  264.         If LineCount = 1 Then
  265.             St1 := Line
  266.         Else If LineCount = 2 Then
  267.             St2 := Line
  268.         Else
  269.             Text := Text + Line + ' ';
  270.     End;
  271.  
  272.     CloseFile(InputFile);
  273.     InputDataFromFile := Text;
  274. End;
  275.  
  276. Function InputTextFromConsole(Var St1, St2 : String): String;
  277. Var
  278.     Text: String;
  279.     IsTextEmpty: Boolean;
  280. Begin
  281.     Repeat
  282.         Writeln('Введите текст для перекодировки:');
  283.         Readln(Text);
  284.         Text := Text + ' ';
  285.         IsTextEmpty := (High(Text) = 0);
  286.     Until Not IsTextEmpty;
  287.     InputSt(St1, St2);
  288.     InputTextFromConsole := Text;
  289. End;
  290.  
  291. Function InputText(Var St1, St2 : String): String;
  292. Var
  293.     Choice: Integer;
  294.     Text: String;
  295. Begin
  296.     Write('Выберите вариант ввода:', #10, '1. Ввод из консоли', #10, '2. Ввод из файла',#10, 'Использовать вариант: ');
  297.     Choice := ReadNum(1,2);
  298.     If Choice = 1 Then
  299.     Begin
  300.         Text := InputTextFromConsole(St1, St2);
  301.     End
  302.     Else
  303.         Text := InputDataFromFile(St1, St2);
  304.  
  305.     InputText := Text;
  306. End;
  307.  
  308. Procedure OutputTextToConsole(Text: String);
  309. Begin
  310.     Writeln(Text);
  311. End;
  312.  
  313. Procedure OutputTextToFile(Text: String);
  314. Var
  315.     IsPathCorrect: Boolean;
  316.     Path: String;
  317.     OutputFile: TextFile;
  318. Begin
  319.     Writeln('Для вывода введите путь к файлу и его имя c расширением. Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)');
  320.     Repeat
  321.         IsPathCorrect := True;
  322.         Write('Введите путь: ');
  323.         Readln(Path);
  324.         If Path = '' Then
  325.             IsPathCorrect := false
  326.         Else
  327.  
  328.         Begin
  329.             AssignFile(OutputFile, Path);
  330.             If (ExtractFileExt(Path) = '.txt') Then
  331.             Begin
  332.                 Try
  333.                     Rewrite(OutputFile);
  334.                 Except
  335.                     Writeln('Не удалось вывести в Файл');
  336.                     IsPathCorrect := False;
  337.                 End;
  338.             End
  339.             Else
  340.             Begin
  341.                 IsPathCorrect := False;
  342.                 Writeln('Файл не типа txt!');
  343.             End;
  344.         End;
  345.     Until IsPathCorrect;
  346.  
  347.     Writeln(OutputFile, Text);
  348.     CloseFile(OutputFile);
  349.     Writeln('Вывод данных...  успешно!');
  350. End;
  351.  
  352.  
  353. Procedure OutputText(Text: String);
  354. Var
  355.     Choice: Integer;
  356. Begin
  357.     Write('Выберите вариант вывода:', #10, '1. Вывод в консоль', #10, '2. Вывод файл',
  358.            #10, 'Использовать вариант: ');
  359.     Choice := ReadNum(1,2);
  360.  
  361.     If Choice = 1 Then
  362.         OutputTextToConsole(Text)
  363.     Else
  364.         OutputTextToFile(Text);
  365. End;
  366. Var
  367.     St1, St2 : String;
  368.     TextIn, NewText: String;
  369. Begin
  370.     PrintCondition();
  371.     TextIn := InputText(St1, St2);
  372.     NewText := GetNewText(TextIn, St1, St2);
  373.     OutputText(NewText);
  374.     Readln;
  375. End.
Advertisement
Add Comment
Please, Sign In to add comment