Главная » Basic » МАССИВЫ СТРОК СИМВОЛОВ

0

В разд. 4.1 мы видели, что группу чисел можно хранить в массиве,   скажем, по имени А; при этом числа запоминаются  в элементах массива А, а именно А (1), А (2), А (3) и т. д. Аналогично группу строк можно хранить в массиве  А$ и обращаться к отдельным строкам по именам А$(1), А$(2) и т. д. Обычно для массивов строк допустимы те же имена, что и  для обычных массивов, только к имени добавляется в конце знак $.     ,

Наибольшие ограничения на имена массивов, в том числе  и массивов  строк, которые должны быть однобуквенными, накладываются Бейсиком в   системе ICL  2903/4.  Другие  системы позволяют использовать подходящие содержательные имена, например: RESPONSES (ответ), TOTALS (итог)   и ADDRESSESS (адреса) . Как и  в  случае числовых   массивов,  в программе надо указывать оператор DIM, задающий максимальное  значение индекса. В системе не должно существовать  никакой  связи между строковым массивом и одноименным  числовым массивом.

Уточним понятия массива строк: каждый его элемент равноценен строковой переменной и  может содержать от нуля до большого числа символов. (Предельные значения  числа символов приведены в табл.  4.1.)  Элементами массивов  строк  можно  пользоваться в  сочетании   со  всеми строковыми функциями, обсуждавшимися в предыдущих разделах.

Одномерный массив  строк можно представлять себе в  виде   списка элементов, например списка фамилий  в телефонном справочнике или списка  покупок. Приведенная  ниже тривиальная программа читает  и затем печатает элементы такого списка:

10 RЕМ ДЕМОНСТРАЦИЯ РАБОТЫ С МАССИВОМ СТРОК СИМВОЛОВ

20 DIM A$< 10)

30 FOR I=0 ТО 3

40   INPUT A$(I)

50 NEXT I

60 REM

70 PRINT

80 PRINT "ВЫВОД ИЗ МАССИВА В ОБРАТНОМ ПОРЯДКЕ" .

90 FOR I=3 ТО 0 STEP -1 100   PRINT A$(I) 110 NEXT I 120 END RUN

?1 ФУНТ КАРТОФЕЛЯ

?2 УНЦИИ ГРИБОВ

?1 КАБАЧОК

?6 ЯБЛОК

ВЫВОД ИЗ МАССИВА В ОБРАТНОМ ПОРЯДКЕ

6 ЯБЛОК

1  КАБАЧОК

2  УНЦИИ ГРИБОВ

1 ФУНТ КАРТОФЕЛЯ END AT LINE 120

В силу обстоятельств могут понадобиться двумерные  массивы строк и  массивы  строк большего числа измерений. Не  забывайте, что  многомерные  массивы занимают в   памяти много  места, особенно массивы строк символов,  в кото-

рых каждый элемент может содержать большое число символов, каждому из которых требуется один байт памяти. Массиву А$(9,9,9) при среднем числе символов по 20 на каждый элемент потребуется не менее 20* 10* 10* 10 = = 20 000 байт памяти!

4.3.1. ПРИМЕР ПРОГРАММЫ ДЛЯ РАБОТЫ СО СТРОКАМИ СИМВОЛОВ

Обсуждаемая здесь программа преобразует десятичное число в  римское. Форма записи  римских чисел обусловливает  необходимость использования  строк  символов.  Решение задачи отнюдь  не состоит в   простой  замене  десятичных цифр римскими  цифрами  вследствие  разных  принципов построения этих двух систем счисления. Например,

1025   преобразуется в MXXV 1982   преобразуется в MCMLXXXII 2000   преобразуется в ММ Десятичная система основана на  значении,  определяемом  позицией  цифры в   числе, а  система римских чисел на сложении (и вычитании)  значений цифр. Существует  правило повторения одной цифры до трех раз, так что III равно 3, а XX 20. Существует  правило вычитания, согласно которому меньшее  значение вычитается  из  стоящего  справа большего  значения, например XL  равно 40. Существует  правило сложения, согласно которому значения цифр складываются  с учетом указанных выше правил, например  CXLIII равно 100 + 40 + 3 = 143. Десятичные  эквиваленты римских цифр таковы:

1= 1 V=5

Х=10 L= 50 С=100 D=500 М=1000

Необходимость комбинировать указанные три правила усложняет программу ввиду того, что ей надо следить за изменениями  в расположении цифр. Запишем последовательность римских чисел от 1 до 10:

I   II   III   IV   V   VI   VII   VIII   IX   X

На этой последовательности  просматривается симметрия по отношению к каждому новому символу. 1, 2, 3 и 6, 7, 8 подчиняются  правилу повторения (и сложения), 4 и 9 — правилу вычитания, а 5 и 10 являются новыми символами.

Массив  строк символов  применяется как таблица для поиска  римских цифр, ему присваиваются следующие значения:

I    X  С   М

V  L  D  пустая строка X   С  М  пустая строка 117

Первый столбец используется для десятичных значений от 0 до 9, второй — от 10 до 90, третий от 100 до 900, а четвертый для 1000 и  больших чисел. Так как символы для обозначения больших чисел трудно напечатать, то эта программа не сможет преобразовать  числа, большие 3999. Однако при желании  в четвертый столбец можно включить следующие символы для больших значений:

В основном цикле из введенного   десятичного числа извлекаются  цифры: вначале число тысяч, затем сотен, затем десятков и в заключение единиц. Внутри цикла присутствует новый элемент, служащий примером оператора выбора. В Бейсике он называется ON-GOTO. Этот оператор похож на расширенный  оператор  IF,   отсюда   и    сходное  начертание  символа структограммы.  Вначале вычисляется выражение, указанное после ON; оно округля-

ется  до  целого  числа, значение которого  используется для  выбора одного  из   номеров строк, указанных после GOTO. Если вычисление выражения привело к значению 1, то выбирается первый номер строки, к значению 2 — второй номер строки, 3 — третий и т. д. Затем управление передается к строке с выбранным номером.

Оператор ON-GOTO

Общая форма записи:

ON e GOTO s1,s2,s3,. . . ,sn

где е — арифметическое выражение, a s1 — sn номера операторов (по крайней мере, один должен

быть указан).

Действие оператора состоит в передаче управления (GOTO) одному из нескольких операторов  в зависимости от значения выражения е, которое вычисляется и затем округляется до ближайшего

целого числа.

Если это целое число равно 1, то управление передается оператору с первым номером  (считая слева), т. е. с номером s1; если целое число равно 2, то управление передается оператору с номером s2 и т. д.

Если целое число лежит вне допустимого диапазона (1… n), то управление передается оператору,

следующему за оператором ON-GOTO.

Простой иллюстрацией служит программа

10  REM ДЕМОНСТРАЦИЯ ПРИМЕНЕНИЯ ОПЕРАТОРА ON-GOTO

20  К=-1

30  PRINT "К=";К; "И ИСПОЛНЯЕТСЯ СТРОКА";

40   ON К GOTO 70,90,110

50   PRINT " 50"

60  GOTO 120

70   PRINT " 70"

80   GOTO 120

90   PRINT " 90"

100   GOTO 120

110   PRINT " 110"

120 K=K+1

130 IF K<=4 THEN 30

140 END RUN

К=-1  И ИСПОЛНЯЕТСЯ СТРОКА  50

К=0 И ИСПОЛНЯЕТСЯ СТРОКА  50

К=1  И ИСПОЛНЯЕТСЯ СТРОКА   70

К=2  И ИСПОЛНЯЕТСЯ СТРОКА   90

К=3  И ИСПОЛНЯЕТСЯ СТРОКА   110

К 4  И ИСПОЛНЯЕТСЯ СТРОКА 50 END AT LINE 140

Каждая альтернатива  должна заканчиваться  оператором GOTO  "конец группы", чтобы избежать продолжения исполнения в другой альтернативе.  Если результат вычисления выражения выходит за пределы числа номеров операторов в списке  после GOTO, то исполнение программы продолжается с оператора,  следующего  за  оператором  ON-GOTO,  в   данном  случае  —со  строки 50.   Полная программа преобразования такова:

10 REM ПРОГРАММА ПРЕОБРАЗОВАНИЯ ДЕСЯТИЧНОГО ЧИСЛА В РИМСКОЕ

20 REM ДОПУСКАЕТСЯ ВВОД ЧИСЕЛ ОТ 0 ДО 3999

30 DIM R$(3,3)

40 REM ЗАПОЛНЕНИЕ МАССИВА ЗНАЧЕНИЯМИ

50 R$ ( 0,1)="I"

60 R$ (0,2)="V"

70 R$(0,3)="X"

80 R$(1,1)="X"

90 R$(1,2)="L"

100 R$(1,3)="C"

110 R$(2,1)="C"

120 R$(2,2)="D"

130 R$(2,3)="M"

140 R$(3,1)="M"

150 REM

160 INPUT N

170 PRINT "ДЕСЯТИЧНОЕ";N;"РИМСКОЕ";

180 N$=""

190 FOR J=3 TO 0 STEP -1

200  T=10**j

210        S=INT(N/T)

220   N=N-S*T

230   ON S+1GOTO 430,260,260,260,310,340,340,340,340,410

240 REM ПО УМОЛЧАНИЮ ХОЛОСТОЙ ПРОХОД

250   GOTO 430

260 REM S = 1, 2, 3

270   FOR K=1 TO S

280     N$=N$+R$(J,1)

290   NEXT К

300   GOTO 430

310 REM S=4

320   N$=N$+R$(J,1)+R$(J,2)

330   GOTO 430

340 REM S = 5, 6, 7, 8

350   N$=N$+R$(J,2)

360   S=S-5

370   FOR K=1 TO S

380     N$=N$+R$ (J,1)

390   NEXT К

400   GOTO 430

410 REM S=9

420   NS=N$+R$(J,1)+R$(J,3)

430 REM КОНЕЦ ON-GOTO

440 NEXT J

450 PRINT N$

460 END

He поддайтесь искушению  использовать  симметрию  действий  для чисел от 1 до 4 и  от 5 до 9 посредством беспорядочного  применения  операторов GOTO.  Подобное  усложнение программы обесценивает  возможную выгоду. Позже в  одной из  глав  будет показано, как можно применить подпрограммы и

функции  в такой ситуации.

На  основе приведенной  выше программы выполните  следующее упражнение: после  строки 170 преобразуйте  N  в   строковое значение (назовите его  М$)  ,  затем  замените строки 200-220  на извлечение очередной цифры как символа строки М$, после чего не забудьте преобразовать  цифру в число, требуемое для оператора ON-GOTO в  строке 23(5. Результаты должны быть те же, что и до внесения изменений.

Общая форма оператора выбора не реализована в Бейсике; ее можно проиллюстрировать следующим символом:

Во всяком случае, Бейсик позволяет сконструировать упрощенный вариант оператора выбора за счет тщательного сочетания оператора ON-GOTO и  операторов GOTO, указываемых  в  конце каждой альтернативы. Недостатками приведенного выше символа является его громоздкость и  то, что для написания текста в  прямоугольниках процессов выделяется неодинаковое пространство. Несколько теряя в наглядности, можно использовать символ

но с увеличением N он растет вширь,  и иногда его приходится преобразовывать к виду

который  может  ввести   в  заблуждение тем,  что  вопреки  принятому для  нормальной диаграммы правилу действия в     прямоугольнике  процесса   не   продолжаются   действиями низлежащего

прямоугольника.  Две последние формы символа оператора выбора не будут использоваться в данной книге.

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии