Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
120
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

Var c : array[1..10,1..15,1..8] of real.

Компоненты многомерного массива располагаются в памяти таким образом, что наиболее быстро изменяется последний индекс, а наиболее медленно - первый индекс. По отношению к матрице это означает, что ее элементы располагаются в памяти по строкам: вначале все элементы первой строки в соответствии с описанием типа матрицы, затем все элементы второй строки и т.д.

Сравним расположение в памяти элементов одномерного массива и матрицы.

Const Mmax = 30; Nmax = 40;

Type Ar = array[1..Nmax] of byte;

Matrix = array[1..Mmax,1..Nmax] of byte;

Var X : Ar;

A : Matrix;

m, n : byte;

Предположим, что в программе введено n = 20 элементов массива X и элементов матрицы A ( Mmax, n Nmax).

В поле памяти, отведенном для массива X, будут последовательно заняты первые 20 байт. В отличие от этого, поле памяти A будет заполнено не всплошную, а фрагментарно элементами матрицы: 20 байтов первой строки, 20 свободных байтов, 20 байтов второй строки, 20 свободных байтов, …, 20 байтов пятнадцатой строки, 20 + 540 свободных байтов. Эту фрагментарность необходимо учитывать в ряде случаев при программной обработке матрицы.

Если A и B - массивы одного типа, то возможно присваивание B := A . Это связано с общим принципом работы оператора присваивания вида y := x - пересылка содержимого поля x в поле y. Если массивы A и B описаны одним именем типа, то это гарантирует, что структура и длина полей A и B одинаковы, в связи с чем не может быть нарушений работы программы при такой пересылке.

Пусть многомерный массив имеет k индексов (для матрицы k = 2). При обработке такого массива в общем случае производится изменение каждого его индекса. В связи с этим каждому индексу должна соответствовать отдельная переменная, которая при использовании оператора For является именем параметра цикла. Имена переменных-индексов не должны совпадать между собой.

Обработка многомерных массивов выполняется путем использования вложенных циклов, когда тело внешнего цикла содержит в своем составе другой цикл, являющийся для него внутренним.

В В О Д И П Е Ч А Т Ь Э Л Е М Е Н Т О В М А Т Р И Ц Ы

1. Ввод элементов матрицы с клавиатуры.

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

Const Mmax = 30; Nmax = 20;

Type Matrix = array[1..Mmax,1..Nmax] of real;

Var i,j,m,n : byte;

A : Matrix;

Begin

Writeln('Введите размеры матрицы m, n');

Read(m,n); Writeln('m= ',m,' n=',n);

For i:=1 to m do

For j:=1 to n do

Begin

Writeln('Введите элемент матрицы a[',i,',',j,']');

Read(a[i,j]);

End;

2. Ввод матрицы из текстового файла.

Ввод матрицы по концу файла, как это было сделано для одномерного массива, выполнить нельзя, так как при этом заранее неизвестно, сколько элементов содержится в одной строке матрицы (одно и то же общее количество элементов матрицы можно получить при различных значениях и ). Поэтому рекомендуется в первой строке текстового файла разместить значения и , а дальше - элементы матрицы. Количество таких элементов в одной строке текстового файла не лимитируется. Однако для удобства просмотра файла целесообразно каждую строку матрицы начинать с новой строки файла.

Пример размещения матрицы в файле:

5 8

22.8 34.9 56 -95 -84.9 77.98 5.0 1.8

-12.8 45.8 47 76 66.7 89.58 4.4 -3.6

53.6 -14.3 92 48 38.3 44.96 -1.6 7.9

32.7 69.9 21 -21 -92.6 96.92 8.2 5.0

42.4 74.2 39 -45 14.1 17.11 -9.8 6.1

Const Mmax = 30; Nmax = 20;

Type Matrix = array[1..Mmax,1..Nmax] of real;

Var i,j,m,n : byte;

A : Matrix;

FileA : text;

Begin

Assign(FileA,'Matrix.dat');

Reset(FileA);

Read(FileA,m,n);

For i:=1 to m do

For j:=1 to n do

Read(FileA,a[i,j]);

Close(FileA);

Если в файле Matrix.dat содержится менее элементов, то недостающим элементам будет присвоено нулевое значение; в противном случае часть данных из файла не будет использована.

Соседние файлы в папке LecRus