SEN1001 · 8. hafta · Review + Midterm

Vize tekrar: 1-7. haftalar

Derleme zincirinden ArrayList'e kadar bütün vize konularının tek tablo özeti, en çok puan kaybettiren tuzaklar, sınav taktiği ve karışık sınav tipi sorular.

trace tableoutput tracingpartial creditinteger divisionshort-circuitfall-throughoff-by-onepass-by-valuereferenceoverloadingArrayList

Vizenin kapsamı ilk yedi hafta: Java’nın derlenip çalışması, değişkenler ve operatörler, Scanner ve String, karar yapıları, döngüler, metotlar ve diziler (ArrayList dahil). Bu sayfa yeni bir şey öğretmiyor; dağınık kuralları tek yerde topluyor ve en çok puan kaybettiren tuzakları sıralıyor. Sonundaki sorular konuları karıştırıyor, tıpkı gerçek sınav gibi.

Önce özet tabloyu oku, sonra soruları kâğıt kalemle çöz. Yanlış yaptığın her sorunun konusuna dön ve o sayfanın “Sık yapılan hatalar” tablosunu tekrar oku.

Tek tablo özet

HaftaKonuBilmen gereken çekirdek
1Derleme ve çalıştırmajavac Hello.java → Hello.class (bytecode) → java Hello → JVM. Üç hata türü: compile-time (;, isim, tip), runtime (/ by zero, dizi sınırı), logic (yanlış sonuç).
2Değişkenler, tipler, printf8 primitive. Genişletme otomatik, daraltma cast ister; cast keser. char + int = int. printf %d %.2f %s %n, %5d genişlik.
2Scanner, String, ++nextInt sonrası nextLine boş döner. charAt char döner, substring(a, b) b hariç, equals ile karşılaştır. x++ eski, ++x yeni değer.
2Operatörlerint bölme keser, % işareti soldan, * / % önce, aynı seviye soldan sağa, String + soldan sağa birleştirir.
3if/else, switchelse if’te ilk true dal. Kısa devre. switch’te break yoksa fall-through.
4Döngülerwhile 0+ tur, do-while 1+ tur. break/continue. İç içe döngüde iç döngü her dış turda baştan döner.
5MetotlarBaşlık, return, void. Pass-by-value. Scope. Overloading: aynı ad, farklı parametre listesi. Math ve Random aralığı.
6Dizilernew int[n], indeks 0..n-1, length. Enhanced for okur. Dizi metoda referans olarak gider.
7Algoritmalar, ArrayListArama -1, yerinde ters çevirme yarıya kadar, b = a alias. ArrayList: size, get, set, add, remove.

En pahalı on tuzak

Puanı en çok bunlar götürüyor. Her biri bir önceki sayfada ayrıntılı anlatıldı.

#TuzakDoğrusu
1double d = 7 / 2; → 3.53.0, bölme int yapıldı
2"Sum: " + 3 + 4 → Sum: 7Sum: 34, soldan sağa birleştirme
3if (s == "yes")s.equals("yes")
4switch’te break yok, sadece eşleşen case çalışırAlttaki her şey çalışır
5for (i = 0; i <= n; i++) n turn + 1 tur
6Döngüden sonra sayaç son yazılan değerKoşulu bozan değer
7Metot parametreyi değiştirince main’deki değişken değişirDeğişmez (pass-by-value)
8Metot diziyi değiştiremezElemanlarını değiştirebilir
9Math.sqrt(16) → 44.0
10İç içe döngüde tur = dış × iç her zamanİç sınır dış değişkene bağlıysa tur tur say

Sınav taktiği

Çıktı (tracing) soruları: Kâğıdın kenarına iz tablosu çiz: her değişkene bir sütun, koşula bir sütun, ekrana yazılana bir sütun. Kodu satır satır çalıştır. Bir değişken değiştiğinde yeni değeri alta yaz. print ile println’ı ayır: println’dan sonra yeni satır. En çok hata ilk turda, son turda ve döngüden çıktıktan sonraki değerde yapılır; bu üçünü ayrıca kontrol et.

Metot yazma soruları: Kısmi puan şu sırayla gelir:

  1. Başlık: public static <dönüş tipi> <ad>(<tip> <param>). Cevap evet/hayır ise boolean, sayı ise int ya da double, metin ise String, sadece yazdırıyorsa void.
  2. Sonuç değişkenini başlat: int sum = 0;, int count = 0;, int max = arr[0];.
  3. Döngü ve içindeki koşul.
  4. return (void değilse), döngünün dışında.
  5. Bir örnekle kâğıt üstünde test.

Hiçbir fikrin yoksa bile 1. ve 2. adımları yaz. Boş kâğıt sıfır puan.

Hata bulma soruları: Sırayla tara: her satırın sonunda ; var mı, süslü parantezler eşleşiyor mu, kullanılan her değişken o blokta tanımlı mı (scope), tipler uyuşuyor mu (double → int), String çift tırnak mı, char tek tırnak mı, if içinde = mi == mi.

Çözümlü karışık örnek 1: döngü + koşul

int total = 0;
for (int i = 1; i <= 4; i++) {
    if (i % 2 == 0) total += i * i;
    else total -= i;
}
System.out.println(total);
i   i % 2 == 0 ?   işlem            total
1   F              total -= 1       -1
2   T              total += 4        3
3   F              total -= 3        0
4   T              total += 16      16
5   koşul 5 <= 4 F → çık
16

Çözümlü karışık örnek 2: metot + dizi + pass-by-value

static int f(int[] a, int k) {
    a[k] += 10;
    k++;
    return a[k];
}
// main içinde:
int[] arr = {5, 1, 4};
int k = 0;
System.out.println(f(arr, k) + " " + k + " " + arr[0]);
1 0 15

Üç şeyi ayrı ayrı düşün:

  • a[0] += 10: dizi referansla geldiği için main’deki arr[0] 15 oldu.
  • k++: metodun kendi k kopyası 1 oldu. main’deki k 0 kaldı.
  • return a[1]: 1.

Aynı satırda üç farklı kural çalışıyor; vize sorusu tam olarak böyle görünür.

Soru tipi → hangi sayfaya dön

Bir soruyu yanlış yaptıysan hangi kuralı kaçırdığını bul ve o sayfaya dön. Aşağıdaki tablo soruların çoğunu tek bir kurala bağlıyor:

Soruda gördüğünKontrol edeceğin kuralSayfa
/ ve iki intkesilir, yuvarlanmazOperatörler (2. hafta)
"..." + sayı + sayısoldan sağa birleştirmeOperatörler, Scanner ve String
x++ bir ifadenin içindeeski değer kullanılırScanner ve String (2. hafta)
char ile +sonuç intDeğişkenler (2. hafta)
else if zincirisadece ilk true dalif/else ve switch (3. hafta)
&& / || sağında ++kısa devreif/else ve switch
switch, break eksikfall-throughif/else ve switch
iç döngü sınırı dış değişkene bağlıtur tur sayDöngüler (4. hafta)
metot parametreyi değiştiriyorpass-by-valueMetotlar (5. hafta)
metot dizi elemanını değiştiriyorreferans, çağıran görürDiziler (6. hafta)
b = a sonra b[i] = ...aliasDizi algoritmaları (7. hafta)
Integer listesinde remove(sayı)indeks silerDizi algoritmaları ve ArrayList

Son gece kontrol listesi

  • Scanner’ın üç satırını (import, new, nextInt) ezbere yazabiliyor musun?
  • 1 + 2 + "A" ile "A" + 1 + 2 farkını açıklayabiliyor musun?
  • Sola yaslı, ters ve sağa yaslı yıldız üçgenini döngü sınırlarıyla yazabiliyor musun?
  • isPrime, sumDigits, max, countDivisors, getSeason metotlarını bakmadan yazabiliyor musun?
  • Bir dizinin toplamını, ortalamasını (double!) ve en büyüğünü bulan metotları yazabiliyor musun?
  • remove(1) ile remove(Integer.valueOf(1)) farkını biliyor musun?

Hepsine evet diyorsan aşağıdaki soruları çöz ve yanlışlarını not et.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Tracing’de kafadan hesap yeterİz tablosu çiz; ilk, son tur ve döngü sonrası
print ile println aynıprint satırda kalır
Yazma sorusunda sadece tam kod puan alırBaşlık ve döngü kısmi puan getirir
do-while’da continue gövdenin başına dönerKoşula gider
char argüman alan metot yoksa derlenmezchar int’e genişler
long argüman int metoduna giderDaraltma yok; double’a genişler
Blok içinde tanımlanan değişken sonra da varScope biter, cannot find symbol

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1orta

What is printed?

System.out.println(5 + 7 / 2 * 2 + "x" + 5 % 3);
Cevabı göster
11x2

Önce * / %: 7 / 2 = 3, 3 * 2 = 6, 5 % 3 = 2. Sonra soldan sağa +: 5 + 6 = 11 (sayı), 11 + "x" = "11x", "11x" + 2 = "11x2".

Soru 2zor

What is printed?

int a = 3;
int b = a++ * 2 + --a;
System.out.println(a + " " + b);
Cevabı göster
3 9

Soldan sağa: a++ değer 3 verir, a = 4. 3 * 2 = 6. --a önce azaltır: a = 3, değer 3. b = 6 + 3 = 9.

Soru 3orta

What is printed?

char c = 'b';
int x = 0;
switch (c) {
    case 'a': x += 1;
    case 'b': x += 2;
    case 'c': x += 3; break;
    default: x += 10;
}
System.out.println(x);
Cevabı göster
5

case 'b'den girilir: x = 2. break yok, case 'c'ye düşer: x = 5, break. case 'a' üstte kaldığı için çalışmaz, default'a ulaşılmaz.

Soru 4orta

What is printed?

int pairs = 0;
for (int i = 1; i <= 4; i++)
    for (int j = i + 1; j <= 4; j++)
        if ((i + j) % 2 == 1) pairs++;
System.out.println(pairs);
Cevabı göster
4

i < j olan çiftler: (1,2) (1,3) (1,4) (2,3) (2,4) (3,4). Toplamı tek olanlar: (1,2)=3, (1,4)=5, (2,3)=5, (3,4)=7. Dört çift.

Soru 5zor

What is printed?

int n = 3, s = 0;
do {
    n--;
    if (n == 1) continue;
    s += n;
} while (n > 0);
System.out.println(n + " " + s);
Cevabı göster
0 2

Tur 1: n = 2, s = 2, koşul 2 > 0 T. Tur 2: n = 1, continue → do-while'da continue doğrudan koşula atlar: 1 > 0 T. Tur 3: n = 0, s = 2 + 0 = 2, 0 > 0 F → çık.

Soru 6zor

What is printed?

static int f(int[] a, int k) {
    a[k] += 10;
    k++;
    return a[k];
}
// in main:
int[] arr = {2, 4, 6, 8};
int idx = 1;
int r = f(arr, idx);
System.out.println(r + " " + idx + " " + arr[1]);
Cevabı göster
6 1 14

Dizi referans olarak gider: a[1] += 10 main'deki diziyi değiştirir, arr[1] = 14. k ise int, kopyası artırılır; main'deki idx 1 kalır. Metot a[2] = 6 döndürür.

Soru 7orta

What is printed?

String w = "Programming";
int cnt = 0;
for (int i = 0; i < w.length(); i++) {
    if (w.charAt(i) == 'm' || w.charAt(i) == 'g') cnt++;
}
System.out.println(cnt + " " + w.indexOf('g') + " " + w.substring(3, 6));
Cevabı göster
4 3 gra

P0 r1 o2 g3 r4 a5 m6 m7 i8 n9 g10. m iki, g iki: 4. İlk g 3. indekste. substring(3, 6) → 3, 4, 5: "gra".

Soru 8orta

What is printed?

ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 4; i++) list.add(i * i);
list.add(1, 7);
list.remove(Integer.valueOf(4));
System.out.println(list + " " + list.get(2));
Cevabı göster
[0, 7, 1, 9] 1

Döngü: [0, 1, 4, 9]. add(1, 7): [0, 7, 1, 4, 9]. 4 değerini sil: [0, 7, 1, 9]. get(2) = 1.

Soru 9zor

Only these two methods exist. What is printed?

static String t(int x)    { return "I" + x; }
static String t(double x) { return "D" + x; }
// in main:
System.out.println(t('A'));
System.out.println(t(5L));
System.out.println(t(9 / 2));
Cevabı göster
I65
D5.0
I4

char için tam eşleşme yok; char int'e genişler, 'A' = 65 → t(int). long int'e daraltılamaz ama double'a genişler → "D5.0". 9 / 2 = 4 (int) → t(int).

Soru 10kolay

What is printed?

double avg = 0;
int[] m = {7, 8, 10};
for (int v : m) avg += v;
avg /= m.length;
System.out.printf("%.2f %d%n", avg, (int) avg);
Cevabı göster
8.33 8

avg double olduğu için toplama 25.0, bölme double: 25.0 / 3 = 8.333... %.2f → 8.33. Cast keser: 8.

Soru 11orta

Find the compile-time error. Which line is it, and why?

int total = 0;
for (int i = 0; i < 3; i++) {
    int sq = i * i;
    total += sq;
}
double avg = total / 3;
String msg = "avg";
if (msg == "avg") System.out.println(sq);
Cevabı göster
Last line: sq cannot be found (scope)

sq döngü bloğunun içinde tanımlandı, blok bitince yok olur: cannot find symbol. Diğer iki satır derlenir ama kötü: total / 3 int bölme (mantık hatası riski), msg == "avg" String'i == ile karşılaştırıyor (equals kullanılmalı).

Soru 12zor

Write a static method isPalindrome(int n) that returns true if a non-negative integer reads the same backwards (e.g. 1221).

Cevabı göster
build rev with rev = rev * 10 + n % 10, then return rev == original;

n döngüde 0'a ineceği için orijinal değeri baştan sakla.public static boolean isPalindrome(int n) { int original = n, rev = 0; while (n > 0) { rev = rev * 10 + n % 10; n /= 10; } return rev == original;}Test: 1221 → true, 123 → false, 7 → true.

Doğrulama: Tüm sorular ve çözümlü örnekler JDK 26 ile çalıştırıldı (verify/SEN1001/W08.java). Hata bulma sorusu verify/SEN1001/err/Find.java javac ile derlenerek kontrol edildi.

Deftere not kartı

.java → javac → .class (bytecode) → java → JVM compile / runtime / logic int/int keser (double) önce cast "A"+1+2="A12" 1+2+"A"="3A" char+int=int x++ eski değer ++x yeni değer x += 2.7 gizli cast *= sağ tarafı bütün alır %.2f yuvarlar (int) keser Math.round(2.5)=3 pow/sqrt/ceil/floor double döner else if: ilk true { } yoksa tek ifade else en yakın if'e = vs == && || kısa devre: sağdaki ++ çalışmayabilir switch: break'e kadar düşer, default dahil do-while'da continue → koşula Tur: i<n → n i<=n → n (0'dan <=n → n+1) döngü sonrası sayaç bir fazla break iç döngüyü bitirir for(...); boş gövde Metot: başlık + return her yolda pass-by-value overload: tam eşleşme → genişletme Dizi: 0..length-1, varsayılan 0/null, b = a alias, metot elemanları değiştirebilir ArrayList<Integer>: size() get set add remove(indeks) remove(Integer.valueOf(x)) String: equals, charAt char döner, substring b hariç, indexOf yoksa -1 Taktik: iz tablosu, ilk ve son turu ayrıca kontrol, yazma sorusunda başlık + döngü + return