Giai đoạn 1 · Đặt móng · 8 buổi

Đo một căn phòng. Viết ra báo giá.

Python không bắt đầu từ bài toán xa lạ. Trong tháng đầu, bạn biến chiều dài, chiều rộng, đơn giá và danh sách vật tư thành những tool ngắn dùng được ngay trên công trường.

Cảnh đo chiều dài và chiều rộng một phòng đang cải tạo bằng thước laser, có sơ đồ hình chữ nhật và công thức diện tích

Mục tiêu của tháng 1

Từ thao tác máy tính đến tool báo giá

Code < 15 dòng
8

buổi học, mỗi buổi 1 giờ. Bạn sẽ quen thao tác máy tính, gõ code cơ bản và làm tool tính toán báo giá thay vì học cú pháp rời rạc.

Tư duy xuyên suốt: biến là thùng chứa, if/else là kiểm tra, list là vật tư trên clipboard, còn function là một tổ đội chuyên biệt nhận việc và trả kết quả.

Sản phẩm đích

Tool Báo Giá Lát Sàn

Nhập chiều dài và chiều rộng → tính Sqft → nhân đơn giá USD → xuất báo giá.

01Đo phòng
02Tính diện tích
03Xuất giá
Tuần 1Vật liệu & Đo đạcB1–B2
Tuần 2Tiêu chuẩn & Giám sátB3–B4
Tuần 3Danh sách & Thi côngB5–B6
Tuần 4Tổ đội Chuyên biệtB7–B8

Bản vẽ thi công

Tám buổi, một mạch công việc

Mỗi bài mới giải quyết một phần của quy trình. Đến B8, phần nhập liệu, kiểm tra, danh sách và hàm đã được đóng gói thành Cỗ Máy Báo Giá Tự Động.

Tuần 1 · Vật liệu & Đo đạc

Đặt nền bằng số đo thật

B1 → B2
BUỔI 1 · B1Biến & Phép gán

Môi trường & Biến số công trường

Biến giống chiếc thùng chứa dán nhãn ngoài công trường. Lệnh width = 15 nghĩa là cất giá trị 15 vào thùng width. Giám sát không cần nhớ lý thuyết phức tạp, chỉ cần quản lý đúng tên thùng và số liệu bên trong.

Điểm bàn giaoFile Python đầu tiên lưu trữ kích thước phòng và đơn giá thầu.
📋 Giáo án Giảng viên & Thực hành B1 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Thước dây & Sổ tay ⏱️ 25' Live Code: Cài VS Code & Tạo biến ⏱️ 20' Thực hành: Tính sàn phòng khách ⏱️ 5' Nghiệm thu & Debug lỗi

Mục tiêu: Học viên mở được VS Code, tạo file b1_kich_thuoc.py, khai báo biến dài/rộng/đơn giá, tính diện tích và in ra màn hình Terminal bằng lệnh print().

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Lỗi dấu thập phân: Học viên thường quen gõ 3,5 thay vì 3.5 gây lỗi cú pháp (SyntaxError). Giảng viên nhắc: "Trong Python dùng dấu chấm cho số lẻ".
  • Quy tắc đặt tên biến: Giải thích biến như nhãn dán trên bao bì vật tư: viết thường, nối từ bằng gạch dưới (chieu_dai, don_gia_usd), không có dấu tiếng Việt, không bắt đầu bằng số.

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Một phòng ngủ kích thước chiều dài length = 18 ft, chiều rộng width = 12 ft. Đơn giá nhân công lát sàn là price = 4.5 USD/sqft. Viết mã tính: diện tích sàn (Sqft) và tổng chi phí nhân công (USD). In kết quả rõ ràng.
Bài 2 (Thực chiến nâng cao): Thêm hệ số hao hụt gạch ván sàn là 10% (nhân 1.10 vào diện tích). In ra: diện tích thực, diện tích cần mua vật tư (kèm hao hụt) và tổng tiền vật tư dự toán.
Python 3 · Source Code mẫu chuẩn B1b1_kich_thuoc.py
# BUỔI 1: KHAI BÁO BIẾN & TÍNH TOÁN CƠ BẢN
# Bước 1: Khai báo số đo thực tế (đơn vị: feet & USD)
chieu_dai = 18.0          # Chiều dài phòng (ft)
chieu_rong = 12.0         # Chiều rộng phòng (ft)
don_gia_usd = 4.5         # Đơn giá thầu / sqft

# Bước 2: Xử lý tính toán
dien_tich_sqft = chieu_dai * chieu_rong
tong_tien_usd = dien_tich_sqft * don_gia_usd

# Bước 3: Xuất kết quả nghiệm thu ra màn hình
print("=== BÁO CÁO ĐO ĐẠC PHÒNG NGỦ ===")
print("Diện tích sàn:", dien_tich_sqft, "sqft")
print("Đơn giá thi công:", don_gia_usd, "USD/sqft")
print("Tổng chi phí dự toán:", tong_tien_usd, "USD")
# Output kỳ vọng: === BÁO CÁO ĐO ĐẠC PHÒNG NGỦ === Diện tích sàn: 216.0 sqft Đơn giá thi công: 4.5 USD/sqft Tổng chi phí dự toán: 972.0 USD
BUỔI 2 · B2Nhập liệu & Ép kiểu

Nhập số đo từ bàn phím (input & float)

Tại công trường, số đo mỗi phòng mỗi khác. Lệnh input() cho phép nhập số đo từ bàn phím nhưng luôn trả về chuỗi chữ (str). Muốn tính toán phải ép kiểu sang số thực float().

Sản phẩmTool Báo Giá Lát Sàn v1 chạy tương tác từ Terminal.
📋 Giáo án Giảng viên & Thực hành B2 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Bút ghi sổ → Bàn phím ⏱️ 25' Live Code: input(), ép kiểu float() & f-string ⏱️ 20' Thực hành: Xây dựng tool báo giá động ⏱️ 5' Nghiệm thu & Giải đáp

Mục tiêu: Học viên dùng được input() kết hợp float() để nhận dữ liệu linh hoạt và in kết quả đẹp mắt bằng f-string (lấy 2 chữ số thập phân :.2f).

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Lỗi nhân chuỗi: Cho học viên xem lỗi khi quên float(): "20" * "15" báo TypeError: can't multiply sequence by non-int of type 'str'. Giải thích: Python hiểu "20" là chữ cái, không nhân chia được.
  • Định dạng tiền tệ: Giảng viên hướng dẫn cú pháp f"{tong_tien:,.2f} USD" giúp số tiền 12500 hiển thị chuẩn đẹp thành 12,500.00 USD.

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Viết chương trình hỏi người dùng: Tên chủ nhà, Chiều dài phòng (feet), Chiều rộng phòng (feet), Đơn giá gạch (USD/sqft). Tính và in phiếu báo giá gồm Tên khách, Diện tích và Tổng tiền.
Bài 2 (Thực chiến nâng cao): Nhập thêm phí vận chuyển cố định shipping = 75.0 USD. In ra: Tiền vật tư, Tiền vận chuyển và Tổng số tiền chủ nhà cần thanh toán.
Python 3 · Source Code mẫu chuẩn B2b2_tool_bao_gia_v1.py
# BUỔI 2: TOOL BÁO GIÁ LÁT SÀN TƯƠNG TÁC ĐẦU TIÊN
print("========================================")
print("     TOOL BÁO GIÁ NHANH CÔNG TRƯỜNG     ")
print("========================================")

# 1. Nhập thông tin từ giám sát công trường
ten_khach = input("Nhập tên khách hàng / mã căn: ")
chieu_dai = float(input("Nhập chiều dài phòng (ft): "))
chieu_rong = float(input("Nhập chiều rộng phòng (ft): "))
don_gia = float(input("Nhập đơn giá thi công (USD/sqft): "))

# 2. Xử lý tính toán
dien_tich = chieu_dai * chieu_rong
phi_van_chuyen = 75.0
tong_tien = (dien_tich * don_gia) + phi_van_chuyen

# 3. Xuất bảng báo giá định dạng f-string
print("\n--- PHIẾU BÁO GIÁ GỬI CHỦ THẦU ---")
print(f"Khách hàng:      {ten_khach}")
print(f"Diện tích sàn:   {dien_tich:,.1f} sqft")
print(f"Chi phí thi công:{dien_tich * don_gia:,.2f} USD")
print(f"Phí vận chuyển:  {phi_van_chuyen:,.2f} USD")
print(f"TỔNG CỘNG:       {tong_tien:,.2f} USD")
print("-----------------------------------")
# Demo chạy thử với Terminal: Nhập tên khách hàng: Villa Ecopark Nhập chiều dài phòng (ft): 25 Nhập chiều rộng phòng (ft): 16 Nhập đơn giá thi công (USD/sqft): 5.5 --- PHIẾU BÁO GIÁ GỬI CHỦ THẦU --- Khách hàng: Villa Ecopark Diện tích sàn: 400.0 sqft Chi phí thi công:2,200.00 USD Phí vận chuyển: 75.00 USD TỔNG CỘNG: 2,275.00 USD
Tuần 2 · Tiêu chuẩn & Giám sát

Đưa quy tắc công trường vào code

B3 → B4
BUỔI 3 · B3Điều kiện if / else

if/else: Kiểm tra tiêu chuẩn nghiệm thu

Chương trình không đoán mò mà kiểm tra điều kiện logic: Nếu công trình > 1,000 sqft thì áp dụng chiết khấu thương mại khối lượng lớn; ngược lại áp dụng đơn giá tiêu chuẩn.

Điểm bàn giaoTool tự động nhận diện dự án lớn để bật chính sách ưu đãi.
📋 Giáo án Giảng viên & Thực hành B3 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Quy tắc nghiệm thu công trình ⏱️ 25' Live Code: Cú pháp if / elif / else & Thụt lề ⏱️ 20' Thực hành: Phân loại hợp đồng theo quy mô ⏱️ 5' Nghiệm thu & Thảo luận

Mục tiêu: Nắm vững cú pháp rẽ nhánh if - else, toán tử so sánh (>, <, >=, ==), hiểu bản chất thụt dòng (Indentation - 4 dấu cách) trong Python.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Lỗi quên dấu hai chấm (:): Cuối dòng if học viên rất hay quên dấu :. Nhắc: "Sau mỗi lần đặt câu hỏi phải có dấu hai chấm để mở cửa vào lệnh".
  • Lỗi IndentationError: Giải thích các lệnh nằm trong nhánh phải lùi vào đúng 1 phím Tab (4 dấu cách). Code thẳng hàng thì cùng cấp bậc xử lý.

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Nhập diện tích sàn sqft. Nếu sqft >= 1000, in: "Dự án quy mô lớn: Giảm ngay 5% trên đơn giá"; ngược lại in: "Dự án tiêu chuẩn: Đơn giá niêm yết".
Bài 2 (Thực chiến nâng cao): Tính tổng tiền: Đơn giá gốc là 5.0 USD/sqft. Nếu diện tích >= 1000 sqft thì đơn giá giảm còn 4.7 USD/sqft. In tổng số tiền và số tiền tiết kiệm được nhờ chiết khấu.
Python 3 · Source Code mẫu chuẩn B3b3_kiem_tra_nguong.py
# BUỔI 3: PHÂN LOẠI QUY MÔ & CHIẾT KHẤU DỰ ÁN
NGUONG_DIEN_TICH = 1000.0   # Ngưỡng sqft hưởng ưu đãi
DON_GIA_GOC = 5.0           # USD / sqft

sqft = float(input("Nhập tổng diện tích công trình (sqft): "))

if sqft >= NGUONG_DIEN_TICH:
    phan_tram_giam = 0.05   # Giảm 5%
    don_gia_thuc = DON_GIA_GOC * (1 - phan_tram_giam)
    tien_tiet_kiem = (sqft * DON_GIA_GOC) * phan_tram_giam
    tong_tien = sqft * don_gia_thuc
    print("✅ ĐỦ ĐIỀU KIỆN ƯU ĐÃI DỰ ÁN LỚN (GIẢM 5%)")
    print(f"Đơn giá sau giảm: {don_gia_thuc:.2f} USD/sqft")
    print(f"Khách tiết kiệm:  {tien_tiet_kiem:,.2f} USD")
else:
    tong_tien = sqft * DON_GIA_GOC
    print("ℹ️ DỰ ÁN TIÊU CHUẨN (Áp dụng đơn giá niêm yết)")
    print(f"Đơn giá áp dụng: {DON_GIA_GOC:.2f} USD/sqft")

print(f">>> TỔNG BÁO GIÁ THI CÔNG: {tong_tien:,.2f} USD")
# Output kiểm thử với sqft = 1200: ✅ ĐỦ ĐIỀU KIỆN ƯU ĐÃI DỰ ÁN LỚN (GIẢM 5%) Đơn giá sau giảm: 4.75 USD/sqft Khách tiết kiệm: 300.00 USD >>> TỔNG BÁO GIÁ THI CÔNG: 5,700.00 USD
BUỔI 4 · B4Logic đa điều kiện

Logic đa điều kiện: Giảm giá & Phí dọn rác

Công trường thực tế luôn có nhiều quy tắc đan xen: Vừa kiểm tra diện tích sàn để giảm 5%, vừa kiểm tra hiện trạng công trình (nhà cũ cần phá dỡ / dọn xà bần) để cộng thêm 10% chi phí xử lý rác thải.

