Fan:“ Ma’lumotlar tuzilmasi va algoritmlar ” 8-Ma’ruza mavzusi : STATIK VA DINAMIK MASSIVLAR. MASSIVLAR BILAN ISHLASH. Fan o‘qituvchisi: K at.o‘q. Isroilov Sh.Y .
Reja 1. Massivlar haqida asosiy tushunchalar . 2 . Massiv turlari . Statik va dinamik massivlar . 3. Bir va ikki o’lchovli massivlar . 4. Ikki o’lch ovli dinamik massivlar . 5. Massivlar bilan ishlash .
Massiv - bu bir xil toifali , chekli qiymatlarning tartiblangan to`plamidir .
Massiv turlari Massiv Statik Dinamik
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 nom lariga 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 yechishda xatoga yo’l qo’yish oson.
Bir o`lchamli massiv - agar uning elementiga bir indeks orqali murojaat qilish mumkin bo`lsa . Bir o`lchamli massivni e`lon qilish quyidagicha bo`ladi : < toifa > < massiv_nomi > [ elementlar_soni ] = { boshlang'ich qiymatlar }; Quyida massivlarni e`lon qilishga bir necha misollar keltirilgan : 1 ) float a[5 ]; 2) int m[6 ]; 3 ) bool b[10 ];
Massiv elementiga murojaat qilish uning indeksi orqali bo`ladi . a[1 ] = 10; Bunda a massivining 1 – elementi 10 qiymat o’zlashtirsin ; cin >> a[2]; a massivining 2 – elementi kirtilsin ; cout << a[3]; a massivining 3 – elementi ekranga chiqarilsin ;
Massivni e'lon qilishda uning elementlariga boshlang'ich qiymat berish mumkin va buning bir nechta usuli mavjud . 1) O'lchami ko'rsatilgan massivni to'liq shakli . int k[5] = { 2, 3, 7, 8, 6}; Bu yerda 5 ta elementdan iborat bo'lgan k massiv e'lon qilingan va massivning barcha elementlariga boshlang'ich qiymat berilgan . 2) O'lchami ko'rsatilgan massivni to'liqmas shakli int k[5] = { 2, 3, 7 }; Bu yerda 5 ta elementdan iborat bo'lgan k massivi e'lon qilingan va massivning dastlabki 3 ta elementiga boshlang'ich qiymat berilgan .
Misol : n ta elementdan tashkil topgan massiv berilgan . Shu massiv elementlari yig'indisini chiqaruvchi dastur tuzilsin . (n<= 10) # include < iostream > using namespace std ; int main() { int a[10 ] = { 0 }; // a massivni e'lon qilish int n; // massiv elementlari soni int s = 0; // massiv elementlari yig'indisini hisoblash uchun cout << "n="; cin >> n; for ( int i = 0; i < n; i ++) { cout << "a[" << i << "]="; cin >> a[i]; s += a[i]; } cout << " Massiv elementlari yig`indisi = " << s << endl ; return 0; }
Misol : n ta elementdan tashkil topgan massiv berilgan . Shu massiv musbat elementlari ko’paytmasini chiqaruvchi dastur tuzilsin . (n<= 10) #include < iostream > using namespace std ; int main() { int a[10] = { 0 }; // a massivini e'lon qilish int n; // massiv musbat elementlari soni int s=1; // massiv musbat elementlari ko'paytmasi cout << "n="; cin >> n; for ( int i = 0; i < n; i++) { cout << "a[" << i << "]="; cin >> a[i]; if (a[i]>0 ) s=s*a[i]; } cout << " Massiv musbat elementlari ko'paytmasi = " << s << endl ; return 0; }
IKKI O`LCHAMLI MASSIVLARNI E`LON QILISH. < toifa > < massiv_nomi > [ massiv_satrlari_soni ][ massiv_ustunlari_soni ]; Ikki o`lchamli massivlarning e`lon qilinishida , bir o`lchamlidan farqi , massiv nomidan keyin “[]” qavs ichida ikkita qiymat yozilganligidadir . Bulardan birinchisi , satrlar sonini , ikkinchisi esa ustunlar sonini bildiradi .
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. Masalan , int arr [4][3] Arr arr [0] arr [0][0] arr [0][1] arr [0][2] arr [1] arr [1][0] arr [1][1] arr [1][2] arr [2] arr [2][0] arr [2][1] arr [2][2] arr [3] arr [3][0] arr [3][1] arr [3][2]
Ikki o'lchamli massiv e'loniga misol : int a[3 ][3 ], b[2][4]; A matritsa 3 ta satr , 3 ta ustunga ega ; B matritsa 2 ta satr , 4 ta ustunga ega ; Ikki o'lchamli massivlarda 1 - indeks satrni , 2 - indeks ustunni bildiradi .
#include < iostream > using namespace std ; int main() { int m, n, a[10][10]; cout << " Satrlar sonini kiriting \nm="; cin >> m; cout << " Ustunlar sonini kiriting \ nn ="; cin >> n; cout <<" Massiv elementlarini kiriting \n"; for( int satr = 0; satr < m ; satr ++) for( int ustun = 0; ustun < n; ustun ++) { cout << "a[" << satr << "][" << ustun << "]="; cin >> a[ satr ][ ustun ]; } // matritsani jadval shaklida chiqarish for( int satr = 0; satr < m; satr ++) { for( int ustun = 0; ustun < n; ustun ++) cout << a[ satr ][ ustun ] << "\t"; cout <<"\n"; } return 0; } 1 - Masala. A( mxn ) matritsa berilgan . Shu matritsa elementlarini kirituvchi va ekranga jadval ko`rinishida chiqaruvchi dastur tuzilsin .
Dinamik massivlar Ko’rsatkichlar massivlari quyidagicha ta’riflanadi <tip> *<nom>[<son>] Misol uchun int *pt[6] ta’rif int tipidagi obyektlarga olti elementli massivni kiritadi. Ko’rsatkichlar massivlari satrlar masssivlarini tasvirlash uchun q ulaydir . Misol uchun familiyalar ro’yxatini kiritish uchun ikki o’lchovli massivdan foydalani kerak . char fam [][20]={ " Olimov " , " Raximov " , " Ergashev " } Xotirada 6 elementdan iborat b o’ l a di , chunki xar bir familiya 20 gacha lar bilan t o’ ldiriladi . Ko’rsatkichlar massivi yordamida bu massivni quyidagicha ta’riflash mumkin . char * pf []= { " Olimov " , " Raximov " , " Ergashev " }. Bu xolda ro’yxat xotirada 23 elementdan iborat b o’ ladi , chunki xar bir familiya oxiriga belgisi qo ’ yiladi Xar xil chegarali jadvallar bilan funksiyalardan foydalanishning bir y o’ li bu oldindan kiritiluvchi konstantalardan foydalanishdir. Lekin asosiy y o’ li ko’rsatkichlar massivlaridan foydalanish .
Quyidagi misolda ko’rsatkichlar massivi yordamida so’zlar massivi tartiblanadi: #include < iostream > using namespace std ; void sort( int n, char * a[]) { char * c; int i,j ; for ( i =0;i< n;i ++) for (j=i+1;j< n;j ++) if (a[ i ][0]<a[j][0] ) { c=a[ i ];a[ i ]=a[j];a[j]=c; }; }; int main() { char * pa[10]={ "Alimov" , "Dadashev" , "Boboev" }; sort(3,pa); for ( int i =0;i<3;i++) cout << '\n' <<pa[ i ]; return 0; }
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 (inisiallashtirish) 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 yetishmagani tufayli avariya holatida tugallanadi (agar u ancha vaqt ishlayversa).
Ikki o’lchovli dinamik massivlar. Matrisani shakllantirishda oldin bir o’lchovli massivlarga ko’rsatuvchi ko’rsatkichlar massivi uchun xotira ajratiladi, keyin esa parametrli siklda bir o’lchovli massivlarga xotira ajratiladi. Misol : int n; cin>>n; double * matr [100]; for ( i =0;i< n;i ++) matr [ i ]=new int [n]; Xotirani bo’shatish uchun bir o’lchovli massivlarni bo’shattiruvchi siklni bajarish zarur. for( int i =0;i< n;i ++) delete matr [ i ];
Nusxa ko’chirish Ikkita massivni ko’rib chiqamiz: int squares[5] = { 0, 1, 4, 9, 16 }; int lucky_numbers[5]; Hozir aytaylik, siz birinchi massivdagi barcha qiymatlarni ikkinchisiga ko’chirmoqchisiz. Quyidagi ifoda xato hisoblanadi: lucky_numbers = squares; // Error C++da siz bir massivni ikkinchisiga o’tkaza olmaysiz.Uning o’rniga siz barcha elementlarni ko’chirish uchun sikldan foydalanishingiz kerak: for (int i = 0; i < 5; i++) { lucky_numbers[i] = squares[i]; }
Yig’indi va o ’rtacha q iymat M assivning barcha elementlarining yig’indisini hisoblash kodi berilgan. double total = 0; for (int i = 0; i < size of values; i++) { total = total + values[i]; } O’rtacha qiymatni topish uchun elementlar soniga bo’ling: double average = total / size of values; miqdor nol emasligini tekshirishni unutmang.
Maksimum va minimum O’zida eng katta element uchun o’zgaruvchini saqlovchi va massivlarni joriy etish. double largest = values[0]; for (int i = 1; i < size of values; i++) { if (values[i] > largest) { largest = values[i]; } }
Massivlar funksiya parametrlari sifatida . Massivlar funksiyaga turidagi bir o’lchamli massivlar sifatida yoki ko’rsatkichlar sifatida uzatilishi mumkin. Masalan satrlar funksiyaga char turidagi bir o’lchamli massivlar sifatida yoki char* turidagi ko’rsatkichlar sifatida uzatilishi mumkin. Oddiy massivlardan farqli o’laroq, funksiyada satr uzunligi ko’rsatilmaydi, chunki satr oxirida satr oxiri \0 belgisi bor. Misol : Berilgan belgini satrda qidirish funksiyasi int find(char * s,char c) { for ( int i =0;i< strlen (s); i ++) if(s[ i ]==c) return i ; return –1 }