Kommunikatsiyalarini rivojlantirish vazirligi muso al-xorazmiy nomidagi toshkent axborot texnologiyalari


Download 111.99 Kb.
bet1/4
Sana14.12.2022
Hajmi111.99 Kb.
#1005798
  1   2   3   4
Bog'liq
Dasturlash 10-mustaqil ishi


AXBOROT TEXNOLOGIYALARI VA
KOMMUNIKATSIYALARINI RIVOJLANTIRISH
VAZIRLIGI MUSO AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI
UNIVERSITETI URGANCH FILIALI 963/21-guruh
Dasturlash kafedrasi


Dasturlash 1 ma’ruza fanidan


MUSTAQIL ISH


Mavzu: Vektorlarni funksiya parametrlari sifatida qo’llanilishi.


Bajardi: Asanov. A


Tekshirdi: Masharipov. S
Urganch 2022

Reja

I.


II.
III.
Kirish.


Asosiy qism.


2.1. Funktsiyaga parametrlarni samarali o'tkazish


2.2. Vektorga elementlar qo'shish


Yakuniy qism.


Xulosa






Foydalanilgan adabiyotlar.



1.Funktsiyaga parametrlarni samarali o'tkazish

vektor konteynerini oladigan va konteyner oxiriga yangi element qo‘shuvchi add_item


funksiyasini yozamiz. Biz quyidagi kod bilan boshlashimiz mumkin:

#o'z ichiga


#include


#include


std nom maydonidan foydalanish;


// Bu yerda muammo bor


void add_item(vectorvec) {


vec.push_back("Yangi element!");


}


int main() {

vektorvec;


qo'shish_element(vec);


uchun (string s : vec) {


cout << s << '\n';


}


qaytish 0;

}


Agar biz ushbu dasturni kompilyatsiya qilsak va ishga tushirsak, add_item funksiyasini chaqirgandan
so'ng, vec konteyneri bo'sh qolganligini topamiz. Muammo shundaki, biz vec obyektining nusxasini
funksiyaga uzatdik. Funktsiya ichida ushbu nusxaga yangi element qo'shildi va funktsiya tugagandan
so'ng nusxa o'chirildi.
Dasturimizning keyingi versiyasi allaqachon biz xohlagan narsani bajaradi:

// Bu yerda muammo bor


vektor add_item(vektorvec) {


vec.push_back("Yangi element!");


qaytish vec;


}


int main() {

vektorvec;


vektor vec2 = add_element(vec);


uchun (string s: vec2) {


cout << s << '\n';


}


qaytish 0;

}


Biroq, bunday amalga oshirish juda yomon fikrdir. Biz vektorga faqat bitta element qo'shmoqchi edik,
lekin buning o'rniga yangi element qo'shilgan vektorning nusxasini oldik. Ishning noto'g'ri mantig'iga
qo'shimcha ravishda, biz ishlashning mumkin bo'lgan muammosiga duch keldik: doimiy vaqt o'rniga biz
vektorga element qo'shish uchun chiziqli vaqt sarflaymiz.

C++ da bizning muammomizning to'g'ri echimi quyidagicha:


void add_item(vektor&vec) {


vec.push_back("Yangi element!");


}


int main() {

vektorvec;


qo'shish_element(vec);








uchun (string s : vec) {

cout << s << '\n';


}


qaytish 0;

}


Amersand belgisi & funksiyaga parametr havolasini uzatish imkonini beradi. Funksiya ichidagi parametr
bilan ishlash o'zgarmaydi, lekin nusxa o'rniga biz aynan funksiyaga uzatilgan ob'ekt bilan ishlaymiz.
Shunday qilib, biz keraksiz nusxa ko'chirishdan xalos bo'ldik va dasturning to'g'ri mantiqini amalga
oshirdik.

Keling, yana bir misolni ko'rib chiqaylik. Aytaylik, biz vektorni vektor elementlarini tahlil qiladigan,


lekin uni o'zgartirmaydigan funktsiyaga o'tkazmoqchimiz. Masalan:

// Bu yerda muammo bor


int count_greetings(vector&vec) {


int hisoblagichi = 0;


uchun (string s : vec) {


agar (s == "Salom") {


++hisoblagich;


}


}

qaytish hisoblagichi;


}


Biz allaqachon juda savodlimiz va keraksiz nusxa ko'chirishning oldini olish uchun darhol vektorni
havola orqali o'tkazdik. Biroq, hozirgi ko'rinishida, count_greetings funktsiyasi boshqacha, yanada nozik
muammoga ega. Agar biz konventsiyani buzsak va count_greetings funksiyasi ichidagi vektorni
o'zgartirsak, kompilyator buni muammo sifatida ko'rmaydi. Dasturimizning qaysidir joyida vektorning
noto'g'ri manipulyatsiyasi sodir bo'lganligini tushunganimizda, muammoni qidiramiz.

Bu holda yaxshi uslub parametrni doimiy havola orqali o'tkazishdir:


int count_greetings(const vektor&vec) {








int hisoblagichi = 0;

uchun (const string & s : vec) {


agar (s == "Salom") {


++hisoblagich;


}


}

qaytish hisoblagichi;


}


Endi kompilyator count_greetings funksiyasi ichidagi vec ob'ektini o'zgartirishga ruxsat bermaydi.
Bundan tashqari, kod endi ob'ekt faqat o'qish uchun funksiyaga uzatilganligi haqidagi fikrni aniq
ifodalaydi. Bunday kodni o'qish va uning ish mantig'ini tushunish osonroq. E'tibor bering, biz for
tsiklidagi o'zgaruvchini aniqlashda doimiy havoladan foydalanganmiz. Bu erda biz shunga o'xshash
vaziyat bilan shug'ullanamiz: oldingi versiyada vektorning har bir elementi o'z navbatida s
o'zgaruvchisiga ko'chirildi. Endi biz tsikldagi ob'ektlarga doimiy havolalarni nusxa ko'chirmasdan
takrorlaymiz.

Ba'zan tsikldagi vektor elementlarini o'zgartirish kerak bo'ladi. Bunday holda siz doimiy bo'lmagan


havoladan foydalanishingiz kerak:

uchun (string & s : vec) {


s.push_back('!');


}


Ob'ektga doimiy havolani ob'ektni o'zgartirish huquqiga ega bo'lmagan funktsiyaga o'tkazish faqat
ob'ektdan nusxa ko'chirish qimmat operatsiya bo'lsa mantiqiy bo'ladi. Xususan, int yoki double
ob'ektlarni mos yozuvlar bo'yicha o'tkazishning ma'nosi yo'q. Aksincha, bu ishlashning yo'qolishiga olib
kelishi mumkin. Agar biz satr yoki har qanday konteyner kabi murakkab ob'ekt bilan ishlayotgan bo'lsak,
doimiy havola orqali o'tish yagona to'g'ri echimdir. C++ da havolalardan foydalanish funksiyalarga
parametrlarni o‘tkazish bilan chegaralanib qolmaydi, lekin bu misol havolalar bilan boshlashning eng
oson yo‘lidir. const kalit so'zi C++ da juda ko'p qo'llaniladi. Ulardan ba'zilari haqida keyinroq




gaplashamiz.


Download 111.99 Kb.

Do'stlaringiz bilan baham:
  1   2   3   4




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