Sản phẩmTool Báo Giá Nâng Cao xử lý đa điều kiện độc lập và kết hợp.
📋 Giáo án Giảng viên & Thực hành B4 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Khảo sát hiện trạng nhà cũ vs nhà mới ⏱️ 25' Live Code: Toán tử and, or, not & Nhiều block if ⏱️ 20' Thực hành: Viết bảng tính phụ phí công trình ⏱️ 5' Nghiệm thu & Checkpoint

Mục tiêu: Phân biệt khi nào dùng các khối if nối tiếp độc lập (nhiều phụ phí đồng thời kích hoạt) và khi nào dùng toán tử logic and, or.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Nhầm lẫn elif và if độc lập: Nếu dùng elif cho phí dọn rác, khi điều kiện giảm giá đã thỏa mãn thì code sẽ bỏ qua phí dọn rác! Giảng viên cần chỉ rõ: "Giảm giá và Phí dọn rác là 2 quy tắc độc lập nên phải dùng 2 câu lệnh if riêng biệt".
  • Biến cờ Boolean: Dạy học viên dùng kiểu True/False cho câu hỏi có/không: is_old_home = True.

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Viết chương trình nhập diện tích sqft và câu hỏi "Có phải nhà cũ cần đục sàn cũ không? (y/n)". Tính tiền lát sàn (5.0 USD/sqft). Nếu > 1000 sqft: giảm 5%. Nếu là nhà cũ: cộng 10% phí dọn xà bần.
Bài 2 (Thực chiến nâng cao): Thêm điều kiện: Nếu công trình ở tầng cao không có thang máy (nhập tang_cao = True), phụ thu thêm 150 USD phí vác bộ vật tư. Xuất hóa đơn chi tiết từng khoản mục.
Python 3 · Source Code mẫu chuẩn B4b4_bao_gia_nang_cao.py
# BUỔI 4: BÁO GIÁ ĐA ĐIỀU KIỆN (DISCOUNT + REMOVAL FEE)
dien_tich = float(input("Nhập diện tích công trình (sqft): "))
tra_loi_nha_cu = input("Công trình là nhà cũ cần phá dỡ? (c/k): ").lower()
is_nha_cu = (tra_loi_nha_cu == "c")

don_gia_co_ban = 5.0
chi_phi_goc = dien_tich * don_gia_co_ban

# Quy tắc 1: Giảm giá 5% cho công trình từ 1,000 sqft
giam_gia = 0.0
if dien_tich >= 1000:
    giam_gia = chi_phi_goc * 0.05

# Quy tắc 2: Phụ thu 10% dọn xà bần nếu là nhà cũ (độc lập)
phi_don_rac = 0.0
if is_nha_cu:
    phi_don_rac = chi_phi_goc * 0.10

# Tổng kết
tong_thanh_toan = chi_phi_goc - giam_gia + phi_don_rac

print("\n--- BẢNG KÊ CHI PHÍ CHI TIẾT ---")
print(f"Chi phí gốc ({dien_tich} sqft x $5.0): {chi_phi_goc:,.2f} USD")
if giam_gia > 0:
    print(f"[-] Chiết khấu khối lượng (5%):       -{giam_gia:,.2f} USD")
if phi_don_rac > 0:
    print(f"[+] Phí dọn xà bần nhà cũ (10%):     +{phi_don_rac:,.2f} USD")
print("---------------------------------")
print(f"TỔNG GIÁ TRỊ HỢP ĐỒNG:               {tong_thanh_toan:,.2f} USD")
# Output kiểm thử (sqft = 1200, là nhà cũ): --- BẢNG KÊ CHI PHÍ CHI TIẾT --- Chi phí gốc (1200.0 sqft x $5.0): 6,000.00 USD [-] Chiết khấu khối lượng (5%): -300.00 USD [+] Phí dọn xà bần nhà cũ (10%): +600.00 USD --------------------------------- TỔNG GIÁ TRỊ HỢP ĐỒNG: 6,300.00 USD
Tuần 3 · Danh sách & Thi công

Đổi clipboard thành dữ liệu có thể duyệt

B5 → B6
BUỔI 5 · B5List & Vòng lặp For

List danh sách vật tư & Duyệt tự động

Thay vì tạo từng biến riêng rẽ cho từng bao xi măng, thùng sơn, cuộn xốp lót, giám sát gom tất cả vào một list và dùng vòng lặp for duyệt tuần tự từng món hàng.

Điểm bàn giaoChecklist vật tư thi công tự động in và đếm số lượng mục hàng.
📋 Giáo án Giảng viên & Thực hành B5 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Bảng kiểm vật tư trên clipboard ⏱️ 25' Live Code: Cấu trúc List [ ], append(), vòng lặp for ⏱️ 20' Thực hành: In phiếu xuất kho vật tư ⏱️ 5' Nghiệm thu & Tổng kết

Mục tiêu: Tạo, truy xuất phần tử theo chỉ số index (bắt đầu từ 0), thêm phần tử bằng .append() và duyệt danh sách bằng for item in list:.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Index bắt đầu từ 0: Người làm xây dựng quen đếm từ 1. Giảng viên giải thích: Phần tử đầu tiên trong danh sách máy tính đánh số là 0, dùng enumerate(danh_sach, start=1) để in ra số thứ tự thân thiện từ 1.
  • Lỗi IndexError: Giải thích khi truy cập vị trí vượt quá độ dài danh sách (danh sách có 3 món mà gọi index 3 sẽ bị lỗi).

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Cho danh sách vật tư cần mua tại Home Depot: ["Gạch gỗ Vinyl", "Xốp lót sàn", "Nẹp chân tường", "Keo dán sàn", "Đinh bê tông"]. Dùng vòng lặp in danh sách theo định dạng: "Hạng mục 1: Gạch gỗ Vinyl",...
Bài 2 (Thực chiến nâng cao): Cho phép người dùng nhập thêm 2 vật tư mới từ bàn phím bằng input(), dùng .append() đưa vào danh sách, sau đó đếm xem tổng cộng có bao nhiêu món hàng cần mua bằng hàm len().
Python 3 · Source Code mẫu chuẩn B5b5_danh_sach_vat_tu.py
# BUỔI 5: QUẢN LÝ DANH MỤC VẬT TƯ THI CÔNG
vat_tu_kho = ["Gạch gỗ Vinyl", "Xốp lót lót sàn", "Nẹp chỉ chân tường", "Keo dán chuyên dụng"]

print(f"Hiện có {len(vat_tu_kho)} hạng mục trong danh sách ban đầu.")

# Cho phép giám sát bổ sung thêm vật tư phát sinh
vat_tu_moi = input("Nhập thêm vật tư phát sinh (hoặc Enter để bỏ qua): ")
if vat_tu_moi.strip() != "":
    vat_tu_kho.append(vat_tu_moi.strip())

# In phiếu xuất vật tư ra công trường
print("\n=== PHIẾU XUẤT KHO VẬT TƯ CÔNG TRƯỜNG ===")
for stt, ten_vat_tu in enumerate(vat_tu_kho, start=1):
    print(f"[{stt:02d}] {ten_vat_tu}")
print("=========================================")
print(f"Tổng số mục vật tư cần kiểm đếm: {len(vat_tu_kho)}")
# Output in ra: === PHIẾU XUẤT KHO VẬT TƯ CÔNG TRƯỜNG === [01] Gạch gỗ Vinyl [02] Xốp lót lót sàn [03] Nẹp chỉ chân tường [04] Keo dán chuyên dụng [05] Đinh súng bê tông ========================================= Tổng số mục vật tư cần kiểm đếm: 5
BUỔI 6 · B6Cộng dồn & Tính tổng

Tính tổng chi phí vật tư (total += subtotal)

Mỗi hạng mục vật tư có số lượng và đơn giá. Để tính hóa đơn Home Depot, ta duyệt qua từng dòng, tính thành tiền của dòng và cộng dồn vào biến tổng tích lũy đặt trước vòng lặp.

Sản phẩmTool Quản Lý Vật Tư & Hóa Đơn Mua Hàng tự động tính tổng tiền.
📋 Giáo án Giảng viên & Thực hành B6 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Hóa đơn thanh toán Home Depot ⏱️ 25' Live Code: Thuật toán cộng dồn biến tích lũy (accumulator) ⏱️ 20' Thực hành: Bảng kê dự toán chi tiết ⏱️ 5' Nghiệm thu & Thảo luận

