Главная » Basic » ДРУГИЕ КОНЦЕПЦИИ ПРОГРАММИРОВАНИЯ

0

Подобно большинству языков программирования, Бейсик обладает рядом важных  возможностей, которые лучше всего обсуждать после того, как элементарные свойства уже знакомы и полностью поняты. В этой главе представлено несколько таких возможностей, которые хотя и различны, но в определенном  смысле  очень  тесно  связаны.  Тема  данной  главы  —  обсуждение  объектов,  над которыми проводятся вычисления, другими словами,  "предметов", которыми манипулирует язык программирования.

До сих пор такими "предметами" в основном были числа в виде констант и значений  числовых переменных. Если мы можем успешно манипулировать этими простыми предметами, то почему бы не ввести в рассмотрение более сложные предметы и, если они окажутся подходящими, не использовать их тем или иным образом? Бейсик позволяет простым образом  пользоваться группами (или массивами, или списками) числовых значений. В нем также  предусмотрены другой тип простых переменных, способных содержать символы, а не числа, и средства эффективного манипулирования этими строковыми переменными.

Хотя детали применения этих предметов могут быть в отдельных случаях довольно сложными, пусть это не затмит простоту сути описания и применения некоторых объектов.

Некоторые развитые языки программирования содержат средства определения Ваших собственных "предметов" (объектов или структур) и связей между ними, но эффективное их применение доступно только искусному программисту. Поработав с Бейсиком, Вы должны осознать его ограниченность в отношении подобных возможностей, после чего можно приступать к знакомству с другими языками.

4.1. МАССИВЫ

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

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

50   S = 0

60  FOR I = 1 ТО 6

70      INPUT A

80      S = S+А

90  NEXT I 100   S = S/6

Каждое новое значение вводится в одну и ту же переменную (А) с помощью оператора в строке 70 и добавляется к  сумме  предыдущих чисел  в  строке  80.  Сами  предыдущие значения  оказываются утерянными, так как каждое новое значение занимает место непосредственно предшествующего ему значения. В конце цикла переменная А содержит самое последнее значение. До настоящего момента единственно возможной была альтернатива написать программу

50   INPUT А, В, С, D, E, F

60   S = A + B + C + D + E + F

80   S = S/6

дающую тот же результат, но сохраняющую на будущее все шесть значений за счет использования шести  переменных.  Возникает  впечатление,  что  при  этом  программа  даже   сокращается,  но попробуйте написать программу вычисления среднего для 1000 значений!

В описанном выше случае, да и при многих других обстоятельствах нам надо иметь  возможность манипулировать числами, не уничтожая их значений, подобно тому, как мы манипулировали простой переменной А в первом примере. Подходящим для этих целей  объектом  является массив, дающий общее  имя  группе  ячеек  памяти  и  обеспечивающий  доступ  к  каждой  отдельной  ячейке  путем указания индекса. На рис. 4.1 изображены несколько  отдельных переменных, таких как А1 и N, а также массив по  имени G.  Это  групповое имя,  данное ячейкам, каждая из  которых аналогична простой переменной. Первая переменная из этого массива имеет имя G(0), вторая G (1), третья G (2) и  т.  д. Образующие массив переменные  называются элементами массива, а числа в  скобках — индексами массива. Отдельными  элементами массива можно пользоваться на тех же правах, что и простыми переменными. Рассмотрим фрагмент программы:

10  INPUT G(l)

20   G(2) =G(1)

30   PRINT G(1), G(2)

В строке 10 вводится значение; в строке 20 оно копируется, а в строке 30 оба значения выводятся. При  этом  G(l)  и  G(2)  являются  отдельными  переменными.  В  точности  те  же  самые  действия произведет программа

10   INPUT Z

20  A=Z

30   PRINT Z, A

использующая простые переменные А и Z.

Рис. 4.1. Массивы в памяти ЭВМ

Нередко массивы используются для хранения родственных значений. Например, в массиве М можно регистрировать количество пинт молока, получаемых ежедневно. Пусть М(1) =1 для  воскресной

доставки, М(2) = 3, М(3) = 0, М(4) = 2, М(5) = 1, М(6) = 2 и М(7) =1. При таких значениях в массиве

М оператор PRINT M (4) напечатает 2, но того же результата можно добиться с помощью операторов

100   D = 4

114   PRINT M(D)

Ценность массивов как раз и состоит в этой возможности использовать переменную в  качестве индекса. Рассмотрим фрагмент программы:

50   FOR D = 1 ТО 7

60     PRINT M(D)

70  NEXT D

Если в массиве М содержатся указанные выше значения, то при первом проходе цикла переменной D будет присвоено значение 1 и исполнится оператор PRINT M(l), на следующем проходе D  будет присвоено значение 2 и исполнится PRINT M (2) , и т. д. Так как в конце оператора печати указана точка с запятой, то все значения будут изображаться на одной строке:

1  3   0   2   1  2   1

4.1.1.   ОПЕРАТОР DIM

Прежде  чем  воспользоваться  массивом,  в  программу  надо  включить  оператор  DIM,  задающий максимально допустимый индекс. Это даст возмож-

ность  системе  с  Бейсиком  зарезервировать  в  памяти  область  достаточного  размера.  Например,

оператор

10   DIM M(7)

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

При желании в одном операторе можно указать список массивов, например:

30   DIM A(14), M(7), Z(100)

Слово DIM представляет собой сокращение от DIMension (размер), поскольку с помощью  этого оператора задается размер массива. Операторы DM можно указывать в любом месте программы на Бейсике, но лучше всего группировать операторы в самом начале программы, где их легче увидеть. Однако оператор DIM должен предшествовать упоминанию описанного в нем  массива в других операторах программы.

