Информатика




Download 7,16 Mb.
Pdf ko'rish
bet156/308
Sana30.05.2024
Hajmi7,16 Mb.
#257687
1   ...   152   153   154   155   156   157   158   159   ...   308
Bog'liq
Информатика

function 


251 
prototype
) tushunchasi qo`llaniladi. Bunda funksiyaning nomidan keyin hamon 
nuqta-vergul qo`yiladi, funksiya tanasi esa berilmaydi. 
C++
da funksiya 
qo`llanilishidan oldin uning aniqlanishi yoki hech bo`lmaganda e`loni 
kompilyatorga uchragan bo`lishi kerak. Agar funksiya e`loni boshqa funksiyalar 
aniqlanishidan tashqarida berilgan bo`lsa, uning kuchi ushbu fayl oxirigacha 
boradi. Biror bir funksiya ichida berilgan bo`lsa, kuchi faqat o`sha funksiya ichida 
tarqaladi. E`lon fayllarda aynan shu funksiya e`lonlari berilgan bo`ladi. Funksiya 
e`loni va funksiya aniqlanishi bir-biriga mos tushishi kerak. Masalan,
double square(char, bool); 
float average(int a, int b, int c); 
Funksiya e`lonlarda kirish parametrlarining faqat tipini yozish kifoya, xuddi 
square()
funksiyasidek. Yoki kiruvchi parametrlarning nomi ham berilishi 
mumkin, bu nomlar kompilyator tarafidan e`tiborga olinmaydi, biroq dasturning 
o`qilishini ancha osonlashtiradi. Bulardan tashqari 
C++
da funksiya imzosi 
(
function signature
) tushunchasi bor. Funksiya imzosiga funksiya nomi, kiruvchi 
parametrlar tipi, soni, ketma-ketligi kiradi. Funksiyadan qaytuvchi qiymat tipi 
imzoga kirmaydi.
int foo(); //1 
int foo(char, int); //2 
double foo(); //3 - 1 funksiya bilan imzolari ayni. 
void foo(int, char); //4 - 2 bilan imzolari farqli. 
char foo(char, int); //5 - 2 bilan imzolari ayni. 
int foo(void); //6 - 1 va 3 bilan imzolari ayni. 
Yuqoridagi misolda kirish parametrlari bo`lmasa, biz () qavsning ichiga void 
deb yozishimiz mumkin (6 ga qarang). Yoki () qavslarning quruq o`zini 
yozaversak ham bo`ladi (1 ga qarang). Yana bir tushuncha - funksiya chaqirig`idir. 
Dasturda funksiyani chaqirib, qo`llashimiz uchun uning chaqiriq ko`rinishini 
ishlatamiz. () qavslari funksiya chaqirig`ida qo`llaniladi. Agar funksiyaning kirish 
argumentlari bo`lmasa, () qavslar bo`sh holda qo`llaniladi. Aslida () qavslar 
C++


252 
da operatorlardir. Funksiya kirish parametrlarini har birini ayri-ayri yozish kerak, 
masalan, 
float average(int a, int b, int c);
funksiyasini 
float average(int a,b,c); 
deb 
yozishimiz xatodir.
Hali aytib o`tganimizdek, funksiya kirish parametrlari ushbu funksiyaning 
lokal o`zgaruvchilaridir. Bu o`zgaruvchilarni funksiya tanasida boshqattan e`lon 
qilish sintaksis xatoga olib keladi. 
27-listing
.
Output: 
# include  
int foo(int a, int b); //Funksiya prototipi, 
//argumentlar ismi shart emas. 
int main() 
{ for (int k = 1; k<6; k++){ 
for (int l = 5; l>0; l--){ 
cout << foo(k,l) << " "; //Funksiya chaqirig`i.
}//end for (l...) 
cout << endl;
}//end for (k...) 
return (0); 
} //end main() 
//foo() funksiyasining aniqlanishi 
int foo(int c, int d) 
{ //Funksiya tanasi
return(c * d); } 
5 4 3 2 1 
10 8 6 4 2 
15 12 9 6 3 
20 16 12 8 4 
25 20 15 10 5 
Bizda ikki sikl ichida 
foo()
funksiyamiz chaqirilmoqda. Funksiyaga k va l 
o`zgaruvchilarining nusxalari uzatilmoqda. Nusxalarning qiymati mos ravishda 
funksiyaning aniqlanishida berilgan c va d o`zgaruvchilarga berilmoqda. k va l 
ning nusxalari deganimizda adashmadik, chunki ushbu o`zgaruvchilarining 
qiymatlari funksiya chaqirig`idan hech qanday ta`sir ko`rmaydi. 
C++
dagi 
funksiyalarning bir noqulay tarafi shundaki, funksiyadan faqat bitta qiymat 


253 
qaytadi. Undan tashqari yuqorida ko`rganimizdek, funksiyaga berilgan 
o`zgaruvchilarning faqat nusxalari bilan ish ko`rilarkan. Ularning qiymatini normal 
sharoitda funksiya ichida o`zgartirish mumkin emas. Lekin bu muammolar 
ko`rsatkichlar yordamida osonlikcha hal etiladi. Funksiya chaqiriqlarida avtomatik 
ma`lumot tipining konversiyasi bajariladi. Bu amal kompilyator tomonidan 
bajarilganligi sababli funksiyalarni chaqirganda ehtiyot bo`lish kerak. Javob xato 
ham bo`lishi mumkin. Shu sababli kirish parametrlar tipi sifatida katta hajmli 
tiplarni qo`llash maqsadga muvofiq bo`ladi. Masalan, double tipi har qanday sonli 
tipdagi qiymatni o`z ichiga olishi mumkin. Lekin bunday qiladigan bo`lsak, biz 
tezlikdan yutqazishimiz turgan gap. Avtomatik konversiyaga misol keltiraylik. 
28-listing
.
Output: 
int division(int m, int k) { 
return (m / k); 
}
dasturda chaqirsak:... 
float f = 14.7; 
double d = 3.6; 
int j = division(f,d); //f 14 bo`lib kiradi, d 3 bo`lib kiradi 
// 14/3 - butun sonli bo`lish esa 4 javobini beradi
cout << j; 

Demak, kompilyator f va d o`zgaruvchilarining kasr qismlarini tashlab 
yuborar ekan. Qiymatlarni pastroq sig`imli tiplarga o`zgartirish xatoga olib keladi. 


Download 7,16 Mb.
1   ...   152   153   154   155   156   157   158   159   ...   308




Download 7,16 Mb.
Pdf ko'rish