Murojaatlar.
Murojaatlar e’londa, ko‘rsatilgan nomning sinonimi sifatida ishlatiladi, ya’ni
bitta o‘zgaruvchiga xar xil nom bilan murojaat qilish imkonini beradi. Murojaatni doimiy
qiymatga ega bo‘lgan ko’rsatkich deb qarash mumkin. Murojaat quyidagicha e’lon qilinadi:
& ;
Bu yerda - murojaat ko‘rsatuvchi qiymatning turi, ‘&’ belgisi, undan keyin yozilgan
- murojaat turidagi o‘zgaruvchi nomi. Boshqacha aytganda, ‘&’ belgisiga adresni olish
amali deyiladi.
Misol:
int ko1;
int & pa1=ko1; // pa1 murojaati, y ko1 // o‘zgaruvchisining alternativ nomi
const char & cr=’\n’;
// cr - o‘zgarmasga murojaat
Murojaatni ishlatishda quyidagi qoidalarga rioya qilish kerak: murojaat, agar u funksiya
parametri sifatida ishlatilgan, extern bilan tavsiflangan va sinf maydoniga murojaat qilingandan
tashqari barcha holatlarda boshlang‘ich qiymatga ega bo‘lishi kerak.
Murojaat asosan funksiyalarda adres orqali uzatiluvchi parametrlar sifatida ishlatiladi.
Murojaatni ko‘rsatkichdan farqi shundaki, u alohida xotira egallamaydi va faqat
o‘zgaruvchining boshqa nomi sifatida ishlatiladi.
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;
}
Dastur 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
2
+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 main()
{
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;
default: cout<<”Tenglama ikki ildizga ega:”;
cout<<”\n x1= “<
cout<<”\n x2= “<
}
return 0;
}
Dasturdagi 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.
Do'stlaringiz bilan baham: |