funksiya crg_daxilet ( ){
tam i;
xaricet("10 eded daxil edin \y");
//x qlobal cergedir
say (i 10) daxilet(x[i]);
}
// crg_xaricet adli cergenin elementlerini
// cap eden funksiya tertib edek
funksiya crg_xaricet ( ){
tam i;
//x qlobal cergedir
say (i 10) xaricet(x[i], " ");
xaricet("\y");
}
// crg_artan adli cergenin elementlerini
// artan sirada nizamlayan funksiya tertib
// edek
funksiya crg_artan ( ){
tam i,j, mvq;
//x qlobal cergedir
say (i 10) say (j i 10)
eger (x[i] > x[j]){ mvq = x[i];
x[i] = x[j]; x[j] = mvq;
}
}
// crg_azalan adli cergenin elementlerini
// azalan sirada nizamlayan funksiya tertib
// edek
funksiya crg_azalan ( ){
tam i,j, mvq;
//x qlobal cergedir
say (i 10) say (j i 10)
eger (x[i] < x[j]){ mvq = x[i];
x[i] = x[j]; x[j] = mvq;
}
}
crg_daxilet(); crg_artan();
xaricet ("Cergenin elementleri artan sirada\y" ); crg_xaricet ();
crg_azalan();
xaricet("Cergenin elementleri azalan sirada\y"); crg_xaricet();
10 eded daxil edin
12 3 45 6 768 90 321 4 55 420
Cergenin elementleri artan sirada 3 4 6 12 45 55 90 321 420 768
Cergenin elementleri azalan sirada 768 420 321 90 55 45 12 6 4 3
Nəticə.
Yuxarıdakı kodda cərgə üzərində müxtəlif işlər görən crg_daxilet(), crg_xaricet(), crg_artan() və crg_azalan() adlı funksiyalar tərib etdik. Aşağıdakı nümunədə isə bu funksiyaları tərtib edəcəyimiz artan() və azalan() adlı digər funksiyalardan çağırırıq. Bu halda proqram daha yığcam görünür.
Nümunə.
// crg_daxilet adli cergenin elementlerini
// daxil eden funksiya tertib edek
funksiya crg_daxilet ( ){
tam i;
xaricet("10 eded daxil edin \y");
//x qlobal cergedir
say (i 10) daxilet(x[i]);
}
// crg_xaricet adli cergenin elementlerini
// cap eden funksiya tertib edek
funksiya crg_xaricet ( ){
tam i;
//x qlobal cergedir
say (i 10) xaricet(x[i], " ");
xaricet("\y");
}
// crg_artan adli cergenin elementlerini
// artan sirada nizamlayan funksiya tertib
// edek
funksiya crg_artan ( ){
tam i,j, mvq;
//x qlobal cergedir
say (i 10) say (j i 10)
eger (x[i] > x[j]){ mvq = x[i];
x[i] = x[j]; x[j] = mvq;
}
}
// crg_azalan adli cergenin elementlerini
// azalan sirada nizamlayan funksiya tertib
// edek
funksiya crg_azalan ( ){
tam i,j, mvq;
//x qlobal cergedir
say (i 10) say (j i 10)
eger (x[i] < x[j]){ mvq = x[i];
x[i] = x[j]; x[j] = mvq;
}
}
funksiya artan (){
crg_artan();
xaricet("Cergenin elementleri artan sirada\y"); crg_xaricet();
}
funksiya azalan(){ crg_azalan();
xaricet("Cergenin elementleri azalan sirada\y");
crg_xaricet();
}
crg_daxilet(); artan();
azalan();
Nəticə.
10 eded daxil edin
23 44 65 7 0 89 -23 32 667 308
Cergenin elementleri artan sirada
-23 0 7 23 32 44 65 89 308 667
Cergenin elementleri azalan sirada 667 308 89 65 44 32 23 7 0 -23
İzahı. Burada biz artan funksiyasından cer_artan və crg_xaricet funksiyalarını çağırdıq. Analoji olaraq azalan funksiyasından isə crg_azalan və crg_xaricet funksiyalarını çağırdıq.
Mövzu23
Rekursiv Funkiyalar.Kitabxana funksiyaları
Plan:
Rekursiv Funkiyalar
Kitabxana funksiyaları
Proqramda funksiyanın özlərinə etməsi rekursiya adlanır. Bu cür funksiyalara isə rekursiv funksiyalar deyilir. Rekursiv funksiya tərtib edərkən onun başa çatma şərtini düzgün təyin etmək lazımdır, əks halda funksiya öz-özünə sonsuz müraciət edər və proqram asılar.
Rekursiv funksiyalara aid proqram nümunələri ilə tanış olaq.
Nümunə. Aşağıdakı proqramda cərgənin elementlərini çap etmək üçün rekursiv funksiyadan istifadə olunur.
tam x[10],k;
// cergenin elementlerini cap etmek
// ucun rekursiv funksiya tertib edek
funksiya f (tam k){
// basha catma shertini teyin edirik
eger (k > 10) qaytar;
xaricet(x[k], " ");
// f funksiyasini cagiririq
// k -nin qiymetin 1 vahid artiraraq f(k + 1);
}
xaricet("10 eded daxil edin.\y"); say (k 10)
daxilet(x[k]);
xaricet("cergenin elementleri \y"); f(1);
Nəticə.
10 eded daxil edin.
2 34 5 7 67 8 9 21 33 4
cergenin elementleri
2 34 5 7 67 8 9 21 33 4
İzahı. Burada biz cərgənin elementlərini çap etmək üçün rekursiv f fuksiyasından istifadə edirik. f funksiyası parametr olaraq tam tipli dəyişən qəbul edir, cərgənin çap olunmalı elementinin ideksini. Ilk olaraq 1 qiyməti verilir, funksiya çağırılan zaman.
Funksiya isə k-nı yoxlayır, əgər 10-dan böyükdürsə onda başa çatır, əks halda k indeksli elementi çap edir və k –nın bir vahid artırılmış qiyməti ilə , hansı ki növbəti elementin
indeksidi f funksiyasını çağırır. Beləliklə rekursiv olaraq x cərgəsinin bütün elementləri çap olunur. Aşağıdakı kod isə rekursiv olaraq x cərgəsinin elementlərini axırdan əvvələ çap edir.
Nümunə. Aşağıdakı proqramda cərgənin elementlərini axırdan əvvələ çap etmək üçün rekursiv funksiyadan istifadə olunur.
tam x[10],k;
// cergenin elementlerini cap etmek
// ucun rekursiv funksiya tertib edek
funksiya g (tam k){
// basha catma shertini teyin edirik
eger (k <1 )
qaytar; xaricet(x[k], " ");
// g funksiyasini cagiririq
// k -nin qiymetin 1 vahid azaldaraq g(k - 1);
}
xaricet("10 eded daxil edin.\y"); say (k 10)
daxilet(x[k]);
xaricet("cergenin elementleri \y"); g(10);
Nəticə.
10 eded daxil edin.
34 55 76 88 90 21 33 4 5 3
cergenin elementleri
3 5 4 33 21 90 88 76 55 34
Rekursiv funksyalardan əsasən ağac şəklində olan verilənlər strukturu ilə işləyirlər. Ağaclar qrafların xüsusi formasıdır və proqramlaşdırmada olduqca əhəmiyyətli rola malikdirlər. Bu mövzu bir qədər çətinliyi artırılmış proqramlaşdırma kursunun mövzusudur. Rekursiv funksiyalar ilə bağlı demək olar ki bütün proqramlaşdırma
kitablarında verilən nümunələrdən biri də n faktorialın hesablanmasıdır. Riyaziyyatdan n faktorial n! kimi işarə olunur və aşağıdakı kimi təyin olunur:
0! = 1
n! = n*(n-1)!
Bu cür təyindən misal üçün 6! –lı aşağıdakı kimi hesablaya bilərik:
6! = 6*5!
5! = 5*4!
4! = 4*3!
3! = 3*2!
2! = 2*1!
1! = 1*0!
0! = 1
6! = 6*5*4*3*2*1
Əsrin proqramlaşdırma dilində rekursiv olaraq n! –lı aşağıdakı kimi hesablaya bilərik.
Nümunə. n! hesablayan proqram.
tam k, z;
// n faktoriali hesablayan rekursiv
// nf funksiyasi
funksiya nf (tam k){
// basha catma shertini teyin edirik
eger (k == 0 )
qaytar 1;
// nf funksiyasina rekursiv muraciet
// edirik
qaytar k * nf(k-1);
}
xaricet("Her hansi eded daxil edin.\y"); daxilet(k);
z = nf (k );
xaricet(k, "! = ", z, "\y");
Nəticə.
Her hansi eded daxil edin. 7
7! = 5040
Kitabxana Funkiyaları
Bildiyimiz kimi hər bir dilin əsas imkanlarından biri də proqramçılara təqdim etdiyi hazır kitabxana funksiyalarıdır. Buraya məlumatlar bazası, riyazi hesablamalar, qrafik tətbiqlər, standart giriş/çıxış, proseslərin idarəolunması v.s. kimi interfeyslərlə işləmək üçün dil tərəfindən hazır təqdim olunan funksiyalar daxildir. Təəssüf ki əsrin dili hələ yenicə yarandığından onun kitabxanaları hazır deyil. Yalnız nümunə üçün verilmiş ədədin kvadrat kökünü hesablayan kvk adlı funksiyadan savayı.
kvk funksiyası kəsr tipli bir parametr qəbul edir və nəticə olaraq həmin ədədin kvadrat kökünü qaytarır.
Aşağıdakı nümunədə proqram istifadəçidən bir ədəd daxil etməsini istəyir və onun kvadrat kökünü ekranda çap edir. Nümunəyə baxaq:
kesr x, net;
xaricet("Her-hansi eded daxil edin\y"); daxilet(x);
//kvk funksiyasini cagiririq
//ve qaytardigi neticeni net deyishenine
//menimsedirik net = kvk (x );
xaricet(x, " -in kvadrat koku = ", net , "\y");
Nəticə
64.256
64.256 -in kvadrat koku = 8.015984
Aşağıda kvk funksiyasından istifadə etməklə kvadrat tənliyin köklərini hesablayan proqram kodu göstərilir.
kesr a, b, c, x1, x2, determinant;
xaricet(" a, b ve c emsallarini daxil edin: "); daxilet(a, b, c);
determinant = b*b - 4*a*c;
eger (determinant > 0) {
x1 = (-1*b + kvk(determinant)) / (2*a); x2 = (-1*b - kvk(determinant)) / (2*a); xaricet("Kokler ferqlidir. \y"); xaricet("x1 = ", x1, "\y");
xaricet("x2 = ", x2, "\y");
}
yoxsa
eger(determinant == 0) {
xaricet("Kokler eynidir. \y");
x1 = (-1*b + kvk(determinant)) / (2*a);
xaricet("x1 = ", x1, "\y");
}
yoxsa
xaricet("Kvadrat tenliyin heqiqi koku yoxdur. \y");
Nəticə
a, b ve c emsallarini daxil edin: 1 -1 -6
Kokler ferqlidir. x1 = 3
x2 = -2
Dostları ilə paylaş: |