Оператор DIM

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

DIM   имя_массиеа (максимальный_индекс)

"Имя_массива"  обычно  выбирается  по  тем  же  правилам,  что  и  имена  простых  переменных. Допускаются как числовые массивы, так и массивы строк символов. В операторе можно указать список описаний массивов, разделяя их запятыми.

"Максимальный_индекс" указывает максимально допустимый в программе индекс и должен  быть положительным. Иногда дополнительно требуется, чтобы он  был целой константой.  Индексы массива обычно пробегают значения от 0 до максимального, но в некоторых системах — от 1 до максимального (см. подразд. 4.1.2).

Можно  пользоваться  и  многомерными  массивами.  Для  этого  в  скобках  после  имени  массива указывается несколько максимальных индексов. Число измерений обычно ограничено определенным пределом.

Если массив не описан в операторе DIM, то по умолчанию ему приписывается максимальный индекс

(10), если он одномерный, и (10,10), если он двумерный.

Допускаются как числовые массивы, так и массивы строк символов. И те и другие могут  быть одномерными  или  двумерными  (большинство  реализаций  Бейсика  допускает  и  большее  число измерений). Если элемент массива используется раньше, чем встретится оператор DIM с описанием этого   массива,   то   в   большинстве   систем   такому   массиву   по   умолчанию    приписывается максимальный  индекс  (10),  если  массив  одномерный,  и  (10,10),  если  массив   двумерный.  Не рекомендуется  избегать  описания  всех  используемых  массивов  в  начале  каждой  программы  и полагаться   на   значения   максимальных  индексов,   приписываемых  по   умолчанию.   Приведем несколько примеров описания массивов:

10

DIM A(50), Z(6)

(числовые одномерные массивы)

20

DIM P$ (5)

(одномерный массив строк)

30

DIM(C(10,5),D(10,20),E$(5,5)

(двумерные матрицы)

89

Прежде чем перейти к применению массивов, посмотрим внимательнее на их имена. Обычно  они имеют тот же тип и ту же длину, что и имена простых переменных.

Если имя А9 допустимо для переменной, то допустимо и описание DIM Z2(10), т. е., как обычно, имя может  состоять  из  буквы  и  цифры.  Однако,  по  крайней  мере,  в  одной  системе  для  массивов допускаются только однобуквенные имена.

Если для переменной допустимо имя PINTOFMILK, то допустимо и описание DIM DAILYPINTA(7) . Если  допускаются  целые  переменные  или  переменные  с  двойной  точностью,  то  допустимы  и массивы этих типов. Не стесняйтесь выбирать одно и то же имя  для простой переменной, массива или  строковой переменной, так  как  система  должна  трактовать их  как  разные  объекты.  Таким образом, операторы

5   DIM A (4) 10   А = 10 20  А(0) =-9 30  А$="ОК" 40  PRINT А,А(0),А$

должны выдать

10                                             -9                                            ОК Если же этого не происходит, тогда избегайте совпадения имен.

Коснемся теперь массивов с переменным размером. Бывает очень удобно использовать для решения задачи в точности необходимый (без запаса) размер массива. Например, для задания размера массива А во время исполнения программы можно воспользоваться операторами

100  INPUT К 120 DIM А (К) 130  …….

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

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

10 REM ИНВЕНТАРИЗАЦИОННАЯ ОПИСЬ

20 DIM S(20>

30 RЕМ ВВЕДИТЕ 20 ТЕКУЩИХ ЗАПАСОВ ТОВАРОВ

40 RЕМ И СРАЗУ ЖЕ ПОДСЧИТАЙТЕ ИХ ОБЩЕЕ КОЛИЧЕСТВО

50 Т=0

60 PRINT "ПОЖАЛУЙСТА, ВВЕДИТЕ КОЛИЧЕСТВО ТОВАРА"

70 FOR I=1 ТО 20

80   PRINT "ДЛЯ НОМЕНКЛАТУРНОГО НОМЕРА";I;

90  INPUT S(I)

100   T=T+S(I)

110 NEXT I

120 PRINT

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

140 REM

150 REM ДЛЯ КАЖДОГО ТОВАРА НАПЕЧАТАЙТЕ ТРИ ВЫХОДНЫХ ЗНАЧЕНИЯ

160 PRINT "ТОВАР","ШТУК","В % ОТ СУММЫ"

170 FOR I=1 ТО 20

180   PRINT I ,S(I) ,S(I)*100/Т;"%"

190 NEXT I

200 END

Обратите внимание на то, что программа имеет  очень простую структуру в виде двух отдельных циклов:

Если вы работаете с расширенным Бейсиком, то можете переписать программу следующим образом: 10 REM ИНВЕНТАРИЗАЦИОННАЯ ОПИСЬ

20 DIM STOCKITEM(20)

30 TOTAL=В

40 PRINT "ПОЖАЛУЙСТА. ВВЕДИТЕ КОЛИЧЕСТВО ТОВАРА"

50 FOR ITEM=1 ТО 20 : REM ВВЕДИТЕ ТЕКУЩИЙ ЗАПАС ТОВАРА

60   PRINT "ДЛЯ НОМЕНКЛАТУРНОГО НОМЕР А" ; IТЕМ ;

70   INPUT STOCKIТЕМ(ITEM)

80   TOTAL=TOTAL+STOCKITEM<ITEM) :REM ДОБАВЬТЕ К СУММЕ

90 NEXT ITEM

100 ……

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

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

По теме:

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