17 Temmuz 2009 Cuma

C / Dizileri Fonksiyona Parametre Olarak Gönderme

DİZİLERİ FONKSİYONA PARAMETRE OLARAK GÖNDERMEK (Passing Array to Function)

Parametre olarak bir dizi alacak olan fonksiyon tanımlanırken parametrei dizi olarak söylenmelidir.

void dizi_yaz (int [], int);

tanımlaması, birisi integer dizi, diğeri integer olan iki parametre alıp geriye değer döndürmeyen bir fonksiyonu ifade eder. Yani fonksiyona bir dizi gönderileceğinden onu karşılayan değerinde bir diziolması gerekir. Ancak fonksiyonda diziyi karşılayacak olan diziye boyut ya da indis belirtilmez.

Herhangibir dizi fonksiyona parametre olarak gönderilirken sadece dizinin adı söylenir, [] işaretleri kullanılmaz ve indis numarası belirtilmez.

int a[10]; şeklinde tanımlanmış bir diziyi fonksiyona göndereceksek

dizi_yaz ( a , 10)

dememiz gerekir. Dikkat edilirse sadece dizinin adını (a) yazdık. Ne köşeli parantez kullandık ne de indis numarası söyledik. Eğer indis numarası kullanarak gönderseydik hatalı bir işlem yapmış olurduk.

dizi_yaz (a[3], 10) gibi bir ifade fonksiyona diziyi değil, dizinin 3 indis numaralı tekbir elemanını gönderir. Dizinin tamamını fonksiyona gönderebilmek için sadece adını yazmak gerekir.

Bu ifade aslında dizinin başlangıç adresini göndermektir. (Dizinin adında hafızadaki başlangıç adresi saklı değil miydi?) Böylece dizi elemanları hafızada arka arkaya yerleştiğinden istenilen herhangi bir elemana ulaşılabilir. Fonksiyonda işlem gören dizinin saklanmış olduğu hafıza adresleri olduğundan ve hafızada aynı adresten sadece bir tane bulunduğundan fonksiyonda yapılan işlemler (mesela dizi elemanlarının değiştirilmesi) ana programdaki diziyi de etkilemiş olur. Yani ana programdaki dizi ile fonksiyondaki dizinin adları farklı olsa da aynı hafıza hücresinde bulunan elemanlar üzerinde çalışmaktadırlar. Böylece fonksiyonun geriye parametre döndürmesine gerek kalmadan dizi elemanlarının hepsi fonksiyonda değiştirilebilir.

ÖRNEK: Değerleri ana programda kullanıcıdan istenen 10 elemanlı integer bir diziyi fonksiyona gönderip, fonksiyonda kabarcık sıralaması yöntemini kullanarak sıralatalım. Ve sıralı halini ana programda ekrana yazdıralım.

#include
#include
void sirala ( int [] );
void main()
{
int a[10], i;

for (i=0; i<10; i++) { printf(“Dizinin %d. Elemanını giriniz:”); scanf(“%d”, &a[i]); } sirala ( a ); printf (“\nDizinin sıralı hali:”); for ( i=0; i<10; i++) printf(“%d\n”, dizi[i]); getch(); } void sirala (int b[] ) /* Parametre olarak dizi geldiği için onu karşılayan da dizi olmak zorunda*/ { int i, j, yedek; for (i=0; i<10; i++) for ( j = 0; j< 10-1; j++) if (b[j]>b[j+1]) /* Her elemankendinden bir sonraki ile karşılaştırılıyor */
{
yedek = b[j]; /* yer değiştirme yapılıyor */
b[j] = b[j+1];
b[j+1] = yedek;
}
}

ÇOK BOYUTLU DİZİLER

Bir sınıftaki 40 öğrencinin notlarını saklamak için 40 elemanlı tek boyutlu bir dizi gerekirken; bir sınıftaki 40 öğrencinin 3’er notlarını saklamak için 40 satırı ve 3 sütunu bulunan (40 X 3 ) iki boyutlu bir dizi gerekecektir. İlk öğrencinin ilk notu dizinin [0][0] indis numaralı notudur. Dizinin [23][2] indis numaralı elemanı ise 24. elemana ait 3. notu saklamaktadır. Çünkü dizilerin indis numarası 0(sıfır)’dan başlar.

Eğer sınıftaki 40 öğrencinin, 6’şar dersten aldıkları 3’er notları saklamak isteseydik üç boyutlu bir diziye ihtiyaç duyacaktık. (40 X 10 X 3 )

Elemanlarına birden fazla indis numarası ile ulaşılan dizilere çok boyutlu diziler denir. C dilinde dizi boyutları hafızanın desteklediği ölçüde olabilir. Çok boyutlu diziler arasında en çok kullanılanı 2 boyutlu dizilerdir. 2 boyutlu dizileri bir tablo gibi düşünebiliriz. Bu tablodaki herbir elemana ulaşmak için önce satır sonrada sütun indis numarasını söylemek gerekir.

Hiç yorum yok:

Yorum Gönder