Fonksiyonlar
Fonksiyon nedir? Fonksiyon, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten komut grubudur. Her fonksiyonun bir adı ve fonksiyona gelen değerleri gösteren değişkenleri (argümanları) vardır. Genel olarak bir fonksiyonun görevi aşağıdaki şekilde gösterilmiştir.
Fonksiyon tanımlama Fonksiyonların girdilerine parametreler yada argumanlar denir. Bir fonksiyon bu parametreleri alıp bir işleme tabi tutar ve bir değer hesaplar. Bu değer, çıktı veya geri dönüş değeri (return value) olarak adlandırılır. Bir fonksiyonun kaç girişi olursa olsun sadece bir çıkışı vardır. C dilinde hazırlanan bir fonksiyonun genel yapısı şöyledir: DönüşTipi FonksiyonAdı(argüman listesi) argümanların tip bildirimleri { Yerel değişkenlerin bildirimi ... fonksiyon içindeki deyimler veya diğer fonksiyonlar ... return geri dönüş değeri; }
Fonksiyon Tanımlama-2 Dönüş_tipi: fonksiyon tarafından döndürülen değerin tipini belirtir. Bu, int, double gibi bir aritmetik tip veya gösterge olabilir. Dönüş_tipi olarak void anahtar sözcüğü kullanıldığında, fonksiyondan hiçbir değer döndürülmeyeceği belirtilmiş olur. void fonksiyonlar FORTRAN’daki SUBROUTINE’ler veya Pascal’daki procedure’ların karşılığıdır. Fonksiyon_adı: bir tanıtıcı sözcüktür. Argüman Listesi: virgülle ayrılmış ve önüne tipleri yazılmış biçimsel argüman veya parametre isimleri listesidir. Diğer bir fonksiyon tarafından çağrıldığında bu fonksiyona geçirilecek olan argümanların sayısını, sırasını ve tipini belirtir. Aynı zamanda, parametrelere, sadece fonksiyonun gövdesini oluşturan blok’un içinde anlamlı olan, isimler verir. Hiç parametresi olmayan bir fonksiyon da olabilir. Bu durum, parantezler içine void yazılarak açıkça gösterilir. Return: Kontrolün çağırana geri dönmesini sağlar. return deyiminden sonra gelen deyimler yerine getirilmez ve fonksiyon hemen çağrıldığı yere “geri döner”.
int topla( int x, y ) şeklindeki yazım hata verir. Tanımlama Örneği Örneğin iki sayının toplamını hesaplayacak bir fonksiyon şöyle tanımlanabilir: /* 1. yöntem*/ int topla(x,y) int x,y { int sonuc; sonuc = x + y; return sonuc; } /* 2. yöntem*/ int topla(int x,int y) { int sonuc; sonuc = x + y; return sonuc; } /* 3.yöntem*/ int topla(int x,int y) { return (x+y); } int topla( int x, y ) şeklindeki yazım hata verir.
Fonksiyon Çağrılması Bir fonksiyonu ana programdan çağırmak için genellikle bir değişkene değer döndürme şeklinde yapılır.Örneğin öndeki slaytta yer alan fonksiyonu ana programdan çağırmak için şöyle bir tanımlama yapılabilir. toplam=topla(5,4) Bu işlem satırında fonksiyona 5 ve 4 değerleri gönderiliyor. Geri dönen sonuç ise toplam değişkenine aktarılıyor.
Fonksiyon Çağırma şekli
Fonksiyon bildirimi int topla(int, int); şeklinde de yazılabilir. Bir fonksiyonun bildirimi iki türlü yapılır: Ana programdan önce: ... int topla(int x,int y) /* fonksiyon */ { ... } main() Ana programdan sonra: Bu durumda fonksiyon prototipi ana programdan önce bildirilmelidir. .. int topla(int x, int y); /* fonksiyon örneği ... main() int topla(int x, int y) /* fonksiyon */ int topla(int, int); şeklinde de yazılabilir.
Örnek: 2 sayının toplanıp ekrana yazdırılması işleminin fonksiyon yardımıyla yapılması. #include <stdio.h> int topla(int, int); /*** fonksiyon prototipi ***/ main(){ int toplam,a,b; printf("Iki sayi girin : "); scanf("%d %d",&a,&b); /* fonksiyon çağırılıp, a ve b değerleri parametre olarak aktarılıyor.*/ toplam = topla(a,b); printf("%d ve %d nin toplami %d dir.\n", a,b,toplam); getchar(); } /*** fonksiyon tanımlanması ***/ /* Bu fonksiyon iki tamsayıyı toplar */ int topla( int x, int y ){ int sonuc; sonuc = x + y; return sonuc; Programda, klavyeden okunan a ve b değişkenleri fonksiyonuna parametre olarak aktarılmıştır. Bu değişkenlerin isimleri ile topla fonksiyonunda kullanılan değişkenlerin (x ve y) isimleri aynı olması zorunlu değildir. Burada a ve b değişkenleri sırasıyla x ve y değişkenleri yerine konmuştur.
Faktöriyeli fonksiyonda hesaplayan program. #include <stdio.h> int fakt (int n) { int i = 1,top=1; while (i<=n) top *= i; i++; } return top; main(){ int sayi = 4; printf("%d! = %d\n", sayi, fakt(sayi)); getchar(); Fonksiyon aşağıdaki şekilde de yazılabilir. int fakt (int n) { int i = n; while (--n) i *= n; return i; }
Dizinin Fonksiyona Gönderilmesi Fonsiyonun bildirimi int fonk(int a[5]) //yada int fonk(int a[]) { işlemler} Dizinin gönderilmesi int dizi[5] fonk(dizi)
5 elemanlı bir dizinin elamanlarının toplamını fonksiyon yardımıyla hesaplayan program Eğer dizinin boyutu fonksiyona gönderilmeyip, fonksiyonda boyutu hesaplanırsa kod aşağıdaki gibi yazılır. #include <stdio.h> int topla (int sayi[]) { int toplam=0,i; for(i=0;i<=sizeof(sayi);i++) toplam+=sayi[i]; return toplam; } main(){ int sayi[5] = {4,3,2,5,6}; printf("%d", topla(sayi)); getchar(); #include <stdio.h> int topla (int sayi[],int eleman_sayi) { int toplam=0,i; for(i=0;i<5;i++) toplam+=sayi[i]; return toplam; } main(){ int sayi[5] = {4,3,2,5,6}; int eleman_sayi=5; printf("%d", topla(sayi,eleman_sayi)); getchar();
Özyinemeli(Recursive) Fonksiyonlar Fonksiyonlar tekrarlama yapılarına göre temel olarak iki türlü düşünülebilir. Buna göre bir fonksiyonun içinde yine kendisinden bir parça bulunuyorsa bu fonksiyonlara özyinelemei (recursive) fonksiyon denilirken, fonksiyonun kendisini tekrar etmemesi durumunda döngülü (iterative) fonksiyon ismi verilir. Teorik olarak bütün döngülü (iterative) fonksiyonlar özyinelemeli (recursive) fonksiyon olarak yazılabilir (tersi de doğrudur). En basit açıklama yöntemi olarak faktoriyel hesaplama fonksiyonu gösterilebilir. faktoriyel() { x=0 ise sonuç sıfırdır x=1 ise sonuç birdir x=n için ise sonuç n çarpı fonksiyon(n-1) dir. } Bu örnekteki gibi girilen değer sıfır yada bir olmadığı sürece fonksiyon sıfır yada bir ile karşılaşana kadar düzenli olarak n sayısından bir çıkartarak kendisini çağırmaktadır.
Klavyeden girilen sayıya kadar olan sayıları recursive fonksiyon yardımıyla toplayan program #include<stdio.h> #include<conio.h> int topla(int a){ if(a==1) return 1; return a+ topla(a-1); } main() { int sayi; printf("sayı giriniz"); scanf("%d",&sayi); printf("sayıların toplamı:%d",topla(sayi)); getchar(); getchar();
Bir sayının faktöriyelini recursive fonksiyon ile bulan program int fakt(int n) { if (n==0) return 1 ; return n*fakt(n-1); } main(){ int sayi=4; printf("%d", fakt(sayi)); getchar();
Örnek:Kendini çağıran fonksiyon kullanarak, kullanıcıdan alınan bir sayı kadar tek sayıların toplamını bulan program. Örneğin; kullanıcı 4 girerse; 1 3 5 7 nin toplamını bulup ekrana yazıyor. #include<stdio.h> #include<conio.h> int topla(int n) { return ((n==1) ? 1 : (2*n-1)+topla(n-1)); } main() { int sayi; printf("sayı giriniz"); scanf("%d",&sayi); printf("Tek sayıların toplamı:%d",topla(sayi)); getchar(); getchar(); }
Klavyeden girilen bir metin içerisindeki büyük harfleri recursive fonksiyon ile yazan program #include<stdio.h> #include<conio.h> #include<string.h> recursive (char*,int,int); main() { char dizi[40],*ptr; int i,adet,x; ptr=dizi; printf("\n Bir Karakter Katari Giriniz \n\n "); gets(ptr); adet=strlen(ptr); x=0; printf("\n\n Girilen Metindeki Buyuk Harfler ==> "); recursive(ptr,adet,x); getch(); } recursive(char *ptr_1,int adet1,int i ) { if(adet1==0) return 1; if(isupper(ptr_1[i])) printf("%c",ptr_1[i]); recursive(ptr_1,adet1-1,i+1); }
Çalışma Soruları 1. Kendisine argüman olarak verilen bir tamsayıyı tersine çevirip, sonucu döndürecek bir fonksiyon yazınız. 2. En ve boy parametrelerine göre, '*' simgeleriyle dikdörtgen çizen bir fonksiyon yazınız. 3. N1 –N2 e kadar olan sayılardan 3 e bölünemeyenleri bulup ekrana yazdırınız. (fonksiyon kullanınız) 4. Kendisine verilen iki sayının OKEK (Ortak Katların En Küçüğü) değerini hesaplayıp, geriye döndüren fonksiyonu yazınız.