48.
Konstanta havola parametrlari (constant reference parameter).
Const qiymatiga havola
Konst qiymatiga ko'rsatgichni e'lon qilish mumkin bo'lganidek, const qiymatiga
havolani ham e'lon qilish mumkin. Bu const kalit so'zidan foydalanib
ma'lumotnomani e'lon qilish orqali amalga oshiriladi.
1
2
const int value = 5;
const int &ref = value; // ref is a reference to const value
Konst qiymatiga havola ko'pincha qisqa uchun const havolasi deb nomlanadi ,
ammo bu ba'zi bir nomenklaturani ko'rsatgichlar bilan nomuvofiqlashtiradi.
49.
Bir o‗lcho`vli massivlarni e‘lon qilish (single-dimensional arrays, declare arrays).
Massivlardan bir turli, ko`p sonli qiymatlarni yozishda foydalaniladi. Massivdagi alohida
elementga uning tartib raqami – indeksi orqali murojaat qilish mumkin.
Massiv ma‘lumotlar jamlanmasini yozishda ishlatiladi, lekin ko`proq massiv bir turli
qiymatlar to`plami deb tushuniladi. Ko`p sonli qiymatlarni ta‘minlash uchun son0, son1, son2,
… sonN kabi ko`p sonli o`zgaruvchilarni e‘lon qilish o`rniga faqat bitta nom bilan (masalan:
son) massiv e‘lon qilgan holda, son[0], son[1], son[2] … son[N] kabi alohida massiv
elementlariga murojaat qilish mumkin. Massivni e‘lon qilishda element turi va massiv hajmini
belgilash quyidagicha sintaksis asosida amalga oshiriladi:
double Sonlar[10];
Bu ko`rsatma bajarilgandan so`ng kompilyator Sonlar massivi uchun, xotiradan 10 ta
double turiga loyiq joy ajratadi. Standart C++ da massivni e‘lon qilishda uning hajmi o`zgarmas
(const) turda ko`rsatilishi lozim. . Agar dasturda bir nechta massivlarni e‘lon qilish kerak bo`lsa
va barchasi bir xil ma‘lumot turiga ega bo`lsa, ularni birdaniga e‘lon qilish mumkin:
ElementTuri MassivNomi1[hajm1], MassivNomi2[hajm2], … MassivNomin[hajmN];
50.
Massiv elementlariga murojaat va massivni yuklash (accessing array elements, array
initializers).
Massiv elementlariga ularning indekslari orqali murojaat qilinadi. Massiv 0 dan boshlab
indekslanadi va 0 dan Hajm-1 gacha oraliq uchun ishlaydi. Massivning birinchi elementi 0-
indeksga yoziladi, ikkinchi elementi 1-indeksga yoziladi va hokazo. 12.1-rasmda myList massivi
10 ta double qiymatni o`zida saqlagan, tartib raqamlari esa, 0 dan 9 gacha bo`lgan massiv
keltirilgan.
Massivning har bir elementi quyidagi sintaksis asosida taqdim qilinadi:
massivNomi [indeks]
Masalan myList[9] massivning eng so`nggi elementini ifodalaydi. Shu o`rinda bir narsani
yoddan chiqarmaslik kerak, massivni e‘lon qilishda uning hajmini ko`rsatish – undagi elementlar
sonini ifodalaydi. Massiv elementi muayyan bir elmentga murojaatmi amalga oshirish uchun
xizmat qiladi. Misol uchun, quyidagi kod myList[2] ga myList[0] va myList[1] ni ta‘minlaydi:
myList[2] = myList[0] + myList[1];
Quyidagi kod esa, myList[0] ning qiymatini bittaga oshiradi:
myList[0]++
Quyidagi kod myList[1] va myList[2] lar orasidagi kattasini chop etish uchun max funksiyasini
chaqiradi:
cout << max(myList[1], myList[1]) << endl;
Massiv elementlariga indeks chegarasi bo`yicha murojaat qilish chegaradan oshib ketish
xatoligining yuzaga kelishiga sabab bo`ladi. Chegaradan o`tib ketish jiddiy xatolik hisoblanadi
va C++ kompilyatori uni qayta ishlamaydi. Massiv elementlariga qiymat berishda chegara ichida
bo`lish shartlariga e‘tibor qaratish lozim.
51.
Massiv elementlariga oid masalalar (massivga konsoldan qiymat kiritish, massivga tasodifiy
qiymatlar berish).
Massiv elementlariga konsoldan qiymat berish uchun massivning har bir elementiga alohida
qiymat berish kerak. Masalan int a[5] 5 o‘zgaruvchili massivi unga qiymat berish uchun sikldan
foydalanish dastur kodini qisqartirishga yordam beradi.
Masalan:
Int a[5];
For(int i=0; i<5; i++)
Cin>>a[i];
Tasodifiy qiymat berish uchun sikl orqali massiv elementlarini navbati bilan rand() funksiyasiga
tenglash ularni qiymatini tasodifiy qilishga yordam beradi.
53.
Massivlarni funksiyalarga argument sifatida yuborish (passing arrays to functions).
Funksiyaga argument sifatida massiv yuborilganda, uning elementlari funksiyadagi
parametr massivga ta‘minlanishni boshlaydi. Bunda parameter va argumentlarning har ikkalasi
ham massiv ko`rinishida bo`ladi.Funksiyaga argument sifatida bitta qiymatni yubora olganimiz
singari, yaxlit bir massivni ham yuborishimiz mumkin. Funksiyaga argument sifatida massivni
yuborishda uninghajmini ham ko`rsatish yoddan ko`tarilmasligi lozim. Bunda funksiya
massivning nechta elementi borligini aniqlab oladi.
C++ da funksiyaga massivni argument sifatida uning qiymatlari bilan yuborish
qo`llaniladi. Oddiy ma‘lumot turidagi o`zgaruvchilarni va massivni funksiyaga argument
sifatida, qiymat bilan yuborilishida muhim ahamiyatga ega bo`lgan bir qancha farqlar mavjud.
Oddiy turdagi argument uchun, argumentning faqat qiymati yuboriladi;
Massiv ko`rinishidagi argument uchun, argument qiymati xotiradagi massiv qiymatlarga
murojaat qilishdan boshlanadi; bu qiymmatlar funksiyadagi massiv parametrga yuboriladi.
Massivni argument sufatida, qiymati bilan funksiyaga yuborishni tasvirlashning eng yaxshi usuli
– bo`laklab-yuborish deb tasavvur qilishdir. Ya‘ni, yuborilgan massiv funksiyada ham massiv
sifatida qabul qilinadi. Shundan kelib chiqqan holda aytish mumkinki, agar massivga o`zgartirish
kiritmoqchi bo`lsak, buni funksiyadan tashqarida qilog`imiz lozim.
52.
Massivlarning funksiyadan qaytarilishi (returning arrays from functions).
Funksiyadan massiv ko`rinishidagi qiymatlarni olish uchun uni parametr ko`rinishida funksiyaga
yuborish kerak.
Biz funksiyani oddiy turdagi qiymat yoki ob‘yekt qaytaruvchi sifatida e‘lon qilishimiz mumkin.
Masalan:
// list dagi elementlar yig`indisi – sum ni chiqarish
int sum(const int list[], int hajm)
Xo`sh, bu kabi sintaksis bilan funksiyadan massivni qaytarish mumkinmi? Masalan,
o`zgartirisshlar kiritilgandan so`ng, yangicha qiymatlarga ega bo`lgan massivni qaytaruvchi
funksiyani quyidagicha e‘lon qilishga urinib ko`rsak:
// o`zgartirilgan list ni qaytarish
int[] ishlangan(const int list[], int hajm).C++ da bunga ruxsat berilmagan. Shunday bo`lsa ham,
bu ta‘qiqlanishni funksiyaga ikkita massivni argument sifatida yuborish orqali chetlab o`tishimiz
mumkin:
// list ga ishlov berilgandan kalitingi YangiList
void reverse(const int list[], int YangiList[], int hajm)
53.
Massivlarda qidirish (massivda qidiruv, chiziqli qidiruv, binar qidiruv).
Agar massiv saralangan bo`lsa, massivdan biror elementni topish uchun chiziqli qidiruvdan
ko`ra ikkilik qidiruvi ko`proq samara beradi.
Massivda qidiruv – kerakli elementni topish jarayonidir. Masalan, aniq bir qiymat turining
massiv tarkibidagi elementlardan birida mavjudligini tekshirish. Kompyuter dasturlashda eng
ko`p qidiruv masalasi uchraydi. Qidirishni amalga oshirishga yo`naltirilgan ko`plab algoritmlar
va ma‘lumot tuzilmalari mavjud. Bu qismda qidirishni amalga oshirishning ikki xil
yondoshuvlari – chiziqli qidiruv va ikkilik qidiruv o`rganiladi.Chiziqli qidirish yondoshuvi kalit
– kalit so`zini massivning har bir elementi blan, ketma-ket solishtirishga ixtisoslashtirilgan.
Funksiya bu ishni massiv tarkibidagi elementlardan birontasi kalit ga mos kelgunicha yoki,
massiv so`nggiga qadar amalga oshiradi. Agar massiv tarkibida biror element kalit ga mos kelsa,
chiziqli qidirish uning indeksini qaytaradi. Aks holda, qidiruv -1 ni qaytaradi. Bir qancha
qiymatlarni qidirishning eng ko`p tarqalgan yodoshuvlaridan biri – ikkilik qidiruv
yondoshuvidir. U massivdagi elementlar avvaldan tartiblangan bo`lishini talab qiladi. Tasavvur
qiling, massiv o`sish tartibida. Ikkilik qidiruv birinchi navbatda kalit so`zni massivning
markazidagi element bilan solishtiradi. Quyidagi holatlarni ko`rib chiqamiz:
Agar kalit markaziy elementdan kichik bo`lsa, qidirish massivning faqat birinchi
yarimtaligida davom ettiriladi;
Agar kalit markaziy elementga mos bo`lsa, qidirish brinchi urinishdayoq to`xtatiladi;
Agar kalit markaziy elementdan katta bo`lsa, qidirish massivning faqat ikkinchi
yarimtaligida davom ettiriladi.
54.
Massivlarni saralash (sorting arrays).
Saralash ham qidirish kabi, kompyuterli dasturlashda ko`p qo`llaniladigan masalalar
sirasiga kiradi. Saralashga mo`ljallangan turli xil algoritmlar ishlab chiqilgan. Bu qismda tanlab
saralash algoritmi yoritib beriladi.Tanlab saralash algoritmi takroriy ravishda massiv tarkibidagi
eng kichik sonni topadi va qidiruvdagi massiv qismining birinchi elementi qiymati bilan
almashtiradi. Faraz qilaylik, biz list nomli massivimizni o`suvchi tartibda saralamoqchimiz.
Tanlab saralash algoritmi massivdagi eng kichik sonni topib, uni birinchisi bilan almashtiradi.
Undan keyin, birinchi sondan tashqari, yana eng kichik sonni topadi va uni ikkinchi elementga
joylashtiradi, bu jarayon toki oxirida bitta son qolmaguncha davom etadi.
SatrlaC-r(c-strings va string type, null terminator).
C-satr nolli chegaraviy birikma (‗\0‘) bilan tugallanuvchi belgilar massividir. C++
kutubxonasida C-satrlarni C-satr funksiyalaridan foydalanib qo`llash mumkin.C-satr xotirada
satr chegarasini belgilovchi nolli chegaraviy birikma (‗\0‘) bilan tugallanuvchi belgilar
massividir. Har bir satrli literal – C-satrdir. Massivni satrli literallar bilan yuklash mumkin.
Quyidagi ko`rsatma satri C-satr uchun, 'D', 'a', 'l', 'l', 'a', 's' belgilari va chegaraviy birikma – (‗\0‘
dan iborat bo`lgan massivni e‘lon qiladi. C++ da satrli massivni o`qishning yana bir alternative
variant mavjud. C++ tili iostream kutubxona fayli tarkibida mavjud bo`lgan cin.getline
funksiyasini taqdim etadi. C-satri chegaraviy birikma bilan tugashini hisobga olganda, C++ da
bu faktdan C-satrlar bilan samarali ishlashda foydalanishimiz mumkin. C-satrni funksiyaga
yuborganimizda biz uning uzunligini yubormaymiz, chunki, uzunlik chegaraviy birikma
uchragunga qadar, chapdan-o`ngga o`qish orqali hisoblanishi mumkin.
C++ turi. Ko`pgina kompilyatorlar uchun u unsigned int deb qabul qilinadi. Shu kabi
barcha funksiyalar cstring kutubxonasida, atoi, atof, atol va itoa funksiyalari cstdlib
kutubxonasida aniqlanadi.
Satr funksiyalari.
Funksiya
Vazifasi
size_t strlen(char s[])
Chegaraviy birikmadan oldingiz belgilar
sonini, ya‘ni, satr uzunligini qaytaradi.
strcpy(char s1[], const char s2[])
s2 satrni s1 satrga nusxalaydi
strncpy(char s1[], const char s2[], size_t n)
s2 satrdan n ta belgini s1 satrga nusxalaydi
strcat(char s1[], const char s2[])
s2 satrni s1 satrga qo`shadi
strncat(char s1[], const char s2[], size_t n)
s2 satrdan n ta belgini s1 satrga qo`shadi
int strcmp(char s1[], const char s2[])
s1 belgilarining sonli kodi s2 nikidan katta,
teng, yoki undan kichik bo`lsa, 0 dan katta, 0,
yoki 0 dan kichik qiymat qaytaradi
int strncmp(char s1[], const char s2[], size_t n) strcmp ning o`zi, biroq u n soniga qadar s1 va
s2 belgilarini solishtiradi
int atoi(char s[])
Satr uchun int qiymat qaytaradi
double atof(char s[])
Satr uchun double qiymat qaytaradi
long atol(char s[])
Satr uchun long qiymat qaytaradi
void itoa(int value, char s[], int radix)
Maxsus ko`rsatilgan oraliqdan Butun qiymat
oladi
55.
Ikki o‗lchovli massivlarni e‘lon qilish (declaring two dimensional arrays).
Ikki o`lchovli massiv elementiga uning ustun va satrdagi indekslari orqali murojaat
qilinadi.Bizga ma‘lumki, bir o`lchovli massivlar bir satrda joylashgan elementlar jamlanmasidan
tashkil topadi. Matritsa yoki jadvallarni hosil qilish uchun ikki o`lchovli massivlardan
foydalanishimiz mumkin. Ikki o`lchovli massivni e‘lon qilish sintaksisi quyidagicha:
elementNomi massivNomi[Satr_hajmi][Ustun_hajmi];
Bunga misol sifatida, int qiymatlardan iborat matsitsa massivining e‘lon qilinishini
ko`rishimiz mumkin:
int matritsa[5][5];
Bu yerda ikkita burchakli qavslarga olingan qiymatlarning birinchisi – satrelementlari
sonini, ikkinchisi esa, ustun elementlari sonini ifodalaydi. Xuddi bir o`lchovli massiv singari, bu
yerda ham barcha indekslardagi elementlar bir xil turda, ya‘ni, int turida berilgan va 0 dan
boshlab tartiblangan. Buni 13.1-rasmda ko`rishimiz mumkin.Dasturchilar tomonidan ko`p
hollarda yo`l qo`yiladigan xatoliklardan biri – masalan, 2-satr, 1-ustun elementiga murojaatni
matritsa[2, 1] ko`rinishda yozilishidir. C++ da element indekslari alohida burchakli qavslar
ichiga olib yozilishi kerak.
56.
Ikki o‗lchovli massivlarga oid masalalar (massivga konsoldan qiymat kiritish, massivdagi
barcha elementlar yig‗indisini hisoblash).
Massivga konsoldan qiymat berish huddi bir o‘lchamdagidek bo‘ladi faqat sikl 2 ichma ich
bo‘ladi masalan:
Int a[2][3];
For(int i=0; i<2; i++)
For(int j=0; j<3; j++)
Cin>>a[i][ j ];
Ularni yig‘indisini hisoblash ham sikl orqali:
Int a[2][3];
Int sum=0; // Yig‘indini hisoblash uchun;
For(int i=0; i<2; i++)
For(int j=0; j<3; j++)
Sum+=a[i][ j];
57.
Ikki o‗lchovli massivlarga oid masalalar (massiv elementlariga tasodifiy qiymatlar berish,
massivni konsolga chop etish).
Massivga tasodifiy qiymat berish huddi bir o‘lchamdagidek bo‘ladi faqat sikl 2 ichma ich bo‘ladi
masalan:
Int a[2][3];
For(int i=0; i<2; i++)
For(int j=0; j<3; j++)
a[i][ j ]= rand() ;
Massivga konsolga chop etish huddi bir o‘lchamdagidek bo‘ladi faqat sikl 2 ichma ich bo‘ladi
masalan:
Int a[2][3];
For(int i=0; i<2; i++)
For(int j=0; j<3; j++)
Cout< 58.
Ikki o‗lchovli massivlarga oid masalalar (massivdagi barcha elementlar yig‗indisini
hisoblash, elementlari yig‗indisi eng katta bo‗lgan satrni aniqlash).
59.
Ikki o‗lchovli massivlarga oid masalalar (ustun elementlari yig‗indisini hisoblash, massiv
elementlari qiymatlarini tasodifiy almashtirish).
Ustun elementlari yig‘indisi:
Int a[4][3];
Int sum=0; // ustunlar yig‘indisi
For(int i=0; i<3; i++)
For(int j=0; j<4; j++)
Sum+=a[ j][i];
60.
Ikki o‗lchovli massivlarni funksiyaga argument sifatida uzatish (passing two-dimensional
arrays to functions).
Ikki o`lchovli massiv funksiyaga yuborilganda, C++ da ustun hajmi funksiyada e‘lon qilingan
parametrga mos bo`lishi talab etiladi. Massivni argument qilib yuborishda massivni shunchaki
ismini yozish kerak (misol: funk(a); ). Faqat yuborayotgan funksiyangizning parametridagi
massivning elementlari avvaldan nechraligi tayinlangan bo‘lishi kerak!
61.
Rekursiv funksiyalar (recursive functions).
Rekursiya – oddiy sikl yordamida dasturlash mushkul bo`lgan masalalarni oqilona hisoblash
usulidir. Rekursiyadan foydalanish – bu o`z-o`zini chaqiruvchi funksiyalardan foydalanib
dasturlash demakdir. Rekursiya – dasturlashning foydali usuli. Ba'zi hollarda, bu bizga
boshqa murakkab muammolarga tabiiy, sodda, oddiy yechimlar asosida yondoshish
imkonini beradi. Rekursiv funksiya – o`zini-o`zi chaqiruvchi yagona funksiya.
|