7. Funksiyalar


Download 98.33 Kb.
bet5/5
Sana12.03.2023
Hajmi98.33 Kb.
#1264437
1   2   3   4   5
Bog'liq
07.Funksiyalar

7.6. Funksiyani qayta yuklash


Shunday vaziyatlar yuzaga keladiki, haqiqiy sonlarni yig‘ishni hisoblashga to‘g‘ri keladi. VC++ tilida bunday vaziyatni yechish uchun, funksiyani qayta yuklash deb nomlanuvchi, yechim mavjud. Funiksiyani qayta yuklash – bu bir nomdan, parametrlar tiplari yoki ularning soni bilan farqlanuvchi, bir necha funksiyalar uchun foydalanish imkoniyati. Faqat qaytariluvchi qiymat tipining o‘zgarishi funksiyani qayta yuklash uchun yetarli emas. Misol tariqasida sum() funksiyasini shunday qayta yuklaymizki, undan ham butun, ham haqiqy sonlarni qo‘shishda foydalanish mumkin bo‘lsin.
#include
int sum(int x, int y);
double sum(double x,double y) ;
int main() {
// Butun sonlarni qo'shish
cout << sum(10, 20) << endl; // 30
// Haqiqiy sonlarni qo'shish
cout << sum(10.5, 20.7) << endl; // 31.2
cin.get();
return 0;
}
int sum(int x, int y) {
return x + y;
}
double sum(double x, double y) {
return x + y;
}
Qayta yuklangan funksiyani chaqirishda turlilik (неоднозначность) yuzaga kelishi mumkin (kompilyator qaysi funksiyani chaqirishni tanlay olmaydi). Bunday vaziyatlarning sababchisi, qiymatni funksiyaga uzatishda tipni avtomatik almashtiruvchi, ko‘rsatilmagandagi qiymatlar hamda parametrni e’lon qilishda ko‘p yozuv imkoniyati hisoblanadi.
Ko‘rsatilmagandagi qiymatlardan foydalanishdagi muammolarga doir misollar.
int sum(int х);
int sum(int х, int у = 2) ;
cout << sum(10, 20) << endl; // Normal
cout << sum(10) << endl; // Turlilik
Navbatdagi misolda berilganlarning tipini tanlash (float yoki double tip) mumkin bo‘lmaganligi sababli, avtomatik butun songa almashtirish lozim:
float sum(float х, float у);
double sum(double х, double у);
cout << sum(10.5, 20.4) << endl; // Normal
cout << sum(10, 20) << endl; // Turlilik
Faqat double tipiga ega parametrlarga ega bo‘lgan funksiya mavjud bo‘lganda, butun son avtomatik ravishda double tipiga almashtirilgan bo‘lar edi. Huddi shunday muammo bir vaqtda ishorali va ishorasiz tiplardan foydalanilganda yuzaga keladi:
void print(char ch);
void print(unsigned char ch);
print ('S'); // Normal
print (119); // Turlilik
Quyidagi misol parametrni e’lon qilishda turlicha yozish imkoniyatining mavjudligidagi muammoni namoyish qiladi (char *str e’loni char str[]ga ekvivalent):
void print(char *str);
void print(char str[]);
print ("String"); // Turlilik
Bundan tashqari, funksiyaga parametrlarni turlicha berish turlilikka olib kelishi mumkin.
void print(int х);
void print(int &x);
int n = 25;
print (n); // Turlilik

7.7. Funksiyadan qiymat qaytarish usullari


Funksiyadan qiymatni qaytarish uchun return operatoridan foydalaniladi. Bu operator bajarilganidan keyin funksiyalarning bajarilishi to‘xtaydi va boshqaruv funksiyani chaqirish nuqtasiga qaytadi. Bu shuni anglatadiki, return operatoridan keyingi ko‘rsatmalar hech qachon bajarilmaydi. Agar funksiya ichida return operatori bo‘lmasa, funksiyani yopiluvchi qavsga kelgandan keyin boshqaruv funksiyani chaqirish nuqtasiga qaytariladi. Bunda qaytariluvchi qiymat aniqlanmaydi.
Agar funksiya hech qanday qiymat qaytarmasa, funksiya e’lonida berilganlar tipi o‘rnida void kalit so‘zi ko‘rsatiladi. Bunday funksiya ishida return operatori bo‘lmasligi mumkin, ammo undan, muddatidan oldin funksiyadan chiqish uchun, qiymatni ko‘rsatmagan holda foydalanish mumkin. Hech qanday qiymat qaytarmaydigan funksiyani chaqirishni qandaydir ko‘rsatma ichida joylashtirish mumkin emas. Faqat alohida ko‘rsatmada. Qiymat qaytarmaydigan funksiyaga misol:
void print(const char *s) {
cout << s << endl;
}
Boshqa hollarda funksiya e’loni va aniqlanishida funksiya nomidan oldin berilganlarni qaytaruvchi tipi beriladi. Bu tipning qiymati return operatorida ko‘rsatilishi lozim. Bunda qiymatning nusxasi qaytariladi. Funksiya massivdan tashqari har qanday tipning qiymatni qaytarishi mumkin. Massivlar bilan funksiya paramertlari orqali, unga ko‘rsatkichni bergan holda yoki aniq elementga ko‘rsatkichni qaytargan holda ishlash zarur. Qandaydir qiymat qaytaruvchi funksiyani chaqirishni ifoda ichida "=" operatoridan keyin o‘ng tomonda joylashtirish mumkin. Agar funksiya murojaat qaytarsa, funksiyani joylashtirishni "=" operatoridan chap tomonda joylashtirishga ruxsat beriladi. Qaytariluvchi qiymatni o‘zgaruvchiga o‘zlashtirish yoki shunchaki e’tiborga olmaslik mumkin. Qiymatni qaytaruvchi funksiyaga misol:
int sum(const int х, const int у) {
return x + у;
}
return operatoridan foydalanishda turlicha (har xil) vaziyatlar bo‘lmasligi lozim. Masalan, quyidagi holatda qaytariluvchi qiymat shartga bog‘liq bo‘ladi:
int sum(int х, int у) {
if(х > 0) {
return х + у;
}
}
Agar "x" o‘zgaruvchi noldan katta qiymatga ega bo‘lsa, hammasi joyida, ammo agar o‘zgaruvchi nolga teng yoki manfiy qiymatga ega bo‘lsa, u holda qaytariluvchi qiymat aniqlanmagan va funksiya "мусор" deb nomlanuvchi ihtiyoriy qiymat qaytaradi. Bunday hollarda kompilyatsiya jarayonida ogohlantiruvchi xabar chiqariladi: “warning С4715: sum: значение возвращается не при всех путях выполнения”. Bunday turlilikni chetlab o‘tish uchun funksiya tanasi oxirida return operatorini ko‘rsatilmagandagi qiymat bilan qo‘yish lozim:
int sum(int х, int у) {
if(х > 0) {
return х + у;
}
return 0;
}
Funksiya ko‘rsatkich qaytarishi mumkin. Bunday holda funksiya e’lonida va aniqlanishida ko‘rsatkichning mos tipi ko‘rsatiladi. Misol sifatida satrning oxirgi belgisiga ko‘rsatkichni yoki satr bo‘sh bo‘lsa nolinchi ko‘rsatkichni qaytaramiz.
Ko‘rsatkichni qaytarish dasturi listingi
#include
#include
char *func(char *s);
int main() {
char *p = 0, str[] = "String";
p = func(str);
if(p) { // agar nol ko'rsatkich bo'lmasa
cout << *р << endl; // g
} else cout << "NULL" << endl;
cin.get();
return 0;
}
char *func(char *s) {
int len = strlen(s); // Satr uzunligini olamiz
if(!len) return 0; // Bo'sh bo'lsa, nol ko'rsatkich
else return &s[len - 1]; // Oxirgi belgiga ko'rsatkich
}

VC++ tilida funksiyalar murojaatlarni qaytarishi ham mumkin. Bunday holda funksiyani "=" operatoridan ham o‘ng, ham chap tomonda joylashtirishga ruxsat beriladi. Funksiya murojaat qaytarishi uchun berilganlar tipini e’lon qilish va aniqlashdan keyin "&" operatori k‘rsatiladi. Misol tariqasida ko‘rsatilgan indeks bo‘yicha massiv elementi qiymatini olish yoki o‘zgartirish imkonini beruvchi funksiya yozamiz.
Murojaat qaytarish dasturi listingi.
#include
int &at(int *a, int i) ;
int main() {
int mas[] = {10, 20, 30};
at(mas, 0) = 800;
for(int i = 0; i < 3; ++i) {
cout << at(mas, i) << " ";
} // 800 20 30
cout << endl;
cin.get();
return 0;
}
int &at(int *a, int i) {
return a[i];
}



Download 98.33 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling