1. Massiv tushunchasi Bir o’lchovli massivlar Ko’p o’lchovli massivlar



Yüklə 31,83 Kb.
tarix11.10.2023
ölçüsü31,83 Kb.
#153827
7-ma ruza


7-ma’ruza.
Massivlar. Statik va dinamik massivlar. Massivlar bilan ishlash.
Reja:
1. Massiv tushunchasi
2. Bir o’lchovli massivlar
3. Ko’p o’lchovli massivlar
4. Bir o’lchovli dinamik massivlar
5. Ko’p o’lchovli dinamik massivlar

Kalit so’zlar: massiv, bir o’lchovli massiv, ko’p o’lchamli massiv, index, matritsa, static massiv, dinamik massiv.
Massiv tushunchasi. Massiv bu bir tipli nomerlangan ma’lumotlar jamlanmasidir. Massiv indeksli o‘zgaruvchi tushunchasiga mos keladi. Massiv ta’riflanganda tipi, nomi va indekslar chegarasi ko‘rsatiladi. Masalan type turidagi length ta elementdan iborat a nomli massiv shunday e’lon qilinadi:
type a[length];
Bu maxsus a[0], a[1], ..., a[length -1] nomlarga ega bo‘lgan type turidagi o‘zgaruvchilarning e’lon qilinishiga to‘g‘ri keladi.
Massivning har bir elementi o‘z raqamiga - indeksga ega. Massivning x-nchi elementiga murojaat indekslash operatsiyasi yordamida amalga oshiriladi:
int x=...; //butun sonli indeks
TYPE value=a[x]; //ch-nchi elementni o‘qish
a[x]=value; //x-yxb elementga yozish
Indeks sifatida butun tur qiymatini qaytaradigan har qanday ifoda qo‘llanishi mumkin: char, short, int, long. C++ da massiv elementlarining indekslari 0 dan boshlanadi (1 dan emas), length elementdan iborat bo‘lgan massivning oxirgi elementining indeksi esa - bu length -1 (length emas). Massivning int z[3] shakldagi ta’rifi, int tipiga tegishli z[0],z[1],z[2] elementlardan iborat massivni aniqlaydi.
Massiv chegarasidan tashqariga chiqish (ya’ni mavjud bo‘lmagan elementni o‘qish/yozishga urinish) dastur bajarilishida kutilmagan natijalarga olib kelishi mumkin. SHuni ta’kidlab o‘tamizki, bu eng ko‘p tarqalgan xatolardan biridir.
Agar massiv initsializatsiya qilinganda elementlar chegarasi ko‘rsatilgan bo‘lsa , ro‘yxatdagi elementlar soni bu chegaradan kam bo‘lishi mumkin, lekin ortiq bo‘lishi mumkin emas.
Misol uchun int a[5]={2,-2}. Bu holda a[0] va a[1] qiymatlari aniqlangan bo‘lib, mos holda 2 va –2 ga teng. Agar massiv uzunligiga qaraganda kamroq element berilgan bo‘lsa, qolgan elementlar 0 hisoblanadi:
int a10[10]={1, 2, 3, 4}; //va 6 ta nol
Agar nomlangan massivning tavsifida uning o‘lchamlari ko‘rsatilmagan bo‘lsa, kompilyator tomonidan massiv chegarasi avtomatik aniqlanadi:
int a3[]={1, 2, 3};
Bir o‘lchamli massivlarni funksiya parametrlari sifatida uzatish. Massivdan funksiya parametri sifatida foylalanganda, funksiyaning birinchi elementiga ko‘rsatkich uzatiladi, ya’ni massiv hamma vaqt adres bo‘yicha uzatiladi. Bunda massivdagi elementlarning miqdori haqidagi axborot yo‘qotiladi, shuning uchun massivning o‘lchamlari haqidagi ma’lumotni alohida parametr sifatida uzatish kerak.
Funksiyaga massiv boshlanishi uchun ko‘rsatkich uzatilgani tufayli (adres bo‘yicha uzatish), funksiya tanasining operatorlari hisobiga massiv o‘zgarishi mumkin.
Funksiyalarda bir o‘lchovli sonli massivlar argument sifatida ishlatilganda ularning chegarasini ko‘rsatish shart emas.
Funksiyalarda bir o‘lchovli sonli massivlar argument sifatida ishlatilganda ularning chegarasini ko‘rsatish shart emas.
Ko‘p o‘lchovli massivlar ta’rifi. Ikki o‘lchovli massivlar matematikada matritsa yoki jadval tushunchasiga mos keladi. Jadvallarning insializatsiya qilish qoidasi, ikki o‘lchovli massivning elementlari massivlardan iborat bo‘lgan bir o‘lchovli massiv ta’rifiga asoslangandir.
Misol uchun ikki qator va uch ustundan iborat bo‘lgan xaqiqiy tipga tegishli d massiv boshlang‘ich qiymatlari quyidagicha ko‘rsatilishi mumkin:
float d[2][3]={(1,-2.5,10),(-5.3,2,14)};
Bu yozuv quyidagi qiymat berish operatorlariga mosdir:
d[0][0]=1;d[0][1]=-2.5;d[0][2]=10;
d[1][0]=-5.3;d[1][1]=2;d[1][2]=14;
Bu qiymatlarni bitta ro‘yxat bilan xosil qilish mumkin:
float d[2][3]={1,-2.5,10,-5.3,2,14};
Initsializatsiya yordamida boshlang‘ich qiymatlar aniqlanganda massivning hamma elementlariga qiymat berish shart emas.
Misol uchun: int x[3][3]={(1,-2,3),(1,2),(-4)}.
Bu yozuv quyidagi qiymat berish operatorlariga mosdir:
x[0][0]=1;x[0][1]=-2;x[0][2]=3;
x[1][0]=-1;x[1][1]=2;x[2][0]=-4;
Initsializatsiya yordamida boshlang‘ich qiymatlar aniqlanganda massivning birinchi indeksi chegarasi ko‘rsatilishi shart emas, lekin qolgan indekslar chegaralari ko‘rsatilishi shart.
Misol uchun:
double x[][2]={(1.1,1.5),(-1.6,2.5),(3,-4)}
Bu misolda avtomatik ravishda katorlar soni uchga teng deb olinadi.
Funksiyaga ko‘p o‘lchamli massivlarni uzatish. Ko‘p o‘lchamli massivlarni funksiyaga uzatishda barcha o‘lchamlar parametrlar sifatida uzatilishi kerak. C++ da ko‘p o‘lchamli massivlar aniqlanishi bo‘yicha mavjud emas. Agar biz bir nechta indeksga ega bo‘lgan massivni tavsiflasak (masalan, int mas [3][4]), bu degani, biz bir o‘lchamli mas massivini tavsifladik, bir o‘lchamli int [4] massivlar esa uning elementlaridir
Misol: Kvadrat matritsani uzatish (transportirovka qilish)
Agar void transp(int a[][],int n){.....} funksiyasining sarlavhasini aniqlasak, bu holda biz funksiyaga noma’lum o‘lchamdagi massivni uzatishni xohlagan bo‘lib qolamiz. Aniqlanishiga ko‘ra massiv bir o‘lchamli bo‘lishi kerak, hamda uning elementlari bir xil uzo‘nlikda bo‘lishi kerak. Massivni uzatishda uning elementlarining o‘lchamlari haqida ham biron narsa deyilmagan, shuning uchun kompilyator xato chiqarib beradi.
Bu muammoning eng sodda echimi funksiyani quyidagicha aniqlashdir:
void transp(int a[][4],int n){.....}, bu holda har bir satr o‘lchami 4 bo‘ladi, massiv ko‘rsatkichlarining o‘lchami esa hisoblab chiqariladi.
Ko‘p o‘lchamli massivlar va ko‘rsatkichlar. C++ da massivning eng umumiy tushunchasi - bu ko‘rsatkichdir, bunda har xil turdagi ko‘rstakich bo‘lishi mumkin, ya’ni massiv har qanday turdagi elementlarga, shu jumladan, massiv bo‘lishi mumkin bo‘lgan ko‘rsatkichlarga ham ega bo‘lishi mumkin. O‘z tarkibida boshqa massivlarga ham ega bo‘lgan massiv ko‘p o‘lchamli hisoblanadi.
Bunday massivlarni e’lon qilishda kompyuter xotirasida bir nechta turli xildagi ob’ekt yaratiladi.
Ko‘rsatkichlar massivlari. Ko‘rsatkichlar massivlari quyidagicha ta’riflanadi
*[]
Misol uchun int *pt[6] ta’rif int tipidagi ob’ektlarga olti elementli massivni kiritadi.
Ko‘rsatkichlar massivlari satrlar masssivlarini tasvirlash uchun qulaydir.
Misol uchun familiyalar ro‘yxatini kiritish uchun ikki o‘lchovli massivdan foydalani kerak.
char fam[][20]={ "Olimov","Raximov","Ergashev"}
Xotirada 60 elementdan iborat bo‘ladi, chunki har bir familiya 20 gacha 0 lar bilan to‘ldiriladi.
Ko‘rsatkichlar massivi yordamida bu massivni quyidagicha ta’riflash mumkin.
char *pf[]= { "Olimov","Raximov","Ergashev"}.
Bu holda ro‘yxat xotirada 23 elementdan iborat bo‘ladi, chunki har bir familiya oxiriga 0 belgisi kuyiladi
Har xil chegarali jadvallar bilan funksiyalardan foydalanishning bir yuli bu oldindan kiritiluvchi konstantalardan foydalanishdir. Lekin asosiy yuli ko‘rsatkichlar massivlaridan foydalanish.
Bir o‘lchovli dinamik massivlar. C++tilida o‘zgaruvchilar yo statik tarzda - kompilyasiya paytida, yoki standart kutubxonadan funksiyalarni chaqirib olish yo‘li bilan dinamik tarzda - dasturni bajarish paytida joylashtirilishi mumkin. Asosiy farq ushbu usullarni qo‘llashda ko‘rinadi - ularning samaradorligi va moslashuvchanligida. Statik joylashtirish samaraliroq, chunki bunda xotirani ajratish dastur bajarilishidan oldin sodir bo‘ladi. Biroq bu usulning moslashuvchanligi ancha past, chunki bunda biz joylashtirilayotgan ob’ektning turi va o‘lchamlarini avvaldan bilishimiz kerak bo‘ladi. Masalan, matniy faylning ichidagisini satrlarning statik massivida joylashtirish qiyin: avvaldan uning o‘lchamlarini bilish kerak bo‘ladi. Noma’lum sonli elementlarni oldindan saqlash va ishlov berish kerak bo‘lgan masalalar odatda xotiraning dinamik ajratilishini talab qiladi.
Xotirani dinamik va statik ajratish o‘rtasidagi asosiy farqlar quyidagicha:

  • statik ob’ektlar nomlangan o‘zgaruvchilar bilan belgilanadi, hamda ushbu ob’ektlar o‘rtasidagi amallar to‘g‘ridan-to‘g‘ri, ularning nomlaridan foydalangan holda, amalga oshiriladi. Dinamik ob’ektlar o‘z shaxsiy otlariga ega bo‘lmaydi, va ular ustidagi amallar bilvosita, ko‘rsatkichlar yordamida, amalga oshiriladi;

  • statik ob’ektlar uchun xotirani ajratish va bo‘shatish kompilyator tomonidan avtomatik tarzda amalga oshiriladi. Dasturchi bu haqda o‘zi qayg‘urishi kerak emas. Statik ob’ektlar uchun xotirani ajratish va bo‘shatish to‘laligicha dasturchi zimmasiga yuklatiladi. Bu anchayin qiyin masala va uni echishda xatoga yo‘l qo‘yish oson.

Dinamik tarzda ajratilayotgan xotira ustida turli xatti-harakatlarni amalga oshirish uchun new va delete operatorlari xizmat qiladi.
Ma’lum bir turdagi elementlardan tashkil topgan berilgan o‘lchamlardagi massivga xotira ajratish uchun new operatoridan foydalanish lozim:
int *pia=new int[4];
Bu misolda xotira int turidagi to‘rtta elementdan iborat massivga xotira ajratiladi. Afsuski, new operatorining bu shakli massiv elementlarini nomlantirish (initsiallashtirish) imkonini bermaydi.
Dinamik massivni bo‘shatish uchun delete operatoridan foydalanish lozim:
delete[] pia;
Agar ajratilgan xotirani bo‘shatish esdan chiqqudek bo‘lsa, bu xotira bekordan-bekorga sarflana boshlaydi, foydalanilmay qoladi, biroq, agar uning ko‘rsatkichi o‘z qiymatini o‘zgartirgan bo‘lsa, uni tizimga qaytarish mumkin emas. Bu hodisa xotiraning yo‘qotilishi (utechka pamyati) degan maxsus nom bilan ataladi. Pirovard natijada dastur xotira etishmagani tufayli avariya holatida tugallanadi (agar u ancha vaqt ishlayversa).
Ikki o‘lchovli dinamik massivlar. Matritsani shakllantirishda oldin bir o‘lchovli massivlarga ko‘rsatuvchi ko‘rsatkichlar massivi uchun xotira ajratiladi, keyin esa parametrlissiklda bir o‘lchovli massivlarga xotira ajratiladi.
Misol:
int n;
cin>>n;
double *matr[100];
for (i=0;iXotirani bo‘shatish uchun bir o‘lchovli massivlarni bo‘shattiruvchissiklni bajarish zarur.
for(int i=0;idelete matr[i];
Funksiyalarni chaqirishda foydalanish. C++ tili sintaksisiga ko‘ra funksiyaga ko‘rsatkich funksiya adresini aks ettiruvchi o‘zgaruvchi yoki ifodadir. Funksiyaga ko‘rsatkich bajariluvchi qiymati funksiya kodining birinchi bayti adresidir. Funksiyaga ko‘rsatkichlar ustida arifmetik amallar bajarish mumkin emas. Eng keng qo‘llanuvchi funksiyaga konstanta ko‘rsatkich funksiyaning nomidir. Funksiyaga o‘zgaruvchi ko‘rsatkich funksiya ta’rifi va prototipidan aloxida kiritiladi. Funksiyaga o‘zgaruvchi ko‘rsatkich quyidagicha tasvirlanadi:
(* ko‘rsatkich nomi)(parametrlar spetsifikatsiyasi).
Misol uchun int (*point) (void).
Bu ta’rifda qavslar muxim ahamiyatga ega, chunki qavslar yozilmasa bu ta’rif parametrsiz funksiya prototipi deb karaladi. Funksiyaga o‘zgaruvchi ko‘rsatkich qiymatlari sifatida, bir xil tipga ega bo‘lgan har xil funksiyalar adreslarini berilishi mumkin.
Qiymati biror funksiya adresiga teng bo‘lgan funksiyaga o‘zgaruvchi ko‘rsatkich shu funksiyaga murojaat kilish uchun ishlatilishi mumkin.
Dasturda funksiyaga kostanta ko‘rsatkich ya’ni nomlari orqali va o‘zgaruvchi ko‘rsatkichlar yordamida murojaat qilishning hamma usullari ko‘rsatilgandir. SHuni ta’kidlash lozimki adres olish * amali qo‘llanilganda qavslar ishlatish shartdir.
Funksiyaga o‘zgaruvchi ko‘rsatkich ta’riflanganda insializatsiya qilish, ya’ni boshlang‘ich qiymat sifatida o‘zgaruvchi ko‘rsatkich bilan bir xil tipga ega bo‘lgan funksiya adresini ko‘rsatish mumkin. Misol uchun:
int fic (char);
int (*pfic) (char)=fic;
Funksiyalarga ilovalar. Funkiyaga ko‘rsatkich qanday aniqlansa funksiyaga ilova ham xuddi shunday aniqlanadi:
funksiya_turi(&ilova_nomi)(parametrlar)nomlantiruvchi_ifoda;
Misol:
int(&fret)(float,int)=f;// ilovani aniqlash
Funksiya nomini parametrlarsiz va qavslarsiz qo‘llash funksiya adresi sifatida qabul qilinadi. Funksiyaga ilova funksiya nomining sinonimi bo‘ladi. Funksiyaga ilovaning qiymatini o‘zgartirib bo‘lmaydi, shuning uchun ko‘p o‘rinda funksiyaga ilovalar emas, funksiyaga ko‘rsatkichlar qo‘llanadi.
Funksiyaga ko‘rsatkichlar parametr sifatida. Funksiyaga ko‘rsatkichlarlarni funksiyalarga parametr sifatida uzatish mumkin.


Nazorat savollari:



  1. Bir o‘lchovli massivlarni initsializatsiya qilish usullarini ko‘rsating.

  2. Ko‘p o‘lchovli massiv ta’rifi xususiyatlarini keltiring.

  3. Ko‘p o‘lchamli massivlarni e’lon qilish.

  4. Ko‘rsatkichlar massivi qanday ta’rif qilinadi?

  5. Ko‘rsatkichlar massivi qanday ta’rif qilinadi?

  6. Dinamik massivlar oddiy massivlardan qanday farq qiladi?

  7. Funksiyaga ko‘rsatkich ta’rifi umumiy ko‘rinishi.

Yüklə 31,83 Kb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin