Elektrik-Elektronik Mühendisliği Bölümü İŞLEVLER (FONKSİYONLAR) C Programlama Dili Yaz Stajı Cengiz TEPE SAMSUN 2007
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlev Nedir? C'de alt programlara işlev (function) denir. İngilizcedeki “function” sözcüğü bu bağlamda matematiksel anlamıyla değil diğer programlama dillerinde ya da ortamlarında kullanılan, "alt program", "prosedür", "subroutine" sözcüklerinin karşılığı olarak kullanılır. İşlevlerin onları çağıran işlevlerden aldıkları girdileri ve yine onları çağıran işlevlere gönderdikleri çıktıları vardır. İşlevlerin girdilerine aktüel parametreler (actual parameters) ya da argümanlar (arguments) denir. İşlevlerin çıktılarına ise geri dönüş değeri (return value) diyoruz.
Programı İşlevlere Bölerek Yazmanın Faydaları ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Programı İşlevlere Bölerek Yazmanın Faydaları Bir programı alt programlara yani işlevlere bölerek yazmak bazı faydalar sağlar: 1. Programın kaynak kodu küçülür. Böylece oluşturulması hedeflenen çalışabilir dosya da (örneğin .exe uzantılı dosya) küçülür. 2. Kaynak dosyanın okunabilirliği artar. Okunabilirliğin artması, kodu yazanın ve okuyanın işini kolaylaştırır. Böylece proje geliştirme süresinin azalması yönünde kazanım sağlanmış olur.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 3. Belirli kod parçalarının programın farklı yerlerinde yinelenmesi programda yapılacak olası bir değişikliğin maliyetini çok artırır. Programın farklı farklı yerlerinde, kodun kullanıldığı yere bağlı olarak bir seri değişiklik yapmak gerekir. Kaynak dosyalarda böyle değişiklikler yapmak hem zaman alıcıdır hem de risklidir. Çünkü bir değişikliğin yapılmasının unutulması durumunda, ya da değişiklik yapılmaması gereken bir yerde kodun değiştirilmesi durumunda program yanlış çalışabilir. Oysa ortak kod parçaları işlevler şeklinde paketlendiğinde, yalnızca işlevlerde değişiklik yapılmasıyla, istenen değişiklik gerçekleştirilmiş olur
İşlevlerin Geri Dönüş Değerleri ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlevlerin Geri Dönüş Değerleri (return values) Bir işlevin yürütülmesi sonunda onu çağıran işleve gönderdiği değere, işlevin geri dönüş değeri (return value) denir. Her işlev bir geri dönüş değeri üretmek zorunda değildir. Bir işlev yapacağı bir işle ilgili olarak bir geri dönüş değeri üretir ya da üretmez. İşlevlerin geri dönüş değerleri farklı amaçlar için kullanılabilir:
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 1. Bazı işlevler zaten tek bir değeri elde etmek, tek bir değeri hesap etmek amacıyla tanımlanırlar. Elde ettikleri değeri de kendilerini çağıran işlevlere geri dönüş değeri olarak iletirler. Bir kübün hacim değerini bulan bir işlev tanımladığımızı düşünelim. Böyle bir işlev hacmini bulacağı kübün kenar uzunluğunu çağrıldığı yerden alır, bu değeri kullanarak hacim değerini hesap eder, ve hesap ettiği değeri dışarıya geri dönüş değeri olarak iletir.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 2. Her işlevin amacı bir değer hesap etmek değildir. Bazı işlevler ise çağrılmalarıyla kendilerine sorulan bir soruya yanıt verirler. Örneğin bir sayının asal olup olmadığını sınayan bir işlev tanımlandığını düşünelim. İşlev çağrıldığı yerden, asallığını sınayacağı değeri alır. Tanımında bulunan bazı kodlar ile sayının asal olup olmadığını sınar. Sayının asal ya da asal olmamasına göre dışarıya farklı iki değeri geri dönüş değeri olarak gönderir. Bu durumda işlevin geri dönüş değeri, hesap edilen bir değer değil, sorunun yanıtı olarak yorumlanacak bir değerdir.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 3. Bazı işlevler ise ne bir değeri hesap etmek ne de bir soruya yanıt vermek için tanımlanmışlardır. Tanımlanma nedenleri yalnızca bir iş yapmaktır. Ancak işlevin yapması istenen işin, başarıyla yapılabilmesi konusunda bir garanti yoktur. Örneğin bir dosyayı açmak için bir işlev tanımlandığını düşünelim. İşlev çağrıldığı yerden açılacak dosyanın ismi bilgisini alır. Ancak dosyanın açılabilmesi çeşitli nedenlerden dolayı garanti altında değildir. Çağrılan işlev istenen dosyayı ya açar ya açamaz. İşlev geri dönüş değeriyle yaptığı işin başarısı hakkında bilgi verir. Bu durumda işlevin geri dönüş değeri, hesap edilen bir değer değil, yapılması istenen işin başarısı konusunda verilen bir bilgi olarak yorumlanır.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 4. Bazı işlevler hem belli bir amacı gerçekleştirirler hem de buna ek olarak amaçlarını tamamlayan bir geri dönüş değeri üretirler. Bir yazı içersinde bulunan belirli bir karakteri silecek bir işlev tasarlandığını düşünelim. İşlevin varlık nedeni yazının içinden istenen karakterleri silmektir. Çağırıldığı yerden, silme yapacağı yazıyı ve silinecek karakterin ne olduğu bilgisini alır ve işini yapar. Ancak işini bitirdikten sonra yazıdan kaç karakter silmiş olduğunu geri dönüş değeri ile çağırıldığı yere bildirilebilir.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE 5. Bazı işlevlerin ise hiç geri dönüş değerleri olmaz. Bu işlevler yalnızca bir iş yaparlar ve yaptıkları işin başarısı garanti altındadır. Örneğin yalnızca ekranı silme amacıylav tasarlanmış olan bir işlevin geri dönüş değerine sahip olması gereksizdir. Sistemlerin çoğunda çıktı ekranının silinmesi konusunda bir başarısızlık riski yoktur.
İşlevlerin Tanımlanması ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlevlerin Tanımlanması [Geri dönüş değerinin türü] <işlev ismi> ([parametreler]) { ... } Yukarıdaki gösterimde açısal ayraç içinde belirtilen ifadeler zorunlu olarak bulunması gerekenleri köşeli ayraç içinde belirtilen ifadeler ise bulunması zorunlu olmayan, isteğe bağlı ifadeleri gösteriyor. Tanımlanan işlevler en az bir blok içerirler. Bu bloğa işlevin ana bloğu denir. Ana blok içinde istenildiği kadar içiçe blok yaratılabilir.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Aşağıdaki işlev tanımlamasından func isimli işlevinin parametre almadığını ve geri dönüş değerinin de double türden olduğunu anlıyoruz. double func() { } void Anahtar Sözcüğü Tanımlanan bir işlevin bir geri dönüş değeri üretmesi zorunlu değildir. İşlev tanımında bu durum geri dönüş değerinin türünün yazıldığı yere void anahtar sözcüğünün yazılmasıyla belirlenir. void func()
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlev tanımında geri dönüş değerinin türü bilgisi yazılmayabilir. Bu durum, işlevin geri dönüş değeri üretmediği anlamına gelmez. Eğer geri dönüş değeri tür bilgisi yazılmaz ise, C derleyicileri tanımlanan işlevin int türden bir geri dönüş değerine sahip olduğunu varsayarlar. Örneğin : func() { } İle İnt func()
İşlevlerin Tanımlanma Yerleri ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlevlerin Tanımlanma Yerleri C dilinde bir işlev tanımı içinde bir başka işlev tanımlanamaz. double foo() { /***/ int func() /* hata */ } Tanımlamanın aşağıdaki şekilde yapılması gerekirdi : double foo() { ... } int func()
İşlevlerin Geri Dönüş Değerlerinin Oluşturulması ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlevlerin Geri Dönüş Değerlerinin Oluşturulması C dilinde işlevlerin geri dönüş değerleri return anahtar sözcüğü ile oluşturulur. return anahtar sözcüğü ya doğrudan sonlandırıcı atom ile sonlandırılır: return; Ya da return anahtar sözcüğünü bir ifade izler: return x * y; return anahtar sözcüğünün yanındaki ifadenin değeri geri dönüş değeri olarak çağırılan işlevin çağırıldığı yere iletilir.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE return ifadesinin değişken içermesi bir zorunluluk değildir. Bir işlev bir değişmezle de geri dönebilir. return 5; int func() { int x = 10; int y = 20; return x * y; } Yukarıdaki örnekteki func işlevinde return anahtar sözcüğünün yanında yer alan x * y ifadesi ile oluşturulan return deyimi func işlevini sonlandırıyor ve func işlevinin bir geri dönüş değeri üretmesini sağlıyor.
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Bazı programcılar return ifadesini bir ayraç içinde yazarlar. Bu ayraç return deyimine ek bir anlam katmaz. Yani return x * y; gibi bir deyim return (x * y); biçiminde de yazılabilir. Okunabilirlik açısından özellikle uzun return ifadelerinde ayraç kullanımı salık verilir. return (a * b - c * d);
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE C dilinde işlevler yalnızca tek bir geri dönüş değeri üretebilirler. Bu da işlevlerin kendilerini çağıran işlevlere ancak bir tane değeri geri gönderebilmeleri anlamına gelir. main İşlevi int main() { return 0; } Biçiminde tanımlanmış bir main işlevi da int türden bir değer döndürmelidir. main işlevinin ürettiği geri dönüş değeri, programın çalışması bittikten sonra işletim sistemine iletilir.
iletisiyle işaretlerler: “Warning: Function func should return a value ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Geleneksel olarak, main işlevinin 0 değerine geri dönmesi programın sorunsuz bir şekilde sonlandırıldığı anlamına gelir. main işlevinin 0 dışında bir değere geri dönmesi ise, kodu okuyan tarafından programın başarısızlıkla sona erdirildiği biçiminde yorumlanır. Yani bir takım nedenlerle yapılmak istenenler yapılamamış bu nedenle main işlevi sonlandırılmıştır. Derleyicilerin çoğu, main işlevinin geri dönüş değeri üretmemesi durumunu da aynı uyarı iletisiyle işaretlerler: “Warning: Function func should return a value
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE func(); Yukarıda func isimli işlev çağrılmıştır. Bir işlev çağırıldığı zaman programın akışı işlevin kodunun yürütülmesi için bellekte işlevin kodunun bulunduğu bölgeye atlar, işlevin kodunun çalıştırılması işlemi bittikten sonra da akış yine çağıran işlevin kalınan yerinden devam eder.
sonuc = hesapla1() + hesapla2() + x + 10; ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlevin geri dönüş değeri bir değişkene atanabileceği gibi doğrudan aritmetik işlemlerde de kullanılabilir. Örneğin: sonuc = hesapla(); sonuc = hesapla1() + hesapla2() + x + 10; gibi bir ifade geçerlidir. Çağrılmış olan hesapla1 ve hesapla2 işlevleri çalıştırılarak üretilen geri dönüş değerleri ile x değişkeni içindeki değer ve 10 değişmezi toplanır. İfadeden elde edilen değer sonuc isimli değişkene atanır.
hesapla() = 5; /* hata - nesne olmayan ifadeye atama yapılmış */ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlev çağrı ifadeleri nesne göstermez yani sol taraf değeri (L value) değildir. Yani C dilinde aşağıdaki gibi bir atama deyimki derleme zamanında hata oluşumuna neden olur. hesapla() = 5; /* hata - nesne olmayan ifadeye atama yapılmış */
İşlev Parametre Değişkenlerinin Tanımlanması ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE İşlev Parametre Değişkenlerinin Tanımlanması İşlevler çağrıldıkları yerlerden alacakları bilgileri, işlev çağrı ifadeleri ile alırlar. Bir işlevin formal parametreleri ya da parametre değişkenleri işlevlerin kendilerini çağıran işlevlerden aldıkları girdileri tutan değişkenleridir. Bir işlevin parametre sayısı ve bu parametrelerin türleri gibi bilgiler, işlevlerin tanımlanması sırasında derleyicilere bildirilirler. İşlev çağrı ifadesi ile gönderilen argumanlar, işlevin ilgili parametre değişkenlerine kopyalanırlar.
int func(int x, int y) { /***/ } int foo(double x, int y) ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE int func(int x, int y) { /***/ } int foo(double x, int y)
int foo (double x, y) /* hata */ { /***/ } ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Bu biçimde dikkat edilmesi gereken önemli nokta, işlev parametre değişkenleri aynı türden olsalar bile her defasında tür bilgisinin tekrar yazılması zorunluluğudur. Örneğin : int foo (double x, y) /* hata */ { /***/ } bildirimi hatalıdır Doğru tanımlamanın aşağıdaki şekilde olması gerekir: int foo (double x, double y) { /***/ }
Parametre Değişkenine Sahip Olmayan İşlevler ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Parametre Değişkenine Sahip Olmayan İşlevler Her işlev parametre değişkenine sahip olmak zorunda değildir. Bazı işlevler istenen bir işi yapabilmek için dışarıdan bir bilgi almazlar. Parametre değişkenine sahip olmayan bir işlevin tanımında işlev parametre ayracınin içi boş bırakılır. int foo(void) { /****/ } int foo() { /***/ }
Argumanların Parametre Değişkenlerine Kopyalanması ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE Argumanların Parametre Değişkenlerine Kopyalanması Bir işlevin parametre değişkenleri, o işlevin çağırılma ifadesiyle kendisine gönderilen argumanları tutacak olan yerel değişkenlerdir. Örnek : void func(int a) { /***/ } int main() int x = 10; func (x); return 0;
#include <stdio.h> int add(int a, int b); int main() { ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE #include <stdio.h> int add(int a, int b); int main() { int x = 100, y = 200, z; z = add(x, y); /***/ return 0; } int add(int a, int b) return a + b;
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE
ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ, C PROGRAMLAMA DİLİ , YAZ STAJI, 6/8/2007 Arş.Gör.Cengiz TEPE