BBS: Inland Empire Archive
Date: 05-09-92 (01:15)             Number: 191
From: TOM HAMMOND                  Refer#: NONE
  To: LYN BORCHERT                  Recvd: NO  
Subj: HASHING     6/9                Conf: (2) Quik_Bas
Continued from Hashing 5/9

*********************** start of program export ************************
  ' hash.bas start of part 1 of 7 - cut and paste as needed
  ' ====================================================================
  ' Hashed Access Demonstration Program For The QuickBasic Echo
  ' By Mike Avery, Started 12-28-91
  ' Version 1:00.00 - Make it work. 12-28-91
  ' Version 1:01.00 - Add Disk Functions 12-29-91
  ' ====================================================================

  DECLARE FUNCTION Hash! (TestString$)
  DECLARE SUB GetData (Key$, Index%, SeekCount%, SaveIndex%)
  DECLARE SUB Waiter ()
  DECLARE FUNCTION WhackIt$ (InputString$)

  CONST ArraySize% = 531 'Change the size here - the rest adjusts itself
  CONST RetryLimit% = 100 'I get bored easily....
  CONST ScreenLimit% = 21   'how many lines do we show at once?
  CONST True = -1: CONST False = NOT (True)

  DIM SHARED a$(ArraySize%, 1)          'our little data base
  DIM SHARED SortSpace$(ArraySize%, 1)  'Workspace for sorted lists

  PowerMax% = INT((LOG(ArraySize%) / LOG(2)) + 2)
  DIM SHARED PowersOfTwo%(PowerMax%)

  'build the table - lookup is faster than calculation
  FOR I% = 0 TO PowerMax%
      PowersOfTwo%(I%) = 2 ^ I%

  DO WHILE TestName$ <> "STOP"
     PRINT "Doofus Phone Book System"
     INPUT "Name/Help/Dump/Sort/Load/Save/Analyse/Stop"; TestName$
     TestName$ = UCASE$(RTRIM$(LTRIM$(TestName$)))

     IF TestName$ = "DUMP" THEN
        GOSUB DumpIt

     ELSEIF TestName$ = "SORT" THEN
        GOSUB SortIt

     ELSEIF TestName$ = "ANALYSE" THEN
        GOSUB Analyse

     ELSEIF TestName$ = "HELP" THEN
        GOSUB Help

     ELSEIF TestName$ = "LOAD" THEN
        GOSUB LoadIt

     ELSEIF TestName$ = "SAVE" THEN
        GOSUB SaveIt

     ELSEIF TestName$ <> "" AND TestName$ <> "STOP" THEN
        CALL GetData(TestName$, Index%, SeekCount%, SaveIndex%)

      ' At this point, one of 3 conditions exists.
      ' 1. We ran out of retries, and it doesn't matter what Index%_
points to,
      ' 2. Index% points to our data, or
      ' 3. Index% points to an empty record and SaveIndex may or may not
      '    point to a deleted record we can reuse.

        PRINT "It took "; SeekCount%; "tries to determine that..."
        'in a productional program, you'd probably drop that message...


        IF SeekCount% >= RetryLimit% THEN
       PRINT "The data base is full and/or needs to be resized"
       YesOrNo$ = ""
       DO WHILE YesOrNo$ <> "Y" AND YesOrNo$ <> "N"
          INPUT "Do you want to see a data base dump (Y/N)"; YesOrNo$
          IF YesOrNo$ <> "" THEN
             YesOrNo$ = WhackIt$(YesOrNo$)
          END IF
          IF YesOrNo$ = "Y" THEN
             GOSUB DumpIt
          ELSEIF YesOrNo$ <> "N" THEN
             PRINT "Please Enter A Y for Yes or a N for NO."
          END IF

       TestName$ = "STOP"'force a shutdown
       CALL Waiter
       ' save data base here, if converted to a disk based system

        ELSEIF a$(Index%, 0) = TestName$ THEN
       PRINT a$(Index%, 0); "'s Phone Number Is "; a$(Index%, 1); "."
       Action$ = "Dummy"
       DO WHILE Action$ <> "" AND Action$ <> "C" AND Action$ <> "D"
          INPUT "Change the number, Delete The Number, or enter";_

Continues in next file (HASHING - 7 of 9)

--- WM v2.00/91-0231
 * Origin: The Modem Zone BBS (314) 893-5106 (1:289/2)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET