2024-2025 Java Vize Sınavı

Cevaplar ve Açıklamalar

Soru 1: Parametre olarak verilen dizide en küçük elemanı bulup, dizideki konumunu konsola yazdıran fonksiyonu yazınız.

Açıklama:

Bu soruda, bir tamsayı dizisi parametre olarak alınacak ve dizideki en küçük elemanın indeksi konsola yazdırılacak. Java’da diziler sıfır tabanlı indekslenir, yani ilk elemanın indeksi 0’dır. En küçük elemanı bulmak için diziyi tarayıp her elemanı karşılaştıracağız. Eğer birden fazla en küçük eleman varsa, genellikle ilk karşılaşılanın indeksi döndürülür (soru başka bir durum belirtmediği için).

  • Adım 1: Metot, int[] tipinde bir dizi parametresi alır.
  • Adım 2: En küçük elemanı ve onun indeksini saklamak için değişkenler tanımlanır.
  • Adım 3: Dizi döngüyle taranır; her eleman, mevcut en küçük elemanla karşılaştırılır.
  • Adım 4: En küçük elemanın indeksi System.out.println ile yazdırılır.
  • Ek Not: Dizi boşsa, hata yönetimi yapılabilir, ancak soru bunu talep etmediği için basit bir çözüm sunulacak. Varsayılan olarak dizinin boş olmadığını ve en az bir eleman içerdiğini varsayıyoruz.

Çözüm:

public void enKucukElemanIndeksi(int[] dizi) { if (dizi.length == 0) { System.out.println("Dizi boş!"); return; } int minIndeks = 0; int minDeger = dizi[0]; for (int i = 1; i < dizi.length; i++) { if (dizi[i] < minDeger) { minDeger = dizi[i]; minIndeks = i; } } System.out.println("En küçük elemanın indeksi: " + minIndeks); }

Test Kodu:

public class Main { public static void main(String[] args) { int[] testDizi = {5, 2, 9, 1, 7, 1}; enKucukElemanIndeksi(testDizi); } public static void enKucukElemanIndeksi(int[] dizi) { if (dizi.length == 0) { System.out.println("Dizi boş!"); return; } int minIndeks = 0; int minDeger = dizi[0]; for (int i = 1; i < dizi.length; i++) { if (dizi[i] < minDeger) { minDeger = dizi[i]; minIndeks = i; } } System.out.println("En küçük elemanın indeksi: " + minIndeks); } }

Örnek Çıktı:

Dizi: {5, 2, 9, 1, 7, 1}

Çıktı: En küçük elemanın indeksi: 3

Açıklama: En küçük eleman 1, ilk olarak indeks 3’te bulunuyor (1 ikinci kez indeks 5’te, ama ilk karşılaşılan seçilir).

Analitik Perspektif: Metot, O(n) zaman karmaşıklığına sahiptir, n dizi uzunluğudur. Boş dizi kontrolü, sağlamlığı artırır. Gerçek dünyada, birden fazla en küçük eleman için tüm indeksleri döndüren bir varyasyon veya hata mesajlarının daha ayrıntılı olması düşünülebilir.

Soru 2: Parametre olarak verilen sayısal not değerinin harf notu karşılığını konsola yazdıran fonksiyonu yazınız.

Not Aralığı: 100-90: A, 89-80: B, 79-70: C, 69-60: D, 59-50: E, 49-0: F

Açıklama:

Bu soruda, bir sayısal not (tamsayı) parametre olarak alınacak ve verilen aralıklara göre harf notu konsola yazdırılacak. Notun 0-100 aralığında olduğunu varsayıyoruz, ancak soru geçersiz notlar (örneğin, negatif veya 100’den büyük) için bir kural belirtmediği için basit bir çözüm sunulacak. Çoklu if-else yapısı kullanılarak not aralığı kontrol edilecek.

  • Adım 1: Metot, int tipinde bir not parametresi alır.
  • Adım 2: Not, aralıklara göre kontrol edilir (100-90, 89-80, vb.).
  • Adım 3: Uygun harf notu System.out.println ile yazdırılır.
  • Ek Not: Geçersiz notlar için bir hata mesajı eklenebilir, ancak bu soru için gerekli değil.

Çözüm:

public void harfNotuYazdir(int not) { if (not >= 90 && not <= 100) { System.out.println("Harf notu: A"); } else if (not >= 80 && not <= 89) { System.out.println("Harf notu: B"); } else if (not >= 70 && not <= 79) { System.out.println("Harf notu: C"); } else if (not >= 60 && not <= 69) { System.out.println("Harf notu: D"); } else if (not >= 50 && not <= 59) { System.out.println("Harf notu: E"); } else if (not >= 0 && not <= 49) { System.out.println("Harf notu: F"); } else { System.out.println("Geçersiz not!"); } }

Test Kodu:

public class Main { public static void main(String[] args) { harfNotuYazdir(95); harfNotuYazdir(85); harfNotuYazdir(45); } public static void harfNotuYazdir(int not) { if (not >= 90 && not <= 100) { System.out.println("Harf notu: A"); } else if (not >= 80 && not <= 89) { System.out.println("Harf notu: B"); } else if (not >= 70 && not <= 79) { System.out.println("Harf notu: C"); } else if (not >= 60 && not <= 69) { System.out.println("Harf notu: D"); } else if (not >= 50 && not <= 59) { System.out.println("Harf notu: E"); } else if (not >= 0 && not <= 49) { System.out.println("Harf notu: F"); } else { System.out.println("Geçersiz not!"); } } }

Örnek Çıktı:

Not: 95Harf notu: A

Not: 85Harf notu: B

Not: 45Harf notu: F

Analitik Perspektif: Metot, O(1) zaman karmaşıklığına sahiptir, çünkü sabit sayıda koşullu kontrol yapar. Gerçek dünyada, notun ondalıklı olabileceği durumlar için double kullanılabilir veya geçersiz notlar için daha ayrıntılı hata yönetimi eklenebilir.

Soru 3: Verilen bir sayının faktöriyelini hesaplayan ve sonucu geri döndüren metodu yazınız.

Açıklama:

Bu soruda, bir tamsayının faktöriyelini hesaplayan bir metot yazılacak ve sonuç döndürülecek. Faktöriyel, bir sayının kendisinden 1’e kadar olan tüm pozitif tamsayıların çarpımıdır (örneğin, 5! = 5 × 4 × 3 × 2 × 1 = 120). 0! = 1 olarak tanımlıdır. Negatif sayılar için faktöriyel tanımsızdır. Java’da büyük sayılar için long kullanılabilir, ancak çok büyük faktöriyeller (örneğin, 20!’den sonrası) long sınırını aşar. Soru, veri tipi belirtmediği için long kullanacağız ve negatif sayılar için hata yönetimi ekleyeceğiz.

  • Adım 1: Metot, int tipinde bir parametre alır.
  • Adım 2: Negatif sayılar için hata kontrolü yapılır.
  • Adım 3: Faktöriyel, döngüyle (veya rekürsif olarak) hesaplanır.
  • Adım 4: Sonuç, long tipinde döndürülür.

Çözüm:

