Örneklerle C Programlamadaki İşlevler: Özyinelemeli ve Satır İçi
⚡ Akıllı Özet
C programlama dilinde fonksiyonlar, büyük bir programı daha küçük alt programlara bölen, böylece anlaşılmasını, test edilmesini ve değiştirilmesini kolaylaştıran, yeniden kullanılabilir kod bloklarıdır. Her fonksiyonun bir bildirimi, bir tanımı ve bir çağrı kısmı vardır.

C'de Fonksiyon Nedir?
C programlamada işlev Fonksiyonlar, bir programın anlaşılmasını, test edilmesini kolaylaştıran ve çağıran programı değiştirmeden kolayca değiştirilebilen, yeniden kullanılabilir bir kod bloğudur. Fonksiyonlar, kodu bölerek ve programı modülerleştirerek daha iyi ve etkili sonuçlar elde edilmesini sağlar. Kısacası, daha büyük bir program, fonksiyon adı verilen çeşitli alt programlara bölünür.
Büyük bir programı çeşitli işlevlere böldüğünüzde, her işlevi ayrı ayrı yönetmek kolaylaşır. Programda bir hata oluştuğunda, hatalı fonksiyonları kolayca araştırabilir ve yalnızca bu hataları düzeltebilirsiniz. Gerektiğinde işlevleri kolayca arayabilir ve kullanabilirsiniz, bu da otomatik olarak zamandan ve yerden tasarruf sağlar.
Kütüphane Vs. Kullanıcı Tanımlı Fonksiyonlar
Her 'C' programında ana işlev olan en az bir işlev bulunur, ancak bir programın herhangi bir sayıda işlevi olabilir. C'deki main () işlevi bir programın başlangıç noktasıdır.
'C' programlamada işlevler iki türe ayrılır:
- Kütüphane işlevleri
- Kullanıcı tanımlı işlevler
C'de kütüphane ve kullanıcı tanımlı fonksiyonlar arasındaki fark, kütüphane fonksiyonu için kod yazmamıza gerek olmamasıdır. Her zaman programın başına eklediğimiz başlık dosyasının içinde zaten mevcuttur. Bir işlevin adını yazmanız ve onu uygun sözdizimi ile birlikte kullanmanız yeterlidir. Printf, scanf bir kütüphane fonksiyonunun örnekleridir.
Oysa kullanıcı tanımlı bir işlev, bir işlevin gövdesini yazmamız ve işlevin programımızda bir işlem gerçekleştirmesini istediğimizde işlevi çağırmamız gereken bir işlev türüdür.
C'de kullanıcı tanımlı bir fonksiyon her zaman kullanıcı tarafından yazılır, ancak daha sonra 'C' kütüphanesinin bir parçası olabilir. Bu 'C' programlamanın önemli bir avantajıdır.
C programlama fonksiyonları üç etkinliğe ayrılır:
- fonksiyon bildirimi
- Fonksiyon tanımı
- işlev çağrısı
İşlev Beyanı
Fonksiyon bildirimi, bir programın adını yazmak anlamına gelir. Kodda fonksiyonları kullanmak için zorunlu bir parçadır. Bir fonksiyon bildiriminde, tıpkı bir değişken bildirimi gibi, programımızda kullanacağımız fonksiyonun adını belirtiriz. Bir fonksiyon, programda bildirilmediği sürece kullanılamaz. Fonksiyon bildirimi aynı zamanda "Fonksiyon prototipi" olarak da adlandırılır.
İşlev bildirimleri (prototip olarak adlandırılır) genellikle ana () işlevin üzerinde yapılır ve genel biçimi alır:
return_data_type function_name (data_type arguments);
- `return_data_type`, çağıran ifadeye geri döndürülen değer fonksiyonunun veri türüdür.
- Fonksiyon adı: ifadesinin ardından parantezler gelir.
- Argüman adları ve veri türü bildirimleri isteğe bağlı olarak parantez içine yerleştirilebilir.
Bir tamsayı değişkeninin küp değerini hesaplamak için bir küp fonksiyonunun nasıl bildirileceğini gösteren aşağıdaki programı ele alalım
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
Bir fonksiyonun mutlaka bir değer döndürmesi gerekmediğini unutmayın. Bu durumda void anahtar sözcüğü kullanılır.
Örneğin, çıktı_mesajı işlev bildirimi, işlevin bir değer döndürmediğini belirtir: void çıktı_mesaj();
Fonksiyon Tanımı
İşlev tanımı, bir işlevin yalnızca gövdesini yazmak anlamına gelir. Bir işlevin gövdesi, belirli bir görevi gerçekleştirecek ifadelerden oluşur. Bir fonksiyon gövdesi tek veya bir ifade bloğundan oluşur. Aynı zamanda bir fonksiyonun zorunlu bir parçasıdır.
int add(int a,int b) //function body { int c; c=a+b; return c; }
işlev çağrısı
İşlev çağrısı, bir programda ihtiyaç duyulduğunda bir işlevin çağrılması anlamına gelir. Bir işlevi çağırdığımızda, tasarlandığı işlemi gerçekleştirir. İşlev çağrısı, bir programın isteğe bağlı bir parçasıdır.
result = add(4,5);
İşte kodun tamamı:
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { int c; c=a+b; return c; }
Çıktı:
Addition:30
İşlev Argümanları
Bir fonksiyonun argümanları, fonksiyon çağrısıyla gerekli değerleri almak için kullanılır. Pozisyona göre eşleştirilirler; ilk argüman birinci parametreye, ikincisi ikinci parametreye vb. iletilir.
Varsayılan olarak, argümanlar değer olarak iletilir; bu durumda verinin bir kopyası çağrılan fonksiyona verilir. Gerçekte iletilen değişken değişmez.
Değerle geçirilen parametreleri gösteren aşağıdaki programı ele alalım:
int add (int x, int y); int main() { int a, b, result; a = 5; b = 10; result = add(a, b); printf("%d + %d\ = %d\n", a, b, result); return 0;} int add (int x, int y) { x += y; return(x);}
Programın çıktısı:
5 + 10 = 15
x parametresine yalnızca a ve b'nin değeri aktarıldığından, add işlevine iletilen a ve b değerlerinin değişmediğini unutmayın.
Değişken Kapsam
Değişken kapsamı, program kodundaki değişkenlerin görünürlüğü anlamına gelir.
C dilinde, bir fonksiyon içinde tanımlanan değişkenler o kod bloğuna özgüdür ve fonksiyonun dışında erişilemez. Ancak, tüm fonksiyonların dışında tanımlanan değişkenler globaldir ve programın tamamından erişilebilir. Programın başında `#define` ile tanımlanan sabitlere de programın tamamından erişilebilir. Aşağıdaki program, hem main fonksiyonundan hem de kullanıcı tanımlı fonksiyondan global değişkenin değerini yazdırır:
#include <stdio.h> int global = 1348; void test(); int main() { printf("from the main function : global =%d \n", global); test () ; return 0;} void test (){ printf("from user defined function : global =%d \n", global);}
Sonuç:
from the main function : global =1348 from user defined function : global =1348
Programın detaylarını görüşüyoruz:
- Başlangıç değeri olarak 1348'i içeren bir tamsayı global değişkeni bildiririz.
- Ne argüman alan ne de değer döndüren bir test() fonksiyonu bildirir ve tanımlarız. Bu işlev, genel değişkenlere programın herhangi bir yerinden erişilebileceğini göstermek için yalnızca genel değişken değerini yazdırır.
- Global değişkeni ana fonksiyonun içine yazdırıyoruz.
- Global değişken değerini yazdırmak için test fonksiyonunu çağırıyoruz.
C'de, fonksiyon parametrelerine argümanlar iletildiğinde, parametreler, fonksiyondan çıkarken yok edilecek olan yerel değişkenler gibi davranır.
Ne zaman kullanmak küresel değişkenler, bunları dikkatli kullanın çünkü hatalara yol açabilirler ve programın herhangi bir yerinde değişiklik yapabilirler. Kullanmadan önce başlatılmaları gerekir.
Statik Değişkenler
Statik değişkenlerin yerel kapsamı vardır. Ancak fonksiyondan çıkıldığında yok edilmezler. Bu nedenle, statik bir değişken değerini sonsuza kadar korur ve fonksiyona yeniden girildiğinde erişilebilir. Statik bir değişken bildirildiğinde başlatılır ve static önekine ihtiyaç duyar.
Aşağıdaki program statik bir değişken kullanır:
#include <stdio.h> void say_hi(); int main() { int i; for (i = 0; i < 5; i++) { say_hi();} return 0;} void say_hi() { static int calls_number = 1; printf("Hi number %d\n", calls_number); calls_number ++; }
Program şunları görüntüler:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
Özyinelemeli İşlevler
Bir sayının faktöriyelini şu şekilde hesaplayalım: 6! = 6 * 5 * 4 * 3 * 2 * 1.
Bu hesaplama, gerçek 1'e eşit olana kadar gerçek * (gerçek -1) tekrar tekrar hesaplanarak yapılır.
Özyinelemeli fonksiyon, kendini çağıran ve özyinelemeli çağrıları bitirmek için bir çıkış koşulu içeren bir işlevdir. Faktöriyel sayı hesaplaması durumunda, çıkış koşulu 1'e eşittir. Özyineleme, çağrıları çıkış koşulu doğru olana kadar "yığarak" çalışır.
Örneğin:
#include <stdio.h> int factorial(int number); int main() { int x = 6; printf("The factorial of %d is %d\n", x, factorial(x)); return 0;} int factorial(int number) { if (number == 1) return (1); /* exiting condition */ else return (number * factorial(number - 1)); }
Program şunları görüntüler:
The factorial of 6 is 720
Programın detaylarını burada tartışıyoruz:
- Bir tamsayı parametresi alan ve bu parametrenin faktöriyelini döndüren özyinelemeli faktöriyel fonksiyonumuzu ilan ediyoruz. Bu fonksiyon kendisini çağıracak ve çıkışa veya temel koşula ulaşılana kadar sayıyı azaltacaktır. Koşul doğru olduğunda, önceden oluşturulan değerler birbiriyle çarpılır ve son faktöriyel değer döndürülür.
- “6” değerine sahip bir tamsayı değişkeni tanımlayıp başlatıyoruz ve ardından faktöriyel fonksiyonumuzu çağırarak onun faktöriyel değerini yazdırıyoruz.
Aşağıdaki şemayı inceleyerek, temel duruma veya durma noktasına ulaşana kadar fonksiyonun kendisini çağırmasından oluşan özyinelemeli mekanizmayı daha iyi anlayabilirsiniz.ping Koşul sağlandıktan sonra, önceki değerleri toplarız:
Satır İçi İşlevler
C programlamadaki fonksiyon en sık kullanılan talimatları saklamak için kullanılır. Programı modülerleştirmek için kullanılır.
Bir fonksiyon çağrıldığında talimat işaretçisi fonksiyon tanımına atlar. Bir işlevi çalıştırdıktan sonra, talimat işaretçisi, işlev tanımına atladığı ifadeye geri döner.
İşlevleri her kullandığımızda ekstra bir şeye ihtiyaç duyarız işaretçi Fonksiyon tanımına atlamak ve ifadeye geri dönmek için head tuşuna basın. Bu tür işaretçi kafalarına olan ihtiyacı ortadan kaldırmak için satır içi işlevleri kullanıyoruz.
Satır içi bir işlevde, bir işlev çağrısı doğrudan gerçek bir program koduyla değiştirilir. Tüm işlemler inline fonksiyonu içerisinde gerçekleştirildiği için herhangi bir bloğa atlama yapmaz.
Satır içi işlevler çoğunlukla küçük hesaplamalar için kullanılır. Büyük bilgi işlem söz konusu olduğunda uygun değildirler.
Satır içi bir fonksiyon, inline anahtar sözcüğünün fonksiyon adından önce yerleştirilmesi dışında normal fonksiyona benzer. Satır içi fonksiyonlar aşağıdaki sözdizimiyle oluşturulur:
inline function_name ()
{
//function definition
}
Satır içi fonksiyonu uygulayacak bir program yazalım.
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
Çıktı:
Addition: 30
Yukarıdaki program, iki sayının eklenmesi için satır içi fonksiyonun kullanımını göstermektedir. Görüldüğü gibi satır içi fonksiyon içerisinde sadece fazladan satır yazmadan iki sayının toplamasını geri döndürdük. İşlev çağrısı sırasında, toplama işlemi yapmamız gereken değerleri henüz aktardık.




