{-----------------------------} { SHOWNAME } { by Jeff Duntemann } { } { Binary search demo program } { } { Turbo Pascal V2.0 } { Last Update 1/4/85 } {-----------------------------} { Unlike most programs in this book, this program requires two } { external files to operate: FRIENDS.NAP and FRIENDS.KEY. The } { two files will be included on the source listings diskette. } { FRIENDS.NAP is a file of NAPREC containing some number of } { name/address/phone records. FRIENDS.KEY is a sorted key } { file containing keys extracted from FRIENDS.NAP. You can } { write a utility to extract keys from a .NAP file and sort } { them using either the SHELLSORT or QUIKSORT procedures given } { in Section 14. } PROGRAM SHOWNAME; TYPE STRING3 = STRING[3]; STRING6 = STRING[6]; STRING30 = STRING[30]; STRING40 = STRING[40]; STRING80 = STRING[80]; STRING255 = STRING[255]; PARM_ARRAY = ARRAY[1..10] OF STRING40; NAPREC = RECORD NAME : STRING30; ADDRESS : STRING30; CITY : STRING30; STATE : STRING3; ZIP : STRING6 END; NAPFILE = FILE OF NAPREC; KEY_REC = RECORD REF : INTEGER; KEY : STRING30 END; KEY_FILE = FILE OF KEY_REC; VAR I,J,K : INTEGER; RAM_TAIL : STRING[128] ABSOLUTE CSEG : $80; PARMS : PARM_ARRAY; { Holds command line parameters } RECNUM : INTEGER; WORKREC : NAPREC; WORKFILE : NAPFILE; WORKKEY : KEY_FILE; {$I STRIPWHT.SRC } { Described in Section 15.1 } {$I PARSTAIL.SRC } { Described in Section 15.2 } {>>>>KEY_SEARCH<<<<} FUNCTION KEY_SEARCH(VAR KEYS : KEY_FILE; VAR KEY_REF : INTEGER; MATCH_IT : STRING80) : BOOLEAN; VAR HI,LO,MID : INTEGER; REC_COUNT : INTEGER; SEARCH_REC : KEY_REC; FOUND : BOOLEAN; COLLIDED : BOOLEAN; BEGIN KEY_REF := 0; REC_COUNT := FILESIZE(KEYS); HI := REC_COUNT; LO := 0; KEY_SEARCH := FALSE; FOUND := FALSE; COLLIDED := FALSE; MID := (LO + HI) DIV 2; { Calc first midpoint } IF REC_COUNT > 0 THEN { Don't search if file is empty } REPEAT SEEK(KEYS,MID); READ(KEYS,SEARCH_REC); { Was there a collision between MID & LO or MID & HI? } IF (LO = MID) OR (HI = MID) THEN COLLIDED := TRUE; IF MATCH_IT = SEARCH_REC.KEY THEN { Found it! } BEGIN FOUND := TRUE; { Set found flag... } KEY_SEARCH := TRUE; { ...and function value... } KEY_REF := SEARCH_REC.REF { ...and key into data file } END ELSE { No luck...divide and try again... } BEGIN IF MATCH_IT > SEARCH_REC.KEY THEN LO := MID ELSE HI := MID; { Halve the field } MID := (LO + HI) DIV 2; { Recalc the midpoint } KEY_REF := MID { Save MID in KEY_REF } END UNTIL COLLIDED OR FOUND END; { SHOWNAME MAIN } BEGIN CLRSCR; GOTOXY(1,10); PARSE_TAIL(I,PARMS); { Parse the command tail } IF I < 1 THEN { Missing parms error } BEGIN WRITELN('<> You must enter a name on the command line:'); WRITELN(' A>SHOWNAME Duntemann*Jeff ') END ELSE BEGIN ASSIGN(WORKFILE,'FRIENDS.NAP'); { Open the names data file } RESET(WORKFILE); ASSIGN(WORKKEY,'FRIENDS.KEY'); { Open the names key file } RESET(WORKKEY); IF KEY_SEARCH(WORKKEY,RECNUM,PARMS[1]) THEN { If key is found...} BEGIN { We have record # into data file } SEEK(WORKFILE,RECNUM); { Seek to record # in data file } READ(WORKFILE,WORKREC); { Read data record from data file } WITH WORKREC DO { and display the name/address data } BEGIN WRITELN('>>NAME : ',NAME); WRITELN(' ADDRESS : ',ADDRESS); WRITELN(' CITY : ',CITY); WRITELN(' STATE : ',ZIP); END END ELSE WRITELN('>>Sorry, ',PARMS[1],' not found.'); END END.