1. Xotirani zaxiralash. Xotirani statik va dinamik taqsimlash o‘rtasidagi farq. Tayanch iboralar


Download 132.17 Kb.
Sana02.06.2020
Hajmi132.17 Kb.
#113167
Bog'liq
Дастурлаш 1



Belgili massivlar.Satirli funksiyalar bilan ishlash
Reja:
1.Xotirani zaxiralash.

2. Xotirani statik va dinamik taqsimlash o‘rtasidagi farq.



Tayanch iboralar: Berilganlar massivi tushunchasi, ko‘p o‘lchamli statik massivlar, ko‘p o‘lchamli massivlarni initsializatsiyalash, matrtsa,indeks,xotira,dinamik massivlar , funksiya,massivlar.
C++ da o‘zgaruvchilar yo statik - kompilyatsiya paytida, yo standart kutubxonadan funksiyalarni chaqirish yo‘li bilan dinamik - dasturning bajarilish paytida, joylanishi mumkin. Bu usullarni ishlatishning asosiy farqi ularning effektivligida va moslanuvchanligidadir. Statik joylashtirish birmuncha effektivroq,chunki xotira ajratish dastur bajarilishidan oldin bajariladi. Ammo uning moslanuvchanligi ancha pastroq, chunki bu holda biz joylashtiriladigan ob’yektlarning turlari va o‘lchamlarini oldindan bilishimiz zarur.Masalan, matn fayllarni qatorlarning statik massivida, uning o‘lchamini oldindan bilish zarurligidan, joylashtirish ancha qiyin. Ayniqsa, oldindan noaniq sonli elementlarni saqlash va qayta ishlash bilan bog‘liq masalalar uchun xotirani dinamik taqsimlash usulidan foydalanish qulay.

Xotirani statik va dinamik taqsimlash o‘rtasidagi asosiy farq quyidagilar:

Statik ob’yektlar nomlangan o‘zgaruvchilar bilan belgilanadi. Shu sababli bunday ob’yektlar ustida amallar bevosita ularning nomlarini ishlatish orqali amalga oshiriladi. Dinamik ob’yektlar shaxsiy nomga ega bo‘lmaydi, ular ustidagi amallar bilvosita, ya’ni ko‘rsatkichlar yordamida bajariladi;

Statik ob’yektlar uchun xotira ajratish va bo‘shatish kompilyator tomonidan avtomatik ravishda bajariladi. Dasturchining bu haqda bosh qotirishi shart emas.Dinamik ob’yektlar uchun xotira ajratish va bo‘shatish butunligicha dasturchining zimmasiga tushadi. Bu esa hal qilishda xatoga yo‘l qo‘yish mumkin bo‘lgan murakkab masaladir.Dinamik ajratilgan xotira bilan ish ko‘rish uchun new va delete

buyruqlaridan foydalaniladi.Shu paytgacha barcha misollarda xotirani statik ajratish usulidan

foydalanilib kelindi. Masalan, i o‘zgaruvchini aniqlash quyidagicha bajarilar edi:



int i = 1024;

Bu buyruq xotirada int turidagi o‘zgaruvchini saqlash uchun zarur bo‘lgan soha ajratadi, bu sohani I nom bilan bog‘laydi va u joyga 1024 qiymatni yozib qo‘yadi. Bularning barchasi dasturning bajarilishigacha bo‘gan kompilyatsiya paytida bajariladi.O‘zgaruvchi uchun joy ajratishning yana bir usuli mavjud bo‘lib, u new buyrug‘ini ishlatish yordamida bajariladi.newbuyrug‘i ikkita shaklga egabo‘ladi. Birinchi shaklda aniq turli birlik ob’yekt uchun joy ajratadi:



int *pint = new int(1024);

Bu yerda new buyrug‘i int turidagi nomsiz ob’yekt uchun joy ajratadi, uni 1024 qiymat bilan initsializatsiya qiladi va hosil qilingan ob’yektning manzilini uzatadi. Bu manzil pint ko‘rsatkichiga joylashtiradi.Bunday nomsiz ob’yektlar ustidagi barcha amallar mazkur ko‘rsatkich bilan ishlash orqali bajariladi, chunki dinamik ob’yektlar ustida bevosita ishlash mumkin emas.Ikkinchi shaklda new buyrug‘i ma’lum tur elementlaridan tashkil topgan, ko‘rsatilgan o‘lchamdagi massiv uchun xotira ajratadi:



int *pia = new int[4];

Bu misolda int turidagi to‘rt elementdan iborat massiv uchun xotira ajratiladi. Afsuski, new buyrug‘ining bu shaklida massiv elementlarini initsializatsiya qilish imkoniyati yo‘q.new buyrug‘ining ikkala shaklida ham bir xil ko‘rsatkich aniqlanishi ba’zi chalkashliklarga olib kelishi mumkin. Qaralayotgan misolda bu butun turga ko‘rsatkichdir. pint ham, pia ham bir xil e’lon qilingan, ammo pint int turidagi yagona ob’yektni ko‘rsatadi, pia esa int turidagi to‘rtta ob’yektdan iborat massivni ko‘rsatadi.Dinamik ob’yekt kerak bo‘lmay qolganda unga ajratilgan sohani oshkor ravishda bo‘shatish mumkin. Bu delete buyrug‘i yordamida bajariladi:



delete pint;

Massivni bo‘shatish ham new buyrug‘i kabi ikki shaklga ega, birlik ob’yekt uchun va massiv uchun.



delete[] pia;

Agar ajratilgan xotirani bo‘shatishni unutsak, u bo‘shga sarflanadi, ishlatilmaydi. Agar unga bo‘lgan ko‘rsatkich o‘z qiymatini o‘zgartirgan bo‘lsa uni tizimga qaytarish ham mumkin emas. Bunday

xodisa xotiraning oqib ketishi degan maxsus nom olgan. Oxir oqibatda dastur xotira etmasligi sababli halokatli (avariyali) to‘xtaydi (agar u uzoq vaqt ishlasa).

7 - misol: «Ko‘rsatkichlardan foydalanuvchi ro‘yxatlar»

Dastur tasnifi Mazkur dasturda mustaqil ravishda dasturchilar tomonidan teztez ishlatiladigan, «Ikki yo‘nalishli ro‘yxat» konstruksiyasini tuzishga to‘g‘ri keladi. Bu konstruksiya nomer bo‘yicha tartiblangan strukturalar majmuini bildiradi. Unda har bir struktura o‘z tarkibida to‘plamning yaqin o‘zgaruvchilariga ikkitadan ko‘rsatkichga ega bo‘ladi. Tabiiyki, struktura bu ko‘rsatkichlardan tashqari dastur uchun ba’zi foydali ma’lumotlarga ham ega bo‘ladi.Bu misol uchun masala quyidagicha qo‘yiladi: Foydali ma’lumotlar sifatida belgilar qatorini qamrab oluvchi, ikki yo‘nalishli ro‘yxat hosil qilish imkoniga ega struktura, hamda ro‘yxatga elementlar qo‘shuvchi va ro‘yxatdan elementlarni o‘chiruvchi protseduralar tuzilsin. Bu protseduralar tugmachalar bilan biriktirilsin va ro‘yxatda saqlanuvchi ma’lumotlarni chiqarish ta’minlansin.

Muammolar

Dinamik xotira bilan ishlashda zaxiralangan ma’lumotlar blokining o‘z vaqtida bo‘shatilishini nazorat qilib borish, ya’ni bunday protsedurani nazarda tutish, zarur. Bundan tashqari, dasturni tugatishdan

oldin xotiraning barcha zaxiralangan bloklari bo‘shatilishi kerak. Buning

uchun «Shakllarni yopish» - «Закрытие формы» (FormClose) xodisalarni qayta ishlash protsedurasidan xotirani bo‘shatish protsedurasini chaqirish zarur.



Zarur ko‘nikmalar

Ikki yo‘nalishli ro‘yxat bilan ishlash uchun ko‘rsatkichlar va strukturalar bilan ishlash ko‘nikmalari zarur. Dasturda ko‘rsatkichga ko‘rsatkich bilan bog‘liq murakkab kostruksiyalar ishlatiladi (masalan,

manzilini o‘z navbatida boshqa ko‘rsatkich saqlovchi ko‘rsatkich saqlanadigan manzilni o‘z ichiga oluvchi o‘zgaruvchiga biror qiymat o‘zlashtirishda). Bu dasturda “->” buyrug‘i ishlatiladi. Bu buyruq

strukturaning bir qismi bo‘lgan, manzili shu buyruq tadbiq etilayotgan ko‘rsatkich bo‘lgan o‘zgaruvchini aniqlaydi (qaytaradi). Agar buyruq aniqlagan o‘zgaruvchi strukturaga ko‘rsatkich bo‘lsa, u holda unga shu buyruqning o‘zi yana tadbiq qilinishi mumkin. Buning oqibatida ko‘p o‘tishlardan iborat uzun konstruksiyalar paydo bo‘ladi.



Yechish

Shakl

Mazkur dasturning shaklida ro‘yxatning mazmunini ekranga chiqarish uchun maydon va element qo‘shish, elementni o‘chirish, barcha elementlarni aks ettirish yoki o‘chirish imkonini beruvchi barcha

funksional tugmachalar joylashgan bo‘lishi kerak. Satrlarni chiqarish maydonini ma’noli birlashtirish maqsadida yangi element uchun «Dobavit» tugmachasi bilan birga shu tugmachaga mos nomli, ham

