Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭОМ 1 ЛАБА.doc
Скачиваний:
21
Добавлен:
14.02.2015
Размер:
117.25 Кб
Скачать

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.

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