Giáo án Tin học 10 · Toàn bộ sách chính (đồ họa và Python)
Tin họcLớp 10Phần 5. Chủ đề 5. Giải quyết vấn đề với sự trợ giúp của máy tính

Giáo án Bài 30. Kiểm thử và gỡ lỗi chương trình

Kế hoạch bài dạy theo mẫu Công văn 5512/BGDĐT-GDTrH · 2 tiết (90 phút)

I. Mục tiêu

1. Kiến thức

  • Nêu được mục đích của kiểm thử (chọn đầu vào và kết quả mong đợi để phát hiện sai) và của gỡ lỗi (tìm và sửa nguyên nhân gây sai).
  • Giải thích được vì sao bộ thử cần gồm ca thường, ca biên và bằng nhau, ca số âm và ca không hợp lệ theo miền.
  • Vận dụng được cách gỡ lỗi bằng vết hoặc lệnh in tạm, sau đó bỏ phần chẩn đoán khỏi sản phẩm nộp.
  • Giải thích được vì sao khởi tạo m=0m=0 làm hàm lớn nhất sai với các ca số âm và thử lại ca đã lỗi cùng ca khác sau khi sửa.

2. Năng lực

a) Năng lực chung

  • Tự chủ và tự học: HS tự dự đoán kết quả, tự đối chiếu với kết quả chạy thực tế và tự sửa chương trình của mình.
  • Giao tiếp và hợp tác: HS làm việc cặp đôi, trình bày bảng kết quả kiểm thử và giải thích nguyên nhân lỗi cho bạn trong nhóm.
  • Giải quyết vấn đề và sáng tạo: HS phát hiện phản ví dụ, tìm nguyên nhân, đề xuất cách sửa tương đương và kiểm tra lại bằng bộ ca.

b) Năng lực đặc thù

  • Sử dụng và quản lí các phương tiện công nghệ thông tin và truyền thông: HS dùng môi trường Python (IDLE) để chạy chương trình, quan sát kết quả in ra và quản lí tệp mã nguồn.
  • Giải quyết vấn đề với sự hỗ trợ của công nghệ thông tin và truyền thông: HS dùng máy tính chạy bộ ca để phát hiện lỗi, dùng lệnh in tạm để theo dõi giá trị biến và xác định nguyên nhân.
  • Ứng dụng công nghệ thông tin và truyền thông trong học và tự học: HS dùng bài tập tương tác trên trang NeoEdu để luyện tập và tự kiểm tra kết quả.
  • Hợp tác trong môi trường số: HS chia sẻ bộ ca và kết quả chạy trong nhóm, đối chiếu chéo sản phẩm của nhóm khác.

3. Phẩm chất

  • Chăm chỉ: HS kiên trì thử lại chương trình nhiều lần đến khi đủ ba ca minh họa đều cho kết quả đúng.
  • Trách nhiệm: HS xoá các lệnh in tạm, chỉ nộp mã nguồn hoàn chỉnh, có chú thích ngắn về cách kiểm thử.
  • Trung thực: HS ghi đúng kết quả thực tế khi chạy, không ghi kết quả dự đoán thay cho kết quả máy in ra.

II. Thiết bị dạy học và học liệu

1. Giáo viên

  • Máy tính kết nối máy chiếu, cài Python 3 và IDLE hoặc môi trường tương đương.
  • Slide hoặc bảng phụ ghi hàm lỗi dùng trong hoạt động mở đầu và bộ ca mẫu.
  • Phiếu học tập số 1 và Phiếu học tập số 2 (in đủ cho các nhóm).
  • Học liệu số NeoEdu: bài giảng, ví dụ và bài tập tương tác tại neoedu.vn/learn/10/informatics/bai-30-kiem-thu-va-go-loi-chuong-trinh (dùng cho hoạt động luyện tập).

2. Học sinh

  • Máy tính có Python 3 và IDLE (hoặc môi trường tương đương) để chạy chương trình.
  • Vở ghi, bút, bút dạ và giấy khổ A3 hoặc khăn trải bàn để trình bày bảng kiểm thử của nhóm.
  • Thiết bị kết nối mạng để truy cập học liệu NeoEdu (nếu có).

III. Tiến trình dạy học

Hoạt động 1: Mở đầu · 8 phút

Hàm này đã đúng chưa?

a) Mục tiêu

Nêu được vấn đề: một hàm có thể cho đúng kết quả với vài ca nhưng vẫn sai với ca khác, nên cần kiểm thử.

b) Nội dung

GV trình chiếu hàm sau và yêu cầu HS dự đoán kết quả trước khi chạy:

  • def lon_nhat(a,b): m=0; if a>m: m=a; if b>m: m=b; return m
  • Câu hỏi 1: Với a=4a=4, b=4b=4 hàm trả về bao nhiêu?
  • Câu hỏi 2: Với a=9a=9, b=2b=2 hàm trả về bao nhiêu?
  • Câu hỏi 3: Với a=−5a=-5, b=−2b=-2 hàm trả về bao nhiêu? Đây có phải số lớn nhất không?

c) Sản phẩm

  • Dự đoán đúng: hai ca (4,4)(4,4) và (9,2)(9,2) cho 44 và 99.
  • Ca (−5,−2)(-5,-2) mong đợi kết quả −2-2, nhưng hàm trả về 00, nên kết quả sai.
  • Kết luận ban đầu: hàm đúng với số dương nhưng sai với số âm; cần thử nhiều loại ca khác nhau.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV chiếu hàm lỗi lên màn hình, đọc yêu cầu và cho HS 1 phút suy nghĩ để dự đoán kết quả của ba ca.

    Học sinh

    HS đọc hàm, ghi nhanh dự đoán ra nháp hoặc vở và chưa chạy máy.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV hướng dẫn HS nhập hàm vào IDLE, gọi lần lượt ba ca và yêu cầu ghi lại kết quả máy in ra.

    Học sinh

    HS chạy hàm với ba ca, so sánh kết quả máy in ra với dự đoán của mình.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 đến 3 HS nêu dự đoán và kết quả thực tế; hỏi thêm: “Vì sao ca (−5,−2)(-5,-2) cho kết quả 00?”

    Học sinh

    HS trả lời, dự kiến: “Em dự đoán −2-2 nhưng máy in 00, vì 00 không phải là một trong hai số nhập vào.” Hoặc: “Vì biến m được gán 00 từ đầu và −5-5, −2-2 đều nhỏ hơn 00 nên không được cập nhật.”

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV nhận xét và chốt: kiểm thử là chọn đầu vào và kết quả mong đợi để phát hiện sai; ca số âm đã làm lộ lỗi mà ca số dương không phát hiện được. GV nêu mục tiêu hai tiết học: thiết kế bộ ca, gỡ lỗi và sửa.

    Học sinh

    HS ghi tên bài “Kiểm thử và gỡ lỗi chương trình” và ghi nhận: một ca thử có thể không đủ để phát hiện lỗi.

Hoạt động 2.1: Hình thành kiến thức mới · 20 phút

Thiết kế bộ ca kiểm thử

a) Mục tiêu

Giải thích được vì sao bộ thử cần gồm ca thường, ca biên và bằng nhau, ca số âm và ca không hợp lệ theo miền; thiết kế được bộ ca và ghi kết quả mong đợi trước khi chạy.

b) Nội dung

HS làm việc theo nhóm 4 bằng kĩ thuật khăn trải bàn, điền vào Phiếu học tập số 1 (bộ ca cho hàm lon_nhat(a,b) tìm số lớn nhất của hai số).
Nhiệm vụ: với mỗi loại ca, chọn đầu vào, ghi kết quả mong đợi trước khi chạy, sau đó chạy và ghi kết quả thực tế.
Các loại ca cần có: ca thường, ca biên hoặc bằng nhau, ca số âm, ca không hợp lệ theo miền.
Câu hỏi GV đặt ra: “Vì sao phải ghi kết quả mong đợi trước khi chạy?” và “Ca nào phát hiện được lỗi khởi tạo m=0m=0?”

