1 – misol: Ikki sonni qo‘shish uchun funksiya yarating.
#include
using namespace std;
int a,b;
int add()
{
return a+b;
}
int main()
{
a = 5;
b = 6;
int c = add();
cout << c << endl;
return 0;
}
Yuqorida tuzilgan dasturda global o‘zgaruvchilar uchun qo‘shish funksiyasi
yaratilgan, ya’ni bu funksiya faqatgina shu dasturning glabal o‘zgaruvchilari a va b
lar uchun o‘rinli bo‘ladi. Agar o‘zgaruvchilarning nomlari boshqa nom bilan atalsa
unda bu funksiya hech qanday qiymat qaytarmaydi. Bu funksiyaning ixtiyoriy
o‘zgaruvchilar uchun qiymat qaytarishini ta’minlash uchun funksiyani parametrli
qilib e’lon qilishimiz kerak bo‘ldi.
2 – misol: Ikki sonni qo‘shish uchun funksiya yarating.
#include
using namespace std;
int add(int x, int y)
{
return x+y;
}
int main()
{
int a, b;
cout << "a ni kiriting: "; cin>>a;
cout << "b ni kiriting: "; cin>>b;
int c = add(a,b);
cout << "Yiindi: " << c << endl;
return 0;
}
Natija:
3 – misol: Berilgan to‘rtta sondan eng kattasini topish dasturini tuzing.
#include
using namespace std;
int max(int x, int y)
{
return (x>y)?x:y;
}
int main()
{
int a, b, c, d, a1, b1, m;
cout << "a ni kiriting: "; cin>>a;
cout << "b ni kiriting: "; cin>>b;
cout << "c ni kiriting: "; cin>>c;
cout << "d ni kiriting: "; cin>>d;
a1 = max(a,b);
b1 = max(c,d);
m = max(a1,b1);
cout << "Eng kattasi: " << m << endl;
return 0;
}
Natija:
5.3. Qiymat qaytarmaydigan funksiyalar
Qiymat qaytarmaydigan funksiyalar dasturlash tillarida protseduralar deb
ataladi. C++ dasturlash tilida protsedura e’lon qilish uchun funksiyadan
foydalaniladi. Funksiya qiymat qaytarmasligini ifodalash uchun void hizmatchi
so‘zidan foydalaniladi.
4 – misol: 1 dan n gacha bo‘lgan soni kvadratini va kubini aniqlovchi
funksiya yarating.
#include
using namespace std;
void display(int x)
{
int i = 1;
L1: printf("Son: %4i Kvadrati: %5i Kubi:%6i\n",i, i*i,
i*i*i);
i++;
if (i <= x) goto L1;
}
int main()
{
int n;
cout << "n ni kiriting: "; cin>>n;
display(n);
return 0;
}
Natija:
5.4. Funksiyaning prototipi va inline funksiyalar
Funksiyaning prototipi nima? Funksiya prototipi bu dasturda ishlatiladigan
funksiyalarni oldindan e’lon qilishni bildiradi. Bunda funksiyalar bir – biriga
murojaatni xatolarsiz bajarilashini ta’minlashga yordam beradi. Funksiya prototipi
e’lon qilinganda funksiyaning tipi, funksiyaning parametrlari tiplari ham e’lon
qilinadi. Ammo paramertlarning nomlari e’lon qilinishi shart emas.
5 – misol: Ikki son berilgan ularning o‘rnini almashtirish funksiyasini
yaratish.
Bu dasturni yaratishda biz havolalar imkoniyatidan ham foydalanamiz.
#include
using namespace std;
void swap (int&, int&); // funksiya prototipi
int main()
{
int a = 0,b = 0;
cout << "a ni kiriting: "; cin>>a;
cout << "b ni kiriting: "; cin>>b;
cout << endl;
printf("SWAPdan oldin: A = %i, B = %i\n",a,b);
swap(a,b);
printf("SWAPdan keyin: A = %i, B = %i\n",a,b);
return 0;
}
void swap (int &x, int &y)
{
int c = x;
x = y;
y = c;
}
Natija:
Yuqorida aytib o‘tilganidek funksiyalar dastur yaratishda katta qulayliklar
yaratadi. Yaratilgan funksiyalar kompilyator yordamida har safar chaqirilganda va
uni ishlatilgandagi qo‘shicha ish bajarishga olib keladi. Registrdagi o‘zgaruvchilar
o‘zgartiriladi, lokal o‘zgaruvchilar quriladi, parametr sifatida berilgan argumentlar
funksiya stekiga yoziladi. Buning hammasi qo‘shimcha vaqt talab qiladi. Umuman
aytganda, hech qanday funksiyasiz yozilgan dastur, ya’ni hamma amallari asosiy
funksiyada yozilgan monolit dastur, bir nechta funksiyalarga ega, ayni shu ishni
bajaruvchi dasturga nisbatan tezroq ishlaydi. Funksiyalarning bu noqulayligini
tuzatish uchun inline sifatidagi funksiyalar qo‘llaniladi. Bunda kompilyator dastur
ichida funksiyaning nomi kelgan vaqtda, funksiyaning nomini o‘rniga funksiyaning
tanasini joylashtirishga olib keladi va bu usul yordamida dastur ishlash jarayoni
tezlashadi, lekin uning hajmi ortadi.
6 – misol: n! ni topuvchi dastur yarating.
#include
using namespace std;
inline unsigned int fact(int n)
{
int p = 1;
int i=1;
L1: p *= i;
i++;
if (i <= n) goto L1;
return p;
}
int main()
{
int n = 0;
cout << "n ni kiriting: "; cin>>n;
cout << "Factorial: "<< fact(n) << endl;
return 0;
}
Natija:
5.5. Rekursiya
Rekursiya deb o‘ziga o‘zi murojaat qiluvchi funksiyaga aytiladi. Rekursiya 2
turda bo‘ladi. Ular bevosita va bilvosita rekursiyadir. Bevosita rekursiya bu funksiya
o‘ziga – o‘zi to‘g‘ridan – to‘g‘ri murojaat qiladi. Bilvosita rekursiya bir funksiya
ikkinchi funksiyaga murojaat qilsa va o‘z navbatida ikkinchi funksiya birinchi
funksiyaga murojaatidan hosil bo‘ladi. Misol uchun faktorialni hisoblash
funksiyasini keltiramiz:
long fact(int k)
{
if (k<0) return 0;
if (k==0) return 1;
else return k*fact(k-1);
}
Manfiy argument uchun funksiya 0 qiymat qaytaradi. Parametr 0 ga teng
bo‘lsa, funksiya 1 qiymat qaytaradi. Aks holda parametr qiymat birga kamaytirilgan
holda funksiyaning o‘zi chaqiriladi va uzatilgan parametrga ko‘paytiriladi.
Funksiyaning o‘z – o‘zini chaqirish formal parametr qiymati 0 ga teng bo‘lganda
to‘htatiladi. Keyingi misolimizda ihtiyoriy haqiqiy sonning butun darajasini
hisoblash rekursiv funksiyasini keltiramiz.
double expo(double a, int n)
{
if (n==0) return 1;
if (a==0.0) return 0;
if (n>0) return a*expo(a,n-1);
if (n<0) return expo(a,n+1)/a;
}
Misol uchun funksiyaga expo(2.0,3) shaklda murojaat qilinganda rekursiv
ravishda funksiyaning ikkinchi parametri kamaygan holda murojaatlar hosil bo‘ladi:
expo(2.0,3), expo(2.0,2), expo(2.0,1), expo(2.0,0).
Bu murojaatlarda quyidaga ko‘paytma hisoblanadi: 2.0*2.0*2.0*1 va kerakli
natija hosil qilinadi.
Nazorat savollari:
1. Funksiya nima?
2. Protsedura nima?
Qiymat qaytarmaydagan funksiyalardan qiymatni olib chiqsa bo‘ladimi?
Do'stlaringiz bilan baham: |