Rust Notları -3 (VS Code)

Merhaba,

https://doc.rust-lang.org/book/ dökümandan devam ediyoruz.

4-Tahmin Oyunu Programlama

hello-world projesinde isek hala, cd.. ile ana klasöre geri dönüp cargo new ile yeni proje oluşturuyoruz. code . komutu ile de o projeyi açıyoruz.

uygulama kullanıcıdan bir veri girmesini isteyecek,girdinin beklenen biçimde olup olmadığı kontrol edilecek. senaryo bu şekilde.

1.Adım Oluşturduğumuz projemizde main dosyası içindeki kodu aşağıdaki ile değiştiriyoruz.

use std::io;

fn main() {
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}

** io kütüphanesi, std olarak bilinen standart kütüphaneden geliyor, projeye implementasyonu bu şekilde. std::io kütüphanesini kullanmak, kullanıcı girdisini kabul etme yeteneği de dahil olmak üzere bir dizi özellik sağlar.

** let mut guess = String::new(); == daha sonra kullanıcı girdisini depolamak için bir değişken oluşturuyoruz // mutable bir değişken, yani değiştirilebilir

** iki nokta üst üstenin iki kere kullanılması String::new() string bir yeni değişken oluşturulacağı anlamındadır.

** io::stdin() io modülünün stdin fonksiyonunu kullanmak için bu şekilde bir söz dizim kullanıyoruz. bu fonskiyon ile kullanıcıdan bir veri girişi alacağız.

** standart girdi fonskyionunun read_line methodu ile girilen veri okunur. bu method değiştirilebilir (mutable) bir argüman şeklinde veri alır.

** read_line kullanıcının girdiği her şeyi, ona geçirdiğimiz dizgeye koyar, ancak aynı zamanda bir Result değeri döndürür. Result, genellikle enum olarak adlandırılan bir numaralandırma.

** Result örneğinin çağırabileceğiniz bir expect methodu var. Bu Result örneği bir Err değeriyse, expect programın çökmesine ve expect’e argüman olarak geçirdiğiniz mesajı görüntülemesine neden olur. Result örneği bir Ok değeriyse, expect Ok’in tuttuğu dönüş değerini alır ve yalnızca o değeri size döndürür, böylece onu kullanabilirsiniz.

cargo run komutu ile incelediğimizde;

girdiğim rakamı hata almadan ekrana bastığını görüyoruz.

2.Adım : Kullanıcının tahmin etmeye çalışacağı bir sayı ürettirip (1-100) arası, bununla girdideki rakamı kontrol edeceğiz.

Rand kütüphanesini kullanabilmek için toml dosyasına dependency altına gelecek şekilde ya manuel versionunu ekleyeceğiz;

[dependencies]
rand = "0.8.5"

ya da terminalden;

cargo add rand

komutunu kullanabiliriz. bu komutu kullanmadan önce;

cargo install cargo-edit

ile yapılandırma dosyasında bağımlılıkları yönetmek için faydalı bir araçtır.

daha sonra rand kütüphanesini bağımlılıklara ekliyoruz;

main sınıfı içindeki kod bloklarımıza random elde edilecek sayı için geliştirme yapıyoruz;

use rand::Rng;
//
let secret_number = rand::thread_rng().gen_range(1..=100);

Rng özelliği, rastgele sayı üreteçlerinin uyguladığı yöntemleri tanımlar ve kullanabiLmek için class ımıza ekliyoruz.

İlk satırda, kullanacağımız belirli rastgele sayı üretecini veren rand::thread_rng işlevini çağırıyoruz:Sonra, rastgele sayı üretecinde gen_range yöntemini çağırıyoruz. Bu yöntem, use rand::Rng; ifadesiyle kapsama aldığımız Rng özelliği tarafından tanımlanır. gen_range yöntemi, bir aralık ifadesini argüman olarak alır ve aralıkta rastgele bir sayı üretir. Burada kullandığımız aralık ifadesi türü start..=end biçimini alır ve alt ve üst sınırlarda kapsayıcıdır, bu nedenle 1 ile 100 arasında bir sayı istemek için 1..=100 belirtmemiz gerekir.

cargo run komutu ile test ettiğimizde rastgele verdiği sayıyı ve bizim verdiğimiz sayıyı görebiliyoruz.

3. Adım Karşılaştırma

random ürettirdiğimiz ve girdiğimiz sayıları karşılaştıracağız şimdi de;

standart kütüphaneden std::cmp::Ordering adlı bir türü, kapsama getiriyoruz. Ordering türü başka bir enum’dur ve Less, Greater ve Equal değişkenlerine sahip olduğundan karşılaştırma amacıyla kullanacağız.

cmp yöntemi iki değeri karşılaştırır ve karşılaştırılabilen her şey üzerinde çağrılabilir. guess parametresinden gelen değeri, argümanına aldığı değerle karşılaştırır ve eşleşme ifadelerinden hangisine denk geliyorsa ekrana o bilgiyi yansıtacak.

çalıştırmadan önce string olarak alınan kullanıcı bilgisini de integer tipine dönüştürmemiz gerekiyor.

guess parametremizden sonraki iki nokta üst üste (:) Rust’a değişkenin türünü açıklayacağımızı söylüyor. burada görülen u32 işaretsiz, 32 bitlik bir tam sayıdır. Sadece tam sayıları alır.

u32 için n=32n=32 olduğundan: 0 ile 4,294,967,295 arası değer kovalar.

let guess: u32 = guess.trim().parse().expect("Please type a number!");

trim() ile klavyeden gelebilecek \r\n özelliklerini kaldırmayı parse ile de random ın ürettiği ve karşılaştırma yapabileceğimiz bir veri türü olan u32 ye çevrimini sağladı.

girdiğim 55 verisi, sistemin rastgele verdiği numaraya göre küçük olduğundan ordering yönteminden Less özelliğine girdi ve too small çıktısını verdi.

4.Adım Çoklu Giriş

birden fazla tahminde bulunmak istiyorsak, dışarıdan veri aldğımız kısmı loop içine alabiliriz;

loop {
      ....
}

bunu yaptıktan sonra da match işleminde equal özelliğine denk gelen kısım için bir değişiklik yapmamız gerekiyor, eğer eşitse yani sonucu doğru tahmin edersek sistemden sorunsuz bizi çıkarması için;

  Ordering::Equal =>{
                println!("You win!");
                break;
            },

5.Adım – Doğru Giriş

Klavyeden alınan bilgilerin integer a çevrilebilir bir veri olmasını istediğimiz için bunun da kontrolünü yapmamız gerekiyor;

  let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

pars işlemi ok ise,numarayı dönüyoruz yoksa işleme devam ettiriyoruz ve yeni bir tahminde bulunmasını talep ediyoruz.

……………………

Son olarak main bloğumuz aşağıdaki gibi yazılmış olacak;

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1..=100);

    println!("The secret number is: {secret_number}");

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");

        println!("You guessed: {}", guess);

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal =>{
                println!("You win!");
                break;
            },
        }
    }
}

Yorum bırakın