Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
__QB__ред.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
352.33 Кб
Скачать

Глава 5. Массивы.

Многие задачи, которые решаются с помощью компьютера, связаны с обработкой больших объемов информации, представляющей собой совокупность данных, объединенных единым математическим содержанием или связанные по смыслу. Такие данные удобно представлять в виде линейных или прямоугольных таблиц — массивов.

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

Массив — это набор упорядоченных по номерам переменных одного типа, с общем именем.

Массив характеризуется именем, типом и размерностью.

Имя массива образуется по общему правилу образования имен в QBASIC’е, но его имя не должно совпадать ни с одним другим именем простых переменных, используемых в программе.

#13.1 Линейные массивы.

Пусть массив носит имя А и имеет 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 может быть использован в любом месте программы, но до первого обращения к массиву.

#13.2 Заполнение массива.

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

Есть несколько способов заполнения массивов:

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

#13.3 Вывод массива на печать.

Вывод массива на печать осуществляется также с помощью счетного цикла, так как при выводе на экран несколько раз повторяется один и тот же оператор — 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

Пустой оператор PRINT отменяет дальнейший вывод в этой строке и переводит курсор для печати на следующую строку.

# 13.4 Решение задач.

Задача 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

PRINT

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

#13.5 Символьные массивы.

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

Например, 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

PRINT

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

PRINT

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

#14 Двумерные массивы (матрицы).

Широко распространенным видом деятельности компьютера является справочно-информационное обслуживание, которое включает в себя накапливание информации и выдачу ее по запросам.

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

В математике двумерные массивы носят название матрицы.

Элементы двумерного массива(матрицы) имеют два номера — номер строки и номер столбца.

Например, запись А(m, n) означает массив из m строк и n столбцов:

А11 A12 ... A1n

A21 A22 ... A2n

....................

Am1 Am2 ... Amn

Если m=n, то говорят, что матрица — квадратная. Элементы А11, А22...Аmn — элементы главной диагонали или просто главная диагональ.

Чтобы описать массив и зарезервировать под него место в памяти, используют оператор DIM.

Например, DIM A(3,7), B$(3,3).

Вводить массивы можно по строкам и по столбцам.

а) По строкам:

DIM A(3,4) I=1 J=1 A(1,1)

|FOR I=1 TO 3 J=2 A(1,2) первая

| FOR J=1 TO 4 J=3 A(1,3) СТРОКА

| | A(I,J)=............ J=4 A(1,4)

|  NEXT J I=2 J=1 A(2,1)

|NEXT I J=2 A(2,2) ВТОРАЯ

J=3 A(2,3) СТРОКА

J=4 A(2,4)

и так далее.

б) По столбцам:

DIM A(3,4) J=1 I=1 A(1,1)

|FOR J=1 TO 4 I=2 A(1,2) первЫЙ

| FOR I=1 TO 3 I=3 A(1,3) СТОЛБЕЦ

| | A(I,J)=............ I=4 A(1,4)

|  NEXT I J=2 I=1 A(2,1)

|NEXT J I=2 A(2,2) ВТОРОЙ

I=3 A(2,3) СТОЛБЕЦ

I=4 A(2,4)

и так далее.

Для вывода двумерного массива необходимо так же два цикла — по строкам и по столбцам:

FOR I=1 TO 3

FOR J=1 TO 4

PRINT A(I,J);

NEXT J

PRINT

NEXT I

Задача 1.

Сформировать случайным образом матрицу произвольного размера и вывести ее на печать.

Решение.

CLS

REM Проверка ввода

Vvod: INPUT “Количество строк= “;N

INPUT “Количество столбцов= “;M

IF (M<=2) or (N<=2) THEN GOTO Vvod

DIM A(N,M)

REM Заполнение массива двузначными числами

FOR I=1 TO 3

FOR J=1 TO 4

A(I,J)=INT(RND*100)

NEXT J

NEXT I

REM Печать массива

FOR I=1 TO 3

FOR J=1 TO 4

PRINT USING”####”; A(I,J);

NEXT J

PRINT

NEXT I

END

Примечание.

Рассмотрим формулу INT(RND*100). Как нам уже известно (cм. C. 19) RND выдает случайные числа в интервале от 0 до 1, то есть десятичную дробь. Если мы умножим десятичную дробь на 100 и выделим целую часть, то получим двузначное число. Например, 0.6543 *100=65.43 INT(65.43)=65

Задача 2.

Для заданной квадратной матрицы сформировать одномерный массив из ее диагональных элементов.

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

Решение.

CLS

INPUT ‘“Размер матрицы “; N

DIM A(N, N), D(N)

REM Заполнение и печать исходного массива числами

FOR I=1 TO N

FOR J=1 TO N

A(I,J)=INT(RND*10) случайные числа от 0 до 9

PRINT USING”####”; A(I, J);

NEXT J

PRINT

NEXT I

REM формирование и печать массива из диагональных элементов

FOR I=1 TO N STEP 1

D( I )= A(I, I)

PRINT USING”####”; D( I );

REM D(1)=A(1,1), D(2)=A(2,2), ... D(N)=A(N,N)

NEXT I

END

Задача 3.

В случайно заданном двумерном массиве все элементы, меньшие 50, заменить нулями. Распечатать оба массива.

Решение.

CLS

INPUT “Число строк= “; N

INPUT “Число столбцов= “; M

REM Заполнение и печать исходного массива числами

FOR I=1 TO N

FOR J=1 TO M

A(I,J)=INT(RND*100) случайные числа от 0 до 9

NEXT J

NEXT I

GOSUB PR

REM Заполнение и печать нового массива числами

FOR I=1 TO N

FOR J=1 TO M

IF A(I, J) < 50 THEN A(I, J)=0

NEXT J

NEXT I

GOSUB PR

END

PR: REM подпрограмма печати

FOR I=1 TO N

FOR J=1 TO M

PRINT USING”####”; A(I, J);

NEXT J

PRINT

NEXT I

PRINT

RETURN

33