要进行冒泡排序,您必须多次遍历数据,并在每次遍历中跟踪是否进行了任何交换。一旦你完成了零交换的传递,你就知道数组已经排序了。另外,你的交换逻辑有问题;您必须将数组(x+1)存储在 s 中,然后将数组(x)复制到数组(x+1),然后最后将数组(s)放入数组(x)中。
我不太确定您所说的“如何将字符串数组作为参数,以便之后可以调用它?”是什么意思?Commodore BASIC 不像大多数语言那样具有用户定义的函数*,因此“参数”不是一个非常有用的概念。大多数人会将要传递给子程序的值存储在变量中(所有变量都是全局变量),然后子程序也会返回一个或多个值(如果它返回任何值)。由程序员负责跟踪哪些变量用于什么目的,以及子例程从哪些行号开始(以及条件分支和循环起点所在的位置)。
这是我制作的一个版本,它采用了我在 BASIC 2.0 中可以管理的“结构化”格式;它应该像 4.0 一样工作:
100 gosub 150:rem set up array
110 gosub 230:rem sort array
120 gosub 420:rem print array
130 end
140 :
150 rem set up array
160 rem l=length of array
170 l=10
180 dim ar(l)
190 for i=0 to l-1:read ar(i):next
200 data 5,1,4,2,8,7,3,6,9,10
210 return
220 :
230 rem sort array
240 if l<2 then return
250 rem else
260 : rem sw=whether this pass has had any swaps
270 : rem start of pass
280 : sw=0
290 : for x=0 to l-2
300 : if ar(x)<=ar(x+1) then goto 380
310 : rem else
320 : rem s=placeholder value
330 : s=ar(x+1)
340 : ar(x+1)=ar(x)
350 : ar(x)=s
360 : sw=-1
370 : rem endif
380 : next
390 : if sw then goto 270
400 return
410 :
420 rem print array
430 if l=0 then print "(empty array)":return
440 rem else
450 : for i=0 to l-1:print ar(i);:next
460 : print
470 return
请注意,:
在一行的开头只允许我们插入空白行,或者缩进该行后面的内容;如果您尝试在行首添加额外的空格,BASIC 编辑器稍后会删除它们。这只是让事情看起来更像是一种现代编程语言。
* 有一种方法可以定义接受一个浮点参数并返回一个浮点结果的函数,但定义必须全部在一行上,不能使用任何条件、循环等。这对简单的数学很有好处公式。例如:
10 def fn f(x)=x*1.5
20 print f(3)
打印“4.5”。