Programlama Dilleri 1 Ders 10: Çok Boyutlu Diziler
Programlama Dilleri 1
Ders 10: Çok Boyutlu Diziler
Genel Bakış
Giriş
Çok Boyutlu Diziler
Çok Boyutlu Dizilere Değer Atama
Çok Boyutlu Dizilerin Hafıza Yerleşimi
Çok Boyutlu Dizileri Tek Boyutlu Hale Getirme
Çok Boyutlu Dizilerde Adres
2 Programlama Dilleri 1
Giriş
C Programlama dilinde diziler birden
fazla boyuta sahip olabilirler.
Çok boyutlu dizileri elemanları yine
dizilerden oluşan diziler olarak düşünmek
mümkündür.
Çok boyutlu dizi tanımlamanın, tek
boyutlu dizi tanımlamaktan yapı olarak
büyük bir farkı yoktur.
Programlama Dilleri 1 3
Giriş
Diziye eklenen her bir boyut için yine [ ]
işaretleri arasında bir sayı tanımlanmaktadır.
Çok boyutlu bilgileri veya veri tablolarını
saklamak için kullanılırlar.
Çok boyutlu dizilerin bildirimi için kullanılan
genel yapı :
veri tipi dizi_adı [boyut1] [boyut2] [boyut3]...
4 Programlama Dilleri 1
Çok Boyutlu Diziler
5 Programlama Dilleri 1
Çok Boyutlu Diziler
Dizi Çeşidi Genel Bildirimi Örnek
Tek boyutlu diziler
(Vektörler) tip dizi_adı[eleman_sayısı] int veri[30];
İki boyutlu diziler
(Matrisler)
tip
dizi_adı[satır_sayısı][sutun_sayısı] float mat[5][4];
Çok boyutlu
diziler
tip
dizi_adı[boyut_1][boyut_2]……
…[boyut n]
double x[2][4][3];
6 Programlama Dilleri 1
Çok Boyutlu Diziler
Bir çok boyutlu dizi ekrana matris formunda yazılmak
istendiğinde:
Örneğin 3x4’lük bir matris için
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("%4d", x[i][j]);
}
Programlama Dilleri 1 7
Çok Boyutlu Diziler
Çok boyutlu diziler tek boyutlu diziler gibi bellekte
tutulurlar.
Tek boyutlu dizilerde olduğu gibi, çok boyutlu dizilerde
de başlangıç değeri vermek mümkündür.
Örneğin 3 satır ve 4 sütunlu (3x4=12 elemanlı) bir x
matrisinin elemanları şöyle tanımlanabilir:
int x[3][4] = {11,34,42,60,72,99,10,50, 80,66,21,38};
yada
int x[3][4] = {11,34,42,60,
72,99,10,50,
80,66,21,38};
8 Programlama Dilleri 1
Çok Boyutlu Dizilerde Atama
main( ) {
int idizi[3][4];
idizi[0][0] = idizi[0][1] = idizi[0][2] = idizi[0][3] = 1 ;
idizi[1][0] = idizi[1][1] = idizi[1][2] = idizi[1][3] = 2 ;
idizi[2][0] = idizi[2][1] = idizi[2][2] = idizi[2][3] = 3 ;
printf("%d %d %d %d \n", idizi[0][0], idizi[0][1], idizi[0][2], idizi[0][3]);
printf("%d %d %d %d \n", idizi[1][0], idizi[1][1], idizi[1][2], idizi[1][3]);
printf("%d %d %d %d \n", idizi[2][0], idizi[2][1], idizi[2][2], idizi[2][3]);
}
9 Programlama Dilleri 1
1 1 1 1
2 2 2 2
3 3 3 3
Çok Boyutlu Dizilerde Atama
Örnekte 3x4'lük ve 12 elemanlık iki boyutlu int bir dizi
tanımlanır.
1 sayısı ile gösterilen işlem satırında dizinin ilk
satırındaki elemanlara 1 değerini, 2 sayısı ile gösterilen
işlem satırında dizinin ikinci satırında yer alan
elemanlara 2 değerini, 3 sayısı ile gösterilen işlem
satırında ise dizinin üçüncü satırındaki elemanlara 3
değerini atar.
Daha sonra printf() fonksiyonunun kullanıldığı işlem
satırları ile dizinin satırlarını sırasıyla ekrana yazar.
10 Programlama Dilleri 1
Çok Boyutlu Diziye Değer Atama main( void ) {
// 5 adet ogrenci icin 8 adet sinavi temsil etmesi icin bir ogrenci
tablosu olusturulur. Bunun icin 5x8 bir matris gerekiyor.
int ogrenci_tablosu[ 5 ][ 8 ];
int i, j;
for( i = 0; i < 5; i++ ) {
for( j = 0; j < 8; j++ ) {
printf( "%d no.'lu ogrencinin ", ( i + 1 ) );
printf( "%d no.'lu sınavı: ", ( j + 1 ) );
scanf( "%d", &ogrenci_tablosu[ i ][ j ] );
}
}
}
Programlama Dilleri 1 11
Çok Boyutlu Diziye Değer Atama main( void ) {
// 5 adet ogrenci icin 8 adet sinavi temsil etmesi icin bir ogrenci
tablosu olusturulur. Bunun icin 5x8 bir matris gerekiyor.
int ogrenci_tablosu[ 5 ][ 8 ];
int i, j;
for( i = 0; i < 5; i++ ) {
for( j = 0; j < 8; j++ ) {
printf( "%d no.'lu ogrencinin ", ( i + 1 ) );
printf( "%d no.'lu sınavı: ", ( j + 1 ) );
scanf( "%d", &(ogrenci_tablosu+i)[ j ] );
}
}
}
Programlama Dilleri 1 12
Çok Boyutlu Diziye Değer Atama main( void ) {
// 5 adet ogrenci icin 8 adet sinavi temsil etmesi icin bir ogrenci
tablosu olusturulur. Bunun icin 5x8 bir matris gerekiyor.
int ogrenci_tablosu[ 5 ][ 8 ];
int i, j;
for( i = 0; i < 5; i++ ) {
for( j = 0; j < 8; j++ ) {
printf( "%d no.'lu ogrencinin ", ( i + 1 ) );
printf( "%d no.'lu sınavı: ", ( j + 1 ) );
scanf( "%d", *(ogrenci_tablosu+i)+j );
}
}
}
Programlama Dilleri 1 13
Çok Boyutlu Diziye Değer Atama
Programlama Dilleri 1 14
80 75 50 35 65 95 49 40
60 70 40 90 95 100 64 64
73 ...
… 55
5 öğrenci
8 sınav
Görsel bir şekilde ifade edecek olursak;
2. öğrencinin
4. sınavı
Çok Boyutlu Dizilerin Hafıza Yerleşimi
Bilgisayar hafızası tek boyutludur.
İster tek boyutlu, ister çok boyutlu bir dizi
içerisinde bulunan elemanlar, birbiri
ardına gelen bellek hücrelerinde tutulur.
İki boyutlu bir dizide bulunan
elemanların, hafızada nasıl yerleştiği
örnekte gösterilmiştir.
Programlama Dilleri 1 15
Çok Boyutlu Dizilerin Hafıza Yerleşimi
Programlama Dilleri 1 16
İki Matrisin Toplamı #define SAT 2
#define SUT 3
main( ) {
int a[SAT][SUT] = {5, 3, 7, 0, 1, 2};
int b[SAT][SUT] = {1, 2, 3, 4, 5, 6};
int c[SAT][SUT];
int i, j;
puts("A Matrisi:");
for(i=0; i<SAT; i++){
for(j=0; j<SUT; j++)
printf("%4d",a[i][j]);
printf("\n");
}
puts("B Matrisi:");
Programlama Dilleri 1 17
İki Matrisin Toplamı puts("B Matrisi:");
for(i=0; i<SAT; i++){
for(j=0; j<SUT; j++) printf("%4d",b[i][j]);
printf("\n");
}
puts("\nC Matrisi:");
for(i=0; i<SAT; i++){
for(j=0; j<SUT; j++){
c[i][j] = a[i][j] + b[i][j]; printf("%4d",c[i][j]);
}
printf("\n");
}
}
Programlama Dilleri 1 18
Tek Boyutlu Diziyi İki Boyutlu Matrise
Çevirme main( ) {
int dizi[100];
int a[100][100];
int i, j, n, x, st, su;
printf("Dizi kac elemandan olusmali : "); scanf("%d",&n);
for(x=0; x<n; x++) {
printf("Dizinin [%d] . elemanini giriniz : ",x+1);
scanf("%d",&dizi[x]);
}
printf("\nDizi elemanlari -->\n" );
for(x=0; x<n; x++) {
printf("%3d",dizi[x]);
}
Programlama Dilleri 1 19
Tek Boyutlu Diziyi İki Boyutlu Matrise
Çevirme printf("\nMatrisin Satir sayisini giriniz : ");
scanf("%d",&st);
printf("\nMatrisin Sutun sayisini giriniz : ");
scanf("%d",&su);
if(n%st= =0 && n%su= =0) {
x=0;
for(i=0; i<st; i++) {
for (j=0; j<su; j++) {
a[i][j]=dizi[x];
x++;
}
}
printf("\n\nMATRIS > \n");
Programlama Dilleri 1 20
Tek Boyutlu Diziyi İki Boyutlu Matrise
Çevirme for(i=0; i<st; i++) {
for(j=0; j<su; j++) {
("%3d", a[i][j]);
}
printf("\n");
}
} // if…
else
printf("HATA! Dizi Eleman Sayisi Satir veya Sutuna Tam
bolunmelidir");
}
Programlama Dilleri 1 21
Fonksiyonlara Çok Boyutlu Dizileri
Aktarmak
n boyutlu bir diziyi fonksiyona parametre
göndermek, tek boyutlu diziyi
göndermekten farklı sayılmaz.
Tek farkı dizinin n boyutlu olduğunu
belirtmemiz ve ilk boyut hariç diğer
boyutların eleman sayısını mutlaka
yazmamızın gerekli olmasıdır.
İlk elemanın boyutunu yazmaya gerek
yoktur.
Programlama Dilleri 1 22
Fonksiyonlara Çok Boyutlu Dizileri
Aktarmak 4 boyutlu bir diziyi ele alırsak parametre gönderimi şu
şekilde olur;
Örnek: 2x3x4x5’lik bir dizi ile 6x7’lik bir diziyi toplamak istersek fonksiyona aşağıdaki gibi parametre tanımlayabiliriz.
void Topla(int A[ ][3][4][5],int B[ ][7])
{
/****/
}
main( ){
Topla(A, B);
/*Fonksiyon çağrılırken boyut yazılmaz!!!*/
}
Programlama Dilleri 1 23
Fonksiyonlara Çok Boyutlu Dizileri
Aktarmak #include<stdio.h>
void matris_yazdir( int [ ][ 4 ], int );
int main( void ) {
int matris[ 3 ][ 4 ] = { {10, 15, 20, 25}, {30, 35, 40, 45}, {50, 55, 60, 65} };
matris_yazdir( matris, 3 );
return 0;
}
void matris_yazdir( int dizi[ ][ 4 ], int satir_sayisi )
{
int i, j;
for( i = 0; i < satir_sayisi; i++ ) {
for( j = 0; j < 4; j++ ) {
printf( "%d ", dizi[ i ][ j ] );
}
printf( "\n" );
}
}
Programlama Dilleri 1 24
Parametre tanımlaması yaparken, iki boyutlu dizinin satır boyutunu girmemize
gerek yoktur. Ancak sütun boyutunu girmek gerekir.
void matris_yazdir(int dizi[][4],int satir_sayisi){
/* ifade */
}
Çok Boyutlu Dizilerde Adres #include<stdio.h>
void satir_goster( int satir[ ] );
int main( void ) {
int tablo[5][4] = {
{4, 3, 2, 1},
{1, 2, 3, 4},
{5, 6, 7, 8},
{2, 5, 7, 9},
{0, 5, 9, 0} };
int i, j;
printf( "2 boyutlu tablo %p adresinden başlar\n\n", tablo );
printf( "Tablo elemanları ve hafıza adresleri:\n");
for( i = 0; i < 5; i++ ) {
for( j = 0; j < 4; j++ ) {
printf( "%d (%p) ", tablo[i][j], &tablo[i][j] ); } printf( "\n" );
}
printf( "\nTablo satırlarının başlangıç adresleri: \n");
for( i = 0; i < 5; i++ )
printf( "tablo[%d]'nin başlangıç adresi %p\n", i, tablo[i] );
for( i = 0; i < 5; i++ )
satir_goster( tablo[i] );
}
// Kendisine gonderilen tek boyutlu bir dizinin elemanlarini yazdirir.
void satir_goster( int satir[ ] ) {
int i; for( i = 0; i < 4; i++ ) {
// 4 sütun sayısı tablo[i][4]
printf( "%d (%p) ", satir[i], &satir[i] );
}
printf( "\n" );
}
Programlama Dilleri 1 25
Çok Boyutlu Dizilerde Adres
Öncelikle dizinin başlangıç adresi yazdırılır.
Tablo içerisinde bulunan dizi elemanlarının
adresleri ve değerleri yazdırılır.
Çok boyutlu diziler birden fazla dizinin
toplamı olarak düşünülebilir ve her satır tek
boyutlu bir dizi olarak ele alınabilir.
Önce her satırın başlangıç adresi gösterilir.
Sonra satırlar tek boyutlu dizi şeklinde
satir_goster( ) fonksiyonuna gönderilir.
Programlama Dilleri 1 26
Çok Boyutlu Dizilerde Adres
Dizi elemanlarının hafızada ardışık
yerleşimi bize başka imkanlar da
sunmaktadır.
İki boyutlu bir diziyi, tek boyutlu bir
diziye gösterici yardımıyla tek seferde
dönüştürmek mümkündür.
Programlama Dilleri 1 27
Çok Boyutlu Dizilerde Adres
main( ) {
int i; int tablo[5][4] = { {4, 3, 2, 1}, {1, 2, 3, 4}, {5, 6, 7, 8}, {2, 5, 7, 9},
{0, 5, 9, 0} };
// Cok boyutlu dizinin baslangic adresini bir gostericiye atiyoruz.
int *p = tablo[0]; //(int *)tablo…
// p isimli pointer'i tek boyutlu bir dizi gibi kullanabiliriz.
// Ayni zamanda p uzerinde yapacagimiz degisikler, tablo'yu da etkiler.
for( i = 0; i < 5*4; i++ )
printf( "%d\n", p[i] );
}
Programlama Dilleri 1 28
Gösterici Dizileri int main( void ) {
int i, j;
int Turkiye[8];
int Cad[8];
int Kosova[8];
int Rusya[8];
int Japonya[8];
int *tablo[5]; // Yukarda tanimlanan dizilerin adreslerini tablo'ya aktiriyoruz.
tablo[0] = Turkiye; tablo[1] = Cad; tablo[2] = Kosova; tablo[3] = Rusya;
tablo[4] = Japonya;
for( i = 0; i < 5; i++ ) {
for( j = 0 ; j < 8; j++ )
printf( "%p\n", &tablo[i][j] );
}
}
29 Programlama Dilleri 1
int *tablo[5]; olarak tanımlanan ifade bir matris
gibi düşünülebilir.
tablo, elemanların adreslerini gösteriyor gibi
görünse de, gösterilen adresler Turkiye, Cad,….
dizilerinin eleman adresleridir.
Çok Boyutlu Diziyi Tek Boyuta İndirme
#include <stdio.h>
int array3d[2][3][2] = {
{{0, 1}, {2, 3}, {3, 4}},
{{5, 6}, {7, 8}, {9, 10}}
};
int main( ) {
int i;
for(i = 0; i < 12; i++) {
printf("%d ", *((int*)array3d + i));
}
printf("\n");
return 0;
}
Çıktı:
0 1 2 3 3 4 5 6 7 8 9 10
Programlama Dilleri 1 30
array3d[2][3][2] gibi 3 boyutlu bir
dizide baştaki 2 satır sayısı, 3 sütun
sayısı, sondaki 2 ise 3. boyuttaki
eleman sayısını gösterir.
Çok Boyutlu Diziyi Tek Boyuta İndirme
main ( ) {
int numbers [2][3][4] = {
{{1,2,3,4},{5,6,7,8},{9,10,11,12}} ,
{{13,14,15,16},{17,18,19,20},{21,22,23,24}}
};
int i,j,k;
printf("3D:\n");
for(i=0;i<2;++i)
for(j=0;j<3;++j)
for(k=0;k<4;++k)
printf("%i ", numbers[i][j][k]);
printf("\n\n1D:\n");
for(i=0;i<24;++i)
printf("%i ", *((int*)numbers+i));
printf("\n");
}
Programlama Dilleri 1 31