Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.39 KB | None | 0 0
  1. PROGRAM LookSpy(INPUT, OUTPUT);  
  2. CONST
  3.   Events: ARRAY[1..4] OF STRING = ('взял бинокль', 'сдал бинокль', 'покинул очередь', 'очередь пуста');
  4. TYPE
  5.   SpyPtr = ^SpyType;
  6.   SpyType = RECORD
  7.                Name: STRING;
  8.                Look, Time: WORD;
  9.                Next, Prev: SpyPtr;
  10.              END;
  11. VAR
  12.   FirstSpy, CurrSpy, PrevSpy, NextSpy: SpyPtr;
  13.   inF, outF: TEXT;
  14.   Str: STRING;
  15.   DoesFirst: BOOLEAN;
  16.   TimeMoment, Count, CurrCount, CurrLook: WORD;  
  17.  
  18. FUNCTION ReadStringOfFile(VAR F: TEXT): STRING;
  19. VAR
  20.   St: STRING;  
  21. BEGIN
  22.   READLN(F, St);
  23.   ReadStringOfFile := St
  24. END;  {ReadStringOfFile}  
  25.  
  26. FUNCTION ParsingString(VAR S: STRING): SpyPtr;
  27. VAR
  28.   St: STRING;
  29.   Len, Position, PositionNext, b: INTEGER;
  30.   Num: INTEGER;
  31.   Spy: SpyPtr;
  32. BEGIN
  33.   NEW(Spy);
  34.   Spy^.Next := NIL;
  35.   Spy^.Prev := NIL;
  36.   Len := LENGTH(S);
  37.   WHILE Len > 0
  38.   DO
  39.     BEGIN
  40.       PositionNext := POS(' ', S);
  41.       IF PositionNext = 0
  42.       THEN
  43.         BEGIN
  44.           VAL(S, Num, b);
  45.           Spy^.Time := Num;
  46.           DELETE(S, 1, Len)
  47.         END
  48.       ELSE
  49.         BEGIN
  50.           Position := PositionNext - 1;
  51.           St := COPY(S, 1, Position);
  52.           Spy^.Name := St;
  53.           DELETE(S, 1, PositionNext);
  54.           PositionNext := POS(' ', S);
  55.           IF PositionNext <> 0
  56.           THEN
  57.             BEGIN
  58.               Position := PositionNext - 1;
  59.               St := COPY(S, 1, Position);
  60.               VAL(S, Num, b);
  61.               Spy^.Look := Num;
  62.               DELETE(S, 1, PositionNext)
  63.             END
  64.         END;
  65.       Len := LENGTH(S)
  66.     END;
  67.   ParsingString := Spy
  68. END;  {ParsingString}  
  69.  
  70. BEGIN {LookSpy}
  71.   ASSIGN(inF, 'inF1.txt');
  72.   RESET(inF);
  73.   ASSIGN(outF, 'outF.txt');
  74.   REWRITE(outF);
  75.   FirstSpy := NIL;
  76.   Count := 0;
  77.   CurrCount := 0;
  78.   IF EOF(inF)
  79.   THEN
  80.     WRITELN(outF, 'Момент 0: ', Events[4]);
  81.   WHILE NOT EOF(inF)
  82.   DO
  83.     BEGIN
  84.       Str := ReadStringOfFile(inF);
  85.       IF FirstSpy = NIL
  86.       THEN
  87.         BEGIN
  88.           FirstSpy := ParsingString(Str);
  89.           Count := 1;
  90.           CurrSpy := FirstSpy
  91.         END
  92.       ELSE
  93.         BEGIN
  94.           CurrSpy^.Next := ParsingString(Str);
  95.           INC(Count);
  96.           PrevSpy := CurrSpy;
  97.           CurrSpy := CurrSpy^.Next;
  98.           CurrSpy^.Prev := PrevSpy
  99.         END                      
  100.     END;
  101.   CurrSpy^.Next := FirstSpy; // связывание последнего элемента с первым
  102.   FirstSpy^.Prev := CurrSpy;
  103.   TimeMoment := 0;
  104.   CurrSpy := FirstSpy;
  105.   CurrLook := CurrSpy^.Look;
  106.   WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[1]);
  107.   WHILE Count <> 0
  108.   DO
  109.     BEGIN
  110.       INC(TimeMoment);
  111.       CurrSpy := FirstSpy;
  112.       DEC(CurrLook);
  113.       CurrCount := Count;
  114.       DoesFirst := TRUE;
  115.       WRITELN(OUTPUT, TimeMoment, ': ', Count, ' ', CurrSpy^.Time);
  116.       WHILE (CurrCount > 0)
  117.       DO
  118.         BEGIN
  119.           DEC(CurrSpy^.Time);
  120.           DEC(CurrCount);
  121.           IF (CurrSpy^.Time = 0)
  122.           THEN
  123.             BEGIN
  124.               IF DoesFirst
  125.               THEN
  126.                 WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[2], ', ', ' ', Events[3])
  127.               ELSE  
  128.                 WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[3]);
  129.               PrevSpy := CurrSpy^.Prev;
  130.               NextSpy := CurrSpy^.Next;
  131.               PrevSpy^.Next := NextSpy;
  132.               NextSpy^.Prev := PrevSpy;
  133.               DISPOSE(CurrSpy);
  134.               CurrSpy := NextSpy;
  135.               DEC(Count);
  136.               IF DoesFirst
  137.               THEN
  138.                 BEGIN
  139.                   FirstSpy := CurrSpy;
  140.                   IF (Count <> 0) AND ((CurrSpy^.Time - 1) > 0)
  141.                   THEN
  142.                     WRITELN(outF, '           ', CurrSpy^.Name, ' ', Events[1])
  143.                 END
  144.             END
  145.           ELSE
  146.             IF (CurrLook = 0) AND DoesFirst
  147.             THEN
  148.               BEGIN
  149.                 WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[2]);
  150.                 CurrSpy := CurrSpy^.Next;
  151.                 FirstSpy := CurrSpy;
  152.                 WRITELN(outF, '          ', CurrSpy^.Name, ' ', Events[1])
  153.               END
  154.             ELSE
  155.               CurrSpy := CurrSpy^.Next;
  156.           DoesFirst := FALSE            
  157.         END        
  158.     END
  159. END. {LookSpy}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement