3 Ocak 2014 Cuma

C dili Fonksiyonlar (Altrogram) - Ders6

Ders6: Fonksiyonlar (Altrogram)

C Programlama Dili fonksiyon olarak adlandırılan alt programların birleştirilmesi kavramına dayanır. Bir C programı bir yada daha çok fonksiyonun bir araya gelmesi ile oluşur. C Dilini öğrenmek için ilk önce fonksiyon oluşturmayı ve onların diğerleri ile birlikte kullanılmasını öğrenmek gerekir.Her fonksiyonun bir adı ve fonksiyona gelen değerleri gösteren argumanları(bağımsız değişkenleri) vardır. C dilinde hazırlanan bir fonksiyonun genel yapısı şöyledir:
      FonksiyonTipi FonksiyonAdı(arguman listesi)
      argumanların tip bildirimleri
      {
        Yerel değişkenlerin bildirimi
        ...
        fonksiyon içindeki deyimler veya diğer fonksiyonlar
        ...
      }
Örnek fonksiyon : iki tamsayıyı toplayıp sonucu sonuc adlı değişkene aktarır.
  /* Bu fonksiyon iki tamsayıyı toplar ve sonucu sonuc değişkenine aktarır */
  int tamsayi_topla( int x, int y )
  {
     int sonuc;
     sonuc = x + y;
     return sonuc;
  }
Yukarıdaki program parçası şu şekilde de yazılabilir:
  /* Bu fonksiyon iki tamsayıyı toplar */
  int tamsayi_topla( int x, int y )
  {
     return (x+y);
  }
Her iki program parçasında da return (geri dönüş) deyimi kullanılmaktadır. Bu deyim C programlama dilinin anahtar sözcüklerinden biridir ve fonksiyon içerisinde sonucu, kendisini çağıran yere göndemek için kullanılır. Yani tamsay_topla() fonksiyonu herhangi bir programın içerisinde kullanıldığında, fonksiyonun üreteceği sonuç return deyiminden sonra belirtilen değişken veya işlem olacaktır. Örneğin:
  ...
  int toplam;
  toplam = tamsayi_topla(1,2);
  printf("Toplam = %d dir",toplam);
  ...
şeklinde kullanılırsa, toplam değişkenine 1+2=3 değeri atanır. Fonksiyon kullanımı Program 6.1 nın üzerinde açıklanmıştır.
Program 6.1 : tamsayi_topla(); fonksiyonunu ile basit bir fonksiyon uygulaması
1:  /* iki sayıyı topla ve sonucu ekranda göster */
2:  #include <stdio.h>
3:  
4:  int tamsayi_topla( int x,int y );  /* fonksiyon prototipi */
5:
6: int main()
7: {
8:    int toplam;
9: /* 
10:    fonksiyon çağırılıp, 5 ve 12 değerleri parametre olarak aktarılıyor.
11:    tamsayi_topla(5,12) = 5 + 12 değeri toplam değişkenine atanması.
12: */
13:    toplam = tamsayi_topla(5,12);
14: 
15:    printf("5 ve 12 nin toplamı  %d dir.\n", toplam);
16
17: return 0;
18: }
19:
20: /* fonksiyon tanımlanması */
21: /* Bu fonksiyon iki tamsayıyı toplar ve sonucu sonuc değişkenine aktarır */
21:  int tamsayi_topla( int x, int y )
22:  {
23:     int sonuc;
24:     sonuc = x + y;
25:     return sonuc;
26:  }

Program 6.1 , basit bir fonksiyonun C programlama dilinde nasıl oluşturulduğunu ve kullanıldığını gösterir. 4. satırda kullanılacak olan fonksiyonun prototipi bildirilmektedir. Geleneksel olarak bütün fonksiyon kodları main() fonksiyonundan sonra bildirilir. (Gerçekte buna gerek yoktur. Fonksiyon bildirimleri main()den önce de tanımlanabilir.) Eğer geleneksel tercih yapılırsa, fonksiyonun adı main()den önce bildirilmelidir. Bu bildirime fonksiyon protipi(fonksiyon örneği) denir. 13. satırda toplam adlı tamsayı değişkenine tamsayi_topla() fonksiyonunun dönüş değeri, x + y değeri, atanır.
Ana programdan, main() fonksiyonundan, isteğe göre birden çok fonksiyon çağırmak mümkündür. Bir fonksiyonun çağırılması demek, o fonksiyonun geri dönüş değerinin ana programda kullanılması demektir. Birden çok fonksiyonun main() tarafından nasıl çağrıldığını temsil eden blok diyagram Şekil 6.1 de gösterilmiştir.
Ana programdan alt programların çağırılması
Şekil 6.1 : Ana programdan fonksiyonların çağırılması. Fonksiyonu çağırmak için, fonksiyonun adını yazmak yeterlidir.
Bir fonksiyonun her zaman geri dönüş değerinin olması gerekmez. Böyle fonksiyonların tipi void olarak belirtilmelidir. Bu tip fonksiyonlar başka bir yerde kullanılırken, herhangi bir değişkene atanması söz konusu değildir, çünkü geri dönüş değeri yoktur. Fakat void fonksiyonlara parametre aktarımı yapmak mümkündür. Örneğin Program 6.1 da kullanılan tamsayi_topla(): fonksiyonu void olarak şöyle bilidirilir:
 /* x,y,z global değişken olmalıdır !... */
 void tamsayi_topla( int x,int y,int z )
 {
   z = x + y;
 }
Bu fonksiyon başka bir fonksiyonun içinde kullanılacaksa sadece isminin yazılması yeterli olacaktır. Mesela main() fonksiyonunda kullanmak istenirse:
 main()
 {
  ...
   tamsayi_topla(5,12,z);
   printf("5 ile 12 nin toplamı %d dir",z);
  ...
 }
şeklinde olacaktır. Program 6.2 'de, ne parametresi ne de geri dönüş değerine sahip tipi void olan mesaj_yaz() fonksiyonu ile, ekrana basit bir mesajın, fonksiyon kullanarak, çıkarılması gösterilmiştir.
Program 6.2 : mesaj_yaz() fonksiyonunu ile ekrana mesaj verme
1:  /* void mesaj_yaz() ile ekrana mesaj yazar */
2:  #include <stdio.h>
3:
4:  void mesaj_yaz(void); /* fonksiyon prototipi */
5:
6:  main()
7:  {
8:     mesaj_yaz();  /* fonksiyonun çağırılması */
9:  }
10: /* fonksiyonun bildirimi */
11: void mesaj_yaz(void)
12: {
13:    puts("Merhaba...");
14: }

Program 6.2 'de 4. satırda void mesaj_yaz() fonksiyonunun prototipi bildirilmiştir. 8. satırda bu fonksiyonun sadece adı yazılmıştır. Derleyici bu satıra gelince hemen 11. satıra gidip puts() fonksiyonunu işleme koyar ve sonucu çağrıldığı yere, 8. satıra, gönderir.
Bir fonksiyon istenilen yerde istenildiği kadar kullanılabilir. Program 6.3 de topla() fonksiyonu, ortalama() fonksiyonunun içinden çağırılmıştır.
Program 6.3 : İki sayının toplamı ve ortalamasını fonksiyonlar kullanarak hesaplanması
1:   /* iki sayının toplamını ve ortalamasını hesaplar */
2:  #include <stdio.h>
3:
4:  int topla( int x,int y );
5:  float ortalama( int x, ,int y );
6:  
7:  int x,y;  /* x ve y global olarak bildiriliyor */
8:
9:  main()
10: {
11:    puts("Toplamı ve ortalaması hesaplanacak iki sayı girin:");
12:    scanf("%d %d",&x,&y);
13:    printf( "\nToplamları : %d", topla(x,y) );
14:    printf( "\nOrtalaması : %f", ortalama(x,y) );
15: }
16:
17: /* iki sayının ortalamasını hesaplar */
18: float ortalama(x,y)
19: {
20:     float ort;
21:     ort = topla(x,y)/2.0;  /* topla(x,y) = x+y değeri çağırılıyor */
22:     return ort;
23: }
24:
25: /* iki sayının toplamını hesaplar */
26: int topla(x,y)
27: {
28:     return x+y;
29: }

Program 6.3 de, klavyeden girilen iki sayı 12. satırda okunmuştur. 13. ve 14. satırlarda fonksiyonlar sırasıyla çağırılmış ve sonuçları ekrana yazdırılmıştır. 21. satırda topla fonksiyounu, bir kez daha kullanılmıştır.
Başlık dosyalarında da bolca olan makro fonksiyon tanımlaması #define önişlemci komutu kullanılarak yapılır. Örneğin aşağıdaki makro fonksiyonlar geçerlidir.
  #define kare(x) (x)*(x)
  #define delta(a,b,c) (b)*(b)-4*(a)(c)
  #define yaz() puts("Devam etmek için bir tuşa basın...")
  #define PI 4*atan(1.0)
