TopStudy

Đáp án và lời giải

Giải SBT Tin 10 KNTT Bài 31. Thực hành: Viết chương trình đơn giản có đáp án

Về trang đề

Câu 1

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 = float(input("Nhập số thực dương a:"))

while a <= 0:

print("Nhập sai, số a phải lớn hơn 0. Hãy nhập lại.")

a = float(input("Nhập số thực dương a:"))

Hình minh hoạ

Câu 2

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Các em tự viết lại chương trình trên:

Hình minh hoạ

Kết quả chạy chương trình có thể như sau:

Hình minh hoạ

Nhận xét: tại mỗi vòng lặp, các giá trị A[k] cũng đã được di chuyển để được chèn vào một vị trí trong dãy con A[0], A[1], ..., A[k-1], tuy nhiên vị trí A[0] không bị thay đổi. Từ đó chúng ta tìm ra lỗi của chương trình tại vị trí lệnh while:

while j > 0 and A[j] > A[j+1]:

Cần sửa lại như sau:

while j >= 0 and A[j] > A[j+1]:

Chương trình đã tìm ra lỗi nhờ công cụ kiểm thử printine. Chương trình chính thức sau khi sửa như sau.

sap_xep.py

dayA = [5,1,8,4,2] # Dãy gốc cần sắp xếp

def sap_xep(A):

n = len(A)

for k in range (1,n):

j = k – 1

while j >= 0 and A[j] > A[j+1]:

A[j], A[j+1] = A[j+1], A[j]

j = j – 1

A = dayA. copy()

sap_xep (A)

print("Dãy đích:", A)

Câu 3

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Hướng dẫn:

Từ yêu cầu của đề bài chúng ta sẽ thiết lập thủ tục chính printBCC() có chức năng in bảng cửu chương. Thủ tục này sẽ có hai phần độc lập, phần đầu in 5 khối thuộc hàng thứ nhất là bảng cửu chương của các số 1, 2, 3, 4, 5. Phần sau của thủ tục sẽ in 5 khối thuộc hàng thứ hai là bảng cửu chương của các số 6, 7, 8, 9, 10.

Để thể hiện chính xác và cân đối trên màn hình chúng ta thiết lập thêm hai hàm:

- Hàm st(num) để tạo xâu kí tự thể hiện số num. Nếu num là số có 1 chữ số thì st(num) sẽ chèn 1 dấu cách phía trước num.

- Hàm space(k) thể hiện k dấu cách trên màn hình.

Nhập, chạy thử và kiểm tra kết quả chương trình sau:

def st(n):

if n < 10:

return" "+str(n)

else:

return str(n)

def space(k):

return" "*k

def printBCC():

for h in range (10):

i = h+1

for j in range (1,6):

print(st(j) + " x " + st(i) + " = " + st(i*j) + space(2), end = " ")

print()

print()

for h in range(10):

i = h+1

for j in range (6,11):

print(st(j) + " x " + st(i) + " = " + st(i*j) + space(2), end = " ")

print()

# Chương trình chính

printBCC()

* Chương trình nhập lên phần mềm lập trình Python:

Hình minh hoạ

* Kết quả chạy thử chương trình:

Hình minh hoạ

Câu 4

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Để kiểm tra tại một chỉ số i, 3 phần tử liên tiếp nhau bằng 1, 2, 3 có nhiều cách kiểm tra khác nhau, ví dụ:

Cách 1. Sử dụng biểu thức lôgic.

A[i] == 1 and A[i] == 2 and A[i] == 3

Cách 2. Sử dụng so sánh có chứa vùng chỉ số.

A[i:i+3] == [1,2,3]

Chương trình có thể viết như sau:

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: i+3] == p:

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)

Hình minh hoạ

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 ta đã biết giữa các kí tự cũng có thể được so sánh. Hai kí tự ch1 và ch2 được so sánh với nhau thông qua vị trí của các kí tự này trong bảng mã ASCII hoặc Unicode. Quan hệ so sánh tự nhiên giữa các kí tự chữ cái và số như sau:

"0" < "1" < ... < "9".

"A" < "B" < ... < "Z" < "a" < "b" <...< "Z".

