!
! =====> Program - P105.F90
!
!
! CLASS LIST RETRIEVAL PROGRAM
! FIND SOME STUDENT GRADES
! USING A HASHING SCHEME WITH THE ID AS THE KEY
!
! DECLARE ARRAYS FOR FILE
!
CHARACTER (LEN=25) NAMES(100),NAME
INTEGER ID(100),MARKS(100,7),GRADES(7)
!
PRINT *, 'This is Program >> P105 = Hashing'
!
! Tell program where data for READ is coming from
OPEN(UNIT=5, FILE='P105.DAT') ! UNIT=5 is the default input
!
!
!===== ZERO OUT ALL ID'S FOR STARTERS
!
L1: DO J=1,100
ID(J)=0
END DO L1
!
!==== READ IN FILE AND STORE IN MAIN MEMORY
!
L2: DO J=1,100
READ 15,KD,NAME,GRADES
15 FORMAT(I7,1X,A25,7I3)
IF(KD == 0) GO TO 101
Print 15,KD,NAME,GRADES
CALL HASH(KD,NR)
31 IF(ID(NR) == 0) THEN
! STORE AWAY THE DATA IN ANY EMPTY SLOT
ID(NR)=KD
NAMES(NR)=NAME
L3: DO K=1,7
MARKS(NR,K)=GRADES(K)
END DO L3
!
!=== HERE WE DEAL WITH THE CASE OF A USED SLOT
! TRY THE NEXT OVER, BUT WATCH FOR END OF THE FILE
!
ELSE
NR=NR+1
! IF AT END - START AT BEGINNING
IF(NR > 100) NR=1
GO TO 31
END IF
END DO L2
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')
NREQ=0
L4: DO J=1,NREC
READ 202,KID
202 FORMAT(I7)
IF(KID == 0) THEN
PRINT 203,NREQ
203 FORMAT(I5,' REQUESTS PROCESSED'/)
STOP
ELSE
NREQ=NREQ+1
CALL HASH(KID,NR)
231 IF(ID(NR) == 0) THEN
PRINT 205,KID
205 FORMAT(I9,' NOT ON FILE - CHECK SPELLING')
ELSE
IF(KID == ID(NR)) THEN
PRINT 206,KID,NAMES(NR),(MARKS(NR,I),I=1,7)
206 FORMAT(I9,3X,A25,7I5)
ELSE
NR=NR+1
IF(NR > 100) NR=1
GO TO 231
END IF
END IF
END IF
END DO L4
END
!
SUBROUTINE HASH(ID,NR)
INTEGER, PARAMETER :: NPRIME=97
NR=MOD(ID,NPRIME)+1
RETURN
END
DATA:
9611684 Opus 15 16 16 17 17 39 76
9613986 Bloom Milo 16 17 16 18 17 41 79
9412978 Dallas Steven 13 12 11 13 14 31 64
9613693 Cat Bill the 18 18 19 17 19 41 82
9515010 John Cutter 15 16 15 15 15 38 77
9510633 Jones Oliver W 17 17 18 17 17 42 80
9513221 Mike Binkley 19 19 19 18 19 45 91
0000000 Dummy 0 0 0 0 0 0 0
9611684
9613693
9511522
9513221
0000000
OUTPUT:
Program entered
This is Program >> P105 = Hashing
9611684 Opus 1 51 61 61 71 73 97 6
9613986 Bloom Milo 1 61 71 61 81 74 17 9
9412978 Dallas Steven 1 31 21 11 31 43 16 4
9613693 Cat Bill the 1 81 81 91 71 94 18 2
9515010 John Cutter 1 51 61 51 51 53 87 7
9510633 Jones Oliver W 1 71 71 81 71 74 28 0
9513221 Mike Binkley 1 91 91 91 81 94 59 1
CLASS LIST PROGRAM - RETRIEVAL BY NAME
7 RECORDS ON FILE
9611684 Opus 1 51 61 61 71 73 97 6
9613693 Cat Bill the 1 81 81 91 71 94 18 2
9511522 NOT ON FILE - CHECK SPELLING
9513221 Mike Binkley 1 91 91 91 81 94 59 1
4 REQUESTS PROCESSED
Fortran-90 STOP
Page builder: Charles Boivin
Last modified: 11/07/95