В
математике, как правило, индекс либо заключается в круглые скобки, либо
указывается несколько ниже имени массива, например:
А(1),
А(2), А(3), А(4), А(5) или А1, А2, А3, А4, A5, или в общем виде {Аi}
где i = 1, 2, 3, …, n.
В
языке ПАСКАЛЬ индекс заключается в квадратные скобки. Для рассмотренного
примера элементами массива А являются:
А[1] = 1.6, А[2] = 14.9, А[3] = -5.0, А[4] = 8.5, А[5] = 0.46.
Если в программе используется массив, то он должен быть описан либо в разделе переменных VAR, либо в разделе типов TYPE. Рассмотрим сначала описание массива в разделе переменных VAR. Форма описания имеет вид
VАR имя массива:
ARRAY [t1] OF t2;
Здесь ARRAY (массив); OF (из) - служебные слова; t1 - тип индекса, в качестве которого может быть любой простой тип, кроме типа REAL; t2 - тип элементов массива, допустимый на языке ПАСКАЛЬ.
Для предыдущего примера описание массива имеет вид
A: ARRAY [1...5] OF REAL;
Здесь А - имя массива, элементы которого имеют базовый тип REAL;
тип индекса - ограниченный от 1 до 5.
Следует отметить, что поскольку тип индекса не может быть стандартным целым или действительным типом, то нельзя делать следующее описание массива (часто встречающаяся ошибка)
A: ARRAY [5] OF REAL;
или
VAR A: ARRAY [INTEGER] OF REAL;
Примеры правильного описания массивов:
: ARRAY [1..N] OF REAL ;
ГОД : ARRAY [ЯНВАРЬ..ДЕКАБРЬ] OF INTEGER ;
Если несколько массивов имеют одинаковый тип индексов и одинаковый базовый тип, то допускается в описании объединять массивы в список, например
Здесь объявлено списком три массива А, В, С действительных чисел, каждый из которых содержит по 50 элементов (от 1 до 50):
[1], A[2], ..., А[50],[1], B[2], ..., B[50],[1], C[2], ..., C[50],
Нельзя путать понятия «индекс» и «тип индекса». Тип индекса используется только в разделе описания массива, а индекс указывается в разделе операторов для обозначения конкретных элементов массива. При этом индекс должен быть того же типа, что и описание типа индекса.
В качестве индекса может быть выражение, частным случаем которого является константа или переменная. Элемент массива иначе называется переменной с индексом. В отличие от нее переменная без индекса называется простой переменной.
Элементы массива могут стоять как в левой части оператора присваивания, так и в выражениях.
Над элементами массива можно производить те же операции, которые
допустимы для данных его базового типа. Если базовый тип есть INTEGER, то
допустимы все операции над данными целого типа, включая и стандартные функции.
Примеры использования элементов массива в разделе операторов:
В[5] := В[3] +1;:= SUM - C[K];
Р1:= А[2*I+1] ;
Для ввода и вывода числовых значений массива используются циклы. Например, цикл
FOR I := 1 ТО 9 DO(A[I]) ;
организует ввод девяти значений элементов массива А:
А[1], А[2],...,А[9],
а цикл
FOR I := 1 ТО 9 DO(А[I]) ;
вывод девяти значений элементов того же массива.
В языке ПАСКАЛЬ помимо явного описания массивов в разделе переменных имеется другая форма описания, состоящая из двух этапов.
Сначала в разделе описания типов TYPE указывается тип массива. Затем в разделе описания переменных VAR перечисляются массивы, относящиеся к указанному типу.
Введение типа массива увеличивает раздел описаний, но в то же время упрощает отладку программы и удерживает от абсурдных ошибок, таких, как сложение «ЯБЛОК», с «УСКОРЕНИЕМ СВОБОДНОГО ПАДЕНИЯ».
Указание типов в разделе описаний помогает достичь логической ясности
программы и является хорошим стилем программирования. Форма объявления массива
имеет вид
ТУРЕ имя типа = ARRAY [t1] OF t2;имя массива: имя типа;
Здесь t1 - тип индекса; t2 - базовый тип элементов массива.
Пусть, например, в программе используется массив R, состоящий из 10 элементов действительного типа. Обозначим тип массива именем MAS. Тогда описание массива можно выполнить следующим образом:
TYPE MAS = ARRAY [1..10] OF REAL;R: МAS ;
Если в программе несколько массивов, например R, А, В, С, имеют тип MAS, то изменится лишь раздел описания переменных
R, А, В, С: MAS;
Следует отметить, что массивы R, А, В, С используются в разделе операторов программы. Тип массива MAS введен формально только в разделе описаний и нигде в программе не указывается и не обрабатывается.
До сих пор мы рассматривали массивы, каждый элемент которых содержал только один индекс. Такие массивы обычно называются одномерными. В математике часто используются многомерные массивы, т. е. массивы массивов.
Особенно широкое распространение получили двухмерные массивы, иначе называемые
матрицами. Например, изображение целых чисел последовательно в нескольких
строках является матрицей:
4 3 6
8 1 7
3 9 5
Данная матрица имеет размер 3 на 4, т. е. она состоит из трех строк и четырех столбцов. Если всю матрицу обозначить одним именем, например А, то каждый элемент матрицы обозначается с двумя индексами, например A[I, J]. Здесь первый индекс I обозначает номер строки (I = 1, 2, 3), второй индекс J - номер столбца (J = 1, 2, 3, 4). Такую матрицу можно описать следующим образом (с использованием имени типа Т):
1)
TYPE Т = ARRAY [1..3, 1..4] OF
INTEGER;
VAR A: T;
2) TYPE T = ARRAY [1..3] OF ARRAY [1..4] OF INTEGER ;
VAR A: T;
В первом случае описывается каждый тип индекса, затем указывается простой базовый тип элементов массива INTEGER.
Во втором случае сначала описывается тип данных индекса [1..3], затем указывается сложный базовый тип
[1..4] OF INTEGER;
который в свою очередь содержит описание типа другого индекса и простого базового типа INTEGER.
Если в программе необходимо выделять отдельные строки матрицы, то удобно
ввести такое описание:
Т1 = ARRAY [1..4] OF INTEGER;
Т = ARRAY [1..3] OF T1;: T;
В: Т1 ;
Здесь сначала описывается тип одной строки Т1, а затем через тип строки
Т1 - тип всей матрицы Т. В разделе переменных указывается, что А является
двухмерным массивом, т. е. матрицей, а В - одномерным массивом.
Программа должна корректно работать на следующем или совместимым с ним оборудовании:
§ ПЭВМ IBM PC Pentium и выше;
§ объем свободной оперативной памяти 16 Мб;
§ свободный объем жесткого диска 1 Мб;
§ видеоадаптер SVGA;
§ стандартная клавиатура 101/102;
§ манипулятор типа «мышь»;
§ монитор, поддерживающий режим работы SVGA;
Требования к программным средствам, используемым программой:
Для корректного компилирования и запуска программы необходима
операционная система MS-DOS, Windows XP/7, среда
программирования Turbo Pascal не ниже версии 7.
Входные данные:
§ размерность массива M´N (число строк и столбцов соответственно);
§ двумерный массив целых чисел размерностью M´N.
Выходные данные:
§ произведение всех элементов каждого столбца массива;
§ четыре вектора, составленные из элементов первых четырех строк;
§ количество инверсий (т.е. таких пар элементов, в которых большее число
находится слева от меньшего) для каждого вектора.
. Произведение элементов каждого столбца.
Вычисление произведения производится по рекуррентному выражению
П = П´Y
где П - накапливаемое произведение; Y - сомножители. По данному выражению каждое новое значение получается из предыдущего добавлением очередного множителя.
Для первого сомножителя Y
начальное значение произведения П = 1 (если считается произведение всех
элементов).
Алгоритм. Расчет произведения элементов столбцов
1 цикл по j от 1 до n
pj = 0
pj = pj* aij
5 конец цикла по i
6 конец цикла по j
. Формирование векторов
Алгоритм заключается в следующем: в цикле элементы соответствующих строк
матрицы переписываются в вектора (при условии, что число строк матрицы не менее
4).
Алгоритм. Формирование одномерных массивов
1 цикл по j от 1 до n
A1i = А1j
A2i = А2j
4 A3i = А3j
A4i = А4j
конец цикла по j
. Определение количества инверсий.
Для подсчета количества инверсий необходимо выполнять следующие шаги:
обнуляем счетчик инверсий; просматриваем массив от первого до предпоследнего
элемента; сравниваем соседние элементы; если текущий элемент больше следующего,
увеличиваем счетчик инверсий на 1. Процесс повторяется пока не будет
просмотрены все пары элементов.
Алгоритм. Количество инверсий
1 k = 0
2 цикл по i от 1 до n - 1
если ai > ai+1 то
k = k + 1
конец если
6 конец цикла по i
Блок - схема алгоритма вычисления произведения элементов каждой строки
матрицы
Блок - схема алгоритма подсчета количества инверсий вектора
Разработанная программа предназначена для обработки массивов и выполняет следующие функции:
§ ввод матрицы с клавиатуры, файла или заполнение при помощи случайных чисел;
§ расчет произведения элементов каждого столбца матрицы;
§ формирование из строк матрицы одномерных массивов;
§ подсчета количества инверсий каждого вектора.
Запуск программы Turbo Pascal выполняется любым из стандартных способов запуска, предусмотренных в OC Windows (например, с помощью ярлыка на рабочем столе).
Для перехода к выбору команд главного меню используется клавиша F10. Для возврата в режим редактирования нужно нажать клавишу ESC.
Для получения справки используются клавиши:- получение контекстно-зависимой справки;+F1 - выбор справки из списка доступных справочных сообщений;+F1 - получение справки о нужной стандартной процедуре, функции, о стандартной константе или переменной.
Текст программы набирается в текстовом редакторе среды Turbo Pascal.
После заполнения очередной строки следует нажать клавишу ENTER, чтобы перевести курсор на следующую строку.
Наиболее часто используемые команды редактора Turbo Pascal:
смещение курсораUp - на страницу вверх;Down - на страницу вниз;- в начало текущей строки;- в конец текущей строки;
Сtrl+ Page Up - в начало текста;
Сtrl+ Page Down - в конец текста.
команды редактирования- стирает символ слева от курсора;- стирает символ, на который указывает курсор;+Y - стирает строку, в которой расположен курсор;- вставляет новую строку, разрезает старую;
Сtrl+Q L - восстанавливает измененную строку (действует, если курсор не покидал строку после ее изменения).
работа с блоками+K B - начинает выделение блока;+K K - заканчивает выделение блока (кроме того, блок можно выделить с помощью мыши);+K Y - уничтожает выделенный блок;+K С - копирует блок;+K V - перемещает блок на новое место;+K W - записывает блок в файл;+K R - читает блок из файла;+K P - печатает блок.
Набранный текст программы запишем в файл. Клавишей F2 вызывается окно диалога, в котором следует задать имя файла.
После подготовки текста программы нужно попытаться исполнить ее, т.е. откомпилировать программу, связать ее (если это необходимо) с библиотекой стандартных программ и функций, загрузить в оперативную память и передать ей управление. Эта последовательность действий - прогон программы - осуществляется после нажатия клавиш CTRL+F9.
Если в программе нет синтаксических ошибок, то все действия выполняются последовательно одно за другим, при этом в небольшом окне сообщается о количестве откомпилированных строк и объеме доступной памяти. Перед передачей управления загруженной программе среда выводит на экран окно прогона программы, а после завершения работы восстанавливает на экране окно редактора.
Если на каком-то этапе среда обнаружит ошибку, она прекращает дальнейшие действия, восстанавливает окно редактора и помещает курсор на ту строку программы, при компиляции или исполнении которой обнаружена ошибка. При этом в верхней строке редактора появляется диагностическое сообщение о причине ошибки. Все это позволяет отладить программу, т.е. устранить в ней синтаксические ошибки и убедиться в правильности ее работы.
С помощью клавиш ALT+F5 в любой момент можно просмотреть данные, выданные
на экран в результате прогона программы.
Разработанная программа состоит из одного модуля MATMAS4.PAS. Рассмотрим его состав.
Пользовательские типы:- одномерный массив вещественных чисел максимальной размерности 10 элементов.- двумерный массив векторов Vector максимальной размерности 10.
Константы:= 6 - количество команд меню;- строковой массив названий команд меню;- массив координат точек привязки команд меню;- массив цветов фона блоков команд.
Глобальные переменные:- количество инверсий для каждого массива, тип integer;
nfont - номер внешнего экранного шрифта, тип integer;, j - параметры циклов, тип integer;- номер графического драйвера, тип integer;- номер режима работы монитора, тип integer;, N - число строк и столбцов матрицы соответственно, тип integer;- служебная строка, тип string;- номер нажатой кнопки, тип integer;- исходная матрица, тип Matrix;- произведение элементов столбцов матрицы, тип Vector;, Vrow2, Vrow3, Vrow4 - сформированные массивы, тип Vector;- файловая переменная, тип text.
Подпрограммы пользователя.
Процедура Border(x1, y1, x2, y2, color)
Назначение: вывод рамки.
Входные параметры:, y1, x2, y2 - координаты левого верхнего и правого нижнего угла рамки, тип integer;- цвет рамки, тип integer.
Процедура TextBar(x, y, L, h, forecolor, backcolor, txt, textcolor, fsize)
Назначение: вывод прямоугольника с текстом внутри.
Входные параметры:, y - координаты левого верхнего угла прямоугольника, тип integer;- длина прямоугольника, тип integer;- высота прямоугольника, тип integer;
forecolor - цвет рамки, тип integer;- цвет заливки, тип integer;- текст, тип string;- цвет текста, тип integer;
fsize - высота текста, тип integer.
Процедура MainMenu(i)
Назначение: выбор пункта меню.
Входные параметры:- номер текущего пункта меню, тип integer.
Выходные параметры:- номер выбранного пункта меню, тип integer.
Процедура MainScreen
Назначение: вывод главного окна программы.
Процедура WorkWin(x0, y0, x1, y1, forecolor, backcolor, textcolor, fsize)
Назначение: рабочее окно.
Входные параметры:, y0, x1, y1 - координаты левого верхнего и правого нижнего угла рамки, тип integer;
textcolor - цвет текста, тип integer;- высота текста, тип integer.
Процедура InMatrix(A, M, N, sender)
Назначение: ввод матрицы с клавиатуры или при помощи генератора случайных чисел.
Входные параметры:- флаг ввода: 1 - клавиатура, 0 - автозаполнение.
Выходные параметры:- исходная матрица, тип Matrix;, N - число строк и столбцов матрицы соответственно, тип integer.
Локальные переменные:, j - параметры циклов, тип integer.- служебная строка, тип string.
Процедура LoadMatrix(A, M, N)
Назначение: чтение матрицы из файла.
Выходные параметры:- исходная матрица, тип Matrix;, N - число строк и столбцов матрицы соответственно, тип integer.
Локальные переменные:, j - параметры циклов, тип integer;- указатель на текстовый файл, тип text;- служебная строка, тип string.
Процедура SaveMatrix(A, M, N)
Назначение: запись матрицы в файл.
Выходные параметры:- исходная матрица, тип Matrix;, N - число строк и столбцов матрицы соответственно, тип integer.