Slava_Krasava

Lab3_1

Nov 11th, 2024 (edited)
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.91 KB | None | 0 0
  1. Program Lab3_1;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TMatrix = Array of Array of Integer;
  8.     TStrings = Array of String;
  9.     TErrorCode = (CORRECT,
  10.                   INCORRECT_CHOICE,
  11.                   NON_NUMERIC,
  12.                   OUT_OF_RANGE,
  13.                   FILE_NOT_TXT,
  14.                   FILE_NOT_EXIST,
  15.                   FILE_NOT_READABLE,
  16.                   FILE_NOT_WRITABLE,
  17.                   FILE_NOT_CLOSE,
  18.                   FILE_IS_EMPTY,
  19.                   READING_GO_WRONG,
  20.                   FILE_NOT_FULL,
  21.                   STRING_OUT_OF_RANGE);
  22.  
  23. Const
  24.     MIN_EXT = 5;
  25.     MIN_LEN = 1;
  26.     MAX_LEN = 32;
  27.     MIN_TEXT = 1;
  28.     MAX_TEXT = 255;
  29.     MAX_OPTION = 2;
  30.     Err: Array [TErrorCode] Of String = ('',
  31.                                          'Error. Incorrect choice. Please try again.',
  32.                                          'Error. Non-numeric value. Please try again. ',
  33.                                          'Error. Out of Range. Please try again. ',
  34.                                          'Error. File not .txt. Please try again', 'Error. File not Exist. Please try again.',
  35.                                          'Error. File not readable. Please try again.',
  36.                                          'Error. File not writable. Please try again.',
  37.                                          'Error. File not closeble. Please try again.',
  38.                                          'Error. File is empty. Please try again.',
  39.                                          'Error. Reading go wrong. Please try again.',
  40.                                          'Error. The file lacks sufficient information.',
  41.                                          'Error. String out of Range. Please try again. ');
  42.  
  43. Procedure ProgramTask();
  44. Begin
  45.     Writeln('This program "recodes" russian text according to the transcoding ', #13#10, 'table specified by two lines st1 and st2.');
  46. End;
  47.  
  48. Function GetExtension(Const Str: String; Const PosStart, PosEnd: Integer): String;
  49. Var
  50.     I: Integer;
  51.     PartStr: String;
  52. Begin
  53.     PartStr := '';
  54.     For I := PosStart To PosEnd Do
  55.         PartStr := PartStr + Str[I];
  56.     GetExtension := PartStr;
  57. End;
  58.  
  59. Function DoesFileTxt(Const PathToFile: String): TErrorCode;
  60. Var
  61.     Error: TErrorCode;
  62.     Len: Integer;
  63. Begin
  64.     Error := CORRECT;
  65.     Len := Length(PathToFile);
  66.     If (Len < MIN_EXT) Or (GetExtension(PathToFile, Len - 3, Len) <> '.txt') Then
  67.         Error := FILE_NOT_TXT;
  68.     DoesFileTxt := Error;
  69. End;
  70.  
  71. Function DoesFileExist(Const PathToFile: String): TErrorCode;
  72. Var
  73.     Error: TErrorCode;
  74. Begin
  75.     Error := CORRECT;
  76.     If Not FileExists(PathToFile) Then
  77.         Error := FILE_NOT_EXIST;
  78.     DoesFileExist := Error;
  79. End;
  80.  
  81. Function DoesFileReadable(Var FileName: TextFile): TErrorCode;
  82. Var
  83.     Error: TErrorCode;
  84. Begin
  85.     Error := CORRECT;
  86.     Try
  87.         Reset(FileName);
  88.     Except
  89.         Error := FILE_NOT_READABLE
  90.     End;
  91.     DoesFileReadable := Error;
  92. End;
  93.  
  94. Function DoesFileWritable(Var FileName: TextFile): TErrorCode;
  95. Var
  96.     Error: TErrorCode;
  97. Begin
  98.     Error := CORRECT;
  99.     Try
  100.         Append(FileName);
  101.     Except
  102.         Error := FILE_NOT_WRITABLE;
  103.     End;
  104.     DoesFileWritable := Error;
  105. End;
  106.  
  107. Function DoesFileCloseable(Var FileName: TextFile): TErrorCode;
  108. Var
  109.     Error: TErrorCode;
  110. Begin
  111.     Error := CORRECT;
  112.     Try
  113.         CloseFile(FileName);
  114.     Except
  115.         Error := FILE_NOT_CLOSE
  116.     End;
  117.     DoesFileCloseable := Error;
  118. End;
  119.  
  120. Procedure GetFileNormalReading(Var FileName: TextFile);
  121. Var
  122.     Error: TErrorCode;
  123.     PathToFile: String;
  124. Begin
  125.     Repeat
  126.         Readln(PathToFile);
  127.         Error := DoesFileTxt(PathToFile);
  128.         If Error = CORRECT Then
  129.         Begin
  130.             Error := DoesFileExist(PathToFile);
  131.             AssignFile(FileName, PathToFile);
  132.         End;
  133.         If Error = CORRECT Then
  134.             Error := DoesFileReadable(FileName);
  135.         If (Error = CORRECT) And (EOF(FileName)) Then
  136.             Error := FILE_IS_EMPTY;
  137.         If Error <> CORRECT Then
  138.             Writeln(ERR[Error]);
  139.     Until Error = CORRECT;
  140. End;
  141.  
  142. Procedure GetFileNormalWriting(Var FileName: TextFile);
  143. Var
  144.     Error: TErrorCode;
  145.     PathToFile: String;
  146. Begin
  147.     Repeat
  148.         Readln(PathToFile);
  149.         Error := DoesFileTxt(PathToFile);
  150.         If Error = CORRECT Then
  151.         Begin
  152.             Error := DoesFileExist(PathToFile);
  153.             AssignFile(FileName, PathToFile);
  154.         End;
  155.         If Error = CORRECT Then
  156.             Error := DoesFileWritable(FileName);
  157.         If Error <> CORRECT Then
  158.             Writeln(ERR[Error]);
  159.     Until Error = CORRECT;
  160. End;
  161.  
  162. Function ReadStringFromConsole(Const MIN_COUNT, MAX_COUNT: Integer): String;
  163. Var
  164.     Str: String;
  165.     Error: TErrorCode;
  166. Begin
  167.     Repeat
  168.         Error := CORRECT;
  169.         Readln(Str);
  170.         If (Length(Str) < MIN_LEN) Or (Length(Str) > MAX_LEN) Then
  171.             Error := STRING_OUT_OF_RANGE;
  172.         If Error <> CORRECT Then
  173.             Write(ERR[Error]);
  174.     Until Error = CORRECT;
  175.     ReadStringFromConsole := Str;
  176. End;
  177.  
  178. Function ReadStringFromFile(Const I: Integer; Var FileName: TextFile; Const MIN_COUNT, MAX_COUNT: Integer): String;
  179. Var
  180.     Str: String;
  181.     Error: TErrorCode;
  182. Begin
  183.     Repeat
  184.         Error := CORRECT;
  185.         ReadLn(FileName, Str);
  186.         If (Length(Str) < MIN_COUNT) Or (Length(Str) > MAX_COUNT) Then
  187.             Error := STRING_OUT_OF_RANGE;
  188.         If Error <> CORRECT Then
  189.         Begin
  190.             Write(ERR[Error]);
  191.             Writeln('Please write string(', I, ')');
  192.             Str := ReadStringFromConsole(MIN_COUNT, MAX_COUNT);
  193.         End;
  194.     Until Error = CORRECT;
  195.     ReadStringFromFile := Str;
  196. End;
  197.  
  198. Function FindFileStringNumber(Var FileName: TextFile): Integer;
  199. Var
  200.     Counter: Integer;
  201. Begin
  202.     Counter := 0;
  203.     While Not EOF(FileName) Do
  204.     Begin
  205.         Readln(FileName);
  206.         Inc(Counter);
  207.     End;
  208.     FindFileStringNumber := Counter;
  209. End;
  210.  
  211. Procedure ReadInformationFromFile(Var Str1, Str2: String; Var Text: TStrings);
  212.  
  213. Var
  214.     Counter, I: Integer;
  215.     FileName: TextFile;
  216.     Error: TErrorCode;
  217. Begin
  218.     Repeat
  219.         WriteLn('Enter the path to the file with extension ".txt", text and strings: st1, st2 - the transcoding table');
  220.         Error := CORRECT;
  221.         GetFileNormalReading(FileName);
  222.         Counter := FindFileStringNumber(FileName);
  223.         If Counter < 3 Then
  224.             Error := FILE_NOT_FULL
  225.         Else
  226.         Begin
  227.             Setlength(Text, Counter - 2);
  228.             Error := DoesFileReadable(FileName);
  229.         End;
  230.         If Error = CORRECT Then
  231.         Begin
  232.             For I := Low(Text) To High(Text) Do
  233.                 Text[I] := ReadStringFromFile(I, FileName, MIN_TEXT, MAX_TEXT);
  234.             Str1 := ReadStringFromFile(1, FileName, MIN_LEN, MAX_LEN);
  235.             Str2 := ReadStringFromFile(2, FileName, MIN_LEN, MAX_LEN);
  236.         End;
  237.         If Length(Str1) <> Length(Str2) Then
  238.             Error := OUT_OF_RANGE;
  239.         Error := DoesFileCloseable(FileName);
  240.         If Error <> CORRECT Then
  241.             Writeln(ERR[Error]);
  242.     Until Error = CORRECT;
  243. End;
  244.  
  245. Procedure ReadInformationFromConsole(Var Str1, Str2: String; Var Text: TStrings);
  246. Var
  247.     Error: TErrorCode;
  248.     I: Integer;
  249.     DoesReading: Boolean;
  250. Begin
  251.     Setlength(Text, 1);
  252.     DoesReading := True;
  253.     Writeln('Please write text, but at the end insert special symbol "\0"');
  254.     Repeat
  255.         I := 0;
  256.         Error := CORRECT;
  257.         While DoesReading Do
  258.         Begin
  259.             Text[I] := ReadStringFromConsole(MIN_LEN, MAX_LEN);
  260.             If Text[I] = '\0' Then
  261.             Begin
  262.                 DoesReading := False;
  263.                 Text[I] := '';
  264.             End;
  265.             Inc(I);
  266.             Setlength(Text, I + 1);
  267.         End;
  268.         Writeln('Please write string: st1 - the transcoding table');
  269.         Str1 := ReadStringFromConsole(MIN_LEN, MAX_LEN);
  270.         Writeln('Please write string: st2 - the transcoding table');
  271.         Str2 := ReadStringFromConsole(MIN_LEN, MAX_LEN);
  272.         If Length(Str1) <> Length(Str2) Then
  273.             Error := OUT_OF_RANGE;
  274.         If Error <> CORRECT Then
  275.             Writeln(ERR[Error]);
  276.     Until Error = CORRECT;
  277. End;
  278.  
  279. Function ToUpperCase(Ch: Char): Char;
  280. Var
  281.     Answer: Char;
  282. Begin
  283.     Answer := Ch;
  284.     If (Ch = 'ё') Then
  285.         Answer := 'Ё';
  286.     If (Ch >= 'а') And (Ch <= 'я') Then
  287.         Answer := Chr(Ord(Ch) - (Ord('а') - Ord('А')));
  288.     If (Ch >= 'a') And (Ch <= 'z') Then
  289.         Answer := Chr(Ord(Ch) - (Ord('a') - Ord('A')));
  290.     ToUpperCase := Answer;
  291. End;
  292.  
  293. Procedure Recoding(Const Str1, Str2: String; Var Text: TStrings; Var Points: TMatrix);
  294. Var
  295.     I, J, K, R: Integer;
  296.     DoesExist: Boolean;
  297. Begin
  298.     R := 0;
  299.     Setlength(Points, 1, 3);
  300.     For I := Low(Text) To High(Text) Do
  301.         For J := 1 To Length(Text[I]) Do
  302.         Begin
  303.             DoesExist := False;
  304.             For K := 1 To Length(Str1) Do
  305.                 If (Not DoesExist) And ((Text[I][J] = Str1[K])) Then
  306.                 Begin
  307.                     Points[R][0] := J;
  308.                     Points[R][1] := K;
  309.                     Points[R][2] := I;
  310.                     Inc(R);
  311.                     Setlength(Points, R + 1, 3);
  312.                     Text[I][J] := Str2[K];
  313.                     DoesExist := True;
  314.                 End
  315.                 Else
  316.                     If (Not DoesExist) And (Text[I][J] = ToUpperCase(Str1[K])) Then
  317.                     Begin
  318.                         Points[R][0] := J;
  319.                         Points[R][1] := K;
  320.                         Points[R][2] := I;
  321.                         Inc(R);
  322.                         Setlength(Points, R + 1, 3);
  323.                         Text[I][J] := ToUpperCase(Str2[K]);
  324.                         DoesExist := True;
  325.                     End;
  326.         End;
  327. End;
  328.  
  329. Procedure Decoding(Const Str1, Str2: String; Var Text: TStrings; Const Points: TMatrix);
  330. Var
  331.      J, Length: Integer;
  332. Begin
  333.     Length := High(Points) - 1;
  334.         For J := Low(Points) To Length Do
  335.         Begin
  336.             If (Text[Points[J][2]][Points[J][0]] = Str2[Points[J][1]]) Then
  337.                 Text[Points[J][2]][Points[J][0]] := Str1[Points[J][1]]
  338.             Else
  339.                 If (Text[Points[J][2]][Points[J][0]] = ToUpperCase(Str2[Points[J][1]])) Then
  340.                     Text[Points[J][2]][Points[J][0]] := ToUpperCase(Str1[Points[J][1]])
  341.         End;
  342. End;
  343.  
  344. Function OptionRead(): Integer;
  345. Var
  346.     Error: TErrorCode;
  347.     Option: Integer;
  348. Begin
  349.     Option := 0;
  350.     Repeat
  351.         Error := CORRECT;
  352.         Try
  353.             Readln(Option);
  354.         Except
  355.             Error := NON_NUMERIC;
  356.         End;
  357.         If (Error = CORRECT) And ((Option < 1) Or (Option > MAX_OPTION)) Then
  358.             Error := INCORRECT_CHOICE;
  359.         If Error <> CORRECT Then
  360.             Write(ERR[Error]);
  361.     Until Error = CORRECT;
  362.     OptionRead := Option;
  363. End;
  364.  
  365. Procedure OptionHowToRead(Var Str1, Str2: String; Var Text: TStrings);
  366. Var
  367.     Option: Integer;
  368. Begin
  369.     Writeln('If you want to read from console enter: 1');
  370.     Writeln('If you want to read from File enter:    2');
  371.     Option := OptionRead();
  372.     If Option = 2 Then
  373.         ReadInformationFromFile(Str1, Str2, Text)
  374.     Else
  375.         ReadInformationFromConsole(Str1, Str2, Text)
  376. End;
  377.  
  378. Procedure PrintConsole(Var Text: TStrings; Const J: Integer);
  379. Var
  380.     I: Integer;
  381. Begin
  382.     If J = 1 Then
  383.         WriteLn('Recoded text:')
  384.     Else
  385.         Writeln('Decoded text');
  386.     For I := Low(Text) To High(Text) Do
  387.         WriteLn(Text[I]);
  388. End;
  389.  
  390. Procedure PrintFile(Var Text: TStrings; Const J: Integer);
  391. Var
  392.     FileName: TextFile;
  393.     Error: TErrorCode;
  394.     I: Integer;
  395. Begin
  396.     Repeat
  397.         WriteLn('Enter the path to the file with extension ".txt" to get answer: ');
  398.         GetFileNormalWriting(FileName);
  399.         Writeln(FileName);
  400.         If J = 1 Then
  401.  
  402.             Writeln(FileName, 'Recoded text:')
  403.         Else
  404.             Writeln(FileName, 'Decoded text:');
  405.         For I := Low(Text) To High(Text) Do
  406.             WriteLn(FileName, Text[I]);
  407.         Error := DoesFileCloseable(FileName);
  408.         If Error <> CORRECT Then
  409.             Writeln(ERR[Error]);
  410.     Until Error = CORRECT;
  411. End;
  412.  
  413. Procedure PrintAnswer(Var Text: TStrings; Const I: Integer);
  414. Var
  415.     Option: Integer;
  416. Begin
  417.     Writeln('If you want to print answer in console enter: 1');
  418.     Writeln('If you want to print answer in File enter:    2');
  419.     Option := OptionRead();
  420.     If Option = 2 Then
  421.         PrintFile(Text, I)
  422.     Else
  423.         PrintConsole(Text, I);
  424. End;
  425.  
  426. Var
  427.     Str1, Str2: String;
  428.     Text: TStrings;
  429.     Points: TMatrix;
  430.  
  431. Begin
  432.     ProgramTask();
  433.     OptionHowToRead(Str1, Str2, Text);
  434.     Recoding(Str1, Str2, Text, Points);
  435.     Writeln('Recoded text');
  436.     PrintAnswer(Text, 1);
  437.     Decoding(Str1, Str2, Text, Points);
  438.     Writeln('Decoded text');
  439.     PrintAnswer(Text, 2);
  440.     Writeln('Press Enter to exit');
  441.     Readln;
  442.  
  443. End.
Advertisement
Add Comment
Please, Sign In to add comment