Advertisement
Guest User

Untitled

a guest
Oct 15th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.20 KB | None | 0 0
  1. program L1D;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.    System.SysUtils, Math;
  7.  
  8. type
  9.    Line = record
  10.    Public
  11.       BCoord, Ecoord: Real;
  12.       Count: Integer;
  13.    end;
  14.    TDArray = array of Line;
  15.  
  16. function CheckFileName(FileName: String): Boolean;
  17. var
  18.    Ans: Boolean;
  19.    i: Integer;
  20. begin
  21.    Ans := True;
  22.    i := 1;
  23.    while (i <= Length(FileName)) And Ans do
  24.    begin
  25.       if FileName[i] In ['\', '/', ':', '*', '?', '"', '<', '>', '|'] then
  26.       begin
  27.          Ans := False;
  28.          Writeln('\/:*?"<>| are forbidden characters...');
  29.       end;
  30.       Inc(i);
  31.    end;
  32.    if Length(FileName) = 0 then
  33.    begin
  34.       Ans := False;
  35.       Writeln('File name is empty');
  36.    end;
  37.    CheckFileName := Ans;
  38. end;
  39.  
  40. procedure Swap(var A, B: Real);
  41. var
  42.    Buf: Real;
  43. begin
  44.    Buf := A;
  45.    A := B;
  46.    B := A;
  47. end;
  48.  
  49. function ReadInput(var LineArray: TDArray; var N: Integer): Boolean;
  50. var
  51.    Option: Char;
  52.    ErrorPos, i: Integer;
  53.    FileName, RawInput: String;
  54.    InFile: TextFile;
  55.    KeepReadFileName, KeepReadCosole, StopReadN: Boolean;
  56. begin
  57.    Writeln('[1] Read data from file');
  58.    Writeln('[2] Read data from console');
  59.    Writeln('[~] Close');
  60.    Readln(Option);
  61.    case Option of
  62.       '1':
  63.       begin
  64.          KeepReadFileName := True;
  65.          while KeepReadFileName do
  66.          begin
  67.             Writeln('Enter file name: ');
  68.             Readln(FileName);
  69.             if CheckFileName(FileName) then
  70.             begin
  71.                AssignFile(InFile, FileName);
  72.                if FileExists(FileName) then
  73.                begin
  74.                   KeepReadFileName := False;
  75.                   Reset(InFile);
  76.                   //----------------------------------
  77.                   StopReadN := False;
  78.                   repeat
  79.                      Readln(InFile, RawInput);
  80.                      Val(RawInput, N, ErrorPos);
  81.                      if N > 0 then
  82.                         StopReadN := True
  83.                      else
  84.                         Writeln('N must be greater than zero...');
  85.                   until (ErrorPos = 0) And (StopReadN);
  86.                   SetLength(LineArray, N);
  87.                   for i := 0 to N - 1 do
  88.                   begin
  89.                      Read(InFile, LineArray[i].BCoord, LineArray[i].Ecoord);
  90.                      if LineArray[i].Ecoord < LineArray[i].BCoord then
  91.                         Swap(LineArray[i].Ecoord, LineArray[i].BCoord);
  92.                      LineArray[i].Count := 0;
  93.                   end;
  94.                   CloseFile(InFile);
  95.                   ReadInput := True;
  96.                   //-----------------------------------
  97.                end
  98.                else
  99.                   Writeln('No such file...');
  100.             end;
  101.          end;
  102.       end;
  103.       '2':
  104.       begin
  105.          KeepReadCosole := True;
  106.          while KeepReadCosole do
  107.          begin
  108.             StopReadN := False;
  109.             repeat
  110.                Writeln('Enter number of lines: ');
  111.                Readln(RawInput);
  112.                Val(RawInput, N, ErrorPos);
  113.                if N > 0 then
  114.                   StopReadN := True
  115.                else
  116.                   Writeln('N must be greater than zero...');
  117.             until (ErrorPos = 0) And (StopReadN);
  118.             SetLength(LineArray, N);
  119.             Writeln('Enter coordinates: ');
  120.             for i := 0 to N - 1 do
  121.             begin
  122.                Read(LineArray[i].BCoord, LineArray[i].Ecoord);
  123.                if LineArray[i].Ecoord < LineArray[i].BCoord then
  124.                   Swap(LineArray[i].Ecoord, LineArray[i].BCoord);
  125.                LineArray[i].Count := 0;
  126.             end;
  127.             KeepReadCosole := False;
  128.          end;
  129.          ReadInput := True;
  130.       end;
  131.    else
  132.       ReadInput := False;
  133.    end;
  134. end;
  135.  
  136. procedure WriteOutput(var Ans: Line);
  137. var Option: Char;
  138.    ErrorPos, i: Integer;
  139.    FileName, RawInput: String;
  140.    OutFile: TextFile;
  141.    KeepReadFileName, KeepReadOption: Boolean;
  142. begin
  143.    Writeln('[1] Write data to file');
  144.    Writeln('[2] Write data to console');
  145.    KeepReadOption := True;
  146.    while KeepReadOption do
  147.    begin
  148.       Readln(Option);
  149.       case Option of
  150.          '1':
  151.          begin
  152.             KeepReadOption := False;
  153.             KeepReadFileName := True;
  154.             while KeepReadFileName do
  155.             begin
  156.                Writeln('Enter file name: ');
  157.                Readln(FileName);
  158.                if CheckFileName(FileName) then
  159.                   KeepReadFileName := False;
  160.             end;
  161.             AssignFile(OutFile, FileName);
  162.             if FileExists(FileName) then
  163.             begin
  164.                KeepReadOption := True;
  165.                Writeln('Do you want to clear file? [Y/N]: ');
  166.                while KeepReadOption do
  167.                begin
  168.                   Readln(Option);
  169.                   if (UpperCase(Option) = 'Y') then
  170.                   begin
  171.                      Rewrite(OutFile);
  172.                      KeepReadOption := False;
  173.                   end
  174.                   else
  175.                   if UpperCase(Option) = 'N' then
  176.                   begin
  177.                      KeepReadOption := False;
  178.                      Append(OutFile);
  179.                   end;
  180.                end;
  181.             end
  182.             else
  183.                Rewrite(OutFile);
  184.          //---------------------------------
  185.             Writeln(OutFile, Ans.BCoord: 2: 3, ' ', Ans.ECoord: 2: 3, ' ', Ans.Count);
  186.             Writeln('Done.');
  187.             CloseFile(OutFile);
  188.          //-----------------------------------
  189.          end;
  190.          '2':
  191.          begin
  192.             KeepReadOption := False;
  193.             Writeln(Ans.BCoord: 2: 3, ' ', Ans.ECoord: 2: 3, ' ', Ans.Count);
  194.          end;
  195.       end;
  196.    end;
  197. end;
  198.  
  199. procedure QuickSort(var A: TDArray; Min, Max: Integer);
  200. var
  201.    i, j: Integer;
  202.    Mid, Buf: Line;
  203. begin
  204.    Mid := A[Max - ((Max - Min) Div 2)];
  205.    i := Min;
  206.    j := Max;
  207.    while i < j do
  208.    begin
  209.       while A[i].BCoord < Mid.BCoord do
  210.          i := i + 1;
  211.       while A[j].BCoord > Mid.BCoord do
  212.          j := j - 1;
  213.       if i <= j then
  214.       begin
  215.          Buf := A[i];
  216.          A[i] := A[j];
  217.          A[j] := Buf;
  218.          i := i + 1; j := j - 1;
  219.       end;
  220.    end;
  221.    if Min < j then
  222.       QuickSort(A, Min, j);
  223.    if i < Max then
  224.       QuickSort(A, i, Max);
  225. end;
  226.  
  227. function CountMaxIntersections(var LineList: TDArray): Line;
  228. var
  229.    i, j: Integer;
  230.    Ans: Line;
  231. begin
  232.    Ans.Count := -1;
  233.    i := 0;
  234.    while i < Length(LineList) - 1 do
  235.    begin
  236.       j := i + 1;
  237.       while (LineList[j].BCoord <= LineList[i].ECoord) And (j < Length(LineList)) do
  238.       begin
  239.          Inc(LineList[j].Count);
  240.          Inc(LineList[i].Count);
  241.          Inc(j);
  242.       end;
  243.       if LineList[i].Count > Ans.Count then
  244.          Ans := LineList[i];
  245.       Inc(i);
  246.    end;
  247.    CountMaxIntersections := Ans;
  248. end;
  249.  
  250. procedure Main();
  251. var
  252.    i, N: Integer;
  253.    LineArr: TDArray;
  254.    Close: Boolean;
  255.    Buf, Ans: Line;
  256. begin
  257.    while ReadInput(LineArr, N) do
  258.    begin
  259.       try
  260.          QuickSort(LineArr, 0, N - 1);
  261.          Ans := CountMaxIntersections(LineArr);
  262.          WriteOutput(Ans);
  263.       except
  264.          on EInOutError do
  265.             Writeln('Input Error');
  266.       end;
  267.    end;
  268. end;
  269.  
  270. begin
  271.    Main;
  272. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement