home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
ST_USER
/
1989
/
USER1189.MSA
/
LISTINGS.ARC
/
DEMOBUBB.BSC
< prev
next >
Wrap
Text File
|
1989-09-03
|
4KB
|
182 lines
\ BUBBLESORT DEMONSTRATION PROGRAM
\ Written in FAST BASIC
\ By Nigel Belcher
\ Written for ST User June 1988
\ SAMPLE PROGRAM TO DEMONSTRATE THE SORTING MECHANISM USED
IF SCREENMODE=0 THEN stop=ALERT("[3][Cannot be|run in Low|Resolution][OK]",1):END
yes=1
no=0
DIM array(20),sorted(20)
HIDEMOUSE
PROCfullscreen
REPEAT
n=0
pass=0
comparisons=0
swaps=0
PROCinputnumbers(n)
PROCbubblesort(1,n)
PRINTTAB(40,8);"The list is now sorted"
PROCdisplaylist(1,n,n)
PRINTTAB(40,9);"Do you want to watch another sort?";
ok=-1
REPEAT
key$=GET$
IF key$="Y" OR key$="y" THEN another=yes
IF key$="N" OR key$="n" THEN another=no
UNTIL another=yes OR another=no
PRINTTAB(40,9);SPC(40);
PRINTTAB(40,8);SPC(20)
UNTIL another=no
PROCrestorewindows
SHOWMOUSE
END
DEFPROCinputnumbers(VAR n)
LOCAL i,random,key$
CLS
REPEAT
INPUTTAB(0,1);"How many numbers do you want to sort (2 - 20)";n
PRINTTAB(0,1);SPC(159);
UNTIL n>=2 AND n<=20
SHOWMOUSE
random=ALERT("[1][Choice of numbers][Random|Your own]",1)
HIDEMOUSE
IF random=1 THEN
\ Allocate random numbers
FOR i=1 TO n
array(i)=RND(1000)
sorted(i)=no
NEXT
ELSE
\ Get user-input numbers
FOR i=1 TO n
REPEAT
PRINTTAB(0,i);SPC(70);
PRINTTAB(0,i);"Element no.";FORMAT$(i,"ZD");
INPUT array(i)
UNTIL array(i)=INT(array(i)) AND array(i)>=-99999 AND array(i)<=999999
sorted(i)=no
NEXT
ENDIF
ENDPROC
DEFPROCfullscreen
\ Various GEM routines to sort out window sizes
RESERVE windowtitle%,80
{windowtitle%}$="BUBBLESORT DEMONSTRATION"
SETWINDTITLE OUTHANDLE,windowtitle%
GETWINDCOORDS OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
GETWINDFULL OUTHANDLE,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
SETWINDCOORDS OUTHANDLE,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
CALCWORK %11111101111,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
TXTRECT fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
CLS
IF SCREENMODE=2 THEN normal=13 ELSE large=13:normal=6
TXTSIZE normal
ENDPROC
DEFPROCbubblesort(first,last)
\ The bubble sort routine
LOCAL i,swapped
REPEAT
pass=pass+1
swapped=no
PROCdisplaylist(first,last-pass+1,last)
FOR i=first TO last-pass
comparisons=comparisons+1
PROCshowi
IF array(i)>array(i+1) THEN PROCswapnumbers(i,i+1,swapped)
NEXT
sorted(last-pass+1)=yes
UNTIL swapped=no
ENDPROC
DEFPROCdisplaylist(first,last,n)
LOCAL i
FOR i=1 TO n
\ Faint those not being looked at
IF i<first OR i>last THEN TXTEFFECTS %00000010 ELSE TXTEFFECTS 0
PRINTTAB(0,i);SPC(6);FORMAT$(array(i),"sZZZZZD");
IF sorted(i)=yes THEN PRINT" sorted";SPC(18); ELSE PRINT SPC(24);
NEXT
TXTEFFECTS 0
ENDPROC
DEFPROCshowi
PRINTTAB(29,i-1);" ";
PRINTTAB(29,i);"<- i";
PRINTTAB(40,13);FORMAT$(comparisons,"<Comparisons >ZZZZZD")
ENDPROC
DEFPROCswapnumbers(a,b,VAR swapped)
LOCAL x,ya,yb,key,t
IF a=b THEN ENDPROC
swaps=swaps+1
PRINTTAB(40,15);FORMAT$(swaps,"<Swaps >ZZZZZD")
IF a>b THEN SWAP a,b
\ Move numbers out
FOR x=0 TO 15
IF x<=7 THEN PRINTTAB(6+x,a);FORMAT$(array(a),"XsZZZZZD");
PRINTTAB(6+x,b);FORMAT$(array(b),"XsZZZZZD");
PROCdelay
NEXT
ya=a:yb=b
\ Move numbers up/down
REPEAT
PRINTTAB(14,ya);SPC(7);
ya=ya+1
PRINTTAB(14,ya);FORMAT$(array(a),"sZZZZZD");
PROCdelay
PRINTTAB(22,yb);SPC(7);
yb=yb-1
PRINTTAB(22,yb);FORMAT$(array(b),"sZZZZZD");
PROCdelay
UNTIL yb<=a OR ya>=b
SWAP array(a),array(b)
\ Move numbers in
FOR x=15 TO 0 STEP -1
PRINTTAB(6+x,a);FORMAT$(array(a),"sZZZZZDX");
IF x<=7 THEN PRINTTAB(6+x,b);FORMAT$(array(b),"sZZZZZDX");
PROCdelay
NEXT
swapped=yes
ENDPROC
DEFPROCdelay
LOCAL t
t=TIME
REPEAT
UNTIL TIME-t>30
ENDPROC
DEFPROCrestorewindows
\ Restore output window to what it was at the start
GETWINDPREV OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
CLS
GRAB 0,0,oldscreenwidth,oldscreenheight
CLOSEWIND OUTHANDLE
PUT 0,0,3
{windowtitle%}$="Output"
SETWINDTITLE OUTHANDLE,windowtitle%
OPENWIND OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
ENDPROC