Professional Documents
Culture Documents
10
© Bu ünitenin tüm yayın hakları Atatürk Üniversitesi Açıköğretim Fakültesi’ne aittir. Yazılı izin alınmadan
ünitenin tümünün veya bir kısmının elektronik, mekanik ya da fotokopi yoluyla basımı, yayımı, çoğaltımı ve
dağıtımı yapılamaz.
İki Boyutlu Diziler
GİRİŞ
Bu ünitede 9. Ünite’de detayları verilen tek boyutlu dizi uygulamaları
genişletilecektir ve iki boyutlu diziler ele alınacaktır. Diziler, belirli sayıda ve aynı
türden bir grup ilişkili veriyi bir arada tutmaya imkân sağlayan programlama
yapılarıdır. Dizilerde tutulan veri her ne olursa olsun şayet tablo gibi iki boyutluysa
veya daha fazla boyuta sahipse bu verinin tek boyutlu dizilerle modellenmesi ve
işlenmesi güçtür. Örneğin; bir öğrenci için vize, final ve bütünleme notları tek
boyutlu bir dizi içerisinde saklanabilir. Ancak bütün bir sınıf için, her bir öğrencinin
vize, final ve bütünleme notlarını saklayan dizileri bir araya getirerek çok boyutlu
bir sınıf not listesi dizisi oluşturmak daha mantıklıdır.
Tek boyutlu diziler aşağıdaki gibi tanımlanırlar ve bu tip dizilere vektör
denir.
int x[2];
veri_tipi diziAdi[x][y];
int a[3][4] = {
{ 0, 1, 2, 3 } , // 0 indisli satırın atanması
{ 4, 5, 6, 7 } , // 1 indisli satırın atanması
{ 8, 9, 10, 11 } // 2 indisli satırın atanması
};
Her bir satırı birbirinden ayıran süslü parantezler kullanılmasa bile yine de
atama işlemi gerçekleştirilebilir. Yukarıdaki atama işleminin süslü parantez
kullanılmayan aynı işlevli formu aşağıdaki şekildedir:
#include <iostream>
using namespace std;
int main()
{
int a[5][2] = { { 0,0 },{ 1,2 },{ 2,4 },{ 3,6 },{ 4,8
} };
// dizinin elemanlarinin ekrana yazdirilmasi
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 2; j++)
{
cout << "a[" << i << "][" << j << "]: ";
cout << a[i][j] << endl;
}
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
//a dizisi tanımlanması
int a[5][5];
//birinci boyut üzerinde for döngüsü
for (int i = 0; i<5; i++) {
//ikinci boyut üzerinde for döngüsü
for (int j = 0; j<5; j++) {
//dizi elemanına değer atama
a[i][j] = i + j;
}
}
//birinci boyut üzerinde for döngüsü
for (int i = 0; i<5; i++) {
//ikinci boyut üzerinde for döngüsü
for (int j = 0; j<5; j++) {
//dizi elemanının ekrana yazdırılması
cout << a[i][j];
}
//her bir satır sonrası satır sonu eklenmesi
cout << endl;
}
return 0;
}
şeklinde olacaktır.
int main()
{
// test dizisi tanımlaması
int dizi[3][2] =
{
{ 2, -5 },
{ 4, 0 },
{ 9, 1 }
};
return 0;
}
Yukarıdaki örneğin ekran çıktısı aşağıdaki gibidir:
#include <iostream>
using namespace std;
int main()
{
int sicaklik[SEHIR][HAFTAGUN];
#include <iostream>
using namespace std;
int main()
{
int r, c, a[100][100], b[100][100], toplam[100][100], i, j;
cout << endl << "1. Matrisin elemanlarini giriniz: " << endl;
// 1. Dizi dolduruluyor
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j)
{
cout << "a dizisinin " << i + 1 << j + 1 << " elemanina
deger girin: ";
cin >> a[i][j];
}
// 2. Dizi dolduruluyor
cout << endl << "2. Matrisin elemanlarini giriniz: " << endl;
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j)
{
cout << "b dizisinin " << i + 1 << j + 1 << " :elemanina
deger girin ";
cin >> b[i][j];
}
// Matrisler Toplaniyor
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j)
toplam[i][j] = a[i][j] + b[i][j];
return 0;
} Bu programın ekran çıktısı aşağıdaki gibi olacaktır:
#include <iostream>
using namespace std;
#define sayi 3
int main()
{
int birinciDizi[sayi][sayi] = { 3, 2, 7, 0, 8, 1, 9, 1, 2 };
int ikinciDizi[sayi][sayi] = { 2, 3, 1, 7, 7, 9, 8, 6, 5 };
int sonuc[sayi][sayi], toplam;
//Birinci dizi ekrana yazdırılıyor
cout << "Birinci Dizi: " << endl;
for (int i = 0; i<sayi; i++)
{
for (int j = 0; j<sayi; j++)
cout << " " << birinciDizi[i][j];
cout << "\n";
}
//İkinci dizi ekrana yazdırılıyor
cout << "Ikinci Dizi: " << endl;
for (int i = 0; i<sayi; i++)
{
for (int j = 0; j<sayi; j++)
cout << " " << ikinciDizi[i][j];
cout << "\n";
}
//İki dizi çarpılarak sonuc dizisine yazılıyor
//ardından ekrana yazdırılıyor
cout << "Sonuç Dizisi: " << endl;
for (int i = 0; i<sayi; i++)
{
for (int j = 0; j<sayi; j++)
{
toplam = 0;
for (int k = 0; k<sayi; k++)
{
toplam += birinciDizi[i][k] *
ikinciDizi[k][j];
}
sonuc[i][j] = toplam;
cout << " " << sonuc[i][j];
}
cout << "\n";
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
int aMatris [3][2] = { { 1, 4 },{ 2, 5 },{ 3, 6 } };
int bMatris[2][3] = { { 7, 8, 9 },{ 10, 11, 12 } };
int sonuc[3][3] = { { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 } };
//Satır döngüsü
for (int satir = 0; satir < 3; satir++) {
//Sütun döngüsü
for (int sutun = 0; sutun < 3; sutun++) {
//her iki matrisin elemanlarının birbiriyle çarpımı için iç
döngü
for (int ic = 0; ic < 2; ic++) {
sonuc[satir][sutun] += aMatris[satir][ic] *
bMatris[ic][sutun];
}
cout << sonuc[satir][sutun] << " ";
}
cout << "\n";
}
return 0;
}
şeklinde olacaktır.
ELEMAN SAYISI BELİRTİLMEMİŞ İKİ BOYUTLU DİZİLER
C++ ile iki boyutlu dizilerin her bir boyutunun barındıracağı eleman sayısı
dinamik olarak tanımlanabilir.
return 0;
}
void EkranaYazdir(int gelenDizi[][3], int satirSayisi)
{
İki boyutlu dizi int i, j;
for (i = 0; i < satirSayisi; i++) {
gönderilirken dizinin iki for (j = 0; j < 4; j++) {
boyutlu olduğu cout << gelenDizi[i][j] << " ";
belirtilmeli ve ikinci }
boyutun eleman sayısı cout << endl;
mutlaka yazılmalıdır. }
}
char yuzYil[100][365][24][60][60];
şeklinde yapılabilir. Örneğin, yukarıdaki dizi tanimi ile bir yüzyılın her bir
saniyesini ihtiva eden beş boyutlu bir dizi üretilebilir. Bu deyim sayesinde 3
milyardan fazla eleman ihtiva eden bir dizi üretilmiş olur. Her bir char’ın bellekte
1 byte yer kapladığı göz önünde bulundurulduğunda bu dizi bellekte 3
Gigabyte’dan fazla yer kaplayacaktır.
int a[3][5];
int a[15];
Son olarak çok boyutlu diziler programcılar için görsel basitleştirme sağlar.
Yukarıdaki örnekte her iki deyim de aynı sayıda dizi elemanı ihtiva
etmektedir. Aşağıdaki her iki örneğin sonucunda da ikiBoyutluDizi aynı değerlere
sahip olacaktır:
#include <iostream>
#define sutun 5
#define satir 3
int ikiBoyutluDizi[satir][sutun];
int n, m;
int main()
{
// birinci boyut için for döngüsü
for (n = 0; n<satir; n++)
{
// ikinci boyut için for döngüsü
for (m = 0; m<sutun; m++)
{
// dizi elemanına değer atanması
ikiBoyutluDizi [n][m] = (n + 1)*(m + 1);
#include <iostream>
}
#define
} sutun 5
#definereturn
satir 0;
3
}
int ikiBoyutluDizi[satir * sutun];
int n, m;
int main()
{
// birinci boyut için for döngüsü
for (n = 0; n<satir; n++)
{
// ikinci boyut için for döngüsü
for (m = 0; m<sutun; m++)
{
// dizi elemanın değerinin okunması
ikiBoyutluDizi[n*sutun + m] = (n + 1)*(m
+ 1);
}
}
return 0;
}
Atatürk Üniversitesi Açık Öğretim Fakültesi 15
İki Boyutlu Diziler
#include <iostream>
using namespace std;
int main()
{
// (2x3x2) 12 eleman iceren dizi tanimlaniyor
int test[2][3][2];
return 0;
}
•Diziler, belirli sayıda ve aynı türden bir grup ilişkili veriyi bir arada
tutmamıza imkân sağlayan programlama yapılarıdır.
•Dizilerin tek boyutlu olması gerekmez, istenilen boyutta dizi
Özet tanımlanabilir.
•Dizi kavramının varlık sebebi birden fazla değişkeni hafızada bir arada
tutmak ve böylece kolayca ulaşmaktır.
•Dizilerde tutulan veri her ne olursa olsun şayet tablo gibi iki
boyutluysa veya daha fazla boyuta sahipse bu verinin tek boyutlu
dizilerle modellenmesi ve işlenmesi zordur.
•İki boyutlu bir dizi, özünde bir boyutlu dizilerin listesi olarak
tanımlanabilir.
•İki boyutlu bir dizi x adet satır ve y adet de sütun ihtiva eden bir tablo
gibi düşünülebilir. x ve y sıfırdan büyük birer tam sayı olmalıdır.
•İki boyutlu dizilere atama yapılırken her bir sütunun elemanları “,” ile
ve her bir satırın elemanları da süslü parantezlerle birbirinden ayrılır.
•Her bir satırı birbirinden ayıran süslü parantezler kullanılmaksızın
sadece virgüller ile veriler birbirinden ayrılarak da atama işleme
gerçekleştirilebilir.
•İki boyutlu dizilerin elemanlarına satır ve sütun indisleri kullanılarak
erişilebilir. Örneğin:
int deger = a[2][3];
•İki Boyutlu Dizilerin (Matris) çarpımında, çarpılacak olan iki matristen
birincisinin sütun sayısı ile ikincisinin satır sayısı birbirine eşit olmak
zorundadır. Aksi takdirde çarpma işlemi gerçekleştirilemez.
•C++ ile iki boyutlu dizilerin her bir boyutunun barındıracağı eleman
sayısı dinamik olarak tanımlanabilir.
•İki boyutlu dizilerin fonksiyonlara parametre olarak gönderilmesi tek
boyutlu dizilerin parametre olarak gönderilmesiyle hemen hemen
aynıdır.
•İki boyutlu bir dizi fonksiyonlara parametre olarak gönderilirken
dizinin iki boyutlu olduğu belirtilmeli ve ikinci boyutun eleman sayısı
mutlaka yazılmalıdır.
•Çok boyutlu diziler, iki boyutlu diziler ile sınırlı değildir. Boyutu
gerektiği kadar fazla olan dizi üretilebilir. Dizi boyutu arttıkça
kullanılan bellek logaritmik olarak artacağı için dikkatli olunması
gerekmektedir.
•Çok boyutlu dizilerde dizi elemanlarına erişim genellikle iç içe for
döngüleri ile sağlanır.
•Çok boyutlu diziler fonksiyonlara gönderilirken fonksiyon tanımında
ilk boyut dışındaki boyutlar için eleman sayısı belirtilmelidir.
DEĞERLENDİRME SORULARI
1. İki boyutlu bir dizinin toplam eleman sayısı nasıl hesaplanır?
a) Birinci boyut eleman sayısı ile ikinci boyut eleman sayısı toplanır.
b) Birinci boyut eleman sayısı ile ikinci boyut eleman sayısı çarpılır.
c) Birinci boyut eleman sayısı iki ile çarpılır.
d) İkinci boyut eleman sayısı iki ile çarpılır.
e) Birinci boyut eleman sayısının karesi ile ikinci boyut eleman sayısının
karesi toplanır.
2. int a[3][2] değişkeni ile aynı dizi değişkenini ifade eden dizi
aşağıdakilerden hangisidir?
a) int a[1][2][2];
b) int a[2][1][2];
c) int a[6];
d) int a[15];
e) int a[24];
Cevap Anahtarı
1.b, 2.c, 3.c, 4.c, 5.d, 6.a, 7.d, 8.a, 9.d, 10.e
YARARLANILAN KAYNAKLAR
[1] Pozrikidis, C. , Introduction to C++ Programming and Graphics, Springer Natural
Amerika Inc., 2007
[2] Aydın, S., Nesne Tabanlı Programlama, Yayımlanmamış ders notu, Yönetim
Bilişim Sistemleri Bölümü, Atatürk Üniversitesi, 2017
[3] Şeker, Ş. E., Çok boyutlu diziler (MultiDimensional Arrays),
http://bilgisayarkavramlari.sadievrenseker.com/2009/04/30/cok-boyutlu-
diziler-multidimensional-arrays/