CodeBlanks Logo Icon CodeBlanks

Sıcaklık dönüştürücü

Celsius ile Fahrenheit arasında dönüşüm yapan bir CLI yazarsın.

Bitirme görevi: sıcaklık dönüştürücü

Son görevde "100C" ya da "32F" gibi girdileri okuyup diğer birime çeviren bir araç yazacaksın. Gerçek programda girdiler std::env::args()'tan gelir; burada bir dizi kullanacağız. Adımlar: son karakteri birim olarak ayır, kalanı f64'e çevir, birime göre formülü uygula:

C → F: c * 9.0 / 5.0 + 32.0
F → C: (f - 32.0) * 5.0 / 9.0

Geçersiz girdide program çökmemeli; fonksiyon Option<String> döndürsün.

? ile Option

Option döndüren bir fonksiyonda ?, None'ı hemen yukarı taşır. parse() bir Result verdiği için önce ok() ile Option'a çevrilir:

fn donustur(g: &str) -> Option<String> {
    let (sayi, birim) = g.split_at(g.len() - 1);
    let n: f64 = sayi.parse().ok()?;
    match birim {
        "C" => Some(format!("{g} = {:.1}F", n * 9.0 / 5.0 + 32.0)),
        "F" => Some(format!("{g} = {:.1}C", (n - 32.0) * 5.0 / 9.0)),
        _ => None,
    }
}

Not: boş girdide g.len() - 1 taşar; gerçek bir araçta önce boşluğu denetle.

Uygulama Dönüştürücü

Yukarıdaki fn donustur(g: &str) -> Option<String> fonksiyonunu yaz. ["100C", "32F", "abc"] girdilerini dolaşıp sonucu yazdır; None için GİRDİ: geçersiz yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn donustur(g: &str) -> Option<String> {
    let (sayi, birim) = g.split_at(g.len() - 1);
    let n: f64 = sayi.parse().ok()?;
    match birim {
        "C" => Some(format!("{g} = {:.1}F", n * 9.0 / 5.0 + 32.0)),
        "F" => Some(format!("{g} = {:.1}C", (n - 32.0) * 5.0 / 9.0)),
        _ => None,
    }
}

fn main() {
    for g in ["100C", "32F", "abc"] {
        match donustur(g) {
            Some(s) => println!("{}", s),
            None => println!("{}: geçersiz", g),
        }
    }
}

Beklenen çıktı

100C = 212.0F
32F = 0.0C
abc: geçersiz

Soru ve cevaplar

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

1 <code>"100C".split_at(3)</code> ne döndürür?

  • ("100", "C") Doğru cevap
  • ("100C", "")
  • ("10", "0C")
  • Some(("100", "C"))

Açıklama: split_at verilen bayt konumundan iki dilime böler ve doğrudan tuple döndürür.

2 Result'tan Option'a

Soru
let n: f64 = sayi.parse().____?;
Cevap
let n: f64 = sayi.parse().ok()?;

Açıklama: ok() Result'ı Option'a çevirir; ? de None'ı yukarı taşır.

3 Girdi ve sonuç

Kavram Anlamı
100C 212.0F
32F 0.0C
0C 32.0F
abc geçersiz

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