logo

Massivlar va satrlar

Загружено в:

08.08.2023

Скачано:

0

Размер:

46.5 KB
Massivlar va satrlar 
Reja:
1. Bir o‘lchovli massivlar .
2. Ko‘p o‘lchamli massivlar.
3. Satrlar massiv sifatida.
4. Satrlar bilan ishlovchi funksiyalar. 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.
Satrlar.   C++   da   belgili   ma’lumotlar   uchun   char   turi   qabul   qilingan.   Belgili
axborotni   taqdim   etishda   belgilar,   simvolli   o‘zgaruvchilar   va   matniy   konstantalar
qabul qilingan.
Misollar:
const char c= ' c ' ;//belgi - bir baytni egallaydi, uning qiymati o‘zgarmaydi char   a,b;//belgili   o‘zgaruvchilar,   bir   baytdan   joy   egallaydi,   qiymatlari
o‘zgaradi.
  C++ dagi satr - bu nul-belgi - \0 (nul-terminator)- bilan tugallanuvchi belgilar
massivi. Nul-terminatorning holatiga qarab satrning amaldagi uzunligi aniqlanadi.
Bunday massivdagi elementlar soni, satr tasviriga qaraganda, bittaga ko‘p.
Simvolli massivlar quyidagicha initsializatsiya qilinadi: 
char   capital[]= " TASHKENT " ;   Bu   holda   avtomatik   ravishda   massiv
elementlari soni aniqlanadi va massiv oxiriga satr ko‘chirish  '\0' simvoli qo‘shiladi.
YUqoridagi initsializatsiyani quyidagicha amalga oshirish mumkin:
char  capital[]={ 'T' , 'A' , 'S' , 'H' , 'K' , 'E' , 'N' , 'T' , '\0' }; 
Bu holda so‘z oxirida  '\0' simvoli aniq ko‘rsatilishi shart.
Qiymat berish operatori yordamida satrga qiymat berish mumkin emas. Satrni
massivga yoki kiritish paytida yoki nomlantirish yordamida joylashtirish mumkin.
Funksiyalar   va   satrlar.   Funksiyalarda   satrlar   ishlatilganda   ularning
chegarasini   ko‘rsatish   shart   emas.   Satrlarning   uzunligini   hisoblash   len
funksiyasii quyidagicha ta’riflash mumkin: 
int len(char c[])
{ int m=0;
for(m=0;c[m]!=’0’;m++);
return m;
};
Bu   funksiyaning   standart   varianti   strlen   deb   ataladi   va   bu   funksiyadan
foydalanish uchun string.h sarlavxali faylidan foydalanish lozim.
So‘zlar massivini kiritish. C++ tilida so‘zlar massivlari ikki o‘lchovli simvolli
massivlar sifatida ta’riflanadi. Misol uchun:
char name[4][5]. 
Bu   ta’rif   yordamida   har   biri   5   ta   harfdan   iborat   bo‘lgan   4   ta   so‘zli   massiv
kiritiladi. So‘zlar massivlari quyidagicha initsializatsiya qilinishi mumkin:
  char Name[3][8]={  " Anvar " , " Mirkomil " , " YUsuf " }.   Bu ta’rifda har bir so‘z uchun xotiradan 8 bayt joy ajratiladi va har bir so‘z
oxiriga  '  \0 '  belgisi qo‘yiladi.
So‘zlar   massivlari   initsializatsiya   qilinganda   so‘zlar   soni   ko‘rsatilmasligi
mumkin. Bu holda so‘zlar soni avtomatik aniqlanadi:
char comp[][9]={  " kompьyuter " , " printer " , " kartridj " }.
Funksiyalar   va   so‘zlar   massivlar.   Satrli   massivlar   funksiya   argumenti
sifatida ishlatilganda satrlarning umumiy uzunligi aniq ko‘rsatilishi shartdir.
String tipi. Satrlar biln ishlash uchun standart bibliotekaga kiruvchi
string  murakkab turidan foydalanish qulaydir.
Bu tipdan foydalanish uchun quyidagi sarlavxali faylni ulash lozim:
#include <string>
Satrlarni ta’riflashga misollar:
string st( "BAXO \n" ); //simvollar satri bilan initsiallash
string st2; // bo‘sh satr
string st3( st ); shu tipdagi o‘zgaruvchi bilan initsiallash
Satrlar ustida amallar. Satrlar ustida quyidagi amallar aniqlangan:
 qiymat berish ( = ); 
 konkatenatsiya yoki satrlarni ulash ( + ); 
 qiymat berib qo‘shish amali ( += )
 ikki amal ekvivalentlikni tekshirish uchun ( == ) va ( != );
 indeks olish ( [] ).
 solishtirish amallari( <, <=,>, >=);

Massivlar va satrlar Reja: 1. Bir o‘lchovli massivlar . 2. Ko‘p o‘lchamli massivlar. 3. Satrlar massiv sifatida. 4. Satrlar bilan ishlovchi funksiyalar.

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. Satrlar. C++ da belgili ma’lumotlar uchun char turi qabul qilingan. Belgili axborotni taqdim etishda belgilar, simvolli o‘zgaruvchilar va matniy konstantalar qabul qilingan. Misollar: const char c= ' c ' ;//belgi - bir baytni egallaydi, uning qiymati o‘zgarmaydi

char a,b;//belgili o‘zgaruvchilar, bir baytdan joy egallaydi, qiymatlari o‘zgaradi. C++ dagi satr - bu nul-belgi - \0 (nul-terminator)- bilan tugallanuvchi belgilar massivi. Nul-terminatorning holatiga qarab satrning amaldagi uzunligi aniqlanadi. Bunday massivdagi elementlar soni, satr tasviriga qaraganda, bittaga ko‘p. Simvolli massivlar quyidagicha initsializatsiya qilinadi: char capital[]= " TASHKENT " ; Bu holda avtomatik ravishda massiv elementlari soni aniqlanadi va massiv oxiriga satr ko‘chirish '\0' simvoli qo‘shiladi. YUqoridagi initsializatsiyani quyidagicha amalga oshirish mumkin: char capital[]={ 'T' , 'A' , 'S' , 'H' , 'K' , 'E' , 'N' , 'T' , '\0' }; Bu holda so‘z oxirida '\0' simvoli aniq ko‘rsatilishi shart. Qiymat berish operatori yordamida satrga qiymat berish mumkin emas. Satrni massivga yoki kiritish paytida yoki nomlantirish yordamida joylashtirish mumkin. Funksiyalar va satrlar. Funksiyalarda satrlar ishlatilganda ularning chegarasini ko‘rsatish shart emas. Satrlarning uzunligini hisoblash len funksiyasii quyidagicha ta’riflash mumkin: int len(char c[]) { int m=0; for(m=0;c[m]!=’0’;m++); return m; }; Bu funksiyaning standart varianti strlen deb ataladi va bu funksiyadan foydalanish uchun string.h sarlavxali faylidan foydalanish lozim. So‘zlar massivini kiritish. C++ tilida so‘zlar massivlari ikki o‘lchovli simvolli massivlar sifatida ta’riflanadi. Misol uchun: char name[4][5]. Bu ta’rif yordamida har biri 5 ta harfdan iborat bo‘lgan 4 ta so‘zli massiv kiritiladi. So‘zlar massivlari quyidagicha initsializatsiya qilinishi mumkin: char Name[3][8]={ " Anvar " , " Mirkomil " , " YUsuf " }.