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".

Другие вопросы по тегам