Menu
CoddyTech

Vòng lặp for nâng cao

Thuộc phần Kiến thức nền tảng trong hành trình Rust của Coddy. Bài học 66 trên 75.

Có nhiều cách để lặp qua một mảng, sau đây là một số cách:
Xét mảng sau:

let numbers = [1, 2, 3, 4, 5];
  • Bộ lặp trực tiếp:

    for num in numbers.iter() {}
    // Giá trị: 1, 2, 3, 4, 5
  • Chỉ số và giá trị:

    for (index, value) in numbers.iter().enumerate() { }
    // Giá trị: (0,1), (1,2), (2,3), (3,4), (4,5)
  • Các lát cắt có kích thước cụ thể:

    for chunk in numbers.chunks(2) { }
    // Giá trị: [1,2], [3,4], [5]

    Mỗi phần là một lát cắt, vì vậy bạn có thể dùng các phương thức của lát cắt, chẳng hạn như chunk.len() trả về số phần tử trong phần đó. Phần cuối cùng có thể nhỏ hơn nếu mảng không chia hết.

Bạn cũng có thể nối .enumerate() vào .chunks() để lấy cả chỉ số và phần khối cùng lúc:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// Giá trị: (0,[1,2]), (1,[3,4]), (2,[5])

Ở đây, .chunks(2) tạo các lát trước, sau đó .enumerate() gắn bộ đếm vào từng lát, vì vậy i là chỉ số của khối và chunk là lát đó.

  • Lặp qua và thay đổi:

    let mut numbers = [1, 2, 3, 4, 5];
    for num in numbers.iter_mut() { 
    	*num *= 2;
    }
    // Mảng trở thành: [2, 4, 6, 8, 10]
challenge icon

Thử thách

Dễ

Tạo một chương trình xử lý danh sách mua sắm gồm các mặt hàng và giá của chúng, đồng thời cung cấp những cách hiển thị dữ liệu khác nhau.

Chương trình cần:

  1. In số thứ tự và giá của từng mặt hàng (dùng enumerate). Định dạng là Item N: $Price (ví dụ: Item 1: $2.75).
  2. In giá theo từng cặp (dùng chunks) dưới dạng "bundle deals". Nếu một gói có 2 mặt hàng, hãy in tổng giá: Bundle N: $Price1 + $Price2 = $Sum. Nếu gói chỉ có 1 mặt hàng, hãy in: Bundle N: $Price.
  3. Áp dụng giảm giá 10% cho tất cả giá (dùng iter_mut).
  4. In giá sau khi giảm, mỗi giá trên một dòng mới, định dạng với 2 chữ số thập phân (ví dụ: $2.48).

Gợi ý: Bạn có thể nối các trình lặp với nhau. Ví dụ, prices.chunks(2).enumerate() cung cấp đồng thời cho bạn chỉ số của khối và lát cắt của khối đó. Mỗi chunk là một lát cắt, vì vậy bạn có thể gọi chunk.len() và truy cập phần tử bằng chỉ số như chunk[0], chunk[1], v.v.

Định dạng đầu ra dự kiến cho giá:
Dùng ${:.2} để định dạng giá với 2 chữ số thập phân.

Văn bản chính xác là Bundle 4: $7.90.

Tự làm thử

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

    println!("Original Prices:");
    // TODO: Dùng enumerate() để in ra số thứ tự và giá của từng mặt hàng
    // Gợi ý: prices.iter().enumerate() tạo ra các cặp (index, &price)
    // Dùng {:.2} để định dạng giá với 2 chữ số thập phân. Xem hướng dẫn để biết định dạng chính xác


    println!("\nBundle Deals:");
    // TODO: Nối chunks(2) với enumerate(): prices.chunks(2).enumerate()
    // Cách này tạo ra các cặp (index, chunk). Mỗi chunk là một lát cắt, nên chunk.len() cho biết kích thước của nó
    // Nếu chunk.len() == 2, in ra: "Bundle 1: $2.75 + $1.50 = $4.25"
    // Nếu chunk.len() == 1, in ra dòng cho một mặt hàng như mô tả trong hướng dẫn
    // Dùng {:.2} để định dạng mọi giá với 2 chữ số thập phân


    // TODO: Dùng iter_mut() để áp dụng 10% discount cho mọi giá
    // Gợi ý: nhân mỗi *price với 0.9


    println!("\nPrices after 10% discount:");
    // TODO: In ra từng giá sau khi giảm, với 2 chữ số thập phân
    // Định dạng đầu ra mong đợi có trong hướng dẫn

}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Rust online