«Aniq fanlar» kafedrasi fanidan ma’ruzalar matni
Ko’rsatkichlar va murojaatlar funksiya parametri sifatida
Download 1.15 Mb.
|
dasturlash fanidan maruzalar matni 2
Ko’rsatkichlar va murojaatlar funksiya parametri sifatida:Funksiya prototipida yoki aniqlanish sarlavhasida ko‘rsatilgan parametrlar formal parametrlar deyiladi, funksiya chaqirishida ko’rsatilgan argumentlarga faktik parametrlar deyiladi.
Funksiya chaqirilishida faktik parametrning turi mos o‘rindagi formal parametr turiga to‘g‘ri kelmasa, kompilyatsiya xatosi ro‘y beradi. Faktik parametrlarni funksiyaga ikki xil usul bilan uzatish mumkin: qiymati yoki adresi bilan. Funksiya chaqirilishida argument qiymat bilan uzatilganda, argument yoki uning o‘rnidagi kelgan ifoda qiymati va boshqa argumentlarning nusxasi (qiymatlari) stek xotirasiga yoziladi. Funksiya faqat shu nusxalar bilan amal qiladi, kerak bo‘lsa bu nusxalarga o‘zgartirishlar qilinishi mumkin, lekin bu o‘zgarishlar argumentning o‘ziga ta’sir qilmaydi va funksiya o‘z ishini tugatishi bilan nusxalar o‘chiriladi (stek tozalanadi). Agar parametr adres bilan uzatilsa, stekka adres nusxasi yoziladi va xuddi shu adres bo‘yicha qiymatlar o‘qiladi (yoziladi). Funksiya o‘z ishini tugatgandan keyin shu adres bo‘yicha qilingan o‘zgarishlar saqlanib qolinadi va bu qiymatlarni boshqa funksiyalar ishlatishi mumkin. Argument qiymat bilan uzatilishi uchun mos formal parametr •sifatida o‘zgaruvchini turi va nomi yoziladi. Funksiya chaqirilishida mos argument sifatida o‘zgaruvchining nomi yoki ifoda bo‘lishi mumkin. Faktik parametr adres bilan uzatilganda unga mos keluvchi formal parametrni ikki xil usul bilan yozish mumkin: ko‘rsatkich orqali yoki murojaat orqali. Ko‘rsatkich orqali yozilganda formal parametr turidan keyin ‘*’ belgisi yoziladi, mos argumentda esa o‘zgaruvchining adresi (& amal orqali) yoki massiv nomi, yoki funksiya nomi bo‘lishi mumkin. Murojaat orqali parametr uzatishda formal parametrda turidan keyin ‘&’ belgisi yoziladi va funksiya chaqirilishida mos argument sifatida o‘zgaruvchi nomi keladi. Misol:
#include void f(int,int*,int &) void main() { int i=1, j=2, k=3; cout< F(i,&j,k); cout<} void f(int i; int*j; int &k) { i++;
(*j)++; k++;
*j=i+k; k=*j+I;
} Programma ishlashi natijasida ekranga quyidagi qiymatlar chop qilinadi: 1 2 3
1 6 8 Bu misolda birinchi parametr I qiymat bilan uzatiladi (“int I”). Uning qiymati funksiya ichida o‘zgaradi, lekin tashqaridagi i qiymati o‘zgarmaydi. Ikkinchi parametrni ko‘rsatkich orqali adresi bilan uzatilishi talab qilinadi (“int j”), adresni uzatish uchun ‘&’-adresni olish amali ishlatilgan (“&j”), Funksiya tanasida argument adresidan qiymat olish uchun ‘*’- qiymat olish amali qo‘llanilgan. Uchinchi para-metrda murojaat orqali (“&k”) argumentning adresi uzatish ko‘zda tutilgan. Bu holda funksiya chaqirilishida mos argument o‘rnida o‘zgaruvchi nomi turadi, funksiya ichida esa qiymat olish amalini ishlatishning hojati yo‘q. Funksiya ishlash natijasidagi qiymatlarni argumentlar ro‘yxati orqali olish qulay va tushunarli usul hisoblanadi. Agar funksiya ichida adres bilan uzatiladigan parametr qiymati o’zgarmasdan qolishi zarur bo‘lsa, bu parametr const modifikator bilan yozilishi kerak: F(int n, const char*str) ; Agarda funksiyani chaqirishda argumentlar faqat nomlari bilan berilgan bo‘lsa, kelishuv bo‘yicha massivlar va funksiyalar adresi bilan qolgan turdagi parametrlar qiymatlari bilan uzatilgan deb hisoblanadi. Misol tariqasida diskriminantni hisoblash usuli yordamida ax+bx+c=0 ko‘rinishidagi kvadrat tenglama ildizlarini funksiya parametrlari vositasida olish masalasini ko’raylik. #include #include int Kvadrat_Ildiz(float a, float b, float c,float & x1, float &x2) { float D; D=b*b-4*a*c; if(D<0) return 0; if (D==0) { x1=x2=-b/(2*a); return 1; } else { x1=(-b+sqrt(D))/(2*a); x2=(-b-sqrt(D))/(2*a); return 2; } }
{ int a,b,c; float D,x1,x2; cout<<”ax^2+bx+c=0 tenglama ildizini topish.”; cout<<”\n a –koeffisiyentni kiriting: “; cin>>a;
cout<<”\n b –koeffisiyentni kiriting: “; cin>>b;
cout<<”\n c –koeffisiyentni kiriting: “; cin>>c;
switch (Kvadrat_Ildiz(a,b,c,x1,x2)) { case 0: cout<<”Tenglama haqiqiy ildizga ega emas!”; break; case 1: cout<<”Tenglama yagona ildizga ega: “; cout<<”\n x=”< break;
cout<<”\n x1= “< cout<<”\n x2= “< }
return 0; Programmadagi Kvadrat_Ildiz() funksiyasi kvadrat tenglama ildizini hisoblaydi. Uning qaytaradigan qiymati tenglamaning nechta ildizi borligini anglatadi. Agar tenglamaning haqiqiy ildizi mavjud bo‘lmasa (D<0), funksiya 0 qiymatini qaytaradi. Agar D=0 bo‘lsa, funksiya 1 qiymatini qaytaradi. Agar D>0 bo‘lsa funksiya 2 qiymatini qaytaradi. Mavjud ildizlar – x1 va x2 murojaatli parametrlarda qaytariladi. |
ma'muriyatiga murojaat qiling