Bài 32. Ôn tập lập trình Python

Ôn tập lập trình Python trang 66 sách bài tập Tin Học lớp 10Kết Nối Tri Thức Với Cuộc Sống, mời các em tham khảo cùng Bumbii.

Chủ đề 5. Giải quyết vấn đề với sự trợ giúp của máy tính. Bài 29. Nhận biết lỗi chương trình.

Câu 32.1

Em hãy viết chương trình nhập một họ tên đầy đủ từ bàn phím, ví dụ “Nguyễn Thị Mai Hương”, sau đó tách riêng phần tên, họ, đệm và thông báo ra màn hình.

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)

Kết quả:

Nhập họ tên đầy đủ của bạn: Nguyễn Văn Anh
Tên của bạn là: Anh
Họ của bạn là: Nguyễn
Đệm của bạn là: Văn

Câu 32.2

Nhà nước quản lí lượng tiêu thụ điện được thống kê theo tháng. Tháng được gọi là đột biến nếu sản lượng tiêu thụ của tháng đó lớn hơn cả tháng trước và sau tháng đó. Dữ liệu sản lượng tiêu thụ điện hàng tháng được cho bởi dãy các số, ví dụ:

a[0], a[1],…, a[N-1].

cần tìm và liệt kê các chỉ số và giá trị a[i] sao cho a[i] tương ứng với tháng đột biến.

Yêu cầu nhập dữ liệu sản lượng điện tiêu thụ từ bàn phím trên một hàng có N số, mỗi số cách nhau bởi dấu cách. Chương trình cần in ra dãy các tháng (bằng chỉ số dãy) và sản lượng tiêu thụ đột biến của tháng đó.

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, A[k])

Câu 32.3

Bài toán đếm số lần lặp của một mẫu xâu trong xâu gốc như sau: Cho trước xâu gốc S và một xâu mẫu str. Yêu cầu cần tìm số lần lặp của xâu mẫu str trong xâu gốc S. Có hai kiểu tìm số lần lặp:

1 – Tìm số lần lặp xâu con có thể chồng lấn lên nhau.

2 – Tìm số lần lặp không chồng lấn của xâu con.

Ví dụ nếu xâu gốc là “12121341212100”, xâu con mẫu là “121” thì:

– Số lần lặp có chồng lấn của str trong S là 4 lần.

– Số lần lặp không chồng lấn của str trong S là 2 lần.

Bài toán như sau: Cho trước các xâu kí tự S và str, hãy tìm số lần lặp không chồng lấn của xâu str trong xâu S.

Hướng dẫn:

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)

Đáp án: 2.

Câu 32.4

Cho trước dãy số. Yêu cầu cần tìm ra một dãy con liên tục có độ dài lớn nhất bao gồm các số bằng nhau. Ví dụ với dãy: 1, 1, 2, 3, 0, 0, 0, 7, 10, 10, 5, 1, 1,6 thì cần đưa ra thông báo:

Dãy con bằng nhau có độ dài lớn nhất là 0, 0, 0 bắt đầu từ chỉ số 4.

Dãy số gốc gồm các số nguyên được nhập trên một dòng từ bàn phím, chương trình cần đưa ra thông báo như trên.

Hướng dẫn:

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

Đáp án:

Dãy con bằng nhau lớn nhất bắt đầu từ chỉ số:  4 độ dài 3
[0, 0, 0]

Câu 32.5

Trong các phần mềm bảng tính điện tử, dữ liệu ngày tháng được coi là số ngày tính từ ngày 1-1-1990. Viết chương trình nhập số tự nhiên n từ bàn phím và tính xem số đó ứng với ngày, tháng, năm nào.

Hướng dẫn:

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ố tự nhiên 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 32.6

Trong các phần mềm bảng tính điện tử, dữ liệu ngày tháng được coi là số ngày tính từ ngày 1-1-1990.

Nhập thời gian theo khuôn dạng ngày – tháng – năm (ví dụ 8-10-2021), tính giá trị của ngày này theo cách lưu trữ của phần mềm bảng tính điện tử.

Hướng dẫn:

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):
        month[1] = 29
    D = 0
    for i in range(mm-1):
        D = D + month[i]
    D = D + dd
    return D
def day_nam(year,day):
    D = 0
    for k in range(1900,year):
        D = D + day_of_year(k)
    D = D + day
    return D
#Chương trình chính
msg = input("Nhập ngày - tháng - năm: ")
A = msg.split("-")
dd,mm,year = int(A[0]),int(A[1]),int(A[2])
D = day_thang(year,mm,dd)
day = day_nam(year,D)
print(day)

Câu 32.7

Viết chương trình nhập số n, sau đó nhập danh sách học sinh trong lớp với đầy đủ họ, đệm, tên. Sau đó cần sắp xếp học sinh trong lớp theo thứ tự từ điển (tức là thứ tự của bảng chữ cái trong bảng mã Unicode). Đưa kết quả ra màn hình.

Hướng dẫn:

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 32.8

Mở rộng bài tập trên như sau:

– Việc sắp xếp thứ tự phải ưu tiên tính theo tên trước, rồi đến họ, rồi đến đệm.

– Sắp xếp theo thứ tự của bảng chữ cái tiếng Việt.

Lưu ý: Bảng chữ cái tiếng Việt (bao gồm cả dấu thanh) được sắp xếp theo thứ tự sau:

AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬBCDĐEÈÉẺẼẸÊỀẾỂỄỆGHIÌÍỈĨỊJKLMNOÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢPGRSTUÙÚỦŨỤƯỪỨỬỮỰVXYỲÝỶỸỴaàáảãạăằắẳẵặâầấẩẫậbcdđeèéẻẽẹêềếểễệghiìíỉĩịjklmnoòóỏõọôồốổỗộơờớởỡợpgrstuùúủũụưừứửữựvxyỳýỷỹỵ

Hướng dẫn: ôn tập lập trình Python

Để 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ÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢPGRSTUÙÚỦŨỤƯỪỨỬỮỰVXYỲÝỶỸỴ\
aàáảãạăằắẳẵặâầấẩẫậbcdđeèéẻẽẹêềếểễệghiìíỉĩịjklmn\
oòóỏõọôồốổỗộơờớởỡợpgrstuùúủũụưừứửữựvxyỳýỷỹ"
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 32.9

Nếu n là hợp số thì dễ thấy n phải có ước số nguyên tố nhỏ hơn hoặc bằng . Viết chương trình tối ưu hoá hơn nhiệm vụ 1, bài 31, theo cách sau: để tìm ước số nguyên tố nhỏ nhất chỉ cần tìm trong các số 2, 3,… Nếu trong dãy trên không tìm thấy ước của n thì kết luận ngay n là số nguyên tố.

Hướng dẫn: ôn tập lập trình Python

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

Câu 32.10

Bài toán mô tả đường bay của hòn đá khi được ném lên.

Viết chương trình mô tả bài toán chuyển động của hòn đá khi được ném lên từ một vị trí ban đầu. Yêu cầu tính toán là hòn đá di chuyển trong điều kiện lí tưởng không có lực cản không khí và ma sát. Bài toán có thể lấy mô hình hòn đá, hoặc quả lựu đạn, hoặc quả tên lửa được bắn ra,…

Các thông tin ban đầu cần nhập từ bàn phím:

– Góc ném hòn đá: d (tính theo độ, yêu cầu 0 < α < 90).

– Vị trí (độ cao) khi ném hòn đá: h (tính theo mét, yêu cầu h > 0).

– Độ lớn của lực (vận tốc) ném: v (tính theo m/s, yêu cầu v > 0).

Các thông tin cần tính toán để đưa kết quả ra:

– Khoảng cách ném xa của hòn đá (tính từ vị trí ném).

– Độ cao cực đại của hòn đá.

– Thời gian di chuyển của hòn đá tính từ khi bắt đầu ném cho đến khi chạm đất.

Hướng dẫn: ôn tập lập trình Python

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:

Vx= V.cos(α), Vy = v.sin(α) (1)

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 L = vxT.

Để 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à vyt –  = 0, từ đó suy ra t = 2vy/g. 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= vy/g = v.sin(α)/g (3)

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 T, 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.

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

Xem các bài giải khác tại Giải sách bài tập tin học lớp 10 – Kết nối tri thức với cuộc sống

Thông tin liên hệ & mạng xã hội:
Website: https://bumbii.com/
Facebook: https://www.facebook.com/bumbiiapp
Pinterest: https://www.pinterest.com/bumbiitech

0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận
0
Cùng chia sẻ bình luận của bạn nào!x