logo

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

Yuklangan vaqt:

01.11.2023

Ko'chirishlar soni:

0

Hajmi:

80.9462890625 KB
Funksiyalarda argument sifatida local, global o’zgaruvchilardan va havolalardan foydalanish Reja: 1 . Lokal o’zgaruvchilar 2 . Global o’zgaruvchilar 3 . Havolalar tushunchasi Ko’rinish sohasi. Lokal va global o’zgaruvchilar O’zgaruvchilar funksiya tanasida yoki undan tashqarida e’lon qilinishi mumkin. Funksiya ichida e’lon qilingan o’zgaruvchilarga lokal o’zgaruvchilar deyiladi. Bunday o’zgaruvchilar xotiradagi prog-ramma stekida joylashadi va faqat o’zi e’lon qilingan funksiya tanasida amal qiladi. Boshqaruv asosiy funksiyaga qaytishi bilan lokal o’zgaruvchilar uchun ajratilgan xotira bo’shatiladi (o’chiriladi). Har bir o’zgaruvchi o’zining amal qilish sohasi va yashash vaqti xususiyatlari bilan xarakterlanadi. O’zgaruvchi amal qilish sohasi deganda o’zgaruvchini ishlatish mumkin bo’lgan programma sohasi (qismi) tushuniladi. Bu tushuncha bilan o’zgaruvchining ko’rinish sohasi uzviy bog’langan. O’zgaruvchi amal qilish sohasidan 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. O’zgaruvchining yashash vaqti deb, u mavjud bo’lgan programma bo’lagining bajarilishiga ketgan vaqt intervaliga aytiladi. Lokal o’zgaruvchilar o’zlari e’lon qilingan funksiya yoki blok chegarasida ko’rinish sohasiga ega. Blokdagi ichki bloklarda xuddi shu nomdagi o’zgaruvchi e’lon qilingan bo’lsa, ichki bloklarda bu lokal o’zgaruvchi ham amal qilmay qoladi. Lokal o’zgaruvchi yashash vaqti - blok yoki funksiyani bajarish vaqti bilan aniqlanadi. Bu hol shuni anglatadiki, turli funksiyalarda bir-biriga umuman bog’liq bo’lma-gan bir xil nomdagi lokal o’zgaruvchilarni ishlatish mumkin. Quyidagi programmada main() va sum() funksiyalarida bir xil nomdagi o’zgaruvchilarni ishlatish ko’rsatilgan. Programmada ikkita sonning yig’indisi hisoblanadi va chop etiladi: #include <iostream.h> // funksiya prot otipi int sum (int a;int b); int main() { // lokal o’zgaruvchilar int x=r; int y=4; cout<<sum (x, y); return 0; } int sum (int a,int b) { // lokal o’zgaruvchi int x=a+b; return x; } Global o’zgaruvchilar programma matnida funksiya aniqlanishi - dan tashqarida e’lon qilinadi va e’lon qilingan joyidan boshlab programma oxirigacha amal qiladi. #include <iostream.h> int f1(); int f2(); int main() { cout<<f1()<<&#34; &#34;<<f2()<<endl; return 0; } int f1() { return x;// kompilyasiya xatosi ro’y beradi } int x=10; // global o’zgaruvchi e’loni int f2(){ return x*x;} YUqorida keltirilgan programmada kompilyasiya xatosi ro’y beradi, chunki f1() funksiya uchun x o’zgaruvchisi noma’lum hisob-lanadi. Programma matnida global o’zgaruvchilarni ular e’lonidan keyin yozilgan ixtiyoriy funksiyada ishlatish mumkin. SHu sababli, global o’zgaruvchilar programma matnining boshida yoziladi. Funksiya ichidan global o’zgaruvchiga murojat qilish uchun funksiyada uning nomi bilan mos tushadigan lokal o’zgaruvchilar bo’lmasligi kerak. Agar global o’zgaruvchi e’lonida unga boshlang’ich qiymat berilmagan bo’lsa, ularning qiymati 0 hisoblanadi. Global o’zgaruvchining amal qilish sohasi uning ko’rinish sohasi bilan ustma-ust tushadi. 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. # include <iostream.h> // global o’zgaruvchi e’loni inttest =100; void Chop_qilish (void) int main () { //lokal o’zgaruvchi e’loni int test=10; //global o’zgaruvchi chop qilish fun ksiyasini chaqirish Chop_qilish (); sout<<” Lokal o’zgaruvchi: <<test<<‘\n’; return 0; } void Chop_qilish(void) { cout<< ” Global o’zgaruvchi: ”<<test<<‘\n’; } Programma boshida test global o’zgaruvchisi 100 qiymati bilan e’lon qilinadi. Keyinchalik, main() funksiyasida test nomi bilan lokal o’zgaruvchisi 10 qiymati bilan e’lon qilinadi. Programmada, Chop_qilish() funksiyasiga murojaat qilinganida, asosiy funksiya tanasidan vaqtincha chiqiladi va natijada main() funksiyasida e’lon qilingan barcha lokal o’zgaruvchilarga murojaat qilish mumkin bo’lmay qoladi. SHu sababli Chop_qilish() funksiyasida global test o’zgaruvchisining qiymatini chop etiladi. Asosiy programmaga qaytilgandan keyin, main() funksiyasidagi lokal test o’zgaruvchisi global test o’zgaruvchisini «berkitadi» va lokal test o’zgaruvchini qiymati chop etiladi. Programma ishlashi natijasida ekranga quy i dagi natijalar chop etiladi: Global o’zgaruvchi: 100 Lokal o’zgaruvchi: 10 :: amali YUqorida qayd qilingandek, lokal o’zgaruvchi e’loni xuddi shu nomdagi global o’zgaruvchini «berkitadi» va bu joydan global o’zgaruvchiga murojat qilish imkoni bo’lmay qoladi. S++ tilida bunday holatlarda ham global o’zgaruvchiga murojat qilish imko-niyati 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: #include <iostream.h > //global o’zgaruvchi e’loni int uzg=5; int main() { //lokal o’zgaruvchi e’loni int uzg=70; //lokal o’zgaruvchini chop etish cout<<uzg<<‘/n’; //global o’zgaruvchini chop etish  cout<<::uzg << ’ /n’; return 0; } Programma ishlashi natijasida ekranga oldin 70 va keyin 5 sonlari chop etiladi. Xotira sinflari O’zgaruvchilarning ko’rinish sohasi va amal qilish vaqtini aniqlovchi o’zgaruvchi modifikatorlari mavjud (5.1-jadval). 5.1-jadval. O’zgaruvchi modifikatorlari Modifikator Qo’llanishi Amal qilish so h asi Y a shash 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’lonida ishlatiladi. Odatda lokal o’zgaruvchilar e’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 ekvivalent cout<<X; returu 0; } auto modifikatori blok ichida e’lon qilingan lokal o’zgaruvchi-larga qo’llaniladi. Bu o’zgaruvchilar blokdan chiqishi bilan avtoma-tik 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 kompilyas i ya xatosiga olib keladi. Tashqi o’zgaruvchilar. Agar programma bir nechta moduldan iborat bo’lsa, ular qandaydir o’zgaruvchi orqali o’zaro qiymat alma-shishlari mumkin (fayllar orasida). Buning uchun o’zgaruvchi birorta modulda global tarzda e’lon qilinadi va u boshqa faylda (modulda) ko’rinishi uchun u erda extern modifikatori bilan e’lon qilinishi kerak bo’ladi. extern modifikatori o’zgaruvchini boshqa faylda e’lon qilinganligini bildiradi. Tashqi o’zgaruvchilar ishlatilgan prog-rammani ko’raylik. //Sarlavha.h faylida void Bayroq_Almashsin(void); // modul_1.cpp faylida bool Bayroq ; void Bayroq_Almashsin(void) {Bayroq=!Bayroq;} // masala.cpp faylida #include < iostream.h> #include <Sarlavha.h> #include <modul_1.cpp> extern bool Bayroq; int main () { Bayroq_Almashsin () ; if(Bayroq) cout<< ” Bayroq TRUE”<<endl; else cout<< ” Bayroq FALSE”<<endl; return 0; } Oldin sarlavha.h faylida Bayroq_Almashsin( ) funksiya sarlav-hasi e’lon qilinadi, keyin modul_1.srr faylida tashqi o’zgaruvchi e’lon qilinadi va Bayroq_Almashsin() funksiyasining tanasi aniqla-nadi va nihoyat, masala.cpp faylida Bayroq o’zgaruvchisi tashqi deb e’lon qilinadi. Statik o’zgaruvchilar. Statik o’zgaruvchilar static modifika-tori bilan e’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’lon qilingan joydan programma matnining oxirigacha bo’ladi. Agar statik o’zgaruvchi funksiya yoki blok ichida e’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’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: #include <iostream.h > int Sanagich(void); int main() { int natija;  for (int i=0; i<30; i++) natija=Sanagich(); cout<<natija; return 0; } int Sanagich(void) { static short sanagich=0; ... sanagich++; return sanagich; } Bu erda asosiy funksiyadan counter statik o’zgaruvchiga ega Sanagicht() funksiyasi 30 marta chaqiriladi. Funksiya birinchi marta chaqirilganda sanagich o’zgaruvchiga 0 qiymatini qabul qiladi va uning qiymati birga ortgan holda funksiya qiymati sifatida qaytariladi. Statik o’zgaruvchilar qiymatlarini funksiyani bir chaqirilishidan ikkinchisiga saqlanib qolinishi sababli, keyingi har bir chaqirishlarda sanagich qiymati bittaga ortib boradi. Masala. Berilgan ishorasiz butun sonning barcha tub bo’luv-chilari aniqlansin. Masalani echish 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. Programma matni: #include<iostream.h> #include<math.h> int Navb_tub(); int main() {  unsigned int n,p; cout<<”\nn qiymatini kiritng: ”; cin>>n; cout<<&#34;\n1&#34;; p=Navb_tub(); while(n>=p) { if(n%p==0) { cout<<&#34;*&#34;<<p; n=n/p; } else p=Navb_tub(); } return 0; } int Navb_tub() { static unsigned int tub=1; for(;;) { tub++; short int ha_tub=1; for(int i=2;i<=tub/2;i++) if(tub%i==0)ha_tub=0; if(ha_tub)return tub; } return 0; } Programmada navbatdagi tub sonni hosil qilish funksiya ko’ri - nishida amalga oshirilgan. Navb_tub() funksiyasining har chaqirili-shida oxirgi tub sondan keyingi tub son topiladi. Oxirgi tub sonni «eslab» qolish uchun tub o’zgaruvchisi static qilib aniqlangan. Programma ishga tushganda klaviaturadan n o’zgaruvchisining qiymati sifatida 60 soni kiritilsa, ekranga quyidagi ko’paytma chop etiladi: 1*2*2*3*5 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’lon qilinadi. Kompilyator bunday modifikatorli o’zgaruvchini registrga joylashtirishga harakat qilmaydi. Bunday o’zgaruvchilar e’loniga misol quyida keltirilgan: volatile short port_1; volatile const int Adress=0x00A2; Misoldan ko’rinib turibdiki, volatile modifikatorli o’zgarmas ham e’lon qilinishi mumkin. onsider this sample program: 1  int x; 2   int mystery(int x) 3   { 4   int s = 0; 5   for (int i = 0; i < x; i++) 6   { 7   int x = i + 1; 8   s = s + x; 9   } 10   return x; 11   } 12   int main() 13   { 14   x = 4; 15   int s = mystery(x); 16   cout << s << endl; 17   } 28.   Which line defines a global variable? 29.   Which lines define local variables named x ? 30.   Which lines are in the scope of the definition of x in line 2? 31.   Which variable is changed by the assignment in line 14? 32.   This program defines two variables with the same name whose scopes don’t overlap. What are they? ch05/account.cpp 1 #include <iostream> 2 3using namespace std; 4 5 / ** 6 Withdraws the amount from the given balance, or withdraws 7 a penalty if the balance is insufficient. 8 @par am balan ce the balance from which to make the withdrawal 9 @param amount the amount to withdraw 10 * / 11 void withdraw( double & balance, double amount) 12 { 13 constdouble PENALTY = 10 ; 14 if (balance >= amount) 15 { 16 balance = balance - amount; 17 } 18 e l s e 19 { 20 balance = balance - PENALTY; 21 } 22 } 23 24 int main() 25 { 26 double harrys_account = 1000 ; 27 double sallys_account = 500 ; 28 withdraw(harrys_account, 100 ); 29 // Now harrys_account is 900 30 withdraw(harrys_account, 1000 ); // Insufficient funds 31 // Now harrys_account is 890 32 withdraw(sallys_account, 150 ); 33 cout << &#34;Harry&#39;s account: &#34; << harrys_account << endl; 34 cout << &#34;Sally&#39;s account: &#34;<< sallys_account << endl; 35 36 r etu rn 0; 37 } program run Harry&#39;s account: 890 Sally&#39;s account: 350 ch05/intname.cpp 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 / ** 7 Turns a digit into its English name. 8 @par am digit an integer between 1 and 9 9 @ r et u r n the name of digit (“one” ... “nine”) 10 * / 11 string digit_name( int digit) 12 { 13 if (digit == 1) return &#34;one&#34; ; 14 if (digit == 2) return &#34;two&#34; ; 15 if (digit == 3) return &#34;three&#34; ; 16 if (digit == 4) return &#34;four&#34; ; 17 if (digit == 5) return &#34;five&#34; ; 18 if (digit == 6) return &#34;six&#34; ; 19 if (digit == 7) return &#34;seven&#34; ; 20 if (digit == 8) return &#34;eight&#34; ; 21 if (digit == 9) return &#34;nine&#34; ; 22 r etu rn &#34;&#34; ; 23 } 24 25 / ** 26 Turns a number between 10 and 19 into its English name. 27@par am number an integer between 10 and 19 28 @ r et ur n the name of the given number (“ten” ... “nineteen”) 29 * / 30 string teen_name( int number) 31 { 32 if (number == 10 ) return &#34;ten&#34; ; 33 if (number == 11 ) return &#34;eleven&#34; ; 34 if (number == 12 ) return &#34;twelve&#34; ; 35 if (number == 13 ) return &#34;thirteen&#34; ; 36 if (number == 14) return &#34;fourteen&#34; ; 37 if (number == 15 ) return &#34;fifteen&#34; ; 38 if (number == 16 ) return &#34;sixteen&#34; ; 39 if (number == 17 ) return &#34;seventeen&#34; ; 40 if (number == 18 ) return &#34;eighteen&#34; ; 41 if (number == 19 ) return &#34;nineteen&#34; ; 42 r etu rn &#34;&#34; ; 43 } 44 45 / ** 46 Gives the name of the tens part of a number between 20 and 99. 47 @par am number an integer between 20 and 99 48 @ r et ur n the name of the tens part of the number (“twenty” ... “ninety”) 49 * / 50 string tens_name( int number) 51 { 52 if (number >= 90 ) return &#34;ninety&#34; ; 53 if (number >= 80 ) return &#34;eighty&#34; ; 54 if (number >= 70 ) return &#34;seventy&#34; ; 55 if (number >= 60 ) return &#34;sixty&#34; ; 56if (number >= 50 ) return &#34;fifty&#34; ; 57 if (number >= 40 ) return &#34;forty&#34; ; 58 if (number >= 30 ) return &#34;thirty&#34; ; 59 if (number >= 20 ) return &#34;twenty&#34; ; 60 r etu rn &#34;&#34; ; 61 } 62 63 / ** 64 Turns a number into its English name. 65 @par am number a positive integer < 1,000 66 @ r et ur n the name of the number (e.g. “two hundred seventy four”) 67 * / 68 string int_name( int number) 69 { 70 int part = number; // The part that still needs to be converted 71 string name; // The return value 72 73 if (part >= 100 ) 74 { 75 name = digit_name(part / 100 ) + &#34; hundred&#34; ; 76 part = part % 100 ; 77 } 78 79 if (part >= 20 ) 80 { 81 name = name + &#34; &#34; + tens_name(part); 82 part = part % 10 ; 83 } 84 else if (part >= 10 ) 85 { 86 name = name + &#34; &#34; + teen_name(part); 87part = 0; 88 } 89 90 if (part > 0) 91 { 92 name = name + &#34; &#34; + digit_name(part); 93 } 94 95 r etu rn name; 96 } 97 98 int main() 99 { 100 cout << &#34;Please enter a positive integer: &#34; ; 101 i nt input; 102 cin >> input; 103 cout << int_name(input) << endl; 104 r etu rn 0; 105 } program run Please enter a positive integer: 729 seven hundred twenty nine Adabiyotlar: 1. K.P.Abduraxmanov, O’.Egamov “Fizika kursi” darsligi, Toshkent.: Aloqachi 2013 y. 2. K.P.Abduraxmanov, O’.Egamov “Fizika kursi” darslik, Toshkent, “O’quv ta’lim metodikasi” 2015 y. 3. Савельев И. В. Курс физики. М.: Наука 1989 т. 1 4. Савельев И. В. Курс физики. М.: Наука 1989 т. 2 5. Савельев И. В. Курс физики. М.: Наука 1989 т. 3 6. Савельев И. В. Сборник вопросов и задач по общей физик е . М.: АСТ. Астрель. 2005. С.320. 7. К.П.Абдурахманов, Ў.Эгамов “ Физика курси” дарслиги, Тошкент, 2010 й. 8. П.А.Типлер, Р.А.Ллуэллин Современная физика (Лучший зарубежный учебник в двух томах) М. Мир.2007.С.496 (1том) 9. П.А.Типлер, Р.А.Ллуэллин Современная физика (Лучший зарубежный учебник в двух томах) М. Мир.2007.С.416 (2том) 10. Трофимова Т.И. Курс физики.М.Высшая щкола 1999.С.543 Интернет сайтлар: 1. www.ziyonet.uz ; 2. www.estudy.uz ; 3. www.fizika.uz ; 4. www.elearning.uz ; 5. www.bilim.uz ; 6. www.edx.uz ; 7. www.my.estudy.uz ; 8. www.conrsera.org.uz ;