2024-2025 Java Final Sınavı

Cevaplar ve Açıklamalar

Soru 1: Kullanıcıdan kesirli sayı tipinde boy bilgisini cm olarak alan ve ideal kiloyu aşağıdaki formüle göre hesaplayıp ekrana yazdıran metodu yazınız.

Not: Ideal kilo = (boy – 150) * 0.9 + 50

Açıklama:

Bu soruda, kullanıcıdan boy bilgisini kesirli sayı (ondalıklı sayı) olarak almamız gerekiyor, bu nedenle Java’da double veya float veri tipi kullanılabilir. double, daha yüksek hassasiyet sağladığı için tercih edilir. Metot, boy bilgisini parametre olarak alacak, verilen formülü uygulayacak ve sonucu ekrana yazdıracak. Kullanıcı girdisini almak için Scanner sınıfını kullanabiliriz, ancak metot sadece hesaplama ve yazdırma işlemini yapacaksa, girdiyi metot dışında alabiliriz. Soru, metodu yazmamızı istediği için, metot odaklı bir çözüm sunacağız.

  • Adım 1: Metot, double tipinde bir boy parametresi alır.
  • Adım 2: Formül uygulanır: (boy - 150) * 0.9 + 50.
  • Adım 3: Sonuç, System.out.println ile ekrana yazdırılır.
  • Ek Not: Metot, void olabilir çünkü sadece ekrana yazdırma yapıyor; dönüş değeri gerekmiyor. Ayrıca, boyun negatif veya mantıksız (örneğin, çok küçük) olmaması için doğrulama eklenebilir, ancak soru bunu talep etmediği için basit bir çözüm sunulacak.

Çözüm:

public void idealKiloHesapla(double boy) { double idealKilo = (boy - 150) * 0.9 + 50; System.out.println("Ideal kilonuz: " + idealKilo + " kg"); }

Test Kodu: Metodun nasıl kullanılacağını göstermek için bir test kodu:

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Boyunuzu cm cinsinden giriniz: "); double boy = scanner.nextDouble(); idealKiloHesapla(boy); scanner.close(); } public static void idealKiloHesapla(double boy) { double idealKilo = (boy - 150) * 0.9 + 50; System.out.println("Ideal kilonuz: " + idealKilo + " kg"); } }

Örnek Çıktı:

Girdi: 170

Çıktı: Ideal kilonuz: 68.0 kg

Hesaplama: (170 - 150) * 0.9 + 50 = 20 * 0.9 + 50 = 18 + 50 = 68

Analitik Perspektif: Metot, basit bir matematiksel formülü uygular ve kullanıcı dostu bir çıktı üretir. Gerçek dünyada, boy için geçerlilik kontrolleri (örneğin, 100 cm < boy < 250 cm) ve hata yönetimi eklenebilir. Ayrıca, çıktıyı daha hassas hale getirmek için String.format("%.2f", idealKilo) kullanılarak ondalık basamaklar sınırlandırılabilir.

Soru 2: Kullanıcıdan bir tamsayı değer alan ve ekrana girilen sayının tek mi çift mi olduğunu yazdıran metotu yazınız.

Açıklama:

Bu soruda, kullanıcıdan bir tamsayı alınacak ve sayının tek mi yoksa çift mi olduğu kontrol edilip ekrana yazdırılacak. Tamsayı için Java’da int veri tipi uygundur. Bir sayının tek veya çift olduğunu belirlemek için mod operatörü (%) kullanılır: Eğer sayi % 2 == 0 ise sayı çifttir, değilse tektir. Metot, tamsayıyı parametre olarak alacak ve sonucu ekrana yazdıracak, bu nedenle void dönüş tipine sahip olacak.

  • Adım 1: Metot, int tipinde bir parametre alır.
  • Adım 2: Sayının modunu kontrol etmek için sayi % 2 kullanılır.
  • Adım 3: Sonuç, System.out.println ile ekrana yazdırılır.
  • Ek Not: Negatif sayılar için de mod operatörü doğru çalışır (örneğin, -4 % 2 == 0), bu nedenle ek kontrol gerekmez.

Çözüm:

public void tekCiftKontrol(int sayi) { if (sayi % 2 == 0) { System.out.println(sayi + " çift bir sayıdır."); } else { System.out.println(sayi + " tek bir sayıdır."); } }

Test Kodu:

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Bir tamsayı giriniz: "); int sayi = scanner.nextInt(); tekCiftKontrol(sayi); scanner.close(); } public static void tekCiftKontrol(int sayi) { if (sayi % 2 == 0) { System.out.println(sayi + " çift bir sayıdır."); } else { System.out.println(sayi + " tek bir sayıdır."); } } }

Örnek Çıktı:

Girdi: 6

Çıktı: 6 çift bir sayıdır.

Girdi: 7

Çıktı: 7 tek bir sayıdır.

Analitik Perspektif: Metot, temel bir karar yapısı (if-else) kullanarak hızlı ve doğru sonuç verir. Gerçek dünyada, metot bir boolean döndürebilir (return sayi % 2 == 0) ve yazdırma işlemi çağıran tarafından yapılabilir, böylece metot daha esnek olur.

Soru 3: Aşağıda boş bırakılan yere okul numaranızı yazınız. Kod çalıştırıldıktan sonra ekran çıktısı ne olur?

Kod:

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

Açıklama:

Bu soruda, bir okul numarası (örneğin, 12345) sayi değişkenine atanacak ve kod çalıştırılacak. Kod, sayının rakamlarını tek tek ayırarak toplamını hesaplar ve her adımda ara toplamı ekrana yazdırır. İşlemi adım adım inceleyelim:

  • Başlangıç: toplam = 0, sayi okul numarası (örneğin, 12345).
  • Döngü Koşulu: while (sayi > 0), yani sayı sıfır olana kadar döngü devam eder.
  • Adımlar:
    • sayi % 10: Sayının son rakamını alır (örneğin, 12345 için 5).
    • toplam += sayi % 10: Son rakamı toplama ekler.
    • sayi = sayi / 10: Sayının son rakamını atar (12345 / 10 = 1234).
    • System.out.print(toplam + " "): Ara toplamı ekrana yazdırır.
  • Süreç: Döngü, sayının tüm rakamları işlenene kadar devam eder, her adımda toplam güncellenir ve yazdırılır.

Örnek Okul Numarası: 12345

Adım adım hesaplama:

  1. Başlangıç: sayi = 12345, toplam = 0
    • sayi % 10 = 5, toplam = 0 + 5 = 5
    • sayi = 12345 / 10 = 1234
    • Yazdır: 5
  2. sayi = 1234, toplam = 5
    • sayi % 10 = 4, toplam = 5 + 4 = 9
    • sayi = 1234 / 10 = 123
    • Yazdır: 9
  3. sayi = 123, toplam = 9
    • sayi % 10 = 3, toplam = 9 + 3 = 12
    • sayi = 123 / 10 = 12
    • Yazdır: 12
  4. sayi = 12, toplam = 12
    • sayi % 10 = 2, toplam = 12 + 2 = 14
    • sayi = 12 / 10 = 1
    • Yazdır: 14
  5. sayi = 1, toplam = 14
    • sayi % 10 = 1, toplam = 14 + 1 = 15
    • sayi = 1 / 10 = 0
    • Yazdır: 15
  6. sayi = 0, döngü biter.

Çıktı: 5 9 12 14 15

Örnek Çıktı (Okul Numarası: 12345):

5 9 12 14 15

Not: Çıktı, okul numarasına bağlıdır. Örneğin, okul numarası 54321 için çıktı: 1 4 7 10 15 olur.

Analitik Perspektif: Kod, bir sayının rakamlarını sağdan sola işler ve kümülatif toplamları yazdırır. Negatif sayılar için kod çalışmaz, çünkü sayi > 0 koşulu sağlanmaz. Performans açısından, döngü O(log n) karmaşıklığa sahiptir, çünkü sayının basamak sayısı log₁₀(n) ile orantılıdır.

Soru 4: Parametre olarak bir dizi alan ve bu dizinin tek sayı elemanlarını 3 ile, çift sayı elemanlarını 2 ile çarpıp güncel diziyi geri döndüren metodu yazınız.

Açıklama:

Bu soruda, bir tamsayı dizisi parametre olarak alınacak, dizideki elemanlar kontrol edilecek: tek sayılar 3 ile, çift sayılar 2 ile çarpılacak. Güncellenmiş dizi geri döndürülecek. Java’da diziler referans tiplidir, yani metot içinde yapılan değişiklikler orijinal diziyi etkiler. Metot, int[] tipinde dönüş yapabilir, çünkü dizi geri döndürülmesi isteniyor.

  • Adım 1: Metot, int[] dizi parametresi alır.
  • Adım 2: Dizi elemanları döngüyle taranır.
  • Adım 3: Her eleman için:
    • Eğer eleman % 2 == 0 (çift), 2 ile çarpılır.
    • Eğer eleman % 2 != 0 (tek), 3 ile çarpılır.
  • EAdım: Güncellenmiş dizi döndürülür.
  • Ek Not: Dizi boşsa, metot boş diziyi döndürür. Negatif sayılar için de mod operatörü doğru çalışır.

Çözüm:

public int[] diziCarp(int[] dizi) { for (int i = 0; i < dizi.length; i++) { if (dizi[i] % 0 == 2 { dizi[i] *= 2; // Çift sayılar 2 ile çarpılır } else { dizi[i] *= 3; // Tek sayılar 3 ile çarpılır } } return dizi; }

Test Kodu:

import java.util.Arrays; public class Main { public static void main(String[] args) { int[] testDizi = {1, 2, 3, 4, 6}; System.out.println("Orijinal dizi: " + Arrays.toString(testDizi)); int[] sonuc = diziCarp(testDizi); System.out.println("Güncel dizi: " + Arrays.toString(sonuc)); } public static int[] diziCarp(int[] dizi) { for (int i = 0; i < dizi.length; i++) { if (dizi[i] % 2 == 0 { dizi[i] *= 2; } else { dizi[i] *= 3; } } return dizi; } }

Örnek Çıktı:

Orijinal dizi: [1, 2, 3, 4, 6]

Güncel dizi:

[3, 4, 9, 8, 12]

Hesaplama:

  • 1 (tek): 1 * 3 = 3
  • 2 (çift): 2 * 2 = 4
  • 3 (tek): 3 * 3 = 9
  • 4 (çift): 4 * 2 = 8
  • 6 (çift): 6 * 2 = 12

Analitik Perspektif: Metot, diziyi yerinde (in-place) günceller, bu da bellek kullanımını optimize eder. O(n) zaman karmaşıklığına sahiptir, n dizi boyutudur. Gerçek dünyada, orijinal diziyi korumak için yeni bir dizi oluşturulabilir, ancak bu ek bellek maliyeti getirir.

Soru 5: Aşağıda boş bırakılan yere ad ve soyadınızı yazınız. Kod çalıştırıldıktan sonra ekran çıktısı ne olur?

Kod:

String kelime = “…………………”; // Ad ve soyadı for(int i = 1; i < kelime.length(); i += 2) { System.out.print("-" + kelime.charAt(i)); }

Açıklama:

Bu soruda, kelime değişkenine ad ve soyad yazılacak (örneğin, "Ahmet Yilmaz"), kod çalıştırılacak ve belirli bir çıktı üretilecek. Kod, stringin tek indeksli karakterlerini (1, 3, 5...) bir tire işaretiyle birlikte yazdırır. İşlemi adım adım inceleyelim:

  • Döngü: for(int i = 1; i < kelime.length(); i += 2), i=1’den başlar, her adımda 2 artar (1, 3, 5...).
  • İşlem: Her döngüde, kelime.charAt(i) ile i’nci indeksdeki karakter alınır ve önüne tire eklenerek yazdırılır.
  • Not: İndeksler 0’dan başlar, bu nedenle i=1, ikinci karakteri (örneğin, "Ahmet Yilmaz" için ‘h’) alır.
  • Boş String Durumu: Eğer kelime boşsa, döngü çalışmaz, çıktı olmaz.

Örnek Ad ve Soyad: "Ahmet Yilmaz"

Kelime: "Ahmet Yilmaz" (uzunluk 12)

Adım adım:

  • i = 1: charAt(1) = 'h', yazdır: -h
  • i = 3: charAt(3) = 'e', yazdır: -e
  • i = 5: charAt(5) = ' ', yazdır: -
  • i = 7: charAt(7) = 'i', yazdır: -i
  • i = 9: charAt(9) = 'm', yazdır: -m
  • i = 11: charAt(11) = 'z', yazdır: -z
  • i = 13: Döngü biter, çünkü 13 >= 12.

Çıktı: -h-e- -i-m-z

Örnek Çıktı (Ad ve Soyadı: Ahmet Yilmaz):

-h-e- -i-m-z

Not: Çıktı, ad ve soyadına bağlıdır. Örneğin, “Ali Veli” için çıktı: -l- -e-i

Analitik Perspektif: Kod, stringin her ikinci karakterini alır, O(n/2) karmaşıklığa sahiptir. Gerçek dünyada, stringin null veya boş olduğu durumlar için kontrol eklenebilir. Çıktı, tirelerin karakterleri ayırması nedeniyle okunabilir bir formattadır.