Главная » Basic » ИНДЕКСЫ МАССИВОВ

0

Многие системы  с Бейсиком позволяют в качестве индекса  использовать не только переменные

(например, M(D)), но любые арифметические выражения. Так, если значение D равно 3, то

М (D + 2)  эквивалентно М (5), M(6*D-12)   эквивалентно М(6), M(2*(D-4)+5)   эквивалентно М (3) . Следите за тем, чтобы при вычислении выражений получались нужные целые результаты, так как разные системы поступают с дробной частью индекса по-разному. Некоторые из них отбрасывают дробную часть, так что 7.2, 7.5 и 7.9 будут заменены на 7, а другие округляют значение индекса до ближайшего целого, заменяя дробную часть от 0.5 и больше на 1. В этом случае 7.2 заменяется на 7, а

7.5 и 7.9 — на 8.

Лучше  всего  либо пользоваться  в  индексных выражениях целыми переменными (если таковые допускаются системой), либо применять функцию INT и свою собственную систему округления. При значении D, равном 5, Вы можете рассчитывать получить в результате вычисления выражения 2*(D-

4)+5   число  7,   но   в   действительности результат  может  оказаться  равным  6.999999,   и    при отбрасывании дробной части получится 6. Это приведет к неправильному выбору элемента массива, и распознать такую ошибку очень трудно. С другой стороны, при D = 5

INT (2*(D-4) +5+0.5) = INT(6.999999 + 0.5) = INT (7.499999) = 7 93

что и  требовалось. Таким образом, указанные выше элементы массивов надежнее определить как М(INT+2.5)), M(INT(6*D-12+0.5)) и M(INT(2*(D-4)+5.5)).

4.1.2.  ЭКОНОМИЧНОЕ ИСПОЛЬЗОВАНИЕ МАССИВОВ

При решении некоторых задач девять из десяти начинающих программистов  непременно используют массив, хотя без него можно и обойтись. На первых порах это не вызывает трудностей, потому что написанные  такими программистами  программы обычно невелики  и без труда помещаются в память ЭВМ. Однако если эта  практика войдет в  привычку, то  в  программах большего  размера  будет понапрасну  тратиться много  памяти. Чтобы  исключить неоправданное   использование  массива, полезно задаться вопросом: потребуются ли значения   элементов массива  более одного раза? Если нет, то массив, скорее всего, не нужен. Вернемся к программе из подразд. 4.1.1: если бы от нас не требовалось вычислить значения запасов товаров в процентах от суммарного запаса, то программу можно было бы радикальным образом изменить. В исходном варианте программы надо было ввести все значения,  подсчитать  их сумму, вывести все эти значения,  добавив колонку, в которой каждое значение было поделено на эту сумму. Поэтому понадобилось два цикла. Изменяя задачу и не требуя выдачи значений запасов в процентах от общей суммы, приходим к следующей структуре:

которой соответствует программа

10 REM ИНВЕНТАРИЗАЦИОННАЯ ОПИСЬ. НЕМЕДЛЕННАЯ ПЕЧАТЬ

20 Т=0

30 FOR I=1 ТО 20

40   INPUT S

50   T=T+S

60   PRINT "ТОВАР" ; I ; "ЗАПАС" ;S

70 NEXT I

80 PRINT "ВСЕГО";Т;"ШТУК"

90 END

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

RUN

?6

ТОВАР 1 ЗАПАС =6

?4

ТОВАР 2 ЗАПАС =4

Однако  при  этом  за  счет  многократного  использования  одной  переменной  экономится память,

требуемая для 19 элементов массива.

4.1.3.  ПРИМЕР ПРОГРАММЫ

Приведенные ниже программы  показывают,  как  можно  упростить программирование за  счет совместного применения  массивов и  циклов FOR.  Начнем с  простой программы, суммирующей количество  пинт молока, доставляемых в один дом в течение недели. Структура этой программы по существу та же, что и программы, обсуждавшейся выше в подразд. 4.1.4; сама же программа такова: 10 REM ДОСТАВКА МОЛОКА В ОДИН ДОМ

20 Т=0

30 FOR D=1 TO 7

40   INPUT M,

50   Т=Т+М

60 NEXT D

70 PRINT "ВСЕГО ДОСТАВЛЕНО";Т

80 END RUN

?1.3.0.2.1.2.1

ВСЕГО ДОСТАВЛЕНО 10

END AT LINE 80

Обратите  внимание на запятую, указанную в качестве разделителя в операторе INPUT в строке 40. Она означает, что при каждом исполнении этого оператора перехода на новую строку не происходит, так что требуемые значения можно вводить, указывая их  в  одной строке и  разделяя запятыми. Некоторые системы позволяют вместо запятой указывать в операторе INPUT двоеточие. В Бейсике ВВС нет ни той ни другой формы, поэтому каждое вводимое значение придется набирать на новой строке. Теперь обобщим нашу задачу следующим образом: пусть молоко доставляется в  восемь домов и в конце недели требуется подсчитать, сколько всего молока было доставлено в каждый дом. Таким образом, простая переменная Т  в  приведенной выше программе становится  массивом из восьми элементов,  в  каждом  из   которых  накапливается количество молока,   доставленного  в соответствующий дом. Структура этой программы такова:

Первый прямоугольник на этой структограмме в действительности является циклом, служащим для присваивания  0  всем элементам массива Т. Но  так как это  действие логически  завершено и  не разъясняет процесс работы над задачей, то оно изображено в виде блока. Эту структограмму можно развить до следующей программы:

5 REM ДОСТАВКА МОЛОКА В 8 ДОМОВ

10 OPTION BASE 1

20 DIM T(8)

30 FOR I=1 ТО 8

40   Т(I)=0

50 NEXT I

60 REM

70 FOR D=1 TO 7

60   PRINT "ДЕНЬ" ;D

90   FOR H=1 TO 6

100     INPUT S,

110     T<H)=T(H)+S

120   NEXT H

130 NEXT D

140 REM

150 FOR H=1 TO 8

160   PRINT "В ДОМ";H;"ДОСТАВЛЕНО";T(H);"ПИНТ МОЛОКА" 170 NEXT H 180 END RUN ДЕНЬ 1

?1.4.1.3.2.0.5.2 ДЕНЬ 2

?3.0.1.1.1.2.0.1

ДЕНЬ 3

?0.2.0.1.4.0.0.1

ДЕНЬ 4

?2.l.l.0.1.1.2.1

ДЕНЬ 5

?1.1.2.1.0.0.1.0

ДЕНЬ 6

?2.1.0.0.0.3.4.1

ДЕНЬ 7

?1.5.2.8.1.1.3.1 96

В ДОМ 1 ДОСТАВЛЕНО  10 ПИНТ МОЛОКА

В ДОМ 2 ДОСТАВЛЕНО  14 ПИНТ МОЛОКА В ДОМ 3 ДОСТАВЛЕНО 7 ПИНТ МОЛОКА

В ДОМ 4 ДОСТАВЛЕНО 6 ПИНТ МОЛОКА

В ДОМ 5 ДОСТАВЛЕНО  9 ПИНТ МОЛОКА

В ДОМ 6 ДОСТАВЛЕНО 7 ПИНТ МОЛОКА

В ДОМ 7 ДОСТАВЛЕНО  15 ПИНТ МОЛОКА В ДОМ 8 ДОСТАВЛЕНО 7 ПИНТ МОЛОКА END AT LINE 180

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

4.1.4.  ВВОД И ВЫВОД ДАННЫХ С ПОМОЩЬЮ ОПЕРАТОРА МАТ

Оператор МАТ предназначен для проведения манипуляций  всеми элементами массива, начиная с индекса 1, в одном операторе Бейсика. Как указано в гл. 7, во многих системах не предусмотрено полного спектра таких манипуляций, но, по крайней мере, в нескольких системах предусмотрен ввод и вывод данных с помощью оператора МАТ.

Попросту говоря, операторы

10   DIM A (5)

20   MAT INPUT A

обеспечивают ввод данных в пять элементов массива А (1), А(2), А(3), А (4) и  А (5). Вводимые значения можно набирать на одной строке или  распределять по нескольким строкам. Если Ваша

система не позволяет пользоваться оператором МАТ, то указанные выше операторы можно заменить на следующий эквивалент:

10   DIM A(5)

20   FORI=1 TO 5

30      INPUT A(I),

40   NEXT I

Запятая после А(I) как раз и  позволяет вводить несколько значений в одной строке, разделяя их запятыми. Если такая возможность в Вашей системе отсутствует, Вам придется набирать каждое значение на отдельной строке. Вывод работает точно так же: операторы

10   DIM P(8)

20   MAT PRINT P

выведут восемь значений Р(1) — Р(8), каждое на новой строке. Если после Р указать запятую или точку с запятой, то значения будут выводиться в одной строке либо с большими интервалами, либо вплотную.  Если Ваша  система не  позволяет  пользоваться  оператором  МАТ,  то   предыдущие операторы можно заменить на следующий эквивалент:

10   DIM P(8)

20   FOR I = 1 TO 8 30      PRINT P (I) 40   NEXT I

Как MAT INPUT, так и MAT PRINT оперируют и двумерными  массивами. При работе с оператором INPUT  тщательно  установите, в  каком  порядке  значения присваиваются  отдельным  элементам массива; обычно первым изменяется второй индекс. Таким образом, операторы

10   DIM A (2,3) 20   MAT INPUT A

эквивалентны операторам

10   DIM A (2,3)

20   FOR I = 1 TO 2

30      FOR J = 1 ТО 3

40     INPUT A (I, J),

50      NEXT J

60   NEXT I

Вывод осуществляется аналогичным образом: первым изменяется второй индекс. Например, 10  REM ФРАГМЕНТ ДЛЯ ДЕМОНСТРАЦИИ ОПЕРАТОРА МАТ

20  DIM A(2,3)

30   MAT INPUT А

40   REM

50  MAT PRINT A,

60   END RUN

?1.2.3.4.5.6

1                                2                                3

4                                                              5                               6

END AT LINE 60

Матрица А размерами 2X3 изображается в обычной алгебраической форме в виде строк и столбцов, а запятая в операторе MAT PRINT вызывает, как показано раньше, вывод элементов матрицы  по строкам.

В Бейсике ВВС эти операторы отсутствуют, но, в отличие от большинства других систем, в этой версии  Бейсика есть  возможность выделения "процедур", которыми можно воспользоваться для определения процедур MATINPUT(A) и MATPRINT(A), выполняющих описанные выше действия.

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

По теме:

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