Post by bplus on May 31, 2024 0:07:15 GMT
the function of a function is to return something. you (carlos) complained when i used a sub to print numbers so i saved all the lines to print into a big long string delimited by chr$(10) and returned by CountDigits$ function.
yes countdigits has been generalized for any lotto in the lotto thread, here it is stuck with lottos drawing 15 numbers from 1 to 25.
functions cant return arrays so this wont work from your code:
we could split out the string countdigits$ returns but as you say we are going two steps back for one forward.
not everything works better as a function, doing the whole thing in main code is fine specially if you want to process the counts further.
same result as before but NOW YOU CAN USE Counts$() array for further processing of counts.
yes countdigits has been generalized for any lotto in the lotto thread, here it is stuck with lottos drawing 15 numbers from 1 to 25.
functions cant return arrays so this wont work from your code:
For i = 1 To 25 ' 25 lines of counts put into one l o n g string
lines$(i) = Right$(" " + _Trim$(Str$(i)), 2) + " = " + Right$(" " + _Trim$(Str$(count(i))), 2)
Next
CountDigits$ = lines$(i) ' i added the (i) to make sense of it
we could split out the string countdigits$ returns but as you say we are going two steps back for one forward.
not everything works better as a function, doing the whole thing in main code is fine specially if you want to process the counts further.
_Title "lotto for carlos" ' b+ 2024-05-30 modify with split of original demo
Randomize Timer
Width 80, 40 ' <<< 30 so can fit 25 rows on screen 0
Dim a$(1 To 3)
a$(1) = "02 03 05 06 09 10 11 13 14 16 18 20 23 24 25"
a$(2) = "01 04 05 06 07 09 11 12 13 15 16 19 20 23 24"
a$(3) = "01 04 06 07 08 09 10 11 12 14 16 17 20 23 24"
Locate 4
result$ = CountDigits$(a$(), 25)
' take the results from count digits and split into an array of strings for each line
ReDim counts$(1 To 1)
Split result$, Chr$(10), counts$()
For i = 1 To UBound(counts$)
Print counts$(i)
Next
'Print " press any for TicketMaker Demo of 7 tickets of 3 numbers from 1 to 100..."
'Sleep
'Cls
'Dim As Long n, numbers, i, top
'n = 7: numbers = 3: top = 100
'Dim tickets$(1 To n)
'Print n; " tickets,"; numbers; " numbers from 1 to"; top; ":"
'For i = 1 To n
' tickets$(i) = TicketMaker$(numbers, top)
' Print i, tickets$(i)
'Next
'Print: Print "Number Counts:"
'Print CountDigits$(tickets$(), top)
'Print: Print " press any to input your own specs for a multiple ticket purchase..."
'Sleep
'Cls
'Print
'Print " Multiple tickets purchase:"
'Input "Limit 25 for space Please enter Top number limit "; top
'Input "Limit 10 for space Please enter number of numbers on a ticket "; numbers
'Input "Limit 5 for space Please enter number of tickets to purchase "; n
'Cls
'If top > 25 Then top = 25
'If numbers > 10 Then numbers = 10
'If n > 5 Then n = 5
'Dim lotto$(1 To n)
'Print: Print n; " tickets,"; numbers; " numbers from 1 to"; top; ":"
'For i = 1 To n
' lotto$(i) = TicketMaker$(numbers, top)
' Print i, lotto$(i)
'Next
'Print: Print "Number Counts:"
'Print CountDigits$(lotto$(), top)
Function CountDigits$ (digits$(), highest As Long)
Dim As Long i, j, num, count(1 To highest) ' variables to process digits strings
Dim rtn$ ' <<< prepare to set function to return this string when done
For i = LBound(digits$) To UBound(digits$) ' count the whole array of digit strings
For j = 1 To Len(digits$(i)) Step 3 ' one digit string break down to 3 digit parts
num = Val(Mid$(digits$(i), j, 3)) ' convert string to number
count(num) = count(num) + 1 ' add to count of that number
Next
Next
For i = 1 To highest ' if not 0, lines of counts put into one l o n g string
If count(i) Then
rtn$ = rtn$ + S2$(i) + " = " + TS2$(count(i)) + Chr$(10)
End If
Next
CountDigits$ = rtn$ ' <<< returns 25 rows of print in one string
End Function
Function TicketMaker$ (number As Long, highest As Long)
' number = number of 2 digit numbers you want
' lowest number allowed is always 1
' highest number allowed
' because no repeats digits, number can not exceed highest
' please return the numbers sorted from low to high
'example:
' dim a$(1 to 3)
' for i = 1 to 3
' a$(i) = TicketMaker$(15, 25)
' next
' returns:
'a$(1) = "02 03 05 06 09 10 11 13 14 16 18 20 23 24 25"
'a$(2) = "01 04 05 06 07 09 11 12 13 15 16 19 20 23 24"
'a$(3) = "01 04 06 07 08 09 10 11 12 14 16 17 20 23 24"
Dim As Long shuffle(1 To highest), sort(1 To number), i
Dim rtn$
For i = 1 To highest
shuffle(i) = i
Next
For i = highest To 2 Step -1
Swap shuffle(i), shuffle(Int(Rnd * i) + 1)
Next
For i = 1 To number
sort(i) = shuffle(i)
Next
QuickSort 1, number, sort()
For i = 1 To number
If Len(rtn$) Then rtn$ = rtn$ + " " + S2$(sort(i)) Else rtn$ = S2$(sort(i))
Next
TicketMaker$ = rtn$
End Function
Sub QuickSort (start As Long, finish As Long, array() As Long)
Dim Hi As Long, Lo As Long, Middle As Long
Hi = finish: Lo = start
Middle = array((Lo + Hi) / 2) 'find middle of array
Do
Do While array(Lo) < Middle: Lo = Lo + 1: Loop
Do While array(Hi) > Middle: Hi = Hi - 1: Loop
If Lo <= Hi Then
Swap array(Lo), array(Hi)
Lo = Lo + 1: Hi = Hi - 1
End If
Loop Until Lo > Hi
If Hi > start Then Call QuickSort(start, Hi, array())
If Lo < finish Then Call QuickSort(Lo, finish, array())
End Sub
Function TS$ (n As Long) ' Trim String for Long Type but integers should work as well
TS$ = _Trim$(Str$(n))
End Function
Function TS2$ (n As Long) ' Trim String for Long Type but integers should work as well
TS2$ = Right$(" " + TS$(n), 2)
End Function
Function S2$ (n As Long)
S2$ = Right$("00" + TS$(n), 2)
End Function
Sub Split (SplitMeString As String, delim As String, loadMeArray() As String)
Dim curpos As Long, arrpos As Long, LD As Long, dpos As Long 'fix use the Lbound the array already has
curpos = 1: arrpos = LBound(loadMeArray): LD = Len(delim)
dpos = InStr(curpos, SplitMeString, delim)
Do Until dpos = 0
loadMeArray(arrpos) = Mid$(SplitMeString, curpos, dpos - curpos)
arrpos = arrpos + 1
If arrpos > UBound(loadMeArray) Then ReDim _Preserve loadMeArray(LBound(loadMeArray) To UBound(loadMeArray) + 1000) As String
curpos = dpos + LD
dpos = InStr(curpos, SplitMeString, delim)
Loop
loadMeArray(arrpos) = Mid$(SplitMeString, curpos)
ReDim _Preserve loadMeArray(LBound(loadMeArray) To arrpos) As String 'get the ubound correct
End Sub
same result as before but NOW YOU CAN USE Counts$() array for further processing of counts.