public long faktoriyelHesapla(int n) { if (n < 0) { return -1; // Negatif sayılar için hata } if (n == 0 || n == 1) { return 1; } long sonuc = 1; for (int i = 2; i <= n; i++) { sonuc *= i; } return sonuc; }

Test Kodu:

public class Main { public static void main(String[] args) { System.out.println("5! = " + faktoriyelHesapla(5)); System.out.println("0! = " + faktoriyelHesapla(0)); System.out.println("-1! = " + faktoriyelHesapla(-1)); } public static long faktoriyelHesapla(int n) { if (n < 0) { return -1; } if (n == 0 || n == 1) { return 1; } long sonuc = 1; for (int i = 2; i <= n; i++) { sonuc *= i; } return sonuc; } }

Örnek Çıktı:

5! = 120

0! = 1

-1! = -1 (Hata göstergesi)

Analitik Perspektif: Metot, O(n) zaman karmaşıklığına sahiptir. long, 20!’ye kadar doğru sonuç verir; daha büyük sayılar için BigInteger kullanılabilir. Negatif sayılar için istisna fırlatma (IllegalArgumentException) daha uygun olabilir.

Soru 4: Taban ve üs tamsayı değerlerini parametre olarak alan ve üs alma işleminin sonucunu döndüren metodu yazınız.

Açıklama:

Bu soruda, taban ve üs değerleri tamsayı olarak alınacak ve tabanın üssü hesaplanıp döndürülecek (örneğin, 2³ = 8). Üs alma, tabanın kendisiyle üs sayısı kadar çarpılmasıdır. Negatif üsler için sonuç ondalıklı olabilir (örneğin, 2⁻¹ = 0.5), ancak tamsayı sonucu döndürmek için long kullanacağız ve negatif üsleri dikkate almayacağız (soru bunu belirtmediği için). Büyük sonuçlar için long uygun, ancak taşma riski var.

  • Adım 1: Metot, iki int parametresi alır: taban ve üs.
  • Adım 2: Üs sıfırsa, sonuç 1’dir.
  • Adım 3: Üs pozitifse, döngüyle taban üs kez çarpılır.
  • Adım 4: Sonuç long olarak döndürülür.

Çözüm:

public long usHesapla(int taban, int us) { if (us < 0) { return -1; // Negatif üs için hata } if (us == 0) { return 1; } long sonuc = 1; for (int i = 0; i < us; i++) { sonuc *= taban; } return sonuc; }

Test Kodu:

public class Main { public static void main(String[] args) { System.out.println("2^3 = " + usHesapla(2, 3)); System.out.println("5^0 = " + usHesapla(5, 0)); System.out.println("3^-1 = " + usHesapla(3, -1)); } public static long usHesapla(int taban, int us) { if (us < 0) { return -1; } if (us == 0) { return 1; } long sonuc = 1; for (int i = 0; i < us; i++) { sonuc *= taban; } return sonuc; } }

Örnek Çıktı:

2^3 = 8

5^0 = 1

3^-1 = -1 (Hata göstergesi)

Analitik Perspektif: Metot, O(n) zaman karmaşıklığına sahiptir, n üs değeridir. Daha verimli bir çözüm için karekök algoritması (O(log n)) kullanılabilir. long taşma riski taşır; büyük sayılar için BigInteger düşünülebilir.

Soru 5: Aşağıdaki kod parçası çalıştığında ekran çıktısı ne olur?

Kod:

int n = 11; int a = 0, b = 1; for (int i = 0; i < n; i++) { System.out.print(a + " "); int gecici = a + b; a = b; b = gecici; }

Açıklama:

Bu kod, Fibonacci dizisinin ilk 11 elemanını yazdırır. Fibonacci dizisinde her sayı, önceki iki sayının toplamıdır: 0, 1, 1, 2, 3, 5, 8, ... Kodun işleyişini adım adım inceleyelim:

  • Başlangıç: a = 0, b = 1, n = 11.
  • Döngü: for (int i = 0; i < n; i++), 11 kez çalışır (i = 0, 1, ..., 10).
  • Adımlar:
    • System.out.print(a + " "): Mevcut a yazdırılır.
    • int gecici = a + b: Bir sonraki Fibonacci sayısı hesaplanır.
    • a = b: a, bir sonraki sayıya geçer.
    • b = gecici: b, yeni hesaplanan sayıya geçer.

Adım Adım Hesaplama:

  1. i=0: a=0, yazdır: 0, gecici=0+1=1, a=1, b=1
  2. i=1: a=1, yazdır: 1, gecici=1+1=2, a=1, b=2
  3. i=2: a=1, yazdır: 1, gecici=1+2=3, a=2, b=3
  4. i=3: a=2, yazdır: 2, gecici=2+3=5, a=3, b=5
  5. i=4: a=3, yazdır: 3, gecici=3+5=8, a=5, b=8
  6. i=5: a=5, yazdır: 5, gecici=5+8=13, a=8, b=13
  7. i=6: a=8, yazdır: 8, gecici=8+13=21, a=13, b=21
  8. i=7: a=13, yazdır: 13, gecici=13+21=34, a=21, b=34
  9. i=8: a=21, yazdır: 21, gecici=21+34=55, a=34, b=55
  10. i=9: a=34, yazdır: 34, gecici=34+55=89, a=55, b=89
  11. i=10: a=55, yazdır: 55, gecici=55+89=144, a=89, b=144

Çıktı: 0 1 1 2 3 5 8 13 21 34 55

Örnek Çıktı:

0 1 1 2 3 5 8 13 21 34 55

Analitik Perspektif: Kod, Fibonacci dizisini O(n) karmaşıklıkla üretir. Büyük n değerleri için int taşabilir; long veya BigInteger kullanılabilir. Kod, basit ve etkilidir, ancak rekürsif bir çözüm daha az tercih edilir (O(2ⁿ) karmaşıklık).

Soru 6: Aşağıdaki kod parçası çalıştığında ekran çıktısı ne olur?

Kod:

int sayi = 5; int sonuc = 1; while(sayi > 0) { sonuc *= sayi; sayi--; System.out.print(sonuc + " "); }

Açıklama:

Bu kod, 5’in faktöriyelini hesaplar ve her adımda ara sonucu yazdırır. Faktöriyel, sayının kendisiyle 1’e kadar olan sayıların çarpımıdır (5! = 5 × 4 × 3 × 2 × 1 = 120). Ara sonuçlar, çarpımın her adımında yazdırılır.

  • Başlangıç: sayi = 5, sonuc = 1.
  • Döngü: while(sayi > 0), sayi sıfır olana kadar devam eder.
  • Adımlar:
    • sonuc *= sayi: Sonuca sayıyı çarpar.
    • sayi--: Sayıyı bir azaltır.
    • System.out.print(sonuc + " "): Ara sonucu yazdırır.

Adım Adım Hesaplama:

  1. sayi = 5, sonuc = 1
    • sonuc = 1 * 5 = 5
    • sayi = 5 - 1 = 4
    • Yazdır: 5
  2. sayi = 4, sonuc = 5
    • sonuc = 5 * 4 = 20
    • sayi = 4 - 1 = 3
    • Yazdır: 20
  3. sayi = 3, sonuc = 20
    • sonuc = 20 * 3 = 60
    • sayi = 3 - 1 = 2
    • Yazdır: 60
  4. sayi = 2, sonuc = 60
    • sonuc = 60 * 2 = 120
    • sayi = 2 - 1 = 1
    • Yazdır: 120
  5. sayi = 1, sonuc = 120
    • sonuc = 120 * 1 = 120
    • sayi = 1 - 1 = 0
    • Yazdır: 120
  6. sayi = 0, döngü biter.

Çıktı: 5 20 60 120 120

Örnek Çıktı:

5 20 60 120 120

Analitik Perspektif: Kod, O(n) karmaşıklıkla faktöriyel hesaplar ve ara sonuçları gösterir. Son çarpım (1 ile çarpma) gereksizdir, ancak çıktıya dahil edilir. Büyük sayılar için long veya BigInteger gerekebilir.

Soru 7: Aşağıdaki kod parçası çalıştığında ekran çıktısı ne olur?

Kod:

int sayi = 2025; int sonuc = 0; while(sayi > 0) { int abc = sayi % 10; sonuc += abc; sayi = sayi / 10; System.out.print(abc + " "); } System.out.print(sonuc + " ");

Açıklama:

Bu kod, 2025 sayısının rakamlarını sağdan sola yazdırır ve rakamların toplamını hesaplayıp en son toplamı yazdırır. İşlemi adım adım inceleyelim:

  • Başlangıç: sayi = 2025, sonuc = 0.
  • Döngü: while(sayi > 0), sayi sıfır olana kadar devam eder.
  • Adımlar:
    • abc = sayi % 10: Son rakamı alır.
    • sonuc += abc: Rakamı toplama ekler.
    • sayi = sayi / 10: Son rakamı siler.
    • System.out.print(abc + " "): Rakamı yazdırır.
  • Son: Döngü bittikten sonra System.out.print(sonuc + " ") toplamı yazdırır.

Adım Adım Hesaplama:

  1. sayi = 2025, sonuc = 0
    • abc = 2025 % 10 = 5
    • sonuc = 0 + 5 = 5
    • sayi = 2025 / 10 = 202
    • Yazdır: 5
  2. sayi = 202, sonuc = 5
    • abc = 202 % 10 = 2
    • sonuc = 5 + 2 = 7
    • sayi = 202 / 10 = 20
    • Yazdır: 2
  3. sayi = 20, sonuc = 7
    • abc = 20 % 10 = 0
    • sonuc = 7 + 0 = 7
    • sayi = 20 / 10 = 2
    • Yazdır: 0
  4. sayi = 2, sonuc = 7
    • abc = 2 % 10 = 2
    • sonuc = 7 + 2 = 9
    • sayi = 2 / 10 = 0
    • Yazdır: 2
  5. sayi = 0, döngü biter.
  6. Son: sonuc = 9, yazdır: 9

Çıktı: 5 2 0 2 9

Örnek Çıktı:

5 2 0 2 9

Analitik Perspektif: Kod, O(log n) karmaşıklıkla çalışır, n sayının değeridir (basamak sayısı log₁₀(n)). Rakamları sağdan sola yazdırması, sayının ters sırasını verir. Toplamın yazdırılması, kodun işlevselliğini artırır.