Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Решение задач на ЭВМ. Программирование на языке Pascal. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
4.8. Обработка одномерных и двумерных массивов
Построение более крупных структур данных для хранения и обработки в программах сложных видов информации обеспечива­ется структурными типами. Они образуются путём объединения простых элементов данных, называемых компонентами. Компо­ненты могут быть при этом однородными и разнородными. В пер­вом случае тип данных определяется как тип- массив, а во втором – как тип – запись.
Необходимость в массивах возникает всякий раз, когда в па­мяти нужно хранить большое, но конечное количество однотипных упорядоченных данных. Массив – это конечный упорядоченный набор элементов одного типа. Тип элементов массива называется базовым. Используя любой ранее описанный тип, как базовый, можно получить массив массивов, массив записей, массив строк, массив множеств и т.д.
Кроме обычных переменных, используемых в Паскале, суще­ствуют переменные, которые можно использовать для обозначения элементов массива. Они используются там, где обычно применя­ются индексы или двойные индексы, например, при записи коэф­фициентов полинома или элементов матрицы. Каждый массив определяется его именем, а также размерностью. Имя массива за­дается так же, как имя простой переменной. Элементами массива являются индексированные переменные. Для одномерного массива индекс определяет порядковый номер элемента, для двумерного – первый индекс – номер строки, второй – номер столбца, на пересе­чении которых расположен элемент.
Одномерные массивы
Простейшая форма – одномерный массив (линейная таблица). Он аналогичен одномерному числовому вектору и имеет индиви­дуальное имя, а для обозначения отдельной компоненты к имени массива добавляется индекс, который и выделяет нужную компо­ненту. Компоненты массива называются переменными с индекса­ми. В обычной математической символике записывают: х …, а
и т.п. Наименьший индекс называется нижней границей,
n
, х2; а
1
1
,
71
наибольший индекс – верхней границей, а число элементов масси­ва – размером массива.
Формат описания массива
<имя массива>: Array [< количество комп.>] of < тип комп. >;
где:
<имя массива>- идентификатор массива;
Array – массив;
[< количество комп.>] - количество элементов в массиве;
of - для;
< тип комп. > - описание типа переменных в массиве (real, in­teger и т.д.).
Размер массива фиксируется при описании и в процессе вы-
полнения программы не меняется. Индексы можно вычислять. Наиболее часто в качестве типа индекса используется ограничен­ный целый тип или перечисляемый тип. Например, описания:
1) A : Array [-10..10] of Integer;
2) Type Day = (Monday, Tuesday, Wednesday, Thursday, Friday,
Saturday,Sunday);
Var Temperature: Array [Day] of Real;
задают массивы из 21 целого и 7 действительных чисел и делают возможными, например, такие присваивания: Temperature
[Sunday]:=24; A[-12]:= 125. Для описания массива можно использовать и предва- рительно определенные константы: Const N=50; Var A: Array [1..N] of Byte;
Над одномерным массивом выполняют две базовые операции: извлечение некоторого элемента из массива и помещение элемента в массив (сравнение и присваивание). Паскаль не имеет средств ввода – вывода всех элементов сразу, поэтому ввод и вывод значе­ний производят поэлементно. Инициализируют массивы способа­ми ввода данных, рассмотренными выше. Иногда в тексте учебной программы ввод занимает больше места, чем запись алгоритма ре­шения, что затрудняет ее восприятие.
В прикладных программах ввод, как правило, осуществляется либо с клавиатуры, либо из файла. Рассмотрим подробнее ввод
72
элементов массива и их числа n с клавиатуры. В некоторых средах программирования кроме статических имеются и динамические массивы. Например. В среде Quick Basic в таком случае можно за­писать: INPUT N (ввод n): DIM A (1 TO N) AS DOUBLE (объявле­ние массива А с переменной верхней границей), задав тем самым число элементов в процессе исполнения программы. В Паскале та­кая возможность отсутствует. Количество элементов массива, их упорядоченность и тип задают явно до начала выполнения про­граммы. Поэтому, если границы массива точно неизвестны, то их выбирают «с запасом» так, чтобы его размер был не меньше значе­ния n, которое будет введено.
К двум совместимым массивам А и В применимы только опе­рация присваивания А: =В, которая копирует поэлементно массив В в массив А и операции отношения А=В, А<>В.
Имеется большое разнообразие задач на одномерные массивы. Как и все задачи вообще, условно их можно разделить на три вида:
1) задачи, решаемые в «одно соображение»;
2) стандартные задачи;
3) задачи, решения которых требуют знания вспомогатель-
ных алгоритмов, специальных методов и приемов. Оче­видно, что без умения решать задачи первых двух видов невозможно решать нестандартные задачи.
Типовые задачи на одномерные массивы
Перечислим стандартные (типовые) задачи на одномерные массивы:
нахождение количеств; нахождение суммы; нахождение экстремумов; подсчет (замена) элементов, удовлетворяющих заданному
условию; поиск заданного элемента: а) в неупорядоченном массиве; б) в упорядоченном массиве;
определение заданного расположения элементов; удаление элемента, включение элемента в заданную пози-
цию;
73
переразмещение (инвертирование, циклический сдвиг) элементов; случайная выборка элементов (с повторениями и без по­вторений); слияние двух упорядоченных массивов в упорядоченный массив; формирование нового массива из элементов старого масси­ва; сортировка массива по возрастанию, убыванию (простые методы); вставка элементов в заданный массив.
К сложным задачам можно отнести улучшенные методы сор­тировки массивов, поиск моды и медианы массива, алгоритмы ге­нерирования комбинаторных объектов, алгоритмы на графах и т.д.
Рассмотрим некоторые примеры типовых задач.
Задача 1.
В массиве из N 20 элементов вычислить наибольший элемент массива Х и его номер.
Текст программы:
program Arr1;
const NN=20;
var n, i, Imax : integer; Xmax : real;
x: array[1.. NN] of real; {описание массива}
begin
writeln('введите значение n');
readln(n);
for i :=1 to n do
begin
Writeln( 'введите', i, 'элемент массива x' );
Read( x [ i ] ) {ввод элемента массива х}
end;
Xmax := x [ 1 ]; {кандидат в Хmax}
Imax :=1; {его номер Imax}
for i :=2 to n do if x[ i ] > Xmax then {поиск Хmax}
begin
74
Xmax:=x[ i ];
Ввод n
Начало
Конец
Xmax=x[1]
Imax=1
Ввод x[i]
i=1..n, 1
1
2
3
4
Xmax=x[i]
Imax=i
x[i] > Xmax
i=2..n, 1
5
7
Да
Нет
Вывод Xmax,
Imax
6
8
Imax:=i;
end;
writeln('Xmax=',Xmax,' ','Imax=',Imax);{вывод результата}
readln
end.
Рис.15. Алгоритм решения задачи 1
75
Конец
Ввод a[i]
i=1..n, 1
2
3
s[i]=a[i]+b[i]
i=1..n, 1
6
7
Вывод s[i]
8
Ввод b[i]
i=1..n, 1
4
5
Ввод n
Начало
1
Задача 2. Даны действительные a1, a2, ..., a10 и b1, b2, ..., b10.
Получить массив, элементы которого связаны с заданными эле­ментами соотношениями (a1+b1), (a2+b2),...(a10+b10).
Блок – схема решения задачи представлена на Рис.16.
Рис.16. Алгоритм решения задачи 2
76
Текст программы задачи 2:
program Arr2; var a, b,s:array[1..10] of real; {описание массивов a, b, s} i, n:integer; begin n:=10; for i:=1 to n do begin writeln('Введите',i,'элемент массива a'); readln(a[i]); {ввод элементов массива a} end; for i:=1 to n do begin writeln('Введите',i,'элемент массива b'); readln(b[i]); {ввод элементов массива b} end; for i:=1 to n do begin s[i]:=a[i]+b[i]; {формирование элементов массива s} writeln(i,' элемент массива s равен ', s[i]:6:2); {вывод элементов массива s} end; readln; end.
Двумерные массивы
Двумерным массивом называется совокупность данных, каж­дое значение которых зависит от его местоположения в строке и столбце.
Рассмотрим прямоугольные таблицы, состоящие из чисел и содержащие произвольное число m строк и произвольное число n столбцов. В математике их называют матрицами, а числа, входя­щие в состав матрицы – её элементами. В программировании мат-
77
рицей называется переменная – массив, компоненты которой опять
А(1, 1)
А(1, 2)
А(1, 3)
А(1, 4)
А(2, 1)
А(2, 2)
А(2, 3)
А(2, 4)
А(3, 1)
А(3, 2)
А(3, 3)
А(3, 4)
А(1, 1)
А(1, 2)
А(1, 3)
А(2, 1)
А(2, 2)
А(2, 3)
А(3, 1)
А(3, 2)
А(3, 3)
же массивы.
Каждый элемент матрицы описывается, как A(I, j),
где: A(I, j) - имя матрицы;
I - номер строки;
J - номер столбца.
Если в матрице количество строк равно количеству столбцов, то такая матрица называется квадратной, в противном случае пря­моугольной.
Прямоугольная матрица
Квадратная матрица
Общий вид задания типа, определяющего двумерный мас-
сив, такой же, что и в случае, определяющем одномерный массив.
Описание элементов двумерного массива (матрицы)
1 способ:
< имя массива >: array [<количество строк, количество
столбцов>] of < тип комп.>;
где: < имя массива > - идентификатор массива; array - массив;
<количество строк> – количество строк в матрице; <количество столбцов> - количество столбцов в матрице; оf - для; < тип комп.> - описание типа переменных в массиве (real,
integer и т.д.).
78
2 способ:
< имя массива >: array [<количество строк>] of array
[<количество столбцов>] of < тип комп.>;
Например:
описание Type Vector = Array [1.. 10] of Byte;
Var Map: Array [1.. 100] of Vector;
задает двумерный массив, т.е. прямоугольную таблицу, состо­ящую из 100 строк и 10 столбцов.
Или другой способ описания:
Var Map: Array [1.. 100, 1 ..10] of Byte;
В стандартных матричных задачах может потребоваться:
получить новую матрицу (ввести матрицу) по заданному пра-
вилу;
найти какую-либо величину, используя элементы данной мат-
рицы;
преобразовать матрицу требуемым образом; определить, обладает ли матрица (ее один или несколько эле-
ментов, строка, столбец) указанным свойством;
выполнить ту или иную операцию над матрицей (матрицами).
Ввод – вывод значений элементов матрицы
Ввод - вывод значений элементов матрицы можно осуществ­лять разными способами: с клавиатуры, по формуле, случайными числами.
Рассмотрим, как это можно осуществить.
1. Заполнение элементов матрицы с клавиатуры:
Program zadacha1;
{ ввод с клавиатуры, вывод в столбик}
79
Var
a: array [1..10, 1..10] of real; i, j : integer;
begin
for i:=1 to 10 do for j:=1 to 10 do begin
readln (a[I, j]); writeln (`a ( ` , I, ` , ` , j, ` ) =` , a[I , j] )
end
end.
2. Заполнение элементов матрицы по формуле:
Program zadacha2;
{ввод по формуле, вывод таблицей}
Var
a: array [1..10, 1..10] of real; i, j : integer;
begin
for i:=1 to 10 do begin for j:=1 to 10 do begin
a [I, j ]:= (I + 0.5) / (j + Sin (j) ) ; write ( a [I , j ] , ` ` ) end;
writeln
end
end.
3. Заполнение элементов матрицы случайными числами:
Program zadacha3;
{ввод случайных чисел, вывод в строчку}
Var
a: array [1..10, 1..10] of integer; i, j : integer;
begin
randomize;
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]