C++ ÇOK BOYUTLU DİNAMİK DİZİ
C++ ile iki boyutlu dizi oluşturma. Dizinin boyutlarını ve değerlerini kullanıcının girmesini sağlamak. Kullanıcının girdiği iki matrisi çarpan ve sonucu ekrana yazdıran program.
C++ iki boyutlu diziler için gelişmiş özellikler sağlamaz. Eğer dizinin elemanları belli ve siz diziyi oluştururken bu değerleri verebiliyorsanız herhangi bir sorun çıkmaz.
Ancak dizi boyutlarını program içinde dinamik olarak almanız gerekiyorsa ve fonksiyonlarda dizi döndürülmesini istiyorsanız o zaman dinamik dizi yaratmanız gerekecektir.
Bu bölümde dinamik dizileri oluşturma ve fonksiyon içinde kullanma anlatılacak, bir sonraki bölümde iki boyutlu dizi döndüren program anlatılacaktır. Böylece iki boyutlu dizilerle ilgili tüm işlemler yapılmış olacak, aynı zamanda dinamik iki dizinin toplanması ve çarpılması anlatılmış olacaktır.
İki Boyutlu Dizi Oluşturmak
İki boyutlu diziyi oluşturan fonksiyon aşağıda verilmiştir. Burada her satır için, sütunlar bilgisayara tanıtılmaktadır.
int** NewTable(int rows, int columns)
{
int** tablo = new int*[rows];
for (int i = 0; i < rows; i++)
{
tablo[i] = new int[columns];
}
return tablo;
}
Bu şekilde bir "i" satırında, yeni elemanlar oluşacak ve bellekte bu elemanlar için yer açılacak. Bir anlamda bir boyutlu dizinin her elemanında yeni elemanlar oluşturarak 2 boyutlu dizi oluşturmuş oluyoruz. Burada amaç bellekte yer açmaktır. Böylece bellekte dizinin prototipini oluşturuyoruz ve sonrasında istediğimiz gibi kullanabiliyoruz.
Ana fonksiyonda en başta dizileri aşağıdaki gibi tanımlıyoruz.
int **Dizi1;
int **Dizi2;
int **dizi komutu, iki boyutlu bir diziyi işaret eder. Ancak henüz tanımlanmamıştır.
Sonra dizilerin boyutlarını değişken olarak belirliyoruz. Bu değişkenler dizilerin boyutları olacak.
int boyut1;
int boyut2;
int boyutx1;
int boyutx2;
Bundan sonraki iş kullanıcıdan boyutları girmesini istemek oluyor.
cout<<"1. Dizinin 1. Boyutunu Giriniz:";
cin>>boyut1;
cout<<endl;
cout<<"1. Dizinin 2. Boyutunu Giriniz:";
cin>>boyut2;
cout<<"2. Dizinin 1. Boyutunu Giriniz:";
cin>>boyutx1;
cout<<endl;
cout<<"2. Dizinin 2. Boyutunu Giriniz:";
cin>>boyutx2;
Bu boyutlara göre dizileri oluşturalım. NewTable fonksiyonunu çağırarak dizi gönderdiğimiz boyutlara göre bellekte diziyi oluşturmasını sağlıyoruz. Bu fonksiyonun en güzel özelliği istediğimiz kadar dizi oluşturabilmemiz. "NewTable" fonksiyonundaki "new int" kısımlarını "new string" olarak değiştirirseniz ve fonksiyon prototipini string yaparsanız size string dizisi oluşturur. Keza, char dizisi için de aynıdır.
Dizi1=NewTable(boyut1,boyut2);
Dizi2=NewTable(boyutx1,boyutx2);
Bundan sonraki adımlar kullanıcıdan dizi elemanlarını girmesini istemek olacaktır. Aşağıda tüm kodları verdiğimiz için burada tekrar etmeyeceğiz.
Dizileri fonksiyona aşağıdaki gibi gönderiyoruz.
MatrisCarp(Dizi1,Dizi2,boyut1,boyut2,boyutx1,boyutx2);
İki Boyutlu Diziyi Yok Etmek
İki boyutlu diziyi kullandıktan sonra bellekten atmak gerekir. Aşağıdaki fonksiyon bu dizi için bellekte ayrılan bölümü serbest bırakıyor. Yani siliyor.
void ClearTable(int** ctable, int alan)
{
if (ctable)
{
for (int k = 0; k < alan; k++)
{
if (ctable[k])
{
delete[] ctable[k];
}
}
delete[] ctable;
}
}
Matrislerin Çarpımı
Matrislerde çarpma işlemi, 1. Matrisin satırı ile 2. Matrisin sütunlarını çarpma işlemidir. Örnek olarak; 1. Matrisin 1 satırındaki her elemanı, 2. Matrisin 1. Sütunundaki her eleman ile karşılıklı çarpar ve bu çarpımları toplarız. Böylece Çarpım matrisinin 1. Satır, 1. Sütununu oluşturmuş oluruz.
Aşağıda kullanıcıdan iki dizi alan ve bunları çarparak sonucu ekrana yazdıran program kodları yer almaktadır.
#include <iostream>
using namespace std;
int **Dizi1;
int **Dizi2;
int boyut1;
int boyut2;
int boyutx1;
int boyutx2;
int Z =0;
int **NewTable(int,int);
void ClearTable(int**,int);
void MatrisCarp(int**, int**, int, int, int, int);
int main()
{
cout<<"1. Dizinin 1. Boyutunu Giriniz:";
cin>>boyut1;
cout<<endl;
cout<<"1. Dizinin 2. Boyutunu Giriniz:";
cin>>boyut2;
cout<<"2. Dizinin 1. Boyutunu Giriniz:";
cin>>boyutx1;
cout<<endl;
cout<<"2. Dizinin 2. Boyutunu Giriniz:";
cin>>boyutx2;
Dizi1=NewTable(boyut1,boyut2);
Dizi2=NewTable(boyutx1,boyutx2);
for(int l=0;l<boyut1;l++)
{
for(int r=0;r<boyut2;r++)
{
Z++;
cout<<"1. Dizinin "<<Z<<" . ci elemanini Giriniz: ";
cin>>Dizi1[l][r];
cout<<endl;
}
}
Z=0;
for(int q1=0;q1<boyutx1;q1++)
{
for(int q2=0;q2<boyutx2;q2++)
{
Z++;
cout<<"2. Dizinin "<<Z<<" . ci elemanini Giriniz: ";
cin>>Dizi2[q1][q2];
cout<<endl;
}
}
if(boyut2!=boyutx1)
{
cout<<"1. Matrisin Sutun Sayisi, 2. Matrisin Satir Sayisina Esit Degildi";
}
else
{
MatrisCarp(Dizi1,Dizi2,boyut1,boyut2,boyutx1,boyutx2);
}
cin.get();
cin.get();
}
void MatrisCarp(int **dizi1,int **dizi2, int b1, int b2, int c1, int c2)
{
int sonuc=0;
int mtrx1=0;
int mtrx2=0;
int **CarpimDizi = NewTable(b1,c2);
for(int i=0;i<b1;i++)
{
for(int k=0;k<b2;k++)
{
for(int c=0;c<b2;c++)
{
mtrx1=dizi1[i][c];
mtrx2=dizi2[c][k];
sonuc+=mtrx1*mtrx2;
}
CarpimDizi[i][k]=sonuc;
sonuc=0;
}
}
cout<<endl;
cout<<"***********************"<<endl;
cout<<"GIRDIGINIZ MATRISLERIN CARPIMI"<<endl;
for(int x1=0;x1<b1;x1++)
{
for(int x2=0;x2<b2;x2++)
{
cout<<CarpimDizi[x1][x2]<<" ";
}
cout<<endl;
}
ClearTable(CarpimDizi,b1);
ClearTable(dizi1,b1);
ClearTable(dizi2,c1);
}
int** NewTable(int rows, int columns)
{
int** tablo = new int*[rows];
for (int i = 0; i < rows; i++)
{
tablo[i] = new int[columns];
}
return tablo;
}
void ClearTable(int** ctable, int alan)
{
if (ctable)
{
for (int k = 0; k < alan; k++)
{
if (ctable[k])
{
delete[] ctable[k];
}
}
delete[] ctable;
}
}
Windows Form Tablo Yapımı
SANATSAL BİLGİ
17/04/2019