Kommunikatsiyalarini rivojlantirish vazirligi muso al-xorazmiy nomidagi toshkent axborot texnologiyalari
Download 111.99 Kb.
|
Dasturlash 10-mustaqil ishi
- Bu sahifa navigatsiya:
- Mavzu: Vektorlarni funksiya parametrlari sifatida qo’llanilishi. Bajardi: Asanov. A Tekshirdi: Masharipov. S Urganch 2022
- 2.1. Funktsiyaga parametrlarni samarali otkazish 2.2. Vektorga elementlar qoshish Yakuniy qism. Xulosa
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 funksiyasini yozamiz. Biz quyidagi kod bilan boshlashimiz mumkin: #o'z ichiga #include #include std nom maydonidan foydalanish; void add_item(vector vec.push_back("Yangi element!"); }
int main() { vektor 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 vec.push_back("Yangi element!"); qaytish vec; }
int main() { vektor vektor 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.push_back("Yangi element!"); }
int main() { vektor 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 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 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: |
ma'muriyatiga murojaat qiling