(*$B4 4 BLOCK BUFFERS -- DECLARE BEFORE PROGRAM STATEMENT*) PROGRAM FINDLONGLINES(INPUT,OUTPUT) (* DETERMINE FILE LINE LENGTHS *); (*$T-,P-,L- *) CONST MAXLINELENGTH = 160; VAR LINECOUNT, CHARCOUNT, OVERSIZE, WHEREOVER : INTEGER; MAXLINESIZE, MINLINESIZE, MAXLLLC, MINLLLC : INTEGER; LENGTHS, WHERE : ARRAY[0..MAXLINELENGTH] OF INTEGER; PROCEDURE INITIALIZE; VAR I : INTEGER; BEGIN FOR I := 0 TO MAXLINELENGTH DO BEGIN LENGTHS[I] := 0; WHERE[I] := 0 END; MAXLINESIZE := 0; MAXLLLC := 0; MINLINESIZE := MAXINT; MINLLLC := 0; LINECOUNT := 0; CHARCOUNT := 0; OVERSIZE := 0; WHEREOVER := 0; END (* INITIALIZE *); PROCEDURE SCAN; VAR LINELENGTH : INTEGER; BEGIN WHILE NOT EOF(INPUT) DO BEGIN LINECOUNT := LINECOUNT + 1; LINELENGTH := 0; WHILE NOT EOLN(INPUT) DO BEGIN LINELENGTH := LINELENGTH + 1; GET(INPUT); CHARCOUNT := CHARCOUNT + 1 END (* NOT EOLN *); IF LINELENGTH > MAXLINESIZE THEN BEGIN MAXLINESIZE := LINELENGTH; MAXLLLC := LINECOUNT END ELSE IF LINELENGTH < MINLINESIZE THEN BEGIN MINLINESIZE := LINELENGTH; MINLLLC := LINECOUNT END; IF LINELENGTH > MAXLINELENGTH THEN BEGIN OVERSIZE := OVERSIZE + 1; IF WHEREOVER = 0 THEN WHEREOVER := LINECOUNT END ELSE (* LINE NOT TOO LONG FOR COUNTER ARRAY *) BEGIN LENGTHS[LINELENGTH] := LENGTHS[LINELENGTH] + 1; IF WHERE[LINELENGTH] = 0 THEN WHERE[LINELENGTH] := LINECOUNT END; READLN(INPUT) END (* NOT EOF *) END (* SCAN *); PROCEDURE REPORT; VAR I : INTEGER; BEGIN WRITELN(OUTPUT); WRITELN(OUTPUT, ' LINE COUNT = ', LINECOUNT : 6); WRITELN(OUTPUT, ' CHAR COUNT = ', CHARCOUNT : 6); WRITELN(OUTPUT, ' (120 CPS = ', CHARCOUNT / (120 * 60) : 4:1,' MIN. 30 CPS = ', CHARCOUNT / ( 30 * 60) : 4:1,' MIN.)'); WRITELN(OUTPUT, ' LONGEST LINE = ', MAXLINESIZE:3, ' CHARACTERS AT LINE ', MAXLLLC:5); WRITELN(OUTPUT, ' SHORTEST LINE = ', MINLINESIZE:3, ' CHARACTERS AT LINE ', MINLLLC:5); IF OVERSIZE > 0 THEN WRITELN(OUTPUT, ' LINES LONGER THAN MAX (', MAXLINELENGTH :1, ') = ', OVERSIZE:1, ' (FIRST AT ',WHEREOVER:1,')'); WRITELN(OUTPUT, ' LINE LENGTH, FREQUENCY, FIRST OCCURRANCE'); FOR I := MAXLINELENGTH DOWNTO 0 DO IF LENGTHS[I] <> 0 THEN WRITELN(OUTPUT, ' ', I : 4, ' =', LENGTHS[I] : 5, WHERE[I]:6); WRITELN(OUTPUT) END (* REPORT *); BEGIN (* FINDLONGLINES *) IF EOF(INPUT) THEN WRITELN(OUTPUT,'INPUT IS EMPTY') ELSE BEGIN INITIALIZE; SCAN; REPORT END END (* FINDLONGLINES *).