Bài 20. Mảng hai chiều: hàng, cột và hai vòng lặp lồng nhau
Nhiều dữ liệu quanh ta không nằm trên một dãy thẳng mà nằm trong một bảng có hàng và có cột. Bài học này chỉ cách đưa một bảng như vậy vào chương trình Python bằng mảng hai chiều, cách gọi đúng từng ô bằng a[i][j], và cách dùng hai vòng lặp lồng nhau để tính toán trên cả bảng.
- Cánh DiềuTin học 11 (Khoa học máy tính) - Chủ đề F(CS) · Bài 2. Mảng hai chiềutr. 94
- Kết nối tri thứcTin học 11 (Khoa học máy tính) - Bài 18. Thực hành dữ liệu mảng một chiều và hai chiềutr. 86–88
Bắt đầu bằng một hình dung
Cuối mỗi tuần, cô phụ trách căng tin trường bạn lại dán lên bảng tin một tờ giấy kẻ ô kín đặc. Cột ngoài cùng bên trái ghi tên các tổ trực, hàng trên cùng ghi các thứ trong tuần từ thứ Hai đến thứ Sáu. Mỗi ô bên trong là số suất cơm mà tổ đó đã đặt trong ngày tương ứng.
Điều thú vị là chỉ với một tờ giấy như vậy, cô trả lời được rất nhiều câu hỏi khác nhau. Muốn biết tổ 2 đặt tất cả bao nhiêu suất trong cả tuần, cô cộng các số nằm trên cùng một hàng của tổ 2. Muốn biết riêng thứ Tư toàn trường đặt bao nhiêu suất, cô lại cộng các số nằm trên cùng một cột thứ Tư. Vẫn tờ giấy ấy, nhưng cộng theo hàng thì ra kết quả của từng tổ, còn cộng theo cột thì ra kết quả của từng ngày.
Cũng có hôm cô cần dò tìm ô ghi số lớn nhất để biết tổ nào ăn đông nhất vào ngày nào mà chuẩn bị trước, hoặc đếm xem có bao nhiêu ô vượt quá mười lăm suất để đặt thêm nguyên liệu. Tất cả những việc đó đều xoay quanh đúng một tấm bảng có hàng và có cột.
Bài học hôm nay sẽ chỉ cho bạn cách đưa nguyên vẹn tấm bảng ấy vào chương trình máy tính, và cách viết vài dòng lệnh ngắn để máy làm giúp mình toàn bộ những phép cộng, phép so sánh và phép đếm nói trên.
Nội dung bài học
- 1) Từ dãy số một chiều đến bảng số liệu hai chiều
- 2) Gọi đúng một ô bằng a[i][j]
- 3) Duyệt cả bảng bằng hai vòng lặp lồng nhau
- 4) Bốn bài toán quen thuộc trên bảng số liệu
Tóm tắt lý thuyết cần nhớ
- Mảng hai chiều trong Python là một danh sách mà mỗi phần tử lại là một danh sách, dùng để biểu diễn dữ liệu dạng bảng như bảng điểm nhiều môn, ma trận hay bàn cờ.
- Ô của bảng được gọi bằng
a[i][j]vớiilà chỉ số hàng,jlà chỉ số cột, cả hai đều đếm từ 0;len(a)cho số hàng cònlen(a[0])cho số cột. - Muốn chạm tới mọi ô phải dùng hai vòng lặp
forlồng nhau: vòng ngoài chạy theo hàng, vòng trong chạy theo cột - giống như đọc hết một dòng rồi mới xuống dòng tiếp theo. - Tính tổng theo hàng, tổng theo cột, tìm giá trị lớn nhất cùng vị trí hay đếm ô thoả điều kiện đều dùng chung khuôn mẫu, chỉ khác ở thứ tự hai vòng lặp và chỗ đặt lại biến tích luỹ bằng 0.
Thuật ngữ tiếng Anh trong bài
| Tiếng Anh | Đọc là | Nghĩa |
|---|---|---|
| array | ơ-RÂY | mảng Dãy các ô chứa dữ liệu cùng loại, xếp liền nhau và được đánh số - như dãy ô để giày ở cửa lớp, mỗi ô một số. |
| list | lít | danh sách Một dãy nhiều giá trị xếp hàng, giống hộp bút có nhiều ô. |
| index | IN-đéc | chỉ số Số thứ tự của một phần tử. |
Câu hỏi trắc nghiệm có đáp án
Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 24 câu, chấm điểm tự động và giải thích từng câu sai.
a trong Python, biểu thức a[i][j] được hiểu như thế nào?ilà chỉ số cột,jlà chỉ số hàng, cả hai bắt đầu từ 1ilà chỉ số cột,jlà chỉ số hàng, cả hai bắt đầu từ 0ilà chỉ số hàng,jlà chỉ số cột, cả hai bắt đầu từ 0ilà chỉ số hàng,jlà chỉ số cột, cả hai bắt đầu từ 1
i là chỉ số hàng, j là chỉ số cột, cả hai bắt đầu từ 0’. Lí do nằm ngay ở cách đọc biểu thức từ trái sang phải: a[i] lấy ra cả hàng thứ i (vì mảng hai chiều là danh sách của các hàng), rồi [j] mới lấy phần tử thứ j bên trong hàng đó, tức là cột. Hai phương án đầu sai vì đảo ngược vai trò hàng - cột. Phương án cuối tuy nhớ đúng thứ tự hàng trước cột sau nhưng lại cho chỉ số bắt đầu từ 1, trong khi mọi chỉ số của danh sách trong Python đều đếm từ 0.a có các hàng dài bằng nhau. Biểu thức nào cho biết SỐ CỘT của bảng?len(a[0])len(a)len(a) * len(a[0])a[0]
len(a[0]): a[0] chính là hàng đầu tiên của bảng, mà số phần tử của một hàng chính là số cột. Phương án len(a) sai vì đó là số phần tử của danh sách lớn, tức số HÀNG chứ không phải số cột. Phương án len(a) * len(a[0]) cho tổng số ô của cả bảng chứ không phải số cột. Phương án a[0] sai vì nó trả về bản thân danh sách hàng đầu tiên (một danh sách), không phải một con số.b = [[3, 1, 4], [1, 5, 9], [2, 6, 5]]. Giá trị của b[2][1] là bao nhiêu?- 9
- 1
- 2
- 6
b[2] là hàng có chỉ số 2, tức hàng thứ ba [2, 6, 5]; sau đó [1] lấy phần tử có chỉ số 1 của hàng ấy, tức số thứ hai, chính là 6. Phương án 9 là kết quả của việc nhầm hàng với cột, vì b[1][2] mới bằng 9. Phương án 1 là kết quả của việc đếm chỉ số từ 1 thay vì từ 0 (hàng 2, cột 1 theo cách đếm từ 1 sẽ là b[1][0]). Phương án 2 là b[2][0], tức lấy nhầm phần tử đầu tiên của hàng.- a)Trong Python, mảng hai chiều thực chất là một danh sách mà mỗi phần tử của nó lại là một danh sách.Đúng
- b)Với mảng hai chiều
a, số hàng của bảng được tính bằnglen(a).Đúng - c)Với mọi mảng hai chiều
a, hai biểu thứca[i][j]vàa[j][i]luôn cho cùng một giá trị vì cùng chỉ tới ô ở hàngicộtj.Sai - d)Python bắt buộc mọi hàng của một mảng hai chiều phải có số phần tử bằng nhau, nên không bao giờ xảy ra lỗi
IndexErrorkhi duyệt bảng bằngrange(len(a[0])).Sai
- (a) Đúng - đây chính là cách Python biểu diễn bảng: mỗi hàng của bảng là một danh sách, và tất cả các hàng đó được xếp vào một danh sách lớn.
- (b) Đúng -
len(a)đếm số phần tử của danh sách lớn, mà mỗi phần tử là một hàng, nên kết quả chính là số hàng; số cột mới làlen(a[0]). - (c) Sai -
a[i][j]là ô ở hàngicộtj, còna[j][i]là ô ở hàngjcộti, hai ô hoàn toàn khác nhau; chúng chỉ tình cờ bằng nhau trong một số bảng đặc biệt hoặc khiibằngj. - (d) Sai - Python cho phép các hàng dài ngắn khác nhau; nếu lấy số cột theo hàng đầu tiên bằng
len(a[0])rồi áp dụng cho một hàng ngắn hơn thì chương trình sẽ báo lỗiIndexError, nên với bảng không đều phải dùngrange(len(a[i])).
Thử ngay: minh hoạ từng bước
Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.
Học trọn bài này trong ứng dụng
Bài giảng đầy đủ, 24 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.
Phần học miễn phí, không cần tạo tài khoản.
Bài liên quan - Lập trình, Thuật toán & CTDL (KHMT)
Cùng mạch kiến thức với bài này, học nối tiếp cho chắc phần lí thuyết.