Diziler (Arrays) Çok Boyutlu Diziler ÇOK BOYUTLU DİZİLER Birden fazla indis numarası ile elemanlarına ulaşılan dizilere çok boyutlu diziler denir. Bunlardan en sık kullanılanı çift boyutlu dizilerdir. Bu diziler sayesinde değerler, bir tablodaki veriler gibi düşünülebilirler. Bu tip dizilerde her elemana ulaşmak için satır indisi ve sütun indisi kullanılır. C dilindeki dizilerin boyutları ikiden de fazla olabilir. Bir sınır olmamakla beraber 12 boyuta kadar destekler. Biz burada çift boyutlu dizileri ele alacağız. Tanımlama: dizinintürü dizininadı [satır sayısı][sütun sayısı]; ÖRNEK: int a[3][4]; /* 3 satırlı, 4 sütunlu int türünde değerler alabilen bir dizi */ float b[5][3]; /*5 satırlı 3 sütunlu float türünde değerler alabilen bir dizi */ Örnekte verilen ilk dizi tanımlamasındaki birinci köşeli parantez içerisinde verilen değer satır sayısı, ikinci köşeli parantez içerisinde verilen değerde sütun sayısıdır. Bu dizi 3 4 lük bir tablo gibi düşünülebilir. Ancak bellekte tutulma şeklinin ardışık olduğu unutulmamalıdır. Sütun 0 Sütun 1 Sütun 2 Sütun 3 Satır 0 a[0][0] a[0][1] a[0][2] a[0][3] Satır 1 a[1][0] a[1][1] a[1][2]
a[1][3] Satır 2 a[2][1] a[2][3] a[2][0] a[2][2] ÇİFT BOYUTLU DİZİLERE İLK DEĞER ATANMASI Tıpkı tek boyutlu dizilerde olduğu gibi ilk değer ataması aşağıdaki şekilde yapılır. int a[3][4]={ {4, 5, 3, 1, {0, 4, 3, 1, {1, 9, 7, 2 ; Yine tek boyutlu dizilerde olduğu gibi eleman sayısından daha az değer girilirse, diğer elemanların ilk değerleri sıfır yada boş olur. İçteki küme işaretleri kullanılmadan yapıları bir ilk atamada, elemanlar ilk hücreden itibaren sırası ile yerleştirilirler. ÖRNEK: 3 4 lük çift boyutlu bir dizi içerisine klavyeden girilen değerleri, tablo halinde ekrana yazdıran programı yazınız. 1. /*Tablo halinde ekrana yazdıran program */ 2. #include <stdio.h> 3. int main() 4. { 5. int a[3][4], satir, sutun; 6. for( satir = 0 ; satir < 3 ; satir++ ) { 7. printf( %d. satirindaki elemanlar:, satir ); 8. /* satırdaki elemanlar */ 9. for ( sutun = 0 ; sutun < 4 ; sutun++ ) 10. /* bir seferde girilmiş olacak */ 11. scanf( %d, &a[satir][sutun]) ; 12. 13. printf( \n TABLO \n ); 14. for ( satir = 0 ; satir <3 ; satir++ ) {
15. 16. 17. 18. 19. 20. printf( %d. satır:, satir ) ; for( sutun = 0 ; sutun < 4 ; sutun++ ) printf( %d, a[satir][sutun] ); printf( \n ); /*bir alt satıra geçmek için*/ return 0; ÖRNEK: Elemanları klavyeden girilen 4 6 lık bir dizinin sütun toplamlarını ekrana yazan programı yazınız. 1. /* iki boyutlu dizinin sütun toplamları */ 2. #include <stdio.h> 4. #define N 4 /* Satır sayısı sabiti */ 5. #define M 5 /* Sütun sayısı sabiti */ 6. int main() 7. { 8. int a[n][m]; 9. int sutun[m] = ( 0 ); /* İlk 10. değerleri 0 ata */ int i, j; 11. for( i = 0 ; i < N ; i++ ) { 12. printf( %d. satır, i); 13. /* satırdaki elemanlar */ 14. for ( j = 0 ; j < M ; j++ ) 15. /* bir seferde girilmiş olacak */ 16. scanf( %d, &a[i][j] ); 17. 18. for ( i = 0 ; i < N ; i++ ) 19. for( j = 0 ; j < M ; j++ ) 20. sutun[j] = sutun[j] + a[i][j]; /* sütun toplamı */ printf( \n \n 22. ); for( j = 0 ; j < 6 ; j++) 23. printf( %d, sutun[j] );
24. 25. return 0; ÇOK BOYUTLU DİZİLERİN FONKSİYONLARA PARAMETRE OLARAK GÖNDERİLMESİ Çok boyutlu bir dizi, fonksiyona parametre olarak gönderilecekse, tek boyutlularda olduğu gibi sadece adı yazılır. Gönderilen dizi değişkeni karşılayan tanımlamada ise gönderilen dizinin boyutu kadar köşeli parantez açılır ve kapatılır. İlk köşeli parantez içerisine eleman sayısını ifade eden değer yazılmaz. Fakat diğerlerine eleman sayıları verilmek zorundadır. Derleyici bu değerleri elemanların hafızaya yerleşimlerini tanımlamak için kullanılır. Dizi kaç boyutlu olursa olsun bellek ardışık tek boyutlu hücrelerden oluşur. Dolayısıyla indis numaraları ne olursa olsun bütün dizi elemanları bellekte ardışık olarak saklanmak zorundadır. Örneğin; ; int a[2][3] = { {13, 12, 8, {10, 50, 2 gibi bir dizi tanımlandığında elemanları bellekte tutulur. Yani çift boyutlu diziler tablo halinde bellekte tutulmaz. Her bir satır verilen sütun sayısı kadar sonraki hücreler içerisinde tutulur. Zaten her bir satır tek boyutlu bir dizi gibi düşünülebilir. Bütün satırlar uç uca eklenerek belleğe yerleşir. Derleyici bir sonraki satırın başlangıçtan kaç eleman sonra başladığını sütun sayısından anlar. Bu nedenle ilk satır sayısı haricindeki diğer değerler fonksiyonda karşılayan değişkenin ikinci ve daha sonraki köşeli parantezleri içerisine yazılmalıdır.
ÖRNEK: Kendisine gönderilen 3 4 lük bir diziyi ekrana tablo halinde yazan fonksiyonu main() fonksiyonu ile beraber yazınız. 1. #include <stdio.h> 3. #define N 3 /* Satır sayısı sabiti */ 4. #define M 4 /* Sütun sayısı sabiti */ 6. void diziyaz ( int [] [M] ); /*prototip tanımlaması */ 8. int main() 9. { 10. 11. int a[n][m] = { {4, 5, 3, 1, 12. {0, 4, 3, 1, 13. {1, 9, 7, 2 ; 14. diziyaz ( a ); 15. return 0; 16. 17. void diziyaz ( int b[] [M] ) 18. { 19. int sutun; 20. int satir; 22. for( satir = 0 ; satir < N ; satir++) { 23. printf( %d. satırdaki elemanlar:, satir ); 24. for( sutun = 0 ; sutun < M ; sutun++) 25. printf( %d, b[satir][sutun] ); 26. printf( \n ) ; /* bir alt satıra geçmek için */ 27. 28.