(С) Пыльцов Вадим, г.Надым, 1993г. Сортировка русифицированных символьных строк
В статье "Полная русификация Мастерфайл-09" автор предлагает читателям обсудить проблему сортировки русских слов по алфавиту. (См. ZX-РЕВЮ^, с. 29, 71).
В своих программах я эту "проблему" решаю очень просто. Например, с адреса 60000 я размещаю таблицу длиной 33 байта (ровно столько букв в русском алфавите) и в ней последовательно располагаю коды букв русского алфавита от А до Я. Предположим, что буква А у нас в нашем дополнительном наборе не изменялась, т.е. ей соответствует код 65, как и в стандартном наборе "Спектрума", а буква "Б" у нас закодирована по адресам буквы b (латинская строчная) т.е. ей соответствует код 98. Тогда по адресу 60000 мы запишем число 65, по адресу 60001 число 98 и так далее до ячейки 600032. В ней будет храниться код символа, вместо которого "зашита" буква Я.
Больше там ничего не нужно. В программах сортировка у меня происходят на ассемблере, что многократно повышает скорость работы, но это можно сделать и из Бейсика, правда при этом скорость работы немного снизится.
А делается это так. Допустим, у нас есть символьная переменная A$ = "БАБА ЯГА" (это какая-то фамилия или имя). Программа определяет код первой буквы - у нас это 98. Далее делается цикл:
100 FOR M = 60000 TO 60032: IF PEEK M = CODE A$(I) THEN LET M = M - 59999: GO TO ANOTHER
110 NEXT M
Т.е. если код первой буквы равен содержимому одной из ячеек нашей таблицы, то переменная M становится указателем, какая эта буква по порядку в русском алфавите.
У нас M становится равным двум. Дальше уже идет сам процесс перестановки (или сортировки) имен. Если же сортировка производится по нескольким начальным буквам, то мы просто организуем еще один цикл, например, с именем N и будем сравнивать PEEK M с CODE A$(N).
Я не пишу все это более подробно, потому что идея эта сама по себе тривиальна и годится для самостоятельного разбора.
Так что, как видите, тут никакой проблемы и нет, все очень просто. Но еще лучше, как я уже сказал выше сделать всю эту сортировку на языке Ассемблера, особенно если сортируется большой массив данных.
ОПЕЧАТКА В ПРОГРАММЕ "КРИББЕДЖ" ДО-РЕВЮ-92, с. 187)
Дианов P^. из г.Братска Иркутской обл. просит уточнить строку 4515 из программы "Криббедж", опубликованной в N 7,8 '^-РЕВЮ-92". Там пропущена переменная:
4515 LET ? = 5: LET rlen = 2
Нам очень стыдно и неудобно, но почему-то с листингами такое бывает. После подготовки оригинал-макета в печать сколько не выверяй программу и не лови "блох", все равно какая-нибудь гадость просочится.
Правильно должно быть так:
4515 LET c = 5: LET rlen = 2