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

Массивы

    1. Что такое массив? С массивами как последовательностями или таблицами чисел мы встречаемся давно. Из курса высшей математики известно, что массив может быть одномерным (представителем одномерного массива является вектор), двумерным (представителем двумерного массива является матрица), или многомерным. Также известно, что и у вектора, и у матрицы элементы нумеруются. Строго говоря, массив – это тип, конкретный представитель которого содержит в себе конечное количество упорядоченных однотипных перенумерованных компонент.

    2. Как задать тип-массив? Синтаксис команды определения типа массив следующий (пишется в блоке описаний):

type ИмяТипа = array[ДиапазоныИндексов]

of ТипКомпонент;

Например, чтобы задать пятиэлементный тип-вектор, компоненты которого – вещественные числа, нужно записать конструкцию

type TVector = array[1..5] of Real;

Если же мы хотим задать подобный тип-вектор, но содержимое которого – только целые числа, то вид команды таков:

type TVector = array[1..5] of Integer;

Тип-матрицу размера 10×10, содержащую целые неотрицательные числа, зададим так:

type TMatrix = array[1..10,1..10] of Word;

Сколько у массива измерений, столько и диапазонов изменения индексов (номеров) элементов массива.

Заметим, что если задается несколько типов в блоке type, само зарезервированное слово type используется только один раз.

    1. Как задать константы и переменные типа массив? Чтобы задать константу типа массив, записывают название константы и в круглых скобках, соблюдая порядок вложенности (строк и столбцов), через запятые перечисляют элементы этой константы. Переменную типа массив объявляют аналогично любой другой переменной. К примеру, пусть нужно задать вещественнозначный тип-матрицу размера 3×4 и определить переменную этого типа и константу. Сделать это нужно так:

type TMatrix = array[1..10,1..10] of Word;

var matrix1: TMatrix;{задаем переменную}

const matrix2: TMatrix = ((1,2,3,4),

(4,3,2,1),

(2,4,1,3)){задаем константу}

    1. Как обратиться к элементу массива? К элементу одномерного массива x с номером i можно обратиться так: x[i]. Если массив x двумерный, то к элементу с индексами i и j (образно выражаясь, к элементу матрицы, стоящему в строке i в столбце j) можно обратиться так: x[i,j]. В любом случае, если мы хотим обратиться к произвольному элементу конкретного массива, мы пишем имя этого массива (то есть константы или переменной) и рядом в квадратных (не в круглых, а именно в квадратных) скобках указываем значения индексов. Кроме того, если мы точно знаем эти индексы, их можно прописывать явно, как, например, x[2], x[9,8] и т.п.

    2. Каковы основные этапы работы с массивами? Основными задачами, на основе которых можно построить все остальное, являются задачи начального заполнения массива и вывода на экран содержимого массива. Затем массив преобразовывают, если это необходимо и после преобразования опять выводят на экран.

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

Пример 15. Создать одномерный массив (вектор) длины 10, заполнить его последовательными десятью натуральными числами, начиная с 1, и вывести массив на экран.

Решение такое:

type tvector=array[1..10] of integer;

var vector: tvector;

i:integer;

begin

for i:=1 to 10 do

begin

vector[i]:=i;

writeln(i,'-й элемент равен ', vector[i]);

end;

readln;

end.

Объяснение командам следующее. В первой строке мы определяем тип массив (tvector) с десятью элементами, каждый элемент типа integer. Во второй строке, в блоке определения переменных мы задаем экземпляр (фактическую переменную) типа массив (vector). Затем мы задаем переменную i, которая будет являться счетчиком в цикле. В самом цикле for мы присваиваем каждому элементу массива некоторое натуральное число, а именно – порядковый номер элемента массива: vector[i]:=i. Попутно мы выводим текущий элемент массива на экран. Остальные команды вам известны.

Пример 16. Дан двумерный массив (матрица) размером 7×12, который нужно заполнить с клавиатуры произвольными целыми числами и вывести массив на экран.

Решение. Это сделаем так:

type tmatrix=array[1..7,1..12] of integer;

var matrix: tmatrix;

i,j:integer;

begin

for i:=1 to 7 do {цикл заполнения массива}

for j:=1 to 12 do

begin

write('введите элемент с индексами ',i,' и ',j,': ');

readln(matrix[i,j]);

end;

for i:=1 to 7 do {цикл показа массива}

for j:=1 to 12 do

begin

if j=12 then writeln(matrix[i,j])

else write(matrix[i,j]);

end;

readln;

end.

Объяснение командам следующее. Сначала мы определим новый тип tmatrix – двумерный (матрицу), о чем говорят два диапазона индексов – от 1 до 7 и от 1 до 12. В блоке определения переменных мы задаем экземпляр типа matrix и индексы – i и j. Первый цикл заполняет массив. В теле этого цикла команда writeln выводит текущие приглашения пользователю, а вторая команда readln позволяет пользователю с клавиатуры ввести элемент массива с индексами i и j. Однако более интересным является то, что цикл является (в отличие от предыдущей задачи) вложенным!

Второй цикл, также вложенный, позволяет вывести матрицу на экран. В нем проверяется условие, при котором мы достигаем конца строки (j=12) и должны перейти на новую строку командой writeln, а в остальных случаях не должны и поэтому используется команда write.

Пример 17. Создать одномерный массив (вектор) длины 100, заполнить его случайными числами из диапазона от 0 до 1 и вывести массив на экран.

Решение такое:

type tvector=array[1..100] of integer;

var vector: tvector;

i:integer;

begin

randomize; {перезапуск генератора случайных чисел}

for i:=1 to 100 do

begin

vector[i]:=random; {i-й элемент задается случайно}

writeln(i,’-й элемент равен ‘, vector[i]);

end;

readln;

end.

Сложность состоит в том, массив очень длинный и вводить его элементы с клавиатуры затруднительно. Поэтому нужно, чтобы компьютер сам заполнил его случайными числами. Для генерирования случайного числа требуется функция random. Если она вызвана без параметров, то результат ее выполнения – некоторое случайное число из отрезка [0; 1]. Если же она вызвана от какого-нибудь натурального числа n, то есть имеет вид random(n), то в результате генерируется целое случайное число из диапазона от 0 до n – 1. Для чего же нужна процедура randomize? Дело в том, что генератор случайных чисел нужно каждый раз перезапускать, тогда случайные числа будут разными. Это и делает указанная процедура. Её вызывают один раз в программе перед первым использованием функции random.

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

Пример 18. Пользователь задает целочисленный вектор размером 15, а компьютер меняет все числа на противоположные и выводит на экран исходный и конечный векторы.

Решение.

type tvector=array[1..15] of integer;

var vector:tvector;

i:integer;

begin

for i:=1 to 15 do

begin

writeln('Введите элемент с номером ',i);

readln(vector[i]);

end;

for i:=1 to 15 do

begin

vector[i]:=-vector[i];{это присваивание изменяет i-й

элемент вектора}

writeln(vector[i]);

end;

readln;

end.

Смысл первого цикла – введение в память машины элементов массива. Смысл второго цикла – преобразование элементов массива (vector[i]:=-vector[i]) и вывод их на экран (writeln(vector[i])).

Очень часто требуется решать задачи на выбор элементов из массива. К примеру:

Пример 19. Дан вектор из 20 неотрицательных целочисленных элементов. Найти сумму тех элементов, которые делятся на данное число n.

Решение. Нам нужно, после заполнения массива, пройти по нему и выбрать только те элементы, которые делятся на n. Проверка делимости выполняется с помощью оператора mod. Одновременно с проверкой нужно наращивать сумму s нужных нам элементов. Текст программы:

type tvector=array[1..20] of word;

var vector: tvector;

i,n:integer;

s:word;

begin

randomize; {перезапуск генератора случайных чисел}

for i:=1 to 20 do {заполнение массива}

begin

vector[i]:=random(100);

{i-й элемент задается случайно}

{из промежутка от 0 до 99}

writeln(i,’-й элемент равен ‘, vector[i]);

end;

writeln(‘Введите делитель n: ’);

readln(n);

s:=0;

for i:=1 to 20 do {выбор элементов из массива}

if (vector[i] mod n)=0 then s:=s+1;

writeln(‘Сумма чисел, делящихся на ’,n,’ равна ’,s);

readln;

end.

Особняком стоят задачи сортировки массивов и поиска в них экстремальных значений. Разберем еще один пример.

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

Решение. Нам нужно все минимумы заменить значением максимума и наоборот – все максимумы заменить значением минимума. Для этого при одном проходе по массиву мы выявим эти минимум и максимум, а при другом проходе – преобразуем массив.

type tvector=array[1..20] of word;

var vector:tvector;

i,min,max:word;

begin

for i:=1 to 20 do {заполняем массив}

begin

writeln('Введите элемент с номером ',i);

readln(vector[i]);

end;

for i:=1 to 20 do {выводим вектор на экран}

write(vector[i],‘ ’);

max:=vector[1]; {начальное значение максимума}

min:=vector[1]; {начальное значение минимума}

for i:=1 to 20 do {ищем экстремумы}

if vector[i]>max then max:=vector[i] else

if vector[i]<min then min:=vector[i];

for i:=1 to 20 do {преобразование массива}

if vector[i]=max then vector[i]:=min else

if vector[i]=min then vector[i]:=max;

for i:=1 to 20 do {снова выводим вектор на экран}

write(vector[i],‘ ’);

readln;

end.

Замечание. Не путайте никогда номера элементов массива (i, j) и сами элементы массива (vector[i], matrix[i,j]).