Ö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.

  • 🧩 Fonksiyonların işlevleri nelerdir: Fonksiyonlar, yeniden kullanılabilir komutları gruplandırarak büyük bir programın daha küçük, yönetilebilir ve hata ayıklaması daha kolay alt programlara bölünmesini sağlar.
  • 📚 İki tip: printf ve scanf gibi kütüphane fonksiyonları hazır haldedir, kullanıcı tanımlı fonksiyonlar ise programcı tarafından yazılır.
  • 📝 Üç parça: Bir fonksiyonu kullanmak, onun bildirimini veya prototipini, tanımını veya gövdesini ve onu çalıştıran çağrıyı içerir.
  • 🎯 argümanlar: Değerler konuma göre ve varsayılan olarak değere göre aktarılır, bu nedenle orijinal değişken çağrılan fonksiyonun içinde değişmeden kalır.
  • 🌐 Dürbün: Yerel değişkenler yalnızca bulundukları fonksiyonun içinde yaşarken, global ve statik değişkenler değerlerini program boyunca veya fonksiyon çağrıları arasında korur.
  • 🤖 Yapay zeka yardımı: GitHub Copilot ve yapay zeka asistanları, C fonksiyonlarının iskeletini oluşturur, dönüş tipleri önerir ve eksik dönüşleri veya uyumsuz argümanları işaretler.

C Programlamada İşlevler

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.

C'de Fonksiyon Nedir?

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:

  1. Kütüphane işlevleri
  2. 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:

  1. fonksiyon bildirimi
  2. Fonksiyon tanımı
  3. 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:

Değişken Kapsam

  1. Başlangıç ​​değeri olarak 1348'i içeren bir tamsayı global değişkeni bildiririz.
  2. 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.
  3. Global değişkeni ana fonksiyonun içine yazdırıyoruz.
  4. 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:

Özyinelemeli İşlevler

  1. 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.
  2. “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:

Özyinelemeli İşlevler

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.

SSS

Değerle çağırma, argümanı fonksiyona kopyalar, böylece değişiklikler yerel kalır ve orijinal değişken dokunulmaz. Referansla çağırma ise değişken adresini bir işaretçi aracılığıyla geçirir ve fonksiyonun çağıranın orijinal verilerini doğrudan değiştirmesine olanak tanır.

Gerçek parametre, çağıranın bir fonksiyon çağrısı sırasında ilettiği gerçek değer veya değişkendir. Biçimsel parametre ise, onu alan fonksiyon tanımında belirtilen yer tutucudur. Bunlar konumlarına göre eşleştirilir; birinci parametre birinci parametreyle, ikinci parametre ikinci parametreyle eşleştirilir.

AC fonksiyonu doğrudan yalnızca tek bir değer döndürür. Birden fazla sonuç döndürmek için, bunları bir yapıya sarın, bir dizi doldurun veya işaretçileri argüman olarak geçirin, böylece fonksiyon her sonucu çağıranın kendi değişkenlerine yazar.

Fonksiyonlar, bir kod bloğunun birçok kez çalışmasını sağlayan yeniden kullanılabilirlik ve büyük bir programı daha küçük parçalara bölen modülerlik sağlar. Ayrıca okunabilirliği artırır, test ve hata ayıklamayı basitleştirir ve karmaşık ayrıntıları tek bir isim altında gizleyerek geliştirme süresinden tasarruf sağlar.

main() fonksiyonu, her C programının yürütülmeye başladığı giriş noktasıdır. İşletim sistemi önce bu fonksiyonu çağırır ve genellikle 0 olan dönüş değeri başarıyı işaret eder. Komut satırı argümanlarını almak için argc ve argv parametrelerini alabilir.

Özyineleme, ağaç geçişi veya faktöriyel gibi doğal olarak tekrarlayan bir yapıya sahip problemler için uygundur ve daha kısa, daha anlaşılır kod sağlar. Yineleme genellikle daha hızlı çalışır ve tekrarlanan çağrıları önlediği için daha az bellek kullanır. Açıklık için özyinelemeyi, büyük girdilerde performans için yinelemeyi tercih edin.

Evet. Yapay zekâ destekli bir kodlama asistanı, düz metin komut isteminden C fonksiyonu yazabilir, parametreler ve dönüş tipleri önerebilir ve eksik dönüş değeri veya uyumsuz argüman gibi hataları işaretleyebilir. Oluşturulan fonksiyona güvenmeden önce her zaman derleyin ve test edin.

GitHub Yardımcı Pilotu C fonksiyonları yazar, fonksiyon adından veya kısa bir yorumdan yola çıkarak gövdeyi tamamlar ve bildirimler, döngüler ve özyinelemeli çağrılar önerir. Genellikle main() fonksiyonunun üstüne uygun bir prototip ekler, ancak yine de mantığı gözden geçirmeniz gerekir.

Bu yazıyı şu şekilde özetleyin: