Standart C Programlama Dili


BÖLÜM 4: FONKSİYONLAR VE PROGRAM YAPISI

Bir program bir görevi yerine getirmek için yazılır. Eğer yapılacak iş pek kolay değilse, program oldukça uzun olabilir. Bazı programlar onbinlerce satır uzunluğunda olabilir. Böyle durumlarda, esas görevi daha küçük ve kolay idare edilebilir altgörevlere ayırmadan yerine getirmek hemen hemen olanaksızdır.

C, böyle altgörevleri ifade etmek ve birbirinden ayırmak için bir yöntem öngörmektedir. Bu yöntem sayesinde “bilgi saklama” ilkeleri kullanılabilir. C sadece bir tek altprogram çeşidi sağlamaktadır, bu da fonksiyondur. Matematiksel olarak; bir fonksiyon, argümanlarını döndürdüğü değere ilişkilendiren bir “kara kutu” gibidir. Aynı şey C için de geçerlidir, ancak bir fonksiyon birden fazla değer döndürecek, küresel veri yapılarında yan etkiler yapacak veya girdi/çıktı sağlayacak bir şekilde de tasarımlanabilir. Örneğin, printf fonksiyonu, argümanlarının değerlerinin çıktısını yapmak için kullanılır. Geri döndürdüğü değer, yazılan karakterlerin sayısıdır, ancak bu fazla ilgi çekici değildir.

Çok “basit” bir fonksiyon tanımı aşağıda verilmiştir:

void f (void)
{ }

Bu fonksiyon hiçbir şey yapmamasına rağmen, program geliştirmesi esnasında yer tutucu olarak kullanılabilir. Bu bölümde fonksiyon tanımı ve kullanımı hakkında daha fazla şeyler öğreneceğiz.

Kitabın başından beri görmekte olduğumuz main tanıtıcı sözcüğü, programın yerine getirmesi gereken görevi ifade eden fonksiyonun ismidir. Her makul C programı içinde main adı verilen bir fonksiyonun bulunması gerekir, çünkü program yürütülmeye başlandığında, program içinde bağlanmış bulunan bir başlangıç yordamı çalışmaya başlar, bu da kontrolü sonuçta main fonksiyonuna geçirir. Eğer bağlama esnasında, bağlayıcı (linker) main adı verilen bir fonksiyon bulamazsa, sizin için yürütülebilir bir kod oluşturamayacaktır. main’in bir anahtar sözcük olmadığına dikkat edin, yani isterseniz, main adında bir değişken de tanımlayabilirsiniz.

Fonksiyonların gücü, bizim tekrarlanan kod yazmamızdan kaçınmamızı sağlamalarında yatar. Herhangi bir kodu, bir fonksiyon şeklinde, bir defa belirtiriz, ona bir isim veririz ve daha sonra, bu kodu çalıştırma gereksinimi duyduğumuzda, bu fonksiyonu “çağırırız”. Bu iyi, fakat yeterli değildir. Birçok durumda bu kod o anki gereksinmelerimize “uyarlanmalıdır”. Örneğin, bir diziyi sıraya sokan bir kodumuz varsa, bu kodu her çağırdığımızda, değişik sayıda elemandan oluşan değişik bir dizi belirtecek şekilde bunu hazırlamamız daha iyi olur. Bu ise, fonksiyon argümanları kullanılarak yapılabilir.

Her fonksiyon diğerlerinden bağımsız olduğuna, yani bir fonksiyon içinde tanımlanmış değişkenler başka bir fonksiyonda kullanılamadığına göre, fonksiyonların birbirleriyle haberleşmelerini sağlayacak yöntemler geliştirilmiştir. Bir yöntem fonksiyonlara argüman geçirmektir. Başka bir yöntem küresel değişkenler kullanmaktır.

Şimdiye kadar olan örneklerde gördüğümüz bütün değişkenler fonksiyonlar (main fonksiyonu) içinde tanımlanmışlardı. Bu bölümde göreceğimiz gibi; değişken bildirimleri veya tanımlamalarını fonksiyonlar dışında yapmamız da olasıdır. Böyle değişkenlere küresel adını veririz, çünkü fonksiyon içinde tanımlanan yerel değişkenlerin aksine, bunlar, tanımlamadan sonra gelen program metni içindeki bütün fonksiyonlar tarafından kullanılabilirler.