logo

Funksiyalarda argument sifatida local, global o’zgaruvchilardan va havolalardan foydalanish

Yuklangan vaqt:

04.08.2023

Ko'chirishlar soni:

0

Hajmi:

1229 KB
Funksiyalarda Funksiyalarda argument argument sifatida local, sifatida local, global global o’zgaruvchilardo’zgaruvchilard an va an va havolalardan havolalardan foydalanishfoydalanish Reja: 1. Funksiya prototiplari; 2. Lokal va global parametrlar(o’zgaruvchilar); 3. Xulosa. Funksiya prototiplari Programmada ishlatiladigan har qanday funksiya e&#39;lon qili- nishi kerak. Odatda funksiyalar e&#39;loni sarlavha fayllarda e&#39;lon qilinadi va #include direktivasi yordamida programma matniga qo‘shiladi. Funksiya e&#39;lonini funksiya prototipi tavsiflaydi (ayrim hollarda signatura deyiladi). Funksiya prototipi quyidagi ko‘rinishda bo‘ladi <qaytaruvchi qiymat turi> <funksiya nomi>(<parametrlar ro‘yxati >); Funksiya prototiplariga misollar: • int almashsin(int,int); • double max(double x,double y); • void func(); • void chop_etish(void); Ko‘rinish sohasi. Lokal va global o‘zgaruvchilar O‘zgaruvchilar funksiya tanasida yoki undan tashqarida e&#39;lon qilinishi mumkin. Funksiya ichida e&#39;lon qilingan o‘zgaruvchilarga lokal o‘zgaruvchilar deyiladi. Bunday o‘zgaruvchilar xotiradagi prog-ramma stekida joylashadi va faqat o‘zi e&#39;lon qilingan funksiya tanasida amal qiladi. Boshqaruv asosiy funksiyaga qaytishi bilan lokal o‘zgaruvchilar uchun ajratilgan xotira bo‘shatiladi (o‘chiriladi). O‘zgaruvchi amal qilish sohasi dan chiqqanda ko‘rinmay qoladi. Ikkinchi tomondan, o‘zgaruvchi amal qilish sohasida bo‘lishi, lekin ko‘rinmas-ligi mumkin. Bunda ko‘rinish sohasiga ruxsat berish amali «::» yordamida ko‘rinmas o‘zgaruvchiga murojat qilish mumkin bo‘ladi. Lokal o‘zgaruvchilar Quyidagi programmada main() va sum() funksiyalarida bir xil nomdagi o‘zgaruvchilarni ishlatish ko‘rsatilgan. Programmada ikkita sonning yig‘indisi hisoblanadi va chop etiladi: Global o‘zgaruvchilar Global o‘zgaruvchilar programma matnida funksiya aniqlanishi-dan tashqarida e&#39;lon qilinadi va e&#39;lon qilingan joyidan boshlab programma oxirigacha amal qiladi. Global o‘zgaruvchilar Shuni qayd etish kerakki, tajribali programma tuzuvchilar imkon qadar global o‘zgaruvchilarni ishlatmaslikka harakat qilishadi, chunki bunday o‘zgaruvchilar qiymatini programmaning ixtiyoriy joyidan o‘zgartirish xavfi mavjudligi sababli programma ishlashida mazmunan xatolar yuzaga kelishi mumkin. Bu fikrimizni tasdiqlovchi programmani ko‘raylik. :: amali Yuqorida qayd qilingandek, lokal o‘zgaruvchi e&#39;loni xuddi shu nomdagi global o‘zgaruvchini «berkitadi» va bu joydan global o‘zgaruvchiga murojat qilish imkoni bo‘lmay qoladi. C++ tilida bunday holatlarda ham global o‘zgaruvchiga murojat qilish imkoniyati saqlanib qolingan. Buning uchun «ko‘rinish sohasiga ruxsat berish» amalidan foydalanish mumkin va o‘zgaruvchi oldiga ikkita nuqta - « :: » qo‘yish zarur bo‘ladi. Misol tariqasida quyidagi programani keltiramiz: :: amali Yuqorida qayd qilingandek, lokal o‘zgaruvchi e&#39;loni xuddi shu nomdagi global o‘zgaruvchini «berkitadi» va bu joydan global o‘zgaruvchiga murojat qilish imkoni bo‘lmay qoladi. C++ tilida bunday holatlarda ham global o‘zgaruvchiga murojat qilish imkoniyati saqlanib qolingan. Buning uchun «ko‘rinish sohasiga ruxsat berish» amalidan foydalanish mumkin va o‘zgaruvchi oldiga ikkita nuqta - « :: » qo‘yish zarur bo‘ladi. Misol tariqasida quyidagi programani keltiramiz: Xotira sinflari O‘zgaruvchilarning ko‘rinish sohasi va amal qilish vaqtini aniqlovchi o‘zgaruvchi modifikatorlari mavjud. Modifikator Qo’llanilishi Amal qilish sohasi Yashash davri auto lokal blok vaqtincha register Lokal Blok Vaqtincha exteru Global Blok Vaqtincha static Lokal blok Doimiy Global Fayl Doimiy volatile Global fayl Doimiy Avtomat o‘zgaruvchilar auto modifikatori lokal o‘zgaruvchilar e&#39;lonida ishlatiladi. Odatda lokal o‘zgaruvchilar e&#39;lonida bu modifikator kelishuv bo‘yicha qo‘llaniladi va shu sababli amalda uni yozishmaydi. #include <iostream.h> int main() { auto int X=2; // int X=2; bilan ekvivalentdir cout<<X; returu 0; } auto modifikatori blok ichida e&#39;lon qilingan lokal o‘zgaruvchi-larga qo‘llaniladi. Bu o‘zgaruvchilar blokdan chiqishi bilan avtomatik ravishda yo‘q bo‘lib ketadi. Registr o‘zgaruvchilar register modifikatori kompilyatorga, ko‘rsatilgan o‘zgaruvchini protsessor registrlariga joylashtirishga harakat qilishni tayinlaydi. Agar bu harakat natija bermasa o‘zga-ruvchi auto turidagi lokal o‘zgaruvchi sifatida amal qiladi. O‘zgaruvchilarni registrlarda joylashtirish programma kodini bajarish tezligi bo‘yicha optimallashtiradi, chunki protsessor xotiradagi berilganlarga nisbatan registrdagi qiymatlar bilan ancha tez ishlaydi. Lekin registrlar soni cheklanganligi uchun har doim ham o‘zgaruvchilarni registrlarda joylashtirishning iloji bo‘lmaydi. #in c lude < iostream.h > int main() { register int Reg; ... return 0; } register modifikatori faqat lokal o‘zgaruvchilariga nisbatan qo‘llaniladi, global o‘zgaruvchilarga qo‘llash kompilyatsiya xatosiga olib keladi. Tashqi o‘zgaruvchilar Agar programma bir nechta moduldan iborat bo‘lsa, ular qandaydir o‘zgaruvchi orqali o‘zaro qiymat almashishlari mumkin ( fayllar orasida ). Buning uchun o‘zgaruvchi birorta modulda global tarzda e&#39;lon qilinadi va u boshqa faylda ( modulda ) ko‘rinishi uchun u yerda extern modifikatori bilan e&#39;lon qilinishi kerak bo‘ladi. extern modifikatori o‘zgaruvchini boshqa faylda e&#39;lon qilinganligini bildiradi. int main() { Bayroq_Almashsin () ; if(Bayroq) cout<< ” Bayroq TRUE”<<endl; else cout<< ” Bayroq FALSE”<<endl; return 0; }//Sarlavha.h файлида void Bayroq_Almashsin(void); // modul_1.cpp файлида bool Bayroq ; void Bayroq_Almashsin(void) {Bayroq=! Bayroq;} // masala.cpp файлида #include < iostream.h> #include <Sarlavha.h> #include <modul_1.cpp> extern bool Bayroq; Statik o‘zgaruvchilar Statik o‘zgaruvchilar static modifikatori bilan e&#39;lon qilinadi va o‘z xususiyatiga ko‘ra global o‘zgaruvchi-larga o‘xshaydi. Agar bu turdagi o‘zgaruvchi global bo‘lsa, uning amal qilish sohasi - e&#39;lon qilingan joydan programma matnining oxirigacha bo‘ladi. Agar statik o‘zgaruvchi funksiya yoki blok ichida e&#39;lon qilinadigan bo‘lsa, u funksiya yoki blokka birinchi kirishda initsializatsiya qilinadi. O‘zgaruvchining bu qiymati funksiya keyingi chaqirilganida yoki blokka qayta kirishda saqlanib qoladi va bu qiymatni o‘zgartirish mumkin. Statik o‘zgaruvchilarni tashqi deb e&#39;lon qilib bo‘lmaydi. Agar statik o‘zgaruvchi initsializatsiya qilinmagan bo‘lsa , uning birinchi murojatdagi qiymati 0 hisoblanadi. Misol tariqasida birorta funksiyani necha marotaba chaqiril-ganligini aniqlash masalasini ko‘raylik: Statik o‘zgaruvchilar Statik o‘zgaruvchilar(masala) Masala : Berilgan ishorasiz butun sonning barcha tub bo‘luv-chilari aniqlansin. Masalani yechish algoritmi: quyidagi takrorla-nuvchi jarayondan iborat bo‘ladi: berilgan son tub songa (1-qadamda 2 ga) bo‘linadi. Agar qoldiq 0 bo‘lsa, tub son chop qilinadi va bo‘linuv-chi sifatida bo‘linma olinadi, aks holda navbatdagi tub son olinadi. Takrorlash navbatdagi tub son bo‘linuvchiga teng bo‘lguncha davom etadi. Dasturi volatile sinfi o‘zgaruvchilari Agar programmada o‘zgaruvchini birorta tashqi qurilma yoki boshqa programma bilan bog‘lash uchun ishlatish zarur bo‘ladigan bo‘lsa, u volatile modifikatori bilan e&#39;lon qilinadi. Kompilyator bunday modifikatorli o‘zgaruvchini registrga joylashtirishga harakat qilmaydi. Bunday o‘zgaruvchilar e&#39;loniga misol quyida keltirilgan: volatile short port_1; volatile const int Adress=0x00A2; Misoldan ko‘rinib turibdiki, volatile modifikatorli o‘zgarmas ham e&#39;lon qilinishi mumkin. Nomlar fazosi Agar programmada yangi identi-fikatorni aniqlash kerak bo‘lsa va xuddi shu nomni boshqa modul-larda yoki kutubxonalarda ishlatishi xavfi bo‘ladigan bo‘lsa, bu identifikatorlar uchun o‘zining shaxsiy nomlar fazosini aniqlash mumkin. Bunga namespace kalit so‘zidan foydalanilgan holda erishiladi: namespace < nomlar fazosining nomi > { // e’lonlar } Nomlar fazosi Nomlar fazosi ichida e&#39;lon qilingan identifikatorlar faqat < nomlar fazosining nomi > ko‘rinish sohasida bo‘ladi va yuzaga kelishi mumkin bo‘lgan kelishmovchiliklarning oldi olinadi. Misol tariqasida quyidagi nomlar fazosini yarataylik: namespace Shaxsiy_nomlar { int x,y,z; void Mening_funksiyam(char belgi); } Nomlar fazosi Kompilyatorga konkret nomlar fazosidagi nomlarni ishlatish kerakligini ko‘rsatish uchun ko‘rinish sohasiga ruxsat berish amali- dan foydalanish mumkin: Shaxsiy_nomlar::x=5; Agar programma matnida konkret nomlar fazosi ga nisbatan ko‘p murojaat qilinadigan bo‘lsa using namespace qurilmasini ishlatish orqali yozuvni soddalashtirish mumkin: using namespace < nomlar fazosi nomi >; ko‘rsatmasi kompilyatorga, bundan keyin toki navbatdagi using uchramaguncha Shaxsiy_nomlar fazosidagi nomlar ishlatilishi kerak- ligini bildiradi: x=0; y=z=10; Mening_functsiyam(’A’); Nomlar fazosi Programma va unga qo‘shilgan sarlavha fayllari tomonidan aniqlanadigan nomlar fazosi std deb nomlanadi. Standart fazoga o‘tish kerak bo‘lsa using namespace std; ko‘rsatmasi beriladi. Agar birorta nomlar fazosidagi alohida bir nomga murojaat qilish zarur bo‘lsa, using qurilmasini boshqa shaklida foydala-niladi. Misol uchun using namespace std; using namespace Shaxsiy_nomlar::x; ko‘rsatmasi x identifikatorini Shaxsiy_nomlar fazosidan ishlatish kerakligini bildiradi. Nomlar fazosi Nomlar fazosi funksiya ichida e&#39;lon qilinishi mumkin emas, lekin ular boshqa nomlar fazosi ichida e&#39;lon qilinishi mumkin. Ichma- ich joylashgan nomlar fazosidagi identifikatorga murojaat qilish uchun uni qamrab olgan barcha nomlar fazosi nomlar ketma-ket ravishda ko‘rsatilishi kerak. Misol uchun , quyidagi ko‘rinishda nomlar fazosi e&#39;lon qilingan bo‘lsin: namespace Yuqori {... namespace Urta {... namespace Ichki {int Ichki_n;} }} Ichki_n o‘zgaruvchisiga murojaat quyidagi ko‘rinishda bo‘ladi: Yuqori::Urta::Ichki::Ichki_n=0; Joylashtiriladigan (inline) funksiyalar Odatda funksiyani chaqirish protsessor tomonidan qo‘shimcha vaqt va xotira resurslarini talab qiladi. Shu sababli, agar chaqiriladigan funksiya hajmi unchalik katta bo‘lmagan hollarda, kompilyatorga funksiyani chaqirish kodi o‘rniga funksiya tanasini o‘zini joylashtirishga ko‘rsatma berish mumkin. Bu ish funksiya prototipini inline kalit so‘zi bilan e&#39;lon qilish orqali amalga oshiriladi. Natijada hajmi oshgan, lekin nisbatan tez bajariladigan programma kodi yuzaga keladi. Xulosa Funksiya ga qiymat uzatish cuhun parametrlardan foydalaniladi. Funksiyada masala qo’yilishiga qarab o’zgaruvchilar lokal yoki global etib e’lon qilinadi. Inline funksiya - murojat yo’llarini kamaytirib natija codini joylashtiradi.