Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
Câu hỏi mở đầu trang 81
Đề bài: Em đã biết thiết lập cấu trúc dữ liệu đóng vai trò quan trọng khi giải quyết các bài toán thực tế trên máy tính. Trong các bài toán thực tế sau em sẽ thiết lập cấu trúc dữ liệu như thế nào?
– Lập danh sách họ tên các bạn lớp em.
– Khảo sát ý kiến với 4 mức: Đồng ý (2); Không phản đối (1); Không ý kiến (0); Phản đối (–1).
– Danh sách các địa điểm tham quan, mỗi địa điểm có toạ độ (x, y) trên bản đồ.
Lời giải:
- Danh sách họ tên các bạn: dùng mảng một chiều (list trong Python), mỗi phần tử là một chuỗi họ tên.
- Khảo sát ý kiến: dùng mảng một chiều với các phần tử là số nguyên (2, 1, 0, –1), mỗi phần tử ứng với ý kiến của một bạn.
- Danh sách các địa điểm có toạ độ (x, y): dùng mảng hai chiều (danh sách trong danh sách), mỗi phần tử là một danh sách gồm hai giá trị [x, y].
1. Cấu trúc dữ liệu mảng một chiều
Hoạt động 1 trang 81
Đề bài: Thực hiện các thao tác sau, quan sát, trao đổi và thảo luận, từ đó nhận biết về cấu trúc dữ liệu mảng một chiều trong Python.
Lời giải:
a) Thiết lập mảng một chiều bằng kiểu list:
>>> A = [1, 3, 5, 7, 9, 11]
>>> B = ["Hà","Bình","Ngọc","Anh"]
>>> C = [9.5, 8.0, 10, 7.2]
→ Trong Python, mảng một chiều được biểu diễn bằng kiểu dữ liệu list, các phần tử có cùng kiểu (số nguyên, chuỗi, số thực,…).
b) Truy cập phần tử qua chỉ số, dùng toán tử in:
>>> 7 in A
True
→ Chỉ số trong Python bắt đầu từ 0. Toán tử in kiểm tra một giá trị có nằm trong mảng hay không.
c) Duyệt phần tử bằng lệnh for:
>>> for hs in B:
print(hs, end = " ")
Hà Bình Ngọc Anh
d) Các lệnh cơ bản làm việc với danh sách (đã học ở lớp 10):
- append: thêm phần tử vào cuối.
- remove: xoá một phần tử.
- insert: chèn phần tử vào vị trí bất kì.
- clear: xoá toàn bộ phần tử.
Câu hỏi củng cố mục 1 trang 82
Đề bài:
1. Sử dụng hàm sum() tính tổng các số của một dãy, hãy viết câu lệnh tính giá trị trung bình của dãy số A cho trước.
Lời giải:
tb = sum(A) / len(A)
Giải thích:
sum(A)trả về tổng các phần tử của dãy A.len(A)trả về số phần tử của dãy A.- Lấy tổng chia cho số phần tử → giá trị trung bình.
2. Có thể duyệt các phần tử của mảng theo chiều ngược lại, từ cuối về đầu, được không?
Lời giải:
Được. Ta duyệt ngược bằng cách dùng chỉ số kết hợp với range:
for i in range(len(A) - 1, -1, -1):
print(A[i], end = " ")
Giải thích:
len(A) - 1là chỉ số phần tử cuối.- Duyệt từ chỉ số cuối về 0, mỗi bước giảm 1 (bước = –1).
2. Cấu trúc dữ liệu mảng hai chiều
Hoạt động 2 trang 82
Đề bài: Thực hiện các lệnh sau, quan sát, trao đổi và thảo luận, từ đó nhận biết về mô hình danh sách trong danh sách của Python.
Lời giải:
a) Tạo dữ liệu gồm tên và điểm của học sinh:
>>> DS_diem = [["Quang", 7.5], ["Hà", 8.0], ["Bình", 9.5]]
→ Mỗi phần tử của DS_diem lại là một danh sách nhỏ gồm hai phần tử (tên, điểm).
b) Truy cập một phần tử của danh sách:
>>> DS_diem[1]
['Hà', 8.0]
→ Kết quả là danh sách con ứng với học sinh thứ 2 (vì chỉ số bắt đầu từ 0).
c) Truy cập một giá trị cụ thể bên trong danh sách con:
>>> DS_diem[0][1]
7.5
→ DS_diem[0] là danh sách ["Quang", 7.5], lấy tiếp phần tử chỉ số 1 → 7.5 (điểm của Quang).
d) Duyệt các phần tử bằng vòng for mở rộng:
>>> for hs, diem in DS_diem:
print(hs, diem)
Quang 7.5
Hà 8.0
Bình 9.5
→ Mỗi lần lặp, biến hs nhận tên, biến diem nhận điểm.
Câu hỏi củng cố sau Hoạt động 2 trang 83
Đề bài:
1. Thiết lập mảng bao gồm dữ liệu là toạ độ các điểm trên mặt phẳng, mỗi điểm p được cho bởi hai toạ độ (px, py).
Lời giải:
DS_diem = [[1, 2], [3, 5], [4, 7], [6, 8]]
→ Mỗi phần tử là một danh sách 2 phần tử [px, py] biểu diễn toạ độ một điểm.
2. Thiết lập mảng bao gồm dãy các thông tin là danh sách học sinh và thông tin ba điểm thi của học sinh tương ứng các bài thi số 1, 2, 3. Viết đoạn lệnh nhập bộ dữ liệu trên và chương trình in ra danh sách học sinh cùng với điểm trung bình của các bài thi.
Lời giải:
DS = [["Quang", 7.5, 8.0, 9.0],
["Hà", 8.0, 7.0, 6.5],
["Bình", 9.5, 8.5, 9.0]]
for hs in DS:
tb = (hs[1] + hs[2] + hs[3]) / 3
print(hs[0], tb)
Giải thích:
- Mỗi phần tử
hslà danh sách gồm: tên (hs[0]), điểm 3 bài (hs[1],hs[2],hs[3]). - Lấy trung bình 3 điểm rồi in cùng tên học sinh.
Hoạt động 3 trang 83
Đề bài: Đọc, trao đổi, thảo luận về cấu trúc dữ liệu mảng hai chiều trong Python.
Lời giải:
a) Khái niệm mảng hai chiều:
- Là bảng (hay ma trận) gồm các hàng và cột dữ liệu.
- Ma trận kích thước $m \times n$ có $m$ hàng, mỗi hàng có $n$ phần tử.
- Phần tử ở hàng $i$, cột $j$ kí hiệu là $a_{ij}$.
Ví dụ ma trận vuông bậc 3:
$$A = \begin{pmatrix} 12 & 10 & 91 \\ 11 & 45 & 20 \\ 15 & 34 & 55 \end{pmatrix}$$
Khai báo trong Python:
>>> A = [[12,10,91],[11,45,20],[15,34,55]]
Truy cập phần tử ở hàng 3, cột 2 (chỉ số Python bắt đầu từ 0):
>>> A[2][1]
34
b) Duyệt ma trận bằng hai lệnh for lồng nhau:
>>> for i in range(3):
for j in range(3):
print(A[i][j], end = " ")
print()
12 10 91
11 45 20
15 34 55
Giải thích:
- Vòng ngoài (biến
i) duyệt qua các hàng. - Vòng trong (biến
j) duyệt qua các cột trong hàng đó. - Lệnh
print()sau vòng trong dùng để xuống dòng khi hết một hàng.
Câu hỏi củng cố sau Hoạt động 3 trang 84
Đề bài:
1. Câu lệnh sau sẽ tạo dữ liệu thuộc loại gì?
temp = [1, 2, 3, 4]
A = [temp, temp]
Lời giải:
templà mảng một chiều gồm 4 phần tử.A = [temp, temp]là mảng hai chiều (danh sách trong danh sách), gồm 2 hàng, mỗi hàng có 4 phần tử. Kích thước $2 \times 4$.- Cụ thể:
A = [[1,2,3,4], [1,2,3,4]].
2. Nếu A là bảng (ma trận) kích thước $m \times n$ thì đoạn chương trình sau sẽ in ra thông tin gì trên màn hình?
>>> for i in range(m):
for j in range(n):
print(A[i][j], end = " ")
print()
Lời giải:
Đoạn chương trình sẽ in ra toàn bộ ma trận A dưới dạng bảng có $m$ hàng, $n$ cột. Các phần tử cùng hàng cách nhau một dấu cách, hết mỗi hàng thì xuống dòng.
Luyện tập
Luyện tập trang 85
Đề bài:
1. Giả sử số đo chiều cao các bạn trong lớp được cho trong dãy số A. Hãy viết đoạn chương trình tính:
– Số đo chiều cao trung bình của cả lớp.
– Số bạn có chiều cao lớn hơn chiều cao trung bình của cả lớp.
Lời giải:
# Chiều cao trung bình
tb = sum(A) / len(A)
print("Chiều cao trung bình:", tb)
# Đếm số bạn cao hơn trung bình
dem = 0
for x in A:
if x > tb:
dem = dem + 1
print("Số bạn cao hơn trung bình:", dem)
Giải thích:
- Dùng
sum(A) / len(A)tính trung bình. - Duyệt lần lượt từng chiều cao trong A, nếu lớn hơn
tbthì tăng biến đếmdemlên 1.
2. Viết chương trình nhập từ bàn phím số tự nhiên m, sau đó lần lượt nhập m dòng, mỗi dòng bao gồm n số cách nhau bởi dấu cách, đưa dữ liệu đã nhập vào ma trận A, sau đó in ma trận A ra màn hình.
Lời giải:
m = int(input("Nhập m: "))
A = []
for i in range(m):
dong = input().split() # tách các số theo dấu cách
hang = []
for x in dong:
hang.append(int(x)) # chuyển chuỗi thành số nguyên
A.append(hang)
# In ma trận A
for i in range(m):
for j in range(len(A[i])):
print(A[i][j], end = " ")
print()
Giải thích:
input().split()tách một dòng nhập thành danh sách các chuỗi.- Duyệt qua các chuỗi, chuyển thành số nguyên bằng
int()rồi thêm vào hàng. - Thêm cả hàng vào ma trận A bằng
append. - Cuối cùng in A bằng hai vòng
forlồng nhau.
Vận dụng
Vận dụng trang 85
Đề bài:
1. Viết hàm số UnitMatrix(n) với n là số tự nhiên cho trước, hàm trả lại giá trị là ma trận bậc n như Hình 17.1.