Bu şekilde tanımlanan fonksiyonların kullanımı, diğerleri gibidir. Yalnızca programın başında tanımlanır.
Matematiksel Fonksiyonlar
Matematiksel fonksiyonların tipleri double dır. Bu fonksiyonlardan biri program içinde kullanılacaksa math.h başlık dosyası program içine ekelenmelidir. Bu kısımda bu fonksiyonlardan en sık kullanılanlar (sin(),cos(),tan,pow(),sqrt()) anlatılacaktır.
sin() - cos() - tan() Fonksiyonları
Bu fonksiyonlar en temel trigonomertik fonksiyonlardır. Kullanımları Tablo 6.1 da gösterilmiştir. Örnek program Program 6.4 de sunulmuştur.
Tablo 6.1 : Bazı Trigonometrik fonksiyonlar
Fonksiyon Açıklama Örnek
double sin(double x) x sayısının sinüs değerini radyan cinsinden hesaplar y = sin(0.22)
double cos(double x) x sayısının kosinüs değerini radyan cinsinden hesaplar y = cos(0.14)
double tan(double x) x sayısının tanjant değerini radyan cinsinden hesaplar y = tan(0.82)
Bu fonksiyonlar kendisine parametre olarak gelen değeri radyan olarak kabul eder ve sonucu hesaplar. Eğer derece cinsinden açıların hesaplanması gerekiyorsa su dönüşüm kullanılmalıdır:
  radyan = (3.141593/180.0)*derece;
Program 6.4 : 45 dercelik bir açının sinüs, kosinüs ve tanjant değerleri
1:  /* sin(), cos(), and tan() funksiyonlarının kullanımı */
2:  #include <stdio.h>
3:  #include &ltmath.h>
4:
5:  main()
6:  {
7:     double x;
8:
9:     x = 45.0;                 /* 45 derece */
10:    x *= 3.141593 / 180.0;    /* radyana çeveir */
11:    printf("45 derecenin sinüsü   : %f.\n", sin(x));
12:    printf("45 derecenin kosinüsü : %f.\n", cos(x));
13:    printf("45 derecenin tanjantı : %f.\n", tan(x));
14: return 0;
15: }
45 derecenin sinüsü   : 0.707107
45 derecenin kosinüsü : 0.707107
45 derecenin tanjantı : 1.000000

pow() - sqrt() - log() - log10() Fonksiyonları
Bu fonksiyonların kullanımı Tablo 6.2 de, örnek program Program 6.5 da verilmiştir.
Tablo 6.2 : pow() - sqrt() ve logaritmik fonksiyonlar
Fonksiyon Açıklama Örnek
double pow(double x, double y) xy değerini hesaplar pow(2.0,3.0) = 23 = 8
double sqrt(double x) pozitif x sayısının karekökünü hesaplar sqrt(4.0) = 41/2 = 2
double log(double x) pozitif x sayısının doğal logaritmasını hesaplar, ln(x) log(4.0) = 1.386294
double log10(double x) pozitif x sayısının logaritmasını hesaplar log(4.0) = 0.602060

Program 6.5 : pow(), sqrt(), log() ve log10() fonksiyonlarının kullanımı
1:  /* pow(), sqrt(), log() ve log10() fonksiyonlarının kullanımı */
2:  #include <stdio.h>
3:  #include <math.h>
4:
5:  main()
6:  {
7:     double x, y, z;
8:
9:     x = 64.0;
10:    y = 3.0;
11:    z = 0.5;
12:    printf("pow(64.0, 3.0) = %7.0f\n", pow(x,y) );
13:    printf("sqrt(64.0)     = %2.0f\n", sqrt(x)  );
14:    printf("pow(64.0, 0.5) = %2.0f\n", pow(x,z) );
15:    printf("ln(3.0)        = %f   \n", log(y)   );
16:    printf("log(3.0)       = %f   \n", log10(y) );
17:
18: return 0;
19: }
pow(64.0, 3.0) = 262144
sqrt(64.0)     = 8
pow(64.0, 0.5) = 8
ln(3.0)        = 1.098612
log(3.0)       = 0.477121

Hiç yorum yok:

Yorum Gönder