Планирование уроков на учебный год



Уроки 30 - 31
Работа с массивами
Практикум
Практическая работа № 3.6
"Программирование обработки одномерных массивов"
Практическая работа № 3.7
"Программирование обработки двумерных массивов"




Содержание урока

Массивы

Типовые задачи обработки массивов

Работа 3.6. Программирование обработки одномерных массивов

Работа 3.7. Программирование обработки двумерных массивов


Массивы






Массивом в Паскале называют переменную величину регулярного типа.

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

imageОписание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:

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;

До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.

imageМногомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).

В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют месяцам, а строки — годам.

image

Для обработки такой таблицы в программе следует описать массив:

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

imageДействия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:


• присваивание значений одного массива другому;
• применение к массивам операций отношения «равно», «не равно».

В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).

imageПример 1

Var Р, Q: array [1.. 5, 1..10] of Real;

При выполнении операции присваивания

P:=Q

все элементы массива Р станут равными соответствующим элементам массива Q.

imageПример 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;

imageВвод и вывод массивов производятся покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов:

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 последних позициях размещается дробная часть.

Следующий фрагмент программы организует построчный вывод матрицы на экран:

image

После вывода очередной строки матрицы оператор Writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Jmax не превышает 12 (подумайте почему).

image

Вопросы и задания


1. Что такое регулярный тип данных? Что такое массив?

2. Какие типы допустимы для индексов массива?

3. Как в Паскале трактуется многомерный массив?

4. Какие действия можно выполнять над массивом как единым целым?

5. Дан вектор {z}, i = 1, …, 50. Составьте программу ввода значений и вычисления длины этого вектора по следующей формуле:

image

6. Даны значения массива {аi}, i = 0, ..., 10 и переменной х. Составьте программу вычисления алгебраического многочлена 10-й степени по формуле Горнера:

a10x10 + а9х9 + ... + а1х + а0 = ((...(а10х + а9)х + а8)х + ... + а1)х + а0.

Следующая страница Типовые задачи обработки массивов









Наверх