100 Random Elemanlı Dizi Oluşturup Sıralıyan C++ Programı
Bu yazıda 2 boyutlu bir dizi üzerinde fonksiyonları kullanarak;
diziyi yazdıran
random sayılar atayan
satır ve sütunlarının yerini değiştiren ve
diziyi sıralayan bir proje yapacağız.
Kodun tamamı sayfanın en altındadır. ilk olarak kullanacağımız fonksiyonları teker teker anlayalım ;
2 Boyutlu Diziyi Yazdıran Fonksiyon
[10][10]’luk bir dizi düşünelim;
İlk for döngüsü bize 0’dan 9’a kadar giden bir “i” veriyor.
İkinci for döngüsü ise yine 0’dan 9’a kadar giden bir “j” veriyor.
Bizde fotoğraftaki turuncu yazıdaki gibi 100 elemanlı diziyi [i][j] yardımı ile yazdırıyoruz.
void printArray(int m[][10], int size) //main() içinde yazarken printArray(myArray,10);
{
for(int i=0;i<size;i++)
{
for(int j=0;j<10;j++)
cout<<setw(4)<<m[i][j];
cout<<endl;
}
cout<<"___________________________________________"<<endl;
}
2 Boyutlu Diziye Random Sayılar Atayan Fonksiyon
Aynı printArry deki gibi bir for döngüsü kullanarak her bir elemana ulaşıyoruz.
Ardından rand() ile ulaştığımız elemana random bir sayı yerleştiriyoruz.
Fakat c++ dilinde random sayılar çok fazla basamaklı üğretilirler ,biz sadece 1 ile 100 basamaklar arasında sayı üğretmek istediğimiz için
Önce yeni oluşan random sayıyı 100’e bölüp kalanını alıyoruz(modunu alıyoruz) modunu aldığımız için 0 ile 99 arasında bir sayı oluşmuş oluyor.
1 ekliyerek 1 ile 100 arasında random bir sayı oluşturmuş oluyoruz.
void fillArray(int m[][10], int size) //main() içinde yazarken fillArray(myArray,10);
{
srand(time(0));
for(int i=0;i<size;i++)
{
for(int j=0;j<10;j++)
m[i][j]=rand()%100+1;
}
}
2 Boyutlu Dizinin Satır ve Sütunlarının Yerini Değiştiren Fonksiyon
Oluşturduğumuz iki for döngüsü ile hem “i” değerini hem de “j” değerini 0 dan 10a kadar götüren bir döngü yapıyoruz.
Yukarıdaki fotoğrafta da göründüğü gibi bu döngü sayesinde tüm elemanlara ulaşmış oluyoruz.
Ulaştığımız elemanların [i] ve [j] lerini değiştirmek de aslında satır ve sutunu değiştirmemizi sağlıyor.
Temp değişkeni ile geçici olarak değeri tutuyor ve atamalarımızı gerçekleştiriyoruz.
! Eğer bir elemanın satırı ve stunu aynı ise (örn 00 11 22 …) bu işlem yine gerçekleşiyor fakat eleman olduğu yere bir daha atanmış oluyor
void transposeArray(int m[][10], int size) //main() içinde yazarken transposeArray(myArray,10);
{
int temp;
for(int i=0;i<10;i++)
{
for(int j=1+i;j<10;j++)
{
temp=m[i][j];
m[i][j]=m[j][i];
m[j][i]=temp;
}
}
}
2 Boyutlu Diziyi Sıralayan Fonksiyon
fonksyon karışık olduğu için öncelikle sadece for döngüsünü inceleyelim;
Bu sefer önceki döngülerimizdeki gibi iki değer oluşturup (i ve j) üzerinden işlem yapmayacağız
İlk döngümüz 0 dan 99’a kadar giden klasik bir for döngüsü ve aslında bize kaçıncı kez sayıyı sıraladığımızı veriyor. (örnek i=5 ise bundan önce 5 büyük sayı dizenin sonuna atılmış)
İkinci döngümüz ise;
Bu döngünün içerisinde aslında her seferinde büyük olan sayının sağa kaydığı bir kod yazılı–(turuncu renk ile gizlenen kodlar)
Fakat bir dizeyi küçükten büyüğe sıralarken zaten sıralanmış sayıları kontrol etmemize gerek yoktur. O yüzden ilk döngüdeki
sayıyı ikinci for döngüsünden çıkararak (int j=0;j<size*10-1-i;j++) daha önce sıralanmış elemanların yeniden kontrol edilmesini engelliyoruz.
Şimdi ise nasıl elemanların yerini değiştirdiğimizi açıklayalım:
Başta da dediğimiz gibi bu fonksiyon içerisinde i ve j’yi hesapladığımız bir bölüm yok o yüzden bunu 0 dan 99 a kadar giden sayılar ile üretmeliyiz.
Bunu şu şekilde yapabiliriz
Fotoğraftaki turuncu çizimdeki gibi 0 dan 99 a kadar giderken 35. sayıyı ele alalım.
Fotoğraftaki mor çizimdeki gibi 35 sayısı aslında dizinin de [3][5] inci elemanı (! eğer [4][6] olması gerektiğini düşünüyorsanız unutmayın ki diziler 0 dan başlayarak sayar yani [0][0] dan başlar)
Peki 35 sayısından [3] ve [5]i nasıl üretebiliriz Fotoğrafta da örneği olduğu gibi 10’a bölerek sütununu 10 ile modunu alaraktan satırını bulabiliriz.
İşlemler
35 ‘i x1 = 3 y1 = 5 olmak üzere [x1][y1]
35+1 = 36 ile x2 = 3 y2 = 6 olmak üzere [x2][y2]
if ile bu iki değeri karşılaştırıyoruz ve büyük olanın (aynı reversArray deki gibi bir temp değişkeniyle) yerini değiştiriyoruz.
void sortArray(int m[][10], int size) //main() içinde yazarken sortArray(myArray,10);
{
int temp,x1,x2,y1,y2;
for(int i=0;i<10*size-1;i++)
{
for(int j=0;j<size*10-1-i;j++)
{
x1=j/10;
x2=(j+1)/10;
y1=j%10;
y2=(j+1)%10;
if(m[x1][y1]>m[x2][y2])
{
temp=m[x1][y1];
m[x1][y1]=m[x2][y2];
m[x2][y2]=temp;
}
}
}
}
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <iomanip>
using namespace std;
/*
Bu bölüm kafa karıştırabilir
c++ dilinde fonksiyonların main() den önce tanımlanmış olması gerekir
bu sebepten ötürü burada tanımlamalarımızı yapıyoruz
*/
void printArray(int m[][10], int size);
void fillArray(int m[][10], int size);
void sortArray(int m[][10], int size);
void transposeArray(int m[][10], int size);
int main()
{
int myArray[10][10];//Yeni bir dizi oluşturdu
fillArray(myArray,10);//Diziye random sayılar atıyor
printArray(myArray,10);//Diziyi yazdırıyor
sortArray(myArray,10);//Dizideki elemanları sıraya sokuyor
printArray(myArray,10);
transposeArray(myArray,10);//Satır ve stunların yerini değiştiriyor
printArray(myArray,10);
return 0;
}
/* kodun devamı yazının üst kısmında anlatılmıştır */
void printArray(int m[][10], int size)
{
for(int i=0;i<size;i++)
{
for(int j=0;j<10;j++)
cout<<setw(4)<<m[i][j];
cout<<endl;
}
cout<<"___________________________________________"<<endl;
}
void fillArray(int m[][10], int size)
{
srand(time(0));
for(int i=0;i<size;i++)
{
for(int j=0;j<10;j++)
m[i][j]=rand()%100+1;
}
}
void sortArray(int m[][10], int size)
{
int temp,x1,x2,y1,y2;
for(int i=0;i<10*size-1;i++)
{
for(int j=0;j<size*10-1-i;j++)
{
x1=j/10;
x2=(j+1)/10;
y1=j%10;
y2=(j+1)%10;
if(m[x1][y1]>m[x2][y2])
{
temp=m[x1][y1];
m[x1][y1]=m[x2][y2];
m[x2][y2]=temp;
}
}
}
}
void transposeArray(int m[][10], int size)
{
int temp;
for(int i=0;i<10;i++)
{
for(int j=1+i;j<10;j++)
{
temp=m[i][j];
m[i][j]=m[j][i];
m[j][i]=temp;
}
}
}
Anlamadığınız bir yer varsa aşağıdaki bölümden soru sorabilirsiniz.