!

PROGRAM P101

!

!

! 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

INTEGER :: ID(100),MARKS(100,7),COUNTS,NCOMP

INTERFACE

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

IMPLICIT NONE

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

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

END SUBROUTINE KSCAN

END INTERFACE

!

PRINT *, 'This is Program >> P101 = Linear Search'

!

! Tell program where data for READ is coming from

OPEN(UNIT=5, FILE='P101.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 KSCAN(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,3X,A25,7I5)

END IF

END IF

END DO L2

STOP

END PROGRAM P101

!

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

IMPLICIT NONE

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

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

INTEGER :: I

NCOMP=0

L1: DO I=1,N

NCOMP=NCOMP+1

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

END DO L1

KPOS=0

RETURN

100 KPOS=I

RETURN

END SUBROUTINE KSCAN