Array (Dizi)
Hafızada dil tarafından ardışık olarak tutulan özdeş bölümlere verilen isimdir.
Yani basitçe bir değişken tek bir bilgi birimi tutabilirken bu değişkenlerden birden fazla adışık uniteye ihtiyaç duyulursa dizi tanımlanabilir.
C/C++ dilindeki örnek integer dizi tanımı:
int a[10]; /* 10 elemanlık bir dizi tanımla */
for(int i = 0 ; i< 10 ; i++) /* 0'dan 10'a kadar dönen bir döngü oluştur */
a[i]=i; /* a dizisinin i. elemanına i değerini koy */
Aynı kod JAVA dilinde yazılırsa
int a[] = new int [10]; /* 10 elemanlık bir dizi tanımla */
for(int i = 0 ; i< 10 ; i++) /* 0'dan 10'a kadar dönen bir döngü oluştur */
a[i]=i; /* a dizisinin i. elemanına i değerini koy */
şeklinde c/c++ yazımına oldukça benzeyen bir görüntü sergiler.
Ve her iki dilde de yazılan kodun hafızadaki görüntüsü aşağıdaki şekildedir:
1 2 3 4 5 6 7 8 9
Diziler (Arrays), hafızada row major order veya column major order olarak tutulabilirler.
Dizilerin ayrıca ilk değeri atarnırken aşağıdaki şekilde yazılabilir:
int a[] = { 2, 3, 9, 8, 15, -6};
Yukarıdaki bu tanımlama sonucunda dizinin indisleri ile birlikte görüntüsü şu şekildedir:
Yukarıdaki dizide de dikkat edilirse, dizinin başlangıç indisi 0’dır. Dolayısıyla boyutu örneğin 5 olan bir dizinin en son erişilebilecek elemanı 4’tür. Yukarıdaki bu örnek dizi için erişim aşağıdaki şekilde yapılabilir:
a[0] = 2;
a[3] = 8; // düzeltildi (Fatih Bey’e teşekkürler)
a[5] = -6;
yukarıda örnekleri verilen eşitlikler rastgele seçilmiştir ve bu şekilde dizinin istenen elemanına erişilebilir. Örneğin C dilinde :
printf(“%d”,a[3]);
yazılması halinde a dizisinin 3. elemanına erişilmiş olur ve örneğin yukarıdaki örnek dizi için bu değer ekrana 8 basılmasıdır.
Dizilerde yer değiştirme işlemi (Swap).
Dizilerde farklı adresteki değerlerin yer değiştirmesi işlemine takas (swap) adı verilir. Örneğin yukarıdaki dizide a[3] ile a[5] elemanlarının yer değiştirmesi sonucunda, dizideki verilerin diziliminin aşağıdaki şekilde olması beklenir:
2 3 9 -6 15 8
Görüldüğü üzere dizinin 5. elemanı olan -6 ile 3. elemanı olan 8 yer değiştirmişlerdir. Bu yer değiştirme işlemi sırasında aşağıdakine benzer bir kodun yazılması gerekir:
int temp = a[3]; // dizinin 3. elemanının üzerine yazmadan farklı bir yere kopyalıyoruz
a[3] = a[5]; // şimdi üzerine yazabiliriz.
a[5] = temp; // yer değiştirme tamamlandı
Yukarıdaki bu durum dolu iki kabın içindekileri değiştirmek için 3. bir kaba ihtiyaç duyulmasına benzetilebilir. Önce kaplardan birisi 3. kaba boşaltılır ardından diğer kaptaki veri, boş kaba konulup, 3. kaptaki veri ise yeni boşalan kaba konulur. Sonuçta iki kaptaki veri yer değiştirmiş olur.
Dizideki en küçük sayıyı başa koyan kod
Yukarıdaki takas işlemi (swap) pekçok yerde kullanılmaktadır. Bunlardan birisi de öne eklemeli sıralama (insert front sort) algoritmasıdır. Bu algoritmada, dizideki en küçük sayı bulunup dizinin başına konulmaktadır. Elbette dizinin başındaki sayı da en küçük sayının bulunduğu indise konulmaktadır. Algoritmanın detayı için ilgili yazı okunabilir ancak bu yazı içerisinde sadece en küçük sayıyı bulup dizinin başındaki sayı ile takaslayan (yer değiştiren) kodu yazıp inceleyelim:
Yukarıdaki kodun ilk satırında anlık olarak elimizdeki en küçük değer 0. indiste kabul edilmektedir. Amacımız dizide daha küçük bir sayıyı arayıp bulmaktır. Buradaki min değerinin gösterdiği adreste bulunan dizi değeri ile dizinin bütün elemanları karşılaştırılır. Kodun 5. satırındaki koşulu sağlayan ve bizim en küçük kabul ettiğimiz dizi değerinden daha küçük bir eleman bulununca, artık elimizdeki en küçük elemanın bu yeni küçük elemanın bulunduğu adreste olduğu kabul edilerek min değişkeni bu yeni küçük elemanın bulunduğu indisi tutar.
Bu işlem dizi sonuna kadar tekrar edilir ve kodun 10-12. satırları arasında bulunan bu adresteki değer dizinin 0. elemanı (yani ilk elemanı) ile takaslanır.
Burada görüldüğü üzere dizideki en küçük sayıyı bir değişkende tutmak yerine, dizideki en küçük sayının bulunduğu indisi bir değişkende tutuyoruz. Bu sayede en küçük sayının nerede bulunduğunu biliyor ve dizinin başındaki sayı ile yer değiştirirken hangi indisteki değere, dizinin eskiden ilk elemanı olan sayının konulacağını bulmuş oluyoruz.
for(int j=0;j<5;j++){
int indis=j;
int ek=a[j];
for(int i=j;ia[i]){
.Hocam dizilerde yer değiştirme kodunu yazarken bu kısımdaki bolum kafama takıldı.ozellikle indis kısmını neden yazmıştık?gorevi nedir?Simdiden teşekkur ederim iyi calısmalar..
ek=a[i];
indis=i;
peki yukarıda a[3] icin ucuncu elemanına ulasılır yazıyor.saymaya 0 dan basladıgımızda a[3] tabloda da belirtildigi gibi veri değeri 8 olmazmı?
int a[5];
for(int i=0;i<5;i++){
scanf("%d",&a[i]);
}
for(int j=0;j<5;j++){
int indis=j;
int ek=a[j];
for(int i=j;ia[i]){
ek=a[i];
indis=i;
}
}
int temp=a[j];
a[j]=ek;
a[indis]=temp;
Hocam bu kodu daha sade sekilde de yazabilirmiyiz?
for(int j=0;j<5;j++){
int indis=j;
int ek=a[j];
for(int i=j;ia[i]){
ek=a[i];
indis=i;
hocam ve kodun bu parcası sadece kucuk elemanı bulmayamı yarıyo yoksa aynı zamanda yer değiştirme işleminide icinde barındırıyormu?
int temp=a[j];
a[j]=ek;
a[indis]=temp;
hocam bu kodda son olarak kucuk bişe daha sormak istiyorum,bu yerdeğiştirme bolumunde hangi iki materyal yer değişmiştir?
Sırasıyla cevaplarınız:
1. Yazıdada açıklamaya çalıştım, indis, dizideki en küçük elemanın bulunduğu adresi tutmaya yarıyor.
2. Haklısınız a[3]=8 olmalı, yazıda ilgili düzeltmeyi yaptım.
3. kodun sadeliğinden neyi kastettiğinizi bilmiyorum ancak her hal-ü kârda iç içe en az iki döngü bulunmalıdır. Bu da algoritma karmaşıklığı açısından birşeyin değişmeyeceği anlamına gelir.
4. verdiğiniz koddaki iki döngü hiçbir işe yaramıyor, hatalı. Doğrusu yukarıdaki yazıda bulunuyor ve yukarıdaki yazıda bulunan “min” değişkeni veya sizin hatalı da olsa vermeye çalıştığınız “indis” değişkeni, dizideki en küçük sayının indisini (Adresini) tutmaya yarıyor.
5. ek, dizideki en küçük sayının değerini, indis de en küçük sayının adresini tutmak şartıyla, verdiğiniz kod, dizideki j. elemanı en küçük elemanla yer değiştirir. j değerinin döngü değişkeni olduğunu kabul edersek, dizideki en küçük sayıyı, sıradaki sayı ile yer değiştirir.
peki 100 elemanlı bir dizi olsun. 1-100 arası sayılar olsun bu dizide. Sıralı değil karışık. Herhangi bir sayı çıkarttım. hangi sayıyı çıkardığımı nasıl buluruz?
iki dizi üzerinde dönen tek bir döngü ile sayıları sırası ile karşılaştırınız.
hocam bir sorum olucak çok uğraştım yapamadım
Soru:
10 elemanlı X dizisinin en büyük en küçük elemanlarının yerini değiştiriniz.
Merhabalar Sadi bey size bir kaç sorum olucak cevaplarsanız sevinirim.
Her elemanı A(4,3) dizisinin satır elemanlarının en büyüğü olan B dizisini oluşturunuz.
A(4,3) dizisinin elemanlarının toplamını bulunuz. Dizinin tüm elemanlarını bu toplama bölerek yeni B(4,3) dizisini oluşturun.
100 ve 400 arasında 3ün veya 5 in katı olan sayıların listesini oluşturan programı yazar mısınız lütfen
hocam array(dizi) youtube videosunda ilk 20 fibonacci sayısını hesaplayarak diziye yerleştiren program yazınız. dediğiniz kodda hata var hocam bilginize sunarım a[i]=a[i-1]+a[i-2]; sonra printf kodu gelmesi gerekiyor hocam.aşağıdaki gibi;
printf(“a[%d] = %d \n”,i,a[i]);
Bilgileriniz ışık oluyor bize hocam herşey için teşekkürler. 🙂