1 7. FONKSİYONLAR C/C++ programlama dilinin temelini fonksiyonlar oluşturmaktadır. C/C++ programı fonksiyon ile çalışmasına başlar ve fonksiyon ile çalışmasını bitirir. Bu olmazsa olmaz fonksiyonun ismi main dir. Karmaşık programları düzenlemek ve basitleştirmek için program daha basit küçük program parçalarına bölünebilir. Daha sonra bu bloklar birleştirilerek tam çözüm elde edilebilir. Bir fonksiyon veya bir alt program belirli bir işi yapmak için oluşturulan küçük program parçalarıdır. Fonksiyon ve alt programlara aynı zamanda procedure de denmektedir. Fonksiyonlar çağrıldığı yere geri dönerler. Programlarda fonksiyon tanımlamanın birçok avantajı vardır. Birçok yerde aynı kodları kullanmanız gerektiğinde bunları her seferinde yeniden yazmak yerine bu kodları bir fonksiyonda tanımlayıp kullanacağınız yerden bunu çağırmanız yeterlidir. Örneğin Programınızda birçok yerde faktöriyel hesabı yapmanız gerekiyorsa her defasında faktöriyel hesaplayacak kodu yazmaktansa bu işlemi bir fonksiyonda yaptırıp gerekli yerlerden bu fonksiyona çağrı yapabilirsiniz. Bir fonksiyon bildirimi global olarak yapılır, fonksiyon gövdesi tanımlanan yerde yazılabileceği gibi main den sonrada yazılabilir. Bir fonksiyon bildirimi şöyle yapılır;. Dönüş_Tipi Fonksiyon_Adı (tip giriş_parametreleri); void f1(void); // tanımlaması fonksiyonun girdi (argüman) olarak herhangi bir değişken almadığını geri dönüş (return) değerinin olmadığını tanımlar. int f2(void); //f2 fonksiyonu argüman almaz ve geri dönüş tipi int dir. Geri dönş değeri fonksiyonun çağrıldığı yere, return deyimiyle yapılmaktadır. f3(float ); // f3 fonksiyonun geri dönüş değeri belirtilmemiş bu durumda derleyici geri dönüş değerini int olarak algılar ve ona göre davranır. main fonksiyonunu tanımlarken void main kullanmazsak derleyicinin verdiği uyarı mesajını hatırlayınız. f3 fonksiyonu argüman olark float bir değer almaktadır.
2 Örnek1: Fonksiyon bildirimi ve kullanımı. void f1(void); //fonksiyon bildirimi, geri dönüş değeri ve argüman yok. void f2(void) printf ("Teknik Eğitim Fakultesi\n"); f3(); // f3 fonksiyonuna cagrı yapılıyor //Bildirim ve fonksiyon gövdesi yazılıyor void f3(void); void main (void) printf ("program baslıyor\n"); f1(); // f1 fonksiyonuna cagrı yapılıyor f2(); // f3 fonksiyonuna cagrı yapılıyor printf ("program sonu\n"); getche (); void f1() //Fonksiyon gövdesi yazılıyor printf ("Gazi Üniversitesi\n"); void f3() //Fonksiyon gövdesi printf ("Elektrik Eğitimi\n"); Örnek2: Sayıların karelerinin fonksiyon ile buldurulması #include<stdio.h> baslik ();//fonksiyon tanımına dikkat ediniz. int kare (int index); bitis(); int toplam; main () int index; baslik (); // baslik fonksiyonuna cağrı yapılıyor for (index=0;index<8;index++) kare (index); // bitis (); getche (); baslik () toplam =0; printf("kare programını baslığı\n"); //herhangi bir değer geri döndürme
3 int kare(int rakam) int karesi; karesi=rakam*rakam; toplam+=karesi; printf ("%d nin karesi= %d\n",rakam,karesi); bitis() printf("karelerin toplam=%d",toplam); //Ornek3: r1 ve r2 direnclerinin seri ve paralel esdegerinin bulunmasi #include <iostream.h> float seri (float r1, float r2) float esdeger; esdeger=r1+r2; return esdeger; float paralel(float r1, float r2) float esdeger; esdeger=(r1*r2)/(r1+r2); return esdeger; float r1,r2,sec; cout<<"\n r1 ve r2 direnclerini giriniz"; cin>>r1>>r2; cout<<"\n 1-Seri esdegeri icin\n 2-Paralel esdegeri icin"; cout<<"\n Seciminiz...:"; cin>>sec; if(sec==1) cout<<"\n seri esdegeri="<<seri(r1,r2)<<"ohm"; else if(sec==2) cout<<"\n pararlel esdegeri="<<paralel(r1,r2)<<"ohm"; else cout<<"\n Tanimsiz islem"; Örnek4: Decimal sayının binary sayıya dönüştürülmesi void cevir(int value) int set=0; int x[50]; while(value!=0) x[set]=(value%2); value/=2; set++; set--; for(;set>=0;set--) printf("%d", x[set]);
4 printf("\n"); int sayi; clrscr(); printf ("\n Bir tam sayı giriniz:"); scanf("%d",&sayi); cevir(sayi); Örnek5: Üç sayını büyüğünü veren program int max(int s1,int s2,int s3) if(s1>s2&&s1>s2) return s1; else if(s2>s3)return s2; else return s3; clrscr(); printf("%d\n",max(1,2,3)); printf("%d\n",max(-10,20,3)); printf("%d\n",max(-1,-2,-3)); Örnek6: Bir sayının faktöriyelini fonksiyon ile hesaplatan programı yazınız. Örnek 7: Kombinasyon hesabını yapan program //C(n,r)=n!/(r!*(n-r)!) kombinasyon int fak (int a); int n,r; float c; puts ("kombinasyon hesab:"); puts("c(n,r)=n!/(r!*(n-r)!)\n"); printf ("n'in degerini giriniz...\n"); scanf ("%d",&n); printf ("r'in degerini giriniz...\n"); scanf ("%d",&r); c=(float)fak(n)/(fak(r)*fak(n-r)); printf("c=%5.2f\n",c); int fak (int a)
5 int i,fa; fa=1; if(a<0) else if (a==0) return 1; else for (i=1;i<=a;i++) fa*=i; return (fa); Örnek 8: Dizi içerisinde verilen sayıların en küçüğünün bulunması. Dizinin fonksiyona gönderilmesi pointer konusunda işlenecektir. //x[] ile verilen sayıların min bulur #include <conio.h> int k; int min(int a,int b) k=(a<b)?a:b; return k; int x[]=2,3,0,5,6,10; int i,enkucuk; k=x[0]; for (i=1;i<6;i++) enkucuk=min(k,x[i]); printf ("en kucuk sayı=%d",enkucuk); getche (); Örnek 9: Bir işlevin köklerinden birini Newton yönetimi ile bulan prg. ( x 2-4 ) //Newton Rahpson debklemin köklerini f(x)=x0-f(x0)/f(x') şeklinde bulur #include <math.h> double fn(double); double fnt(double); double x,x0; double hata = 0.0001; /* izin verilen hata */ x = 8; /* başlangıç değeri */ do x0 = x; x = x0 - fn(x0)/fnt(x0); while (fabs(x-x0)>hata); printf ("Sonuç = %f\n", x);
6 printf ("Fonksiyonun köklerinden biri f(x) = %f\n", fn(x)); double fn(double x) /* işlevin değeri */ return x*x-4; //fonksiyon double fnt(double x) /* işlevin türevinin değeri */ return 2*x; //fonksiyonun türevi 7.2.Özyineleme (Recursive) Fonksiyonlar Fonksiyonları kullanırken buraya kadar diğer fonksiyonlardan çağrı yaptık. Hâlbuki fonksiyon kendi kendini de çağırabilir. Bu tür fonksiyonlara özyinelemeli (recursive) fonksiyon adı verilir. Fonksiyon çağrıldığı yere geri döneceğine göre bu recursive fonksiyonların geri dönüşü yine çağrıldığı satır olacaktır. Örnek10: Recursive fonksiyon kullanımı #include <conio.h> f1(int rakam); int index; index =8; f1(index); printf("ana fonksiyon\n"); f1(int rakam) rakam--; printf ("%d\n",rakam); if(rakam!=0) //fonksiyon kendisini çağrıyor. f1(rakam); //printf("%d\n",rakam); açıklamayı iptal edip çalıştırın Örnek 11: Faktoriyel hesabının recursive fonksiyon ile bulunması #include <stdlib.h> #include <conio.h> faktor (int n)
7 int fakt; if(n==1) return 1; fakt=n*faktor(n-1); printf("f=%d\n", fakt); int n=3; printf ("f=%d\n",faktor(n));; KAYNAKLAR Şevki DEMİRBAŞ, Oğuz ÜSTÜN ve Nihat ÖZTÜRK, Beltek kursu ders notları, Gazi Üniversitesi Pektaş H., C Dili Kullanarak Bilgisayar Programlama, KOU EHM, Ders Notları.