Fonksiyonlar Yrd.Doç.Dr.Bülent Çobanoğlu
Fonksiyonlar Bir ana program alt programlardan (prosedür, metot, alt yordam veya fonksiyonlardan) oluşabilir. Yapısal programlama dillerinde (Pascal, C, C++, Visual Basic gibi) bu küçük program parçacıklarını ifade eden kod grupları, alt program (sub program), altyordam (subroutine), modül (module), fonksiyon (function), metot (method) veya yordam (procedure) gibi isimlerle adlandırılmaktadır. C/C++ dillerinde bu alt programlar, fonksiyonlardan (functions) oluşurken Java dilinde ise yöntemlerden (metotlardan) oluşur. Yani C/C++ daki fonksiyon Java da metot adını alır diyebiliriz. Fonksiyonlar, belli bir işi gerçekleştirmek için tasarlanmış alt programlardır. Programın daha modüler olmasını sağlarlar.
Fonksiyonlar Kullanım : Birden fazla kez veya birden fazla yerde kullanılacak kodlar için fonksiyonları kullanırız. Fonksyionları kendimiz yazabildiğimiz gibi; C/C++ kütüphaneleri ile gelen hazır fonksiyonları da kullanabiliriz. (sqrt(), printf(), scanf() vb...)
Fonksiyonlar Giriş parametreleri alabilen ve çeşitli işlemler yapıp sonuçta bir takım sonuçlar üreten ve Çıkış değerleri döndürebilen kod parçalarına Fonksiyon diyoruz. Girdiler Parametreler FONKSİON Çıktılar Geri Dönüş Değeri (Return Value)
Fonksiyonlar Fonksiyonların girdilerine Parametreler ya da Argümanlar denir. Bir fonksiyon çalıştığında; Çalışması esnasında belli amaçları yerine getirir. Çalışmasının sonunda bir değeri de kendisini çağıran fonksiyona geri döndürebilir.
Return komutu Fonksiyonun geriye döndüreceği değeri oluşturan komuttur. Aynı zamanda fonksiyonu sonlandıran komuttur. Örnek return tanımlamaları; return; //fonksiyonun geri dönüş değeri yok, fonk. sonlandırır return 6; //fonksiyonun geri dönüş değeri sabit (6) return a++; //fonksiyonun geri dönüş değeri değişken (a+1) return (a*b); //parantez kullanmayabilirsiniz! return (a%2)? 0: 1; //a nın 2 ye bolunmesine göre geriye 0 //yada 1 değerlerini döndürüyor return fakt(); /*fonksiyonun geri dönüş değeri, başka bir fonksiyonun geri dönüş değeri*/
Fonksiyon Tanımlama Fonksiyonları parametreli veya parametresiz fonksiyonlar olarak sınıflandırabiliriz. Parametreli fonksiyonlar geriye değer döndüren fonksiyonlardır. Parametresiz fonksiyonlar ise geriye bir değer döndürmezler. Parametresiz fonksiyonlar, sadece komutları işlerken, parametreli fonksiyonlar işletilen komutlara ek olarak geriye bir değer gönderirler yani bir sonuç üretirler. Esasında herhangi bir değer geriye döndürmeyen (dönüş tipinde void deyimi olan) fonksiyonlara alt program da denebilir. Geriye dönüş değeri return deyiminin yanında belirtilir. Ayrıca return deyimi, fonksiyonun icrasını sonlandırmak amacıyla da kullanılabilir.
Fonksiyon Tanımlama Geri dönüşsüz ve Parametresiz fonksiyon tanımlaması void fonksiyon_ismi () İfade ve işlemler-1; İfade ve işlemler-1; Geriye değer döndüren ve Parametreli fonksiyon tanımlaması Dönüş Tipi fonksiyon_ismi ( Parametreler ) İfade ve işlemler-1; İfade ve işlemler-1; return (değişken veya değeri) Geriye bir değer döndürülmeyecekse void terimi kullanılır.
Fonksiyonlar Bir fonksiyon çalışması sonunda onu çağıran fonksiyona dönüşünde return ile değer gönderir. Geri Dönüş Değeri bir değişkene atanabilir veya doğrudan aritmetik işlemlerde kullanılabilir. Örneğin; x = fonk(); burada önce fonk isimli fonksiyon çalıştırılır; çalışma sonunda elde edilen değer x değişkenine atanır.
Örnek Uygulama-1: Fonksiyonların Tanımlanması void imza() //Parametresiz ve geriye değer döndürmeyen bir fonksiyon printf("b. Cobanoglu, SAU\n"); int yas(int yil) //Parametreli ve geriye değer döndüren bir fonksiyon return yil-1974;
Örnek Uygulama-1: (Devam) Fonksiyonların Çağrılması Fonksiyon çağırma operatörü olarak () kullanılır. int main() imza(); printf ("Yas..: %d", yas(2013));
Örnek Uygulama-2: #include<stdio.h> #include<conio.h> //Menu fonksiyonu void menu() printf("\n[0].topla\n"); printf("\n[1].cikar\n"); printf("\n[2].carp\n"); printf("\n[3].bol\n"); //Hesapla fonksiyonu int Hesapla(int a, int b, int op) if(op==0) return a+b; else if(op==1) return a-b; else if(op==2) return a*b; else return a/b; //Ana program int main() int a,b,o; double sonuc; menu(); printf("\niki sayi giriniz..:\n"); scanf ("%d %d",&a,&b); printf("\nsecimini gir..:\n"); scanf ("%d",&o); sonuc=hesapla(a,b,o); printf("\nsonuc=%g", sonuc ); getch();
Örnek Uygulama-3: #include <stdio.h> #include <conio.h> int faktoriyel(int n) int i,f=1; for (i=n; i>=1; i--) f=f*i; return f; int main(void) int n; printf(" Faktoriyeli alinacak sayi..: "); scanf ("%d",&n); printf ("%d!=%d",n,faktoriyel(n)); getch();
Başlık dosyaları (Header Files) Yrd.Doç.Dr.Bülent Çobanoğlu
Matematiksel Fonksiyonlar Fonksiyon Açıklama Örnek fabs( x ) x sayısının mutlak değerini verir. abs( -23.7 ) = 23.7 ceil( x ) x sayısını bir üst tamsayıya dönüştürür. Sonuç double türdedir. ceil(9.2) = 10.0 ceil(-9.8) = -9.0 floor( x ) x sayısını bir alt tamsayıya dönüştürür. Sonuç double türdedir. floor(9.2) = 9 floor(-9.8) = -10 round(x) x sayısını en yakın tamsayıya tamamlar. Sonuç int ya da long türdedir round(9.2) = 9 round(9.8) = 10 rint(x) x sayısını en yakın tamsayıya tamamlar. Sonuç double türdedir. rint(9.2) = 9.0 rint(9.8) = 10.0 cos( x ) x in radyan cinsinden trigonometrik kosinüsünü hesaplar. cos(0.0) =1.0 sin(x) x in radyan cinsinden trigonometrik sinüsünü hesaplar. sin(0.0) =0.0 tan(x) x in radyan cinsinden trigonometrik tanjantını hesaplar. tan(1.0)=1.557040724 acos(x) x in radyan cinsinden kosinüsünün tersini hesaplar. x,1 den büyük ise NaN sonucunu üretir. acos(1.0) =0.0 asin(x) x in radyan cinsinden sinüsünün tersini hesaplar. x,1 den büyük ise NaN sonucunu üretir. asin(1.0) =1.570796 atan(x) x in radyan cinsinden arc tanjantını hesaplar. atan(45) =1.54857776 exp( x ) Doğal logaritma parametresi olan e'nin üstel değerini (e x ) hesaplar. exp(1.0) =2.71828182 log( x ) e tabanına göre x in logaritmasını alır log(2.71828182)=1.0 max( x, y ) x ve y nin büyük olanını verir. max(2.0, 4.0)=4.0 min( x, y ) x ve y nin küçük olanını verir. max(2.0, 4.0)=2.0 pow( x, y ) x in y inci kuvvetini verir. pow(2,3)=8.0 sqrt( x ) X in kara kökünü verir sqrt( 9.0 ) = 3.0 M_PI rand() Pi sayısını verir 0 ile RAND_MAX arasında rastgele sayı üretir. (stdlib.h kütüphanesine ihtiyaç duyar) srand (time(0)); fonksiyonu ile sürekli değeri değişen sayılar üretir. 1+rnd()*6 // 1 ile 6 arasında sayi üretir
Matematiksel Fonksiyonlar Yrd.Doç.Dr.Bülent Çobanoğlu
Özyineleme (Recursion) Kendini doğrudan veya dolaylı olarak çağıran fonksiyonlara özyinelemeli (recursive) fonksiyonlar adı verilir. Orijinal problemin küçük parçalarını çözmek için, bir alt programın kendi kendini çağırmasını sağlayarak, tekrarlı işlemlerin çözümüne farklı bir bakış açısı getirir. Özyinelemeli fonksiyonlar algoritma tasarımını basitleştirir ancak tekrarlı yapılara göre fonksiyon çağırma sayısı arttığı için bellek alanı da artar. Özyineleme, en genel anlamıyla bir yapının kendi kendine atıfta bulunmasıdır. Özellikle matematik ve bilgisayar biliminde kullanılır. Özyinelemeli fonksiyonu anlamak için Faktöriyel fonksiyonunu tekrar incelersek; verilen pozitif bir n tamsayısı için n faktöriyel, n! şeklinde gösterilir ve n ile 1 arasındaki tüm tamsayıların çarpımına eşittir. n!=n (n-1) (n-2) (n-3).. 1
Örnek: Özyineleme (Faktöriyel) #include <stdio.h> #include <conio.h> int faktoriyel(int n) if (n <= 1) return n; else return (n* faktoriyel(n-1)); int main(void) printf("faktoriyeli alinacak sayi..: "); scanf ("%d",&n); printf ("%d", faktoriyel(n)); getch();
Örnek: Özyineleme (Recursion) #include <stdio.h> #include <conio.h> int topla(int n) if (n <= 1) return n; else return (n + topla(n-1)); int main(void) int n; printf("n! sayilarinin toplami..: "); scanf ("%d", &n); printf ("%d", topla (n)); getch();
Her elemanı kendisinden önceki iki elemanın toplamı şeklinde ifade edilen fibonacci serisinin n. eleman değerini özyinelemeli fonksiyon ile bulan programı yazınız. #include <stdio.h> #include <conio.h> int fibonacci(int n) int fib; if (n == 0 n ==1) fib = n; else fib = fibonacci(n - 1) + fibonacci(n - 2); return fib; int main(void) printf("kacinci eleman..:"); int n; scanf("%d",&n); printf("%d.eleman:%d",n,fibonacci(n)); getch();
Örnek : 0 dan 90º ye kadar açıların 5 er derecelik aralarla sinüslerini hesaplayacak ve yazdıracak programı yazınız. Sin x fonksiyonunun x=a noktasındaki Taylor serisine açılımını kullanarak hesaplayacağız. Serinin ilk 15 terimi alınmıştır (n=15 ) Yrd.Doç.Dr.Bülent Çobanoğlu
Rasgele sayi üretimi #include <stdio.h> #include <conio.h> int main() int n,sayi; //0 ile 50 arasında 10 adet rasgele sayi for (n=1; n<=10; n++) sayi=rand()%50; printf ("%d ",sayi); getch(); //her çalışmada farklı sayilar çıkması için #include <stdio.h> #include <conio.h> #include <time.h> int main() int n,sayi; srand (time(null)); for (n=1; n<=10; n++) sayi=rand()%50; printf ("%d ",sayi); getch();
Sayı Tahmin Oyunu 1 ile 99 arasında bilgisayarın tuttuğu sayıya göre kullanıcıyı yönlendiren ( daha küçük sayı giriniz veya daha büyük sayı giriniz biçiminde) ve kaç defa da sayıyı bulduğunu ekranda gösteren bir sayı tahmin oyunu programını yazınız.