kiritish maydoni, ham tugmachadan iborat guruh tuzilgan.




Ikki yo‘nalishli ro‘yxat sxemasi

Bu yerda uchta elementdan iborat ikki yo‘nalishli ro‘yxat sxemasi keltirilgan.



Navbatdagi sxemada ro‘yxat ichiga element qo‘yish sxemasi ko‘rsatilgan.

Navbatdagi sxemada ro‘yxat ichiga element qo‘yish sxemasiko`rsatilgan.





Bu dasturda elementni qo‘yish ro‘yxatning eng oxiriga qo‘yish bilan amalga oshiriladi. Ammo u o‘rtaga qo‘yishdan prinsipial farq qilmaydi. Tabiiyki, ro‘yxatga yangi element qo‘shishda orientatsiyauchun orientr maqsadida ro‘yxatning biror elementi olinadi va undan oldin yoki keyin qo‘yish amalga oshiriladi. Mazkur dasturda qo‘yish tanlangan ob’yektdan keyin amalga oshiriladi. Qo‘yishda quyidagi amallar ketma-ketligi bajariladi:

1. Qo‘yilayotgan elementning prev xossasiga tanlangan elementning (undan keyin qo‘yish amalga oshiriladigan element) qiymati o‘zlashtiriladi.

2. Qo‘yilayotgan elementning next xossasiga tanlangan

elementning next xossasining qiymati o‘zlashtiriladi. 3. Manzili tanlangan elementning next xossasini saqlovchi elementning prev xossasiga yangi element manzilining qiymati o‘zlashtiriladi.

4. Tanlangan elementning next xossasiga yangi element manzilining qiymati o‘zlashtiriladi. Mazkur dasturda qo‘yish manzili w ko‘rsatkichda berilgan elementdan keyin amalga oshiriladi.



List * n q new List; // Yangi

element hosil qilish

n->prev q w; // 1 - amal

n->next q w->next; // 2 - amal

if (w->next) {w->next->prev q n;} // 3 - amal

w->next q n; // 4 - amal

n->Data q data; // funksional

elementni initsializatsiya qilish

Qo‘yish har doim so‘nggi elementdan bajarilganligi uchun w- >next ning qiymati har doim nol bo‘ladi, ya’ni 3-amal hech qachon bajarilmaydi, shuning uchun uni tushirib qoldirish mumkin. Dasturning asosiy kodida bu amal tushirib qoldirilgan.



Dastur kodi

#include

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------____fastcall_TForm1::TForm1(TComponent*_Owner)__:_TForm(Owner)__{'>//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

struct List

{

List* prev;

List* next;

AnsiString Data;

};

List* add(List* w, AnsiString data) // Ro‘yxatga element qo‘shish

{

List * n = new List;

n->prev = w;

n->next = w->next;

w->next = n;

n->Data = data;

return n;

}

List* del(List* w) // Ro‘yxatdan elementni o‘chirish

{

if(w->prev){w->prev->next = w->next;}

if(w->next){w->next->prev = w->prev;}

List * r;

if(w->next) {r = w->next;} else {r = w->prev;}

delete w;

return r;

}

List First; // Ro‘yxatning boshi

List* Last = &First; // Ro‘yxatning oxiri

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Memo1->Lines->Clear();

List* m = &First;

while(m)

{

Memo1->Lines->Add(m->Data);

m = m->next;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Last = add(Last,Edit1->Text);

Edit1->Text = "";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Last = del(Last);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

while(Last != &First)

{

Last = del(Last);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

First.next = 0;

First.prev = 0;

First.Data = "Ro‘yxatning boshi";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)

{

Button4->Click();

}

Nazorat savollari

1) Xotirani dinamik taqsimlash deb nimaga aytiladi?

2) Xotirani statik va dinamik taqsimlash nima bilan farq qiladi?

3) Dinamik ajratilgan xotira bilan ish ko’rish uchun qanday buyruqlardan foydalaniladi



Foydalaniladigan asosiy va qo`shimcha adabiyotlar hamda elektron saytlar:
1.P.Karimov,S.Irisqulov,A.Isaboyev “Dasturlash”Toshkenet Ozbekiston nashriyoti_2003 yil.

2.Sh.A.Nazirov, R.V.Qobulov “Obektga mo`ljallangan dasturlash” Toshkent-2009 yil.

3.H.Rahimov,T.Dehqonov C++ Zamonaviy dasturlash tillari.

4.Гради Бuч. Объектно –ориентированной анализ и проектирование с примерами приложений на С++. Невский диалект, 2001 г



5. Грехем И. Объектно ориентированные методы. Принсипы и практика. Вильямс. 2004

Internet elektron saytlar: www.ziyonet uz , www.nkmk.uz www.ndpu.uz, www.tdtu.library.uz
Download 132.17 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling