Metotlar
Çoktan Seçmeli · Metot Temelleri
Soru 1: Parametre ve Argüman
Aşağıdaki kod için hangisi doğrudur?
static int topla(int a, int b) { int sonuc = a + b; return sonuc; } // main içinde: int toplam = topla(5, 3);
C: Bildirimdeki a ve b biçimsel parametrelerdir; çağrıdaki 5 ve 3 gerçek argümanlardır ve parametrelere kopyalanır. sonuc yereldir, metot bitince yok olur. Dönüş türü int.
Çıktı Sorusu · Metot Temelleri
Soru 2: Metot Metodu Çağırınca
Aşağıdaki kodun çıktısı nedir?
static int topla(int a, int b) { return a + b; } static int ortalama(int x, int y) { int t = topla(x, y); return t / 2; } // main içinde: System.out.println(ortalama(8, 5));
Cevabı göster
Çıktı: 6
- topla 13 döndürür, çerçevesi kapanır; t = 13.
13 / 2tam sayı bölmesi → 6 (6.5 değil).
Çoktan Seçmeli · Metot Temelleri
Soru 3: Çağrıların Sırası
Metot hem ekrana yazıyor hem değer döndürüyor. Çıktı nedir?
static int f(int x) { System.out.print("f" + x + " "); return x * 2; } // main içinde: System.out.println(f(1) + f(2));
C: println'in argümanı hesaplanırken önce f(1) (soldan sağa) sonra f(2) çağrılır; ikisi de kendi yazısını basar. Sonra 2 + 4 = 6 yazılır. D, "s=" + f(1) + f(2) gibi önce String ile başlayan ifadede olurdu (String birleştirme: "24").
Çoktan Seçmeli · Metot Temelleri
Soru 4: static Olmayan Metot
Program derlenirken ne olur?
public class Ornek { void selamla() { System.out.println("Merhaba"); } public static void main(String[] args) { selamla(); } }
D: main static'tir (nesne olmadan çalışır); static olmayan selamla() bir nesneye aittir ve doğrudan çağrılamaz. Bu bölümde çözüm metodu static void selamla() yapmaktır.
Adım Adım Çalıştırma · Geçmiş Sınav (2023-24 Vize)
Soru 5: usHesapla(2, −2)
Negatif üste metot kendini pozitif üsle çağırıyor. usHesapla(2, -2) ne döndürür? Çağrı yığınını izleyin.
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
main, usHesapla(2, -2)'yi çağırır. int 2, double parametreye 2.0 olarak genişler.
Yeni çerçeve: taban = 2.0, us = −2, sonuc = 1.0.
us < 0 → metot kendini −us = 2 ile çağırır. Üstteki yeni çerçevenin kendi taban, us, sonuc kutuları var.
us = 2 ≥ 0 → for: i = 0, sonuc = 1.0 × 2.0 = 2.0.
i = 1, sonuc = 4.0. Sonra i = 2 < 2 false.
return 4.0: üstteki çerçeve kapanır.
İlk çerçeve kaldığı yerden sürer: sonuc = 1.0 / 4.0 = 0.25. (1.0 yazıldığı için bölme double'dır.)
return 0.25: çerçeve kapanır.
0.25 yazılır: 2⁻² = 1 / 2² = 1/4. (Sınavda metot static değildi; main'den çağırmak için static yazdık.)
static double usHesapla(double taban, int us) { double sonuc = 1; if (us < 0) { sonuc = 1.0 / (usHesapla(taban, -us)); } else { for (int i = 0; i < us; i++) { sonuc *= taban; } } return sonuc; } // main: System.out.println(usHesapla(2, -2));
Çıktı Sorusu · Geçmiş Sınav (2023-24 Vize)
Soru 6: usHesapla Özel Durumları
Önceki sorudaki usHesapla metodu ile çıktı nedir?
System.out.println(usHesapla(3, 0)); System.out.println(usHesapla(10, -1)); System.out.println(usHesapla(2.5, 2));
Cevabı göster
1.0 0.1 6.25
us = 0: for hiç dönmez, sonuc = 1 (3⁰ = 1). Dönüş türü double olduğu için1.0.us = −1: 1.0 / usHesapla(10, 1) = 1.0 / 10.0 =0.1.2.5 × 2.5 = 6.25: taban double olduğu için ondalıklı taban da çalışır.
Çoktan Seçmeli · Dönüş Değeri
Soru 7: Hangisi Derlenir?
Aşağıdaki metotlardan hangisi hatasız derlenir?
D: Her yol int döndürür. A: n ≤ 0 yolunda return yok → missing return statement. B: void metot değer döndüremez → unexpected return value. C: double, int'e kendiliğinden daraltılmaz → possible lossy conversion.
Çoktan Seçmeli · Dönüş Değeri
Soru 8: void Sonucu Atamak
Aşağıdaki main parçası için hangisi doğrudur?
static void cizgiCiz(int n) { for (int i = 0; i < n; i++) System.out.print("-"); System.out.println(); } // main içinde: cizgiCiz(5); int x = cizgiCiz(5);
C: void metot çağrıya değer döndürmez; işi yan etkidir (ekrana yazmak). Bu yüzden atamanın ya da ifadenin parçası olamaz. İlk satır tek başına geçerli bir deyimdir ve ----- yazar.
Çıktı Sorusu · Dönüş Değeri
Soru 9: Erken Dönüş
Aşağıdaki kodun çıktısı nedir?
static int sinifla(int n) { if (n < 0) return -1; if (n == 0) return 0; return 1; } // main içinde: System.out.println(sinifla(-7) + " " + sinifla(0) + " " + sinifla(4));
Cevabı göster
Çıktı: -1 0 1
- −7: ilk if true → hemen −1 döner, alt satırlar çalışmaz.
- 0: ilk if false, ikinci true → 0.
- 4: iki if de false → son satır 1 döndürür.
Her yol bir return ile bittiği için else gerekmez; özel durumları başta ele almak iç içeliği azaltır.
Çıktı Sorusu · Geçmiş Sınav (2024-25 Vize A/B)
Soru 10: Negatif Sayının Faktöriyeli
Sınavdaki çözüm sayi = -3 ile çağrılıyor. Çıktı nedir? Metotta ne eksik?
public static long faktoriyel(int sayi) { if (sayi < 0) { System.out.println("Sayi negatif olamaz."); } long sonuc = 1; for (int i = 1; i <= sayi; i++) { sonuc *= i; } return sonuc; } // main içinde: int sayi = -3; System.out.println(sayi + " sayisinin faktöriyeli: " + faktoriyel(sayi));
Cevabı göster
Sayi negatif olamaz. -3 sayisinin faktöriyeli: 1
- println'in argümanı yazılmadan önce hesaplanır: faktoriyel çağrılır ve uyarıyı önce basar.
- Uyarıdan sonra metot sürer; for hiç dönmez → 1 döner, yanlış bir sonuç ekrana gelir.
- Eksik: if içinde
return -1;(ya da bir istisna) ile erken çıkmak.
Çoktan Seçmeli · Geçmiş Sınav (2023-24 Telafi)
Soru 11: int Döndüren Faktöriyel
Telafi sınavındaki public int faktoriyel(int sayi) (sonuc int, for ile 1..sayi çarpım) için faktoriyel(12) ve faktoriyel(13) ne döndürür?
B: 12! = 479 001 600 int'e sığar; 13! = 6 227 020 800 int sınırını (2 147 483 647) aşar ve değer sessizce sarar → 1932053504. Java tam sayı taşmasında hata vermez. Doğru sonuç için dönüş türü ve sonuc long olmalı (Vize 2024-25 çözümündeki gibi).
Adım Adım Çalıştırma · Dönüş Değeri
Soru 12: kombinasyon(4, 2)
kombinasyon, faktoriyel metodunu üç kez çağırıyor. Çağrı yığınını ve dönen değerleri izleyin.
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
main, kombinasyon(4, 2)'yi çağırır.
Çerçeve: n = 4, r = 2. İfadeyi hesaplamak için önce faktoriyel(n) gerekir.
Yeni çerçeve: n = 4 (kombinasyon'un n'sinden ayrı kutu). sonuc = 2·3·4 = 24.
24 döner, çerçeve kapanır. Sıradaki çağrı faktoriyel(r) = faktoriyel(2).
n = 2: sonuc = 2 → 2 döner.
faktoriyel(n − r) = faktoriyel(2): aynı metot, yepyeni bir çerçeve → 2.
24 / (2 × 2) = 24 / 4 = 6. return 6.
6 yazılır: 4 öğeden 2'li seçim sayısı. Metot başka metodu çağırarak kod tekrarını önler.
static long faktoriyel(int n) { long sonuc = 1; for (int i = 2; i <= n; i++) sonuc *= i; return sonuc; } static long kombinasyon(int n, int r) { return faktoriyel(n) / (faktoriyel(r) * faktoriyel(n - r)); } // main: System.out.println(kombinasyon(4, 2));
Çıktı Sorusu · Parametreler
Soru 13: Dönüş Değerini Kullanmamak
Aşağıdaki kodun çıktısı nedir?
static int artir(int x) { x += 10; return x; } // main içinde: int a = 5; artir(a); System.out.println(a); a = artir(a); System.out.println(a);
Cevabı göster
5 15
- Java değere göre aktarır: x, a'nın kopyasıdır; x'i değiştirmek a'yı değiştirmez.
- İlk çağrının dönüş değeri (15) hiçbir yere atanmadı, kayboldu.
a = artir(a);dönen değeri a'ya yazar → 15.
Adım Adım Çalıştırma · Parametreler
Soru 14: Değere Göre Aktarım
Metot ve main'de aynı adlı n değişkeni var. Program ne yazdırır?
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
main'in n kutusu: 4.
Çağrıda gönderilen değişken değil, değeri (4). ikiKati'nin kendi n kutusuna kopyalanır.
Yalnızca ikiKati'nin kutusu 8 olur; main'deki n hâlâ 4.
ic: 8 yazılır.
void metot biter; çerçevesi ve içindeki n (8) silinir. Hiçbir değer geri gönderilmez.
dis: 4: Adların aynı olması bağ kurmaz; her metodun yerel değişkeni ayrıdır.
static void ikiKati(int n) { n = n * 2; System.out.println("ic: " + n); } // main: int n = 4; ikiKati(n); System.out.println("dis: " + n);
Çıktı Sorusu · Parametreler
Soru 15: swap Tuzağı
Aşağıdaki kodun çıktısı nedir?
static void swap(int a, int b) { int t = a; a = b; b = t; } // main içinde: int x = 3, y = 5; swap(x, y); System.out.println(x + " " + y);
Cevabı göster
Çıktı: 3 5
- a ve b, x ve y'nin kopyalarıdır; swap kendi kopyalarını takas eder.
- Metot bitince a, b, t silinir; main'deki x ve y'ye hiç dokunulmamıştır.
Çoktan Seçmeli · Parametreler
Soru 16: Geçersiz Aşırı Yükleme
Aynı sınıfta birlikte bulunan metot çiftlerinden hangisi derleme hatası verir?
C: İmza = ad + parametre listesi; dönüş türü imzaya dahil değildir. İkisi de alan(int) olduğundan alan(4) çağrısında hangisinin kastedildiği anlaşılamaz. A sayıyla, B türle, D sırayla ayrışır.
Adım Adım Çalıştırma · Parametreler
Soru 17: Hangi yaz Çağrılır?
Derleyici her çağrı için argümanların türüne ve sayısına uyan metodu seçer. Çıktıyı bulun.
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
yaz(5): tek int argüman → tam eşleşme yaz(int).
yaz(5.0): 5.0 bir double sabitidir → yaz(double). double olduğu için 5.0 yazılır.
yaz(3, 4): iki argüman → yaz(int, int). Parantez sayesinde 3 + 4 = 7 toplanır (yoksa "iki 34" olurdu).
yaz('A'): char için tam eşleşme yok; char → int genişlemesi en yakın seçenek. 'A' = 65.
yaz(7L): long, int'e kendiliğinden daralmaz ama double'a genişler → yaz(double).
Seçim program çalışmadan, derlemede yapılır. Uyan hiçbir imza yoksa (ör. yaz("a")) derleme hatası olur.
static void yaz(int x) { System.out.println("int " + x); } static void yaz(double x) { System.out.println("double " + x); } static void yaz(int a, int b) { System.out.println("iki " + (a + b)); } // main: yaz(5); yaz(5.0); yaz(3, 4); yaz('A'); yaz(7L);
Çoktan Seçmeli · Parametreler
Soru 18: enBuyuk(3, 4.5)
Sınıfta static int enBuyuk(int a, int b) ve static double enBuyuk(double a, double b) var. System.out.println(enBuyuk(3, 4.5)); ne yazar?
B: 4.5 double olduğundan enBuyuk(int, int) uymaz; 3 double'a genişletilerek enBuyuk(double, double) çağrılır → 4.5. enBuyuk(3, 4) ise int sürümünü seçer ve 4 yazar.
Çoktan Seçmeli · Parametreler
Soru 19: Boş varargs Çağrısı
static int topla(int... s) { int t = 0; for (int v : s) t += v; return t; } için topla() ne döndürür?
D: Argüman yoksa derleyici boş bir dizi (new int[0]) geçirir, null değil. Döngü hiç dönmez, t = 0 döner. topla(7) → 7, topla(1, 2, 3, 4) → 10.
Çoktan Seçmeli · Kapsam
Soru 20: Blok Dışında Kullanılan Değişken
Hangi satır derleme hatası verir?
static int hesapla(int n) { // 1 int sonuc = 0; // 2 if (n > 0) { // 3 int katki = n * 2; // 4 sonuc += katki; // 5 } // 6 return sonuc + katki; // 7 }
C: katki if bloğunda tanımlıdır ve blok (6. satır) kapanınca yok olur: cannot find symbol: katki. 5. satır geçerlidir; iç blok dış kapsamdaki sonuc'u görür.
Adım Adım Çalıştırma · Kapsam
Soru 21: static Alan ve Yerel Değişken
Sınıf düzeyinde static int x ve metotta aynı adlı yerel x var. Çıktıyı adım adım bulun.
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
static alan x = 10: sınıfa ait, tüm metotlar görür.
g çağrılır: yerel x = 3 tanımlanır. Yerel ad, aynı adlı alanı metot içinde gölgeler (derlenir).
x++ yerel kutuyu artırır → 4 yazılır. Alan hâlâ 10.
g bitti, yerel x silindi. main'de x alanı ifade eder → 10.
Alan güncellenir: x = 11.
g yeniden çağrılır: yerel x her çağrıda yeniden 3 ile doğar → yine 4.
Çıktı: 4, 10, 4, 11. Gölgeleme yalnızca yerel değişken ile alan arasında olur; iki yerel değişken aynı kapsamda aynı adı alamaz.
static int x = 10; static void g() { int x = 3; x++; System.out.println(x); } // main: g(); System.out.println(x); x = x + 1; g(); System.out.println(x);
Çıktı Sorusu · Kapsam
Soru 22: Aynı Adlar, Ayrı Kutular
Aşağıdaki kodun çıktısı nedir?
static int kare(int a) { int b = a * a; return b; } // main içinde: int a = 3, b = 4; b = kare(b); System.out.println(a + " " + b);
Cevabı göster
Çıktı: 3 16
- kare'nin a'sı main'in b'sinin kopyası (4); kare'nin b'si 16.
- main'in a'sı (3) hiç değişmez; main'in b'si dönüş değeriyle 16 olur.
Çoktan Seçmeli · Kapsam
Soru 23: Hangi Tanım Geçerli?
main içinde yazılan parçalardan hangisi derlenir?
B: for'da tanımlanan i döngüyle birlikte yok olur; sonra aynı adla yeni değişken tanımlanabilir. A ve C: aynı kapsamda (iç blok dahil) aynı adlı iki yerel değişken olamaz (already defined). D: parametre de yereldir.
Adım Adım Çalıştırma · Geçmiş Sınav (2023-24 Telafi, Vize)
Soru 24: sonrakiAsal(13)
Sınavdaki çözüm (mesajlar kısaltıldı) sonrakiAsal(13) ile çağrılıyor. Ne yazdırır?
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
Parametre sayi = 13. while (true): çıkış yalnızca break ile.
++sayi önce artırır: 14 gönderilir. 14 % 2 == 0 → false.
else kolu: mesaj yazılır, döngü sürer.
asalMi(15): 15 % 2 = 1, 15 % 3 = 0 → false.
asalMi(16): 16 % 2 = 0 → false.
asalMi(17): i = 2..16 hiçbiri bölmez → döngü biter, return true.
17 asal yazılır, break ile while(true) biter. Toplam 4 satır.
static boolean asalMi(int sayi) { for (int i = 2; i < sayi; i++) if (sayi % i == 0) return false; return true; } static void sonrakiAsal(int sayi) { while (true) { if (asalMi(++sayi) == true) { System.out.println(sayi + " asal"); break; } else { System.out.println(sayi + " asal değil"); } } }
Adım Adım Çalıştırma · Geçmiş Sınav (2024-25 Vize A/B)
Soru 25: oncekiAsal(100)
oncekiAsal(100) çağrılıyor. Kaç kez asalMi çağrılır ve ne döner?
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
Aramaya 100'ün bir altından başlanır: 99.
99 % 2 = 1, 99 % 3 = 0 → return false (erken dönüş).
Asal değil → oncekiSayi-- → 98.
98 % 2 = 0 → false.
oncekiSayi → 97.
i = 2..96 (95 deneme) hiçbiri 97'yi bölmez → true.
if true → return 97. asalMi 3 kez çağrıldı; return döngüyü de metodu da bitirir.
static boolean asalMi(int sayi) { if (sayi <= 1) return false; for (int i = 2; i < sayi; i++) if (sayi % i == 0) return false; return true; } static int oncekiAsal(int sayi) { int oncekiSayi = sayi - 1; while (oncekiSayi > 1) { if (asalMi(oncekiSayi)) return oncekiSayi; oncekiSayi--; } return -1; }
Çıktı Sorusu · Geçmiş Sınav (2024-25 Vize (varyant))
Soru 26: oncekiAsal Sınır Değerleri
Aynı oncekiAsal ve asalMi ile çıktı nedir?
System.out.println(oncekiAsal(20)); System.out.println(oncekiAsal(3)); System.out.println(oncekiAsal(2));
Cevabı göster
19 2 -1
- 20 → 19 asal (19'u bölen yok).
- 3 → oncekiSayi = 2; 2 > 1 true, asalMi(2): for hiç dönmez (2 < 2 false) → true → 2.
- 2 → oncekiSayi = 1; 1 > 1 false → döngüye girilmez,
return -1("bulunamadı" işareti).
Çoktan Seçmeli · Geçmiş Sınav (2023-24 Telafi)
Soru 27: asalMi(1) Hatası
Telafi/Vize 2023-24 cevap anahtarındaki asalMi yalnızca for (int i = 2; i < sayi; i++) if (sayi % i == 0) return false; return true; içeriyor. asalMi(1) ve asalMi(0) ne döndürür?
A: sayi ≤ 2 iken for hiç dönmez ve return true'ya düşülür; 0 ve 1 yanlışlıkla asal sayılır. Düzeltme 2024-25 çözümündeki gibi başa if (sayi <= 1) return false; eklemektir. (sonrakiAsal yalnızca sayi + 1'den başladığı için 0 veya negatif bir sayıyla çağrılırsa bu hata görünür: sonrakiAsal(0) → "1 asal".)
Çoktan Seçmeli · Örnek Metotlar
Soru 28: asalMi Kaç Tur Döner?
97 asaldır. Sınavdaki for (int i = 2; i < sayi; i++) sürümü ile dersteki for (int i = 2; i <= n / i; i++) sürümü 97 için kaçar kez kalan hesaplar?
A: İlki i = 2..96 → 95 tur. İkincisi i × i ≤ 97 iken (i = 2..9; 10 <= 97/10 = 9 false) → 8 tur. √n'den büyük bir bölen varsa küçük eşi de vardır, bu yüzden √n'e kadar bakmak yeter. Sonuç (true) aynıdır.
Çıktı Sorusu · Örnek Metotlar
Soru 29: ciftMi ile Seçme
Aşağıdaki kodun çıktısı nedir?
static boolean ciftMi(int sayi) { return sayi % 2 == 0; } // main içinde: for (int i = 1; i <= 10; i++) { if (!ciftMi(i) && i % 3 == 0) System.out.print(i + " "); }
Cevabı göster
Çıktı: 3 9
!ciftMi(i): tek sayılar (1, 3, 5, 7, 9).- Bunlardan 3'e bölünenler: 3 ve 9.
- Metot boolean döndürdüğü için doğrudan koşulda kullanılabilir;
== trueyazmaya gerek yok.
Çıktı Sorusu · Örnek Metotlar
Soru 30: ebob ve ekok
Aşağıdaki kodun çıktısı nedir?
static int ebob(int a, int b) { while (b != 0) { int r = a % b; a = b; b = r; } return a; } static int ekok(int a, int b) { return a / ebob(a, b) * b; } // main içinde: System.out.println(ebob(84, 36) + " " + ekok(4, 6));
Cevabı göster
Çıktı: 12 12
- 84 % 36 = 12 → (36, 12); 36 % 12 = 0 → (12, 0) → ebob = 12.
- ekok(4, 6): ebob(4, 6) = 2 → 4 / 2 * 6 = 12. Önce bölmek a·b taşmasını önler.
Çıktı Sorusu · Örnek Metotlar
Soru 31: İç İçe Çağrı ve Sayaç
static sayac alanı her çağrıda artıyor. Çıktı nedir?
static int sayac = 0; static int ikiyle(int n) { sayac++; return n * 2; } // main içinde: int r = ikiyle(ikiyle(3)); System.out.println(r + " " + sayac);
Cevabı göster
Çıktı: 12 2
- İç içe çağrıda önce içteki çalışır: ikiyle(3) → 6 (sayac = 1).
- Sonra ikiyle(6) → 12 (sayac = 2).
- sayac bir static alan olduğu için çağrılar arasında değeri korunur; yerel değişken olsaydı her çağrıda 0'dan başlardı. Bu bir yan etkidir.
Çoktan Seçmeli · Örnek Metotlar
Soru 32: Saf Metot
Aşağıdaki metotlardan hangisi saftır (aynı girdiye hep aynı sonucu döndürür, dış durumu değiştirmez)?
B: Yalnızca parametresine bakar ve değer döndürür; kare(4) her zaman 16'dır, her yerde kullanılabilir ve kolay test edilir. A ekrana yazar (yan etki), C bir alanı değiştirir, D her çağrıda farklı sonuç verir.
Çoktan Seçmeli · Örnek Metotlar
Soru 33: Ortalamada Tam Sayı Bölmesi
static double ortalama(int a, int b, int c) { return (a + b + c) / 3; } için ortalama(7, 8, 8) ne döndürür?
C: (a + b + c) / 3 = 23 / 3 iki int arasında tam sayı bölmesidir → 7; sonra dönüş türü double olduğu için 7.0 olur. Düzeltme: (a + b + c) / 3.0 → 7.666666666666667. Dönüş türünün double olması bölmeyi kendiliğinden ondalıklı yapmaz.