![]() |
Fonksiyonlar (Programlama) |
![]() |
![]() |
#1 |
Prof. Dr. Sinsi
|
![]() Fonksiyonlar (Programlama)C'de alt programlara fonksiyon denir ![]() ![]() Fonksiyonlar C dilinin temel yapı taşlarıdır ![]() ![]() ![]() Fonksiyonların onları çağıran fonksiyonlardan aldıkları girdileri ve yine onları çağıran fonksiyonlara gönderdikleri çıktıları vardır ![]() Fonksiyonların girdilerine parametreler (parameters) ya da argumanlar (arguments) diyoruz ![]() Fonksiyonların çıktılarına geri dönüş değeri (return value) diyoruz ![]() Bir fonksiyon iki farklı yönden kullanılabilir : fonksiyon, icrası* süresince belli amaçları gerçekleştirir ![]() - fonksiyon icrası sonunda bir değeri çıktı olarak kendisini çağıran fonksiyona gönderebilir ![]() fonksiyonların geri dönüş değerleri (return values of the functions) Bir fonksiyonun icrası sonunda onu çağıran fonksiyona dönüşünde gönderdiği değere, fonksiyonun geri dönüş değeri (return value) denmektedir ![]() ![]() Bir fonksiyonun geri dönüş değeri varsa, fonksiyon çağırma ifadesi geri dönüş değerini üretir ![]() Geri dönüş değeri bir değişkene atanabileceği gibi doğrudan aritmetik işlemlerde de kullanılabilir ![]() sonuc = hesapla(); Burada hesapla fonksiyonunun çağırılma ifadesiyle üretilen geri dönüş değeri, sonuc değişkenine atanmaktadır ![]() Bir başka deyişle bir fonksiyon çağırma ifadesinin ürettiği değer, ilgili fonksiyonun ürettiği (eğer üretiyorsa) geri dönüş değeridir ![]() Yukarıdaki örnekte önce hesapla() fonksiyonu çağırılacak daha sonra fonksiyonun icra edilmesiyle oluşan geri dönüş değeri sonuc değişkenine atanacaktır ![]() Fonksiyonların geri dönüş değerleri nesne değildir yani sol taraf değeri (L value) değildir ![]() Yani* C dilinde aşağıdaki gibi bir atama her zaman hata verecektir : hesapla() = 5;************************************************ ************************* / hata** (L value required) / fonksiyonların geri dönüş değerleri sağ taraf değeri (R value) dir ![]() sonuc = hesapla1() + hesapla2() + x + 10; gibi bir ifade geçerlidir ![]() ![]() ![]() fonksiyonların geri dönüş değerleri farklı amaçlar için kullanılabilir; i ![]() ![]() ![]() y = pow(2, 3); pow fonksiyonu standart bir C fonksiyonudur ![]() ![]() ![]() ![]() ii ![]() ![]() ![]() ![]() p = malloc(200); ifadesiyle bellekte 200* byte uzunluğunda bir blok tahsis etmek isteyen programcı bu işlemin başarılı bir biçimde yerine getirilip getirilmediğini de test etmek zorundadır ![]() ![]() ![]() iii ![]() ![]() ![]() if (isspace(ch)) { ![]() ![]() ![]() } burada isspace fonksiyonu parametre olarak aldığı karakterin (kendisine gönderilen argumanın) bir boşluk karakteri (white space) olup olmadığını test eder ![]() ![]() ![]() iv) Bazı fonksiyonlar hem belli bir amacı gerçekleştirirler hem de buna ek olarak amaçlarını tamamlayan bir geri dönüş değeri üretirler ![]() x =* printf(Merhaba Dünya ); burada printf fonksiyonu ekrana Merhaba Dünya* yazısını yazmak için kullanılmıştır ![]() ![]() iv) Bazan geri dönüş değerlerine ihtiyaç duyulmaz ![]() ![]() clrscr(); clrscr(); fonksiyonu yalnızca ekranı siler, böyle bir fonksiyonun geri dönüş değerine ihtiyacı yoktur ![]() Fonksiyonların geri dönüş değerlerinin de türleri söz konusudur ![]() ![]() ![]() fonksiyonların tanımlanması Kendi yazdığımız fonksiyonlar için tanımlama (definition) terimini kullanıyoruz ![]() C'de fonksiyon tanımlama işleminin genel biçimi şöyledir : [Geri dönüş değerinin türü] &lt;fonksiyon ismi&gt; ([parametreler]) { ![]() ![]() ![]() ![]() ![]() ![]() } Yukarıdaki gösterimde açısal parantez içinde belirtilen ifadeler zorunlu olarak bulunması gerekenleri* köşeli parantez içinde belirtilen ifadeler ise bulunması zorunlu olmayan, isteğe bağlı (optional) ifadeleri göstermektedir ![]() ![]() Tanımlanan fonksiyonlar en az bir blok içerirler ![]() ![]() double fonk1() { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } Ana blok içinde istenildiği kadar içiçe blok yaratılabilir ![]() Yukarıdaki tanımlamadan fonk1 fonksiyonunun parametre almadığını ve geri dönüş değerinin de double türden olduğunu anlıyoruz ![]() void anahtar sözcüğü Bir fonksiyonun parametre değişkeni ya da geri dönüş değeri olmak zorunda değildir ![]() Bir fonksiyonun parametre değişkeni olmadığı iki şekilde belirtilebilir:ß i ![]() ![]() ii ![]() ![]() fonk()******************************************** ****************** fonk(void)******************** {************************************************* ******************************* { }************************************************* ******************************* } yukarıdaki her iki tanımlama da aynı anlama gelmektedir ![]() Geri dönüş değerine ihtiyaç duyulmadığı durumlarda da geri dönüş değerinin türü yerine void anahtar sözcüğü yerleştirilir ![]() void sample(void) { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } Yukarıda tanımlanan sample fonksiyonu parametre almamakta ve bir geri dönüş değeri de üretmemektedir ![]() Fonksiyon tanımlarken geri dönüş değeri yazılmayabilir ![]() ![]() ![]() sample2() { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } tanımlanan sample2 fonksiyonunun parametresi yoktur ama int türden bir geri dönüş değeri vardır ![]() C dilinde fonksiyon içinde fonksiyon tanımlanamaz! Örneğin aşağıdaki durum error oluşturur, çünkü sample2 fonksiyonu sample1 fonksiyonunun içinde tanımlanmıştır: double sample1() { ![]() ![]() ![]() ![]() ![]() ![]() int sample2()*************************************** / error / { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } ![]() ![]() ![]() } tanımlamanın aşağıdaki şekilde yapılması gerekirdi : double sample1() { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } int sample2() { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } fonksiyonların çağırılması (function calls) C dilinde fonksiyon çağırma operatörü olarak () kullanılmaktadır ![]() ![]() Fonksiyonlar ancak tanımlanmış fonskiyonların içerisinden çağırılabilirler ![]() ![]() Çağıran fonksiyon ile çağırılan fonksiyonun her ikisi de aynı amaç kod içerisinde bulunmak zorunda değildir ![]() ![]() ![]() ![]() Çağıran fonksiyon ile çağırılan fonksiyon arasında bağlantı kurma işlemi, bağlama aşamasında , bağlayıcı program (linker) tarafından yapılır ![]() Bu nedenle tanımlanan bir fonksiyon içerisinde, var olmayan bir fonksiyon çağırılsa bile derleme aşamasında bir hata oluşmaz ![]() ![]() ![]() Bütün C programları çalışmaya main fonksiyonundan başlar ![]() ![]() ![]() ![]() ![]() standart C fonksiyonları Standard C fonksiyonları, C dilinin standarlaştırılmasından sonra, her derleyicide bulunması zorunlu hale getirilmiş fonksiyonlardır ![]() ![]() ![]() Bir fonksiyonun derleyiciyi yazanlar tarafından tanımlanmış ve derleyici paketine eklenmiş olması, o fonksiyonun standart C fonksiyonu olduğu anlamına gelmez ![]() ![]() ![]() Örneğin printf fonksiyonu standart bir C fonksiyonudur ![]() ![]() Standart C fonksiyonları özel kütüphanelerin içerisinde bulunurlar ![]() ![]() ![]() ![]() Kütüphaneler (libraries) derlenmiş dosyalardan oluşur ![]() ![]() ![]() ![]() ![]() ![]() Derleyicileri yazanlar tarafından kaynak kodu yazılmış standart C fonksiyonları önce derlenerek ![]() ![]() ![]() ![]() ![]() ![]() ![]() Standart* fonksiyonlarını kullanmak programların taşınabilirliğini artırdığı gibi proje geliştirme süresini de kısaltır ![]() ![]() fonksiyonların geri dönüş değerlerinin oluşturulması C dilinde fonksiyonların geri dönüş değerleri return anahtar sözcüğü ile oluşturulur ![]() ![]() #include &lt;stdio ![]() int sample(void) { int x = 10; int y = 20; *********** return x y; } main() { int c; *********** c = sample(); printf(c = %d , c); return 0; } Yukarıdaki örnekteki sample fonksiyonunda return anahtar sözcüğünün yanında yer alan x y ifadesi sample fonksiyonunu sonlandırmakta ve sample fonksiyonunun geri dönüş değerini oluşturmaktadır ![]() ![]() printf(%d , sample()); aynı örnekte main fonksiyonu içinde de bir return ifadesinin yer aldığı görülmektedir ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 1 ![]() ![]() ![]() 2 ![]() ![]() ![]() return anahtar sözcüğünün kullanılması zorunlu değildir ![]() ![]() ![]() return anahtar sözcüğünden sonra parantez kullanılabilir ama parantez kullanımı zorunlu değildir ![]() ![]() return (a b - c d); return 5;********************* / return ifadesinin değişken içermesi bir zorunluluk değildir ![]() ![]() return sample();*********** bu örnekte return anahtar sözcüğünden sonra bir fonksiyon çaırma ifadesi yer almaktadır ![]() ![]() Geri dönüş değeri olmayan fonksiyonlarda return anahtar* sözcüğü yanında bir ifade olmaksızın tek başına da kullanılabilir : return; Bu durumda içinde yer aldığı fonksiyonu bir geri dönüş değeri olmaksızın sonlandırır ![]() C dilinde fonksiyonlar yalnızca bir geri dönüş değeri üretebilirler ![]() ![]() ![]() Fonksiyonların ürettiği geri dönüş değerlerinin kullanılması yönünde bir zorunluluk yoktur ![]() a = fonk(); yukarıdaki ifadese fonk fonksiyonunun geri dönüş değeri a değişkenine atanmaktadır ![]() ![]() fonk(); şeklinde bir fonksiyon çağırma ifadesinde artık geri dönüş değeri bir değişkende saklanmamakatdır ![]() ![]() ![]() Örneğin standart bir C fonksiyonu olan printf fonksiyonun da bir geri dönüş değeri vardır (printf fonksiyonu ekrana bastırılan toplam karakter sayısına geri döner) ama bu geri dönüş değeri nadiren kullanılır ![]() fonksiyon parametre değişkenlerinin tanımlanması bir fonksiyonun parametreleri ya da parametre değişkenleri fonksiyonların kendilerini çağıran fonksiyonlardan aldıkları girdileri tutan değişkenleridir ![]() ![]() C dilinde fonksiyonların tanımlanmasında kullanılan 2 temel biçim vardır ![]() ![]() ![]() Artık eski biçim hemen hemen hiç kullanılmamaktadır, ama C standartlarına göre halen geçerliliğini korumaktadır ![]() ![]() 1 ![]() Bu biçimde fonksiyonun parametre değişkenlerinin yalnızca ismi fonksiyon parantezleri içinde yazılır ![]() ![]() ![]() ![]() double alan(x, y) int x, y; {********** return x y; } Yukarıda tanımlanan alan fonksiyonunun iki parametre değişkeni vardır ve bu parametre değişkenlerinin isimleri x ve y'dir ![]() ![]() int sample (a, b, c) int a; double b; long c; { ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } Bu örnekte ise sample fonksiyonu üç parametre almaktadır ![]() ![]() ![]() Eski biçimin dezavantajı gereksiz yere uzun oluşudur ![]() ![]() 2 ![]() Yeni biçim eski biçime göre daha kısa olmakla birlikte, yeni biçimin okunabilmesi eski biçime göre çok daha kolaydır ![]() Yeni biçimde fonksiyon parametre değişkenlerinin bildirimi fonksiyon parantezelerinin içinde yalnızca bir kez yapılmaktadır ![]() ![]() ![]() int sample (int x, int y) { ![]() ![]() ![]() ![]() ![]() ![]() } int fonk(double x, int y) { ![]() ![]() ![]() ![]() ![]() ![]() } Bu biçimde dikket edilmesi gereken önemli nokta, fonksiyon parametre değişkenleri aynı türden olsalar bile her defasında tür bilgisinin tekrar yazılması zorunluluğudur ![]() int sample (double x, y)********************************** / error* / { ![]() ![]() ![]() ![]() ![]() ![]() } bildirimi hatalıdır ![]() ![]() int sample (double x, double y) { ![]() ![]() ![]() ![]() ![]() ![]() } klavyeden karakter alan C fonskiyonları Sistemlerin hemen hemen hepsinde klavyeden karakter alan 3 ayrı C fonksiyonu bulunur ![]() ![]() int getchar(void) getchar standart bir C fonksiyonudur ![]() ![]() ![]() aşağıda yazılan programda önce klavyeden bir karakter alınmış daha sonra alınan karakter ve karakterin sayısal karşılıkları ekrana yazdırılmıştır ![]() ![]() #include &lt;stdio ![]() main() { char ch; *********** ch = getchar(); printf( Karakter olarak ch = %c ASCII numarası ch = %d , ch, ch); } getchar derleyicilerin çoğunda stdio ![]() ![]() ![]() int* getch(void) getchar fonksiyonu gibi bu fonksiyonda klavyede basılan tuşun ASCII karakter numarasıyla geri döner ![]() ![]() - basılan tuş ekranda görünmez - enter tuşuna ihtiyaç duymaz ![]() ![]() Yukarıda verilen programda getchar yerine getch yazarak programı çalıştırırsak farkı daha iyi görebiliriz ![]() tam olarak standardize edilmemiştir ![]() ![]() getch fonksiyonu özellikle tuş bekleme ya da onaylama amacıyla kullanılmaktadır: ![]() ![]() ![]() ![]() printf(devam için herhangi bir tuşa basınız ![]() ![]() ![]() ); getch(); burada basılacak tuşun programcı açısından bir önemi olmadığı için fonksiyonun geri dönüş değeri kullanılmamıştır ![]() int getche(void) getche İngilizce get char echo sözcüklerinden gelmektedir ![]() getche fonksiyonu da basılan tuşun ASCII numarasıyla geri döner ve enter tuşuna gereksinim duymaz ![]() ![]() getcharenter tuşuna ihtiyaç duyaralınan karakter ekranda görünür ![]() ![]() * ekrana karakter yazan C fonksiyonları C dilinde ekrana karakter yazamakta iki fonksiyonun kullanıldığı görülür : 1 ![]() putchar standart bir C fonksiyonudur ![]() ![]() ![]() #include &lt;stdio ![]() main() { *********** char ch; *********** ch = getchar(); putchar (ch); return 0; } Burada putchar fonksiyonunun yaptığı işi printf fonksiyonuna da yaptırabilirdik ; printf(%c, ch); putchar(ch) ile tamamne aynı işleve sahiptir ![]() putchar fonksiyonu ile ' ' karakterini yazdırdığımızda printf fonksiyonunda olduğu gibi imleç sonraki satırın başına geçer ![]() ![]() putchar fonksiyonu derleyicilerin çoğunda stdio ![]() ![]() ![]() 2 ![]() putch standart bir C fonksiyonu değildir ![]() ![]() ' karakterinin yazdırılması sırasında ortaya çıkar ![]() karakterine karşılık yalnızca LF(line feed) (ASCII 10) karakterini yazmaktadır ![]() ![]() printf fonksiyonu Değişkenlerin içerisindeki değerler aslında bellekte ikilik sistemde tutulmaktadır ![]() ![]() ![]() ![]() printf fonksiyonunun kullanımı printf aslında çok ayrıntılı özelliklere sahip bir fonksiyondur ![]() ![]() printf iki tırnak içerisindeki karakterleri ekrana yazar ![]() ![]() printf fonksiyonu % karakterlerini yanındaki karakter ile birlikte format karakteri olarak yorumlar ![]() Format karakterleri iki tırnaktan sonra yazılan parametrelerle birebir eşleştirilir ![]() Örnek : int x, y; x = 125; y = 200; printf(x = %d y = %d , x,* y); <br clear="ALL"> printf fonksiyonunun yukarıdaki şekilde çağırılmasıyla x ve y değişkeni içindeki değerler ekrana onluk sistemde yazdırılacaktır ![]() format karakterleri yerine eşlenen değişkenlerin içerisindeki değerler ekrana yazılır ![]() ![]() format karakteri Anlamı %d int türünü desimal sistemde yazar ![]() %ld long türünü desimal sistemde yazar %x unsigned int türünü hexadecimal sistemde yazar ![]() %X unsigned int türünü hexadecimal sistemde yazar ![]() %lx unsigned long türünü hexadecimal sistemde yazar ![]() %u unsigned int türünü decimal sistemde yazar ![]() %o unsigned int türünü oktal sistemde yazar ![]() %f float ve double türlerini desimal sistemde yazar ![]() %lf double türünü desimal sistemde yazar ![]() %e gerçek sayıları üstel biçimde yazar ![]() %c char veya int türünü karakter görüntüsü olarak yazdırır ![]() %s string olarak yazdırır ![]() %lf long double türünü desimal sistemde yazdırır ![]() yukarıdaki tabloda görüldüğü gibi double türü hem %f format karakteri hem de %lf format karakteri ile yazdırılabilmektedir ![]() ![]() Yukarıdaki tabloya göre unsigned int türünden bir sayıyı aşağıdaki şekillerde yazdırabiliriz : unsigned int u; printf(%u, u);************************ / u sayısını 10'luk sistemde yazar / printf(%o, u);************************* / u sayısını 8'lik sistemde yazar* / printf(%x, u);************************* / u sayısını 16'lık sistemde yazar / short bir sayıyı yazarken d o u ya da x karakterlerinden önce h karakterini kullanıyoruz : short int sh; printf(%hd, sh);******************** / 10'luk sistemde yazar / unsigned short int unsh; printf(%hu, unsh);***************** / 10'luk sistemde yazar / printf(%ho, unsh);***************** / 8'lik sistemde yazar / printf(%hx, unsh);***************** / 16'lık sistemde yazar / long bir sayıyı yazarken d o u ya da x karakterlerinden önce l karakterini kullanıyoruz : long int lo; printf(%ld, lo);********************************** / 10'luk sistemde yazar / unsigned long int unlo; printf(%lu, unlo);******************* / 10'luk sistemde yazar / printf(%lo, unlo);******************* / 8'lik sistemde yazar / printf(%lx, unlo);******************* / 16'lık sistemde yazar / yukarıdaki bilgilerde unsigned bir tamsayıyı printf fonksiyonuyla 8'lik ya da 16'lık sistemde yazdırabileceğimizi gördük ![]() sözkonusu signed tamsayı pozitif olduğu sürece bir sorun olmaz ![]() ![]() ![]() ![]() % karakterinin yanında önceden belirlenmiş bir format karakteri yoksa , % karakterinin yanındaki karakter ekrana yazılır ![]() %%* (%) karakterini yaz anlamına gelir ![]() scanf fonksiyonu scanf fonksiyonu klavyeden her türlü bilginin girişine olanak tanıyan standart bir C fonksiyonudur ![]() ![]() ![]() scanf fonksiyonunun da birinci parametresi bir stringdir ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() int x, y; scanf("%d%d", &amp;x, &amp;y); Yukarıdaki örnekte x ve y sayıları için desimal sistemde klavyeden giriş yapılmaktadır ![]() ![]() ![]() 60 biçiminde bir giriş geçerli olabileceği gibi; 5 60 biçiminde bir giriş de geçerlidir ![]() ![]() ![]() scanf fonksiyonunun yalnızca giriş için kullanılır, ekrana yazmak için printf fonksiyonunu kullanmamız gerekir : int number; printf("bir sayi giriniz : "); scanf("%d", &amp;number); |
![]() |
![]() |
|