Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM LookSpy(INPUT, OUTPUT);
- CONST
- Events: ARRAY[1..4] OF STRING = ('взял бинокль', 'сдал бинокль', 'покинул очередь', 'очередь пуста');
- TYPE
- SpyPtr = ^SpyType;
- SpyType = RECORD
- Name: STRING;
- Look, Time: WORD;
- Next, Prev: SpyPtr;
- END;
- VAR
- FirstSpy, CurrSpy, PrevSpy, NextSpy: SpyPtr;
- inF, outF: TEXT;
- Str: STRING;
- DoesFirst: BOOLEAN;
- TimeMoment, Count, CurrCount, CurrLook: WORD;
- FUNCTION ReadStringOfFile(VAR F: TEXT): STRING;
- VAR
- St: STRING;
- BEGIN
- READLN(F, St);
- ReadStringOfFile := St
- END; {ReadStringOfFile}
- FUNCTION ParsingString(VAR S: STRING): SpyPtr;
- VAR
- St: STRING;
- Len, Position, PositionNext, b: INTEGER;
- Num: INTEGER;
- Spy: SpyPtr;
- BEGIN
- NEW(Spy);
- Spy^.Next := NIL;
- Spy^.Prev := NIL;
- Len := LENGTH(S);
- WHILE Len > 0
- DO
- BEGIN
- PositionNext := POS(' ', S);
- IF PositionNext = 0
- THEN
- BEGIN
- VAL(S, Num, b);
- Spy^.Time := Num;
- DELETE(S, 1, Len)
- END
- ELSE
- BEGIN
- Position := PositionNext - 1;
- St := COPY(S, 1, Position);
- Spy^.Name := St;
- DELETE(S, 1, PositionNext);
- PositionNext := POS(' ', S);
- IF PositionNext <> 0
- THEN
- BEGIN
- Position := PositionNext - 1;
- St := COPY(S, 1, Position);
- VAL(S, Num, b);
- Spy^.Look := Num;
- DELETE(S, 1, PositionNext)
- END
- END;
- Len := LENGTH(S)
- END;
- ParsingString := Spy
- END; {ParsingString}
- BEGIN {LookSpy}
- ASSIGN(inF, 'inF1.txt');
- RESET(inF);
- ASSIGN(outF, 'outF.txt');
- REWRITE(outF);
- FirstSpy := NIL;
- Count := 0;
- CurrCount := 0;
- IF EOF(inF)
- THEN
- WRITELN(outF, 'Момент 0: ', Events[4]);
- WHILE NOT EOF(inF)
- DO
- BEGIN
- Str := ReadStringOfFile(inF);
- IF FirstSpy = NIL
- THEN
- BEGIN
- FirstSpy := ParsingString(Str);
- Count := 1;
- CurrSpy := FirstSpy
- END
- ELSE
- BEGIN
- CurrSpy^.Next := ParsingString(Str);
- INC(Count);
- PrevSpy := CurrSpy;
- CurrSpy := CurrSpy^.Next;
- CurrSpy^.Prev := PrevSpy
- END
- END;
- CurrSpy^.Next := FirstSpy; // связывание последнего элемента с первым
- FirstSpy^.Prev := CurrSpy;
- TimeMoment := 0;
- CurrSpy := FirstSpy;
- CurrLook := CurrSpy^.Look;
- WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[1]);
- WHILE Count <> 0
- DO
- BEGIN
- INC(TimeMoment);
- CurrSpy := FirstSpy;
- DEC(CurrLook);
- CurrCount := Count;
- DoesFirst := TRUE;
- WRITELN(OUTPUT, TimeMoment, ': ', Count, ' ', CurrSpy^.Time);
- WHILE (CurrCount > 0)
- DO
- BEGIN
- DEC(CurrSpy^.Time);
- DEC(CurrCount);
- IF (CurrSpy^.Time = 0)
- THEN
- BEGIN
- IF DoesFirst
- THEN
- WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[2], ', ', ' ', Events[3])
- ELSE
- WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[3]);
- PrevSpy := CurrSpy^.Prev;
- NextSpy := CurrSpy^.Next;
- PrevSpy^.Next := NextSpy;
- NextSpy^.Prev := PrevSpy;
- DISPOSE(CurrSpy);
- CurrSpy := NextSpy;
- DEC(Count);
- IF DoesFirst
- THEN
- BEGIN
- FirstSpy := CurrSpy;
- IF (Count <> 0) AND ((CurrSpy^.Time - 1) > 0)
- THEN
- WRITELN(outF, ' ', CurrSpy^.Name, ' ', Events[1])
- END
- END
- ELSE
- IF (CurrLook = 0) AND DoesFirst
- THEN
- BEGIN
- WRITELN(outF, 'Момент ', TimeMoment, ': ', CurrSpy^.Name, ' ', Events[2]);
- CurrSpy := CurrSpy^.Next;
- FirstSpy := CurrSpy;
- WRITELN(outF, ' ', CurrSpy^.Name, ' ', Events[1])
- END
- ELSE
- CurrSpy := CurrSpy^.Next;
- DoesFirst := FALSE
- END
- END
- END. {LookSpy}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement