programı yerinə yetirək.
proqram bizə tam aydındır. Indi isə gəlin
proqram hissəsindən ibarət cap_et funksiyası yaradaq və proqramımızda bu funksiyadan istifadə edək.
sətrindən sonra gələn void cap_et(void); sətridir. Bu sətir funksiyanın elanı sətridir. Hər bir funksiyanı proqramda istifadə etməzdən əvvəl onu elan etmək lazımdır. Bu sətir kompilyatora funksiyanın adı, qaytaracağı nəticənin tipi və ona ötürüləcək parametrlər haqqında məlumat verir. Bu sətirdə birinci yerdə gələn söz funksiyanın qaytaracağı nəticənin tipini bildirir.
Əgər funksiya heç bir nəticə qaytarmırsa onda bu yerdə void yazılır , baxdığımız haldakı kimi. Funksiyanın tipindən sonra funksiyanın adı qeyd olunur – cap_et. Addan sonra () mötərəzələri arasında funksiyanın parametrləri haqda məlumat qeyd olunur. Əgər funksiya heç bir parametr qəbul etmirsə burada void yazırıq.
prog_5_3.c -ni yerinə yetirin və onu başa düşməyə çalışın.
prog_5_3.c
#include
void cap_et(void);
int main(int argc, char *argv[]){
int i;
for(i=0; i<5; ++i)
cap_et();
return 0;
}
/*-----------------------cap_et funksiyasi --------------------------------*/
void cap_et(void)
{
printf("Setirlerin ekrana verilmesi\n");
printf("Setir 1\n");
printf("bu gun yagish yagir\n");
printf("Bu gun kulek esir\n");
}
Digər proqrama baxaq.
prog_5_4.c
#include
int sahe(int,int);
int main(int argc, char *argv[])
{
int x,y,z;
printf("Duzbucaqlinin enini daxil edin\n");
scanf("%d",&x);
printf("Duzbucaqlinin uzunlugunu daxil edin\n");
scanf("%d",&y);
z=sahe(x,y);
printf("Duzbucaqlinin sahesi =%d\n",z);
return 0;
}
int sahe(int t1, int t2)
{
int sh;
sh=t1*t2;
return sh;
}
proqramı yerinə yetirək
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# gcc prog_5_4.c -o prog_5_4
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_5_4
Duzbucaqlinin enini daxil edin
6
Duzbucaqlinin uzunlugunu daxil edin
8
Duzbucaqlinin sahesi =48
user@gnu_linux:~/prg#
user@gnu_linux:~/prg#
Izahı
Burada biz yeni sahe funksiyası yaradırıq hansı ki int tipli 2 parametr qebul edir və nəticə olaraq int tipli ədəd (düzbucaqlının sahəsini ) qaytarır. int sahe(int,int);
Mötərizələr arasında funksiyaya ötürülən parametrlərin tipləri sadalanır, vergüllə ayrılaraq. Qeyd edək bu zaman her parametrin tipinin qarşısında ad da vere bilerik, kompilyator bunu nəzərə almır, o ancaq tipə əhəmiyyət verir. Yəni əgər yuxarıdakı proqramda sahə funksiyasını elan edərkən biz int sahe(int,int); sətri əvəzinə int sahe(int teref2,int teref2); də yaza bilərdik. Sadəcə özümüzə və bu proqrama daha sonra baxan proqramçılara mılumat məqsədilə. Əgər proqramda bir funksiyada istifadə olunursa bunun elə də əhəmiyyəti yoxdur, lakin proqramda 1000-lə funksiyadan istifadə olunduqda (məsələn nüvənin yaddaşın idarə olunması hissəsi və ya şəbəkə hissəsi) bunun əhəmiyyəti hiss olunur.
Biz proqramda sahe funksiyasını z=sahe(x,y); sətrində çağırırıq. x və y dəyişənlərinin qiymətləri scanf funksiyası vasitəsilə istifadəçidən alınır və sahə funksiyasına parametr kimi ötürülür. sahe funksiyasında bu 2 dəyişənin hasili hesablanır və qaytarılan nəticə z dəyişəninə mənimsədilir.
sahe funksiyasının mətnində biz int tipli sh dəyişəni elan edirik və parametrlərin hasilini hesablayaraq bu dəyişənə mənimsədirik. Daha sonra return əmri vasitəsilə funksiyanın proqramda çağırılma nöqtəsinə( z=sahe(x,y);) qaytarılacaq nəticə göstərilir. return əmri funksiyasiyanın icrasını başa çatdırır və proqramın icrası funksiyanın çağrılma yerindən davam edir.
Biz burada x,y dəyişələri daxil etdik və onlara scanf vasitasilə istifadəçinin daxil etdiyi qiymətləri mənimsətdik, daha sonra sahə funksiyasını çağırdıq. x,y -in qiymətlərini bu funksiyaya parametr kimi ötürdük. z=sahe(x,y); bu yerdə proqramın icrası sahə funksiyasına ötürüldü və x,y -in qiymətlərindən istifadə olunaraq hsablama aparıldı, nəticə zdəyişəninə mənimsədildi və proqramın icrası davam etdi.
Sual? Tutaq ki istifadəçi 5 və 7 ədədlərini daxil edib.
x=5; y=7;. sahə funkdiyası yerinə yetirildikdən sonra x və y -in qiyməti dəyişmədiki? Yəni funksiyanın mətnində ona ötürülən arqumentlərə edilən dəyişiklik funksiya icra olunduqdan sonra öz qüvvəsini saxlayırmı? Bunu yoxlamaq üçün printf funksiyasından istifadə edək.
prog_5_5.c
#include
int sahe(int,int);
int main(int argc, char *argv[])
{
int x,y,z;
printf("Duzbucaqlinin enini daxil edin\n");
scanf("%d",&x);
printf("Duzbucaqlinin uzunlugunu daxil edin\n");
scanf("%d",&y);
z=sahe(x,y);
printf("Duzbucaqlinin sahesi =%d\n",z);
printf("x=%d, y= %d\n",x,y);
return 0;
}
int sahe(int t1, int t2)
{
int sh;
sh=t1*t2;
return sh;
}
proqramı yerinə yetirək
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# gcc prog_5_5.c -o prog_5_5
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_5_5
Duzbucaqlinin enini daxil edin
6
Duzbucaqlinin uzunlugunu daxil edin
8
Duzbucaqlinin sahesi =48
x=6, y= 8
user@gnu_linux:~/prg#
user@gnu_linux:~/prg#
Qeyd edək ki bu halda biz sahə funksiyasında ona ötürülən parametrlərin qiymətlərini dəyişmədik. İdi gəlin digər proqramda sahə funksiyasında bu qiymətləri dəyişək və nəticəni yenidən yoxlayaq.
proq_5_6.c
#include
int sahe(int,int);
int main(int argc, char *argv[])
{
int x,y,z;
printf("Duzbucaqlinin enini daxil edin\n");
scanf("%d",&x);
printf("Duzbucaqlinin uzunlugunu daxil edin\n");
scanf("%d",&y);
z=sahe(x,y);
printf("Duzbucaqlinin sahesi =%d\n",z);
printf("x=%d, y= %d\n",x,y);
return 0;
}
int sahe(int t1, int t2)
{
int sh;
sh=t1*t2;
/* funksiyaya oturulen arqumentlerin(t1,t2) qiymtlerini
burada deyishirik */
t1=1; t2=2;
return sh;
}
Gördüyümüz kimi sahə funksiyasında biz sahəni hesabladıqdan sonra ona ötürülən parametrlərin qiymətlərini dəyişdirdik.
Nəticəni yoxlayaq.
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# gcc prog_5_6.c -o prog_5_6
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_5_6
Duzbucaqlinin enini daxil edin
4
Duzbucaqlinin uzunlugunu daxil edin
7
Duzbucaqlinin sahesi =28
x=4, y= 7
user@gnu_linux:~/prg#
user@gnu_linux:~/prg#
Gördüyümüz kimi funksiyanın daxilində ona ötürülən parametrlərin qiymətlərinin dəyişdirilməsi funksiya icra olduqdan sonra öz qüvvəsini itirdi, x və y- in qiymətləri olduğu kimi qaldı. Dəyişənlərin funksiyaya belə ötürülməsinə deyirlər qiymətə görə ötürmə.
Bunun səbəbi odur ki, funksiya çağırılarkən parametr kimi ona əslində x və y ötürülmür, bu dəyişənlərin surətləri yaradılır və funksiyaya ötürülür. Funksiyanın mətnində bu dəyişənlər üzərində aparılan bütün dəyişikliklər əslində onların surətləri üzərində aparılır.
Dəyişənlərin funksiyaya bu cür ötürülməsinin müsbət və mənfi tərəfləri var. Müsbət hal odur ki qiymətə görə ötürülmə zamanı bütün əməliyyatlar dəyişənlərin surətləri üzərində aparıldığından dəyişənlərin qiymətləri hər cür dəyişiklikdən qorunmuş olur.
Mənfi hal odur ki, bu zaman dəyişənlərin surətləri yaradılır və buna proqramçı üçün ən qiymətli resurslar – əməli yaddaş və zaman sərf olunur.
Parametrlərin funksiyaya ötürülməsinin digər variantı da ünvana görə ötürülmədir. Bu zaman, dəyişənlərin surətləri yaradılmır və funksiyaya dəyişənlərin ünvanları ötürülür. Nəticədə funksiyada dəyişənlər üzərində aparılan bütün əməliyyatlar məhz onların əsli üzərində aparılmış olur.
Parametrlərin ünvana görə ötürülməsi
prog_5_7.c -ni yerinə yetirək
#include
int sahe(int *,int *);
int main(int argc, char *argv[])
{
int x,y,z;
printf("Duzbucaqlinin enini daxil edin\n");
scanf("%d",&x);
printf("Duzbucaqlinin uzunlugunu daxil edin\n");
scanf("%d",&y);
z=sahe(&x,&y);
printf("Duzbucaqlinin sahesi =%d\n",z);
printf("x=%d, y= %d\n",x,y);
return 0;
}
int sahe(int *t1, int *t2)
{
int sh;
sh=(*t1)*(*t2);
*t1=1; *t2=2;
return sh;
}
proqramı yerinə yetirək
user@gnu_linux:~/prg# gcc prog_5_7.c -o prog_5_7
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_5_7
Duzbucaqlinin enini daxil edin
3
Duzbucaqlinin uzunlugunu daxil edin
8
Duzbucaqlinin sahesi =24
x=1, y=2
user@gnu_linux:~/prg#
Izahı (to do: ahmed bura izah yaz)
Gördüyümüz kimi funksiayda ona ötürülən parametrlər üzərində edilən dəyişiklik öz qüvvəsini saxladı. Izahı:
int sahe(int *,int *); sətri ilə sahə funksiyası elan edilir. Bu sətrdə göstərilir ki, sahə funksiyası nəticə olaraqint tipli qiymət qaytarır. Bizim üçün maraqlı () mötərizələri arasında onaldı hissədir. Qiymətə görə ötürmə zamanı biz yalnız tipi göstərirdik. Ünavana görə ötürmə zamanı isə sadəcə tipdən sonra * simvolu yazırıq. Sahə funksiyasına proqramda z=sahe(&x,&y); sətrində müraciət edirik. Burada & operatoru vastəsilə sahə funksiyasına parametr kimix və y dəyişənlərinin yaddaşdakı ünvanları ötürülür.
Dostları ilə paylaş: