Массивы
Типовые задачи обработки массивов
Работа 3.6. Программирование обработки одномерных массивов
Работа 3.7. Программирование обработки двумерных массивов
Массивом в Паскале называют переменную величину регулярного типа.
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Описание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:
Var <идентификатор>: array[<тип индекса>] of <тип компонентов>
В данном случае квадратные скобки — это обязательные символы, которые называются индексными скобками. Чаще всего в качестве типа индекса употребляется ограниченный тип. Например, массив вещественных чисел, хранящий 12 значений среднемесячных температур в течение года, опишется так:
Var Т: array[1..12] of Real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе.
Элемент массива идентифицируется в виде переменной с индексами:
<Идентификатор массива> [<Индексы элемента>]
Для одномерного массива индекс — это одно значение. Для многомерных массивов индекс — множество значений. В качестве индекса может употребляться любое выражение соответствующего типа. Например, для элементов массива температур возможны обозначения: Т[5] , Т[k], T[i + j], T[m div 2].
Последовательные элементы массива располагаются в последовательных ячейках памяти (Т [1], Т[2] и т. д.), причем значения индекса не должны выходить за диапазон 1. .12.
Тип индекса может быть любым скалярным порядковым типом, кроме Integer. Например, в программе могут присутствовать следующие описания:
Var cod: array[Char] of 1..100; L: array[Boolean] of Char;
В такой программе допустимы следующие обозначения элементов массивов:
cod['x']; Lftrue]; cod[chr(65) ] ; L[a>0].
В некоторых случаях бывает удобно в качестве индекса использовать перечислимый тип. Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
Type Index = (А, В, С, D) ;
Var class_10: array[Index] of Byte;
И если, например, элемент class 10 [А] равен 35, то это означает, что в 10А классе 35 человек. Такое индексирование улучшает наглядность программы.
Часто структурному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
Type Masl = array [1..100] of Integer;
Mas2 = array [-10.. 10] of Char;
Var Num: Masl; Sim: Mas2;
До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.
Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).
В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют месяцам, а строки — годам.
Для обработки такой таблицы в программе следует описать массив:
Var Тabl: array[2001..2010] of array[1.. 12] of Real;
Вот примеры обозначения некоторых элементов этого массива:
Тabl [2001] [1] ; Тabl [2005] [10] ; Тabl [2010] [12] .
Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:
Тabl [2 001, 1] ; Тabl [2005, 10] ; Тabl [2010,12] .
Переменная ТаЫ [2 001] обозначает всю первую строку таблицы, т. е. весь массив температур за 2001 год. Другим эквивалентным вариантом приведенному выше описанию является следующее:
Туре Month = array [1..12] of Real;
Year = array [2001..2010] of Month;
Var Tabl: Year;
Наиболее краткий вариант описания данного массива такой:
Var Tabl: array [2001.. 2010, 1..12] of Real;
Продолжая по аналогии, можно определить трехмерный массив как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:
Var A: array[1..10, 1..20, 1..30] of Integer;
Это массив, состоящий из 10 • 20 • 30 = 6000 целых чисел и занимающий в памяти 6000 • 2 = 12 000 байтов. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение равно 64 килобайтам.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами.
В Паскале не допускается употребление динамических массивов, т. е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Const Imax = 10; Jmax = 20;
Var Mas: array[1..Imax, l..Jmax] of Integer;
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе — раздел констант.
Действия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:
• присваивание значений одного массива другому;
• применение к массивам операций отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
Пример 1
Var Р, Q: array [1.. 5, 1..10] of Real;
При выполнении операции присваивания
P:=Q
все элементы массива Р станут равными соответствующим элементам массива Q.
Пример 2
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Тогда если массив ТаЫ описан так:
Type mas = array [1..12] of Real;
Var Таbl: array [2001.. 2010] of mas;
и в нем требуется данные за 2009 год сделать такими же, как за 2001 год (девятой строке присвоить значение первой строки), то это можно сделать одним присваиванием:
Таbl [2009] : =Таbl [2001]
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
Р:=Таbl [2009] ; Таbl [2009] : =Таbl [2001 ] ; Таbl [2001] :=Р; где Р описана так:
Var Р: mas;
Ввод и вывод массивов производятся покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов:
For I: =1 То 12 Do
ReadLn(Т[I]);
For I:=l To Imax Do
For J:=l To Jmax Do
ReadLn(Mas[I, J]);
Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор Read.
Аналогично в цикле по индексной переменной организуется вывод значений массива на экран. Например:
For I: =1 То 12 Do Write (Т [ I ] : 8 : 4 ) ;
Напомним, что модификатор формата 8:4 означает вывод числа в формате с фиксированной точкой в 8 позициях, из которых в 4 последних позициях размещается дробная часть.
Следующий фрагмент программы организует построчный вывод матрицы на экран:
После вывода очередной строки матрицы оператор Writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Jmax не превышает 12 (подумайте почему).
1. Что такое регулярный тип данных? Что такое массив?
2. Какие типы допустимы для индексов массива?
3. Как в Паскале трактуется многомерный массив?
4. Какие действия можно выполнять над массивом как единым целым?
5. Дан вектор {z}, i = 1, …, 50. Составьте программу ввода значений и вычисления длины этого вектора по следующей формуле:
6. Даны значения массива {аi}, i = 0, ..., 10 и переменной х. Составьте программу вычисления алгебраического многочлена 10-й степени по формуле Горнера:
a10x10 + а9х9 + ... + а1х + а0 = ((...(а10х + а9)х + а8)х + ... + а1)х + а0.
Следующая страница Типовые задачи обработки массивов