P105.F90

Hashing scheme


!
! =====> 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

Come back to the previous page

Page builder: Charles Boivin

Last modified: 11/07/95