c) Sản phẩm

Bộ ca kiểm thử đầy đủ của nhóm, ví dụ:

  • Ca thường: a=9a=9, b=2b=2, mong đợi 99.
  • Ca bằng nhau: a=4a=4, b=4b=4, mong đợi 44.
  • Ca số âm: a=−8a=-8, b=−3b=-3, mong đợi −3-3.
  • Ca không hợp lệ theo miền: hàm chỉ nhận số, đầu vào aa là chuỗi “5”, b=3b=3; mong đợi chương trình báo lỗi rõ ràng, không in kết quả sai.
    Kết luận HS rút ra: bộ thử tốt phải có đủ các nhóm ca trên, và kết quả mong đợi phải được xác định trước khi chạy.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV chia lớp thành nhóm 4, phát Phiếu học tập số 1 và giới thiệu bốn loại ca: ca thường, ca bằng nhau hoặc biên, ca số âm, ca không hợp lệ theo miền. Yêu cầu mỗi nhóm điền một ô của khăn trải bàn.

    Học sinh

    HS nhận phiếu, đọc yêu cầu và thảo luận cách chọn đầu vào cho từng loại ca.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV đi quanh lớp, nhắc HS ghi kết quả mong đợi trước khi chạy và kiểm tra việc ghi kết quả thực tế.

    Học sinh

    HS nhập hàm vào IDLE, chạy từng ca, ghi kết quả thực tế vào phiếu và so với kết quả mong đợi. Dự kiến HS gặp lỗi khi nhập chuỗi “5” và hỏi GV; GV gợi ý: đây là lỗi báo ra, đúng với kết quả mong đợi của ca không hợp lệ.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV yêu cầu các nhóm đặt khăn trải bàn lên bàn, đi xem chéo và nêu một ca mà nhóm khác đã chọn tốt. Hỏi thêm: “Nếu chỉ thử ca (9,2)(9,2), có phát hiện được lỗi m=0m=0 không?”

    Học sinh

    HS trình bày, dự kiến: “Nhóm em chọn ca (−8,−3)(-8,-3) vì ca số âm dễ lộ lỗi khởi tạo bằng 00.” Trả lời câu hỏi: “Không, vì 99 lớn hơn 00 nên kết quả vẫn đúng.”

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: bộ thử cần có ca thường, ca biên và bằng nhau, ca số âm và ca không hợp lệ theo miền; kết quả mong đợi phải ghi trước khi chạy để so sánh khách quan.

    Học sinh

    HS ghi bốn loại ca và vai trò của từng loại vào vở.

Hoạt động 2.2: Hình thành kiến thức mới · 20 phút

Gỡ lỗi: tìm nguyên nhân, sửa và thử lại

a) Mục tiêu

Vận dụng được cách gỡ lỗi bằng vết hoặc lệnh in tạm; giải thích được nguyên nhân lỗi khởi tạo m=0m=0; sửa được chương trình và thử lại ca đã lỗi cùng ca khác.

b) Nội dung

HS làm việc theo cặp đôi, dùng Phiếu học tập số 2 để theo dõi vết của ca a=−5a=-5, b=−2b=-2 trong hàm lỗi ở phần mở đầu.
Các bước: (1) ghi giá trị của mm sau từng lệnh; (2) xác định lệnh nào gây sai; (3) sửa hàm; (4) thử lại ca (−5,−2)(-5,-2) và các ca khác (4,4)(4,4), (9,2)(9,2), (−8,−3)(-8,-3).
Có thể dùng lệnh in tạm, ví dụ print("m =", m), để xem giá trị biến. Sau khi tìm được lỗi, phải xoá lệnh in tạm khỏi sản phẩm nộp.
Bài tập vận dụng: đưa phản ví dụ cho hàm có m=0 và sửa lỗi (đặt m bằng a rồi xét b, hoặc dùng hai nhánh so sánh trực tiếp).

c) Sản phẩm

  • Vết ca (−5,−2)(-5,-2): m=0m=0; xét a>ma>m: −5>0-5>0 sai, không cập nhật; xét b>mb>m: −2>0-2>0 sai, không cập nhật; trả về 00.
  • Phản ví dụ: a=−5a=-5, b=−2b=-2, kết quả 00, mong đợi −2-2.
  • Nguyên nhân: khởi tạo m=0m=0 giả định dữ liệu dương, nên không phù hợp với số âm.
  • Sửa đổi (một cách tương đương đúng):
    def lon_nhat(a,b):
    m=a
    if b>m:
    m=b
    return m
  • Thử lại: (−5,−2)(-5,-2) cho −2-2; (4,4)(4,4) cho 44; (9,2)(9,2) cho 99. Sản phẩm sau khi xoá lệnh in tạm.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV phát Phiếu học tập số 2, nêu yêu cầu theo dõi vết ca (−5,−2)(-5,-2), tìm nguyên nhân và sửa; nhắc HS phải xoá lệnh in tạm sau khi xong.

    Học sinh

    HS nhận phiếu, cùng bạn đọc các bước và phân công: một bạn chạy máy, một bạn ghi vết.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV hướng dẫn HS thêm lệnh print("m =", m) vào các vị trí cần theo dõi, chạy để quan sát giá trị, sau đó sửa và chạy lại bộ ca.

    Học sinh

    HS ghi vết, xác định m=0m=0 là nguyên nhân, sửa thành m=a, chạy lại bốn ca. Dự kiến HS quên xoá print: GV nhắc kiểm tra mã trước khi nộp.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 cặp trình bày vết và cách sửa; hỏi: “Vì sao sau khi sửa phải thử lại cả ca (4,4)(4,4) và (9,2)(9,2)?”

    Học sinh

    HS trình bày, dự kiến: “Khi sửa, em có thể làm hỏng ca đã đúng trước đó, nên phải chạy lại cả ca cũ để kiểm tra.”

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: gỡ lỗi là tìm và sửa nguyên nhân; in tạm chỉ dùng để chẩn đoán; thử lại ca đã lỗi cùng ca khác để tránh sửa một lỗi tạo lỗi mới.

    Học sinh

    HS ghi nhận quy trình: ghi vết, xác định nguyên nhân, sửa, thử lại toàn bộ bộ ca, xoá phần chẩn đoán.

Hoạt động 3: Luyện tập · 15 phút

Trắc nghiệm nhanh: đọc kết quả và phân tích ca

a) Mục tiêu

Đọc đúng kết quả chương trình với các ca thường, bằng nhau và số âm; nhận biết giới hạn của kiểm thử và sắp xếp đúng quy trình giải quyết nhiệm vụ.

b) Nội dung

GV tổ chức trò chơi “Ai nhanh hơn” và chiếu lần lượt sáu câu (có thể làm trên bài tập tương tác NeoEdu). HS giơ thẻ A, B, C, D hoặc làm trên bảng con:

  1. Chương trình def f(a,b): return a if a>b else b, in ra f(3,8)?
  2. Cùng hàm trên, in ra f(4,4)?
  3. Cùng hàm trên, in ra f(-8,-3)?
  4. Kiểm thử có chứng minh mọi chương trình đúng với mọi đầu vào không? A. Không với một bộ ca hữu hạn thông thường; B. Có chỉ cần 1 ca; C. Có nếu không báo lỗi; D. Có nếu in nhiều.
  5. Ca toàn số âm có thể phát hiện lỗi khởi tạo m=0m=0 không? (Đúng/Sai)
  6. Sắp xếp các bước: (a) Chạy và ghi sai khác; (b) Sửa rồi chạy lại bộ ca; (c) Tạo ca và kết quả mong đợi; (d) Tìm nguyên nhân bằng vết.

c) Sản phẩm

  • Câu 1: 88.
  • Câu 2: 44 (hai số bằng nhau, kết quả đúng là 44).
  • Câu 3: −3-3.
  • Câu 4: A. Kiểm thử tìm sai; chứng minh đúng với mọi đầu vào cần lập luận thêm.
  • Câu 5: Đúng, vì không có phần tử nào cập nhật vượt quá 00.
  • Câu 6: (c) → (a) → (d) → (b).
    HS tự chấm và ghi số câu đúng vào vở.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV giới thiệu luật chơi: mỗi câu có 20 giây, HS trả lời cá nhân bằng thẻ hoặc bảng con; GV chiếu từng câu.

    Học sinh

    HS chuẩn bị bảng con hoặc thẻ A, B, C, D và sẵn sàng trả lời.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV chiếu câu hỏi, theo dõi thời gian và ghi nhanh số HS trả lời đúng; với câu 6, yêu cầu HS xếp bốn bước vào bảng con.

    Học sinh

    HS trả lời từng câu. Dự kiến: câu 1 đa số đúng; câu 2 có HS chọn 22 hoặc 33 cần nhắc: bằng nhau thì chọn nhánh nào cũng cho cùng giá trị.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 HS giải thích câu 2 và câu 5, hỏi thêm: “Vì sao câu 4 không chọn B?”

    Học sinh

    HS giải thích, dự kiến: “Câu 2 vì 44 bằng 44 nên chọn bb vẫn ra 44.” “Câu 5 đúng vì khi toàn số âm mà m=0m=0 thì không số nào cập nhật được mm.” “Câu 4 không chọn B vì một ca không đủ để chứng minh tổng quát.”

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt đáp án, nhấn mạnh: kiểm thử phát hiện sai nhưng không chứng minh được mọi đầu vào đều đúng; quy trình gồm tạo ca, chạy, tìm nguyên nhân, sửa và chạy lại.

    Học sinh

    HS đối chiếu đáp án, ghi lại các câu sai và lí do sai.

Hoạt động 4: Vận dụng · 27 phút

Viết hàm lớn nhất hai số và kiểm thử

a) Mục tiêu

Vận dụng được kiến thức kiểm thử và gỡ lỗi để tạo một sản phẩm hoàn chỉnh: viết hàm, thiết kế bộ ca, chạy, giải thích kết quả và kiểm tra điều kiện áp dụng.

b) Nội dung

HS làm việc cá nhân rồi kiểm tra chéo trong nhóm đôi.
Nhiệm vụ: viết hàm lon_nhat(a,b) tìm số lớn nhất của hai số, không giả định dữ liệu dương. Viết chương trình hoàn chỉnh gọi ba ca:

  • print(lon_nhat(-5,-2))
  • print(lon_nhat(4,4))
  • print(lon_nhat(9,2))
    Kết quả lần lượt là −2-2, 44, 99. Sau đó trả lời: hàm có áp dụng được với số âm và số bằng nhau không? Vì sao? Ba ca này chỉ là ca minh họa cụ thể, không đủ để chứng minh mọi đầu vào đều đúng.
    Nếu HS dùng in tạm để kiểm tra thì phải xoá trước khi nộp.

c) Sản phẩm

  • Mã nguồn hoàn chỉnh, ví dụ:
    def lon_nhat(a,b):
    if a>b:
    return a
    return b
    print(lon_nhat(-5,-2))
    print(lon_nhat(4,4))
    print(lon_nhat(9,2))
  • Kết quả chạy: −2-2, 44, 99.
  • Giải thích: hàm so trực tiếp nên không dựa vào giả định dữ liệu dương; không khởi tạo kết quả bằng 00.
  • Thang chấm GV dùng: hàm đúng 0,40{,}4; đủ ba nhóm ca và đáp án 0,40{,}4; giải thích không khởi tạo bằng 00 là 0,20{,}2. Chấp nhận phương án tương đương đúng có lí giải; người dạy chấm mã và lập luận, không so khớp từng kí tự.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV chiếu yêu cầu của nhiệm vụ, nhắc HS: viết hàm, gọi ba ca, ghi kết quả, giải thích và xoá in tạm trước khi nộp.

    Học sinh

    HS đọc yêu cầu, ghi nhớ tiêu chí chấm trong slide.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV đi quanh lớp, hỗ trợ HS gặp lỗi cú pháp; khuyến khích HS tự thử thêm một ca số âm khác để kiểm tra.

    Học sinh

    HS viết hàm, chạy, ghi kết quả và giải thích trong vở. Dự kiến HS viết lại hàm với m=0m=0: GV gợi ý HS thử ca (−5,−2)(-5,-2) để tự phát hiện.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 nhóm đôi trình bày mã và kết quả; yêu cầu bạn nhận xét về cách kiểm thử.

    Học sinh

    HS trình bày, dự kiến: “Hàm so trực tiếp nên không cần khởi tạo bằng 00; em thử ba ca gồm số âm, số bằng nhau và số dương.”

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV nhận xét sản phẩm theo thang chấm và chốt: kiểm thử chọn đầu vào và kết quả mong đợi để phát hiện sai; gỡ lỗi tìm và sửa nguyên nhân; sau mỗi lần sửa phải thử lại bộ ca.

    Học sinh

    HS tự đánh giá sản phẩm theo thang chấm và ghi một điều cần sửa thêm vào vở.

Phiếu học tập

Phiếu học tập số 1

Thiết kế bộ ca kiểm thử cho hàm lon_nhat(a,b) tìm số lớn nhất của hai số.
Điền bảng theo danh sách sau:

  • Loại ca: ca thường | Đầu vào: a = ?, b = ? | Kết quả mong đợi: ? | Kết quả thực tế: ?
  • Loại ca: ca bằng nhau hoặc biên | Đầu vào: a = ?, b = ? | Kết quả mong đợi: ? | Kết quả thực tế: ?
  • Loại ca: ca số âm | Đầu vào: a = ?, b = ? | Kết quả mong đợi: ? | Kết quả thực tế: ?
  • Loại ca: ca không hợp lệ theo miền | Đầu vào: ? | Kết quả mong đợi: ? | Kết quả thực tế: ?
    Câu hỏi:
  1. Vì sao phải ghi kết quả mong đợi trước khi chạy?
  2. Nếu chỉ dùng ca (9,2)(9,2), có phát hiện được lỗi khởi tạo m=0m=0 không? Vì sao?

Phiếu học tập số 2

Theo dõi vết của hàm lỗi với ca a=−5a=-5, b=−2b=-2.
Hàm lỗi:

  • m = 0
  • nếu a > m thì m = a
  • nếu b > m thì m = b
  • trả về m
    Ghi giá trị sau từng bước:
  • Sau lệnh m = 0: m = ?
  • Xét a > m: ? > ? là đúng hay sai? m sau bước này = ?
  • Xét b > m: ? > ? là đúng hay sai? m sau bước này = ?
  • Kết quả trả về: ? ; kết quả mong đợi: ?
    Trả lời:
  1. Lệnh nào gây sai? Nguyên nhân là gì?
  2. Viết lại phần khởi tạo để sửa lỗi.
  3. Thử lại các ca (−5,−2)(-5,-2), (4,4)(4,4), (9,2)(9,2) và ghi kết quả. Sau khi xong, đã xoá lệnh in tạm chưa?

Hướng dẫn về nhà

  • Hoàn thiện hàm lon_nhat(a,b) trong hoạt động vận dụng: thêm ít nhất hai ca mới (một ca số bằng nhau và một ca số dương lớn) và ghi kết quả mong đợi trước khi chạy.
  • Kiểm tra lại mã nguồn, xoá mọi lệnh in tạm chẩn đoán trước khi nộp; ghi chú ngắn trong mã về ba ca đã kiểm thử.
  • Đọc lại mục Ghi nhớ của bài 30 và trả lời: vì sao ca số âm và ca bằng nhau có vai trò khác nhau trong bộ thử? Có thể luyện thêm trên trang NeoEdu của bài học.

Giáo án do NeoEdu soạn với sự hỗ trợ của AI, dựa trên nội dung bài học trên Học liệu. Thầy cô nên đọc lại và điều chỉnh cho phù hợp với học sinh của mình; bản Word để sửa trực tiếp.