Массив характеризуется именем, типом и размерностью.
Имя массива образуется по общему правилу образования имен в QBASIC’е, но его имя не должно совпадать ни с одним другим именем простых переменных, используемых в программе.
Линейные массивы.
Пусть массив носит имя А и имеет 10 элементов. Тогда его можно описать, как совокупность переменных с индексом: А(1), А(2),..., А(10). Индексы определяют положение элемента в массиве. Число индексов определяет размерность массива.
Для хранения элементов массива в памяти компьютера необходимо выделить место. Количество ячеек памяти для массива определяется его размерностью. Для выделения памяти под массив используют оператор DIM (от англ. dimension — размер).
ОБЩИЙ ВИД:
DIM A(I), B(J),..., Z(N)
где A, B,..., Z — имена массивов, I, J,..., N — размерности массивов.
Например: DIM?A(5), RS(10), J1(15) — означает, что компьютер отведет место для массива А из пяти элементов, массива RS из 10 элементов и массива J1 из 15.
Оператор DIM может быть использован в любом месте программы, но до первого обращения к массиву.
Заполнение массива.
Элементы массива могут быть использованы для вычислений только после того, как их значения будут записаны в память компьютера. Запись элементов массива в зарезервированную область памяти может осуществляться в любом порядке.
Есть несколько способов заполнения массивов:
1 способ. С помощью блока данных DATA и READ.
ПРИМЕР. Заполним массив А из пяти элементов числами 1, 2, 3, 4 и 5.
DIM A(5)
DATA 1, 2, 3, 4, 5
READ A(1), A(2), A(3), A(4), A(5)
Этот способ лучше использовать, если в задаче заданы конкретные значения элементов массива.
2 способ. С помощью оператора INPUT.
ПРИМЕР. Заполнить с клавиатуры массив В из 4 элементов.
DIM B(I)
FOR I=1 TO 4 STEP 1
INPUT B(I)
NEXT I
В этом случае в цикле переменная I является индексом элементов массива, и оператором INPUT B(I) будут запрашиваться по очереди В(1), В(2), В(3), В(4).
Этот способ удобно использовать, если массив содержит небольшое количество элементов. Представьте сколько времени при отладке программы вы потратите, если нужно будет заполнять таким способом массив из 100 элементов!
3 способ. С помощью генератора случайных чисел (см. §10.5).
Если при решении задачи не рассматривается конкретный массив, то удобно будет доверить заполнение массива компьютеру.
ПРИМЕР:
DIM C(10)
FOR I=1 TO 10 STEP 1
C(I)=RND
NEXT I
Вывод массива на печать.
Вывод массива на печать осуществляется также с помощью счетного цикла, так как при выводе на экран несколько раз повторяется один и тот же оператор — PRINT, только с разными элементами массива в качестве операнда.
Например, чтобы распечатать произвольный массив А(10), надо написать программу:
FOR I=1 TO 10 STEP 1
PRINT A(I)
NEXT I
В результате элементы массива будут выводиться в столбик, по одному в каждой строке.
В некоторых случаях (большой массив, вывод на экран двух или более массивов одновременно) удобнее печатать массив в одну строку. Для этого надо поставить после оператора PRINT точку с запятой или использовать оператор LOCATE.
Например, FOR I=1 TO 10 STEP 1
PRINT A(I);
NEXT I
Пустой оператор PRINT отменяет дальнейший вывод в этой строке и переводит курсор для печати на следующую строку.
Решение задач.
Задача 1.
Удвоить все элементы произвольного массива из 10 элементов, заданного на интервале [-50,50]. Вывести на экран оба массива.
Примечание. Поскольку массив произвольный, то лучше заполнить его случайным образом. Формула образования случайных чисел из диапазона
[-50,50] — INT (100*RND - 50). В программе на экран будут выводиться два массива, поэтому печать лучше оформить как подпрограмму.
Решение:
CLS
DIM A(10) ® определение массива
FOR I=1 TO 10 STEP 1:’ задание
A(I)= INT (100 *RND-50):’элементов массива
NEXT I:’случайным образом
GOSUB PR:’обращение к подпрограмме печати
FOR I=1 TO 10 STEP 1:’изменение
A(I)=A(I)*2:’элементов
NEXT I:’исходного массива
GOSUB PR:’ обращение к п/п печати
END
PR: FOR I=1 TO 10 STEP 1:’подпрограмма печати
PRINT USING”####”;A(I);
NEXT I
RETURN
Задача 2.
Определить количество отрицательных элементов массива А(10), который задан случайным образом на интервале [-100,100].
Примечание: Заведем переменную-”копилку” и будем класть в нее единичку каждый раз, как встретится элемент, меньше нуля.
CLS
DIM A(10):’ определение массива
FOR I=1 TO 10 STEP 1:’ задание элементов массива
A(I)= INT (200 *RND-100):’случайным образом
PRINT USING”####”;A(I);:’ и вывод на печать
NEXT I:’одной строкой
N=0:’инициализация переменной-копилки
FOR I=1 TO 10 STEP 1
IF A(I)<0 THEN N=N+1:’проверка знака элементов массива
NEXT I
PRINT N; “Отрицательных элементов “
END
Задача 3.
В произвольном массиве A(N), заданном случайным образом на интервале [-50, 50], найти максимальный элемент.
Алгоритм:
1. Заведем вспомогательную переменную МАХ и присвоим ей значение первого элемента массива А(1).
2. Сравним МАХ со следующим элементом массива.
Если МАХ < А(I),
то ячейке МАХ присвоим А(I)
Иначе перейдем к следующему элементу.
CLS
INPUT “ “;N
DIM A(N)
FOR I=1 TO N STEP 1
A(I)= INT(100*RND-50)*100
PRINT USING”####”; A(I);
NEXT I
MAX=A(1)
FOR I=2 TO N STEP 1
IF MAX < A(I) THEN MAX=A(I)
NEXT I
PRINT “Максимальный элемент массива “;MAX
END
Символьные массивы.
Также как и для числовых массивов, прежде, чем начать работу над символьным массивом, необходимо выделить для него область памяти, не забыв при этом поставить знак $ после имени массива.
Например, DIM A$(5), B$(10).
Над элементами строкового массива можно производить те же операции, что и над простыми строковыми переменными, то есть склейку слов и выделение подслов.
Задавать символьный массив можно тоже одним из трех, выше описанных способов — с помощью INPUT, DATA и READ и генератором случайных чисел RND.
Рассмотрим последний способ. Здесь мы будем использовать функцию CHR$(N), где N — натуральное число от 0 до 255. Эта функция переводит число в соответствующий ему символ.
Известно, что коды латинских букв упорядочены по алфавиту и, начиная с 65 идут коды заглавных букв, а с 97 — коды маленьких букв. Коды заглавных русских букв — с 128 до 159, а коды строчных русских букв по алфавиту не упорядочены.
Например, INT(RND*25+65) даст случайное число в интервале от 65 до 90, то есть в интервале больших латинских букв, а CHR$(INT(RND*25+65)) преобразует этот код в символ.
Задача 1.
Даны символы s1,s2,...,s30. Получить символы данной последовательности в обратном порядке.
Решение.
CLS
DIM S$(30), A$(30):’отводим место в памяти
FOR I=1 TO 30 STEP 1:’задаем массив
S(I)= CHR$(INT(RND*25+65)):’ из больших латинских букв
PRINT S$(I);:’печать массива в одну строку
NEXT I
PRINT:’отмена вывода в текущей строке
FOR I=1 TO 30 STEP 1:’задаем массив A$
A$(I)= S$(31-I):’А$(1)=S$(30), А$(2)=S$(29)...
PRINT A$(I);:’печать массива в одну строку
NEXT I
END
Задача 2.
В массиве слов найти слова, содержащие последним символом букву “о”. Вывести на печать эти элементы и их номера, распечатать весь массив.
Примечание: Необходимо завести переменную, которая будет служить “сигнальной лампочкой”, то есть будет показывать есть ли в массиве слова, кончающиеся на “о” или нет. В начале программы “лампочке” присваивается значение, равное нулю. Если значение останется нулевым, то это значит, что таких слов нет.
Решение.
CLS
DIM A$(10):REM oтводим место в памяти
DATA Окно, Дом, Труба, Дерево, Цветы, Бревно
DATA Золото, Сон, Поле, Дело
FOR I=1 TO 10 STEP 1
READ A$(I):REM задаем массив
PRINT A$(I);:REM печатаем массив
NEXT I
L=0:REM “сигнальная лампочка”
FOR I=1 TO 10 STEP 1
C$=MID$(A$(I), LEN(A$(I)), 1): ‘копируем последнюю букву и
IF C$=“o” THEN PRINT A$(I), I, “элемент”:’сравниваем с “о”
L=1:’ если буквы совпадают,
NEXT I:’ лампочка меняет значение
IF L=0 THEN
PRINT “Слов с последней буквой /О/ в массиве нет”
END IF
END
Задача 3.
Список содержит фамилии 12 учеников и из возраст. Найти фамилии тех, кому больше 16 лет.
Решение:
CLS
DIM N$(12), W(12)
DATA ИВАНОВ, ПЕТРОВ, ВАСЕЧКИН, КРЫЛОВА
DATA ФЕДИНА, БОБКОВА, ЗАЙЦЕВ, ХРУЩЕВ, ГРИШИН
DATA СИДОРОВА, БОБРОВ, МОКРУШИНА
DATA 12, 14, 16, 17, 7, 10,12, 9, 17, 17, 8, 17
FOR I=1 TO 12 STEP 1
READ N$(I)
NEXT I
FOR I=1 TO 12 STEP 1
READ W(I)
NEXT I
FOR I=1 TO 12 STEP 1
PRINT N$(I); “-”; W(I)
NEXT I
PRINT “ Старше 16 лет:“
FOR I=1 TO 12 STEP 1
IF W(I) > 16 THEN PRINT N$(I);
NEXT I
END