giriş - eembdersler.files.wordpress.com file5/13/2011 enf-102 jeoloji 2011 1 fonksiyonlar...
TRANSCRIPT
5/13/2011
ENF-102 Jeoloji 2011 1
Fonksiyonlar - Functions
2/69
Giriş
• Büyük programlaryazmanın en kolayyolu onları küçükparçalar halindeyazıp sonrabirleştirmektengeçer.
• Buna “Böl vefethet”-”divideand conquer”denir.
10
7 8 9
5 6
4
3
2
1
3/69
Örnek
• Herhangi bir sektörde çalışan büyük bir işletmedüşününüz.
• Bu işletmede bütün işleri gören tek bir bölümyoktur.
• Bütün işler uygun bölümlerinsorumluluğundadır.
• Bütün bu bölümlerde patron tarafındançalıştırılır.
Patron
Muhasebe Reklam Personel
Gelir Gider
4/69
Örneğin
• Đkinci dereceden bir bilinmeyenli birdenklemin köklerinin hesaplanmasıişleminde yapılması gerekenler:1. Diskriminantın hesaplanması,
2. Diskriminantın sonucuna bakarak kökolup olmadığına karar verilmesi
3. Duruma göre köklerin bulunması
5/69
• Bu bölüme kadar olan yöntemlerle tasarımıyine aynı şekilde düşünülürse bütün çözümparçacıkları main() fonksiyonu içerisineyazılmalıdır.
• Böyle olduğunda ana program bloğumuzproblemin büyüklüğüne göre uzar,okunabilirliliği azalır, müdahale etmekzorlaşır.
• Bu türlü büyük programları kendi içerisinde,her biri verilen bir işi çözmek için tasarlanmışalt program (sub program) parçacıklarındanyani modüllerden oluşturmak daha mantıklıolacaktır.
6/69
C dilinde
• Bu modüllere fonksiyon (function) adıverilir.
• Diğer kaynaklarda "işlev" yada " altyordam" adı ile de kullanılırlar.
• Fonksiyonu çalıştırma işine çağırma(function call) denir.
• Her fonksiyon, ismi (function name) vekendisinden istenen işi gerçekleştirmek içingerekli olan değerler yani parametreler-argümanlar (arguments) ile çağrılırlar.
5/13/2011
ENF-102 Jeoloji 2011 2
7/69
• Eğer, argüman verilirse argümanlarüzerinde işlem yaparak ya da kendiiçerisinde farklı işlemlergerçekleştirerek yaptıkları işinsonucunu kendilerini çağıranfonksiyona bildirirler.
• Bu değere geri dönen değer (returnvalue) adı verilir.
Geri dönen değer x in kareköküdür
a=sqrt(x);
Fonksiyon ismi Parametreleri
8/69
Fonksiyonlar
• Girdi olarakparametre ilekendisine verilendeğeri alır veüzerinde işlemleryaparak sonuçdeğeri, yani geridönecek olandeğeri üretir.
9/69
main() fonksiyonu
• Programın çalışması main ()fonksiyonundan başlar.
• Bu fonksiyon diğer fonksiyonları çağırarakçalıştırır.
Main()
Fonk1() Fonk2() Fonk3()
Fonk4() Fonk5()
10/69
Fonksiyon Kullanmanın Faydaları
• Kodun gereksiz yere büyümesini engeller:– Sıkça tekrarlanan işlemler için bir kere fonksiyon
yazıldığında aynı kodlar tekrar yazılmaksızınistenildiği kadar çalıştırılabilirler.
– Aynı kod parçası gereksiz yere birden fazlayazılmamış olur.
• Okunabilirliği artırarak algılamayıkolaylaştırır:– main fonksiyonu içerisinde, birbirinden ayrılmış
sadece kendi işlerini yapan fonksiyonların isimlenbulunur.
– Detay işlemler fonksiyonların içinde halledilir.
– Bu programlama tekniğine prosedürel soyutlama(procedural abstraction) adı verilir.
11/69
Fonksiyon Kullanmanın Faydaları (devam)
• Programın test edilmesini vehataların bulunmasını kolaylaştırır.– Hata araştırılırken aranılması gereken alt
program bloğuna bakılır.
– Yalnız başlarına da istenirse testedilebilirler.
• Güncelleştirilebilir olmasını veyeniden kullanabilme kolaylığısağlar:– Modüler olarak yazıldıklarında istenilen
projelerde defalarca kullanılabilirler.12/69
C dilinde fonksiyonlar
• Standart fonksiyonlar
– Math (Matematik) kütüphanesi fonksiyonları,
– Standart kütüphane (stdlib) fonksiyonları,
• Kullanıcı tanımlı fonksiyonlar
5/13/2011
ENF-102 Jeoloji 2011 3
13/69
Standart fonksiyonlar
• C dilinin geliştiricileri tarafındanprogramcıların kullanmaları için, öncedenyazılmış olan hazır fonksiyonlardır.
• Hazır fonksiyonlar teknik olarak C dilininparçası değillerdir.
• Yalnızca standart hale getirilmişlerdir.• Programcı, kullanmak istediği hazır
fonksiyon prototiplerinin bulunduğu başlık(header) dosyalarını include önişlemcidirektifi ile bildirmek sureti ile kullanabilir.
• Fonksiyonların kendileri .LIB kütüphanedosyaları içerisindedir.
14/69
Math kütüphanesi fonksiyonları
• Bu kütüphane içerisinde, matematikselişlemleri gerçekleştirmek için kullanılanfonksiyonlar bulunur.
• Bu kütüphane içerisindeki fonksiyonlardouble türde değerler alır ve geriye doubletipte değerler döndürürler.
15/69
Math kütüphanesi fonksiyonları
Fonksiyon Açıklama Örnek
sqrt(x) x’in karakökünü alır sqrt(900.0)=30.0
exp(x) ex exp(1.0)=2.718282
log(x) Doğal algoritma log(2.718282)=1.0
log10(x)10 tabanına göre x’in logaritması
Log10(1.0)=0.0
fabsx(10) x’in mutlak değeri fabs(-5.0)=5.0
ceil(x) x’i kendisinden büyük en küçük sayıya yuvarlar.
ceil(-9.8)=9.0
ceil(9.2)=10.0
floor(x)x’i kendisinden küçük en büyük sayıya yuvarlar.
floor(-9.8)=-10.0
floor(9.2)=9.0
16/69
Math kütüphanesi fonksiyonları
Fonksiyon Açıklama Örnek
pow(x,y) xy pow(2.0,3.0)=8.0
fmod(x,y) x/y den kalanı verir.fmod(13.657,2.333)=1.1992
sin(x) Radyan cinsinden x’in sinüsü
sin(0.0)=0.0
cos(x)Radyan cinsinden x’in kosinüsü
cos(0.0)=1.0
tan(x)Radyan cinsinden x’in tanjantı
tan(0.0)=0.0
17/69
Standart kütüphane (stdlib)
• Bu kütüphane içerisinde türdönüşümleri, hafıza yerleştirmelerive rastgele sayı üretme fonksiyonlarıile yardımcı fonksiyonlar bulunur.
18/69
Rand()
• 0 ile stdlib içerisinde tanımlı olanRAND_MAX (32.767) arasında rastgelebir sayı üretir.
• Bu sayıyı, belli bir başlangıç değeriüzerinde, bir dizi aritmetik operasyongerçekleştirerek üretir.
5/13/2011
ENF-102 Jeoloji 2011 4
19/69
a=rand( )
• Đfadesi çalıştığında 0 ile 32767arasında rastgele bir değer üretilereka değişkeni içerisine aktarılır.
• Đstenen aralıklarda değer üretmesiiçin mod (% ) işlemi kullanılır.
• a= 1 + rand( )%6• ifadesinde 1 ile 6 arasında rastgele
bir değer üretilerek a değişkenineaktarılır.
20/69
srand()
• rand() fonksiyonu belli bir başlangıçdeğerinden itibaren bir dizi matematikselişlem sonucu rastgele bir değer üretir.
• Fakat programın her çalışmasında aynıbaşlangıç değerini kullanır.
• Dolayısı ile programın her çalışmasında aynıdeğer ya da değerler ortaya çıkar.
• srand() fonksiyonu rand() fonksiyonununüreteç başlangıç değerini belirlemek içinkullanılır.
• Unsigned tipte bir değer alır ve rastgelesayı üretecinin bu değerden başlayarakçalışmasını sağlar.
21/69
Örneğin;
scanf("%d",&a); srand(a);
a= 1 + rand() % 6;• Yukarıdaki kod parçasında klavyeden
girilen bir değer rastgele sayıüretecinin başlangıç değeriolmaktadır.
• Her defasında yeni bir rastgele değerelde edilmek istenirse klavyedensürekli değişik bir değer girilmelidir.
22/69
• Her defasında rastgele değişik bir sayının üretilmesiistenirse sürekli değişen bir değeri srand ilebaşlangıç değeri olarak belirlemek gerekir.
• Bilgisayarda bulunan ve sürekli değişen değer sistemsaatidir.
• Bunun için time () fonksiyonundan faydalanılabilir.
• Bu fonksiyon NULL parametresi ile çalıştırıldığında01.01.1970 ten günümüze kadar olan zamanın,saniye cinsinden değerini geri döndürür.
• Bu fonksiyon time kütüphanesi içerisindedir.
23/69
ÖRNEK: 1 ile 6 arasında rastgele 5 adet sayı üretip ekrana yazdıran programı yazınız.
/*l-6 arasında 5tane rastgele sayi üreten program */#include <stdio.h>#include <stdlib.h>#include <time.h>void main( ){
int x, i;srand(time(NULL));for( i=1 ; i<=5 ; i++ ) {
x=1 + rand() %6;printf(“%d, ", x );
}
24/69
1 ile 49 arasında ekrana rastgele 6 adet sayıyazan program.
/*1-49 arasında 6 tane rastgele sayi üreten program */#include <stdio.h>#include <stdlib.h>#include <time.h>int main( ){
int x, i;
srand(time(NULL));for( i=1 ; i<=5 ; i++ ){
x=1 + rand()% 49;printf(“%d, ”,x);
}return 0;
}
5/13/2011
ENF-102 Jeoloji 2011 5
25/69
Ekran Çıktısı
• 6, 1, 4, 1, 5,
• Çıktıda görüldüğü gibi çıkan bir sayıtekrar çıkabilir.
• Eğer programdaki srand satırı silinirseprogramın her defasında aynı sayıserisini ürettiği görülecektir.
26/69
Kullanıcı Tanımlı Fonksiyonlar
• Bu bölüme kadar üzerinde durulanfonksiyonlar C dilinde hazır olarakkullanılan standart fonksiyonlardır.
• Programcı kendi fonksiyonlarınıoluşturarak kullanabilir.
• Bu tür fonksiyonlara kullanıcı tanımlıfonksiyonlar (user definedfunctions) denilir.
27/69
Fonksiyon tanımlanması
[fonksiyon türü] <fonksiyon adı> ([parametreler]){
……………….;/*yapılacak işlemler*/……………….;……………….;
}
Fonksiyon başlığı
Fonksiyon
bloğu
28/69
Parametre ve geri dönüş değeri olmayan fonksiyonlar
• Bu tür fonksiyonlar, çağıran (caller)fonksiyondan ne bir değer alırlar ne degeriye bir değer döndürürler.
• Geriye dönüş değeri olmadığı içinfonksiyonun türü kısmına void ifadesiyazılır.
• Fonksiyonun türü aynı zamanda geriyedönüş değerinin türüdür.
29/69
Parametre ve geri dönüş değeri olmayan fonksiyonlar
• Burada dikkat edilmesi gereken nokta,fonksiyon türü yazmak zorunlu olmadığı içinhiçbir tür tanımlaması yapılmadığındafonksiyon türünün olmadığı ve geriye değerdöndürmediği anlamına gelmediğidir.
• Fonksiyon türü yazılmadığında derleyici intolarak varsayar.
• Bu türde bir değer döndürmesini bekler.
30/69
ÖRNEK: Ekrana "Merhaba" yazan fonksiyon
void f (void) {
printf (“Merhaba”);
}
void f ( ) {
printf (“Merhaba”);
}
ya da
5/13/2011
ENF-102 Jeoloji 2011 6
31/69
ÖRNEK: Ekrana aşağıdaki ev figürünü çizenfonksiyonları main() fonksiyonu ile birlikteyazınız.
32/69
PROBLEM PARÇALARI
1. Çatının çizilmesi 1.1. Đki kenarın çizilmesi
1.2. Tabanın çizilmesi
2. Gövdenin çizilmesi
3. Yolun çizilmesi
33/69
…
• Çatı çizme karışık bir iş olarak düşünülüp iki adet işparçasına bölünmüştür.
• Çatının çizilmesi için ikizkenar çiziminin ve tabançizme işlemlerinin gerçekleşmesi gerekir.
• Diyagram olarak aşağıdaki gibi gösterilebilir.
Main()
Caticiz() Govdeciz() Yoluciz()
Đkikenarciz() Tabanciz()
34/69
…
• main fonksiyonu yani programın anafonksiyonu problemi çözecek olan üçfonksiyonu çağıracaktır.
• Böylece ev figürü ekrana çizilmiş olacaktır.
• Burada main fonksiyonu çağıran (caller),diğer üç fonksiyon ise main tarafındançağrılan (called) fonksiyondur.
• Aynı şekilde çatıçiz fonksiyonu daikikenarçiz ve tabanciz fonksiyonlarınıçağıran fonksiyondur.
35/69
Adım adım programı yazalım – 1.
/* Bu program ekrana bir ev figürü çizer*/#include <stdio.h>/*Çatının iki kenarını çizen fonksiyon*/void ikikenar_ciz(){
/*Bir adet \ yazmak için \\ yazılması gerekir*/printf(" /\\ \n"); printf(" / \\ \n");printf("/ \\ \n");
}/*Çatının tabanını çizen fonksiyon*/void taban_ciz(){
printf("-----------\n");}/*Çatıyı çizen fonksiyon*/void cati_ciz(){
ikikenar_ciz();taban_ciz();
} 36/69
Adım adım programı yazalım – 2.
/*Gövdeyi çizen fonksiyon*/void govde_ciz(){
printf("----------- \n");printf("| | \n");printf("| | \n");printf("----------- \n");
}/*Yolu çizen fonksiyon*/void yolu_ciz(){
printf(" \\ \\ \n");printf(" \\ \\ \n");
}
5/13/2011
ENF-102 Jeoloji 2011 7
37/69
Adım adım programı yazalım – 3.
int main(){
cati_ciz();govde_ciz();
yolu_ciz();return 0;
}
38/69
Derleyici,
• derleme esnasında programı yukarıdan aşağı doğru derler.
• Fakat program main fonksiyonundan itibaren çalışmaya başlar, main fonksiyonunun ilk çağırdığı fonksiyon çatıçiz fonksiyonudur.
39/69
Derleyici,
• Program işleyişi bu satırı gördüğü andaçatıçiz fonksiyonuna dallanır, çatıçizfonksiyonu içerisinde ise ikikenarçizfonksiyonu çağrılmaktadır buradan daikikenarçiz fonksiyonuna dallanır,ikikenarçiz fonksiyonu blok sonu işaretine( }) kadar çalışır.
• Fonksiyon bittiğinde, program işleyişiçağıran fonksiyonun kaldığı noktadanitibaren devam eder.
40/69
…
• Kalınan nokta ikikenarçiz çağrıldıktan sonrakinokta olan tabançiz fonksiyonun çağrılacağısatırdır.
• Bu ifadeyi gördükten sonra program işleyişitabançiz fonksiyonuna dallanır.
• Bu fonksiyonun çalışması bittiğinde programişleyişi çağrılan noktaya geri döner.
41/69
…
• Đşleyiş devam ettirilir ve çatıçiz fonksiyonusona erer.
• Dönülmesi gereken nokta çatıçizfonksiyonunun çağrıldığı ifadeden sonra gelenifadedir.
• Burası main fonksiyonundaki gövdeçizfonksiyonunun çağrıldığı satırdır.
42/69
…
• Diğer fonksiyonlarda aynı şekilde çağrılıpçalıştırılır.
• Burada dikkat edilmesi gereken nokta herçağrılan fonksiyonun çalışması bittiktensonra program işleyişinin kendisini çağıranfonksiyonda kalınan noktadan devametmesidir.
5/13/2011
ENF-102 Jeoloji 2011 8
43/69 44/69
…
• Fonksiyonların sağladığı en büyükavantajlardan biri de kodun gereksizyere büyümesini engellemektir.
• Sıkça tekrarlanan işlemler için birkere fonksiyon yazıldığında aynıkodlar tekrar yazılmaksızın istenildiğikadar çalıştırılabilirler.
• Aynı kod parçası gereksiz yere birdenfazla yazılmamış olur.
45/69
Bir tane yerine beş tane ev çizmekgerekseydi,
• Yapılacak iş ev çizen fonksiyonlarıaşağıdaki gibi 5 kere çağıran yapıyıkurmak olacaktır:
int main(){ int i;
for (i=1;i<=5;i++){cati_ciz();govde_ciz();yolu_ciz();}return 0;
}
46/69
Fonksiyon tanımlamaları
• C programlama dilinde fonksiyontanımlamaları istenilen yerde yapılabilir,main () üstünde olmuş ya da altında olmuşönemli değildir.
• Bu tanımlama biçimini görene kadarşimdilik çağrılan fonksiyon çağıranfonksiyonun üzerinde yazılmalıdır denebilir.
• Burada dikkat edilecek diğer bir nokta "birfonksiyon içerisinde başka bir fonksiyontanımlaması" yapılamayacağıdır.
47/69
Parametre Alıp Geriye Değer DöndürmeyenFonksiyonlar
• Bu tür fonksiyonlar çağıran (caller)fonksiyondan bir ya da birden fazlaparametre (argument) alır ve bunlarüzerinde çeşitli işlemler gerçekleştirirler.
• Burada çağıran fonksiyondan çağrılanfonksiyona doğru bilgi akışı söz konusudur.
• Gönderilen değer girdi parametresi (inputargument) olarak değerlendirilir.
48/69
Parametre Alıp Geriye Değer DöndürmeyenFonksiyonlar
• Bu tür fonksiyonlar çağrılırkenfonksiyona gönderilecek olandeğerler ya da değerlen tutandeğişkenler fonksiyon parantezininiçerisine yazılır.
• Bu değerleri karşılayan değişkenlerdefonksiyon tanımlama kısmındaparantezler içerisinde belirtilir.
• Gönderilen değerler, karşılayandeğişkenler içerisine kopyalanılırlar.
5/13/2011
ENF-102 Jeoloji 2011 9
49/69
Parametre Alıp Geriye Değer DöndürmeyenFonksiyonlar
• Değerler birebir olarak gönderilirler.
• Yani birinci sırada gönderilen değerikarşılayan değişken ilk sırada, ikincigönderilen değişkeni karşılayandeğişken ikinci sırada yazılmalıdır.
• Gönderilenler ile karşılayanlarınsayısı eşit olmalıdır.
50/69
ÖRNEK :
• Kendisine gönderilen tamsayı değerin tek yada çift olup olmadığını ekrana yazanfonksiyonu main () fonksiyonu ile beraberyazınız.
• Bu soruda anahtar kelimeler "kendisinegönderilen" kelimeleridir.
• Bunlar fonksiyonun parametre alacağınıgösterir.
• Kaç adet parametre alacağı sorununkendisinden çıkarılır.
• Burada parametre sayısı birdir.
51/69 52/69
…
• Fonksiyona istenirse bir değişkenistenirse de sabit bir değergönderilebilir.
• Gönderilen değeri karşılayanfonksiyon tanımında parantezleriçerisine yazılan sayi değişkenidir.
53/69
…
• Gönderilen değerler bu değişken içerisinekopyalanır, sayi değişkeninin içerisine önceklavyeden girilen i değişkeni içerisindekideğer gönderilir ve değişkenin içerisindekideğer sayi değişkeni içerisinekopyalanacaktır.
• Aynı şekilde gönderilen 5 değeri de ilkçağrılma bittikten sonra tekrargönderilecektir.
54/69
Program çalıştırıldığında çıktısı aşağıdaki gibi olur:
5/13/2011
ENF-102 Jeoloji 2011 10
55/69
Burada bilgi akışı şekildeki gibidir.
56/69
Parametre Alıp Geriye Değer Döndüren Fonksiyonlar
• Bu tür fonksiyonlar çağıran (caller)fonksiyondan bir ya da birden fazlaparametre (argument) alır ve bunlarüzerinde çeşitli işlemler gerçekleştirerekgeriye bir değer döndürürler.
• Geriye değer döndürmek için kullanılankomut return komutudur.
57/69
Parametre Alıp Geriye Değer Döndüren Fonksiyonlar
• return [geridönüş değeri];
• Genel kullanımda da görüldüğü gibi geridönüş değeri isteğe bağlıdır, return komutuhem fonksiyonu sonlandırmak hem de geriyedeğer döndürmek amacı ile kullanılır.
• return komutu çalıştığı anda fonksiyonçalışması sonlanır.
58/69
ÖRNEK:
• Kendisine gönderilen iki tamsayıdeğerin toplamını geri döndürenfonksiyonu örnek bir main fonksiyonuile beraber yazınız.
59/69
Kod:
60/69
Çıktı:
• 3 ve 5 sayıları topla fonksiyonuna gönderilirve iki sayının toplamı sonuç değişkenineaktarılır.
• Sonuç değişkenin değeri de return komutuile geri döndürülür.
• Bu fonksiyon aşağıdaki gibi de yazılabilir.
5/13/2011
ENF-102 Jeoloji 2011 11
61/69
Parametre akış türleri
• Fonksiyonlara değerler gönderilirkeniki adet yöntemle gönderilirler.
• Bu yöntemler şimdilik kısacageçilecektir.
• Daha sonraki konularda kıyaslamalıolarak anlatılacaktır.
62/69
Değerle çağır (call by value)
• Bu yöntemle çağıran fonksiyondan gönderilen değerler, çağırılan fonksiyondaki parametrelerin içerisine kopyalanırlar.
• Kopyaların değiştirilmesi orijinal değerleri etkilemez.
• Şu ana kadar verilen bütün fonksiyon örneklerinde kullanılan yöntem budur.
63/69
Bağlantılı çağır (call by reference)
• Bu yöntemde değerlerin, kopyalandığıdeğişkenlerin değiştirilmesi orijinaldeğerleri etkiler.
64/69
Fonksiyon prototipleri (Function Prototype)
• Bu bölüme kadar olan örnekler defonksiyonlar, çağıran fonksiyonlarınüstünde olacak şekilde yazıldı.
• Çünkü derleyicinin, fonksiyonçağrılarında fonksiyonların geriyedöndürecekleri değerlerin tipleriniçağrılma satırından önce bilmesigerekir.
65/69
Fonksiyon prototipleri (Function Prototype)
• Derleme işlemi yukarıdan aşağı doğruyapıldığı için fonksiyonlar üsteyazıldığında geri dönüş tipi öncedenbilinir.
• Fakat fonksiyonlar, çağıranfonksiyonların altında datanımlanabilir.
66/69
Fonksiyon prototipleri (Function Prototype)
• Programların yazımında önce main()fonksiyonunun yazılması ve dahasonra diğer fonksiyonların yazılmasıpratikte yazım kolaylıkları sağlar.
• Dolayısı ile fonksiyonu çağırmadanönce fonksiyonun aldığı parametrelerile geri dönüş değerini derleyiciyebildirmek amacı ile fonksiyonprototipleri kullanılır.
5/13/2011
ENF-102 Jeoloji 2011 12
67/69
Fonksiyon prototipleri (Function Prototype)
• Fonksiyon prototiplerinde sadecefonksiyonun tipi, adı ve aldığıparametrelerin tipi yazılır.
• Parametre isimleri yazılmak zorundadeğildir.
• Yazılırsa derleyici bu isimleri göz ardı eder.
• Đsim yazmak yalnızca okunabilirliği artırır.
68/69
69/69
Kaynakça:
• Programlamayı C ile öğreniyorum (2. Baskı), M. Yorulmaz, S. Yorulmaz, 2005, Ankara