P102.F90

Linear search w/ string


!
! =====> Program - P102.F90
!
!
!      CLASS LIST PROGRAM
!      FIND SOME STUDENT GRADES
!      USING A LINEAR SEARCH BY NAME
!
!      DECLARE ARRAYS FOR FILE
!
      CHARACTER (LEN=25) :: NAME(100),KEY
      INTEGER ID(100),MARKS(100,7)
      COMMON /COUNTS/ NCOMP
!
      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,1X,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,3X,A25,7I5)
            END IF
         END IF
      END DO L2
      END
!
      SUBROUTINE SCAN2(LIST,N,KEY,KPOS)
      CHARACTER (LEN=25) :: LIST(N),KEY
      COMMON/COUNTS/NCOMP
      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

DATA:
9414154 Binkley Mike              15 16 16 17 17 39 76
9613986 Bloom Milo                16 17 16 18 17 41 79
9412978 Cat Bill the              13 12 11 13 14 31 64
9613693 Dallas Steven             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 Opus                      19 19 19 18 19 45 91
0000000 Dummy                      0  0  0  0  0  0  0
Jones
John Cutter
Bloom Milo
Opuus
Done

OUTPUT:
Program entered
 This is Program >> P102 = Linear Search in sorted data
9414154 Binkley Mike              15 16 16 17 17 39 76
9613986 Bloom Milo                16 17 16 18 17 41 79
9412978 Cat Bill the              13 12 11 13 14 31 64
9613693 Dallas Steven             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 Opus                      19 19 19 18 19 45 91
      0 Dummy                      0  0  0  0  0  0  0

CLASS LIST PROGRAM - RETRIEVAL BY NAME
    7 RECORDS ON FILE

Jones                     NOT ON FILE - CHECK SPELLING

  9515010   John Cutter                 15   16   15   15   15   38   77
  9613986   Bloom Milo                  16   17   16   18   17   41   79

Opuus                     NOT ON FILE - CHECK SPELLING


    4 REQUESTS PROCESSED


AVERAGE NUMBER OF PROBES =   5.0
Fortran-90 STOP

Come back to the previous page

Page builder: Charles Boivin

Last modified: 11/07/95