Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект_лекций.doc
Скачиваний:
18
Добавлен:
26.04.2019
Размер:
1.11 Mб
Скачать

13.1. Программа использующая динамические переменные

Задача: написать процедуру умножения квадратной матрицы A={aij}, размером 66, на свою транспонированную AT с размещение результата на месте исходной матрицы A.

Сложность задачи заключается в том, что даже такая простая операция как умножение матрицы на саму себя без привлечения вспомогательных (рабочих) массивов невозможна! Как минимум, требуется один одномерный (строка матрицы) вспомогательный массив. Для упрощения структуры алгоритма и, как следствие - объема создаваемой программы, воспользуемся двумя вспомогательными массивами-матрицами.

Алгоритм:

  • Транспонированную матрицу разместим в рабочем (вспомогательном динамическом) массиве B= AT,

т.е. bij=aji для всех i=1, 2, …6 и j=1, 2, …6.

  • Результат перемножения также разместим в рабочем (вспомогательном динамическом) массиве C=A AT=A B={cij}, где коэффициенты матрицы С вычимсляются по формуле:

6

cij = ∑ aikbkj

k=1

  • Перепишем (скопируем) информацию из динамического массива C в массив исходных данных A и освободим память от более не нужных динамических массивов B и С.

Type T=array[1..6, 1..6] of real; {тип переменных для размещения матриц}

Procedure PAAT(Var A: T); {параметр А для ввода-вывода данных, т.е. передает

исходную матрицу и возвращает результирующую}

Var B, C:^T; {рабочие динамические переменные}

I, j, k: integer; {рабочие статические переменные - счетчики циклов}

Begin

New(B); New(C); {отведение места в оперативной памяти

для динамических переменных}

For i:=1 to 6 do {вычисление транспонированной матрицы}

For j:=1 to 6 do

C^[I,j]:=A[j,i];

For i:=1 to 6 do {перемножение матриц}

For j:=1 to 6 do

Begin

C^[i,j]:=0;{предваряющее обнуление вычисляемого элемента матрицы Сij}

For k:=1 to 6 do {перемножение «строки на столбец»}

C^[i,j]:= C^[i,j]+A^[I,k]*B^[k,j];

End;

A:=C^; {перепись-копирование содержимого однотипных переменных}

Dispose(B); Dispose(C); {освобождение памяти занятой

под рабочие динамические переменные}

End; {конец описания процедуры}

§14. Переменные типа record

Опр. Запись (record) – информационный объект объединяющий в единое целое нескольких информационных объектов разного типа.

Для обеспечения доступа к образующим объект-record элементам, эти элементы наделяются уникальными, но только внутри самого объекта, именами.

Синтаксис описания новой структуры (типа) класса record:

Type Итипа= record

ИмяИО1: ТипИО1;

ИмяИО2: ТипИО2;

.........

end;

  • Итипа – идентификатор (название) вводимой (придумываемой программистом!) структуры информационного объекта,

  • = – символ-разделитель (избыточный синтаксис языка),

  • Record – ключевое слово описания структуры,

  • ИмяИО1 – идентификатор (название) элемента включаемого в структурированный информационный объект,

  • : - символ-разделитель (избыточный синтаксис языка),

  • ТипИО1 –описание типа этого элемента,

  • ; – символ-разделитель описаний отдельных элементов (избыточный синтаксис языка),

  • end – стандартный символ-разделитель, фиксирующий конец описания новой структуры.

Пример:

{Прагматика: Переменные типа TLL будут использованы для размещения исходных данных о ломаных линиях с количеством узловых точек от 1 до 100}

Type TLL = record

N: byte; {кол-во заданных узлов ломаной}

X, Y: array[1..100] of real { декартовые координату узловых точек}

end;

Семантика оператора: запомни имя TLL как название структуры информационных объектов из класса RECORD, которые состоят из переменной с именем N типа BYTE и вещественных массивов с именами X и Y.

Фрагмента оперативной памяти содержащий переменную типа TLL :

N

X[1]

X[2]

....

X[100]

Y[1]

...

Y[100]

.......

1 байт

6 байт

6 байт

6 байт

6 байт

6 байт

.........

Команда на отведение места памяти для размещения двух переменных с именами L1, L2 и типа TLL имеет стандартный вид:

Var L1, L2: TLL;

Для обращения (доступ для чтения или записи информации) к элементам, входящим в структурированный объект, необходимо использовать составные имена: имя переменной типа RECORD и, через точку-разделитель, имя элемента входящего в эту переменную.

Примеры:

L1.N:=35; {внести в запись L1 значение переменной N}

For i:=1 to 5 do Write(L2.x[i]); {распечатать на экране первые пять значений

массива X, входящего в запись L2 }

Правила языка Pascal допускают только три стандартные операции работы с переменными типа Record как с единым целым:

  1. Пересылка (копирование) всей информации из одной переменной в другую переменную того же типа: L1:=L2;

  2. Побитное сравнение информации двух однотипных переменных:

If L1=L2 then ..{ полное совпадение содержимого переменных L1 и L2}

else. .{ битовое наполнение переменных L1 и L2 отличается}

  1. Чтение и запись информации типизированных файлов.

Введение в язык Pascal структурированных переменных RECORD является подготовительным этапом к образованию качественно нового класса информационных объектов типа OBJECT (CLASS), которые являются базовым инструментарием объектно-ориентированного программирования (ООП) и языка Delphi – прямого наследника языка Pascal в среде Windows.