UF

 Мәліметтердің динамикалық құрылымы. Сілтемелер. Кезектер және ағымдармен жұмыс істеу.

    жоспары:

1. Динамикалық жад

2. Сілтемелер

                       

Негізгі ұғымдардың сөздігі: сегмент, жад, үйінді, стек, сілтемелер.

Студенттерде қалыптасу керек білім мен дағды: динамикалық  жад түсінігін, сілтемелер түрлерін, динамикалық айнымалыны құру процедураларын меңгеру.                     

 

12.1. Динамикалық жад

 

Физикалық принциптерге сүйене отырып, әдетте жад 0-ден бастап нөмірленетін байттар тізбегі түрінде қарастырылады. Әр нөмір сол байттың адресі. Өлшемдері 65536 (64кбайт) байттан аспайтын жад бөліктері сегменттер делінеді. Олар 16-ға бөлінетін адрестерден басталады. Сонымен жад көптеген сегменттерден тұрады. Сегменттерді бөлу және оларға айнымалыларды, констант түрлерін, программаның кодын орналастыруды жүйе автоматты түрде, өзі орындайды.Транслятор орналастыратын айнымалылар статикалық, ал программаның орындалу барысында орын бөлуді қажет ететін айнымалылар динамикалық делінеді. Статикалық айнымалылар Турбо Паскальда программаның VAR бөлімінде сипатталынады да, оларға жадтың берілгендер сегментінен орын бөлінеді. Ал блоктардағы (процедуралар мен функциялар) сипатталынған жергілікті (локальді) айнымалыларға бөлек стек сегментінен орын бөлінеді. Әдетте стек өлшемі 16384 байт. Оны 64 кбайтқа {$M} директивасымен ұлғайтуға болады. Стандартты процедуралар мен функциялардың да берілгендері стек сегментіне орналасады. Программадағы айнымалыларға берілгендер сегментінен, стек сегментінен орын жетпегенде динамикалық бөлінетін жадты пайдалану қажет болады. Динамикалық бөлінетін жад – жүйелік программалар орналаспайтын, қалған бос жад. Оны үйінді (кучка) деп те атайды. Динамикалық жадтың өлшемі әдетте 0, ал ең үлкен өлшемі – 655360. Программамен жұмыс істеу кезінде әдетте айнымалылар мен тұрақтылардың жадтың қай орнына жазылатыны ескерілмейді де, олардың атаулары бойынша жұмыс істей беріледі. Бұл әдіс үлкен орынды талап ететін берілгендерді өңдегенде қиындықтар тудырады. Мысалы, массивтермен жұмыс істеу үшін оларды алдын ала сипаттап (жадтан орындар бөліп) қою керек. Кіші көлемді массивпен жұмыс істеу кезінде үлкен орын бөлу жадты үнемі пайдалану тәсіліне жатпайды. Кейде 64 Кбайттан артық орын алатын үлкен көлемді берілгендермен жұмыс істеуге тура келеді. Турбо Паскальда бір типті берілгендер үшін 64 Кбайттан артық орын (сегмент) бөлінеді де, орын жетіспегені жөнінде хабар беріп, компьютер тоқтап қалады. Мұндай жағдайда, немесе жалпы жадты тиімді пайдалану әдісі – сілтемені және динамикалық бөлінетін жадты (ДБЖ) пайдалану.

ДБЖ – ның өлшемінің 0-ге дейін азаюын және ең үлкен шегіне жетуін келесі директива арқылы өрнектеуге болады:

{$M<стек өлшемі>,<үйінді минимумы>,<үйінді максимумы>}, үйіндіден орын алатын айнымалылар динамикалық айнымалы делінеді.

12.2. Сілтемелер

Мәні адрес болып келген айнымалылар нұсқағыштар (көрсеткіштер) делінеді.  Нұсқағыштар – типсіз, типтік болып екіге бөлінеді. Типсіз сілтемелердің сипатталынуы:

Var < сілтемелер  тізімі>: Pointer; Мысалы, Р: Pointer;

Типтік сілтемелердің сипатталуы:

Var < нұсқағыштар  тізімі>: ^ <базалық тип аты>.

Типтік сілтеме - динамикалық айнымалы деп аталатын, кез келген басқа базалық тип айнымалысына сілтеу.

Мысалы:

Var

PINT: ^ Integer; { PINT  - бүтінге сілтеме}

P_ String: ^ String; { P_ String - жолдық қатарға сілтеме}

T: ^ Array [1..5] of real; {қатарға сілтеме}

Адресі сілтемеде көрсетілген деректерді, сілтеме атынан кейін ^ таңбасын жазу арқылы алуға болады.

Pint ^:=2 { Pint – те көрсетілген адреске 2-ні меншіктеу}

P_ String^: = ‘университет’;

Меншіктеу операторының орнына әдеттегідей енгізу операторын пайдалану да мүмкін: read (p^).

Динамикалық жадтан айнымалы үшін орын бөлінуі динамикалық айнымалының құрылуы деп түсінеміз. Динамикалық айнымалылар құрылмай тұрғанда сілтемелер мәні анықталмайды. Оған дейін сілтемеге арнайы мән беруге болады. Pint: = Nil;

Динамикалық айнымалыны құру үшін NEW процедурасы қолданылады. Мысалы, NEW (Т); яғни динамикалық айнымалы құрылады. Әзірше оның компоненттері анықталмаған. Динамикалық айнымалының өз аты жоқ, олар сілтеме атауы және ^ – таңбасы арқылы белгіленеді.

Мысалы, Т – массивінің 3-ші элементі – Т ^[3]

Сонымен NEW (< типтік сілтеме >) динамикалық айнымалы құрады да, ал DISPOSE (< типтік нұсқағыш>) жадты үйіндіге босатып қайтарады.