Để giải bài tập này chúng ta cần tạo các biến nhớ dùng để lưu các xâu kí tự trung gian là s_tr (xâu dùng để lưu tạm các kí tự là số), s_ph (xâu dùng để lưu tạm các kí tự là chữ cái) và s_gi (xâu dùng để lưu các kí tự không là chữ số cũng không là chữ cái). Thuật toán của chương trình như sau: duyệt một lần tất cả các kí tự của xâu gốc S, sau đó đưa các kí tự này vào các xâu trung gian s_tr, s_ph, s_gi. Xâu kết quả sẽ là s_tr + s_gi + s_ph. Mở phần mềm soạn thảo và nhập chương trình sau:

S = input("Nhập xâu kí tự bất kì: ")

s_tr = s_ph = s_gi = " "

for ch in S:

if "0" <= ch <="9":

s_tr = s_tr + ch

else:

if "a" <= ch <= "z" or "A" <= ch <= "Z":

s_ph = s_ph + ch

else:

s_gi = s_gi + ch

Skq = s_tr + s_gi + s_ph

print("Xâu kết quả:", Skq)

* Chương trình chạy thử:

Hình minh hoạ

Câu 6

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Hướng dẫn:

Mỗi họ tên được nhập sẽ được tách ra thành tên và họ đệm bằng hàm split(). Các tên học sinh sẽ được đưa vào dãy ten, các họ đệm sẽ được đưa vào dãy hodem. Sau khi nhập xong thì in ra danh sách các tên và họ đệm này.

n = int(input("Nhập số học sinh trong lớp: "))

ten = []

hodem = []

for i in range(n):

s = input("Nhập họ tên học sinh thứ "+str(i+1)+": ")

sline = s.split()

m = len(sline) -1

ten.append(sline[m])

del sline [m]

hodem.append(" ".join(sline))

print("Danh sách học sinh:")

for i in range(n):

print(ten[i], hodem[i])

* Chương trình chạy thử:

Hình minh hoạ

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 nhuan(year):

if year % 400 == 0 or (year % 4 == 0 and year%100 != 0):

return True

else:

return False

def Tinh_nhuan(Y1, Y2):

count = 0

for year in range(Y1, Y2+1):

if nhuan (year): count = count + 1

return count

Y1 = int(input("Nhập năm đầu: "))

Y2 = int(input("Nhập năm cuối: "))

print("Từ năm ",Y1," đến năm ",Y2," có ",Tinh_nhuan(Y1, Y2)," năm nhuận.")

* Chương trình chạy thử tính năm nhuận của thế kỉ XXI như sau:

Hình minh hoạ

Câu 8

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 UCLN(a, b):

while b > 0:

r = a%b

a = b

b = r

return a

a,b = eval(input("Nhập hai số a, b cách nhau bởi dấu phẩy: "))

print("ƯCLN là: ", UCLN(a,b))

* Chương trình chạy thử với bộ test (a,b) = (24,36)

Hình minh hoạ

Câu 9

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Hướng dẫn:

Lưu ý đến yêu cầu của bài toán là không in tất cả các ước nguyên tố trong khai triển n thành tích các thừa số nguyên tố, mà chỉ in mỗi ước số nguyên tố một lần. Vì vậy nếu đã tìm ra được một ước nguyên tố k của n thì cần giảm n bằng cách chia n cho k cho đến khi không chia hết được nữa thì tìm tiếp sang số tiếp theo.

Chương trình có thể viết như sau:

n = int(input("Nhập số tự nhiên n: "))

print(n,":", end = " ")

k = 2

while n > 1:

while k < n and n%k != 0:

k = k +1

if k<=n and n%k == 0:

print(k, end = " ")

while n%k == 0:

n = n//k

Câu 10

Hướng dẫn chấm do TopStudy biên soạn, mang tính gợi ý

Hướng dẫn:

Gọi S(i, j) = A[i] + A[i + 1] + ... + A[j]

Khi đó bài toán đặt ra là cần tìm i, j sao cho giá trị S(i, j) lớn nhất. Từ đó suy ra lời giải đơn giản sau:

A = [1,7,-5,-9,3,-1,10,-6, 5]

n = len(A)

imax = 0

jmax = 0

Smax = A[0]

for i in range(n):

S = 0

for j in range(i,n):

S = S + A[j]

if S > Smax:

imax = i

jmax = j

Smax = S

print("Chương trình du lịch tối ưu là:")

print(imax, jmax)

for i in range(imax, jmax+1):

print (A[i], end = " ")