Mục tiêu: Khởi tạo biến tổng total = 0 trước vòng lặp, sử dụng danh sách lồng nhau (list of dicts hoặc list of tuples), tính subtotal = qty * price và cộng dồn total += subtotal.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Khởi tạo total bên trong vòng lặp: Đây là lỗi kinh điển của người mới: nếu đặt total = 0 bên trong for, sau mỗi vòng lặp biến tổng lại bị reset về 0! Giảng viên vẽ sơ đồ chiếc ví tiền: "Ví tiền phải mở sẵn trên bàn trước khi gom từng đồng".

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Cho danh sách vật tư dạng tuple: [("Sơn lót", 5, 45.0), ("Sơn phủ", 8, 55.0), ("Con lăn", 4, 12.5)] với các cột (Tên, Số lượng, Đơn giá). Tính thành tiền từng món và in tổng tiền thanh toán.
Bài 2 (Thực chiến nâng cao): Cộng thêm thuế bán hàng tại Mỹ (Sales Tax = 8.25%). In ra: Tiền hàng trước thuế, Tiền thuế và Tổng tiền thanh toán tại quầy.
Python 3 · Source Code mẫu chuẩn B6b6_tong_vat_tu.py
# BUỔI 6: TÍNH DỰ TOÁN VẬT TƯ HOME DEPOT
danh_sach_vat_tu = [
    {"ten": "Gạch gỗ Vinyl (hộp)",   "so_luong": 25, "don_gia": 42.5},
    {"ten": "Xốp lót chống ẩm (cuộn)","so_luong": 3,  "don_gia": 28.0},
    {"ten": "Nẹp nhôm cửa (thanh)",   "so_luong": 6,  "don_gia": 14.5},
    {"ten": "Keo silicon dán nẹp (lọ)","so_luong": 4,  "don_gia": 8.0}
]

tong_tien_truoc_thue = 0.0

print(f"{'TÊN VẬT TƯ':<25} | {'SL':>4} | {'ĐƠN GIÁ':>9} | {'THÀNH TIỀN':>12}")
print("-" * 58)

for item in danh_sach_vat_tu:
    thanh_tien = item["so_luong"] * item["don_gia"]
    tong_tien_truoc_thue += thanh_tien
    print(f"{item['ten']:<25} | {item['so_luong']:>4} | {item['don_gia']:>8.2f}$ | {thanh_tien:>11.2f}$")

print("-" * 58)
thue_tax = tong_tien_truoc_thue * 0.0825  # Thuế 8.25%
tong_cong = tong_tien_truoc_thue + thue_tax

print(f"Tổng tiền hàng trước thuế: {tong_tien_truoc_thue:>12,.2f} USD")
print(f"Thuế bán hàng (Sales Tax 8.25%): {thue_tax:>7,.2f} USD")
print(f"TỔNG THANH TOÁN HOME DEPOT:      {tong_cong:>7,.2f} USD")
# Bảng xuất ra: TÊN VẬT TƯ | SL | ĐƠN GIÁ | THÀNH TIỀN ---------------------------------------------------------- Gạch gỗ Vinyl (hộp) | 25 | 42.50$ | 1062.50$ Xốp lót chống ẩm (cuộn) | 3 | 28.00$ | 84.00$ Nẹp nhôm cửa (thanh) | 6 | 14.50$ | 87.00$ Keo silicon dán nẹp (lọ) | 4 | 8.00$ | 32.00$ ---------------------------------------------------------- Tổng tiền hàng trước thuế: 1,265.50 USD Thuế bán hàng (Sales Tax 8.25%): 104.40 USD TỔNG THANH TOÁN HOME DEPOT: 1,369.90 USD
Tuần 4 · Tổ đội Chuyên biệt

Đóng gói để dùng lại

B7 → B8
BUỔI 7 · B7Hàm & Return

Hàm (Function): Đóng gói tổ đội chuyên biệt

Hàm giống như khoán việc cho một tổ đội thợ: Ta giao bản vẽ (tham số đầu vào), tổ đội làm việc và bàn giao kết quả nghiệm thu (lệnh return) về cho chỉ huy trưởng mà không phải viết lại code nhiều lần.

Điểm bàn giaoHàm tính báo giá chuẩn có thể gọi lại cho 10 căn phòng khác nhau.
📋 Giáo án Giảng viên & Thực hành B7 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Tình huống: Tránh lặp code khi tính 5 phòng liên tiếp ⏱️ 25' Live Code: def function_name(args): ... return ⏱️ 20' Thực hành: Viết module tính giá sàn và sơn tường ⏱️ 5' Nghiệm thu & Giải đáp

Mục tiêu: Khai báo hàm bằng từ khóa def, truyền tham số, phân biệt giữa in ra (print) và trả về giá trị (return) để sử dụng tiếp.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Nhầm print() với return: Học viên thường viết print() trong hàm rồi gán kq = ham() dẫn tới kq = None. Giảng viên ví von: "print là thợ tự nói cho mình nghe, còn return là thợ trao tận tay sản phẩm cho bạn cất vào tủ".

🛠️ Bài tập thực hành tại lớp

Bài 1 (Cơ bản): Định nghĩa hàm tinh_gia_san(dai, rong, don_gia) nhận vào 3 thông số và trả về tổng tiền. Gọi hàm tính giá cho 3 phòng: Phòng Master (20x15, đơn giá 5.5$), Phòng Khách (25x18, đơn giá 6.0$) và Phòng Bé (12x10, đơn giá 4.5$).
Bài 2 (Thực chiến nâng cao): Bổ sung tham số mặc định ti_le_giam=0.0 vào hàm. Nếu phòng có diện tích > 300 sqft, truyền ti_le_giam=0.05 khi gọi hàm.
Python 3 · Source Code mẫu chuẩn B7b7_ham_bao_gia.py
# BUỔI 7: ĐỊNH NGHĨA HÀM TÍNH BÁO GIÁ DÙNG LẠI
def tinh_bao_gia_san(dai: float, rong: float, don_gia: float, giam_gia: float = 0.0) -> float:
    """Hàm tính báo giá lát sàn một phòng có chiết khấu tùy chọn."""
    sqft = dai * rong
    tien_goc = sqft * don_gia
    tien_thuc_te = tien_goc * (1.0 - giam_gia)
    return tien_thuc_te

# Danh sách số đo các phòng của căn nhà
cac_phong = [
    {"ten": "Phòng Khách", "dai": 24.0, "rong": 18.0, "gia": 5.5},
    {"ten": "Phòng Ngủ 1", "dai": 16.0, "rong": 14.0, "gia": 4.8},
    {"ten": "Phòng Ngủ 2", "dai": 14.0, "rong": 12.0, "gia": 4.8},
    {"ten": "Phòng Bếp",   "dai": 15.0, "rong": 12.0, "gia": 5.0}
]

tong_du_toan_nha = 0.0
print("=== DỰ TOÁN CHI TIẾT TỪNG PHÒNG BẰNG HÀM PYTHON ===")

for phong in cac_phong:
    sqft = phong["dai"] * phong["rong"]
    # Tự động giảm 5% nếu phòng trên 300 sqft
    rate_discount = 0.05 if sqft >= 300 else 0.0
    chi_phi = tinh_bao_gia_san(phong["dai"], phong["rong"], phong["gia"], rate_discount)
    tong_du_toan_nha += chi_phi
    print(f"{phong['ten']:<15}: {sqft:>5.0f} sqft (Giảm {rate_discount*100:.0f}%) -> {chi_phi:>8,.2f} USD")

print("-----------------------------------------------------")
print(f"TỔNG DỰ TOÁN TOÀN BỘ CĂN NHÀ:               {tong_du_toan_nha:>8,.2f} USD")
# Output kiểm thử: === DỰ TOÁN CHI TIẾT TỪNG PHÒNG BẰNG HÀM PYTHON === Phòng Khách : 432 sqft (Giảm 5%) -> 2,265.84 USD Phòng Ngủ 1 : 224 sqft (Giảm 0%) -> 1,075.20 USD Phòng Ngủ 2 : 168 sqft (Giảm 0%) -> 806.40 USD Phòng Bếp : 180 sqft (Giảm 0%) -> 900.00 USD ----------------------------------------------------- TỔNG DỰ TOÁN TOÀN BỘ CĂN NHÀ: 5,047.44 USD
BUỔI 8 · B8Đóng gói sản phẩm

Cỗ Máy Báo Giá Tự Động hoàn thiện

Kết nối toàn bộ kỹ năng từ B1 đến B7: Nhập liệu an toàn (Validate dữ liệu không âm), gọi hàm tính toán, duyệt qua các phòng và xuất báo cáo nghiệm thu chuyên nghiệp.

Sản phẩmCỗ Máy Báo Giá Tự Động (Auto-Quote Engine) kết thúc Giai đoạn 1.
📋 Giáo án Giảng viên & Thực hành B8 (60 phút)Instructor Kit

🎯 Mục tiêu bài dạy & Kế hoạch 60 phút

⏱️ 10' Đặt đầu bài đồ án Giai đoạn 1 ⏱️ 25' Live Code: Kiến trúc cỗ máy báo giá & Bắt lỗi nhập liệu ⏱️ 20' Học viên hoàn thiện đồ án độc lập ⏱️ 5' Nghiệm thu mốc Đặt Móng 1 tháng

Mục tiêu: Học viên tự tin viết một chương trình Python hoàn chỉnh có cấu trúc rõ ràng: Hằng số → Hàm xử lý → Nhập & kiểm tra dữ liệu → Vòng lặp → In báo cáo chuyên nghiệp.

