Program Laba_3_1; Uses System.SysUtils; Const MIN_VALUE = 1; MAX_VALUE = 2000; Procedure OutputTaskInfo(); Begin Writeln('Данная программа переводит число из десятичной системы счисления в римскую.'); Writeln('Диапазон для ввода переводимого числа: ', MIN_VALUE, '...', MAX_VALUE); End; Function InputPathToFile(): String; Var Path: String; IsCorrect: Boolean; Begin Write('Укажите путь к файлу: '); Repeat IsCorrect := True; Readln(Path); If Not FileExists(Path) Then Begin Write('По указанному пути файл не найден! Укажите правильный путь: '); IsCorrect := False; End Else If ExtractFileExt(Path) <> '.txt' Then Begin Write('Ошибка, неправильный тип файла! Укажите правильный путь: '); IsCorrect := False; End; Until IsCorrect; InputPathToFile := Path; End; Function GetVerificationOfChoice(): Integer; Var Choice: Integer; IsCorrect: Boolean; Begin Repeat IsCorrect := True; Try Readln(Choice); Except Writeln('Проверьте корректность ввода данных!'); IsCorrect := False; End; If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then Begin Writeln('Для выбора введите 0 или 1!'); IsCorrect := False; End; Until IsCorrect; GetVerificationOfChoice := Choice; End; Function InputNumberFromConsole(): String; Var StrNumber: String; Number: Integer; IsCorrect: Boolean; Begin Write('Введите переводимое число: '); Repeat IsCorrect := True; Try Readln(StrNumber); Number := StrToInt(StrNumber); Except Writeln('Проверьте корректность ввода данных!'); IsCorrect := False; End; If (IsCorrect And ((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then Begin Writeln('Введите значение от ', MIN_VALUE, ' до ', MAX_VALUE, '!'); IsCorrect := False; End; Until IsCorrect; InputNumberFromConsole := StrNumber; End; Function InputNumberFromFile(Const Path: String): String; Var StrNumber: String; Number: Integer; InputFile: TextFile; Begin Writeln('Происходит чтение числа...'); AssignFile (InputFile, Path); Try Try Reset(InputFile); Readln(InputFile, StrNumber); Number := StrToInt(StrNumber); Finally CloseFile (InputFile); End; If (((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then Begin Writeln('В файле введено некорректное число! Введите число с консоли!'); StrNumber := InputNumberFromConsole(); End; Except Writeln('Ошибка при чтении данных! Введите число с консоли!'); StrNumber := InputNumberFromConsole(); End; InputNumberFromFile := StrNumber; End; Procedure OutputNumber(Const Choice: Integer; Const StrNumber: String; Path: String); Var OutputFile: TextFile; IsCorrect: Boolean; Begin If Choice = 0 Then Writeln('Введенное число: ', StrNumber); If Choice = 1 Then Begin Writeln('Вывод введенного числа в файл...'); Repeat IsCorrect := True; AssignFile(OutputFile, Path); Try Try Rewrite(OutputFile); Write(OutputFile, 'Введенное число: ', StrNumber); Write(OutputFile, #13); Finally Close(OutputFile); End; Except Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!'); IsCorrect := False; Path := InputPathToFile(); End; Until IsCorrect; Writeln('Данные успешно записаны в файл!'); End; End; Function ConvertNumber(Const StrNumber: String): String; Const DecimalSystem: Array [0..13] Of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 2000); RomanSystem: Array [0..13] Of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M', 'Z'); Var RomanNumber: String; I, Number: Integer; Begin RomanNumber := ''; Number := StrToInt(StrNumber); I := High(DecimalSystem) + 1; While Number > 0 Do Begin While DecimalSystem[I] > Number Do Dec(I); RomanNumber := RomanNumber + RomanSystem[I]; Number := Number - DecimalSystem[I]; End; ConvertNumber := RomanNumber; End; Procedure OutputRomanNumber(Const Choice: Integer; Const RomanNumber: String; Path: String); Var OutputFile: TextFile; IsCorrect: Boolean; Begin If Choice = 0 Then Writeln('Введенное число в римской системе будет равно ', RomanNumber, '.'); If Choice = 1 Then Begin Writeln('Вывод переведенного числа в файл...'); Repeat IsCorrect := True; AssignFile(OutputFile, Path); Try Try Append(OutputFile); Write(OutputFile, 'Введенное число в римской системе будет равно ', RomanNumber, '.'); Write(OutputFile, #13); Finally Close(OutputFile); End; Except Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!'); IsCorrect := False; Path := InputPathToFile(); End; Until IsCorrect; Writeln('Данные успешно записаны в файл!'); End; End; Function ProcessUserInput(): String; Var PathToIn, StrNumber: String; ChoiceForInput: Integer; Begin Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?'); ChoiceForInput := GetVerificationOfChoice(); If ChoiceForInput = 0 Then Begin StrNumber := InputNumberFromConsole(); End; If ChoiceForInput = 1 Then Begin PathToIn := InputPathToFile(); StrNumber := InputNumberFromFile(PathToIn); End; ProcessUserInput := StrNumber; End; Procedure ProcessUserOutput(Const StrNumber, RomanNumber: String); Var PathToOut: String; ChoiceForOutput: Integer; Begin Writeln('Вы желаете получить данные в консоль(0) или в файл(1)?'); ChoiceForOutput := GetVerificationOfChoice(); If ChoiceForOutput = 1 Then PathToOut := InputPathToFile(); OutputNumber(ChoiceForOutput, StrNumber, PathToOut); OutputRomanNumber(ChoiceForOutput, RomanNumber, PathToOut); End; Procedure Main(); Var StrNumber, RomanNumber: String; Begin OutputTaskInfo(); StrNumber := ProcessUserInput(); RomanNumber := ConvertNumber(StrNumber); ProcessUserOutput(StrNumber, RomanNumber); End; Begin Main(); Readln; End.