7. Funksiyalar
Download 98.33 Kb.
|
07.Funksiyalar
- Bu sahifa navigatsiya:
- 7.7. Funksiyadan qiymat qaytarish usullari
7.6. Funksiyani qayta yuklashShunday 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 usullariFunksiyadan 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling