4. void funksiyalar
Key Point. void funksiyalar natijaviy qiymat qaytarmaydi.
Yuqorida qiymat qaytaruvchi funksiyaga misollarni ko`rib chiqdik. Endi, bu qismda qiymat qaytarmaydigan funksiyalarni qanday e’lon qilish va uni chaqirishni o`rganamiz. 10.2-kodli ro`yxatda kiritilgan reyting bali uchun bahoniChiqarish nomli funksiyani e’lon qilish va uni chaqirish orqali bahoni chop etish dasturi keltirilgan.
10.2-kodli ro`yxat. bahoniChiqarish.cpp
1 #include
2 using namespace std;
3
4 // Kiritilgan reyting uchun mos bahoni chiqarish
5 void bahoniChiqarish(double reyting)
6 {
7 if (reyting >= 90.0)
8 cout << 'A'<< endl;
9 else if(reyting >= 80.0)
10 cout << 'B'<< endl;
11 else if (reyting >= 70.0)
12 cout << 'C'<< endl;
13 else if (reyting >= 60.0)
14 cout << 'D'<< endl;
15 else
16 cout << 'F'<< endl;
17 }
18
19 int main()
20 {
21 cout << "Reyting ballni kiriting: ";
22 double reyting;
23 cin >> reyting;
24
25 cout << "Baho: ";
26 bahoniChiqarish(reyting);
27
28 return 0;
29 }
Reyting ballni kiriting: 78.5
Baho: C
|
Bu yerda bahoniChiqarish funksiyasi – void funksiya. U hech qanday qiymat qaytarmaydi. void funksiyani chaqirish uchun ko`rsatma bo`lishi kerak. Shunday qilib, u main funksiyasi tarkibida, 26-satrda ko`rsatma sifatida chaqirildi. Endi esa, bahoni qaytaruvchi yangi funksiyani chqiramiz (10.3-kodli ro`yxat).
10.3-kodli ro`yxat. TestBahoniChiqarish.cpp
1 #include
2 using namespace std;
3
4 // Kiritilgan reyting uchun mos bahoni chiqarish
5 char bahoniChiqarish(double reyting)
6 {
7 if (reyting >= 90.0)
8 return 'A';
9 else if (reyting >= 80.0)
10 return 'B';
11 else if (reyting >= 70.0)
12 return 'C';
13 else if (reyting >= 60.0)
14 return 'D';
15 else
16 return 'F';
17 }
18
19 int main()
20 {
21 cout << "Reyting ballni kiriting: ";
22 double reyting;
23 cin >> reyting;
24
25 cout << " Baho: ";
26 cout << bahoniChiqarish(reyting) << endl;
27
28 return 0;
29 }
5. Funksiyalarni qayta yuklash
Key Point.Funksiyalarniqayta yuklash funksiyalarni bir xil nom, turlicha bosh qismibilan e’lon qilinishini ta’minlaydi.
Avvalroq o`rganganimiz, max funksiyasi faqat int ma’lumot turi bilan ishlaydi. Agar biz ikki haqiqiy sonlardan kattasini topishimiz kerak bo`lib qolsachi? Bu masalani hal etish uchun, quyidagi kodda keltirilgani kabi, bir xil nom bilan, biroq parametrlari turlicha bo`lgan boshqa bir funksiyani hosil qilish lozim:
doublemax(doubleson1, doubleson2)
{
if(son1>son2)
returnson1;
else
returnson2;
}
Agar max funksiyasi int turdagi parametrlar bilan chaqirilsa, max funksiyasi chaqiruvchi nuqtaga int turdagi parametrlarni hisoblab yuboradi; agar max funksiyasi double turdagi parametrlar bilan chaqirilsa, max funksiyasi chaqiruvchi nuqtaga double turdagi parametrlarni hisoblab yuboradi. Bir faylda joylashgan, bir xil nomdagi va turlicha parametrlarga ega bo`lgan funksiyalarni chaqirish, dasturlashda funksiyalarni qayta yuklash - deb talqin qilinadi. Bunda C++ kompilyatori qaysi funksiyani chaqirishni uning bosh qismiga qarab tanlab oladi.
11.1-kodli ro`yxatda uchta funksiyani hosil qilish keltirilgan. Birinchisi, int turidagi sonlardan kattasini topadi, ikkinchisi, double turidagi sonlardan kattasini topadi, uchinchisi esa, uchta double turidagi sonlardan kattasini topadi. Bunda uchala funksiya ham maxdeb nomlangan.
11.1-kodli ro`yxat. TestFunksiyaniQaytaYuklash.cpp
1 #include
2 using namespacestd;
3
4 // int turidagi ikki sondan kattasini topish
5 intmax(int son1, int son2)
6 {
7 if(son1>son2)
8 return son1;
9 else
10 return son2;
11 }
12
13 // double turidagi ikki sondan kattasini topish
14 doublemax(double son1, double son2)
15 {
16 if(son1>son2)
17 return son1;
18 else
19 return son2;
20 }
21
22 // double turidagi uchta sondan kattasini topish
23 doublemax(double son1, double son2, double son3)
24 {
25 returnmax(max(son1, son2), son3);
26 }
27
28 intmain()
29 {
30 // max funksiyasini int turida argument berib chaqirish
31 cout << "3 va 4 orasidagi katta son: "<< max(3, 4) << endl;
32
33 // max funksiyasini double turida argument berib chaqirish
34 cout << "3.0 va 5.4 orasidagi katta son: "
35 << max(3.0, 5.4) << endl;
36
37 // max funksiyasini uchta double turidagi argumentlarni berib chaqirish
38 cout<<3.0, 5.4 va 10.14 orasidagi katta son: "
39 << max(3.0, 5.4, 10.14) << endl;
40
41 return 0;
42 }
Bu yerda, max funksiyasining max(3, 4) ko`rinishda chaqirilishi (31-satr) natijasida ikkita butun sondan kattasi aniqlanadi. max funksiyasining max(3.0, 5.4) ko`rinishda chaqirilishi (35-satr) natijasida ikkita haqiqiy sondan kattasi aniqlanadi. max funksiyasining max(3.0, 5.4, 10.14) ko`rinishda chaqirilishi (39-satr) natijasida uchta haqiqiy sonlardan kattasi aniqlanadi.
Xo`sh, max funksiyasini bir vaqtning o`zida,max(2,2.5) kabi, bitta int argument va bitta double argument bilan chaqira olamizmi? Agar buning imkoni bo`lsa, unda qaysi max funksiyasi chaqirilgan bo`ladi? Birinchi savolga javob – ha. Ikkinchi savolga javob – bunda ikki double turidagi sondan kattasini qaytaruvchimax funksiyasi chaqirilgan bo`ladi. Bunda2 argumenti avtomatik tarzda double turiga o`giriladi va funksiyaga yuboriladi. “Nima uchun bunday vaziyatda max(double, double) funksiyasi chaqirilmagan, axir u har ikkala tur uchun ham o`rinliku” - deb xayron bo`lishingiz mumkin. C++ kompilyatori bunday vaziyatda aynan mos funksiyani chaqiradi. Ikkita butun sondan kattasini aniqlash uchun, max(int, int) funksiyasi ko`proq mos keladi. Ba’zida, funksiyani chaqirishda ikki yoki undan ko`proq moslik holatlari uchrab turadi. Bunda kompilyator qaysi birini tanlash kerakligini aniqlay olmaydi va kompilyatsion xatolik beradi. Bu dasturlashda tushunarsiz chaqiruv deb talqin qilinadi. Tushunarsiz chaqiruv kompilyatsion xatolik sodir bo`lishiga sababchi bo`ladi. Quyidagi kodni ko`rib chiqamiz:
#include
using namespacestd;
intmaxNumber(intnum1, doublenum2)
{
if(num1 > num2)
returnnum1;
else
returnnum2;
}
doublemaxNumber(doublenum1, intnum2)
{
if(num1 > num2)
returnnum1;
else
returnnum2;
}
intmain()
{
cout << maxNumber(1, 2) << endl;
return 0;
}
Bu yerda maxNumber(int, double) vamaxNumber(double, int) larning har ikkalasi ham maxNumber(1, 2) ni hisoblashga bir xil darajada mos tushadi. Natijada kompilyatsion xatolik yuz beradi.
Do'stlaringiz bilan baham: |