Bölüm 5: Diziler

Bölüm 5: Diziler · Çalışma Soruları
İndis ve lengthTanımlamaReferanslarSınır dışı hatasıOrtalama, ortanca, modSeçimli sıralamaTersine çevirmeÇok boyutlu dizilerTranspozTic Tac Toe
Sercan KÜLCÜ

Çoktan Seçmeli · Dizi Kavramı

Soru 1: İndis Aralığı

int[] a = new int[8]; ile oluşturulan dizi için geçerli indis aralığı ve a.length nedir?

B: İndis 0'dan başlar, son indis length − 1'dir; length hücre sayısıdır. A 1'den sayar, C son indisi length sanır (a[8] sınır dışıdır), D hücre sayısını son indisle karıştırır.

Çoktan Seçmeli · Java'da Diziler

Soru 2: Hangisi Derlenir?

Aşağıdaki dizi tanımlarından hangisi derlenir?

D: Uzun biçim new int[]{…} her yerde kullanılabilir. A'da hem boyut hem liste verilmiştir: array creation with both dimension expression and initialization is illegal. B'deki kısa biçim yalnızca tanımlamada geçerlidir (illegal start of expression). C, C dilinin söz dizimidir; Java'da boyut tipte yazılmaz.

Çoktan Seçmeli · Java'da Diziler

Soru 3: continue ile Atlama

Program ne yazdırır?

static void yazdir(int[] dizi) {
  for (int i = 1; i < dizi.length; i++) {
    if (dizi[i] % 2 == 0)
      continue;
    System.out.print(dizi[i] + ",");
  }
  System.out.println();
}
// main içinde
yazdir(new int[]{5, 7, 10, 13, 12,
                 9, 9, 21, 22, 11});

C: continue turun kalanını atlar ve sıradaki i'ye geçer: çift öğeler (10, 12, 22) yazılmaz, döngü sürer. Döngü i = 1'den başladığı için ilk öğe 5 hiç denetlenmez (D). A break davranışıdır: ilk çift öğede (10) döngü biterdi. B koşulu öğeye değil indise uygular (i % 2 == 0).

Çıktı Sorusu · Java'da Diziler

Soru 4: Varsayılan Değerler ve for-each

Program ne yazdırır? (java.util.Arrays içe aktarılmıştır.)

double[] d = new double[2];
boolean[] b = new boolean[2];
String[] s = new String[2];
char[] c = new char[3];
System.out.println(d[0] + " " + b[1]
    + " " + s[0]);
System.out.println(c.length + d.length);
int[] x = {5, 6, 7};
for (int v : x) {
  v = v * 2;
}
System.out.println(Arrays.toString(x));
Cevabı göster
0.0 false null
5
[5, 6, 7]

new ile oluşturulan dizinin hücreleri varsayılan değer alır: double 0.0, boolean false, referans tipleri null.

İkinci satırda iki int toplanır: 3 + 2 = 5 (birleştirme yoktur, çünkü iki yan da sayıdır).

for-each değişkeni v öğenin kopyasıdır; v'ye yazmak hücreyi değiştirmez. Diziye yazmak için klasik for ve x[i] = x[i] * 2 gerekir.

Çıktı Sorusu · Java'da Diziler

Soru 5: Referans mı, Kopya mı?

Program ne yazdırır? Sonunda hangi değişken hangi diziyi gösterir?

int[] a = {1, 2, 3};
int[] b = a;
b[0] = 9;
int[] c = Arrays.copyOf(a, 4);
c[1] = 7;
a = c;
a[2] = 5;
System.out.println(Arrays.toString(b));
System.out.println(Arrays.toString(c));
System.out.println((a == c) + " " + (a == b));
Cevabı göster
[9, 2, 3]
[9, 7, 5, 0]
true false
yığınabcheap9239750ilk dizikopya

b = a yeni dizi oluşturmaz: b[0] = 9 ilk diziyi değiştirir. Arrays.copyOf(a, 4) yeni ve 4 hücreli bir dizi üretir (fazla hücre 0). a = c sonrası a kopyayı gösterir; a[2] = 5 artık kopyaya yazar, b'nin gösterdiği ilk dizi [9, 2, 3] kalır.

Adım Adım Çalıştırma · Java'da Diziler

Soru 6: Atlayarak Gezinme

Döngünün güncelleme ifadesi i++ değil, i += i. Hangi indisler okunur, program ne yazdırır?

50711021331249596217228119

Döngü 1'den başlar ve i += i ile her turda i = i + i olur: indis iki katına çıkar.

5071i1021331249596217228119

i = 1: dizi[1] = 7 yazılır; indis 0'daki 5 hiç okunmaz.

5071102i1331249596217228119

i = 1 + 1 = 2: dizi[2] = 10.

5071102133124i9596217228119

i = 2 + 2 = 4: indis 3 atlanır, dizi[4] = 12.

50711021331249596217228i119

i = 4 + 4 = 8: dizi[8] = 22.

50711021331249596217228119

i = 16: 16 < 10 yanlış, döngü biter. 10 öğeden yalnızca 4'ü okundu. Döngü i = 0'dan başlasaydı 0 + 0 = 0 olur, döngü hiç bitmezdi.

int[] dizi = {5, 7, 10, 13, 12, 9, 9, 21, 22, 11};
for (int i = 1; i < dizi.length; i += i) {
  System.out.print(dizi[i] + ",");
}
System.out.println();

Çoktan Seçmeli · Bellek ve Hatalar

Soru 7: <= ile Döngü

Bu kod çalıştırılınca ne olur?

int[] d = new int[4];
for (int i = 1; i <= d.length; i++) {
  d[i] = i;
}

C: i = 1, 2, 3 için hücreler yazılır; d[0] hiç yazılmaz, 0 kalır. i = 4'te 4 <= 4 doğrudur ve d[4] erişimi istisna fırlatır. Derleyici indis değerlerini denetlemez (B); Java, C'nin aksine sınır dışı erişimi sessizce geçmez (D). Doğru kalıp: for (int i = 0; i < d.length; i++).

Çoktan Seçmeli · Bellek ve Hatalar

Soru 8: Erişilemeyen Dizi

Bu dört satırdan sonra ilk oluşturulan 1000 öğeli dizi için hangisi doğrudur?

int[] p = new int[1000];
int[] q = p;
p = new int[5];
q = null;

A: Dizi heap'tedir; p yeni diziye bağlandı, q null oldu, ilk diziye ulaşan referans kalmadı. Böyle bir nesneyi çöp toplayıcı temizleyebilir; ne zaman temizleyeceği belirsizdir. Dizinin boyutu değişmez (B), null atamak silmez (C), diziler yığında değil heap'te durur (D).

Çıktı Sorusu · İstatistik Örnekleri

Soru 9: Ortalama ve Ortanca

Program ne yazdırır? Doğru ortalama ve ortanca kaç olmalıydı; kod nasıl düzeltilir?

int[] dizi = {7, 3, 9, 5, 1, 4};
int toplam = 0;
for (int x : dizi) {
  toplam += x;
}
double ortalama = toplam / dizi.length;
Arrays.sort(dizi);
int n = dizi.length;
double ortanca =
    (dizi[n / 2 - 1] + dizi[n / 2]) / 2;
System.out.println(ortalama + " " + ortanca);
System.out.println(Arrays.toString(dizi));
Cevabı göster
4.0 4.0
[1, 3, 4, 5, 7, 9]

toplam = 29. 29 / 6 iki int arasında tam sayı bölmesidir: 4; sonuç double'a atanınca 4.0 olur. Ortanca: n = 6 çift, ortadakiler dizi[2] = 4 ve dizi[3] = 5; (4 + 5) / 2 yine tam sayı bölmesi: 4.

Doğrusu ortalama 4.833…, ortanca 4.5: toplam / (double) dizi.length ve (dizi[n / 2 - 1] + dizi[n / 2]) / 2.0. Arrays.sort diziyi yerinde sıraladığı için son satır sıralı diziyi yazar.

Adım Adım Çalıştırma · İstatistik Örnekleri

Soru 10: Mod: Seri Sayma

Sıralanmış dizide mod (en sık değer) seriler sayılarak bulunuyor. Her turdan sonra mevcut seri ve en uzun seri nedir, program ne yazdırır?

202162636495en uzun seri

Başlangıç: ilk öğe hem mevcut seri hem en uzun seri sayılır (uzunluk 1).

202162636495ien uzun seri

dizi[1] == dizi[0]: seri uzar (2). 2 > 1 olduğu için en uzun seri güncellenir.

202162636495ien uzun seri

6 ≠ 2: yeni seri başlar, mevcut = 6, sayı 1. 1 > 2 değil.

202162636495ien uzun seri

Seri 2 oldu ama 2 > 2 yanlış: eşitlikte ilk bulunan (2) korunur.

202162636495ien uzun seri

Seri 3: 3 > 2 → en sık değer artık 6.

202162636495ien uzun seri

9 yeni bir seri başlatır; en uzun seri değişmez.

202162636495en uzun seri

Döngü biter. Tek geçiş yeter, çünkü sıralama eşit değerleri yan yana getirmiştir: O(n log n) sıralama + O(n) tarama.

int[] dizi = {2, 2, 6, 6, 6, 9}; // sıralı
int enCok = dizi[0], enCokSayi = 1;
int mevcut = dizi[0], mevcutSayi = 1;
for (int i = 1; i < dizi.length; i++) {
  if (dizi[i] == dizi[i - 1]) {
    mevcutSayi++;
  } else {
    mevcutSayi = 1;
    mevcut = dizi[i];
  }
  if (mevcutSayi > enCokSayi) {
    enCokSayi = mevcutSayi;
    enCok = mevcut;
  }
}
System.out.println("Mod: " + enCok + " (" + enCokSayi + ")");

Adım Adım Çalıştırma · Dizi Algoritmaları

Soru 11: Adı Anlamsız Metot

foo(new int[]{7, 3, 9, 2, 1, 5}) ne yazdırır? Metot ne iş yapar?

70abc3192231455

abc bir indis tutar: başlangıçta 0, yani 7'yi gösterir.

i7031abc92231455

3 < 7: abc = 1.

i7031abc92231455

9 < 3 yanlış: değişiklik yok.

i70319223abc1455

2 < 3: abc = 3.

i7031922314abc55

1 < 2: abc = 4.

i7031922314abc55

5 < 1 yanlış. i = 6'da döngü biter.

7031922314abc55

Yazılan en küçük değer (1) değil, onun indisi: 4. Metot en küçük öğenin indisini bulur; abc yerine minIndis, foo yerine enKucukIndis gibi adlar kodu kendini anlatır hâle getirir.

static void foo(int[] dizi) {
  int abc = 0;
  for (int i = 1; i < dizi.length; i++) {
    if (dizi[i] < dizi[abc]) {
      abc = i;
    }
  }
  System.out.println(abc);
}

Çoktan Seçmeli · Dizi Algoritmaları

Soru 12: Seçimli Sıralamada Karşılaştırma

Seçimli sıralama 6 öğeli bir dizide iç döngüde toplam kaç kez dizi[j] < dizi[minIndeks] karşılaştırması yapar? Başlangıç sırası bu sayıyı etkiler mi?

B: Turlar 5 + 4 + 3 + 2 + 1 = n(n − 1) / 2 = 15 karşılaştırma yapar; iç döngü her girdide sonuna kadar döner. Girdiye göre değişen yalnızca minIndeks güncellemelerinin sayısıdır. A n² sayar; C ekleme sıralamasının davranışıdır. Karmaşıklık her durumda O(n²).

Adım Adım Çalıştırma · Dizi Algoritmaları

Soru 13: Seçimli Sıralama İzleme

secimliSirala(new int[]{29, 10, 14, 37, 13}) çağrısı her turun sonunda ne yazdırır?

290101142373134

Metoda dizinin referansı gelir: yapılan takaslar çağıranın dizisini değiştirir.

100291142373134takassıralı kısım

i = 0: indis 1…4 taranır, en küçük 10 (indis 1). dizi[0] ile takas.

100131142373294takassıralı kısım

i = 1: kalan [29, 14, 37, 13] içinde en küçük 13 (indis 4). 29 ile yer değiştirir.

100131142373294kendisiylesıralı kısım

i = 2: 14 zaten en küçük; minIndeks = i kalır, takas kendisiyle yapılır, dizi değişmez.

100131142293374takassıralı kısım

i = 3: 29 < 37, takas. Dış döngü length − 1 = 4 tur döner: son öğe kendiliğinden yerindedir.

static void secimliSirala(int[] dizi) {
  for (int i = 0; i < dizi.length - 1; i++) {
    int minIndeks = i;
    for (int j = i + 1; j < dizi.length; j++) {
      if (dizi[j] < dizi[minIndeks]) {
        minIndeks = j;
      }
    }
    int gecici = dizi[minIndeks];
    dizi[minIndeks] = dizi[i];
    dizi[i] = gecici;
    System.out.println(Arrays.toString(dizi));
  }
}

Hata Bulma · Dizi Algoritmaları

Soru 14: Tersine Çevirmede Hata

Metot {1, 2, 3, 4, 5} dizisini tersine çevirmek için yazıldı. ters(a) sonrası Arrays.toString(a) ne yazdırır? Hata nerede?

static void ters(int[] d) {
  for (int i = 0; i < d.length; i++) {
    int g = d[i];
    d[i] = d[d.length - 1 - i];
    d[d.length - 1 - i] = g;
  }
}
Cevabı göster
[1, 2, 3, 4, 5]

Döngü dizinin tamamını dolaşır: i = 0 ve 1'de uçlar takas edilir ([5, 4, 3, 2, 1]), i = 2 ortadaki öğeyi kendisiyle takas eder, i = 3 ve 4 aynı çiftleri yeniden takas eder ve dizi eski hâline döner.

Düzeltme: yalnızca dizinin yarısı dolaşılır.

