Advertisement
Alyks

Untitled

Oct 23rd, 2019
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.71 KB | None | 0 0
  1. program task2;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. uses
  7.     System.SysUtils,
  8.     StrUtils,
  9.     Math;
  10.  
  11. type
  12.     NumsArr = Array [0 .. 1] of String;
  13.     SeqArr = Array of String;
  14.  
  15.  
  16. function MakeSameLength(Seq1, Seq2: String): NumsArr;
  17. var
  18.     ZeroesCount, i: Integer;
  19.     Arr: NumsArr;
  20.     Num1, Num2: String;
  21. begin
  22.     Num1 := Seq1;
  23.     Num2 := Seq2;
  24.     ZeroesCount := Abs(Length(Num1) - Length(Num2));
  25.     for i := 0 to ZeroesCount - 1 do
  26.     begin
  27.         if (Length(Num1) < Length(Num2)) then
  28.             Num1 := '0' + Num1
  29.         else
  30.             Num2 := '0' + Num2;
  31.     end;
  32.     Arr[0] := Num1;
  33.     Arr[1] := Num2;
  34.     Result := Arr;
  35. end;
  36.  
  37. function Sum(Seq1, Seq2: String): String;
  38. var
  39.     Nums: NumsArr;
  40.     i: Integer;
  41.     Num1, Num2, Sequence: String;
  42.     Memory, El1, El2, Res, Units: Byte;
  43. begin
  44.     Nums := MakeSameLength(Seq1, Seq2);
  45.     Num1 := Nums[0];
  46.     Num2 := Nums[1];
  47.     Memory := 0;
  48.     Sequence := '';
  49.     for i := Length(Num1) downto 1 do
  50.     begin
  51.         El1 := StrToInt(Num1[i]);
  52.         El2 := StrToInt(Num2[i]);
  53.         Res := El1 + El2 + Memory;
  54.         Units := Res mod 10;
  55.         if (i <> 1) then
  56.         begin
  57.             Memory := Res div 10;
  58.             Sequence := IntToStr(Units) + Sequence;
  59.         end
  60.         else
  61.             Sequence := IntToStr(Res) + Sequence;
  62.     end;
  63.     Result := Sequence;
  64. end;
  65.  
  66. procedure ShowSequence(const Seq: SeqArr);
  67. var
  68.     i: Integer;
  69. begin
  70.     for i := 0 to High(Seq) do
  71.         Write(Seq[i], ' ');
  72.     Writeln;
  73. end;
  74.  
  75. function GetNumberFromSeq(const Seq: SeqArr): Integer;
  76. var
  77.     Res, El: String;
  78.     i: Integer;
  79. begin
  80.     Res := '0';
  81.     for i := 0 to High(Seq) do
  82.     begin
  83.         El := Trim(Seq[i]);
  84.         Res := Sum(Res, El);
  85.     end;
  86.     Result := StrToInt(Res);
  87. end;
  88.  
  89. function ReadNextLine(const FileToRead: TextFile): String;
  90. var
  91.     CurrLine: String;
  92.     Exception: Boolean;
  93. begin
  94.     try
  95.         Readln(FileToRead, CurrLine);
  96.     except
  97.         Exception := true;
  98.     end;
  99.     if (Exception) then
  100.         Result := '-1'
  101.     else
  102.         Result := CurrLine;
  103. end;
  104.  
  105. function Input(): String;
  106. var
  107.     Value: String;
  108. begin
  109.     try
  110.         Readln(Value);
  111.     except
  112.         Writeln('Введите корректный путь к файлу!');
  113.     end;
  114.     Result := Value;
  115. end;
  116.  
  117. function ExtractNums(Str: String): SeqArr;
  118. var
  119.     i, j, Len: Integer;
  120.     Arr: SeqArr;
  121. begin
  122.     j := 0;
  123.     Len := Floor(Length(Str)/2);
  124.     SetLength(Arr, Len);
  125.     for i := 1 to Length(Str) do
  126.     begin
  127.         if(Str[i] in ['0'..'9']) then
  128.         begin
  129.             Arr[j] := Str[i];
  130.             j := j + 1;
  131.         end;
  132.     end;
  133.     Result := Arr;
  134. end;
  135.  
  136. procedure Main();
  137. var
  138.     NotCorrect, NoException: Boolean;
  139.     FilePath, Sequence: String;
  140.     Seq1, Seq2: SeqArr;
  141.     Num1, Num2: Integer;
  142.     InputFile, OutputFile: TextFile;
  143. begin
  144.     Writeln('Данная программа находит последовательность, представляющую сумму двух натуральных чисел, заданных своими последовательностями');
  145.     Writeln;
  146.     NotCorrect := true;
  147.     while (NotCorrect) do
  148.     begin
  149.         NoException := true;
  150.         Writeln('Введите путь до файла, в котором находятся последовательности чисел, либо его имя, если файл находится в одной директории с программой');
  151.         FilePath := Input();
  152.         if (not ContainsText(FilePath, '.txt')) then
  153.             FilePath := FilePath + '.txt';
  154.         if (FileExists(FilePath)) then
  155.             AssignFile(InputFile, FilePath)
  156.         else
  157.         begin
  158.             Writeln('Произошла ошибка при чтении файла. Убедитесь, что такой файл существует, либо проверьте имя файла.');
  159.             NoException := false;
  160.         end;
  161.  
  162.         if (NoException) then
  163.         begin
  164.             Reset(InputFile);
  165.             Seq1 := ExtractNums(ReadNextLine(InputFile));
  166.             Seq2 := ExtractNums(ReadNextLine(InputFile));
  167.             Close(InputFile);
  168.             Writeln('Последовательности, записанные в файле:');
  169.             ShowSequence(Seq1);
  170.             ShowSequence(Seq2);
  171.             Num1 := GetNumberFromSeq(Seq1);
  172.             Num2 := GetNumberFromSeq(Seq2);
  173.             Writeln('Получившиеся числа: ', Num1, ' и ', Num2);
  174.  
  175.             if ((Num1 > 0) and (Num2 > 0)) then
  176.             begin
  177.                 Sequence := Sum(IntToStr(Num1), IntToStr(Num2));
  178.                 Writeln('Результат: ', Sequence);
  179.                 AssignFile(OutputFile, 'output.txt');
  180.                 Rewrite(OutputFile);
  181.                 Writeln(OutputFile, 'Результат: ', Sequence);
  182.                 Close(OutputFile);
  183.                 Writeln('Результат сохранен в файл output.txt');
  184.                 NotCorrect := false;
  185.             end
  186.             else
  187.                 Writeln('Файл должен состоять из последовательности натуральных чисел');
  188.         end;
  189.     end;
  190.     Readln;
  191. end;
  192.  
  193. begin
  194.     Main();
  195. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement