Menu
CoddyTech

Ulepszona pętla for

Część sekcji Podstawy ścieżki Rust w Coddy. Lekcja 66 z 75.

Istnieją różne sposoby iterowania po tablicy. Oto niektóre z nich:
Rozważ następującą tablicę:

let numbers = [1, 2, 3, 4, 5];
  • Iterator bezpośredni:

    for num in numbers.iter() {}
    // Wartości: 1, 2, 3, 4, 5
  • Indeks & wartość:

    for (index, value) in numbers.iter().enumerate() { }
    // Wartości: (0,1), (1,2), (2,3), (3,4), (4,5)
  • Wycinki o określonym rozmiarze:

    for chunk in numbers.chunks(2) { }
    // Wartości: [1,2], [3,4], [5]

    Każda porcja jest wycinkiem, więc możesz używać na niej metod wycinków, na przykład chunk.len() zwraca liczbę elementów w tej porcji. Ostatnia porcja może być mniejsza, jeśli tablica nie dzieli się równo.

Możesz także połączyć .enumerate() z .chunks(), aby jednocześnie uzyskać indeks i fragment:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// Wartości: (0,[1,2]), (1,[3,4]), (2,[5])

Tutaj .chunks(2) najpierw tworzy wycinki, a następnie .enumerate() opakowuje każdy z nich licznikiem, więc i to indeks fragmentu, a chunk to wycinek.

  • Iteruj z modyfikacją:

    let mut numbers = [1, 2, 3, 4, 5];
    for num in numbers.iter_mut() { 
    	*num *= 2;
    }
    // Tablica przyjmuje postać: [2, 4, 6, 8, 10]
challenge icon

Wyzwanie

Łatwy

Utwórz program, który przetwarza listę zakupów z produktami i ich cenami oraz udostępnia różne widoki danych.

Program powinien:

  1. Wyświetlić numer każdego produktu i jego cenę (używając enumerate). Zastosuj format Item N: $Price (np. Item 1: $2.75).
  2. Wyświetlić ceny w parach (używając chunks) jako "bundle deals". Jeśli zestaw zawiera 2 produkty, wyświetlić ich sumę: Bundle N: $Price1 + $Price2 = $Sum. Jeśli zawiera tylko 1 produkt, wyświetlić: Bundle N: $Price.
  3. Zastosować 10% zniżki do wszystkich cen (używając iter_mut).
  4. Wyświetlić końcowe ceny po zniżce, każdą w nowym wierszu, z dokładnością do 2 miejsc po przecinku (np. $2.48).

Podpowiedź: Możesz łączyć iteratory, na przykład prices.chunks(2).enumerate() udostępnia jednocześnie indeks fragmentu i sam fragment. Każdy chunk jest wycinkiem, więc możesz wywołać na nim chunk.len() i odwołać się do jego elementów za pomocą indeksów chunk[0], chunk[1] itd.

Oczekiwany format cen na wyjściu:
Użyj ${:.2}, aby wyświetlać ceny z dokładnością do 2 miejsc po przecinku.

Dokładny tekst to Bundle 4: $7.90.

Spróbuj swoich sił

fn main() {
    let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];

    println!("Original Prices:");
    // TODO: Użyj enumerate(), aby wypisać numer i cenę każdego produktu
    // Wskazówka: prices.iter().enumerate() zwraca pary (index, &price)
    // Formatuj ceny do 2 miejsc po przecinku za pomocą {:.2}; dokładny format znajdziesz w instrukcji


    println!("\nBundle Deals:");
    // TODO: Połącz chunks(2) i enumerate() w łańcuch: prices.chunks(2).enumerate()
    // To zwraca pary (index, chunk); każdy chunk jest wycinkiem, więc chunk.len() podaje jego rozmiar
    // Jeśli chunk.len() == 2, wypisz: "Bundle 1: $2.75 + $1.50 = $4.25"
    // Jeśli chunk.len() == 1, wypisz wiersz dla pojedynczego produktu opisany w instrukcji
    // Użyj {:.2}, aby sformatować wszystkie ceny do 2 miejsc po przecinku


    // TODO: Użyj iter_mut(), aby zastosować rabat 10% discount do wszystkich cen
    // Wskazówka: pomnóż każdą wartość *price przez 0.9


    println!("\nPrices after 10% discount:");
    // TODO: Wypisz każdą cenę po rabacie, sformatowaną do 2 miejsc po przecinku
    // Oczekiwany format wyjścia pokazano w instrukcji

}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Rust online