Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatics.doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.33 Mб
Скачать

1.9. Массивы

Массивы - группы однотипных данных с произвольным досту-пом в оперативной памяти (во внешней памяти соответствующие группы данных называются файлами). По сути это таблицы с одним или несколькими входами (одно или многомерные массивы) в соот-ветствии с указанными индексами. Определяются массивы операто-ром DIM с указанием количества и диапазона изменения индексов (индексация по умолчанию начинается с нуля). В программе опреде-ление массива должно располагаться до его фактического использо-вания. Выборка элемента массива осуществляется указанием его име-ни и индексов.

Пример 1. Переписать содержимое одномерного массива разме-ром 1 : m∙n в двумерный m×n массив. Будем считать, что m и n за-

даны и одномерный массив каким-то образом заполнен:

DIM A(1 TO m * n) AS SINGLE, B(1 TO m, 1 TO n) AS SINGLE

'заполнение массива А( )

k = 0

FOR i = 1 TO m: FOR j = 1 TO n

k = k + 1: B(i, j) = A(k)

NEXT: NEXT

Пример 2. Составить программу умножения двух матриц. Пусть матрицы заданы массивами A(1 TO m, 1 TO k), B(1 TO k, 1 TO n), C(1 TO m, 1 TO n) и требуется вычислить C = A∙B. Приведем часть

кода, выполняющую необходимые вычисления.

FOR i = 1 TO m

FOR j = 1 TO n : p = 0

FOR t = 1 TO k

p = p + A(i, t) * B(t, j) 'вычисление суммы сомножителей

NEXT: C(i, j) = p

NEXT

NEXT

Пример 3. Иногда бывает необходима специальная нумерация элементов массива. Пусть, например, требуется перенумеровать эле-менты квадратного массива A(1 TO n, 1 TO n) параллельно побочной диагонали, т. е. заполнить массив последовательно натуральными чис-лами в порядке: A(1, 1) = 1, A(2, 1) = 2, A(1, 2) = 3, A(3, 1) = 4, A(2, 2) = 5 и т. д. Заметим, что сумма индексов параллельно побоч-ной диагонали остается постоянной. Этим и воспользуемся в приве-

денном ниже коде:

DEFINT I-N, T, U, V

INPUT "Введите размер массива N= ", n

DIM A(1 TO n, 1 TO n) AS INTEGER

FOR k = 1 TO 2 * n – 1

IF k < n THEN u = k ELSE u = n 'u = min(k, n)

IF k < n THEN v = 1 ELSE v = k – n + 1 'v = max(1, k – n + 1)

FOR i = u TO v STEP -1

t = t + 1: j = k + 1 – i: A(i, j) = t

NEXT

NEXT 'теперь можно вывести массив на дисплей

FOR i = 1 TO n

FOR j = 1 TO n: PRINT USING"### "; A(i, j); : NEXT

PRINT

NEXT

Для n = 5 на дисплей будет выведена таблица:

Таблица 2

1

3

6

10

15

2

5

9

14

19

4

8

13

18

22

7

12

17

21

24

11

16

20

23

25

Пример 4. Пусть, например, 10 человек получают фиксирован-ную зарплату. Информация находится в программном стэке DATA. Требуется вывести информацию на экран в порядке увеличения зар-

платы. Задачу можно решить программой:

DATA Николаев,Спинстер,Трафф,Васин,Лимонов,Локк,Зенд,

Жаров,Кислицын,Корд

DATA 2500, 3200, 1295, 650, 7130, 5440, 4000, 1010, 4280, 6000

TYPE Person 'тип пользователя (см. п. 5)

NAM AS STRING * 10

PAY AS INTEGER

END TYPE

DIM TABLE(9) AS Person 'массив из 10 элементов

RESTORE : FOR i = 0 TO 9 : READ TABLE(i). NAM : NEXT

FOR i = 0 TO 9 : READ TABLE(i). PAY : NEXT

FOR i = 8 TO 0 STEP – 1 'упорядочение массива

FOR j = 0 TO i

IF TABLE(j). PAY < TABLE(j + 1). PAY THEN

SWAP TABLE(j) , TABLE(j + 1) ' перестановка элементов

END IF

NEXT

NEXT : ' таблица упорядочена, теперь только вывод на экран.

FOR i = 0 TO 9

PRINT TABLE(i). NAM ; TABLE(i). PAY

NEXT

Пример 5. Для антисимметричной матрицы A с элементами Ai,j = найти сумму всех скалярных произведений столб-

цов по формуле S =  A i  A j , где n количество строк (столбцов) матрицы А, верхний индекс указывает номер столбца мат-

рицы. Пусть n вводится с клавиатуры. Приведенная ниже программа

решает задачу:

DEFINT I - K : DEFSNG S: INPUT n

DIM A(1 TO n, 1 TO n) AS SINGLE

FOR i = 1 TO n : FOR j = 1 TO n

IF i = j THEN A(i, j) = 2 ELSE A(i , j) = 1 / (i - j)

NEXT : NEXT : S = 0

FOR i = 1 TO n - 1 : FOR j = i + 1 TO n

FOR k = 1 TO n : S = S + A(k, i) *A(k, j) : NEXT

NEXT : NEXT

Пример 6. В некоторых случаях (особенно в задачах с логичес-ким содержанием) полезно содержимое ячейки (целого формата) рас-сматривать как массив значений разрядов, что может существенно об-легчить перебор всех возможных вариантов. Рассмотрим для примера задачу: имеются семь предметов заданного веса и определенной стои-мости каждый, требуется на платформу данной грузоподъемности по-ложить предметы максимальной суммарной стоимости (задача упаков-ки). Здесь число всевозможных переборов равно 127 = 2 7 – 1, все ком-бинации занимают один байт. Пусть конкретный набор данных разме-

щается в стеке DATA. Приведем код решения задачи.

DEFINT I-N : DEFSNG P-W : DEFSTR Z

n = 7: m = 40 'грузоподъемность

DIM P(1 TO n), S(1 TO n)

DATA 11,21,13,8,6,27,9 'веса в усл. ед.

DATA 3,9,7,6,8,8,12 'стоимость в усл. ед.

FOR j = 1 TO 2 * n

IF j <= n THEN READ P(j) ELSE READ S(j – n)

NEXT 'чтение информации

num = 2 ^ n – 1 'число всевозможных вариантов

max = 0: k = 0

FOR i = 1 TO num: price = 0: w = 0 'перебор вариантов

FOR j = 1 TO n

IF j = 1 THEN jb = 1 ELSE jb = 2 * jb 'выбор j –го разряда

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]