Giải Tin Học 10 trang 118
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 118–119
Tóm tắt lý thuyết
Một số lệnh thường dùng khi làm việc với danh sách A:
| Lệnh | Tác dụng |
|---|---|
A.append(x) | Bổ sung phần tử x vào cuối danh sách A |
A.insert(k, x) | Chèn phần tử x vào vị trí k của danh sách A |
A.clear() | Xoá toàn bộ dữ liệu của danh sách A |
A.remove(x) | Xoá phần tử x (lần xuất hiện đầu tiên) khỏi danh sách A |
Điểm cần nhớ: chỉ số (vị trí) trong Python bắt đầu từ 0. Vị trí 0 là phần tử đầu tiên.
Câu hỏi củng cố (trang 117)
Câu 1
Đề: Khi nào thì lệnh A.append(1) và A.insert(0,1) có tác dụng giống nhau?
Lời giải:
A.append(1)luôn thêm số 1 vào cuối danh sách.A.insert(0,1)luôn chèn số 1 vào đầu danh sách (vị trí 0).
Hai lệnh này cho kết quả giống nhau khi đầu danh sách cũng chính là cuối danh sách, tức là khi danh sách A đang rỗng (A = []).
Khi đó cả hai đều cho A = [1].
Câu 2
Đề: Danh sách A trước và sau lệnh insert() lần lượt là [1,4,10,0] và [1,4,10,5,0]. Lệnh đã dùng là gì?
Lời giải:
So sánh hai danh sách:
- Trước:
[1, 4, 10, 0] - Sau:
[1, 4, 10, 5, 0]
Phần tử mới được thêm vào là số 5, nằm ở vị trí thứ tư (đếm từ 0 thì là chỉ số 3), tức là chen vào giữa số 10 và số 0.
Vậy lệnh đã dùng là:
A.insert(3, 5)
Phần Thực hành
Nhiệm vụ 1: In danh sách học sinh theo thứ tự ngược
Chương trình trong sách dùng insert(0, name) để mỗi tên nhập sau đều được chèn lên đầu, nên khi in ra sẽ ngược với thứ tự nhập.
dsLop = []
n = int(input("Nhập số học sinh trong lớp: "))
for i in range(n):
name = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
dsLop.insert(0, name)
print("Danh sách học sinh đã nhập:")
for name in dsLop:
print(name)
Giải thích: giả sử nhập An, Bình, Cường thì sau mỗi lần insert(0,...) danh sách lần lượt là [An] → [Bình, An] → [Cường, Bình, An]. Khi in ra ta được Cường, Bình, An, đúng thứ tự ngược.
Nhiệm vụ 2: Xoá các phần tử nhỏ hơn 0
A = [0,1,-3,-10,5,9,-20,55]
i = 0
while i < len(A):
if A[i] < 0:
A.remove(A[i])
else:
i = i + 1
print(A)
Giải thích quan trọng: khi xoá một phần tử, các phần tử phía sau dồn lên một vị trí, nên ta không tăng i. Chỉ khi phần tử hiện tại hợp lệ (≥ 0) mới tăng i. Kết quả in ra: [0, 1, 5, 9, 55].
Nhiệm vụ 3: Tìm vị trí ba số liên tiếp 1, 2, 3
A = [0,4,0,1,2,3,8,9,0,1,2,3,17,-16,0,1,2]
p = [1,2,3]
pkq = -1
i = 0
while i < len(A) - 3 and pkq == -1:
if A[i] == p[0] and A[i+1] == p[1] and A[i+2] == p[2]:
pkq = i
else:
i = i + 1
if pkq >= 0:
print("Tìm thấy mẫu ", p, " tại vị trí", pkq)
else:
print("Không tìm thấy mẫu", p)
Giải thích: vòng lặp dừng ngay khi tìm thấy (vì điều kiện pkq == -1). Với dãy A đã cho, mẫu 1,2,3 xuất hiện đầu tiên tại chỉ số 3, nên chương trình in: Tìm thấy mẫu [1, 2, 3] tại vị trí 3.
Phần Luyện tập (trang 118)
Bài 1
Đề: Cho dãy số [1,2,2,3,4,5,5]. Viết lệnh thực hiện:
a) Chèn số 1 vào ngay sau giá trị 1 của dãy.
b) Chèn số 3 và số 4 vào danh sách để dãy có số 3 và số 4 liền nhau hai lần.
Lời giải:
a) Số 1 đang ở vị trí 0, nên "ngay sau" nó là vị trí 1.
A = [1,2,2,3,4,5,5]
A.insert(1, 1)
# A = [1, 1, 2, 2, 3, 4, 5, 5]
b) Dãy hiện có cặp 3, 4 tại các vị trí của số 3 và số 4. Ta cần thêm một cặp 3, 4 nữa liền kề. Trong dãy ban đầu, số 3 ở vị trí 3 và số 4 ở vị trí 4. Ta chèn thêm 4 rồi 3 để tạo cụm ...3, 4, 3, 4...:
A = [1,2,2,3,4,5,5]
A.insert(4, 4) # A = [1,2,2,3,4,4,5,5]
A.insert(4, 3) # A = [1,2,2,3,3,4,4,5,5]
Hmm, cách trên cho 3,3,4,4 chứ chưa phải 3,4 liền nhau hai lần. Để có hai cụm 3,4 liền nhau, ta chèn nguyên cụm sau số 4 đầu tiên:
A = [1,2,2,3,4,5,5]
A.insert(5, 4) # chèn 4 vào vị trí 5
A.insert(5, 3) # chèn 3 vào vị trí 5
# A = [1, 2, 2, 3, 4, 3, 4, 5, 5] -> có "3,4" hai lần liền nhau
Bài 2
Đề: Cho trước dãy số A. Viết chương trình:
- Xoá đi một phần tử ở chính giữa dãy nếu số phần tử của dãy là số lẻ.
- Xoá đi hai phần tử ở chính giữa của dãy nếu số phần tử của dãy là số chẵn.
Lời giải:
A = [3, 7, 1, 9, 4, 6, 8] # ví dụ
n = len(A)
if n % 2 == 1:
# số lẻ: phần tử giữa ở vị trí n // 2
giua = n // 2
A.pop(giua)
else:
# số chẵn: hai phần tử giữa ở vị trí n//2 - 1 và n//2
giua = n // 2
A.pop(giua) # xoá phần tử bên phải giữa trước
A.pop(giua - 1) # rồi xoá phần tử bên trái giữa
print(A)
Giải thích:
- Dãy lẻ có đúng một phần tử ở giữa, chỉ số là
n // 2. Ví dụ n = 7 thì vị trí giữa là 3. - Dãy chẵn có hai phần tử ở giữa, chỉ số
n//2 - 1vàn//2. Ta xoá phần tử bên phải trước (chỉ số lớn hơn) để chỉ số phần tử bên trái không bị xê dịch.
Phần Vận dụng (trang 118)
Bài 1
Đề: Viết chương trình nhập n từ bàn phím, tạo và in ra dãy số A gồm n số tự nhiên chẵn đầu tiên.
Lời giải:
n = int(input("Nhập n: "))
A = []
for i in range(n):
A.append(2 * i) # 0, 2, 4, 6, ...
print("Dãy n số tự nhiên chẵn đầu tiên:", A)
Giải thích: số tự nhiên chẵn thứ i (đếm từ 0) là 2*i. Với n = 5 ta được [0, 2, 4, 6, 8].
Bài 2
Đề: Dãy Fibonacci xác định bởi $F_0 = 0$, $F_1 = 1$, $F_n = F_{n-1} + F_{n-2}$ (với $n \ge 2$). Viết chương trình nhập n, tạo và in ra dãy A gồm n số hạng đầu của dãy Fibonacci.
Lời giải:
n = int(input("Nhập n: "))
A = []
for i in range(n):
if i == 0:
A.append(0)
elif i == 1:
A.append(1)
else:
A.append(A[i-1] + A[i-2])
print("Dãy Fibonacci:", A)
Giải thích:
- Hai số hạng đầu được gán cố định: $F_0 = 0$, $F_1 = 1$.
- Từ số hạng thứ ba trở đi, mỗi số bằng tổng hai số liền trước, lấy trực tiếp từ danh sách A đã có (
A[i-1] + A[i-2]). - Với n = 8 ta được
[0, 1, 1, 2, 3, 5, 8, 13].
Lưu ý: nếu n = 0 chương trình in danh sách rỗng, n = 1 chỉ in [0], đều đúng vì vòng lặp tự xử lý các trường hợp này.
Em có muốn mình giải thích kỹ hơn chỗ vì sao khi xoá phần tử thì không tăng chỉ số i không? Đó là điểm hay nhầm nhất trong bài này.