for (int i = 0; i < d.length / 2; i++) {

Çıktı [5, 4, 3, 2, 1] olur; 4 öğeli dizide de doğru çalışır ([4, 3, 2, 1]). n / 2 takas: O(n).

Çoktan Seçmeli · Dizi Algoritmaları

Soru 15: Metoda Dizi ve int Geçirmek

Program ne yazdırır?

static void f(int[] d, int x) {
  d[0] = x;
  d = new int[]{0, 0};
  d[1] = x;
  x++;
}
// main içinde
int[] a = {1, 2};
int k = 5;
f(a, k);
System.out.println(a[0] + " " + a[1] + " " + k);

D: Java her şeyi değerle geçirir: d referansın kopyasıdır, x sayının kopyasıdır. d[0] = x asıl diziyi değiştirir (5). d = new int[]{0, 0} yalnızca yerel kopyayı yeni diziye bağlar; d[1] = x o yeni diziye yazar. x++ de k'yi etkilemez.

Çıktı Sorusu · Çok Boyutlu Diziler

Soru 16: Düzensiz Dizi

Program ne yazdırır?

int[][] m = new int[3][];
for (int i = 0; i < m.length; i++) {
  m[i] = new int[i + 2];
  for (int j = 0; j < m[i].length; j++) {
    m[i][j] = i * j;
  }
}
int t = 0;
for (int[] satir : m) {
  t += satir[satir.length - 1];
}
System.out.println(m[2].length + " " + t);
System.out.println(Arrays.toString(m[1]));
Cevabı göster
4 8
[0, 1, 2]
m[0]00m[1]012m[2]0246son öğeler: 0 + 2 + 6

new int[3][] yalnızca üç satır referansı (null) oluşturur; satırlar döngüde 2, 3 ve 4 uzunlukta ayrılır. İç döngüde m[i].length kullanıldığı için her satır kendi uzunluğunca dolar. for-each'in öğesi bir int[] satırdır; son öğeleri toplamı 0 + 2 + 6 = 8.

Çoktan Seçmeli · Çok Boyutlu Diziler

Soru 17: Satır ve Sütun Sayısı

Program ne yazdırır?

int[][] m = {{1, 2, 3}, {4, 5, 6}};
System.out.println(m.length + " "
    + m[1].length + " " + m[1][0]);

C: 2B dizi dizilerin dizisidir: m.length satır sayısı (2), m[1] ikinci satır ve uzunluğu 3, m[1][0] ikinci satırın ilk öğesi 4. A ve D satır ile sütunu karıştırır; B m[1][0]'ı ilk satırdan okur.

Adım Adım Çalıştırma · Çok Boyutlu Diziler

Soru 18: Transpoz İzleme

2×3 matrisin transpozu hücre hücre kopyalanıyor. Her adımda hangi hücre yazılır, program ne yazdırır?

m (2×3)t (3×2)123456000000

t 3 satır, 2 sütun olarak oluşturulur: satır sayısı asıl matrisin sütun sayısıdır. Hücreler 0.

m (2×3)t (3×2)123456100000

m[0][0] = 1 → t[0][0].

m (2×3)t (3×2)123456102000

m[0][1] = 2 → t[1][0]: indisler yer değiştirir.

m (2×3)t (3×2)123456102030

m[0][2] = 3 → t[2][0]. m'nin ilk satırı t'nin ilk sütunu oldu.

m (2×3)t (3×2)123456142030

i = 1: m[1][0] = 4 → t[0][1].

m (2×3)t (3×2)123456142530

m[1][1] = 5 → t[1][1] (köşegen yerinde kalır).

m (2×3)t (3×2)123456142536

m[1][2] = 6 → t[2][1]. Döngüler biter.

m (2×3)t (3×2)123456142536

Arrays.deepToString iç içe dizileri yazar; toString satırların yalnızca kimliklerini yazardı.

int[][] m = {{1, 2, 3}, {4, 5, 6}};
int[][] t = new int[m[0].length][m.length];
for (int i = 0; i < m.length; i++) {
  for (int j = 0; j < m[0].length; j++) {
    t[j][i] = m[i][j];
  }
}
System.out.println(Arrays.deepToString(t));

Hata Bulma · Uygulama: Tic Tac Toe

Soru 19: Kazanan Satır Denetimi

Alt satırı X ile dolu tahtada satirKazandi(t, 'X') ne döndürür? Hatayı bulun ve düzeltin.

static boolean satirKazandi(char[][] t,
                            char o) {
  for (int i = 0; i < 3; i++) {
    if (t[i][0] == o && t[i][1] == o
        && t[i][2] == o) {
      return true;
    } else {
      return false;
    }
  }
  return false;
}
// main içinde
char[][] t = {{'O', ' ', 'O'},
              {' ', 'O', ' '},
              {'X', 'X', 'X'}};
System.out.println(satirKazandi(t, 'X'));
Cevabı göster
false

İlk satır (O, boş, O) koşulu sağlamaz ve else dalındaki return false metodu ilk turda bitirir: 2. ve 3. satıra hiç bakılmaz.

Düzeltme: else kısmı silinir; "yok" kararı ancak tüm satırlara bakıldıktan sonra, döngüden sonra verilir.

for (int i = 0; i < 3; i++) {
  if (t[i][0] == o && t[i][1] == o
      && t[i][2] == o) {
    return true;
  }
}
return false;

Düzeltilmiş metot true döndürür.

Çoktan Seçmeli · Uygulama: Tic Tac Toe

Soru 20: Kısa Devre ve Sınır

Kullanıcı 4 5 girdi; satir = 3, sutun = 4 oldu. do-while koşulu değerlendirilirken ne olur?

do {
  satir = scanner.nextInt() - 1;
  sutun = scanner.nextInt() - 1;
} while (satir < 0 || satir > 2
      || sutun < 0 || sutun > 2
      || tahta[satir][sutun] != ' ');

A: || kısa devre yapar: soldan sağa değerlendirir, ilk true'da durur. satir > 2 doğru olduğu için tahta[satir][sutun] hiç okunmaz ve döngü yeni girdi ister. Hücre denetimi sınır denetimlerinden önce yazılsaydı B olurdu.

Son

Bölüm 5: Diziler: Çalışma Soruları
Konu anlatımı: Diziler sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.