Мысалы,

VAR PS: ^ String;

Begin

New (PS) ;            {256 байт жад бөлінеді}

PS ^ : = ‘Динамикалық жад’;

Writeln (PS^);

         Dispose (PS); {PS^ - жад бөлігі босады}

End.

NEW – процедурасы арқылы ДБЖ-дан бөлінетін орын қажетті мөлшерден үлкен болуы мүмкін. GetMem процедурасы жадтан қажетті орын бөліп, оның адресін сілтемеге салады.

         GetMem (<сілтеме >, < байд өлшемімен жад бөлігі>);

GetMem (Р, 1000); {1000 байт жад аймағы бөлініп, оның адресі Р-ға жазылады}.

NEW және GetMem процедураларымен бөлінген жад өлшемі 8-ге бөлінетіндей болып толықтырылады және ДБЖ сегменттерінің бастапқы адрестері 8-ге бөлінеді.

Егер үйіндіде қажетті жад мөлшері болмаса, экранға мынадай хабарлама шығады:

Runtime Error 203 …

Мұндай үйінді толып қалатын жағдай болмау үшін, динамикалық жадты пайдалану қажеттігі болмаған кезде оны босатып, үйіндіге қайтарып беріліп отырғаны жөн. Ол үшін Dispose және FreeMem процедуралары қолданылады.

FreeMem процедурасы нұсқағышта көрсетілген адрес бойынша жад бөлігін босатып, үйіндіге қайтарады.

Транслятор статикалық жадтың көлемін 1 сегментпен, яғни 64 кбайтпен шектейді. Ал динамикалық жад көлемі компьютердің физикалық ресурсымен ғана шектеледі, яғни өте үлкен болуы мүмкін.

 

Жаттығу есептері:

 

1 – мысал. Жадқа көп ұзын жолдық қатарды сақтау керек. Жолдық қатар ұзындығы 256 байт болса, статикалық жадтан бөлінетін қатар саны, 64*1024/256=256 – ға тең болады. Бұдан көп жолдық қатарды сақтау үшін, статикалық жадқа нұсқағышты орналастырып (нұсқағыш 4 байт орын алады), ал жолдық қатарларды динамикалық жадқа көшіреміз.

const

         MaxItem=2000;

type             Pstring=^String;

               TdinMas=array [1.. MaxItem] of Pstring;

var

         p:TDinMas;

         i:integer;

begin

         for i:=1 to MaxItem do new (p[i]);

         p[1]^:=’Сәлем !’;

end.

 

2-Мысал. Кездейсоқ 100 нақты сандардан тұратын динамикалық массив құрып, осы сандардың қосындысын тап.

 

Type tip=real;

vec=array[1..100] of tip;

pt=^vec;

var i:integer; a:pt; s:real;

begin GetMem(a,100*sizeof(tip));

randomize; s:=0;

for i:=1 to 100 do

begin a^[i]:=random; s:=s+a^[i]; end;

write(‘s=’,s:3:3);

FreeMem(a,100*SizeOf(Tip)); readln; end.

 

 

6. Әдебиеттер

1. Н.С. Заурбеков, Б.Ж.Жумажанов. Алгоритмдеу және программалау тілдері. Экономика баспасы. Алматы-2008.

2. Ж.Қ. Масанов, Б.А.Белгибаев, А.С.Бижанова, Қ.Қ.Мақұлов «Turbo Pascal». Алматы 2004.

3. Фаронов В.В.  Тurbo Pascal 7.0. Практика программирования.  Оку құралы.- М.: Нолидж, 2000ж. 416 бет.

 

Мәлімет сізге көмек берді ма

  Жарияланған-2014-06-04 20:12:30     Қаралды-5105

БАНКНОТАЛАРДА ҚАНДАЙ ЗИЯНКЕСТЕР ӨМІР СҮРЕДІ?

...

Бірнеше жыл бұрын Оксфорд университетінің ғалымдары қызықты зерттеу жүргізді.

ТОЛЫҒЫРАҚ »

АППОЛОННЫҢ ІЗБАСАРЛАРЫ

...

Ауыр салмақты тастарды көтеру арқылы жарысушы спортшыларды халық «Аппалонның ізбасарлары» деп те атаған.

ТОЛЫҒЫРАҚ »

ГЕРОДОТ

...

Скифтердің тұрмыс-тіршілігімен етене жакын танысқан - тарих атасы Геродот. Грекияның Галикарнасынан шыққан Геродот біздің заманымызға дейінгі 455-445 жылдар шамасында Эгей теңізіне, Парсы еліне, Мысырға, Италияға, Скифияға, Македонияға саяхат жасайды.

ТОЛЫҒЫРАҚ »

Майкл Джорданды мектептегі басткебол командасына әуел баста қабылдамады

...

Тоғызыншы сыныпта Джордан жақсы баскетболшы болып үлгерді. Әйтседе, ол кезде оның бойы жетпеген де еді (1978 жылдың жазында оның бойы 175 см болған), Майкл өте шапшаңдығымен және ынтасымен ерекшеленді.

ТОЛЫҒЫРАҚ »

ҚҰР

...

Кұр - орман құсы. Қазақстанда кұр, ак құр, тундра құры, сұр құр, меңіреу құр деген түрлері кездеседі. Ұяларын көбіне қайың ағашына салады. Кұрлар тобы қыс бойы бірге жүреді. Көктемнің басында бір-бірінен бөлініп, ерекше құрқылдап қораздана бастайды.

ТОЛЫҒЫРАҚ »

БІРІНШІ КӨЛІК ҚАНДАЙ БОЛДЫ?

...

Бірінші көлік қандай болды?

ТОЛЫҒЫРАҚ »