Lời giải:
def UnitMatrix(n):
E = []
for i in range(n):
hang = []
for j in range(n):
if i == j:
hang.append(1)
else:
hang.append(0)
E.append(hang)
return E
Giải thích:
- Với mỗi hàng $i$ (từ 0 đến $n-1$), duyệt tiếp qua các cột $j$.
- Nếu $i = j$ (đường chéo chính) thì phần tử bằng 1, còn lại bằng 0.
- Trả về ma trận E vừa tạo.
2. Viết chương trình cho phép người dùng nhập từ bàn phím một dãy số tự nhiên, hãy đếm với mỗi giá trị của dãy có bao nhiêu số lặp lại.

Lời giải:
day = input("Nhập dãy số, cách nhau bởi dấu cách: ").split()
for i in range(len(day)):
day[i] = int(day[i])
da_dem = [] # danh sách các số đã đếm
for x in day:
if x not in da_dem:
dem = 0
for y in day:
if y == x:
dem = dem + 1
print("Số", x, "lặp lại", dem, "lần")
da_dem.append(x)
Giải thích:
- Nhập dãy, chuyển từng phần tử sang kiểu số nguyên.
- Duyệt qua từng số
x. Nếuxchưa được đếm trước đó (chưa nằm trongda_dem), ta đếm số lầnxxuất hiện trong dãy, in kết quả rồi ghi vàoda_demđể không đếm lại lần nữa.
3. Em ghi số tiền điện gia đình em theo từng tháng vào một danh sách gồm 12 số. Mỗi năm lại ghi lại số tiền điện vào một danh sách và ghép với danh sách các năm trước. Như vậy em thu được một bảng kích thước n × 12, trong đó hàng thứ k là số tiền điện của năm thứ k, cột tương ứng số tiền điện theo tháng.
a) Thiết lập mảng mới tính số tiền điện trung bình của các năm, mỗi năm ghi một số.
b) Tính số tiền điện trung bình của tất cả các năm đã được ghi dữ liệu trong bảng.
Lời giải:
a) Mảng tiền điện trung bình từng năm:
TB = []
for i in range(n):
tb_nam = sum(A[i]) / 12
TB.append(tb_nam)
Giải thích:
A[i]là danh sách 12 số tiền điện của năm thứ $i$.sum(A[i]) / 12là tiền điện trung bình của năm đó.- Thêm vào mảng
TBđể lưu kết quả từng năm.
b) Tiền điện trung bình của tất cả các năm:
tong = 0
for i in range(n):
tong = tong + sum(A[i])
tb_chung = tong / (n * 12)
print("Tiền điện trung bình:", tb_chung)
Giải thích:
- Cộng tổng tiền điện của toàn bộ n năm (mỗi năm 12 tháng).
- Chia cho tổng số tháng $n \times 12$ để ra trung bình chung.

Thầy Phạm Thành Danh
(Người kiểm duyệt, ra đề)
Chức vụ: Trưởng ban biên soạn môn Tin Học THPT
Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1
Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa
