Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
I'm working on a prog that needs to sort a string, by swapping elements of the string.
Code: (Select All) Screen 9
_FullScreen
a$ = "ABCDEFG"
Print Mid$(a$, 3, 1), Mid$(a$, 5, 1)
swap mid$(a$,3,1),mid$(a$,5,1)
?a$
From the description of SWAP in Help, I can do this by naming the elements, but I can't get this to work! In the small sample, the SWAP line is illegal. What am I doing wrong? Obviously, that line was not accepted, as it didn't get capitalized.
Posts: 3,974
Threads: 177
Joined: Apr 2022
Reputation:
219
For swap you switch two variable values.
Swapping letters in a word, interesting.
t$ = mid$(a$, 5, 1)
mid$(a$, 5, 1) = mid$(a$, 3, 1)
mid$(a$, 3, 1) = t$
b = b + ...
Posts: 2,696
Threads: 327
Joined: Apr 2022
Reputation:
217
You're not swapping any sort of variables...
a$ = "ABCDEFG"
swap mid$(a$,3,1),mid$(a$,5,1)
Evaluate those mid$ functions down:
SWAP "C", "E"
You're not swapping any variable values like that!
I think what you're looking for is something more like:
Code: (Select All) a$ = "ABCDEFG"
Print SwapString(a$, 3, 5)
Function SwapString$ (s_passed$, pos1, pos2)
s$ = s_passed$ 'so we don't change by parameter
temp = Asc(s$, pos1)
Asc(s$, pos1) = Asc(s$, pos2)
Asc(s$, pos2) = temp
SwapString$ = s$
End Function
Posts: 3,974
Threads: 177
Joined: Apr 2022
Reputation:
219
Code: (Select All) a$ = "12345"
swapLetters a$, 3, 5
Print a$
swapLetters a$, 1, 4
Print a$
Sub swapLetters (a$, n, m)
t$ = Mid$(a$, n, 1)
Mid$(a$, n, 1) = Mid$(a$, m, 1)
Mid$(a$, m, 1) = t$
End Sub
b = b + ...
Posts: 2,696
Threads: 327
Joined: Apr 2022
Reputation:
217
(11-18-2022, 12:27 AM)bplus Wrote: Code: (Select All) a$ = "12345"
swapLetters a$, 3, 5
Print a$
swapLetters a$, 1, 4
Print a$
Sub swapLetters (a$, n, m)
t$ = Mid$(a$, n, 1)
Mid$(a$, n, 1) = Mid$(a$, m, 1)
Mid$(a$, m, 1) = t$
End Sub
You might want to swap to ASC over MID$, due to the speed and performance difference between the two commands. Letter swapping is usually something which ends up getting called inside loops, and it could really make a difference in how quickly the overall program performs here.
Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
11-18-2022, 12:46 AM
(This post was last modified: 11-18-2022, 12:48 AM by PhilOfPerth.)
Thanks for that!
You pointed me in the right direction, but I still don't really understand why I can't just swap the two elements.
But if I don't use the SWAP function, I can just do this:
Code: (Select All) a$ = "ABCDEFG"
Print a$
t1$ = Mid$(a$, 3, 1): t2$ = Mid$(a$, 5, 1)
Mid$(a$, 3, 1) = t2$: Mid$(a$, 5, 1) = t1$
Print a$
It introduces two new variables, but that's ok in my case. I'll look at using ASC instead of mid$ too, though speed is not important in my case either.
Posts: 1,272
Threads: 119
Joined: Apr 2022
Reputation:
100
11-18-2022, 01:09 AM
(This post was last modified: 11-18-2022, 01:10 AM by TerryRitchie.)
(11-18-2022, 12:46 AM)PhilOfPerth Wrote: Thanks for that!
You pointed me in the right direction, but I still don't really understand why I can't just swap the two elements.
But if I don't use the SWAP function, I can just do this:
Code: (Select All) a$ = "ABCDEFG"
Print a$
t1$ = Mid$(a$, 3, 1): t2$ = Mid$(a$, 5, 1)
Mid$(a$, 3, 1) = t2$: Mid$(a$, 5, 1) = t1$
Print a$
It introduces two new variables, but that's ok in my case. I'll look at using ASC instead of mid$ too, though speed is not important in my case either.
The numbers contained in MID$() are not elements, they are string positions. Elements are contained within arrays:
DIM A(5, 10, 20)
5, 10, and 20 are your elements, often referred to as indexes.
MID$(a$, 10, 20)
a$ is the string to work with
10 is the start position within that string
20 is the number of characters, counting the start position, to extract from the string.
SWAP only works with variables, not positions within variables.
DIM a(10, 10) AS INTEGER
DIM b(10, 10) AS INTEGER
You can swap an entire array of variables (as long as the arrays are of equal size and type):
SWAP a, b
or individual elements within the array (which are simply variable values):
SWAP a(1, 3), b(3, 7)
Posts: 200
Threads: 5
Joined: Apr 2022
Reputation:
22
11-18-2022, 01:40 AM
(This post was last modified: 11-18-2022, 01:42 AM by JRace.)
@PhilOfPerth :
Quote:But if I don't use the SWAP function, I can just do this:
Code: (Select All) a$ = "ABCDEFG"
Print a$
t1$ = Mid$(a$, 3, 1): t2$ = Mid$(a$, 5, 1)
Mid$(a$, 3, 1) = t2$: Mid$(a$, 5, 1) = t1$
Print a$
It introduces two new variables, but that's ok in my case.
Actually, you only need to introduce one new temp var:
Code: (Select All) t1$ = Mid$(a$, 3, 1)
Mid$(a$, 3, 1) = Mid$(a$, 5, 1)
Mid$(a$, 5, 1) = t1$
Off the top of my head I don't see a way to swap characters within a single string without some old-fashioned Varptr/Peek/Poke shenanigans, and I don't know how easy that would be to pull off in QB64.
Anyway, here's a slight mod to your original code snippet:
Code: (Select All) Screen 9
_FullScreen
a$ = "ABCDEFG"
Print Mid$(a$, 3, 1), Mid$(a$, 5, 1)
'The fourth parameter allows you to swap more than one character at a time:
myswap a$, 3, 5, 1 ' swap mid$(a$,3,1),mid$(a$,5,1)
'Below is the swapping code for inline use, if desired.
't$ = Mid$(a$, 3, 1): Mid$(a$, 3, 1) = Mid$(a$, 5, 1): Mid$(a$, 5, 1) = t$
Print a$
Sub myswap (s$, e1, e2, l)
t$ = Mid$(s$, e1, l)
Mid$(s$, e1, l) = Mid$(s$, e2, l)
Mid$(s$, e2, l) = t$
End Sub
(Wow, this post was brand new with no responses when I pulled it up. That's what I get for taking a break.)
Posts: 2,171
Threads: 222
Joined: Apr 2022
Reputation:
103
TEMP VARIABLES? WE DON'T NEED NO STINKIN' TEMP VARIABLES!
Code: (Select All) a$ = "ABCDEFG"
PRINT a$
a$ = MID$(a$, 1, 3 - 1) + MID$(a$, 5, 1) + MID$(a$, 3 + 1, 5 - (3 + 1)) + MID$(a$, 3, 1) + MID$(a$, 5 + 1)
PRINT a$
SLEEP
PRINT
a$ = "ABCDEFG"
INPUT "Swap letter #1-7: "; x
INPUT "With letter #1-7: "; y
a$ = MID$(a$, 1, x - 1) + MID$(a$, y, 1) + MID$(a$, x + 1, y - (x + 1)) + MID$(a$, x, 1) + MID$(a$, y + 1)
PRINT a$
Kidding aside, I generally do things as J described. Very easy to understand and only requires one temp variable, which I usually name as tmp$.
Anyway, the obfuscated function I posted was at least worth a laugh to post.
Pete
Posts: 2,696
Threads: 327
Joined: Apr 2022
Reputation:
217
Swapping letter positions inside a string, *without* the use of a single temp variable.
Code: (Select All) a$ = "ABCDEFG"
SwapLetter a$, 3, 5
Print a$
Sub SwapLetter (a$, p1, p2)
a$ = a$ + Mid$(a$, p1, 1)
Mid$(a$, p1) = Mid$(a$, p2, 1)
Mid$(a$, p2) = Right$(a$, 1)
a$ = Left$(a$, Len(a$) - 1)
End Sub
|