Fonksiyonlar
FONKSİYONLAR
Fonksiyonlar, programcının programını modüler hale getirmesini sağlar. Bir fonksiyon içinde bildirilmiş tüm değişkenler, yerel değişkenlerdir ve sadece bildirildikleri fonksiyon içinde bilinirler. Çoğu fonksiyon, parametre listelerine sahiptir. Bu parametreler, fonksiyonların birbirleri arasındaki haberleşmelerini sağlar. Bir fonksiyonun parametreleri de yerel değişkenlerdir.
Yazılım Mühendisliği Gözlemleri 5.2
Birden fazla fonksiyon kullanılan programlarda, main fonksiyonu programın esas görevini yerine getiren fonksiyonların çağırıcısı olarak kullanılmalıdır.
Bir programı fonksiyonlar ile yazmanın bir çok nedeni vardır. Böl ve zaptet ( divide and conquer) yaklaşımı, program geliştirmeyi kolaylaştırır. Başka bir sebep ise yazılımın yeniden kullanılmasıdır. Bu sayede, önceden yazılmış fonksiyonlar bloklar halinde birbirleri ardına yerleştirilerek yeni programlar yazılabilir. Yazılımın yeniden kullanılabilmesi, nesneye yönelik programlamanın temel etmenlerindendir. Fonksiyona iyi isim verilir ve fonksiyon iyi tanımlanırsa, programlar belirli işleri yapan standartlaştırılmış fonksiyonları kullanarak yazılabilir. Bu teknik, özetleme ( abstraction ) olarak bilinir. Özetleme tekniğini, printf, scanf ve pow gibi standart kütüphane fonksiyonlarını kullanarak yazdığımız programlarda uygulamıştık. Üçüncü sebep ise programda kodları tekrar etmekten kurtulmaktır. Kodları fonksiyon haline getirerek paketlemek, kodların program içinde birçok noktada yalnızca fonksiyonu çağırarak kullanılmasını sağlatır.
Yazılım Mühendisliği Gözlemleri 5.3
Her fonksiyon, iyi olarak tanımlanmış tek bir işi yapacak şekilde sınırlandırılmalıdır ve fonksiyon ismi fonksiyonun görevini etkili bir biçimde açıklamalıdır. Bu, özetlemeyi ve yazılımın yeniden kullanılabilirliğini sağlatır.
Yazılım Mühendisliği Gözlemleri 5.4
Eğer fonksiyonun görevini açıklayacak etkili bir isim bulamıyorsanız, muhtemelen yazdığınız fonksiyon birden fazla görevi yerine getirmeye çalışmaktadır. Bu tarzda fonksiyonları daha küçük fonksiyonlara bölmek en iyi yoldur.
FONKSİYON TANIMLARI
Şu ana kadar yazdığımız tüm programlar, standart kütüphane fonksiyonlarını işlerini yaptırmak için çağıran main adında bir fonksiyon içeriyordu. Şimdi ise programcıların kendi fonksiyonlarını nasıl yazdıklarını inceleyeceğiz.
Birden ona kadar olan tam sayıların karesini alan kare fonksiyonunu kullanan bir program inceleyelim. ( Şekil 5.3 )
İyi Programlama Alıştırmaları 5.3
Programın okunurluğunu arttırmak ve fonksiyonları ayırmak için fonksiyon tanımlarından önce bir satır boşluk bırakmak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* Şekil 5.3:fig05_03.c Programcı tarafından tanımlanmış kare fonksiyonu */ #include <stdio.h> int kare( int ); /* fonksiyonun ilk hali(prototipi) */ int main( ) { int x; for ( x = 1; x <= 10; x++ ) printf( "%d ", kare( x ) ); printf( "\n" ); return 0; } /*Fonksiyon tanımı*/ int kare( int y ) { return y * y; } |
1 4 9 16 25 36 49 64 81 100
Şekil 5.3 Programcı tarafından tanımlanmış fonksiyon kullanmak.
kare fonksiyonu, main altındaki printf ifadesi ( 12.satır ) içinden çağrılmıştır.
1 |
printf ( " %d " , kare ( x ) );
|
kare fonksiyonu, x değerinin kopyasını y parametresi sayesinde alır. Daha sonra y * y hesabını yapar. Sonuç, main içindeki printf fonksiyonuna döndürülür ve printf sonucu yazdırır. Bu süreç, for döngü yapısı sayesinde 10 kez tekrarlanır.
kare fonksiyonunun tanımı, kare 'in bir y tamsayı parametresi beklediğini gösterir. Fonksiyon isminden önceki int anahtar kelimesi, bize kare' in sonucunun yine bir tamsayı olarak döndürüleceğini gösterir. kare içindeki return ifadesi, hesaplamanın sonucunu çağırıcı fonksiyona döndürür.
5. satırdaki
1 |
int kare ( int );
|
fonksiyon prototipidir. Parantezin içindeki int , derleyiciye kare fonksiyonunun çağırıcı fonksiyondan bir tamsayı almayı beklediğini bildirir. Fonksiyon isminin solundaki int ise derleyiciye, kare fonksiyonunun kendini çağıran fonksiyona bir tamsayı sonucu döndüreceğini bildirir. Derleyici, kare fonksiyonu çağrıldığında fonksiyonun ilk hali (prototipi) ile karşılaştırma yaparak, çağrının doğru tipte geri dönüş değerine sahip oluşunu, doğru sayıda argüman ve doğru argüman tipleri kullanmasını ve argümanların doğru sırada oluşlarını kontrol eder. Fonksiyonların ilk halleri(prototipleri), kısım 5.6'da detaylı olarak anlatılacaktır.
Bir fonksiyon tanımının biçimi şu şekildedir:
geri dönüş tipi fonksiyonun ismi ( parametre listesi )
{
bildirimler
ifadeler
}
Fonksiyon ismi, geçerli herhangi bir tanıtıcı olabilir. Geri dönüş tipi, çağırıcı fonksiyona döndürülen sonucun veri tipini gösterir. void tipinde geri dönüş değeri, fonksiyonun herhangi bir değer geri döndürmeyeceğini gösterir. Belirlenmemiş geri dönüş tipi, derleyici tarafından her zaman int tipinde algılanır.
Genel Programlama Hataları 5.2
Fonksiyon tanımlamalarında geri dönüş değerini unutmak eğer fonksiyonun ilk hali(prototipi) int tipinden başka bir geri dönüş tipi ile belirtilmişse yazım hatası oluşturur.
Genel Programlama Hataları 5.3
Bir değer ile dönmesi beklenen bir fonksiyonun, geri dönüş değerinin belirtilmemesi beklenmeyen hatalara yol açabilir. ANSI standardı, bu ihmalin sonuçlarını belirlememiştir.
Genel Programlama Hataları 5.4
Geri dönüş tipi void olarak bildirilmiş bir fonksiyonun, bir değer geri döndürmesi bir yazım hatasıdır.
İyi Programlama Alıştırmaları 5.4
Geri dönüş tipi ihmal edildiğinde, derleyici geri dönüş tipini int olarak belirlese de her zaman geri dönüş tipini belirleyiniz. Ancak , main fonksiyonunun geri dönüş tipi normal olarak ihmal edilebilir.
Parametre listesi, fonksiyon çağrıldığında fonksiyonun alacağı parametrelerin bildirimlerini içeren, virgüllerle ayrılmış bir listedir. Eğer bir fonksiyon herhangi bir değer almıyorsa parametre listesi void olur. Her parametre için ( eğer tipi int değilse) parametre tipi ayrı ayrı belirtilmelidir. Eğer tip listelenmezse int olarak algılanacaktır.
Genel programlama hataları 5.5
Aynı tipte fonksiyon parametrelerini, double x, double y yerine double x , y olarak bildirmek.
double x, y biçiminde parametre bildirmek y parametresinin tipinin int olmasına sebep olur. Çünkü belirtilmeyen parametre tipi otomatik olarak int tipinde varsayılır.
Genel programlama hataları 5.6
Parametre listesini yazdığımız parantezlerin dışına noktalı virgül koymak yazım hatasıdır.
Genel programlama hataları 5.7
Bir fonksiyon parametresini, daha sonradan fonksiyon içinde yerel bir değişken olarak kullanmak bir yazım hatasıdır.
İyi Programlama Alıştırmaları 5.5
Parametre listesindeki tüm parametrelerin tipini , belirtilmeyenler otomatik olarak int tipinde kullanılacak olsa da mutlaka belirtiniz.
İyi Programlama Alıştırmaları 5.6
Yanlış olmasa da fonksiyona aktarılan argümanlarla bu argümanların yerine kullanılacak parametrelerin aynı isimde olmamasına özen gösteriniz. Bu, belirsizlikten kurtulmamızı sağlar.
Parantezlerin içinde yer alan bildirimler ve ifadeler, fonksiyonun gövdesini oluşturur. Fonksiyon gövdesi aynı zamanda blok olarak da adlandırılır. Bir blok en basit anlamda, bildirimler içerebilen birleşik bir ifadedir. Değişkenler herhangi bir blok içinde bildirilebilir ve bloklar yuvalanabilirler. Bir fonksiyonun tanımı hiçbir koşul altında başka bir fonksiyonun içinde yapılamaz.
Genel Programlama Hataları 5.8
Bir fonksiyon içinde başka bir fonksiyon tanımlamak yazım hatasıdır.
İyi Programlama Alıştırmaları 5.7
Anlamlı fonksiyon isimleri ve anlamlı parametre isimleri kullanmak programları daha okunur yapar ve yorumların çok fazla kullanılmasını engeller.
Yazılım Mühendisliği Gözlemleri 5.5
Bir fonksiyon genellikle bir sayfadan daha uzun olmamalıdır. Hatta en iyisi yarım sayfadan uzun olmamalıdır. Küçük fonksiyonlar, yazılımın yeniden kullanılabilmesini sağlatır.
Yazılım Mühendisliği Gözlemleri 5.6
Programlar, küçük fonksiyonların bir araya getirilmesiyle yazılmalıdır.Bu, programların daha kolay yazılması,değiştirilmesi ve hatalarının giderilmesini sağlar.
Yazılım Mühendisliği Gözlemleri 5.7
Çok fazla sayıda parametreye ihtiyaç duyan fonksiyonlar, birden fazla görevi yerine getiriyor olabilir. Böyle fonksiyonları, ayrı görevleri gerçekleştiren daha küçük fonksiyonlara bölmek gerekir. Fonksiyonun başlığı mümkünse bir satıra sığmalıdır.
Yazılım Mühendisliği Gözlemleri 5.8
Fonksiyonun ilk hali(prototipi) , fonksiyonun başlığı ve fonksiyon çağrısı , argüman ve parametre sayısı, tipi ve sırasıyla, geri dönüş değerinin tipi bakımından uyumlu olmalıdır.
Bir fonksiyonun çağrıldığı yere geri dönmesini kontrol etmek için 3 yol vardır :
1-) Eğer bir fonksiyon bir sonuç ile geri dönmeyecekse, kontrol fonksiyonun en son parantezine ulaşıldığında ya da
2-) return;
ifadesinin çalıştırılmasıyla döndürülür.
3-) Eğer fonksiyon bir sonuç ile geri dönecekse
return deyim;
ifadesi, deyimin değerini çağırıcıya döndürür.
İkinci örneğimiz, programcı tarafından tanımlanmış maksimum adlı fonksiyonu kullanarak 3 tamsayının en büyüğünü bulmakta ve geri döndürmektedir. Üç tamsayıda scanf ile alınsın. Daha sonra tamsayılar, maksimum adını verdiğimiz fonksiyona geçirilsin. En büyük sayı, maksimum fonksiyonun return ifadesi ile main fonksiyonuna geri döndürülsün. Geri döndürülen değer printf ile yazdırılsın.
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 30 |
/*Şekil 5.4:fig05_04.c Üç tamsayının en büyüğünü bulmak*/ #include <stdio.h> int maksimum( int, int, int ); /*fonksiyon prototipi*/ int main( ) { int a, b, c; printf( "3 tamsayı giriniz: " ); scanf( "%d%d%d", &a, &b, &c ); printf( "Maksimum : %d dir.\n", maksimum( a, b, c ) ); return 0; } /*maksimum fonksiyonunun tanımı*/ int maksimum( int x, int y, int z ) { int maks = x; if ( y > maks ) maks = y; if ( z > maks ) maks = z; return maks; } |
3 tamsayı giriniz: 22 85 17Maksimum : 85 dir.
3 tamsayı giriniz: 85 22 17
Maksimum : 85 dir.3 tamsayı giriniz: 22 17 85
Maksimum : 85 dir.Şekil 5.4 Programcı tarafından tanımlanmış maksimum fonksiyonu.
Bilinmesi Gerekli
Arduino

Arduino ile bilgisayar programlarınızı gerçek dünyaya taşıyabilirsiniz.
İlk Transistör

Bell laboratuvarlarında icat edilen ilk transistör







