BBS: Inland Empire Archive Date: 05-09-92 (01:17) Number: 194 From: TOM HAMMOND Refer#: NONE To: LYN BORCHERT Recvd: NO Subj: HASHING 9/9 Conf: (2) Quik_Bas
Continued from HASHING 8/9
IF NextEntry% <= 0 THEN
PRINT "No Data Was Found To Display."
ELSE
'now that all the data has been moved from A$() to SortSpace$(), we
'need to sort it. How about an exchange sort?
LastItem% = NextEntry% - 1
IF LastItem% > 1 THEN
PRINT "Sorting"; LastItem% + 1; "items. Please Wait....."
FOR I% = 0 TO LastItem% - 1
Lowest% = I%
FOR J% = I% + 1 TO LastItem%
CompareCount! = CompareCount! + 1
IF SortSpace$(J%, 0) < SortSpace$(Lowest%, 0) THEN
Lowest% = J%
END IF
NEXT J%
IF Lowest% <> I% THEN
SWAP SortSpace$(I%, 0), SortSpace$(Lowest%, 0)
SWAP SortSpace$(I%, 1), SortSpace$(Lowest%, 1)
END IF
NEXT I%
ELSE
PRINT "1 item found, the sort will be skipped this time...."
END IF
'Now the keys are sorted, so let's display the data....
PRINT "Order", "Name", "Phone #", "Place in A$"
DisplayCount% = 0
FOR I% = 0 TO LastItem%
Pointer% = VAL(SortSpace$(I%, 1))
PRINT I%, a$(Pointer%, 0), a$(Pointer%, 1), Pointer%
DisplayCount% = DisplayCount% + 1
IF DisplayCount% > ScreenLimit% THEN
CALL Waiter
DisplayCount% = 0
END IF
NEXT I%
END IF
CALL Waiter
RETURN
SorryFull:
PRINT "Sorry, but there is no space available in the array."
PRINT "Try saving your data, stopping this program, resizing";_
CHR$(34); "ArraySize%"; CHR$(34); ","
PRINT "reloading the saved data, and then retry this load."
RETURN
SUB GetData (Key$, Index%, SeekCount%, SaveIndex%)
' Try to get the index to the record that that contains Key$ as it's_
key
' Key$ - the value are looking for
' Found% - did we find Key$ - True/False returned
' Index% - a pointer to where Key$ was found
' SeekCount% - how many tries it took us to fing Key$
' SaveIndex% - the pointer to the first deleted value we found, if any
Index% = Hash(Key$) 'start the search
SaveIndex% = -1
SeekCount% = 1
IF a$(Index%, 0) <> "" AND a$(Index%, 0) <> Key$ THEN
'if data in entry, and not a match, do a retry
ReHashCount% = 0
DO WHILE SeekCount% < RetryLimit% AND A$(Index%, 0) <> "" AND_
A$(Index%,0) <> Key$
IF a$(Index%, 0) = DeletedValue$ AND SaveIndex% = -1 THEN
'if this is the first deleted value, save it for data insertion
SaveIndex% = Index%
END IF
Index% = Index% + PowersOfTwo%(ReHashCount%)
DO WHILE Index% > ArraySize%
Index% = Index% - ArraySize%
LOOP
ReHashCount% = ReHashCount% + 1
IF ReHashCount% > PowerMax% THEN
ReHashCount% = 0
END IF
SeekCount% = SeekCount% + 1
LOOP
END IF
END SUB
FUNCTION Hash (TestString$)
' turn TestString into a number in the range of 0 - ArraySize%
' the function can be tailored to suit the users needs
Trial = 0
FOR I% = 1 TO LEN(TestString$)
Trial = Trial + ASC(MID$(TestString$, I%, 1))
NEXT I%
Hash = (Trial * Trial) MOD ArraySize%
END FUNCTION
SUB Waiter
' wait for a keypress, then return to caller
PRINT "Press (almost) any key to continue..."
K$ = ""
DO WHILE K$ = ""
K$ = INKEY$
LOOP
END SUB
FUNCTION WhackIt$ (InputString$)
'whack the input string -
' strip leading and trailing spaces,
' make the remainder upper case, and
' make it a single letter response.
TestString$ = UCASE$(RTRIM$(LTRIM$(InputString$)))
IF LEN(TestString$) > 1 THEN
TestString$ = LEFT$(TestString$, 1)
END IF
WhackIt$ = TestString$
END FUNCTION
End of 9 parts
--- WM v2.00/91-0231
* Origin: The Modem Zone BBS (314) 893-5106 (1:289/2)

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