Giải Vận dụng trang 57 SGK Tin học 12
Đề bài
Cho trước một bảng dữ liệu cỡ $n \times 4$, mỗi hàng tương ứng với một bộ (họ tên, điểm Toán, điểm Vật lí, điểm Hoá học). Viết chương trình Python để tạo ra tệp HTML thực hiện việc vẽ bảng tương tự như Hình 9.6b và bổ sung dữ liệu vào các hàng phía dưới.
Lời giải
## Phân tích yêu cầu
Bài cho một bảng dữ liệu cỡ $n \times 4$: mỗi hàng là một bộ (họ tên, điểm Toán, điểm Vật lí, điểm Hoá học). Cần viết chương trình Python sinh ra một tệp HTML vẽ bảng như Hình 9.6b, gồm một hàng tiêu đề và $n$ hàng dữ liệu phía dưới.
Theo Bài 9 (SGK Tin học 12 KNTT), bảng trong HTML dùng:
- `<table> … </table>`: cả bảng;
- `<tr> … </tr>`: một hàng;
- `<th> … </th>`: ô tiêu đề; `<td> … </td>`: ô dữ liệu.
Chương trình Python chỉ cần ghép các xâu kí tự thành nội dung HTML rồi ghi ra tệp.
## Hướng giải
Bước 1 – Biểu diễn dữ liệu $n \times 4$
```python
data = [
["Nguyễn Văn An", 8.5, 7.0, 9.0],
["Trần Thị Bình", 6.5, 8.0, 7.5],
["Lê Minh Châu", 9.0, 9.5, 8.0],
]
```
Bước 2 – Hàm sinh nội dung HTML
Hàng đầu dùng `<th>` cho tiêu đề; mỗi hàng của `data` dùng `<td>` cho dữ liệu. Vì điểm là số nên phải đổi sang xâu bằng `str()` trước khi nối chuỗi.
```python
def tao_bang_html(bang):
html = "<html>\n<head>\n<meta charset='utf-8'>\n</head>\n<body>\n"
html = html + "<table border='1'>\n"
tieu_de = ["Họ tên", "Toán", "Vật lí", "Hoá học"]
html = html + " <tr>"
for td in tieu_de:
html = html + "<th>" + td + "</th>"
html = html + "</tr>\n"
for hang in bang:
html = html + " <tr>"
for o in hang:
html = html + "<td>" + str(o) + "</td>"
html = html + "</tr>\n"
html = html + "</table>\n</body>\n</html>"
return html
```
Bước 3 – Ghi ra tệp HTML
```python
noi_dung = tao_bang_html(data)
f = open("bang_diem.html", "w", encoding="utf-8")
f.write(noi_dung)
f.close()
print("Đã tạo xong tệp bang_diem.html")
```
Tham số `encoding="utf-8"` giúp tiếng Việt có dấu hiển thị đúng.
## Chương trình hoàn chỉnh
```python
data = [
["Nguyễn Văn An", 8.5, 7.0, 9.0],
["Trần Thị Bình", 6.5, 8.0, 7.5],
["Lê Minh Châu", 9.0, 9.5, 8.0],
]
def tao_bang_html(bang):
html = "<html>\n<head>\n<meta charset='utf-8'>\n</head>\n<body>\n"
html = html + "<table border='1'>\n"
tieu_de = ["Họ tên", "Toán", "Vật lí", "Hoá học"]
html = html + " <tr>"
for td in tieu_de:
html = html + "<th>" + td + "</th>"
html = html + "</tr>\n"
for hang in bang:
html = html + " <tr>"
for o in hang:
html = html + "<td>" + str(o) + "</td>"
html = html + "</tr>\n"
html = html + "</table>\n</body>\n</html>"
return html
noi_dung = tao_bang_html(data)
f = open("bang_diem.html", "w", encoding="utf-8")
f.write(noi_dung)
f.close()
print("Đã tạo xong tệp bang_diem.html")
```
## Kiểm tra kết quả
Tệp `bang_diem.html` sinh ra có nội dung:
```html
<table border='1'>
<tr><th>Họ tên</th><th>Toán</th><th>Vật lí</th><th>Hoá học</th></tr>
<tr><td>Nguyễn Văn An</td><td>8.5</td><td>7.0</td><td>9.0</td></tr>
<tr><td>Trần Thị Bình</td><td>6.5</td><td>8.0</td><td>7.5</td></tr>
<tr><td>Lê Minh Châu</td><td>9.0</td><td>9.5</td><td>8.0</td></tr>
</table>
```
Mở bằng trình duyệt cho bảng có viền gồm hàng tiêu đề Họ tên | Toán | Vật lí | Hoá học và $n$ hàng dữ liệu bên dưới, đúng như Hình 9.6b. Vòng lặp tự động duyệt mọi hàng nên chương trình chạy đúng với bảng $n \times 4$ bất kì.
## Đối chiếu hai lời giải
- Lời giải 1 sinh bảng 4 cột đúng khớp với bộ dữ liệu $n \times 4$ (họ tên + 3 cột điểm), dùng đúng `<th>`/`<td>`, có `str()` cho số, ghi tệp `encoding="utf-8"`. Chính xác và bám sát đề.
- Lời giải 2 cũng chạy đúng và thêm CSS cho đẹp, nhưng chèn thêm cột STT thành bảng 5 cột — đây là dữ liệu không có trong bảng $n \times 4$ của đề, làm cấu trúc lệch so với yêu cầu "cỡ $n \times 4$". Phần tạo số thứ tự bằng `enumerate` là phần dư so với đề bài.
Do đó Lời giải 1 là lời giải đúng và sát đề hơn.
Đáp số
Lời giải do Thư viện nhà trường biên soạn, giải và kiểm chéo độc lập theo SGK 2026-2027.