Menu
Coddy logo textTech

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żmy następującą tablicę:

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

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

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

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

    Każdy fragment jest wycinkiem, więc możesz używać na nim metod wycinków, na przykład chunk.len() zwraca liczbę elementów w tym fragmencie. Ostatni fragment może być mniejszy, jeśli tablica nie dzieli się równo.

Możesz też dołączyć .enumerate() do .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ą:

    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 zawierającą produkty i ich ceny oraz przedstawia dane w różnych widokach.

Program powinien:

  1. Wypisać numer każdego produktu i jego cenę (używając enumerate). Zastosować format Item N: $Price (np. Item 1: $2.75).
  2. Wypisać ceny parami (używając chunks) jako "bundle deals". Jeśli zestaw zawiera 2 produkty, wypisać sumę: Bundle N: $Price1 + $Price2 = $Sum. Jeśli zawiera tylko 1 produkt, wypisać: Bundle N: $Price.
  3. Zastosować 10% zniżki do wszystkich cen (używając iter_mut).
  4. Wypisać 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() jednocześnie zwraca indeks fragmentu i sam fragment. Każdy chunk jest wycinkiem, więc możesz wywołać na nim chunk.len() i odwoływać się do jego elementów za pomocą indeksów, takich jak chunk[0], chunk[1] itd.

Oczekiwany format wyświetlania cen:
Użyj ${:.2}, aby wyświetlić 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 wyświetlić numer i cenę każdej pozycji
    // Wskazówka: prices.iter().enumerate() zwraca pary (index, &price)
    // Sformatuj ceny do 2 miejsc po przecinku za pomocą {:.2}; dokładny format znajdziesz w instrukcjach


    println!("\nBundle Deals:");
    // TODO: Połącz chunks(2) i enumerate(): 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, wyświetl: "Bundle 1: $2.75 + $1.50 = $4.25"
    // Jeśli chunk.len() == 1, wyświetl wiersz dla pojedynczej pozycji opisany w instrukcjach
    // Użyj {:.2}, aby sformatować wszystkie ceny do 2 miejsc po przecinku


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


    println!("\nPrices after 10% discount:");
    // TODO: Wyświetl każdą cenę po rabacie, sformatowaną do 2 miejsc po przecinku
    // Oczekiwany format wyniku jest pokazany w instrukcjach

}
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