Моделювання подання в пам'яті векторів і таблиць, страница 2

{ 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;

 Моменти часу

tar1, tar2, taw1, taw2 : longint;

tbr1, tbr2, tbw1, tbw2 : longint;

begin

{===== Частина 1. Перевірка формування масиву ======                                        }

XM:=10;

{ Запис елементів у 1-вимірний масив      }

k:=1;

for y:=1 to XM do

for x:=y 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;

{========= Частина 2. Хронометраж ================                                      }

XM:=100;

{ Заповнення нулями 2-вимірного масиву            }

for y:=1 to XM do

for x:=1 to XM do arru[y][x]:=0;

{ Запис елементів у 2-вимірний масив                  }

k:=1;

taw1:=GetTic;

for y:=1 to XM do

for x:=y to XM do begin

arru[y][x]:=k; k:=k+1;

end;

taw2:=GetTic;

{ Вибірка елементів з 2-вимірного масиву           }

tar1:=GetTic;

for y:=1 to XM do

for x:=1 to XM do h:=arru[y][x];

tar2:=GetTic;

{ Запис елементів у 1-вимірний масив                  }

k:=1;

tbw1:=GetTic;

for y:=1 to XM do

for x:=y to XM do begin

h:=PutTab(y,x,k); k:=k+1;

end;

tbw2:=GetTic;

{ Вибірка елементів з 1-вимірного масиву           }

tbr1:=GetTic;

for y:=1 to XM do

for x:=1 to XM do h:=GetTab(y,x);

tbr2:=GetTic;

                                                        {    Друк результатів хронометражу                       }

writeln('Повнодоступний варіант (запис)');

writeln('Початок - ',taw1);

writeln('Кінець  - ',taw2);

writeln('Повнодоступний варіант (читання)');

writeln('Початок - ',tar1);

writeln('Кінець  - ',tar2);

writeln;

writeln('Стислий варіант (запис)');

writeln('Початок - ',tbw1);

writeln('Кінець  - ',tbw2);

writeln('Стислий варіант (читання)');

writeln('Початок - ',tbr1);

writeln('Кінець  - ',tbr2);

end.

            2.5.2. Результат роботи програми

===== Матриця =====

1  2  3  4  5  6  7  8  9                            10

0 11 12 13 14 15 16 17 18                    19

0  0 20 21 22 23 24 25 26                     27

0  0  0 28 29 30 31 32 33                      34

0  0  0  0 35 36 37 38 39                       40

0  0  0  0  0 41 42 43 44                        45

0  0  0  0  0  0 46 47 48                         49

0  0  0  0  0  0  0 50 51                          52

0  0  0  0  0  0  0  0 53                           54

0  0  0  0  0  0  0  0  0                            55

===== Матриця (внутр.представлення) =====

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Повнодоступний варіант (запис)

Початок - 1050209

Кінець  - 1050210

Повнодоступний варіант (читання)

Початок - 1050210

Кінець  - 1050211

Стислий варіант (запис)

Початок - 1050211

Кінець  - 1050229

Стислий варіант (читання)

Початок - 1050229

Кінець  - 1050247

ДОДАТОК

Function GetTic : longint

Функція повертає поточне значення лічильника тіків таймера ПЕОМ.

Тік таймера - інтервал часу, що дорівнює приблизно 55 мсек. Поточне значення лічильника тіків визначається від моменту 0 година 0 хв 0 сек.

Визначена в Unit DataStr.