Vòng lặp lồng nhau
Thuộc phần Kiến thức nền tảng trong hành trình GO của Coddy. Bài học 49 trên 109.
Vòng lặp lồng nhau là các vòng lặp được đặt bên trong một vòng lặp khác. Vòng lặp bên trong chạy hết trong mỗi lần lặp của vòng lặp bên ngoài.
Hãy tạo bảng nhân cho các số từ 1 đến 3 bằng vòng lặp lồng nhau:
rows := 3
cols := 3
for i := 1; i <= rows; i++ {
for j := 1; j <= cols; j++ {
fmt.Printf("%d×%d=%d\t", i, j, i*j)
}
fmt.Println()
}Sau khi chạy đoạn code này, ta có bảng nhân, trong đó mỗi hàng thể hiện một giá trị của biến vòng lặp bên ngoài (i) nhân với tất cả giá trị của biến vòng lặp bên trong (j). Kết quả sẽ hiển thị trên màn hình:
1×1=1 1×2=2 1×3=3
2×1=2 2×2=4 2×3=6
3×1=3 3×2=6 3×3=9 Hãy cùng tìm hiểu cách hoạt động này từng bước:
Trước tiên, vòng lặp bên ngoài đặt i=1 và vòng lặp bên trong chạy hoàn tất:
i=1, j=1: prints "1×1=1"
i=1, j=2: prints "1×2=2"
i=1, j=3: prints "1×3=3"Sau khi vòng lặp bên trong kết thúc, chúng ta in một dòng mới bằng fmt.Println().
Sau đó, vòng lặp bên ngoài đặt i=2 và vòng lặp bên trong bắt đầu lại, với j lại bắt đầu từ 1:
i=2, j=1: prints "2×1=2"
i=2, j=2: prints "2×2=4"
i=2, j=3: prints "2×3=6"Cuối cùng, vòng lặp bên ngoài đặt i=3 và vòng lặp bên trong chạy lần cuối:
i=3, j=1: prints "3×1=3"
i=3, j=2: prints "3×2=6"
i=3, j=3: prints "3×3=9"Mỗi vòng lặp có biến đếm riêng (i và j), còn rows và cols không bao giờ thay đổi: chúng chỉ cho các vòng lặp biết khi nào cần dừng. Cách làm này rất hữu ích khi xử lý các bảng dữ liệu hoặc tạo cấu trúc dạng lưới.
Thử thách
Người mớiTrong thử thách này, bạn sẽ luyện tập cách dùng vòng lặp lồng nhau để in ra một mẫu đơn giản. Vòng lặp ngoài sẽ duyệt qua các hàng, còn vòng lặp trong sẽ duyệt qua các cột để tạo một lưới ký tự nhỏ.
Hoàn thành các vòng lặp lồng nhau để in ra một lưới dấu hoa thị 3x3 (*). Mỗi dấu hoa thị phải có một dấu cách theo sau, vì vậy mỗi hàng sẽ trông như sau: * * * (có dấu cách ở cuối). Đầu ra mong đợi là:
* * * * * * * * *
Dùng một biến đếm mới cho mỗi vòng lặp (ví dụ: i cho các hàng và j cho các dấu sao trong một hàng), rồi so sánh biến đó với rows hoặc columns. Đừng thay đổi chính rows và columns: mỗi hàng đều cần lặp lại columns.
Tự làm thử
package main
import "fmt"
func main() {
// Số hàng và cột trong lưới
rows := 3
columns := 3
// TODO: Tạo các vòng lặp lồng nhau để in ra một lưới dấu sao (*)
// Vòng lặp bên ngoài duyệt qua các hàng
// Vòng lặp bên trong duyệt qua các cột
for i := 0; i < rows; i++ {
// Thêm vòng lặp bên trong ở đây để in dấu sao ở mỗi cột
// Lệnh này in ra một dòng mới sau mỗi hàng
fmt.Println()
}
}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
4Toán tử so sánh và logic
Toán tử so sánh, phần 1Toán tử so sánh, phần 2Toán tử AND logicToán tử OR logicToán tử NOT logicCơ bản về thứ tự ưu tiên của toán tửÔn tập: thực hiện phép so sánh7Luồng điều khiển: vòng lặp
Giải thích vòng lặp `for`Vòng lặp `for` cơ bảnVòng lặp `for` chỉ có điều kiệnTừ khóa `break`Từ khóa `continue`Vòng lặp lồng nhauÔn tập: lặp lại hành động2Biến và các kiểu dữ liệu cơ bản
Biến là gìSuy luận kiểu với `:=`Số nguyên (int)Số dấu phẩy độngGiá trị BooleanChuỗiGiá trị 0Hằng sốQuy ước đặt tênÔn tập: biến và kiểu dữ liệu5Đầu vào/đầu ra cơ bản
Đầu ra có định dạngĐộng từ định dạngIn các kiểu dữ liệuNhận đầu vào cơ bản từ người dùngÔn tập: đầu vào và đầu ra8Hàm
Tìm hiểu về hàmKhai báo hàmGọi hàmTham số của hàmTrả về một giá trịTrả về nhiều giá trịGiá trị trả về có tênNhững điều cơ bản về phạm vi của hàmÔn tập: Tạo code có thể tái sử dụng3Toán tử cơ bản
Toán tử số họcToán tử chiaToán tử moduloToán tử gánToán tử gán kết hợpTăng và giảmÔn tập: Tính toán6Luồng điều khiển: câu lệnh điều kiện
Câu lệnh `if`Từ khóa `else`Từ khóa `else if`Biến bị che khuất trong `if`Khởi tạo biếnCâu lệnh `switch``switch` có biểu thức`switch` không có biểu thứcTừ khóa `fallthrough`Ôn tập: đưa ra quyết địnhTự luyện tập: Trình biên dịch Go online