17 Temmuz 2009 Cuma

C / Çok Boyutlu Diziler

Ç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.

İKİ BOYUTLU DİZİLERİN TANIMLANMASI

İki boyutlu dizi tanımlanırken dizinin içerisinde saklanacak elemanların tipi, dizinin adı ve satır –sütun boyutları söylenir.

int not [40] [3];

İlk söylenen satır sayıs, ikinci söylenen sütun sayısıdır.

ÇİFT BOYUTLU DİZİLERE İLK DEĞER ATANMASI

Çift boyutlu dizinin herbir elemanına satır ve sütun indis numarası söylenerek ulaşılıp değer atanabilir.

not[23][2] = 78;

Bununla birlikte tıpkı tek boyutlu dizilerde olduğu gibi tanımlama esnasında da ilk değer ataması yapılabilir. Bu defa içiçe iki küme parantesi kullanmak gerekir. Her bir küme parantezi içerisindeki değerler herbir satırdaki değeri ifade eder. Örneği inceleyelim.

int a[3] [4] = { {1,2,3,4} , {5,6,7,8} , {9,10,11,12} }

Böyle bir atama sonunda değerler diziye aşağıdaki şekilde yerleşecektir:


0. Sütun 1. Sütun 2. Sütun 3. Sütun
0. Satır 1 2 3 4
1. Satır 5 6 7 8
2. Satır 9 10 11 12
Bu durumda; a[2][1] indis numaralı elemanın değeri 10’dur. Yukarıdaki gibi bir değer atama işleminin ilk bakışta daha kolay anlaşılabilmesi için şu şekilde bir yazım yöntemi tercih edilebilir:

A[3] [4] = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12} } ;

ÖRNEK:

4 X 3 boyutlarında bir diziye klavyeden eleman girdiriniz. Girilen elemanlar içerisinde en büyüğünü buldurunuz. Diziyi ekrana tablo şeklinde yazdırınız.

#include
#include
void main ( )
{
int a[3][4], i, j, eb;

for ( i=0;i <3; i++) for (j=0; j<4; j++) { printf ( “%d. Sütun %d. Satır elemanını giriniz:”, i+1, j+1); scanf ( “%d”, &a[i][j] ); } eb=a[0][0]; for ( i=0; i<3; i++) for(j=0; j<4; j++) if (a[i][j] > eb)
eb = a[i][j];
printf ( “\n Dizinin en büyük elemanı %d ‘dir...”, eb);
printf(“\nDizi ekrana tablo halinde yazdırılıyor...”);
for (i=0; i<3; i++) { printf (“\n”); /* Her satır elemanını yeni bir satırın başından yazmak için */ for ( j=0; j<4; j++) printf (“%5d”, a[3][4]); } getch(); } NOT: İki boyutlu dizileri hafızanızda daha iyi canlandırabilmeniz için tablo örneğini verdik. Ama iki boyutlu diziler hafızada tablo şeklinde yerleşmezler. Arka arkaya önce ilk satır elemanları, hemen arkalarından ikinci satır elemanları....şeklinde tıpkı tek boyutlu dziler gibi saklanırlar. Biz başlangıç adreslerini (dizinin adında başlangıç adresi saklıdır) ve her satırda kaç eleman olduğunu bildiğimizden hangi elemanın hangi satıra ait olduklarını bulabiliriz. 3X4 boyutundaki bir dizinin ilk 4 elemanı ilk satıra, ikinci 4 elemanı ikinci satıra ait elemanlardır. ÇOK BOYUTLU DİZİLERİN FONKSİYONA PARAMETRE OLARAK GÖNDERİLMESİ Tıpkı tek boyutlu dizilerde olduğu gibi iki boyutlu dizi de fonksiyona gönderilirken sadece adı yazılır. Yani gönderilen dizinin başlangıç adresidir. Ancak fonksiyonda gelen diziyi karşılamak için dizinin boyutlarına uygun dizi tanımlanmalıdır. Gönderilen diziyi karşılayacak dizinin ilk boyut değeri söylenmez ama ikinci boyut değeri mutlaka söylenmelidir. ÖRNEK: Elemanları klavyeden girilecek 3X4 boyutlarında ki bir diziyi fonksiyonda ekrana tablo şeklinde yazdırınız. #include
#include
void dizi_yaz (int [][4]);
void main ( )
{
int a[3][4], i, j;

for ( i=0;i <3; i++)
for (j=0; j<4; j++)
{
printf ( “%d. Sütun %d. Satır elemanını giriniz:”, i+1, j+1);
scanf ( “%d”, &a[i][j] );
}
eb=a[0][0];
dizi_yaz (a);
getch();
}

void dizi_yaz (int b[][4])
{
int i,j;
printf(“\nDizi ekrana tablo halinde yazdırılıyor...”);
for (i=0; i<3; i++)
{
printf (“\n”); /* Her satır elemanını yeni bir satırın başından yazmak için */
for ( j=0; j<4; j++)
printf (“%5d”, a[3][4]);
}
}

ÇALIŞMA SORULARI:
50 elemanlı integer bir diziye 1-10 arasında rasgele değerler atayınız. Her sayıdan kaç tane olduğunu buldurunuz.

Örnek:
1’lerin sayısı: 4
2’lerin sayısı: 12
3’lerin sayısı: 8
.
.
.

50 elemanlı integer bir diziye 1-10 arasında rasgele değerler atayınız. Dizi elemanlarının herbirinin tekrar sayısını bir histogramla gösteriniz.

Örnek:
Eleman Sayısı Histogram
1 3 ***
2 12 ************
3 8 ********
.
.
.
20 elemanlı integer bir diziye 1-100 arasında rasgele değerler aktarınız. Diziyi ters çeviren fonksiyonu tasarlayınız.Ters çvirme işlemini elemanların yerlerini değiştirerek yapınız. Fonksiyon parametre olarak dizinin bşlangıç adresini almalıdır.




Dizi[0] Dizi[1] ..... Dizi[18] Dizi[19]
6 1 ........ 45 7




Elemanları klavyeden girilen 4 X 3 boyutlarında bir tablonun elemanlarını 3 X 4 boyutlarında bir tabloya aktaran fonksiyonu tasarlayınız. İlk tablonun satır elemanları, ikinci tablonun sütun elemanları olmalıdır. Fonksiyon parametre olarak tablonun başlangıç adresini almalıdır.

İLK TABLO

5 3 2
8 1 4
2 6 7
3 7 1

İKİNCİ TABLO

5 8 2 3
3 1 6 7
2 4 7 1

Hiç yorum yok:

Yorum Gönder