CodeBlanks Logo Icon CodeBlanks

Döngü ve bitiş

loop ve break ile doğru tahminde oyunu bitirirsin.

Döngü ve bitiş

Oyunu tekrarlatmak için loop kullanılır; doğru tahminde break ile çıkılır. Geçersiz girdide programı çökertmek yerine match ile continue yapılır:

loop {
    let mut tahmin = String::new();
    io::stdin().read_line(&mut tahmin).expect("okunamadı");
    let tahmin: u32 = match tahmin.trim().parse() {
        Ok(n) => n,
        Err(_) => continue,
    };
    match tahmin.cmp(&gizli) {
        Ordering::Less => println!("Çok küçük"),
        Ordering::Greater => println!("Çok büyük"),
        Ordering::Equal => { println!("Bildin!"); break; }
    }
}

Deneme sayacı

Oyunu zenginleştirmek için geçerli tahminleri sayabiliriz. Sayaç döngünün dışında let mut ile tanımlanır; böylece turlar arasında değeri korunur:

let mut deneme = 0;
loop {
    // ... geçerli tahmin okundu
    deneme += 1;
    if tahmin == gizli {
        println!("{deneme} denemede bildin!");
        break;
    }
}

break bir değerle de kullanılabilir: let sonuc = loop { break deneme; };

Uygulama Oyunu oynat

gizli = 28 ve tahmin listesi ["50", "abc", "25", "28"] ile oyunu çalıştır. loop içinde it.next() ile sıradaki tahmini al (bitince break). Geçersizse abc: Geçersiz yazıp continue; geçerliyse sayacı artır ve Büyük/Küçük yaz; eşitse 28: Bildin! (3 deneme) yazıp break.

Başlangıç kodu

main.rs
use std::cmp::Ordering;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::cmp::Ordering;

fn main() {
    let gizli: u32 = 28;
    let tahminler = ["50", "abc", "25", "28"];
    let mut it = tahminler.iter();
    let mut deneme = 0;
    loop {
        let g = match it.next() {
            Some(g) => g,
            None => break,
        };
        let t: u32 = match g.parse() {
            Ok(n) => n,
            Err(_) => {
                println!("{}: Geçersiz", g);
                continue;
            }
        };
        deneme += 1;
        match t.cmp(&gizli) {
            Ordering::Less => println!("{}: Küçük", t),
            Ordering::Greater => println!("{}: Büyük", t),
            Ordering::Equal => {
                println!("{}: Bildin! ({} deneme)", t, deneme);
                break;
            }
        }
    }
}

Beklenen çıktı

50: Büyük
abc: Geçersiz
25: Küçük
28: Bildin! (3 deneme)

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Oyuncu <code>abc</code> girerse yukarıdaki döngü ne yapar?

  • Döngüden çıkar
  • 0 kabul eder
  • Err koluna girer ve yeni tahmin ister Doğru cevap
  • Panic verir

Açıklama: continue döngünün başına döner; program çökmez.

2 Geçersizi atla

Soru
let tahmin: u32 = match g.parse() {
    Ok(n) => n,
    Err(_) => ____,
};
Cevap
let tahmin: u32 = match g.parse() {
    Ok(n) => n,
    Err(_) => continue,
};

Açıklama: continue geçersiz girdiyi atlayıp döngünün sonraki turuna geçer.

3 Anahtar kelime ve etkisi

Kavram Anlamı
loop Sonsuz döngü
break Döngüden çık
continue Sonraki tura geç
Err(_) => Hatayı yakala

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma