home *** CD-ROM | disk | FTP | other *** search
- {-----------------------------}
- { 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('<<Error!>> 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.