Bài 13-14: Thực hành thiết kế lập trình theo mô đun và thư viện các hàm tự định nghĩa

Chủ đề Fcs – Bài 13-14: Thực hành thiết kế lập trình theo mô đun và thư viện các hàm tự định nghĩa – sbt trang 62 lớp 11 Khoa học máy tính – Cánh Diều, Bumbii.

Chủ đề Fcs – Bài 13-14: Thực hành thiết kế và lập trình theo mô đun. Thực hành về thư viện các hàm tự định nghĩa

Câu FCS42 (DA2)

Đề bài: Lưu trữ dữ liệu cổ vật

Viện Sử học vừa khai quật một di tích lịch sử và thu về n cổ vật hữu cơ. Để xác định tuổi của n cổ vật này, chúng ta sử dụng phương pháp định tuổi bằng đồng vị phóng xạ Carbon-14.

Viện đã hoàn thành việc tính toán số liệu và tổ chức triển lãm cũng như công bố những nghiên cứu mới về n cổ vật. Tuy nhiên, để thúc đẩy niềm yêu thích sử học nói chung và khảo cổ học nói riêng, cũng như cho học sinh một cái nhìn khác về nghiên cứu lịch sử, Viện đã mời các bạn học sinh tham quan triển làm, đồng thời hướng dẫn các bạn cách định tuổi các cổ vật nêu trên.

Để dễ dàng tính toàn, các bạn đã được cho biết trước:

– Chu kì bản rã của đồng vị 14C6 là 5730 năm, tức sau 5730 năm thì số lượng nguyên tử 14C6 sẽ giảm đi một nửa.

– Lượng Carbon trong cơ thể của bất kì sinh vật nào khi còn sống đều bằng nhau và bằng 1 nguyên tử/g

Sau đó, Viện đã cho các bạn sử dụng thiết bị để đo thể tích cũng như đếm số lượng nguyên tử C của toàn bộ n cổ vật. Bây giờ, bạn sẽ tiến hành xác định niên đại của các đồ vật.

Dữ liệu đầu vào: 

Nhập từ tệp covat.inp.

– Dòng đầu tiên chứa hai số: số nguyên dương n và số thực x.

− n dòng tiếp theo tương ứng với n cổ vật, dòng thứ i gồm hai số thực vị và m lần lượt chứa khối lượng (đơn vị tính: g) và số lượng nguyên tử C mà bạn đo được tại thời điểm hiện tại của cổ vật thứ 1.

Dữ liệu đầu ra:

KQ1 – Kết luận sơ bộ:

In ra tệp sobo.txt gồm n dòng là danh sách các cổ vật theo tuổi tăng dần. Dòng thứ i in ra:

– Số thứ nhất là chỉ số của cổ vật có niên đại nhỏ thứ i.

– Số thứ hai là tuổi của cổ vật đó, làm tròn xuống năm gần nhất (ví dụ, 19.7 năm làm tròn thành 19 năm),

KQ2 – Kiểm tra độ tin cậy của cổ vật:

Biết rằng, phương pháp định tuổi bằng đồng vị phóng xạ 14C6 chỉ cho ra kết quả tin cậy đối với các cổ vật không quá 50 000 tuổi, với các kết quả trên 50 000 tuổi phải dùng các đồng vị khác, hoặc phương pháp khác.

Em hãy in ra tệp tincay.txt gồm n dòng, dòng thứ i in ra “tin cay” nếu như kết quả của cổ vật thứ i là đáng tin cậy, hoặc nếu không thì in ra “khong tin cay”.

Câu trả lời

1. Liệt kê các việc lớn

– Nhập vào danh sách các cổ vật và tham chiếu x.

– Lập công thức tính tuổi của từng cổ vật.

– Sắp xếp các cổ vật theo thứ tự tăng dần về tuổi để trả lời KQ1.

– Từ tuổi của mỗi cổ vật ta xác định độ tin cậy để trả lời KQ2.

2. Thiết kế các hàm
a. Nhập vào từ tệp

Có thể viết hàm nhapTuTep() để đọc dữ liệu đầu vào từ tệp covat.txt. Hàm trả về hai số n và x; cũng như hai danh sách v và m – khối lượng và số nguyên tử 14C6 của cổ vật, với v[i] và m[i] là số liệu của cổ vật thứ i.

def nhaptutep():
    with open("covat.txt", "r") as fin:
        n, x = map(float, fin.readline().split())
        n = int(n)
        v = []; m = []
        for i in range(n):
            vi, mi = map(float, fin.readline().split())
            v.append(vi); m.append(mi)
        fin.close()
    return n, x, v, m
b. Lập công thức tính tuổi của cổ vật

Ta viết hàm tinhtuoi(x, v, m),với x là mật độ nguyên tử 14C6 trong một cơ thể sống, v và m lần lượt là khối lượng và số nguyên tử 14C6 đo được của một cổ vật. Hàm sẽ trả về tuổi của cổ vật đó.

Ta thấy, mT trong trường hợp này chính là tham số m của hàm, còn m0 sẽ được tính bằng tích mật độ x nhân với khối lượng v. Từ đấy ta xác định tuổi của cổ vật rồi trả về kết quả.

def tinhtuoi(x, v, m):
    cu = x * v; moi = m
    return math.log2(cu/moi) #sử dụng thư viện math    
c. Sắp xếp danh sách các cổ vật các theo thứ tự niên đại

Ta viết hàm sapxep(n, v, m), với n là số lượng cổ vật và v, m là hai mảng chứa thông tin về khối lượng và số nguyên tử 14C6 đo được của các cổ vật. Ta khai báo một mảng ds hai chiều gồm 2 cột – chỉ số trong mảng gốc và tuổi của cổ vật. Để tính tuổi, ta dùng hàm tinhtuoi.

Sau đó, ta sắp xếp ds theo cột thứ hai – niên đại. Nếu dùng phương thức sort của list, có thể dùng cú pháp:

ds.sort(key = lambda covat: covat[1])

Cuối cùng, ta trả về mảng ds để sau đó in ra câu trả lời của KQ1.

def sapxep(n, x, v, m):
    ds = []
    for i in range(n):
        tuoi = tinhtuoi(x, v[i], m[i])
        ds.append([i, tuoi])
    ds.sort(key=lambda covat: covat[1])
    return ds
d. Kiểm tra độ tin cậy

Để không phải tính lại niên đại của cổ vật, ta sử dụng luôn mảng ds thu về từ hàm sapxep.

Vì vậy, ta có thể viết hàm danhsachtincay(ds) và trả về một mảng tincay gồm n phần tử kiểu boolean với True có nghĩa là tin cậy và False là không tin cậy.

Với mỗi cổ vật trong danh sách, ta có hai thông tin: chỉ số i của cổ vật nằm ở cột thứ nhất và tuổi niendai nằm ở cột thứ hai. Ta xem niendai có giá trị không dưới 50 000 năm hay không, nếu thoả mãn thì ta gán tincay[i] bằng True, ngược lại sẽ bằng False.

Cuối cùng, ta trả về mảng tincay để sau đó in ra câu trả lời của KQ2.

def danhsachtincay(n, ds):
    tincay = [False] * n
    for covat in ds:
        i = covat[0]; niendai = covat[1]
        if niendai <= 50000:
            tincay[i] = True
    return tincay

Tổng kết lại, ta có đoạn code như sau:

import math

def nhaptutep():
    with open("covat.txt", "r") as fin:
        n, x = map(float, fin.readline().split())
        n = int(n)
        v = []; m = []
        for i in range(n):
            vi, mi = map(float, fin.readline().split())
            v.append(vi); m.append(mi)
        fin.close()
    return n, x, v, m

def tinhtuoi(x, v, m):
    cu = x * v; moi = m
    return math.log2(cu/moi)   
    
def sapxep(n, x, v, m):
    ds = []
    for i in range(n):
        tuoi = tinhtuoi(x, v[i], m[i])
        ds.append([i, tuoi])
    ds.sort(key=lambda covat: covat[1])
    return ds

def inDSsobo(ds):
    with open("sobo.txt", "w") as fout:
        for covat in ds:
            i = covat[0]; niendai = covat[1]
            fout.write(str(i) + " " + str(niendai) + " \n")
        fout.close()
    return ds

def danhsachtincay(n, ds):
    tincay = [False] * n
    for covat in ds:
        i = covat[0]; niendai = covat[1]
        if niendai <= 50000:
            tincay[i] = True
    return tincay

def inDStincay(n, tincay):
    with open("tincay.txt", "w") as fout:
        for i in range(n):
            if tincay[i] == True:
                fout.write("tin cay\n")
            else:
                fout.write("khong tin cay\n")

n, x, v, m = nhaptutep()
ds = sapxep(n, x, v, m)
inDSsobo(ds)
tincay = danhsachtincay(n, ds)
inDStincay(n, tincay)

Xem các bài giải khác: Giải Bài Tập SBT Lớp 11 Khoa Học Máy Tính Cánh Diều

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