Đáp án và lời giải
Giải SBT Tin 10 KNTT Bài 32. Ôn tập lập trình Python có đáp án
Câu 1
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn:
Em đã biết cách tách phần họ và tên của một xâu kí tự họ tên đầy đủ. Bài tập này yêu cầu tách thêm phần đệm, tức là phần nằm giữa tên và họ ra. Việc tách này khá đơn giản bằng cách sử dụng phương thức join() của xâu kí tự. Xâu kí tự họ tên gốc trước tiên được tách thành một dãy bằng hàm split(). Sau khi lấy phần họ, tên, phần đệm sẽ được lấy ra bằng lệnh sau:
dem = " ".join(slist[1:n-1])
Trong đó slist là dãy đã được tách ra từ xâu kí tự họ tên đầy đủ, n là độ dài của xâu slist. Chương trình hoàn chỉnh có thể viết như sau:
hoten = input("Nhập họ tên đầy đủ của bạn: ")
slist = hoten.split()
n = len(slist)
ho = slist[0]
ten = slist[n-1]
dem = " ".join(slist[1:n-1])
print("Tên của bạn là",ten)
print("Họ của bạn là", ho)
if n > 2:
print("Đệm của bạn là:", dem)
* Chương trình chạy thử:

Câu 2
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn:
slist = input("Nhập dãy các số là sản lượng tiêu thụ điện: ")
A = [int(k) for k in slist.split()]
for k in range(1, len(A)-1):
if A[k-1] < A[k] < A[k+1]:
print("tháng thứ" , k-1, A[k])
Câu 3
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Chương trình có thể viết như sau:
S = "12121341212100"
str = "121"
n = len(S)
m = len(str)
count = 0
k = 0
Indx = 0
while k <= n-m and Indx >= 0:
Indx = S.find(str, k)
if Indx >= 0:
count = count + 1
k = Indx + m
print(count)

Câu 4
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Chương trình có thể viết như sau:
A = [1, 1, 2, 3, 0, 0, 0, 7, 10, 10, 5, 1, 1, 6]
Indx = 0
lenMax = 1
for i in range(len(A)):
j = i
while j < len(A) and A[j] == A[i]:
if j-i+1 > lenMax:
Indx = i
lenMax = j-i+1
j = j + 1
print("Dãy con bằng nhau lớn nhất bắt đầu từ chỉ số:", Indx, "độ dài" ,lenMax)
print(A[Indx: Indx+lenMax])

Câu 5
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn:
Chương trình 1. Nhập số tự nhiên từ bàn phím và tính xem đó là ngày tháng năm nào.
month = [31,28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def nhuan(year):
if year % 400 == 0 or (year % 4 == 0 and year%100 != 0):
return True
else:
return False
def day_of_year(year):
if nhuan(year):
return 366
else:
return 365
def hople (year, mm, day):
if nhuan(year):
month[1] = 29
if mm < 1 or mm > 12:
return False
if day < 1 or day > month[mm-1]:
return False
return True
def tinh_nam(d):
year = 1900
n_day = day_of_year(year)
day = d
while n_day <= d:
day = d - n_day
year = year + 1
n_day = n_day + day_of_year (year)
if day == 0:
year = year - 1
day = day_of_year(year)
return year, day
def tinh_thang(year, day):
if nhuan(year):
month[1] = 29
mm = 0
n_day = month[mm]
dd = day
while n_day <= day and mm < 11:
dd = day - n_day
mm = mm + 1
n_day = n_day + month[mm]
if dd == 0:
mm = mm - 1
dd = month[mm]
return mm+1, dd
# Chương trình chính
d = int(input("Nhập số ngày tính từ 1/1/1990: "))
year, day = tinh_nam(d)
mm, dd = tinh_thang(year, day)
print("Đó là ngày", dd,"tháng", mm , "năm", year)
Câu 6
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Chương trình có thể viết như sau:
month = [31,28,31,30,31,30,31,31,30,31,30,31] def nhuan(year): if year % 400 == 0 or (year % 4 == 0 and year%100 != 0):
return True else:
return false def day_of_year (year): if nhuan(year):
return 366 else:
return 365 def hople(year, mm, day): if nhuan(year):
month[1] = 29 if mm < 1 or mm > 12:
return false if day < 1 or day > month[mm-1]:
return false return True def day_thang (year, mm, dd):
if nhuan(year):
Câu 7
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Chương trình có thể viết như sau:
def sap_xep (A):
B = A.copy()
for i in range(1, len(B)):
j = i
while j > 0 and B[j] < B[j-1]:
B[j], B[j-1] = B[j-1], B[j]
j = j-1
return B
# Chương trình chính
A = []
n = int(input("Nhập số học sinh của lớp: "))
for k in range(n):
hoten = input("Nhập tên học sinh thứ "+str(k+1)+": ")
A.append(hoten)
B = sap_xep(A)
print("Danh sách học sinh trong lớp: ")
for hs in B:
print(hs)

Lưu ý: Hàm sap_xep(A) sẽ trả lại dãy đã được sắp xếp tăng dần của A, bản thân dãy A không thay đổi.
Câu 8
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn:
Để làm được bài tập này chúng ta cần thiết kế cơ chế so sánh từ điển tiếng Việt giữa hai xâu bất kì. Cách làm là đưa ra một từ điển Alphabet bao gồm các chữ cái tiếng Việt theo đúng thứ tự. Việc so sánh theo thứ tự từ điển được thực hiện bởi hàm so_sanh(s1, s2). Hàm này có ý nghĩa như sau:
Giá trị hàm trả lại: Bằng 0, nếu s1 = s2.
Bằng 1, nếu s1 > s2.
Bằng -1, nếu s1 < s2.
Sau khi đã định nghĩa được thứ tự từ điển mới thì các bước tiếp theo là khá dễ dàng.
Chương trình có thể viết như sau:
Alphabet = " AÀÁẢÃẠĂẰẮẲẴẶÂẤẨẪẬBCDĐEÈÉẺẼẸÊỀẾỂỄỆGHIÌÍỈĨỊJKLMN\ OÒÓỎÕỌƠỚỞỠỢÔỒỐỔỖỘPQRSTUÙÚỦŨỤƯỪỨỬỮỰVXXYỲÝỶỸỴ\ aàáảãạăằắẳẵặâấẩẫậbcdđeèéẻẽẹêềếểễệghiìíỉĩịjklmn\ oòóỏõọơớởỡợôồốổỗộpqrstuùúủũụưừứửữựvxxyỳýỷỹỵ."
MAX = 30
def so_sanh(s1, s2):
m = min(len (s1), len(s2))
kq = 0
k = 0
while k < m and kq == 0:
ch1, ch2 = s1[k], s2[k]
if Alphabet.index(ch1) < Alphabet.index(ch2):
kq = -1
return -1
if Alphabet.index(ch1) > Alphabet.index(ch2):
kq = 1
return 1
k = k + 1
if len(s1) < len(s2):
return -1
elif len(s1) > len(s2):
return 1
else:
return 0
def tach_ten(hoten):
sline = hoten.split()
return sline[len(sline)-1]
def space(k):
return " "*k
def transform(A):
B = []
for s in A:
ten = tach_ten(s)
tenmoi = ten + space(MAX - len(ten)) + s
B.append(tenmoi)
return B
def sap_xep(A):
hs = A.copy( )
B = transform(A)
for i in range(1, len(B)):
j = i
while j > 0 and so_sanh (B[j],B[j-1]) == -1:
B[j],B[j-1] = B[j-1],B[j]
hs[j],hs[j-1] = hs[j-1],hs[j]
j = j-1
return hs
# Chương trình chính
A = []
n = int(input("Nhập số học sinh của lớp: "))
for k in range(n):
hoten = input("Nhập tên học sinh thứ "+str(k+1)+": ")
A.append(hoten)
hs = sap_xep(A)
print("Danh sách học sinh trong lớp: ")
for s in hs:
print(s)
Câu 9
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Chương trình có thể viết như sau:
from math import sqrt
n = int(input("Nhập số tự nhiên n: "))
m = n
k = 2
NT = []
while m > 1:
while m%k != 0:
if k < sqrt(m):
k = k + 1
else:
k = m
NT.append(k)
m = m//k
count = len(NT)
if count == 0:
print(n, "không là số nguyên tố")
elif count == 1:
print(n,"là số nguyên tố")
else:
print(n,"là hợp số")
print(n,"=", end = " ")
for i in range(count):
if i < count - 1:
print (NT[i],"x", end = " ")
else:
print(NT[i])
* Chương trình chạy thử với 2 bộ dữ liệu là 12, 13.

Câu 10
Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý
Hướng dẫn:
Bài toán này nằm trong Chương trình môn Vật lí 10, phần chuyển động ném xiên của vật thể.
Quan sát hình sau:

Hòn đá được ném lên từ vị trí A có độ cao h với góc ném α và vận tốc góc v. Quỹ đạo chuyển động của hòn đá sẽ có dạng parabol như trong Hình 32.1. Hòn đá sẽ lên đỉnh cao nhất tại C và sau đó chạm đất tại vị trí B. Em cần tính ba thông số H, T, L như sau:
H: độ cao khi hòn đá lên đỉnh. Ta có H = h + IC.
T: thời gian để hòn đá xuất phát từ A đến vị trí B.
L: khoảng cách OB.
Sơ lược cách tính các tham số H, T, L.
Lực ném v sẽ phân tích thành 2 lực: lực thẳng đứng vy, và lực ngang vx. Ta có công thức:
Phương trình tham số theo thời gian t của quỹ đạo hòn đá chuyển động như sau:
Thời gian t trong công thức (2) tính từ 0, tức là từ điểm A. g = 9.8 là trọng lực Trái Đất.
Để tính thời gian T chúng ta giải phương trình y(t) = 0 trong công thức (2). Đây là phương trình bậc hai với t. T chính là nghiệm dương của phương trình này.
Khoảng cách L dễ dàng tính được theo công thức .
Để tính độ cao H thì khó hơn.
Thời gian để hòn đá bay đến điểm A' được tính như sau: y(t) = h, tức là , từ đó suy ra . Thời gian đi đến đỉnh C bằng một nửa thời gian đến A’, vậy suy ra thời gian đạt đỉnh cao nhất là:
Từ công thức (3) dễ dàng tính được độ cao IC, từ đó tính được H.
Từ các phân tích trên chúng ta sẽ tính được các công thức sau cho I, H và L.
Để tính theo các công thức (4), (5), (6) em cần sử dụng các hàm số toán học như sin, cosin, hàm tính căn bậc hai. Các hàm toán học không có sẵn trong Python mà có trong một module độc lập bên ngoài, module math. Muốn sử dụng các hàm số này chúng ta cần đưa lệnh sau vào chương trình (ở dòng lệnh đầu tiên).
from math import danh sách các hàm>
Muốn dùng tất cả các hàm có trong module math (hay bất kì module nào khác) chúng ta dùng lệnh:
from math import *
Các hàm lượng giác sin(α), cos(α) trong Python quy định tham số góc đầu vào không tính theo độ, mà theo độ đo radian. Do vậy chúng ta cần thêm một hàm số nữa là hàm radians() dùng để chuyển số đo từ độ sang radian.
Vậy chương trình sẽ cần các hàm toán học sau.
from math import sqrt, radians, sin, cos
Chương trình cần được tạo Với tên flyingrocket.py và phần nội dung chính mô tả ba hàm số Timing(), Height() và Length(). Các hàm này có tham số đầu vào là v, alpha, h và có giá trị trả lại chính là T, H, L mà chúng ta cần tìm.
Chương trình tham khảo như sau:
flyingrocket.py
from math import sqrt, radians, sin, cos
G = 9.8 # trọng lực Trái Đất
def Timing (v, alpha, h):
alpha = radians (alpha)
return (v* sin(alpha) + sqrt(v*v*sin(alpha)*sin(alpha) + 2*h*G))/G
def Height (v, alpha, h):
alpha = radians (alpha)
return h + v*v* sin(alpha)*sin(alpha)/(2*G)
def Length(v, alpha, h):
alpha = radians(alpha)
return v*v*sin(2*alpha)/(2*G) + v* cos(alpha)*sqrt(v*v* sin(alpha) *sin(alpha) + 2*h*G)/G
v = float(input("Nhập vận tốc ném (m/s) ban đầu: "))
alpha = int(input("Nhập góc ném ban đầu (nguyên > 0 và < 90): "))
h = float(input("Nhập chiều cao vị trí ném (số thực >= 0): "))
H = round(Height(v, alpha, h),1)
T = round (Timing (v, alpha, h))
L = round(Length(v, alpha, h),1)
print("Kết quả ném hòn đá như sau:")
print("Độ cao lớn nhất là:",H, "mét.")
print("Khoảng cách hòn đá bay được:", L,"mét.")
print("Thời gian ném hòn đá là:",T,"giây.")