Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
infa.docx
Скачиваний:
0
Добавлен:
25.09.2019
Размер:
99.7 Кб
Скачать

Вопрос19

На практике массивы размерности более двух (r>2) используются довольно редко. Логическая структура двухмерного массива может быть представлена прямоугольной мартицей.

Описание матрицы 610

const n=10;

m=6;

type TMatrix=array[1..m,1..n] of integer;

var mtr: TMatrix;

Обход элементов матрицы

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

var mtr: TMatrix; {матрица m*n}

i:integer; {счетчик по строкам от 1

до m}

j:integer; {счетчик по столбцам от1

до n}

begin

for i:=1 to m do

for j:=1 to n do

mtr[i,j]:=i*j;

end.

Поиск элемента в матрице

Составим процедуру для поиска максимального элемента матрицы и его индексов (координат).

procedure SearchMax(a:TMatrix;

var amax:integer; {искомый элемент}

var imax,jmax:integer;); {его координаты}

var i:integer; {счетчик по строкам от

1 до m}

j:integer; {счетчик по столбцам от

1 до n}

begin

amax:=a[1,1];

imax:=1; jmax:=1;

for i:=1 to m do

for j:=1 to n do

if a[i,j]>amax then

begin

amax:= a[i,j];

imax:=i; jmax:=j;

end;

end;

...

Если в матрице содержится несколько элементов с максимальным значением, то данный алгоритм найдет первый из них.

Составим функцию для проверки симметричности квадратной матрицы.

const n=7;

type TMatrix=array[1..n,1..n] of integer;

function Symmetric(m:TMatrix):boolean;

var i:integer; {счетчик по строкам}

j:integer; {счетчик по столбцам}

begin

Symmetric:=true;

for i:=1 to n-1 do

for j:=i+1 to n do

if m[i,j]<>m[j,i] then Symmetric:=false;

end;

...

В общем случае матричные операции некоммутативны. То есть результат

операции зависит от порядка следования операндов. Например, при умножении вектора-столбца на вектор-строку получается квадратная матрица:

Рассмотрим пример процедуры для вычисления произведения матрицы размерности 34 и вектора-столбца (41). Результатом такой операции будет

вектор-столбец размерности 31.

const m=3;

n=4;

type TnVector=array[1..n] of integer;

TMatrix=array[1..m,1..n] of integer;

TmVector=array[1..m] of integer;

procedure Mult(mtr:TMatrix; v:TnVector; var res:TmVector);

var i:integer; {счетчик по строкам}

j:integer; {счетчик по столбцам}

begin

for i:=1 to m do res[j]:=0; {обнуление вектора-

результата}

for i:=1 to m do

for j:=1 to n do

res[i]:= res[i]+mtr[i,j]*v[j];

end;

Вопрос20

Для работы с комбинациями данных разных типов предназначен комбинированный тип данных – запись. Запись – структурированный тип,

состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи. Каждое поле записи имеет свое имя.

Для использования записей, вначале необходимо описать тип записи

Например, опишем личную карточку успеваемости студента:

type

TStudentCard = record

SurName : string[20]; {фамилия}

Name : string[20]; {имя}

BirthYear : integer; {годрождения}

HomeAddress : string; {домашний адрес}

GroupCode : string[7]; {шифр группы}

MathAnal : byte; {оценка по Мат анализу}

LinAlg : byte; {оценка по Лин.алгебре}

Phys : byte; {оценка по Физике}

Inform : byte; {оценка по Информатике}

end;

var

st1, st2 : TStudentCard;

Поля-записи

А лучше описать следующим образом:

type

TMarks = record {типоценки}

MathAnal : byte; {по Мат.анализу}

LinAlg : byte; {по Лин. алгебре}

Phys : byte; {поФизике}

Inform : byte; {пИнформатике}

end;

TStudentCard = record

SurName : string[20]; {фамилия}

Name : string[20]; {имя}

BirthYear : integer; {год рождения}

HomeAddress : string; {домашний адрес}

GroupCode : string[7]; {шифр группы}

Marks : TMarks; {оценки}

end;

Работа с полями

Обращение к полям записей выполняется с помощью составных имен (называемых квалифицируемыми или уточненными идентификаторами), в которых указывается вся цепочка имен от имени переменной типа запись до

имени требуемого поля. Имена полей разделяются точками. Например, пусть для последнего варианта описания карточки студента будут объявлены следующие переменные:

var

stud1, stud2: TStudentCard;

Тогда будут корректными следующие операторы и обращения к полям записей:

begin

stud1.Name:=’Сергей’;

stud1.BirthYear:=1990;

stud1.Marks.Inform:=5;

stud2.Marks:=stud1.Marks;

stud2:=stud1;

...

end.

Для последнего варианта описания карточки студента объявим тип-массив и

переменные-массивы:

type

TGroup = array[1..25] of TStudentCard;

var

group1, group2: TGroup;

Тогда будут корректными следующие операторы и обращения к полям записей:

begin

group1[1].SurName:= ’Иванов’;

group1[1].Name:= ’Алексей’;

group1[1].BirthYear:=1988;

group1[1].Marks.MathAnal:=5;

group1[1].Marks.Inform:=4;

...

group2[2].Marks:=group1[1].Marks;

...

group2[5]:=group1[3];

...

group1:=group2;

...

end.

Оператор присоединения with

Для упрощения доступа к полям записей и придания программе большей наглядности используется оператор присоединения with. Синтаксис оператора присоединения:

with записьdo оператор;

with записьdo begin {составной оператор}

оператор;

оператор;

...

end;

Например, в предыдущем фрагменте программы можно сократить текст:

with group1[1] do begin

SurName:= ’Иванов’;

Name:= ’Алексей’;

BirthYear:=1988;

Marks.MathAnal:=5;

Marks.Inform:=4;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]