Tin Học KHMT
Ôn tập Tin học THPT › Tin học 11 - Khoa học máy tính › Bài 20
Tin học 11 - Khoa học máy tính

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.

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 13 phút · 24 câu luyện tập trong ứng dụng

Tương ứng sách giáo khoa
  • 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
Xem bảng đối chiếu cả bộ →

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. 1) Từ dãy số một chiều đến bảng số liệu hai chiều
  2. 2) Gọi đúng một ô bằng a[i][j]
  3. 3) Duyệt cả bảng bằng hai vòng lặp lồng nhau
  4. 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ới ichỉ số hàng, jchỉ số cột, cả hai đều đếm từ 0; len(a) cho số hàng còn len(a[0]) cho số cột.
  • Muốn chạm tới mọi ô phải dùng hai vòng lặp for lồ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ÂYmả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ố.
listlítdanh sách
Một dãy nhiều giá trị xếp hàng, giống hộp bút có nhiều ô.
indexIN-đécchỉ 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.

Câu 1 · Nhận biết
Với mảng hai chiều a trong Python, biểu thức a[i][j] được hiểu như thế nào?
  1. i là chỉ số cột, j là chỉ số hàng, cả hai bắt đầu từ 1
  2. i là chỉ số cột, j là chỉ số hàng, cả hai bắt đầu từ 0
  3. i là chỉ số hàng, j là chỉ số cột, cả hai bắt đầu từ 0
  4. i là chỉ số hàng, j là chỉ số cột, cả hai bắt đầu từ 1
Đáp án: C - Đáp án đúng là ‘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.
Câu 2 · Nhận biết
Cho mảng hai chiều 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?
  1. len(a[0])
  2. len(a)
  3. len(a) * len(a[0])
  4. a[0]
Đáp án: A - Đáp án đúng là 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ố.
Câu 3 · Thông hiểu
Cho b = [[3, 1, 4], [1, 5, 9], [2, 6, 5]]. Giá trị của b[2][1] là bao nhiêu?
  1. 9
  2. 1
  3. 2
  4. 6
Đáp án: D - Đáp án đúng là 6. Ta đọc lần lượt: 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.
Câu Đúng/Sai (Phần II) · Thông hiểu
Cho biết mỗi phát biểu sau đúng hay sai:
  • 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ằng len(a).Đúng
  • c)Với mọi mảng hai chiều a, hai biểu thức a[i][j]a[j][i] luôn cho cùng một giá trị vì cùng chỉ tới ô ở hàng i cột j.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 IndexError khi duyệt bảng bằng range(len(a[0])).Sai
Vì sao:
  • (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àng i cột j, còn a[j][i] là ô ở hàng j cột i, 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 khi i bằng j.
  • (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ỗi IndexError, nên với bảng không đều phải dùng range(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.

Mở bài 20 trong ứng dụng

Phần học miễn phí, không cần tạo tài khoản.