Advertisement
anticlown

Laba.3.1(Delphi)

Nov 6th, 2022 (edited)
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.14 KB | None | 0 0
  1. Program Laba_3_1;
  2.  
  3. Uses
  4.   System.SysUtils;
  5. Const
  6.   MIN_VALUE = 1;
  7.   MAX_VALUE = 2000;
  8.  
  9. Procedure OutputTaskInfo();
  10. Begin
  11.   Writeln('Данная программа переводит число из десятичной системы счисления в римскую.');
  12.   Writeln('Диапазон для ввода переводимого числа: ', MIN_VALUE, '...', MAX_VALUE);
  13. End;
  14.  
  15. Function InputPathToFile(): String;
  16. Var
  17.   Path: String;
  18.   IsCorrect: Boolean;
  19. Begin
  20.   Write('Укажите путь к файлу: ');
  21.  
  22.   Repeat
  23.     IsCorrect := True;
  24.     Readln(Path);
  25.  
  26.     If Not FileExists(Path) Then
  27.     Begin
  28.       Write('По указанному пути файл не найден! Укажите правильный путь: ');
  29.       IsCorrect := False;
  30.     End
  31.     Else If ExtractFileExt(Path) <> '.txt' Then
  32.     Begin
  33.       Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
  34.       IsCorrect := False;
  35.     End;
  36.   Until IsCorrect;
  37.  
  38.   InputPathToFile := Path;
  39. End;
  40.  
  41. Function GetVerificationOfChoice(): Integer;
  42. Var
  43.   Choice: Integer;
  44.   IsCorrect: Boolean;
  45. Begin
  46.   Repeat
  47.     IsCorrect := True;
  48.     Try
  49.       Readln(Choice);
  50.     Except
  51.       Writeln('Проверьте корректность ввода данных!');
  52.       IsCorrect := False;
  53.     End;
  54.  
  55.     If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
  56.     Begin
  57.       Writeln('Для выбора введите 0 или 1!');
  58.       IsCorrect := False;
  59.     End;
  60.  
  61.   Until IsCorrect;
  62.  
  63.   GetVerificationOfChoice := Choice;
  64. End;
  65.  
  66. Function InputNumberFromConsole(): String;
  67. Var
  68.   StrNumber: String;
  69.   Number: Integer;
  70.   IsCorrect: Boolean;
  71. Begin
  72.   Write('Введите переводимое число: ');
  73.  
  74.   Repeat
  75.     IsCorrect := True;
  76.  
  77.     Try
  78.       Readln(StrNumber);
  79.       Number := StrToInt(StrNumber);
  80.     Except
  81.       Writeln('Проверьте корректность ввода данных!');
  82.       IsCorrect := False;
  83.     End;
  84.  
  85.     If (IsCorrect And ((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
  86.     Begin
  87.       Writeln('Введите значение от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
  88.       IsCorrect := False;
  89.     End;
  90.  
  91.   Until IsCorrect;
  92.  
  93.   InputNumberFromConsole := StrNumber;
  94. End;
  95.  
  96. Function InputNumberFromFile(Const Path: String): String;
  97. Var
  98.   StrNumber: String;
  99.   Number: Integer;
  100.   InputFile: TextFile;
  101. Begin
  102.   Writeln('Происходит чтение числа...');
  103.   AssignFile (InputFile, Path);
  104.  
  105.   Try
  106.     Try
  107.       Reset(InputFile);
  108.       Readln(InputFile, StrNumber);
  109.       Number := StrToInt(StrNumber);
  110.     Finally
  111.       CloseFile (InputFile);
  112.     End;
  113.  
  114.     If (((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
  115.     Begin
  116.       Writeln('В файле введено некорректное число! Введите число с консоли!');
  117.       StrNumber := InputNumberFromConsole();
  118.     End;
  119.   Except
  120.     Writeln('Ошибка при чтении данных! Введите число с консоли!');
  121.     StrNumber := InputNumberFromConsole();
  122.   End;
  123.  
  124.   InputNumberFromFile := StrNumber;
  125. End;
  126.  
  127. Procedure OutputNumber(Const Choice: Integer; Const StrNumber: String; Path: String);
  128. Var
  129.   OutputFile: TextFile;
  130.   IsCorrect: Boolean;
  131. Begin
  132.   If Choice = 0 Then
  133.     Writeln('Введенное число: ', StrNumber);
  134.  
  135.   If Choice = 1 Then
  136.   Begin
  137.     Writeln('Вывод введенного числа в файл...');
  138.  
  139.     Repeat
  140.       IsCorrect := True;
  141.       AssignFile(OutputFile, Path);
  142.  
  143.       Try
  144.         Try
  145.           Rewrite(OutputFile);
  146.           Write(OutputFile, 'Введенное число: ', StrNumber);
  147.           Write(OutputFile, #13);
  148.         Finally
  149.           Close(OutputFile);
  150.         End;
  151.  
  152.       Except
  153.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  154.         IsCorrect := False;
  155.         Path := InputPathToFile();
  156.       End;
  157.     Until IsCorrect;
  158.  
  159.     Writeln('Данные успешно записаны в файл!');
  160.   End;
  161. End;
  162.  
  163. Function ConvertNumber(Const StrNumber: String): String;
  164. Const
  165.   DecimalSystem: Array [0..13] Of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 2000);
  166.   RomanSystem: Array [0..13] Of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M', 'Z');
  167. Var
  168.   RomanNumber: String;
  169.   I, Number: Integer;
  170. Begin
  171.   RomanNumber := '';
  172.   Number := StrToInt(StrNumber);
  173.   I := High(DecimalSystem) + 1;
  174.  
  175.   While Number > 0 Do
  176.   Begin
  177.     While DecimalSystem[I] > Number Do
  178.       Dec(I);
  179.  
  180.     RomanNumber := RomanNumber + RomanSystem[I];
  181.     Number := Number - DecimalSystem[I];
  182.   End;
  183.  
  184.   ConvertNumber := RomanNumber;
  185. End;
  186.  
  187. Procedure OutputRomanNumber(Const Choice: Integer; Const RomanNumber: String; Path: String);
  188. Var
  189.   OutputFile: TextFile;
  190.   IsCorrect: Boolean;
  191. Begin
  192.   If Choice = 0 Then
  193.     Writeln('Введенное число в римской системе будет равно ', RomanNumber, '.');
  194.  
  195.   If Choice = 1 Then
  196.   Begin
  197.     Writeln('Вывод переведенного числа в файл...');
  198.  
  199.     Repeat
  200.       IsCorrect := True;
  201.       AssignFile(OutputFile, Path);
  202.  
  203.       Try
  204.         Try
  205.           Append(OutputFile);
  206.           Write(OutputFile, 'Введенное число в римской системе будет равно ', RomanNumber, '.');
  207.           Write(OutputFile, #13);
  208.         Finally
  209.           Close(OutputFile);
  210.         End;
  211.       Except
  212.         Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
  213.         IsCorrect := False;
  214.         Path := InputPathToFile();
  215.       End;
  216.  
  217.     Until IsCorrect;
  218.  
  219.     Writeln('Данные успешно записаны в файл!');
  220.   End;
  221. End;
  222.  
  223. Function ProcessUserInput(): String;
  224. Var
  225.   PathToIn, StrNumber: String;
  226.   ChoiceForInput: Integer;
  227. Begin
  228.   Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
  229.   ChoiceForInput := GetVerificationOfChoice();
  230.  
  231.   If ChoiceForInput = 0 Then
  232.   Begin
  233.     StrNumber := InputNumberFromConsole();
  234.   End;
  235.  
  236.   If ChoiceForInput = 1 Then
  237.   Begin
  238.     PathToIn := InputPathToFile();
  239.     StrNumber := InputNumberFromFile(PathToIn);
  240.   End;
  241.  
  242.   ProcessUserInput := StrNumber;
  243. End;
  244.  
  245. Procedure ProcessUserOutput(Const StrNumber, RomanNumber: String);
  246. Var
  247.   PathToOut: String;
  248.   ChoiceForOutput: Integer;
  249. Begin
  250.   Writeln('Вы желаете получить данные в консоль(0) или в файл(1)?');
  251.   ChoiceForOutput := GetVerificationOfChoice();
  252.  
  253.   If ChoiceForOutput = 1 Then
  254.     PathToOut := InputPathToFile();
  255.  
  256.   OutputNumber(ChoiceForOutput, StrNumber, PathToOut);
  257.   OutputRomanNumber(ChoiceForOutput, RomanNumber, PathToOut);
  258. End;
  259.  
  260. Procedure Main();
  261. Var
  262.   StrNumber, RomanNumber: String;
  263. Begin
  264.   OutputTaskInfo();
  265.   StrNumber := ProcessUserInput();
  266.   RomanNumber := ConvertNumber(StrNumber);
  267.   ProcessUserOutput(StrNumber, RomanNumber);
  268. End;
  269.  
  270. Begin
  271.   Main();
  272.   Readln;
  273. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement