!

PROGRAM P102

!

!

! CLASS LIST PROGRAM

! FIND SOME STUDENT GRADES

! USING A LINEAR SEARCH BY NAME

!

! DECLARE ARRAYS FOR FILE

!

IMPLICIT NONE

CHARACTER (LEN=25) :: NAME(100),KEY,COUNTS,NCOMP,APROBE

INTEGER :: ID(100),MARKS(100,7),NREC,I,J,NREQ,NC,KPOS

INTERFACE

SUBROUTINE SCAN2(LIST,N,KEY,KPOS,COUNTS,NCOMP)

IMPLICIT NONE

CHARACTER (LEN=25) ,INTENT(IN OUT) :: LIST(:),KEY

INTEGER ,INTENT(IN OUT) :: COUNTS,NCOMP,N,KPOS

END SUBROUTINE SCAN2

END INTERFACE

!

PRINT *, 'This is Program >> P102 = Linear Search in sorted data'

!

! Tell program where data for READ is coming from

OPEN(UNIT=5, FILE='P102.DAT') ! UNIT=5 is the default input

!

NC=0

!

!==== READ IN FILE AND STORE IN MAIN MEMORY

!

L1: DO J=1,100

READ 15,ID(J),NAME(J),(MARKS(J,I),I=1,7)

Print 15,ID(J),NAME(J),(MARKS(J,I),I=1,7)

15 FORMAT(I7,' ',A25,7I3)

IF(ID(J) == 0) GO TO 101

END DO L1

PRINT 16

16 FORMAT(/'TOO MUCH DATA FOR DEFINED ARRAYS'/ &

'INCREASE ARRAY SIZE AND RERUN'//)

STOP

!

!==== READ AND PROCESS NAMES REQUESTED

!

101 NREC=J-1

PRINT 102,NREC

102 FORMAT(/'CLASS LIST PROGRAM - RETRIEVAL BY NAME'/ &

I5,' RECORDS ON FILE')

L2: DO J=1,NREC

READ 202,KEY

202 FORMAT(A25)

IF(KEY == 'Done') THEN

NREQ=J-1

PRINT 203,NREQ

203 FORMAT(/ I5,' REQUESTS PROCESSED'/)

APROBE=NC/NREQ

PRINT 204,APROBE

204 FORMAT(/'AVERAGE NUMBER OF PROBES =',F6.1)

STOP

ELSE

CALL SCAN2(NAME,NREC,KEY,KPOS)

NC=NC+NCOMP

IF(KPOS <= 0) THEN

PRINT 205,KEY

205 FORMAT(/ A25,' NOT ON FILE - CHECK SPELLING'/)

ELSE

PRINT 206,ID(KPOS),KEY,(MARKS(KPOS,I),I=1,7)

206 FORMAT(I9,' ',A25,7I5)

END IF

END IF

END DO L2

STOP

END PROGRAM P102

!

SUBROUTINE SCAN2(LIST,N,KEY,KPOS,COUNTS,NCOMP)

IMPLICIT NONE

CHARACTER (LEN=25) ,INTENT(IN OUT) :: LIST(:),KEY

INTEGER ,INTENT(IN OUT) :: COUNTS,NCOMP,N,KPOS

INTEGER :: I

NCOMP=0

!

!==== LINEAR SEARCH ASSUMING SORTED DATA

!

L1: DO I=1,N

NCOMP=NCOMP+1

IF(KEY > LIST(I)) CYCLE

IF(KEY == LIST(I)) GO TO 100

KPOS=0

RETURN

END DO L1

KPOS=0

RETURN

100 KPOS=I

RETURN

END SUBROUTINE SCAN2