Bölüm 5: Diziler
Ç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
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?
Döngü 1'den başlar ve i += i ile her turda i = i + i olur: indis iki katına çıkar.
i = 1: dizi[1] = 7 yazılır; indis 0'daki 5 hiç okunmaz.
i = 1 + 1 = 2: dizi[2] = 10.
i = 2 + 2 = 4: indis 3 atlanır, dizi[4] = 12.
i = 4 + 4 = 8: dizi[8] = 22.
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?
Başlangıç: ilk öğe hem mevcut seri hem en uzun seri sayılır (uzunluk 1).
dizi[1] == dizi[0]: seri uzar (2). 2 > 1 olduğu için en uzun seri güncellenir.
6 ≠ 2: yeni seri başlar, mevcut = 6, sayı 1. 1 > 2 değil.
Seri 2 oldu ama 2 > 2 yanlış: eşitlikte ilk bulunan (2) korunur.
Seri 3: 3 > 2 → en sık değer artık 6.
9 yeni bir seri başlatır; en uzun seri değişmez.
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?
abc bir indis tutar: başlangıçta 0, yani 7'yi gösterir.
3 < 7: abc = 1.
9 < 3 yanlış: değişiklik yok.
2 < 3: abc = 3.
1 < 2: abc = 4.
5 < 1 yanlış. i = 6'da döngü biter.
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?
Metoda dizinin referansı gelir: yapılan takaslar çağıranın dizisini değiştirir.
i = 0: indis 1…4 taranır, en küçük 10 (indis 1). dizi[0] ile takas.
i = 1: kalan [29, 14, 37, 13] içinde en küçük 13 (indis 4). 29 ile yer değiştirir.
i = 2: 14 zaten en küçük; minIndeks = i kalır, takas kendisiyle yapılır, dizi değişmez.
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]
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?
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[0][0] = 1 → t[0][0].
m[0][1] = 2 → t[1][0]: indisler yer değiştirir.
m[0][2] = 3 → t[2][0]. m'nin ilk satırı t'nin ilk sütunu oldu.
i = 1: m[1][0] = 4 → t[0][1].
m[1][1] = 5 → t[1][1] (köşegen yerinde kalır).
m[1][2] = 6 → t[2][1]. Döngüler biter.
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.