Giải Tin Học 10 trang 156

Lời giải chi tiết SGK Lớp 10 · Môn Tin Học · Trang 156–157

Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 156 – 157)

Lưu ý: Hai ảnh em gửi thực chất là trang 155 (kết thúc Bài 32, phần Luyện tập và Vận dụng) và trang 156 (mở đầu Bài 33 – Nghề thiết kế đồ hoạ máy tính). Thầy sẽ giải đầy đủ tất cả câu hỏi xuất hiện trong hai trang này.


🔍 Kiến thức cần nhớ

Một số kỹ thuật Python dùng trong bài:

  • Hàm input() đọc chuỗi từ bàn phím, split("-") tách chuỗi theo dấu -.
  • int() chuyển chuỗi sang số nguyên.
  • Phép chia lấy dư % dùng để kiểm tra chia hết.
  • Sắp xếp danh sách: phương thức list.sort() hoặc hàm sorted().
  • Năm nhuận: chia hết cho 400, hoặc (chia hết cho 4 và không chia hết cho 100).
💡 Mẹo nhớ: Năm nhuận = year%400==0 or (year%4==0 and year%100!=0)

⚙️ Bài tập

PHẦN LUYỆN TẬP (trang 155)

Câu Luyện tập

Đề bà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.

Cách 1 — Dùng vòng lặp nhập rồi sort()
n = int(input("Nhập số học sinh n: "))
ds = []
for i in range(n):
    ten = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    ds.append(ten)

ds.sort()   # sắp xếp theo bảng chữ cái (mã Unicode)

print("Danh sách sau khi sắp xếp:")
for ten in ds:
    print(ten)

Phân tích: ds.sort() sắp xếp tại chỗ theo thứ tự từ điển (so sánh ký tự đầu, nếu bằng thì so ký tự tiếp theo). Với danh sách họ tên đầy đủ thì việc so sánh bắt đầu từ họ.

Cách 2 — Dùng hàm sorted() (không thay đổi danh sách gốc)
n = int(input("Nhập số học sinh n: "))
ds = [input("Tên học sinh " + str(i+1) + ": ") for i in range(n)]

for ten in sorted(ds):
    print(ten)

Cách 2 ngắn gọn nhờ list comprehension, sorted() trả về danh sách mới đã sắp xếp.

⚠️ Lưu ý thi: sort() sửa trực tiếp danh sách (trả về None), còn sorted() tạo danh sách mới. Đừng viết ds = ds.sort() vì sẽ làm ds thành None.

PHẦN VẬN DỤNG (trang 155)

Câu 1

Đề bài: 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.
Cách 1 — Dùng hàm tự xây dựng

Ý tưởng: viết hàm kiểm tra năm nhuận và hàm tính số ngày của một tháng. Sau đó cộng dồn từ mốc 1-1-1990.

thang = [31,28,31,30,31,30,31,31,30,31,30,31]

def nhuan(year):
    return year%400 == 0 or (year%4 == 0 and year%100 != 0)

def so_ngay_thang(month, year):
    if month == 2 and nhuan(year):
        return 29
    return thang[month-1]

# --- Yêu cầu 1: từ số n -> ngày/tháng/năm ---
n = int(input("Nhập số ngày n (tính từ 1-1-1990): "))
day, month, year = 1, 1, 1990
# n = 0 ứng với ngày 1-1-1990, nên cộng dồn n ngày
for i in range(n):
    day += 1
    if day > so_ngay_thang(month, year):
        day = 1
        month += 1
        if month > 12:
            month = 1
            year += 1
print("Số", n, "ứng với ngày", day, "-", month, "-", year)

# --- Yêu cầu 2: từ ngày/tháng/năm -> số ngày ---
s = input("Nhập thời gian dạng ngày-tháng-năm: ")
tg = s.split("-")
d, m, y = int(tg[0]), int(tg[1]), int(tg[2])

dem = 0
# đếm số ngày của các năm đầy đủ từ 1990 đến y-1
for nam in range(1990, y):
    dem += 366 if nhuan(nam) else 365
# đếm số ngày của các tháng đầy đủ trong năm y
for thg in range(1, m):
    dem += so_ngay_thang(thg, y)
# cộng phần ngày, trừ đi 1 vì mốc 1-1-1990 = 0
dem += d - 1
print("Ngày", d, "-", m, "-", y, "ứng với số", dem)
Cách 2 — Dùng module datetime (nhanh, chính xác)
from datetime import date

moc = date(1990, 1, 1)

# Yêu cầu 1
n = int(input("Nhập số ngày n: "))
from datetime import timedelta
kq = moc + timedelta(days=n)
print("Ứng với ngày", kq.day, "-", kq.month, "-", kq.year)

# Yêu cầu 2
tg = input("Nhập ngày-tháng-năm: ").split("-")
d, m, y = int(tg[0]), int(tg[1]), int(tg[2])
ngay = date(y, m, d)
print("Số ngày:", (ngay - moc).days)
💡 Mẹo nhớ: Module datetime có sẵn xử lý năm nhuận và số ngày từng tháng nên không cần tự tính – rất tiện khi làm bài thực tế.
⚠️ Lưu ý thi: Chú ý quy ước "1-1-1990 ứng với số 0". Nếu đề quy ước bằng 1 thì phải cộng/trừ thêm 1 cho khớp.

Câu 2

Đề bài: Mở rộng bài tập trong phần luyện tập:

  • 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 (bao gồm cả dấu thanh, theo thứ tự đã cho trong sách).
Cách 1 — Tách tên, dùng khoá sắp xếp theo bảng chữ cái tiếng Việt

Ý tưởng:

  1. Tách mỗi họ tên thành: tên (từ cuối), họ (từ đầu), đệm (phần giữa).
  2. Vì thứ tự chữ cái tiếng Việt khác mã Unicode mặc định, ta xây một bảng thứ tự (chuỗi BANG) rồi tạo hàm chuyển mỗi chuỗi thành "khoá so sánh" gồm vị trí của từng ký tự trong bảng.
  3. Sắp xếp theo khoá: (tên, họ, đệm).
BANG = ("AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬBCDĐEÈÉẺẼẸÊỀẾỂỄỆ"
        "GHIÌÍỈĨỊJKLMNOÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢPQRST"
        "UÙÚỦŨỤƯỪỨỬỮỰVXYỲÝỶỸỴ")

def khoa_chu(s):
    # đổi chuỗi thành danh sách vị trí của từng ký tự trong BANG
    s = s.upper()
    kq = []
    for c in s:
        if c in BANG:
            kq.append(BANG.index(c))
        else:
            kq.append(-1)   # ký tự khác (vd dấu cách) xếp trước
    return kq

def tach(hoten):
    phan = hoten.split()
    ten = phan[-1]
    ho = phan[0] if len(phan) > 1 else ""
    dem = " ".join(phan[1:-1]) if len(phan) > 2 else ""
    return ten, ho, dem

def khoa_sapxep(hoten):
    ten, ho, dem = tach(hoten)
    return (khoa_chu(ten), khoa_chu(ho), khoa_chu(dem))

n = int(input("Nhập số học sinh n: "))
ds = [input("Họ tên " + str(i+1) + ": ") for i in range(n)]

ds.sort(key=khoa_sapxep)

print("Danh sách đã sắp xếp:")
for ten in ds:
    print(ten)

Giải thích khoá: sort(key=...) so sánh các tuple. Python so sánh tuple theo từng phần tử: trước tiên so khoá của TÊN, nếu bằng mới so khoá của HỌ, rồi đến ĐỆM – đúng yêu cầu ưu tiên.

Cách 2 — Dùng locale tiếng Việt (gọn nhưng phụ thuộc hệ thống)
import locale
locale.setlocale(locale.LC_COLLATE, "vi_VN.UTF-8")

n = int(input("n = "))
ds = [input("Họ tên: ") for i in range(n)]

def lay_ten(ht):
    return ht.split()[-1]

# sắp xếp theo tên, dùng so sánh locale tiếng Việt
ds.sort(key=lambda ht: locale.strxfrm(lay_ten(ht)))

for ht in ds:
    print(ht)

Cách 2 ngắn hơn nhưng cần hệ điều hành cài sẵn locale vi_VN; nếu không có thì nên dùng Cách 1.

⚠️ Lưu ý thi: Khi sắp theo tên trước, phải tách lấy "từ cuối cùng" làm tên. Nếu chỉ sort() thông thường thì sắp theo họ, sai yêu cầu.

Câu 3

Đề bài: 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 √n. Viết chương trình tối ưu hoá nhiệm vụ 1, bài 31: để tìm ước số nhỏ nhất chỉ cần tìm trong các số 2, 3, …, √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ố.

Cách 1 — Lặp tới căn bậc hai của n

Cơ sở: nếu n = a × b với a ≤ b thì a ≤ √n. Vậy chỉ cần dò ước từ 2 đến √n. Nếu không có ước nào trong khoảng đó thì n nguyên tố.

n = int(input("Nhập số nguyên dương n: "))

if n < 2:
    print(n, "không phải số nguyên tố")
else:
    nguyento = True
    i = 2
    while i * i <= n:          # i*i <= n tương đương i <= √n
        if n % i == 0:
            nguyento = False
            break
        i += 1
    if nguyento:
        print(n, "là số nguyên tố")
    else:
        print(n, "là hợp số (ước nhỏ nhất:", i, ")")

Ưu điểm: dùng ii <= n thay cho i <= n*0.5 để tránh sai số số thực, lại nhanh.

Cách 2 — Dùng vòng for tới int(√n)
import math

n = int(input("n = "))
nguyento = n >= 2
for i in range(2, int(math.sqrt(n)) + 1):
    if n % i == 0:
        nguyento = False
        break

print(n, "là số nguyên tố" if nguyento else "không phải số nguyên tố")

Phân tích độ phức tạp: cách cũ kiểm tra tới n−1 mất O(n) phép chia; cách tối ưu này chỉ mất O(√n) phép chia, nhanh hơn rất nhiều khi n lớn.

💡 Mẹo nhớ: Kiểm tra nguyên tố chỉ cần dò ước từ 2 đến √n. Đây là dạng "kinh điển" hay ra thi.
⚠️ Lưu ý thi: Đừng quên xét riêng trường hợp n < 2 (0 và 1 không phải số nguyên tố). Nên dùng điều kiện i*i <= n để không bị sai số dấu phẩy động.

BÀI 33 – NGHỀ THIẾT KẾ ĐỒ HOẠ MÁY TÍNH (trang 156)

Câu mở đầu (Hình 33.1)

Đề bài: Trong các công việc sau, theo em công việc nào có liên quan trực tiếp đến nghề thiết kế đồ hoạ? (Thợ may, Phát thanh viên, Kiến trúc sư, Thư kí)

Trả lời:

Công việc liên quan trực tiếp đến nghề thiết kế đồ hoạ là Kiến trúc sư.

Lí do: Kiến trúc sư thường xuyên sử dụng các phần mềm đồ hoạ máy tính (vẽ bản vẽ kỹ thuật, dựng phối cảnh 2D/3D, chỉnh sửa hình ảnh, bố cục màu sắc) để thể hiện ý tưởng thiết kế công trình – đây chính là việc dàn dựng bố cục, sắp xếp, chỉnh sửa hình ảnh và lựa chọn màu sắc, đúng với bản chất của thiết kế đồ hoạ.

Các nghề còn lại liên quan ít hoặc gián tiếp:

  • Thợ may: thiên về kỹ năng may đo thủ công (dù có thể dùng phần mềm thiết kế thời trang).
  • Phát thanh viên: làm việc với giọng nói, truyền đạt thông tin bằng lời.
  • Thư kí: công việc hành chính, văn phòng.

Hoạt động 1 — Thiết kế đồ hoạ là gì?

Đề bài: Em hiểu thế nào là thiết kế đồ hoạ? Em đã bao giờ vẽ tranh hay làm phim chưa? Em tạo ra các sản phẩm đó bằng cách nào?

Trả lời gợi ý:

  • Thiết kế đồ hoạ là việc dàn dựng bố cục, sắp xếp, chỉnh sửa hình ảnh và lựa chọn màu sắc để sáng tạo nên các thông điệp truyền thông hấp dẫn, nhằm truyền đạt thông tin hiệu quả phục vụ mục đích tuyên truyền hoặc kinh doanh.
  • Sản phẩm thiết kế đồ hoạ rất đa dạng: tấm thiệp, tờ rơi, logo, biển hiệu, áp phích, tài liệu quảng cáo, bìa sách/tạp chí, trang web,…
  • Em có thể đã từng vẽ tranh (trên giấy hoặc bằng phần mềm như Paint, Photoshop, GIMP, Canva) hoặc làm phim/video ngắn (bằng điện thoại, phần mềm dựng video). Cách tạo: chọn hình ảnh/đối tượng, vẽ – cắt – ghép – sắp xếp các thành phần (văn bản, đường nét, hình cơ bản, ảnh chụp, màu sắc) để tạo thành sản phẩm hoàn chỉnh.
🔍 Khái niệm chính (trang 156): Thiết kế đồ hoạ là việc dàn dựng bố cục, sắp xếp, chỉnh sửa hình ảnh, lựa chọn màu sắc để tạo các thông điệp truyền thông hấp dẫn. Hình ảnh đồ hoạ gồm nhiều thành phần: văn bản, đường nét, hình cơ bản/hình vẽ, ảnh chụp, màu sắc. Nhiệm vụ của người thiết kế là lựa chọn, vẽ, cắt, ghép, sắp xếp các thành phần đó thành sản phẩm hoàn chỉnh.

🎯 Ghi nhớ: - Sắp xếp danh sách dùng sort()/sorted(); sắp theo tiếng Việt cần xây bảng thứ tự chữ cái và dùng tham số key. - Đổi qua lại giữa "số ngày" và "ngày-tháng-năm" nên tận dụng module datetime. - Kiểm tra số nguyên tố tối ưu: chỉ dò ước từ 2 đến √n (dùng điều kiện i*i <= n), giảm độ phức tạp từ O(n) xuống O(√n). - Thiết kế đồ hoạ = dàn dựng bố cục + sắp xếp + chỉnh sửa hình ảnh + chọn màu sắc để truyền thông hiệu quả.
Chế độ đọc sách →