Giải Tin học 10 – Bài 32. Ôn tập lập trình Python – KNTT

Luyện tập

Câu hỏi: Viết chương trình nhập số n, sau đó nhập danh sách tên học sinh với họ, đệm, tên. Sắp xếp tên học sinh trong lớp theo bảng chữ cái. Đưa kết quả ra màn hình.

Hướng dẫn giải:

#Hàm nhập danh sách học sinh
def Nhap_HS():
    n = int(input("Mời nhập số học sinh: "))
    A = []
    for i in range(n):
        ht = input("Nhập họ tên học sinh thứ "+str(i+1)+": ")
        A.append(ht)
    return A
#Hàm sắp xếp theo tên
def SX_HS(A):
    B = A.copy(); n = len(A)
    #Tách tên của học sinh
    T = []
    for i in range(n):
        T.append(B[i].split().pop())
    #Sắp xếp A dựa vào tên
    for i in range(1,n):
        j = i
        while j>0 and T[j]<T[j-1]:
            A[j],A[j-1] = A[j-1],A[j]
            j = j - 1
    return A
#Hàm xuất danh sách
def Xuat_HS(A):
    for i in range(len(A)):
        print(i+1,"\t",A[i])
#Chương trình chính
A = Nhap_HS()
B = SX_HS(A)
Xuat_HS(B)

Vận dụng

Câu 1. 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.
– Nhập thời gian theo khuôn dạng ngày – tháng – năm (ví dụ 8-10-2021), tính số ngày ứng với ngày này theo phần mềm bảng tính điện tử.

Câu 2. Mở rộng bài tập trong phần luyện tập 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.
Chú ý: 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ÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢPQRSTUÙÚỦŨỤƯ ỪỨỬỮỰVXYỲÝỶỸỴ.

Câu 3. 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 $\sqrt{n}$. 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 thì chỉ cần tìm trong các số 2, 3, …,$\sqrt{n}$. 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 giải:

Câu 1:
– Chương trình đổi số ngày sang ngày, tháng, năm:

#Hàm tính số ngày của tháng trong năm
def cmonth(m,y):
    if m==2:
        if y%400==0 or (y%4==0 and y%100!=0):
            return 29
        else:
            return 28
    elif str(m) in "135781012": return 31
    elif str(m) in "46911": return 30

#Hàm trả về ngày tháng năm tương ứng
def toDate(d,m,y,n):
    if n + d > cmonth(m,y):
        k = n + d - cmonth(m,y)
        while k>0:
            #Kiểm tra để tháng >= 1 và <=12
            if m<12: m = m + 1
            else: m = 1; y = y + 1
            k = k - cmonth(m,y)
        return k + cmonth(m,y), m, y
    else: return n+d+1, m, y

#Chương trình chính
n = int(input("Mời nhập số ngày: "))
d, m, y = toDate(0,1,1900,n-1)
print("Ngày tháng tương ứng",d,"-",m,"-",y)

– Chương trình đổi ngày, tháng, năm sang số ngày:

#Hàm kiểm tra năm nhuận
def lyear(y):
    if y%400==0 or (y%4==0 and y%100!=0): return True
    else: return False

#Hàm tính số ngày của năm bất kỳ
def cyear(y):
    if lyear(y): return 366
    else: return 365
#Hàm tính số ngày của tháng trong năm
def cmonth(m,y):
    if m==2:
        if lyear(y): return 29
        else: return 28
    elif str(m) in "135781012": return 31
    elif str(m) in "46911": return 30

#Hàm trả về ngày tháng năm tương ứng
def toCount(d,m,y):
    if y>=1900:
        for i in range(1900,y):
            d = d + cyear(i)
        if m>=1:
            for i in range(1,m):
                d = d + cmonth(i,y)
            if y== 1900 and m==1: return d
            else: return d + 1
        return d
    return 0
def testDate(d,m,y):
    if m==2:
        if lyear(y): return d<=29
        else: return d<=28
    elif str(m) in "135781012": return d<=31
    elif str(m) in "46911": return d<=30
#Chương trình chính
d, m, y = map(int,input("Mời nhập ngày-tháng-năm: ").split("-"))
if testDate(d,m,y):
    print("Số ngày tương ứng là",toCount(d,m,y))
else:
    print("Ngày không hợp lệ")

Câu 3:

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 phải 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])

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *