Thực hành mảng hai chiều¶
Tóm lược nội dung
Bài này hướng dẫn một số bài toán liên quan đến mảng hai chiều:
- Chuyển đổi mảng hai chiều thành mảng một chiều
- Chuyển đổi mảng một chiều thành mảng hai chiều
- Tính điểm trung bình của một lớp theo bảng điểm cho trước
- Xử lý đường chéo chính và hai tam giác nằm hai bên của ma trận vuông.
- Tạo ma trận mô phỏng bàn cờ vua
Bài 1¶
Đề bài¶
Yêu cầu:
Viết chương trình chuyển đổi mảng hai chiều thành mảng một chiều. In ra mảng một chiều trên một dòng, các phần tử phân cách nhau bằng khoảng trắng.
Đầu vào:
Mảng hai chiều A.
Đầu vào:
Mảng một chiều B.
Ví dụ:
| Đầu vào | Đầu ra |
|---|---|
| [[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]] |
1 7 4 0 9 4 8 8 2 4 5 5 |
Cách giải đề xuất¶
Ý tưởng chính
Gọi:
rvàclần lượt là chỉ số hàng và chỉ số cột của mảng hai chiềuAilà chỉ số của mảng một chiềuB
Với r và c biết trước, ta cần tính i tương ứng.
Cụ thể: i = r * col + c, trong đó col là số cột của mảng A.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm convert_2to1() để chuyển đổi mảng hai chiều thành mảng một chiều.
Hàm gồm có:
- Một tham số đầu vào là mảng hai chiều
A. - Giá trị trả về là mảng một chiều
B.
Hàm hoạt động như sau:
- Lấy số hàng
rowvà số cộtcolcủa mảng hai chiềuA. - Khởi tạo
nlà tích củarowvàcol. - Khởi tạo mảng một chiều
Bgồmnphần tử. -
Duyệt từng hàng của mảng
A:Ứng với mỗi hàng, duyệt từng cột của mảng
A:- Tính chỉ số
itương ứng của mảngB - Gán phần tử
A[r][c]cho phần tửB[i]
- Tính chỉ số
3. Viết chương trình chính.
- Khởi tạo mảng hai chiều
array_2d. - Gọi hàm
convert_2to1()để thực hiện, gán kết quả cho biếnarray_1d. - In ra mảng array_1d. Dùng toán tử
*để phân tách (unpack) các phần tử.
Bài 2¶
Đề bài¶
Yêu cầu:
Viết chương trình chuyển đổi mảng một chiều thành mảng hai chiều. In ra mảng hai chiều theo dạng bảng, các phần tử cùng hàng phân cách nhau bằng khoảng trắng.
Đầu vào:
Mảng một chiều A.
Số hàng và số cột của mảng hai chiều B.
Đầu ra:
Mảng hai chiều B.
Ví dụ:
| Đầu vào | Đầu ra |
|---|---|
| [1, 7, 4, 0, 9, 4, 8, 8, 2, 4, 5, 5] 3 4 |
1 7 4 0 9 4 8 8 2 4 5 5 |
| [1, 7, 4, 0, 9, 4, 8, 8, 2, 4, 5, 5] 3 4 |
1 7 4 0 9 4 8 82 4 5 5 |
Cách giải đề xuất¶
Ý tưởng chính
Gọi:
ilà chỉ số của mảng một chiềuArvàclần lượt là chỉ số hàng và chỉ số cột của mảng hai chiềuB
Với i biết trước, ta cần tính r và c tương ứng.
Cụ thể: r = i // col và c = i % col, trong đó col là số cột của mảng B.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm convert_1to2() để chuyển đổi mảng một chiều thành mảng hai chiều.
Hàm gồm có:
- Tham số đầu vào gồm có: mảng một chiều
A, số hàngrowvà số cộtcolcủa mảng hai chiềuB. - Giá trị trả về là mảng hai chiều
BhoặcNonenếu không chuyển đổi được.
Hàm hoạt động như sau:
- Lấy số phần tử
ncủaA. - Để chuyển đổi được, cần thoả điều kiện
row * col == n. Nếu không được thì trả vềNone. - Khởi tạo mảng hai chiều
Bgồmrowhàng vàcolcột. -
Duyệt từng phần tử của
A:- Tính chỉ số r và chỉ số c tương ứng của
B - Gán phần tử
A[i]choB[r][c]
- Tính chỉ số r và chỉ số c tương ứng của
3. Viết hàm show() để in ra mảng hai chiều. Hàm này gồm một tham số là mảng hai chiều cần in.
4. Viết chương trình chính.
- Khởi tạo mảng hai chiều
array_1d. - Gọi hàm
convert_1to2()ra thực hiện, gán kết quả cho biếnarray_2d. - Dựa vào giá trị của
array_2d, in ra thông báo không thể chuyển đổi hoặc gọi hàmshow().
Bài 3¶
Đề bài¶
Yêu cầu:
Cho bảng điểm của một lớp, lưu trong mảng hai chiều scores, gồm lần lượt các cột điểm sau:
- Ba cột điểm thường xuyên
- Một cột điểm giữa kỳ
- Một cột điểm cuối kỳ
Viết chương trình thực hiện những việc sau:
- Tính điểm trung bình của mỗi học sinh và lưu vào mảng một chiều
averages. - In ra toàn bộ các cột điểm kể cả điểm trung bình theo dạng bảng.
Đầu vào:
Mảng hai chiều scores.
Đầu ra:
Các cột điểm theo dạng bảng.
Ví dụ:
Đầu vào:
scores = [[8, 8, 8, 2, 9],
[0, 0, 0, 8, 9],
[8, 9, 10, 6, 6],
[5, 6, 2, 1, 0],
[3, 4, 1, 6, 7],
[9, 2, 4, 1, 5],
[2, 2, 5, 6, 9],
[9, 8, 3, 8, 1],
[10, 2, 7, 6, 5],
[5, 3, 9, 10, 5]]
Đầu ra:
8 8 8 2 9 | 6.9
0 0 0 8 9 | 5.4
8 9 10 6 6 | 7.1
5 6 2 1 0 | 1.9
3 4 1 6 7 | 5.1
9 2 4 1 5 | 4.0
2 2 5 6 9 | 6.0
9 8 3 8 1 | 4.9
10 2 7 6 5 | 5.8
5 3 9 10 5 | 6.5
Cách giải đề xuất¶
Ý tưởng chính
Bài tập này chủ yếu tập trung vào việc duyệt hàng và cột.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm calculate_average() để tính điểm trung bình của từng học sinh.
Hàm gồm có:
- Một tham số đầu vào là mảng hai chiều
S. - Giá trị trả về là mảng một chiều
A.
Hàm hoạt động như sau:
-
Duyệt từng hàng
rcủaS(ứng với từng học sinh):Tính điểm trung bình từ các cột và lưu vào phần tử
A[r]tương ứng.
3. Viết hàm show() để in ra các điểm số theo dạng bảng.
Hàm có hai tham số đầu vào là mảng hai chiều S (điểm thành phần) và mảng một chiều A (điểm trung bình); không có giá trị trả về.
Hàm hoạt động như sau:
-
Duyệt từng hàng
rcủaS(ứng với từng học sinh):Duyệt từng cột
ccủaS(ứng với từng cột điểm):In ra điểm số tại hàng `r`, cột `c`. Dùng định dạng căn phải `:>3` để bảo đ.
4. Viết chương trình chính.
- Khởi tạo mảng hai chiều
scores. - Gọi hàm
calculate_average()ra thực hiện, gán kết quả cho biếnaverages. - Gọi hàm
show()ra thực hiện.
Bài 4¶
Đề bài¶
Yêu cầu:
Ma trận vuông \(n \times n\) là mảng hai chiều gồm \(n\) hàng và \(n\) cột.
Đường chéo chính của ma trận \(M\) này gồm các phần tử \(m_{ij}\) có chỉ số hàng và chỉ số cột bằng nhau, tức \(i = j\).
Phần ma trận nằm phía trên đường chéo chính tạm gọi là "tam giác trên", phần ma trận nằm phía dưới đường chéo chính tạm gọi là "tam giác dưới".
Viết chương trình thực hiện những việc sau:
- Khởi tạo giá trị
0cho toàn bộ các phần tử của ma trận vuôngn × n. - Gán giá trị
1cho các phần tử nằm trên đường chéo chính. - Gán giá trị
2cho các phần tử thuộc tam giác dưới của ma trận. - Gán giá trị
3cho các phần tử thuộc tam giác trên của ma trận.
Đầu vào:
Một số nguyên là kích thước của ma trận vuông.
Đầu ra:
Ma trận theo yêu cầu.
Ví dụ:
Đầu vào:
Đầu ra:
1 3 3 3 3 3 3 3 3 3
2 1 3 3 3 3 3 3 3 3
2 2 1 3 3 3 3 3 3 3
2 2 2 1 3 3 3 3 3 3
2 2 2 2 1 3 3 3 3 3
2 2 2 2 2 1 3 3 3 3
2 2 2 2 2 2 1 3 3 3
2 2 2 2 2 2 2 1 3 3
2 2 2 2 2 2 2 2 1 3
2 2 2 2 2 2 2 2 2 1
Cách giải đề xuất¶
Ý tưởng chính
Bài tập này chủ yếu tập trung vào việc duyệt hàng và cột.
Khác với bài tập trên, ta không duyệt toàn bộ hàng hay toàn bộ cột, mà cần cân nhắc phạm vi duyệt của từng vòng lặp.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm fill_main_diagonal() để gán 1 vào đường chéo chính.
Hàm có một tham số đầu vào là mảng hai chiều A; không có giá trị trả về.
Các phần tử nằm trên đường chéo chính có đặc điểm: chỉ số hàng và chỉ số cột bằng nhau, cụ thể là A[i][i].
Do đó, ta chỉ cần một vòng lặp để duyệt từ 0 đến n - 1.
3. Viết hàm fill_lower_triangle() để gán 2 vào tam giác dưới.
Hàm có một tham số đầu vào là mảng hai chiều A; không có giá trị trả về.
Tam giác dưới có đặc điểm: tại hàng r, các phần tử đều bắt đầu từ cột 0 và kết thúc trước cột có chỉ số bằng chỉ số hàng, là r.
4. Viết hàm fill_upper_triangle() để gán 3 vào tam giác trên.
Hàm có một tham số đầu vào là mảng hai chiều A; không có giá trị trả về.
Tam giác trên có đặc điểm: tại hàng r, các phần tử đều bắt đầu từ cột r + 1 và kết thúc tại cột cuối cùng.
5. Viết hàm show() để in ra ma trận.
6. Viết chương trình chính.
- Cho người dùng nhập vào kích thước ma trận, lưu vào biến
size. - Khởi tạo ma trận
matrixcó kích thướcsize. - Lần lượt gọi các hàm
fill_*để gán giá trị theo yêu cầu. - Gọi hàm
show()ra thực hiện.
Bài 5¶
Đề bài¶
Yêu cầu:
Viết chương trình tạo mảng hai chiều có kích thước 8 × 8 để biểu diễn bàn cờ vua, trong đó các phần tử có giá trị 0 và 1 xen kẽ nhau, biểu thị cho các ô trắng và ô đen.
Quy ước: ô đầu tiên ở góc trên bên trái, toạ độ [0, 0] có giá trị là 0, biểu thị màu trắng.
Đầu vào:
Không có dữ liệu đầu vào.
Đầu ra:
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
Cách giải đề xuất¶
Ý tưởng chính
Ô [0, 0] có giá trị là 0.
Xét các ô lân cận với ô [0, 0]:
- Ô bên phải
[0, 1]có giá trị là1. - Ô bên dưới
[1, 0]có giá trị là1. - Ô góc dưới phải
[1, 1]có giá trị là0.
Ta nhận thấy rằng, tổng của chỉ số hàng và chỉ số cột có ảnh hưởng đến giá trị của ô.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm fill_chess_board() để gán 0 và 1 vào các ô của bàn cờ.
Hàm gồm có:
- Một tham số đầu vào là kích thước bàn cờ cần tạo.
- Giá trị trả về là mảng hai chiều
Bbiểu thị bàn cờ.
Hàm hoạt động như sau:
- Khởi tạo mảng hai chiều
Bgồmnhàng vàncột. -
Duyệt từng hàng
rcủaB:Duyệt từng cột
ccủaB:Xét xem tổng của `r` và `c` là chẵn hay lẻ để gán tương ứng là `0` hoặc `1`.
3. Viết hàm show() để in ra bàn cờ.
4. Viết chương trình chính.
Mã nguồn¶
Code đầy đủ được đặt tại: