Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.32 KB | None | 0 0
  1. program Lab3_1;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   System.SysUtils;
  5. type
  6.    TIntArray = Array of Integer;
  7.  
  8. procedure ChooseInOutType(var InOutType: Boolean; MessageType: String);
  9. var
  10.    TypedLetter: Char;
  11.    IsCorrectAnswer: Boolean;
  12. begin
  13.    if (MessageType = 'in') then
  14.       Writeln('В случае, если вы хотите ввести строку из файла, введите F. Если же вы хотите ввести строку из консоли, введите C.')
  15.    else
  16.       if (MessageType = 'out') then
  17.          Writeln('В случае, если вы хотите произвести вывод в файл, введите F. Если же вы хотите произвести вывод только на экран, введите C.');
  18.    IsCorrectAnswer := false;
  19.    repeat
  20.       Readln(TypedLetter);
  21.       TypedLetter := UpCase(TypedLetter);
  22.       if (TypedLetter = 'F') then
  23.       begin
  24.          InOutType := true;
  25.          IsCorrectAnswer := true;
  26.       end
  27.       else
  28.          if (TypedLetter = 'C') then
  29.          begin
  30.             InOutType := false;
  31.             IsCorrectAnswer := true;
  32.          end
  33.       else
  34.       begin
  35.          Writeln('Ошибка. Был введён некорректный ответ. Повторите попытку.');
  36.          IsCorrectAnswer := false;
  37.       end;
  38.    until (IsCorrectAnswer);
  39. end;
  40.  
  41. function ReadStringFromFile(SourceFileName: String): String;
  42. var
  43.    InputSource: TextFile;
  44.    InputString: String;
  45.    i: Integer;
  46. begin
  47.    AssignFile(InputSource, SourceFileName);
  48.    Reset(InputSource);
  49.    Read(InputSource, InputString);
  50.    CloseFile(InputSource);
  51.    ReadStringFromFile := InputString;
  52. end;
  53.  
  54. procedure DeleteExcessSpaces(var BrokenString: String);
  55. var
  56.    i: Integer;
  57. begin
  58.    for i := 1 to (High(BrokenString) - 1) do
  59.       if (BrokenString[i] = ' ') then
  60.          while (BrokenString[i+1] = ' ') do
  61.          begin
  62.             delete(BrokenString, i+1, 1);
  63.          end;
  64.    if (BrokenString[High(BrokenString)] = ' ') then
  65.       delete(BrokenString, High(BrokenString), 1);
  66. end;
  67.  
  68. function CountStrNums(InputString: String): Integer;
  69. var
  70.    i, NumsCount: Integer;
  71. begin
  72.    NumsCount := 1;
  73.    for i := 1 to High(InputString) do
  74.       if (InputString[i] = ' ') then
  75.          inc(NumsCount);
  76.    CountStrNums := NumsCount;
  77. end;
  78.  
  79. function BreakStringIntoArray(InputString: String; NumbersCount: Integer): TIntArray;
  80. var
  81.    FillingArray: TIntArray;
  82.    i, PrevSpace: Integer;
  83. begin
  84.    SetLength(FillingArray, NumbersCount);
  85.    for i := 0 to High(FillingArray) - 1 do
  86.    begin
  87.       FillingArray[i] := StrToInt(Copy(InputString, 1, pos(' ', InputString) - 1));
  88.       Delete(InputString, 1, pos(' ', InputString));
  89.    end;
  90.    FillingArray[High(FillingArray)] := StrToInt(Copy(InputString, 1, high(InputString)));
  91.    BreakStringIntoArray := FillingArray;
  92. end;
  93.  
  94. function DecToRoman(DecNumber: Integer): String;
  95. const
  96.    DecDigits: Array[1..13] of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
  97.    RomanDigits: Array[1..13] of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
  98. var
  99.    i: Integer;
  100.    StrResult: String;
  101. begin
  102.    i := 13;
  103.    StrResult := ' ';
  104.    while (DecNumber > 0) do
  105.       if (DecDigits[i] > DecNumber) then
  106.          dec(i)
  107.       else
  108.       begin
  109.          DecNumber := DecNumber - DecDigits[i];
  110.          StrResult := StrResult + RomanDigits[i];
  111.       end;
  112.    DecToRoman :=  StrResult;
  113. end;
  114.  
  115. function ReadNumberString(): String;
  116. const
  117.    Digits: Set of Char = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  118. var
  119.    i, k, StrLength: Integer;
  120.    InputString: String;
  121.    IsCorrectString: Boolean;
  122. begin
  123.    Writeln('Введите четыре натуральных числа до 2000');
  124.    repeat
  125.       IsCorrectString := true;
  126.       i := 1;
  127.       Readln(InputString);
  128.       StrLength := Length(InputString) + 1;
  129.       while (i < StrLength) and (IsCorrectString) do
  130.       begin
  131.          if (InputString[i] = ' ') then
  132.             inc(i)
  133.          else
  134.             if (InputString[i] in Digits) then
  135.                inc(i)
  136.             else
  137.             begin
  138.                IsCorrectString := false;
  139.                Writeln('Ошибка. Введите четыре натуральных числа до 2000');
  140.             end;
  141.       end;
  142.    until (IsCorrectString);
  143.    ReadNumberString := InputString;
  144. end;
  145.  
  146. function ConvertString(DecStr: String): String;
  147. var
  148.    StrNumsCount, i: Integer;
  149.    DecNumbers: TIntArray;
  150.    RomStr: String;
  151. begin
  152.    StrNumsCount := CountStrNums(DecStr);
  153.    DecNumbers := BreakStringIntoArray(DecStr, StrNumsCount);
  154.    for i := 0 to High(DecNumbers) do
  155.       RomStr := RomStr + DecToRoman(DecNumbers[i]);
  156.    ConvertString := RomStr;
  157. end;
  158.  
  159. function ReadFileName(): String;
  160. var
  161.    FileName: String;
  162.    TestNumber: Real;
  163. begin
  164.    Readln(FileName);
  165.    FileName := FileName + '.txt';
  166.    ReadFileName := FileName;
  167. end;
  168.  
  169. function isFileCorrect(FileName: String): Boolean;
  170. var
  171.    TestNumber, NumsCount: Integer;
  172.    TestFile: TextFile;
  173. begin
  174.    NumsCount := 0;
  175.    try
  176.       AssignFile(TestFile, FileName);
  177.       Reset(TestFile);
  178.       if (FileExists(FileName)) then
  179.       begin
  180.          while not (EoF(TestFile)) do
  181.             begin
  182.             Read(TestFile, TestNumber);
  183.             inc(NumsCount);
  184.             end;
  185.          if NumsCount < 5 then
  186.             IsFileCorrect := true
  187.          else
  188.          begin
  189.             Writeln('Ошибка. Указанный файл содержит больше 4 чисел.');
  190.             IsFileCorrect := false;
  191.          end;
  192.       end
  193.       else
  194.       begin
  195.          Writeln('Указанный файл не найден');
  196.          IsFileCorrect := false;
  197.       end;
  198.    except
  199.       Writeln('Ощибка. Указанный файл содержит буквенные символы');
  200.       IsFileCorrect := false;
  201.    end;
  202. end;
  203.  
  204. procedure ClearFile(OutputFileName: String);
  205. var
  206.    OutputFile: TextFile;
  207. begin
  208.    AssignFile(OutputFile, OutputFileName);
  209.    Rewrite(OutputFile);
  210.    CloseFile(OutputFile);
  211. end;
  212.  
  213. function ChooseOutputFile(): String;
  214. var
  215.    OutputFileName: String;
  216.    Answer: Char;
  217.    IsCorrectFile, IsCorrectAnswer: Boolean;
  218. begin
  219.    IsCorrectFile := false;
  220.    IsCorrectAnswer := false;
  221.    repeat
  222.       Writeln('Укажите название файла, в который хотите произвести запись.');
  223.       OutputFileName := ReadFileName();
  224.       if (FileExists(OutputFileName)) then
  225.       begin
  226.          ClearFile(OutputFileName);
  227.          IsCorrectFile := true;
  228.       end
  229.       else
  230.       begin
  231.          Writeln('Файл с указанным названием не существует. Если вы желаете создать файл с указанным именем, введите Y, в обратном случае введите N');
  232.          repeat
  233.             Readln(Answer);
  234.             Answer := UpCase(Answer);
  235.             if (Answer = 'Y') then
  236.             begin
  237.                ClearFile(OutputFileName);
  238.                IsCorrectFile := true;
  239.                IsCorrectAnswer := true;
  240.             end
  241.             else
  242.                if (Answer = 'N') then
  243.                begin
  244.                   IsCorrectFile := false;
  245.                   IsCorrectAnswer := true;
  246.                end
  247.             else
  248.             begin
  249.                Writeln('Ошибка. Был введён некорректный ответ. Повторите попытку');
  250.             end;
  251.          until (IsCorrectAnswer);
  252.       end;
  253.    until (IsCorrectFile);
  254.    ChooseOutputFile := OutputFileName;
  255. end;
  256.  
  257. procedure WritelnStrInFile(OutputFileName, Str: String);
  258. var
  259.    OutputFile: TextFile;
  260. begin
  261.    AssignFile(OutputFile, OutputFileName);
  262.    Append(OutputFile);
  263.    Writeln(OutputFile, Str);
  264.    CloseFile(OutputFile);
  265. end;
  266.  
  267. function ReadString (): String;
  268. var
  269.    FileInput: Boolean;
  270.    InputFileName, FullDecStr: String;
  271. begin
  272.    ChooseInOutType(FileInput, 'in');
  273.    if (FileInput) then
  274.    begin
  275.       repeat
  276.          Writeln('Укажите имя файла, из которого хотите считать строку');
  277.          InputFileName := ReadFileName();
  278.       until (IsFileCorrect(InputFileName));
  279.       FullDecStr := ReadStringFromFile(InputFileName);
  280.    end
  281.    else
  282.    begin
  283.       FullDecStr := ReadNumberString();
  284.    end;
  285.    ReadString := FullDecStr;
  286. end;
  287.  
  288. procedure PrintToFile(StrAnswer: String);
  289. var
  290.    OutputFileName: String;
  291. begin
  292.    OutputFileName := ChooseOutputFile();
  293.    WritelnStrInFile(OutputFileName, 'Числа, представленные римскими цифрами: ');
  294.    WritelnStrInFile(OutputFileName, StrAnswer);
  295.    Writeln('Запись в файл произведена успешно');
  296. end;
  297.  
  298. procedure PrintResult(FullDecStr, FullRomanStr: String);
  299. var
  300.    FileOutput: Boolean;
  301. begin
  302.    Writeln('Числа, представленные арабскими цифрами: ', FullDecStr);
  303.    Writeln('Числа, представленные римскими цифрами: ', FullRomanStr);
  304.    ChooseInOutType(FileOutput, 'out');
  305.    if (FileOutput) then
  306.       PrintToFile(FullRomanStr);
  307. end;
  308.  
  309. procedure Main();
  310. var
  311.    FullDecStr, FullRomanStr: String;
  312. begin
  313.    Writeln('Данная программа переводит до 4 введённых чисел, представленных арабскими цифрами, в римские цифры.');
  314.    FullDecStr := ReadString();
  315.    DeleteExcessSpaces(FullDecStr);
  316.    FullRomanStr := ConvertString(FullDecStr);
  317.    PrintResult(FullDecStr, FullRomanStr);
  318.    Readln;
  319. end;
  320.  
  321. begin
  322.    Main();
  323. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement