Temel C Programlama -24- Basit Fonksiyonlar

Önceki başlıkta fonksiyona giriş yapmıştık ve fonksiyon mantığını sizlere anlatmıştık. Bu başlıkta ise basit fonksiyonları ve bunların kullanımını sizlere anlatacağız. Biz önceki yazıda hazır fonksiyonların C kütüphanelerinde yer aldığından bahsetmiştik. Aslında bu fonksiyonları kullanmada hiç bir sıkıntımız yok çünkü ilk programdan itibaren printf ve scanf gibi fonksiyonları kullanmaktayız. Bu fonksiyonların tamamını öğrenmek için kütüphanenin başlık dosyasına ve referans kılavuzuna bakabiliriz. C standart kütüphanesini ilerleyen konularda anlatacak olsak da konumuzda yapacağımız örnek fonksiyonları cmath.h kütüphanesindeki fonksiyonlarla karşılaştıracağız. Şimdi en basit bir işlemi kısa yoldan yapmak için önceden yazdığımız programa göz atalım.

else if yapısını anlattığımızdan beri bir rol yapma oyununun taslağı üzerinde çalışıyorduk. Burada giriş yazısını yazdırırken printf fonksiyonunu aynı iş için iki kere kullanmıştık. O kısmı size gösterelim.

for (int i=0; i < 50; i++ )
printf("*");
printf("\n");

printf("ROL YAPMA OYUNUNA HOS GELDINIZ \n");
printf("WASD TUSLARI ILE HARITADA ILERLEYINIZ \n");

for (int i=0; i < 50; i++ )
printf("*");
printf("\n");

Burada gördüğünüz gibi aynı kod blokunu iki kere kullanıyoruz. Bunu defalarca kullanmak istesek kopyala yapıştır ile programın dört bir yanına yapıştırmamız gerekecekti. Bunu kısaltma ve modül haline getirmek için şimdi fonksiyonları kullanacağız. Bizim yapacağımız belli bir görev vardı. O görev de ekrana belli bir sayıda yıldız (*) yazdırarak çizgi haline getirmekti. Biz bunu her yapmak istediğimizde ise yukarıdaki for döngüsünü kullanmak zorundaydık. Şimdi fonksiyon için gereken komutları bir arada toplayalım.

for (int i=0; i < 50; i++ )
printf("*");
printf("\n");

Bundan başka bir komut yazmak gerekli değil, değil mi? O halde bu komutu bir kenarda bekletiyoruz ve şimdi programa yeni bir fonksiyon prototipi yazıyoruz.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//Fonksiyon prototipleri
void cizgi_yaz (void);
/////////////////////
int main() {

Programın baş tarafına void cizgi_yaz (void); şeklinde fonksiyon prototipini yazdık. Fonksiyon prototipi aynı int x, float y gibi değişken tanımladığımız gibi fonksiyon tanımlamamızı sağlayan bir yapıdır. Biz burada daha fonksiyonun kendisini yazmadık. Derleyiciye böyle bir fonksiyon olduğunun haberini verdik. C++ dilinde fonksiyon prototiplerini yazmadan doğrudan fonksiyon blokunu yazarak da kullanabilsek de C dilinde derleyicinin böyle bir fonksiyonu tanımladığımızdan haberi olması için fonksiyon prototiplerini yazıyoruz. Şimdi programın en alt kısmındaki boşluğa gelelim ve fonksiyonumuzu yazalım.

void cizgi_yaz (void)
{
	for (int i=0; i < 50; i++ )
	printf("*");
	printf("\n");
}

Burada çizgi yazdırmak için gerekli kodları fonksiyonun içerisine yazdırarak bu kod blokunu bir modül haline getirdik. Artık printf demek gibi cizgi_yaz() dediğimizde ekrana çizgi yazacaktır. O halde şimdi ana programdaki döngüleri silip yerine cizgi_yaz() fonksiyonunu çağırıyoruz. Burada void’in boş değer olduğunu hatırlatalım.

int main() {

// KARŞILAMA YAZISI
cizgi_yaz();
printf("ROL YAPMA OYUNUNA HOS GELDINIZ \n");
printf("WASD TUSLARI ILE HARITADA ILERLEYINIZ \n");
cizgi_yaz();
// KARŞILAMA YAZISI BITIS

Burada artık kod kalabalığının kalktığını ve ne iş yaptığımızı rahatça görebiliyoruz. Oraya printf fonksiyonları ile beraber for döngüsünü koymak mı daha anlaşılırdı yoksa bir cizgi_yaz() adında fonksiyon koymak mı ? Artık kodu okuduğumuzda o fonksiyonun çizgi yazdırma işini yaptığını anlayabiliriz. Fonksiyonlara ad verirken yaptığı işlerin adını vermemiz bu noktada önemlidir. Programın çıktısına baktığımızda önceki ile arasında bir fark olmadığını göreceğiz.

İncelemeniz için kodun tamamını da verelim. İsterseniz çeşitli görevleri fonksiyonlara bölerek çalışma yapabilirsiniz.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//Fonksiyon prototipleri
void cizgi_yaz (void);
/////////////////////
int main() {

// KARŞILAMA YAZISI
cizgi_yaz();
printf("ROL YAPMA OYUNUNA HOS GELDINIZ \n");
printf("WASD TUSLARI ILE HARITADA ILERLEYINIZ \n");
cizgi_yaz();
// KARŞILAMA YAZISI BITIS
int x = 0, y = 0; // kordinatlar
while (1)
{
char yon;
yon = getche();
switch(yon)
{
case 'w':
	y++;
	break;
case 's':
	y--;
	break;
case 'a':
	x--;
	break;
case 'd':
	x++;
	break;
default:
printf("\n Lutfen Dogru Tusa Basiniz \n");
break;
}
printf(" X : %i   Y : %i  \n", x, y);
if( (x==15) && (y==2))
{
printf("\n Tebrikler!! \n Hazineyi Buldunuz!");
printf("\n GAME OVER!");
break;
}
if( (x==12) && (y==3))
{
printf("\n Tebrikler!! \n Ejderhayi Buldunuz Gecmis Olsun :))!");
printf("\n GAME OVER!");
break;
}

if ((y>50) || (x>50) || (y<-50) || (x<-50) )
	printf("\n Harita Sinirlarini Astiniz!");
} // sonsuz döngü sonu


system("PAUSE");
 } // Main Sonu

void cizgi_yaz (void)
{
	for (int i=0; i < 50; i++ )
	printf("*");
	printf("\n");
}

Şimdi cizgi_yaz() fonksiyonu üzerinden bir fonksiyonu nasıl tanımladığımızı size açıklayalım. Öncelikle fonksiyon tanımlamadan önce bir fikir aşaması olur ve program yazmadan önce veya program esnasında fonksiyon oluşturma ihtiyacı duyarız. Bunun fonksiyon olması gerektiğini karar verdikten sonra fonksiyonun değer alıp almayacağını değer döndürüp döndürmeyeceğini hesaplarız. Sonrasında ise fonksiyona güzel bir isim bulmamız gereklidir. Yukarıda fonksiyon yapmamızın sebebi kodların tekrarlanması ve kod kalabalığıydı. Buna isim seçmenin ise değişken ismi kuralları olduğu gibi belli kurallar çerçevesinde bir sınırı yoktur. Şimdiye kadar size değişken ve fonksiyon adı seçme kurallarını anlatmadığımız için şimdi konuyu bölerek bunu anlatalım.

Değişken ve Fonksiyon Adı Seçme Kuralları

Şimdiye kadar yaptığımız örneklerde değişken ve fonksiyon adlarını kafamıza göre seçtiğimizi düşünüyorsanız yanılıyorsunuz. C dilinde değişkenlere ve fonksiyonlara istediğimiz adı verebilsek de bunun sıkı bir kuralı vardır. Kurallara aykırı bir ad vermemiz mümkün değildir. Üstelik kurallar çerçevesinde bile ad vermenin bir usulü olmaktadır. Usulsüz verilen bir ad okunabilirliği zorlaştırır ve programın kalitesini düşürür. Şimdi önemli kuralları sıralayalım.

  • Değişken adları çok uzun olamaz. Değişken adları Visual C++’da 1 ile 255 karakter arasında olabilir. Başka geliştirme ortamlarında bu 1 ile 31 karakter arasında olabilir. O yüzden siz çok uzun değişken adı koymaktan kaçınmalısınız. Çünkü hem okunabilirliği, hem kolay program yazımını hem de taşınabilirliği etkilemektedir.

  • Bütün değişken adları ya harf ile ya da alt tire (_) ile başlamalıdır. Rakam ile başlayan değişken adı kabul edilmez.

  • Değişken adı koyulduğunda ilk karakter harf veya alt tire (_) olduktan sonra harf, alt tire ve rakam koyulabilir. Büyük veya küçük harf olabilir ve program büyük-küçük harf duyarlıdır. Başka sembol ve boşluk koyulamaz.

  • C anahtar kelimeleri değişken adlarında kullanılamaz.

Şimdi size geçerli örnek değişken adlarını verelim.

sayi, Sayi, Sayi5, _sayi, _Sayi, SAYI_1, __sayi__1 , NotOrtalamasi, _not_ortalamasi, NOT_ORTALAMASI, NOTORTALAMASI

Şimdi ise bu değişken adları arasından güzel olanları gösterelim.

NotOrtalamasi, not_ortalamasi, _sayi_1, sayi_1

Güzel değişken adı kullanmak acemi programcıların hemen yapabileceği bir iş değildir. Zaman geçtikçe ve kendi programlama tarzınızı oturtunca kendiliğinden gelişen bir olaydır. Siz programlama yaparken başka örnek kodları, kütüphaneleri ve programlama arayüzlerini kullandığınız için ister istemez dünyadaki programcıları metodunu öğrenirsiniz ve buna uygun kod yazmaya başlarsınız.

Fonksiyon Prototipi Oluşturma

Yukarıdaki kurallara uygun olarak fonksiyon adını belirledik fakat bunu önce fonksiyon prototipi oluşturarak derleyiciye tanıtmamız gerekiyor. Fonksiyonların değer alıp almaması ve değer döndürüp döndürmemesi de bu fonksiyon prototipini oluştururken belirlenen özelliklerdir. Şimdi bir fonksiyon prototipi yapısını inceleyelim.

float karekok (int sayi);

Burada programcı bir fonksiyon tanımladı. Bu fonksiyonun bütün özelliklerini burada görmemiz mümkündür. float dediğimizde fonksiyonun float tipinde değer döndürdüğünü anlıyoruz. karekok ise programcı tarafından verilmiş isimdir ve fonksiyonun yaptığı iş hakkında haber verir. (int sayi) diyerek parantez içine yazdığımız değer ise fonksiyonun aldığı argüman olup fonksiyonu çağırırken içine yazacağımız değer tipini bize göstermekteyiz. Yani bu fonksiyon int tipinde bir değer alıp işler ve float olarak bize geri getirir. Bu fonksiyon prototipi int main fonksiyonundan önce programa yazılır. int main fonksiyonundan sonra fonksiyonumuzu yazacaksak prototip oluşturmaya ihtiyacımız vardır. Kısacası fonksiyon prototipi şu şekil olmalıdır.

döndüdüğü_deger fonksiyon_adı (argüman1, argüman2, argüman3 ...)

Fonksiyonların tek bir değer döndürdüğünü fakat pek çok argüman aldığını unutmayalım. Şimdi gerçek karekok fonksiyonumuza bir bakalım.

float karekok (int sayi)
{
  komutlar;
  komutlar; 
  komutlar;
  return karekok_degeri;
}

Görüldüğü gibi fonksiyon int main() fonksiyonundan ayrı bir kapsam içerisindedir. int main() fonksiyonunda bu fonksiyon karekok(20); diye çağırıldığında fonksiyon int sayi = 20 şeklinde kendi sayı değişkenine 20 değerini ekleyecektir. Sonrasında çeşitli işlemleri yaptıktan sonra herhangi bir değişkeni veya değeri geri döndürecektir. O yüzden biz programda deger = karekok(20); diye yazarak geri dönen değeri bir değişkene aktarırız. Fonksiyon çağırıldığında main fonksiyonunda işletilen program bırakılır ve buradaki kodlar işletilir. Burada iş bittikten sonra tekrar kalındığı yerden devam eder. return deyimi fonksiyonlar için döndürecekleri değeri belirlemektedir. return işletildiği zaman fonksiyondan operand olarak belirtilen değer ile beraber çıkılır.

Artık fonksiyonların mantığını anlattığımıza göre örnekler üzerinden daha rahat inceleme fırsatı bulacağız. Bir sonraki yazıda hem değer alan ve hem de değer döndüren fonksiyonları yazacağız ve deneyeceğiz.

Last updated