💡 Bẫy lỗi thường gặp & Mẹo sư phạm

  • Xử lý ngoại lệ (Try/Except): Khi học viên gõ chữ thay vì gõ số vào ô chiều dài, chương trình sẽ sập. Giới thiệu cấu trúc try - except ValueError nhẹ nhàng để máy tính báo lỗi lịch sự thay vì văng màn hình đỏ.

🛠️ Đồ án tốt nghiệp Giai đoạn 1 tại lớp

Yêu cầu đồ án: Viết file co_may_bao_gia.py cho phép giám sát nhập số lượng phòng cần tính. Với mỗi phòng nhập dài, rộng, đơn giá. Chương trình tự động phân loại phòng nào được giảm 5%, tính tổng toàn nhà và xuất ra phiếu nghiệm thu kèm chữ ký số giám sát.
Python 3 · Source Code đồ án hoàn chỉnh B8co_may_bao_gia.py
# BUỔI 8: ĐỒ ÁN GIAI ĐOẠN 1 - CỖ MÁY BÁO GIÁ TỰ ĐỘNG
def tao_bao_gia_phong(ten: str, dai: float, rong: float, don_gia: float):
    """Tính toán chi tiết cho 1 phòng kèm chiết khấu nếu > 300 sqft."""
    sqft = dai * rong
    giam = 0.05 if sqft >= 300 else 0.0
    tien_sau_giam = sqft * don_gia * (1 - giam)
    return {"ten": ten, "sqft": sqft, "giam": giam, "tong": tien_sau_giam}

print("=" * 50)
print("     CỖ MÁY BÁO GIÁ TỰ ĐỘNG - GIAI ĐOẠN 1       ")
print("=" * 50)

danh_sach_phong = []
try:
    so_phong = int(input("Nhập số lượng phòng cần báo giá: "))
    for i in range(1, so_phong + 1):
        print(f"\n--- Nhập thông tin phòng #{i} ---")
        ten = input(f"Tên phòng #{i} (vd: Khách, Ngủ): ")
        d = float(input("Chiều dài (ft): "))
        r = float(input("Chiều rộng (ft): "))
        gia = float(input("Đơn giá (USD/sqft): "))
        danh_sach_phong.append(tao_bao_gia_phong(ten, d, r, gia))

    print("\n" + "=" * 50)
    print("           BẢNG NGHIỆM THU DỰ TOÁN BÁO GIÁ        ")
    print("=" * 50)
    tong_sqft = 0.0
    tong_tien = 0.0
    for p in danh_sach_phong:
        tong_sqft += p["sqft"]
        tong_tien += p["tong"]
        note = "Giảm 5%" if p["giam"] > 0 else "Tiêu chuẩn"
        print(f"• {p['ten']:<12}: {p['sqft']:>6.1f} sqft | {note:<10} | {p['tong']:>9,.2f} USD")

    print("-" * 50)
    print(f"TỔNG DIỆN TÍCH TOÀN BỘ: {tong_sqft:>15,.1f} sqft")
    print(f"TỔNG GIÁ TRỊ HỢP ĐỒNG:  {tong_tien:>15,.2f} USD")
    print("=" * 50)
    print("Người lập: Giám sát công trường · Đã nghiệm thu.")
except ValueError:
    print("❌ Lỗi: Vui lòng chỉ nhập số hợp lệ!")
# Output mẫu hoàn chỉnh: ================================================== BẢNG NGHIỆM THU DỰ TOÁN BÁO GIÁ ================================================== • P.Khách : 400.0 sqft | Giảm 5% | 2,090.00 USD • P.Ngủ 1 : 200.0 sqft | Tiêu chuẩn | 1,000.00 USD • P.Ngủ 2 : 180.0 sqft | Tiêu chuẩn | 900.00 USD -------------------------------------------------- TỔNG DIỆN TÍCH TOÀN BỘ: 780.0 sqft TỔNG GIÁ TRỊ HỢP ĐỒNG: 3,990.00 USD ==================================================
Mốc Nghiệm Thu Giai Đoạn 1 Hoàn Tất

Sẵn Sàng Xây Tường Dữ Liệu?

Học viên đã làm chủ biến, nhập liệu, điều kiện, vòng lặp và hàm để tạo Cỗ Máy Báo Giá Tự Động. Bước tiếp theo là quản lý danh sách khách hàng và dự án bằng Pandas và SQLite ở Giai đoạn 2.

Sang Giai đoạn 2: Quản lý dữ liệu →
Zalo 📞