Bölüm 1: Algoritmalar

Bölüm 1: Algoritmalar · Çalışma Soruları
Algoritmanın özellikleriTest senaryolarıFonksiyonlarFaktöriyel ve FibonacciPalindrom ve asal sayıDoğrusal aramaİkili aramaSeçimli sıralamaKabarcık sıralama
Sercan KÜLCÜ

Çoktan Seçmeli · Problem Çözme

Soru 1: “Biraz Tuz Ekle”

Bir yemek tarifindeki “biraz tuz ekle” adımı bilgisayar için yeterli değildir. Bu adım algoritmanın hangi özelliğine aykırıdır?

B: Kesinlik, her adımın açık ve tek anlamlı olmasını ister; “biraz” kişiden kişiye değişir. Sonluluk algoritmanın bitmesi, etkinlik her adımın gerçekten yapılabilmesidir.

Çoktan Seçmeli · Problem Çözme

Soru 2: Sınır Durum

Bir metindeki kelime sayısını bulan program için test senaryoları yazılıyor. Hangisi bir sınır durum (edge case) testidir?

D: Boş metin, sıfır, negatif sayı gibi uç girdiler hataların en sık saklandığı yerlerdir; beklenen çıktı önceden yazılır. A, B ve C sıradan girdilerdir.

Adım Adım Çalıştırma · Koda Dönüştürme

Soru 3: Fonksiyon Çağrıları

Program ne yazdırır? Çağrılar hangi sırayla yapılır?

Program main'den başlar. topla çağrılmadan önce argümanları hesaplanır: önce kare(3).

kare için yeni çerçeve: x = 3, 3 · 3 = 9 döndürülür; çerçeve kalkar.

İkinci argüman: kare(4) = 16.

Argümanlar hazır: topla(9, 16) çağrılır, 25 döndürür.

s = 25 olur ve yazdırılır. kare ve topla'nın değişkenleri artık yoktur.

İçteki çağrı önce: topla(1, 2) = 3.

Dönen 3 kare'nin argümanı olur: kare(3) = 9.

9 yazdırılır, main biter. Çıktı: 25 ve 9; en fazla iki çerçeve aynı anda yığındaydı.

static int kare(int x) {
    return x * x;
}
static int topla(int a, int b) {
    return a + b;
}
public static void main(String[] args) {
    int s = topla(kare(3), kare(4));
    System.out.println(s);
    System.out.println(kare(topla(1, 2)));
}

Çoktan Seçmeli · Koda Dönüştürme

Soru 4: print ve println

Kod ekrana ne yazar?

double a = 7, b = 2;
System.out.print(a / b);
System.out.println(" " + (int) a / 2);

A: a ve b double olduğu için a / b = 3.5. print alt satıra geçmez, println aynı satıra devam eder. (int) a önce yapılır (7), sonra 7 / 2 tam sayı bölmesi = 3.

Adım Adım Çalıştırma · Örnek Algoritmalar

Soru 5: Asal mı: 91

Program ne yazdırır? Döngü kaç bölen dener?

denenen bölenler (altta kalan)

91 ≥ 2: bayrak true kalır. Döngü sınırı 91 / 2 = 45.

21

91 % 2 = 1 ≠ 0, devam.

2131

91 % 3 = 1 ≠ 0, devam.

213143

91 % 4 = 3 ≠ 0, devam.

21314351

91 % 5 = 1 ≠ 0, devam.

2131435161

91 % 6 = 1 ≠ 0, devam.

213143516170

91 % 7 = 0 → tam bölünüyor (91 = 7 · 13). Bayrak indirilir, break ile döngüden çıkılır.

213143516170

Bayrak false → else kolu. 6 bölen denendi; 8–45 hiç denenmedi.

int sayi = 91;
boolean asalMi = true;
if (sayi < 2) asalMi = false;
for (int bolen = 2; bolen <= sayi / 2; bolen++) {
    if (sayi % bolen == 0) {
        asalMi = false;
        break;
    }
}
if (asalMi) System.out.println(sayi + " asal");
else System.out.println(sayi + " asal değil");

Çıktı Sorusu · Örnek Algoritmalar

Soru 6: Fibonacci: n = 8

Program ne yazdırır? for döngüsü kaç kez döner?

int n = 8;
int a = 0, b = 1, sonuc;
if (n >= 1) System.out.print(a + " ");
if (n >= 2) System.out.print(b + " ");
for (int i = 2; i <= n - 1; i++) {
    sonuc = a + b;
    a = b;
    b = sonuc;
    System.out.print(sonuc + " ");
}
Cevabı göster
0 1 1 2 3 5 8 13 

İlk iki terim (0, 1) döngüden önce yazılır. Döngü i = 2 … 7 için 6 kez (n − 2) döner: 1, 2, 3, 5, 8, 13.

Her turda a = b; b = sonuc; son iki terimi bir adım kaydırır. Bu iki satırın yeri değişirse sonuç bozulur.

Hata Bulma · Örnek Algoritmalar

Soru 7: Faktöriyelde İki Hata

Kod 5! = 120 yazdırmalıydı. Ne yazdırır? İki hatayı bulup düzeltin.

int sayi = 5;
int faktoriyel = 0;
for (int i = 1; i < sayi; i++) {
    faktoriyel = faktoriyel * i;
}
System.out.println(faktoriyel);
Cevabı göster
0

(1) Biriktirici 0 ile başlıyor: her çarpım 0 olur. Çarpmada etkisiz eleman 1'dir: faktoriyel = 1.

(2) i < sayi son çarpanı (5) atlar: i <= sayi olmalıdır. Düzeltilince 120 yazılır. 13! int'e sığmadığı için büyük sayılarda long kullanılır.

Çoktan Seçmeli · Örnek Algoritmalar

Soru 8: Palindromda ==

Palindrom programında temiz.equals(tersGirdi) yerine temiz == tersGirdi yazıldı. Girdi "abcba" iken koşul ne olur?

String temiz = "abcba";
String tersGirdi = new StringBuilder(temiz)
        .reverse().toString();
if (temiz == tersGirdi) { /* ... */ }

C: tersGirdi StringBuilder ile yeni bir nesne olarak üretilir; içerikleri aynı olsa da iki ayrı nesnedir ve == false verir. Kod derlenir (A yanlış). İçerik karşılaştırması equals ile yapılır.

Çıktı Sorusu · Örnek Algoritmalar

Soru 9: Basamakları Toplama

Program ne yazdırır?

int sayi = 4071, toplam = 0, adim = 0;
while (sayi > 0) {
    toplam += sayi % 10;
    sayi = sayi / 10;
    adim++;
}
System.out.println(toplam + " " + adim);
Cevabı göster
12 4
tursayi % 10toplamsayi
111407
27840
3084
44120

% 10 son basamağı verir, / 10 onu atar. adim basamak sayısıdır.

Çoktan Seçmeli · Arama Algoritmaları

Soru 10: Sırasız Dizide İkili Arama

{77, 42, 64, 12, 23, 55, 7, 48, 31} dizisinde ikili arama ile 77 aranıyor. Ne olur?

C: Sırasıyla 23, 7, 48 ve 31'e bakılır: 77 hepsinden büyük olduğu için hep sağa gidilir ve 0. indisteki 77 hiç incelenmez; −1 döner. İkili arama sıralı veri varsayar; bunu denetlemez, uyarı da vermez.

Adım Adım Çalıştırma · Arama Algoritmaları

Soru 11: İkili Arama: 41

{3, 9, 14, 20, 27, 33, 41, 50, 58, 66} dizisinde 41 aranıyor. Hangi öğelere bakılır, metot ne döndürür?

3091142203274335416507588669

Arama alanı bütün dizi: alt = 0, ust = 9.

3091142203274335416507588669

orta = (0 + 9) / 2 = 4 → 27. 41 > 27: sağ yarı, alt = 5.

3091142203274335416507588669

orta = (5 + 9) / 2 = 7 → 50. 41 < 50: sol yarı, ust = 6.

3091142203274335416507588669

orta = (5 + 6) / 2 = 5 → 33. 41 > 33: sağ yarı, alt = 6.

3091142203274335416507588669

orta = (6 + 6) / 2 = 6 → dizi[6] = 41: bulundu, return 6. 4 karşılaştırma yetti.

int alt = 0, ust = dizi.length - 1;
while (alt <= ust) {
    int orta = (alt + ust) / 2;
    if (dizi[orta] == hedef) {
        return orta;
    } else if (hedef < dizi[orta]) {
        ust = orta - 1;
    } else {
        alt = orta + 1;
    }
}
return -1;

Çoktan Seçmeli · Arama Algoritmaları

Soru 12: En Kötü Durum

100 öğeli sıralı bir dizide aranan öğe yoksa doğrusal ve ikili arama en fazla kaç karşılaştırma yapar?

A: Doğrusal arama her öğeye bakar: 100. İkili arama her adımda alanı yarıya indirir: ⌊log₂ 100⌋ + 1 = 6 + 1 = 7 (100 → 50 → 25 → 12 → 6 → 3 → 1). n iki katına çıkınca ikili aramanın işi yalnızca bir artar.

Çıktı Sorusu · Arama Algoritmaları

Soru 13: Kaç Kez Geçiyor?

Doğrusal aramanın bu çeşidi ne yazdırır?

int[] dizi = {5, 8, 3, 8, 1, 8};
int ilk = -1, son = -1, adet = 0;
for (int i = 0; i < dizi.length; i++) {
    if (dizi[i] == 8) {
        if (ilk == -1) ilk = i;
        son = i;
        adet++;
    }
}
System.out.println(ilk + " " + son + " " + adet);
Cevabı göster
1 5 3

8; 1, 3 ve 5. indislerde. ilk yalnızca ilk eşleşmede (−1 iken) atanır; son her eşleşmede güncellenir.

return olmadığı için döngü sonuna kadar sürer: hedef bulunsa bile 6 karşılaştırma yapılır.

Çıktı Sorusu · Sıralama Algoritmaları

Soru 14: Seçimli Sıralama

Seçimli sıralama her dış turdan sonra diziyi yazdırıyor. Çıktı nedir? Toplam kaç karşılaştırma yapılır?

int[] dizi = {40, 15, 32, 8, 21};
int n = dizi.length;
for (int i = 0; i < n - 1; i++) {
    int enKucuk = i;
    for (int j = i + 1; j < n; j++)
        if (dizi[j] < dizi[enKucuk]) enKucuk = j;
    int gecici = dizi[i];
    dizi[i] = dizi[enKucuk];
    dizi[enKucuk] = gecici;
    System.out.println(Arrays.toString(dizi));
}
Cevabı göster
[8, 15, 32, 40, 21]
[8, 15, 32, 40, 21]
[8, 15, 21, 40, 32]
[8, 15, 21, 32, 40]

1. tur en küçük 8'i 40 ile yer değiştirir; 2. turda 15 zaten yerindedir (kendisiyle takas); 3. tur 21 ↔ 32; 4. tur 32 ↔ 40.

Karşılaştırma: 4 + 3 + 2 + 1 = 10 = n(n − 1)/2; dizi sıralı olsa da değişmez.

Adım Adım Çalıştırma · Sıralama Algoritmaları

Soru 15: Kabarcık Sıralama

{6, 2, 9, 1, 5} dizisi kabarcık sıralama ile sıralanıyor. Kaç tur, kaç karşılaştırma ve kaç takas yapılır?

6021921354

Başlangıç. Her turda komşular karşılaştırılır; büyük olan sağa kayar.

2061921354

tur 0, j = 0: 6 > 2 → yer değiştir.

2061921354

tur 0, j = 1: 6 ≤ 9, değişiklik yok.

2061129354

tur 0, j = 2: 9 > 1 → yer değiştir.

2061125394

tur 0, j = 3: 9 > 5 → yer değiştir. Tur bitti: 9 yerine oturdu.

2061125394

tur 1, j = 0: 2 ≤ 6, değişiklik yok.

2011625394

tur 1, j = 1: 6 > 1 → yer değiştir.

2011526394

tur 1, j = 2: 6 > 5 → yer değiştir. Tur bitti: 6 yerine oturdu.

1021526394

tur 2, j = 0: 2 > 1 → yer değiştir.

1021526394

tur 2, j = 1: 2 ≤ 5, değişiklik yok. Tur bitti: 5 yerine oturdu.

1021526394

tur 3, j = 0: 1 ≤ 2, değişiklik yok.

1021526394

Bu turda hiç takas olmadı: dizi sıralı, break. Toplam 10 karşılaştırma, 6 takas, 4 tur.

for (int tur = 0; tur < n - 1; tur++) {
    boolean degisti = false;
    for (int j = 0; j < n - 1 - tur; j++) {
        if (dizi[j] > dizi[j + 1]) {
            int gecici = dizi[j];
            dizi[j] = dizi[j + 1];
            dizi[j + 1] = gecici;
            degisti = true;
        }
    }
    if (!degisti) break;
}

Çoktan Seçmeli · Sıralama Algoritmaları

Soru 16: Seçimli Sıralamada Karşılaştırma

Seçimli sıralama 8 öğeli bir dizide kaç karşılaştırma yapar? Dizi baştan sıralı olsaydı ne değişirdi?

D: n(n − 1)/2 = 8 · 7 / 2 = 28. Seçimli sıralama en küçüğü bulmak için kalan her öğeye bakmak zorundadır; dizinin sıralı olması bunu değiştirmez. Erken durmayla n − 1'e inen kabarcık sıralamadır (A bunu karıştırır).

Çoktan Seçmeli · Sıralama Algoritmaları

Soru 17: degisti Bayrağı

Kabarcık sıralamadaki degisti bayrağı ne işe yarar?

B: Bir turda hiç yer değiştirme olmadıysa komşuların hepsi doğru sıradadır; break ile kalan turlar atlanır. Sıralı dizide yalnızca n − 1 karşılaştırma yapılır. A seçimli sıralamadaki enKucuk'tur, D ise gecici değişkenidir.

Son

Bölüm 1: Algoritmalar: Çalışma Soruları
Konu anlatımı: Algoritmalar sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.