Advertisement
Vernon_Roche

Задание 1 Delphi (Лабораторная работа 3)

Nov 10th, 2023 (edited)
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.74 KB | None | 0 0
  1. Program Lab1;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TArray = Array[0..3] Of Integer;
  8.  
  9. Const
  10.     INPUT = 1;
  11.     OUTPUT = 2;
  12.     NULL_CODE = 48;
  13.     NINE_CODE = 57;
  14.  
  15. Function ChooseWay(Const IorOput: Integer): Integer;
  16. Var
  17.     Choice: Integer;
  18.     IsCorrect: Boolean;
  19. Begin
  20.     Case IorOput Of
  21.         INPUT:
  22.         Begin
  23.             Writeln('Выберите вариант ввода:');
  24.             Writeln('1.Данные вводятся из текстового файла.');
  25.             Writeln('2.Данные вводятся через консоль.');
  26.         End;
  27.         OUTPUT:
  28.         Begin
  29.             Writeln('Выберите вариант вывода:');
  30.             Writeln('1.Данные выводятся в текстовый файл.');
  31.             Writeln('2.Данные выводятся в консоль.');
  32.         End;
  33.     End;
  34.     Repeat
  35.         IsCorrect := True;
  36.         Try
  37.             Readln(Choice);
  38.         Except
  39.             Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
  40.             IsCorrect := False;
  41.         End;
  42.         If IsCorrect And ((Choice < 1) Or (Choice > 2)) Then
  43.         Begin
  44.             Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
  45.             IsCorrect := False;
  46.         End;
  47.     Until IsCorrect;
  48.     ChooseWay := Choice;
  49. End;
  50.  
  51. Function InputFileName(Const InOrOut: Integer): String;
  52. Var
  53.     CheckFile: TextFile;
  54.     FileName: String;
  55.     IsCorrect: Boolean;
  56. Begin
  57.     Case (InOrOut) Of
  58.         INPUT:
  59.         Begin
  60.             Writeln('Введите имя файла, из которого будут вводиться данные:');
  61.             Repeat
  62.                 IsCorrect := True;
  63.                 Readln(FileName);
  64.                 If ExtractFileExt(FileName) = '.txt' Then
  65.                 Begin
  66.                     If Not FileExists(FileName) Then
  67.                     Begin
  68.                         Writeln('Файла с таким именем не существует. Повторите ввод имени файла.');
  69.                         IsCorrect := False;
  70.                     End
  71.                     Else
  72.                         Try
  73.                             Assign(CheckFile, FileName);
  74.                             Reset(CheckFile);
  75.                             Close(CheckFile);
  76.                         Except
  77.                             Writeln('Невозможно открыть файл с таким именем! Повторите ввод имени файла:');
  78.                             IsCorrect := False;
  79.                         End;
  80.                 End
  81.                 Else
  82.                 Begin
  83.                     Writeln('Файл должен иметь расширение .txt! Повторите ввод имени файла.');
  84.                     IsCorrect := False;
  85.                 End;
  86.             Until IsCorrect;
  87.             InputFileName := FileName;
  88.         End;
  89.         OUTPUT:
  90.         Begin
  91.             Writeln('Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):');
  92.             Repeat
  93.                 IsCorrect := True;
  94.                 Readln(FileName);
  95.                 If ExtractFileExt(FileName) = '' Then
  96.                     FileName := FileName + '.txt';
  97.                 Try
  98.                     Assign(CheckFile, FileName);
  99.                     ReWrite(CheckFile);
  100.                     Close(CheckFile);
  101.                 Except
  102.                     Writeln('Невозможно открыть для записи файл с таким именем! Повторите ввод имени файла:');
  103.                     IsCorrect := False;
  104.                 End;
  105.             Until IsCorrect;
  106.             InputFileName := FileName;
  107.         End;
  108.     End;
  109. End;
  110.  
  111. Procedure InputFromFile(Var Text: String; Var FileName: String);
  112. Var
  113.     FileString: String;
  114.     InputFile: TextFile;
  115. Begin
  116.     Text := '';
  117.     Assign(InputFile, FileName);
  118.     Reset(InputFile);
  119.     While (Not EoF(InputFile)) Do
  120.     Begin
  121.         Readln(InputFile, FileString);
  122.         Text := Text + FileString;
  123.     End;
  124.     Close(InputFile);
  125. End;
  126.  
  127. Function CheckNum(VerifiableNum: Char): Boolean;
  128. Var
  129.     IsNum: Boolean;
  130.     I: Integer;
  131. Begin
  132.     IsNum := False;
  133.     I := NULL_CODE;
  134.     While Not IsNum And (I <= NINE_CODE) Do
  135.     Begin
  136.         IsNum := (Ord(VerifiableNum) = I);
  137.         Inc(I);
  138.     End;
  139.     CheckNum := IsNum;
  140. End;
  141.  
  142. Function CheckText(Var Text: String): Boolean;
  143. Var
  144.     FoundedNum: String;
  145.     IsCorrect: Boolean;
  146.     QuantityNumbers, Position: Integer;
  147. Begin
  148.     QuantityNumbers := 0;
  149.     Position := 1;
  150.     IsCorrect := True;
  151.     While IsCorrect And (Position <= Length(Text)) Do
  152.     Begin
  153.         If (CheckNum(Text[Position])) Then
  154.         Begin
  155.             FoundedNum := FoundedNum + Text[Position];
  156.             Inc(QuantityNumbers);
  157.             Inc(Position);
  158.             While (QuantityNumbers <= 4) And (Position <= Length(Text)) And CheckNum(text[position]) Do
  159.             Begin
  160.                 FoundedNum := FoundedNum + Text[Position];
  161.                 Inc(Position);
  162.                 Inc(QuantityNumbers);
  163.             End;
  164.             If (QuantityNumbers > 4) Or (StrToInt(FoundedNum) = 0) Or (StrToInt(FoundedNum) > 2000) Then
  165.                 IsCorrect := False;
  166.             FoundedNum := '';
  167.         End;
  168.         Inc(Position);
  169.     End;
  170.     If (QuantityNumbers = 0) Then
  171.         IsCorrect := False;
  172.     CheckText := isCorrect;
  173. End;
  174.  
  175. Procedure InputFromConsole(Var Text: String);
  176. Var
  177.     IsCorrect: Boolean;
  178. Begin
  179.     Repeat
  180.         Writeln('Введите строку для обработки:');
  181.         Readln(Text);
  182.         IsCorrect := CheckText(Text);
  183.         If Not IsCorrect Then
  184.             Writeln('Введенная строка не соответствует условию! Повторите ввод.');
  185.     Until IsCorrect;
  186. End;
  187.  
  188. Procedure InputText(Var Text: String; Var Choice: Integer);
  189. Var
  190.     FileName: String;
  191.     InputFile: TextFile;
  192.     IsCorrect: Boolean;
  193. Begin
  194.     Case Choice Of
  195.         1:
  196.             Repeat
  197.                 FileName := InputFileName(INPUT);
  198.                 InputFromFile(Text, FileName);
  199.                 IsCorrect := CheckText(Text);
  200.                 If Not IsCorrect Then
  201.                     Writeln('Введенный текст не соответствует условию! Повторите ввод имени файла.');
  202.             Until IsCorrect;
  203.         2:
  204.              InputFromConsole(Text);
  205.         End;
  206. End;
  207.  
  208. Procedure SearchNumbers(Var Text: String; Var ArrayNumbers: TArray);
  209. Var
  210.     FoundedNum: String;
  211.     Position, ArrLength: Integer;
  212. Begin
  213.     Position := 1;
  214.     ArrLength := 0;
  215.     While Position <= Length(Text) Do
  216.     Begin
  217.         If (CheckNum(Text[Position])) Then
  218.         Begin
  219.             FoundedNum := FoundedNum + Text[Position];
  220.             Inc(ArrLength);
  221.             Inc(Position);
  222.             While (Position <= Length(Text)) And CheckNum(Text[Position]) Do
  223.             Begin
  224.                 FoundedNum := FoundedNum + Text[Position];
  225.                 Inc(Position);
  226.             End;
  227.             ArrayNumbers[ArrLength - 1] := StrToInt(FoundedNum);
  228.             FoundedNum := '';
  229.         End;
  230.         Inc(Position);
  231.     End;
  232. End;
  233.  
  234. Function ConvertToRoman(Number: Integer): String;
  235. Const RomanNumbers: Array[0..9] Of Array[0..3] Of String = (('', '', '', ''),
  236.                                                             ('M', 'C', 'X', 'I'),
  237.                                                             ('MM', 'CC', 'XX', 'II'),
  238.                                                             ('', 'CCC', 'XXX', 'III'),
  239.                                                             ('', 'CD', 'XL', 'IV'),
  240.                                                             ('', 'D', 'L', 'V'),
  241.                                                             ('', 'DC', 'LX', 'VI'),
  242.                                                             ('', 'DCC', 'LXX', 'VII'),
  243.                                                             ('', 'DCCC', 'LXXX', 'VIII'),
  244.                                                             ('', 'CM', 'XC', 'IX'));
  245. Var
  246.     Counter: Integer;
  247.     ConvertedNum: String;
  248. Begin
  249.     Counter := 3;
  250.     While Number <> 0 Do
  251.     Begin
  252.         ConvertedNum := RomanNumbers[Number Mod 10][Counter] + ConvertedNum;
  253.         Number := Number div 10;
  254.         Dec(Counter);
  255.     End;
  256.     ConvertToRoman := ConvertedNum;
  257. End;
  258.  
  259. Procedure OutputInFile(Var FileName: String; Var Numbers: TArray);
  260. Var
  261.     OutputFile: TextFile;
  262.     I: Integer;
  263. Begin
  264.     Assign(OutputFile, FileName);
  265.     ReWrite(OutputFile);
  266.     I := 0;
  267.     While (Numbers[I] <> 0) And (I < 4) Do
  268.     Begin
  269.         Write(OutputFile, Numbers[I], ' ');
  270.         Inc(I);
  271.     End;
  272.     Writeln(OutputFile);
  273.     I := 0;
  274.     While (Numbers[I] <> 0) And (I < 4) Do
  275.     Begin
  276.         Write(OutputFile, ConvertToRoman(Numbers[I]), ' ');
  277.         Inc(I);
  278.     End;
  279.     Close(OutputFile);
  280. End;
  281.  
  282. Procedure OutputInConsole(Var Numbers: TArray);
  283. Var
  284.     I: Integer;
  285. Begin
  286.     Writeln('Искомые числа:');
  287.     I := 0;
  288.     While (Numbers[I] <> 0) And (I < 4) Do
  289.     Begin
  290.         Write(Numbers[I], ' ');
  291.         Inc(I);
  292.     End;
  293.     Writeln;
  294.     Writeln('Их представление в римской системе счисления:');
  295.     I := 0;
  296.     While (Numbers[I] <> 0) And (I < 4) Do
  297.     Begin
  298.         Write(ConvertToRoman(Numbers[I]), ' ');
  299.         Inc(I);
  300.     End;
  301. End;
  302.  
  303. Procedure OutputNumbers(Var Numbers: TArray; Choice: Integer);
  304. Var
  305.     FileName: String;
  306. Begin
  307.     Case Choice Of
  308.         1:
  309.         Begin
  310.             FileName := InputFileName(OUTPUT);
  311.             OutputInFile(FileName, Numbers);
  312.             Write('Искомые данные выведены в файл ');
  313.             Writeln(FileName);
  314.         End;
  315.         2:
  316.             OutputInConsole(Numbers);
  317.     End;
  318. End;
  319.  
  320. Var
  321.     Text: String;
  322.     Choice: Integer;
  323.     Numbers: TArray = (0, 0, 0, 0);
  324. Begin
  325.     Writeln('Программа выводит содержащиеся в тексте (текст должен содержать от 1 до 4 цифровых символов, отображающих целые числа от 1 до 2000) числа в десятичной и римской системах счисления.');
  326.     Choice := ChooseWay(INPUT);
  327.     InputText(Text, Choice);
  328.     SearchNumbers(Text, Numbers);
  329.     Choice := ChooseWay(OUTPUT);
  330.     OutputNumbers(Numbers, Choice);
  331.     Readln;
  332. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement