- •Лабораторная работа 1
- •5. Пример решения задачи
- •5.1 Индивидуальное задание
- •5.2. Разработка алгоритма решения
- •5.2.2. Структура программы
- •5.2.3. Описание переменных
- •5.2.4. Описание программы
- •5.3. Текст программы
- •5.4. Результаты работы программы:
- •6. Оформить отчет
- •5. Пример решения задачи
- •Лабораторная работа 3
- •1. Цель работы
- •2. Прорабатываемые темы
- •3. Постановка задачи
5. Пример решения задачи
5.1 Индивидуальное задание
Матрица целых чисел, в которой все элементы, лежащие ниже главной диагонали нулевые.
5.2. Разработка алгоритма решения
5.2.1. Выбор метода. Во внутреннем представлении нет необходимости хранить элементы, нулевые по определению:
M[x,y] = 0 при x<y.
Если исключить нулевые элементы из хранения и представить матрицу в виде одномерного массива, то формула перехода от двухкоординатного обращения к однокоординатному запишется как:
j = СУММА[i= от 1 до y-1](XM-(i-1)) + x-(y-1) (5.1)
где |
x, y |
- номера столбца и строки соответственно; |
|
XM |
- число элементов в строке. |
5.2.2. Структура программы
Программа состоит из основной программы и трех процедур/функций.
Function NewIndex(y, x : integer) : integer; - функция выполняет переход от индексов в матрице - x,y - к одному индексу в одномерном массиве по приведенной выше формуле. Функция возвращает индекс для массива.
Function PutTab(y,x,value : integer) : integer; - функция выполняет запись значения value в сжатое представление матрицы на место, определяемое координатами x,y. Если координаты определяют место элемента, нулевого по определению, запись не производится и функция возвращает 0, в противном случае она возвращает значение value.
Function GetTab(y,x: integer) : integer; - функция возвращает значение, выбранное из матрицы по координатам x,y, в том числе и 0 для "пустых" мест матрицы.
5.2.3. Описание переменных
Переменные, глобальные для всего модуля:
arru - массив, представляющий матрицу традиционным образом, используется для сравнения времен доступа;
arrp - массив, представляющий сжатую матрицу;
XM - размер матрицы.
5.2.4. Описание программы
Функция NewIndex реализует вычисления по формуле (5.1). Переменная d используется как накопитель суммы.
Функция PutTab проверяет условие нахождения элемента ниже главной диагонали (x<y). Если это так, функция возвращает 0, в противном случае при помощи функции NewIndex вычисляется индекс в массиве arrp, производится запись в arrp и возврат value.
Функция GetTab проверяет условие нахождения элемента ниже главной диагонали. Если это так, функция возвращает 0, в противном случае при помощи функции NewIndex вычисляется индекс в массиве arrp, и возвращаемое значение выбирается из arrp.
Алгоритм основной программы может быть разбит на 2 части. Часть 1 предназначена для проверки правильности формирования сжатого представления матрицы. Она работает с матрицей размера 10х10 (так удобнее для отображения), поэтому в начале этой части задается XM:=10. Далее формируется содержимое матрицы таким образом, чтобы в ненулевые элементы записывались последовательно возрастающие числа. Затем проверяется правильность доступа к матрице - при всех возможных значениях x и y выводятся на печать значения, возвращаемые функцией GetTab. И наконец проверяется сжатое представление матрицы - последовательно выводится на печать массив arrp.
5.3. Текст программы
Program LAB2;
Var
arrp: array[1..5050] of integer; { Сжатая таблица }
XM : integer; { Максимальные индексы в таблице }
{==== Функция перевычисления индексов ====}
{ y,x - индексы в 2-мерном массиве. Ф-ция возвращает индекс в 1-мерном массиве }
Function NewIndex(y, x : integer) : integer;
var i, d: integer;
begin
d:=0;
for i:=1 to y-1 do d:=d+XM-i+1;
NewIndex:=d+x-y+1;
end;
{==== Функция записи в сжатое представление массива ====}
{ y, x - индексы в 2-мерном массиве, value - записываемое значение.
Функция возвращает записываемое значение или 0 - если (x,y)
задают индексы элемента, нулевого по определению }
Function PutTab(y,x,value : integer) : integer;
begin
if x < y then PutTab:=0
else begin
arrp[NewIndex(y,x)]:=value;
PutTab:=value;
end;
end;
{==== Функция выборки из сжатого представления массива ====}
{ y, x - индексы в 2-мерном массиве. Функция возвращает выбранное значение }
Function GetTab(y,x: integer) : integer;
begin
if x < y then GetTab:=0
else GetTab:=arrp[NewIndex(y,x)];
end;
{============= Главная программа ===================}
Var
x, y : integer; { Индексы в 2-мерном массиве }
k, h: integer;
begin
{===== Проверка формирования массива ======}
XM:=10;
{ Запись элементов в 1-мерный массив }
k:=1;
for y:=1 to XM do
for x:=1 to XM do begin
h:=PutTab(y,x,k); k:=k+1;
end;
{ Распечатка матрицы }
writeln('===== Матрица =====');
for y:=1 to XM do begin
for x:=1 to XM do write(GetTab(y,x):3);
writeln;
end;
{ Распечатка внутреннего представления матрицы }
writeln('===== Матрица (внутр.представление) =====');
for y:=1 to 55 do write(arrp[y]:4);
writeln; writeln;
end.