Bubble сортировать массив строк в Commodore 4.0 Basic?
Работа над пузырьковой сортировкой для массива строк в Commodore 4.0 basic; Может кто-нибудь мне помочь?
До сих пор у меня есть "основная" часть алгоритма, но я не совсем понимаю, как сделать его подпрограммой, потому что, как бы я сделал массив строк параметром, чтобы потом вызывать его?
rem: s = holder value
for x = 0 to (length of array with strings)
if array(x)<(array(x+1)) then array(x+1)=s
then array(x+1)=array(x)
then array(x)=s
next
end
1 ответ
Чтобы выполнить пузырьковую сортировку, вы должны циклически перебирать данные за несколько проходов и на каждом проходе отслеживать, были ли произведены какие-либо перестановки. Как только вы закончите проход с нулевыми перестановками, вы знаете, что массив был отсортирован. Кроме того, ваша логика обмена неисправна; вам нужно будет сохранить массив (x+1) в s, затем скопировать массив (x) в массив (x+1), и, наконец, поместить массив (ы) в массив (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".