Fonksiyonlar (Altprogram) C Programlama Dili fonksiyon olarak adlandırılan alt programların birleştirilmesi kavramına dayanır. Bir C programı bir ya da 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.1 in üzerinde açıklanmıştır. 1 Program 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 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 1 de gösterilmiştir. 2 Şekil 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 1 de kullanılan tamsayi_topla(): fonksiyonu void olarak şöyle bildirilir: /* 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 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. 3 Program 2 : mesaj_yaz() fonksiyonunu ile ekrana mesaj verme 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: /* void mesaj_yaz() ile ekrana mesaj yazar */ #include <stdio.h> void mesaj_yaz(void); /* fonksiyon prototipi */ main() { mesaj_yaz(); /* fonksiyonun çağırılması */ } /* fonksiyonun bildirimi */ void mesaj_yaz(void) { puts("Merhaba..."); } Program 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 3 de topla() fonksiyonu, ortalama() fonksiyonunun içinden çağırılmıştır. Program 3 : İki sayının toplamı ve ortalamasını fonksiyonlar kullanarak hesaplanması 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: /* iki sayının toplamını ve ortalamasını hesaplar */ #include <stdio.h> int topla( int x,int y ); float ortalama( int x, ,int y ); int x,y; /* x ve y global olarak bildiriliyor */ main() { puts("Toplamı ve ortalaması hesaplanacak iki sayı girin:"); scanf("%d %d",&x,&y); printf( "\nToplamları : %d", topla(x,y) ); printf( "\nOrtalaması : %f", ortalama(x,y) ); } /* iki sayının ortalamasını hesaplar */ float ortalama(x,y) { float ort; ort = topla(x,y)/2.0; /* topla(x,y) = x+y değeri çağırılıyor */ return ort; } /* iki sayının toplamını hesaplar */ int topla(x,y) { return x+y; } 4 Program 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 #define #define #define kare(x) (x)*(x) delta(a,b,c) (b)*(b)-4*(a)(c) yaz() puts("Devam etmek için bir tuşa basın...") 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 eklenmelidir. 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 trigonometrik fonksiyonlardır. Kullanımları Tablo 1 de gösterilmiştir. Örnek program Program 4 de sunulmuştur. Tablo 1 : Bazı Trigonometrik fonksiyonlar Fonksiyon Açıklama double sin(double x) x sayısının sinüs değerini radyan cinsinden hesaplar Örnek 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; 5 Program 4 : 45 dercelik bir açının sinüs, kosinüs ve tanjant değerleri 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: /* sin(), cos(), and tan() funksiyonlarının kullanımı */ #include <stdio.h> #include <math.h> main() { double x; x = 45.0; /* 45 derece */ x *= 3.141593 / 180.0; /* radyana çeveir */ printf("45 derecenin sinüsü : %f.\n", sin(x)); printf("45 derecenin kosinüsü : %f.\n", cos(x)); printf("45 derecenin tanjantı : %f.\n", tan(x)); return 0; } pow() - sqrt() - log() - log10() Fonksiyonları Bu fonksiyonların kullanımı Tablo 2 de, örnek program Program 5 de verilmiştir. Tablo 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 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 sqrt(4.0) = 41/2 = Program 5 : pow(), sqrt(), log() ve log10() fonksiyonlarının kullanımı 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* pow(), sqrt(), log() ve log10() fonksiyonlarının kullanımı */ #include <stdio.h> #include <math.h> main() { double x, y, z; x = 64.0; y = 3.0; z = 0.5; printf("pow(64.0, 3.0) printf("sqrt(64.0) printf("pow(64.0, 0.5) printf("ln(3.0) printf("log(3.0) = = = = = %7.0f\n", %2.0f\n", %2.0f\n", %f \n", %f \n", pow(x,y) sqrt(x) pow(x,z) log(y) log10(y) ); ); ); ); ); return 0; } 6 Bazı String Fonksiyonları Bu fonksiyonlar standart C dilinde iki stringi karşılaştırmak, bir stringin içeriğini diğerine kopyalamak ve stringin uzunluğunu bulmak vb işlemler için tanımlı fonksiyonlardır. Bu ve benzeri fonksiyonlar kullanılırken string.h kütüphanesi programın başına ilave edilmelidir. Burada sadece bunlardan bir kaçı Tablo 3 de verilmiştir. str, str1 ve str2 birer string ve kr bir karakter olmak üzere: Tablo 3 : string.h kütüphanesine ait, bazı string fonksiyonları strcmp( str1,str2 ); str1 ve str2 yi karşlaştırır strcpy( str1,str2 ); str2 yi str1 e kopyalar strcat( str1,str2 ); str2 yi str1 e ekler strrev( str ); str yi ters çevirir strlen( str ); str nin kaç karakterden oluştuğunu hesaplar strchr( str,kr ); kr ile verilen karakterin str içindeki soldan itibaren yerini verir Program 6 : İki stringin karşılaştırılması 1: #include <string.h> 2: main(){ 3: char ktr1[10],ktr2[10]; 4: int sonuc; 5: printf("1. katar:");gets(ktr1); 6: printf("2. katar:");gets(ktr2); 7: sonuc = strcmp(ktr1,ktr2); 8: if(sonuc>0) puts("2. 1.den büyük"); 9: else if(sonuc<0) puts("2. 1.den küçük"); 10: else puts("2. 1. eşit"); 11: } Program 7 : basit bir şifre programı 1: #include <string.h> 2: main(){ 3: char sifre[20]; 4: printf("SIFRE : "); 5: scanf("%s",sifre); 6: if( strcmp(sifre,"deneme")==0 ) 7: puts("sifre dogru girildi"); 8: else 9: puts("sifre yanlis!"); 10: } 7 Program 8 : Bir stringi diğerine kopyalama 1: #include <string.h> 2: main(){ 2: char *str1="ahmet", str2[10]; 4: /* once */ 5: puts(str2); 6: strcpy(str2,str1); 7: /* sonra */ 8: puts(str2); 9: } Program 9 : bir stringi diğerine ekleme 1: 2: 3: 4: 5: 6: 7: #include <string.h> main(){ char *a="ahmet char *b="bingul"; strcat(a,b); printf(a); } "; Program 10 : strinin uzunluğunu hesaplar 1: 2: 3: 4: 5: 6: 7: #include <string.h> main(){ char ktr[100]; puts("Birseyler yazin:"); gets(ktr); printf("%s %d karakterden oluşmuştur.",ktr,strlen(ktr)); } 8