IMG-LOGO
Trang chủ Lớp 10 Tin học 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

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

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

  • 160 lượt thi

  • 10 câu hỏi

  • 30 phút

Danh sách câu hỏi

Câu 2:

Bài toán sắp xếp: Cho trước một dãy số A, viết chương trình sắp xếp dãy số này theo thứ tự tăng dần.

Giả sử chúng ta sẽ áp dụng thuật toán sắp xếp chèn để cài đặt cho chương trình này. Ý tưởng của thuật toán này như sau: Sẽ duyệt từng phần tử của dãy A, tính từ vị trí thứ 2 trở đi. Với mỗi phần tử (giả sử A[k]), sẽ tìm cách chèn phần tử này vào đúng vị trí của dãy con phía trước A[0], [1], ..., A[k-1] sao cho dãy con này được sắp xếp đúng. Sau khi duyệt xong các phần tử của dãy thì dãy gốc đã được sắp xếp xong.

Với mỗi phần tử A[k], việc chèn vào vị trí đúng trong dãy con phía trước được thực hiện bằng một vòng lặp như sau:

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

Để tìm lỗi chương trình trên chúng ta áp dụng công cụ printine, in các giá trị trung gian. Với mỗi vòng lặp chính (vòng lặp for k in range(1,n)), chúng ta sẽ in ra các giá trị sau: k, A[k] và kết quả dãy A.

Chương trình được viết như sau, sau khi bổ sung các lệnh in phần tử trung gian.

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):

print("vòng" ,k, "số đang xét:", A[k], end = " ")

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

print(A)

print("Dãy gốc:",dayA)

A = dayA. copy()

sap_xep (A)

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

Em hãy viết lại chương trình trên và tiến hành kiểm thử xem chương trình có lỗi không? Nếu có thì tìm ra lỗi và sửa lại cho chương trình chạy đúng.

Xem đáp án

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

Media VietJack

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

Media VietJack

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:

Viết chương trình in bảng cửu chương ra màn hình. Yêu cầu bảng cửu chương in ra thành 10 khối bao gồm 2 hàng, 5 cột như sau:

Media VietJack
Xem đáp án

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:

Media VietJack

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

Media VietJack

Câu 4:

Cho trước dãy số bất kì A. Em hãy viết chương trình tìm và chỉ ra vị trí đầu tiên của dãy A mà 3 số hạng liên tiếp có giá trị là 1, 2, 3 (có thể tổng quát 3 số bất kì p, q, s). Nếu tìm thấy thì thông báo vị trí tìm thấy, nếu không thì thông báo "không tìm thấy mẫu".

Xem đáp án

Để 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)

Media VietJack

Câu 5:

Em hãy viết chương trình nhập một xâu kí tự bất kì từ bàn phím. Cần sắp xếp lại các chữ số thì dồn sang trái, các chữ cái tiếng Anh thì dồn sang phải xâu, các kí tự khác thì giữ nguyên vị trí.

Xem đáp án

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ử:

Media VietJack

Câu 6:

Em hãy viết chương trình nhập số tự nhiên n, sau đó nhập n họ tên đầy đủ học sinh trong lớp. Khi kết thúc sẽ in ra danh sách học sinh với 2 cột, cột 1 là tên, cột 2 là họ đệm của học sinh này.

Xem đáp án

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ử:

Media VietJack

Câu 7:

Em hãy viết chương trình nhập hai số tự nhiên Y1, Y2 là số năm, Y2 > Y1. Tính xem trong khoảng thời gian từ năm Y1 đến năm Y2 có bao nhiêu năm nhuận. Áp dụng tính xem trong thế kỉ XXI có bao nhiêu năm nhuận.

Xem đáp án

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:

Media VietJack

Câu 8:

Gọi ƯCLN(a, b) là hàm ƯCLN của hai số tự nhiên a, b. Dễ thấy ta có ƯCLN(a, b) = ƯCLN(b, a%b) nếu b > 0 và ƯCLN(a, 0) = a. Từ đó hãy viết chương trình nhập hai số a, b và tính ƯCLN của a và b.
Xem đáp án

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)

Media VietJack

Câu 9:

Em hãy viết chương trình nhập số tự nhiên n > 1, sau đó in ra tất cả các ước số nguyên tố khác nhau của n theo hàng ngang trên màn hình. Ví dụ:

- Nếu n = 10 thì in ra 2 5.

- Nếu n = 12 thì in ra 2 3.

Xem đáp án

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:

Bài toán tìm tổng con lớn nhất.

Giả sử một công ty du lịch đã thiết kế một chương trình du lịch cố định đi qua lần lượt n địa điểm. Mỗi khách hàng lại có các đánh giá khác nhau cho mỗi địa điểm này. Giả sử khách hàng tên An đã đánh giá các địa điểm trong chương trình du lịch theo dãy các giá trị: A[0], A[1], ..., A[n - 1]

Công ty muốn sắp sắp cho khách hàng An đi một phần của chương trình du lịch bằng cách đi theo một dãy con liên tục các địa điểm, ví dụ:

i, i + 1, i + 2, ..., j

Mục đích của việc chọn chương trình cho khách hàng An là làm sao cho tổng giá trị:

A[i] + A[i + 1] + ... + A[j]         (1) là lớn nhất có thể.

Cho trước dãy các đánh giá n địa điểm của chương trình du lịch, hãy thiết kế một chương trình du lịch con cho khách hàng sao cho tổng (1) là lớn nhất.

Ví dụ nêu dãy các đánh giá là: 1, 7, -5, -9, 3, -1,10, -6, 5

thì chương trình du lịch con đi qua các địa điểm với đánh giá 3, -1, 10 có tổng lớn nhất tức là làm khách hàng hài lòng nhất.

Xem đáp án

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 = " ")


Bắt đầu thi ngay